Repository: google/go-cloud Branch: master Commit: 515d2d303ad4 Files: 1056 Total size: 12.1 MB Directory structure: gitextract_d66nvpyk/ ├── .codecov.yml ├── .gitattributes ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ └── feature_request.md │ ├── pull_request_template.md │ └── workflows/ │ └── tests.yml ├── .gitignore ├── AUTHORS ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── CONTRIBUTORS ├── LICENSE ├── README.md ├── allmodules ├── aws/ │ ├── aws.go │ ├── aws_test.go │ ├── awscloud/ │ │ ├── awscloud.go │ │ └── example_test.go │ └── rds/ │ └── rds.go ├── azure/ │ ├── azurecloud/ │ │ └── azurecloud.go │ └── azuredb/ │ └── azuredb.go ├── blob/ │ ├── azureblob/ │ │ ├── azureblob.go │ │ ├── azureblob_test.go │ │ ├── example_test.go │ │ └── testdata/ │ │ └── TestConformance/ │ │ ├── TestAs/ │ │ │ ├── verify_As_returns_false_when_passed_nil.replay │ │ │ └── verify_ContentLanguage_can_be_written_and_read_through_As.replay │ │ ├── TestAttributes.replay │ │ ├── TestCanceledWrite/ │ │ │ ├── BlobExists.replay │ │ │ ├── EmptyContentType.replay │ │ │ └── NonEmptyContentType.replay │ │ ├── TestConcurrentWriteAndRead.replay │ │ ├── TestCopy/ │ │ │ ├── NonExistentSourceFails.replay │ │ │ └── Works.replay │ │ ├── TestDelete/ │ │ │ ├── NonExistentFails.replay │ │ │ └── Works.replay │ │ ├── TestDirsWithCharactersBeforeDelimiter.replay │ │ ├── TestIfNotExist.replay │ │ ├── TestKeys/ │ │ │ ├── ascii-1.replay │ │ │ ├── ascii-2.replay │ │ │ ├── ascii-3.replay │ │ │ ├── ascii-4.replay │ │ │ ├── ascii-5.replay │ │ │ ├── ascii-6.replay │ │ │ ├── ascii-7.replay │ │ │ ├── ascii-8.replay │ │ │ ├── backslashes.replay │ │ │ ├── dotdotbackslash.replay │ │ │ ├── dotdotslash.replay │ │ │ ├── fwdslashes.replay │ │ │ ├── non-UTF8_fails.replay │ │ │ ├── quote.replay │ │ │ ├── repeatedbackslashes.replay │ │ │ ├── repeatedfwdslashes.replay │ │ │ ├── spaces.replay │ │ │ ├── startwithdigit.replay │ │ │ └── unicode.replay │ │ ├── TestList/ │ │ │ ├── PaginationConsistencyAfterDelete.replay │ │ │ ├── PaginationConsistencyAfterInsert.replay │ │ │ ├── by_1.replay │ │ │ ├── by_2.replay │ │ │ ├── by_3.replay │ │ │ ├── exactly_1_object_due_to_prefix.replay │ │ │ ├── no_objects.replay │ │ │ └── no_pagination.replay │ │ ├── TestListDelimiters/ │ │ │ ├── abc.replay │ │ │ ├── backslash.replay │ │ │ └── fwdslash.replay │ │ ├── TestListWeirdKeys.replay │ │ ├── TestMD5.replay │ │ ├── TestMetadata/ │ │ │ ├── duplicate_case-insensitive_key_fails.replay │ │ │ ├── empty.replay │ │ │ ├── empty_key_fails.replay │ │ │ ├── non-utf8_metadata_key.replay │ │ │ ├── non-utf8_metadata_value.replay │ │ │ ├── valid_metadata.replay │ │ │ ├── valid_metadata_with_content_type.replay │ │ │ ├── valid_metadata_with_empty_body.replay │ │ │ └── weird_metadata_keys.replay │ │ ├── TestNonexistentBucket.replay │ │ ├── TestRead/ │ │ │ ├── length_0_read.replay │ │ │ ├── negative_offset_fails.replay │ │ │ ├── read_a_part_in_middle.replay │ │ │ ├── read_from_positive_offset_to_end.replay │ │ │ ├── read_in_full.replay │ │ │ ├── read_in_full_with_negative_length_not_-1.replay │ │ │ └── read_of_nonexistent_key_fails.replay │ │ ├── TestSignedURL.replay │ │ ├── TestUploadDownload.replay │ │ └── TestWrite/ │ │ ├── ContentType_is_discovered_if_not_provided.replay │ │ ├── ContentType_is_left_empty_if_not_provided_and_DisableContentTypeDetection_is_true.replay │ │ ├── Content_md5_did_not_match,_blob_existed.replay │ │ ├── Content_md5_did_not_match.replay │ │ ├── Content_md5_match.replay │ │ ├── a_large_jpg_file_gets_a_ContentType.replay │ │ ├── a_large_jpg_file_written_in_two_chunks_gets_a_ContentType.replay │ │ ├── a_small_text_file_gets_a_ContentType.replay │ │ ├── invalid_ContentType_fails.replay │ │ ├── no_write_then_close_results_in_empty_blob,_blob_existed.replay │ │ ├── no_write_then_close_results_in_empty_blob.replay │ │ ├── write_to_empty_key_fails.replay │ │ └── write_with_explicit_ContentType_overrides_discovery.replay │ ├── blob.go │ ├── blob_fs.go │ ├── blob_fs_test.go │ ├── blob_iter_test.go │ ├── blob_reader_test.go │ ├── blob_test.go │ ├── blob_writer_test.go │ ├── driver/ │ │ └── driver.go │ ├── drivertest/ │ │ ├── bindata.go │ │ └── drivertest.go │ ├── example_openbucket_test.go │ ├── example_test.go │ ├── fileblob/ │ │ ├── attrs.go │ │ ├── example_test.go │ │ ├── fileblob.go │ │ └── fileblob_test.go │ ├── gcsblob/ │ │ ├── example_test.go │ │ ├── gcsblob.go │ │ ├── gcsblob_test.go │ │ ├── iam.go │ │ ├── iam_test.go │ │ └── testdata/ │ │ ├── TestBeforeReadNonExistentKey.replay │ │ ├── TestConformance/ │ │ │ ├── TestAs/ │ │ │ │ ├── verify_As_returns_false_when_passed_nil.replay │ │ │ │ └── verify_ContentLanguage_can_be_written_and_read_through_As.replay │ │ │ ├── TestAttributes.replay │ │ │ ├── TestCanceledWrite/ │ │ │ │ ├── BlobExists.replay │ │ │ │ ├── EmptyContentType.replay │ │ │ │ └── NonEmptyContentType.replay │ │ │ ├── TestConcurrentWriteAndRead.replay │ │ │ ├── TestCopy/ │ │ │ │ ├── NonExistentSourceFails.replay │ │ │ │ └── Works.replay │ │ │ ├── TestDelete/ │ │ │ │ ├── NonExistentFails.replay │ │ │ │ └── Works.replay │ │ │ ├── TestDirsWithCharactersBeforeDelimiter.replay │ │ │ ├── TestIfNotExist.replay │ │ │ ├── TestKeys/ │ │ │ │ ├── ascii-1.replay │ │ │ │ ├── ascii-2.replay │ │ │ │ ├── ascii-3.replay │ │ │ │ ├── ascii-4.replay │ │ │ │ ├── ascii-5.replay │ │ │ │ ├── ascii-6.replay │ │ │ │ ├── ascii-7.replay │ │ │ │ ├── ascii-8.replay │ │ │ │ ├── backslashes.replay │ │ │ │ ├── dotdotbackslash.replay │ │ │ │ ├── dotdotslash.replay │ │ │ │ ├── fwdslashes.replay │ │ │ │ ├── non-UTF8_fails.replay │ │ │ │ ├── quote.replay │ │ │ │ ├── repeatedbackslashes.replay │ │ │ │ ├── repeatedfwdslashes.replay │ │ │ │ ├── spaces.replay │ │ │ │ ├── startwithdigit.replay │ │ │ │ └── unicode.replay │ │ │ ├── TestList/ │ │ │ │ ├── PaginationConsistencyAfterDelete.replay │ │ │ │ ├── PaginationConsistencyAfterInsert.replay │ │ │ │ ├── by_1.replay │ │ │ │ ├── by_2.replay │ │ │ │ ├── by_3.replay │ │ │ │ ├── exactly_1_object_due_to_prefix.replay │ │ │ │ ├── no_objects.replay │ │ │ │ └── no_pagination.replay │ │ │ ├── TestListDelimiters/ │ │ │ │ ├── abc.replay │ │ │ │ ├── backslash.replay │ │ │ │ └── fwdslash.replay │ │ │ ├── TestListWeirdKeys.replay │ │ │ ├── TestMD5.replay │ │ │ ├── TestMetadata/ │ │ │ │ ├── duplicate_case-insensitive_key_fails.replay │ │ │ │ ├── empty.replay │ │ │ │ ├── empty_key_fails.replay │ │ │ │ ├── non-utf8_metadata_key.replay │ │ │ │ ├── non-utf8_metadata_value.replay │ │ │ │ ├── valid_metadata.replay │ │ │ │ ├── valid_metadata_with_content_type.replay │ │ │ │ ├── valid_metadata_with_empty_body.replay │ │ │ │ └── weird_metadata_keys.replay │ │ │ ├── TestNonexistentBucket.replay │ │ │ ├── TestRead/ │ │ │ │ ├── length_0_read.replay │ │ │ │ ├── negative_offset_fails.replay │ │ │ │ ├── read_a_part_in_middle.replay │ │ │ │ ├── read_from_positive_offset_to_end.replay │ │ │ │ ├── read_in_full.replay │ │ │ │ ├── read_in_full_with_negative_length_not_-1.replay │ │ │ │ └── read_of_nonexistent_key_fails.replay │ │ │ ├── TestSignedURL.replay │ │ │ ├── TestUploadDownload.replay │ │ │ └── TestWrite/ │ │ │ ├── ContentType_is_discovered_if_not_provided.replay │ │ │ ├── ContentType_is_left_empty_if_not_provided_and_DisableContentTypeDetection_is_true.replay │ │ │ ├── Content_md5_did_not_match,_blob_existed.replay │ │ │ ├── Content_md5_did_not_match.replay │ │ │ ├── Content_md5_match.replay │ │ │ ├── a_large_jpg_file_gets_a_ContentType.replay │ │ │ ├── a_large_jpg_file_written_in_two_chunks_gets_a_ContentType.replay │ │ │ ├── a_small_text_file_gets_a_ContentType.replay │ │ │ ├── invalid_ContentType_fails.replay │ │ │ ├── no_write_then_close_results_in_empty_blob,_blob_existed.replay │ │ │ ├── no_write_then_close_results_in_empty_blob.replay │ │ │ ├── write_to_empty_key_fails.replay │ │ │ └── write_with_explicit_ContentType_overrides_discovery.replay │ │ ├── TestOpenBucket/ │ │ │ ├── empty_bucket_name_results_in_error.replay │ │ │ └── success.replay │ │ └── TestPreconditions.replay │ ├── memblob/ │ │ ├── example_test.go │ │ ├── memblob.go │ │ └── memblob_test.go │ ├── otel_test.go │ ├── s3blob/ │ │ ├── example_test.go │ │ ├── s3blob.go │ │ ├── s3blob_test.go │ │ └── testdata/ │ │ ├── TestConformance/ │ │ │ ├── TestAs/ │ │ │ │ ├── verify_As_returns_false_when_passed_nil.replay │ │ │ │ └── verify_ContentLanguage_can_be_written_and_read_through_As.replay │ │ │ ├── TestAttributes.replay │ │ │ ├── TestCanceledWrite/ │ │ │ │ ├── BlobExists.replay │ │ │ │ ├── EmptyContentType.replay │ │ │ │ └── NonEmptyContentType.replay │ │ │ ├── TestConcurrentWriteAndRead.replay │ │ │ ├── TestCopy/ │ │ │ │ ├── NonExistentSourceFails.replay │ │ │ │ └── Works.replay │ │ │ ├── TestDelete/ │ │ │ │ ├── NonExistentFails.replay │ │ │ │ └── Works.replay │ │ │ ├── TestDirsWithCharactersBeforeDelimiter.replay │ │ │ ├── TestIfNotExist.replay │ │ │ ├── TestKeys/ │ │ │ │ ├── ascii-1.replay │ │ │ │ ├── ascii-2.replay │ │ │ │ ├── ascii-3.replay │ │ │ │ ├── ascii-4.replay │ │ │ │ ├── ascii-5.replay │ │ │ │ ├── ascii-6.replay │ │ │ │ ├── ascii-7.replay │ │ │ │ ├── ascii-8.replay │ │ │ │ ├── backslashes.replay │ │ │ │ ├── dotdotbackslash.replay │ │ │ │ ├── dotdotslash.replay │ │ │ │ ├── fwdslashes.replay │ │ │ │ ├── non-UTF8_fails.replay │ │ │ │ ├── quote.replay │ │ │ │ ├── repeatedbackslashes.replay │ │ │ │ ├── repeatedfwdslashes.replay │ │ │ │ ├── spaces.replay │ │ │ │ ├── startwithdigit.replay │ │ │ │ └── unicode.replay │ │ │ ├── TestList/ │ │ │ │ ├── PaginationConsistencyAfterDelete.replay │ │ │ │ ├── PaginationConsistencyAfterInsert.replay │ │ │ │ ├── by_1.replay │ │ │ │ ├── by_2.replay │ │ │ │ ├── by_3.replay │ │ │ │ ├── exactly_1_object_due_to_prefix.replay │ │ │ │ ├── no_objects.replay │ │ │ │ └── no_pagination.replay │ │ │ ├── TestListDelimiters/ │ │ │ │ ├── abc.replay │ │ │ │ ├── backslash.replay │ │ │ │ └── fwdslash.replay │ │ │ ├── TestListWeirdKeys.replay │ │ │ ├── TestMD5.replay │ │ │ ├── TestMetadata/ │ │ │ │ ├── duplicate_case-insensitive_key_fails.replay │ │ │ │ ├── empty.replay │ │ │ │ ├── empty_key_fails.replay │ │ │ │ ├── non-utf8_metadata_key.replay │ │ │ │ ├── non-utf8_metadata_value.replay │ │ │ │ ├── valid_metadata.replay │ │ │ │ ├── valid_metadata_with_content_type.replay │ │ │ │ ├── valid_metadata_with_empty_body.replay │ │ │ │ └── weird_metadata_keys.replay │ │ │ ├── TestNonexistentBucket.replay │ │ │ ├── TestRead/ │ │ │ │ ├── length_0_read.replay │ │ │ │ ├── negative_offset_fails.replay │ │ │ │ ├── read_a_part_in_middle.replay │ │ │ │ ├── read_from_positive_offset_to_end.replay │ │ │ │ ├── read_in_full.replay │ │ │ │ ├── read_in_full_with_negative_length_not_-1.replay │ │ │ │ └── read_of_nonexistent_key_fails.replay │ │ │ ├── TestSignedURL.replay │ │ │ ├── TestUploadDownload.replay │ │ │ └── TestWrite/ │ │ │ ├── ContentType_is_discovered_if_not_provided.replay │ │ │ ├── ContentType_is_left_empty_if_not_provided_and_DisableContentTypeDetection_is_true.replay │ │ │ ├── Content_md5_did_not_match,_blob_existed.replay │ │ │ ├── Content_md5_did_not_match.replay │ │ │ ├── Content_md5_match.replay │ │ │ ├── a_large_jpg_file_gets_a_ContentType.replay │ │ │ ├── a_large_jpg_file_written_in_two_chunks_gets_a_ContentType.replay │ │ │ ├── a_small_text_file_gets_a_ContentType.replay │ │ │ ├── invalid_ContentType_fails.replay │ │ │ ├── no_write_then_close_results_in_empty_blob,_blob_existed.replay │ │ │ ├── no_write_then_close_results_in_empty_blob.replay │ │ │ ├── write_to_empty_key_fails.replay │ │ │ └── write_with_explicit_ContentType_overrides_discovery.replay │ │ ├── TestConformanceUsingLegacyList/ │ │ │ ├── TestAs/ │ │ │ │ ├── verify_As_returns_false_when_passed_nil.replay │ │ │ │ └── verify_ContentLanguage_can_be_written_and_read_through_As.replay │ │ │ ├── TestAttributes.replay │ │ │ ├── TestCanceledWrite/ │ │ │ │ ├── BlobExists.replay │ │ │ │ ├── EmptyContentType.replay │ │ │ │ └── NonEmptyContentType.replay │ │ │ ├── TestConcurrentWriteAndRead.replay │ │ │ ├── TestCopy/ │ │ │ │ ├── NonExistentSourceFails.replay │ │ │ │ └── Works.replay │ │ │ ├── TestDelete/ │ │ │ │ ├── NonExistentFails.replay │ │ │ │ └── Works.replay │ │ │ ├── TestDirsWithCharactersBeforeDelimiter.replay │ │ │ ├── TestIfNotExist.replay │ │ │ ├── TestKeys/ │ │ │ │ ├── ascii-1.replay │ │ │ │ ├── ascii-2.replay │ │ │ │ ├── ascii-3.replay │ │ │ │ ├── ascii-4.replay │ │ │ │ ├── ascii-5.replay │ │ │ │ ├── ascii-6.replay │ │ │ │ ├── ascii-7.replay │ │ │ │ ├── ascii-8.replay │ │ │ │ ├── backslashes.replay │ │ │ │ ├── dotdotbackslash.replay │ │ │ │ ├── dotdotslash.replay │ │ │ │ ├── fwdslashes.replay │ │ │ │ ├── non-UTF8_fails.replay │ │ │ │ ├── quote.replay │ │ │ │ ├── repeatedbackslashes.replay │ │ │ │ ├── repeatedfwdslashes.replay │ │ │ │ ├── spaces.replay │ │ │ │ ├── startwithdigit.replay │ │ │ │ └── unicode.replay │ │ │ ├── TestList/ │ │ │ │ ├── PaginationConsistencyAfterDelete.replay │ │ │ │ ├── PaginationConsistencyAfterInsert.replay │ │ │ │ ├── by_1.replay │ │ │ │ ├── by_2.replay │ │ │ │ ├── by_3.replay │ │ │ │ ├── exactly_1_object_due_to_prefix.replay │ │ │ │ ├── no_objects.replay │ │ │ │ └── no_pagination.replay │ │ │ ├── TestListDelimiters/ │ │ │ │ ├── abc.replay │ │ │ │ ├── backslash.replay │ │ │ │ └── fwdslash.replay │ │ │ ├── TestListWeirdKeys.replay │ │ │ ├── TestMD5.replay │ │ │ ├── TestMetadata/ │ │ │ │ ├── duplicate_case-insensitive_key_fails.replay │ │ │ │ ├── empty.replay │ │ │ │ ├── empty_key_fails.replay │ │ │ │ ├── non-utf8_metadata_key.replay │ │ │ │ ├── non-utf8_metadata_value.replay │ │ │ │ ├── valid_metadata.replay │ │ │ │ ├── valid_metadata_with_content_type.replay │ │ │ │ ├── valid_metadata_with_empty_body.replay │ │ │ │ └── weird_metadata_keys.replay │ │ │ ├── TestNonexistentBucket.replay │ │ │ ├── TestRead/ │ │ │ │ ├── length_0_read.replay │ │ │ │ ├── negative_offset_fails.replay │ │ │ │ ├── read_a_part_in_middle.replay │ │ │ │ ├── read_from_positive_offset_to_end.replay │ │ │ │ ├── read_in_full.replay │ │ │ │ ├── read_in_full_with_negative_length_not_-1.replay │ │ │ │ └── read_of_nonexistent_key_fails.replay │ │ │ ├── TestSignedURL.replay │ │ │ ├── TestUploadDownload.replay │ │ │ └── TestWrite/ │ │ │ ├── ContentType_is_discovered_if_not_provided.replay │ │ │ ├── ContentType_is_left_empty_if_not_provided_and_DisableContentTypeDetection_is_true.replay │ │ │ ├── Content_md5_did_not_match,_blob_existed.replay │ │ │ ├── Content_md5_did_not_match.replay │ │ │ ├── Content_md5_match.replay │ │ │ ├── a_large_jpg_file_gets_a_ContentType.replay │ │ │ ├── a_large_jpg_file_written_in_two_chunks_gets_a_ContentType.replay │ │ │ ├── a_small_text_file_gets_a_ContentType.replay │ │ │ ├── invalid_ContentType_fails.replay │ │ │ ├── no_write_then_close_results_in_empty_blob,_blob_existed.replay │ │ │ ├── no_write_then_close_results_in_empty_blob.replay │ │ │ ├── write_to_empty_key_fails.replay │ │ │ └── write_with_explicit_ContentType_overrides_discovery.replay │ │ └── TestOpenBucket/ │ │ ├── empty_bucket_name_results_in_error.replay │ │ ├── empty_bucket_name_results_in_error_V2.replay │ │ ├── success.replay │ │ └── success_V2.replay │ └── wrapped_bucket_test.go ├── contrib/ │ └── upgrade-dependency.sh ├── doc.go ├── docstore/ │ ├── awsdynamodb/ │ │ └── v2/ │ │ ├── benchmark_test.go │ │ ├── codec.go │ │ ├── codec_test.go │ │ ├── create_tables.sh │ │ ├── dynamo.go │ │ ├── dynamo_test.go │ │ ├── example_test.go │ │ ├── query.go │ │ ├── query_test.go │ │ ├── testdata/ │ │ │ ├── TestConformance/ │ │ │ │ ├── ActionsOnStructNoRev.replay │ │ │ │ ├── ActionsWithCompositeID.replay │ │ │ │ ├── As/ │ │ │ │ │ ├── verify_As.replay │ │ │ │ │ └── verify_As_returns_false_when_passed_nil.replay │ │ │ │ ├── AtomicWrites.replay │ │ │ │ ├── AtomicWritesFail.replay │ │ │ │ ├── BeforeDo.replay │ │ │ │ ├── BeforeQuery.replay │ │ │ │ ├── Create.replay │ │ │ │ ├── Data.replay │ │ │ │ ├── Delete.replay │ │ │ │ ├── ExampleInDoc.replay │ │ │ │ ├── Get.replay │ │ │ │ ├── GetQuery.replay │ │ │ │ ├── GetQueryKeyField.replay │ │ │ │ ├── MultipleActions.replay │ │ │ │ ├── Proto.replay │ │ │ │ ├── Put.replay │ │ │ │ ├── Replace.replay │ │ │ │ ├── SerializeRevision.replay │ │ │ │ └── Update.replay │ │ │ └── TestQueryErrors.replay │ │ ├── urls.go │ │ └── urls_test.go │ ├── doc.go │ ├── docstore.go │ ├── docstore_test.go │ ├── driver/ │ │ ├── actionkind_string.go │ │ ├── codec.go │ │ ├── codec_test.go │ │ ├── compare.go │ │ ├── compare_test.go │ │ ├── document.go │ │ ├── document_test.go │ │ ├── driver.go │ │ ├── util.go │ │ └── util_test.go │ ├── drivertest/ │ │ ├── driverbenchmark.go │ │ ├── drivertest.go │ │ └── util.go │ ├── example_test.go │ ├── gcpfirestore/ │ │ ├── codec.go │ │ ├── codec_test.go │ │ ├── create_indexes.sh │ │ ├── example_test.go │ │ ├── fs.go │ │ ├── fs_test.go │ │ ├── native_codec_test.go │ │ ├── query.go │ │ ├── query_test.go │ │ ├── testdata/ │ │ │ └── TestConformance/ │ │ │ ├── ActionsOnStructNoRev.replay │ │ │ ├── ActionsWithCompositeID.replay │ │ │ ├── As/ │ │ │ │ ├── verify_As.replay │ │ │ │ └── verify_As_returns_false_when_passed_nil.replay │ │ │ ├── AtomicWrites.replay │ │ │ ├── AtomicWritesFail.replay │ │ │ ├── BeforeDo.replay │ │ │ ├── BeforeQuery.replay │ │ │ ├── Create.replay │ │ │ ├── Data.replay │ │ │ ├── Delete.replay │ │ │ ├── ExampleInDoc.replay │ │ │ ├── Get.replay │ │ │ ├── GetQuery.replay │ │ │ ├── GetQueryKeyField.replay │ │ │ ├── MultipleActions.replay │ │ │ ├── Proto.replay │ │ │ ├── Put.replay │ │ │ ├── Query.replay │ │ │ ├── Replace.replay │ │ │ ├── SerializeRevision.replay │ │ │ └── Update.replay │ │ ├── urls.go │ │ └── urls_test.go │ ├── internal/ │ │ └── fields/ │ │ ├── README.md │ │ ├── fields.go │ │ ├── fields_test.go │ │ ├── fold.go │ │ └── fold_test.go │ ├── memdocstore/ │ │ ├── codec.go │ │ ├── codec_test.go │ │ ├── example_test.go │ │ ├── mem.go │ │ ├── mem_test.go │ │ ├── query.go │ │ ├── urls.go │ │ └── urls_test.go │ ├── mongodocstore/ │ │ ├── awsdocdb/ │ │ │ ├── main.tf │ │ │ ├── outputs.tf │ │ │ └── variables.tf │ │ ├── codec.go │ │ ├── cosmos_test.go │ │ ├── docdb_test.go │ │ ├── docker-compose.yml │ │ ├── example_test.go │ │ ├── go.mod │ │ ├── go.sum │ │ ├── localmongo.sh │ │ ├── mongo.go │ │ ├── mongo_test.go │ │ ├── query.go │ │ ├── testdata/ │ │ │ └── README │ │ ├── urls.go │ │ └── urls_test.go │ ├── otel_test.go │ ├── query.go │ ├── query_test.go │ ├── urls.go │ └── urls_test.go ├── gcerrors/ │ ├── errors.go │ └── errors_test.go ├── gcp/ │ ├── cloudsql/ │ │ └── cloudsql.go │ ├── gcp.go │ ├── gcp_test.go │ └── gcpcloud/ │ ├── example_test.go │ └── gcpcloud.go ├── go.mod ├── go.sum ├── gocloud.code-workspace ├── internal/ │ ├── docs/ │ │ ├── README.md │ │ ├── design.md │ │ ├── pubsub/ │ │ │ └── design.md │ │ └── release.md │ ├── escape/ │ │ ├── escape.go │ │ └── escape_test.go │ ├── gcerr/ │ │ ├── errorcode_string.go │ │ ├── gcerr.go │ │ └── gcerr_test.go │ ├── openurl/ │ │ ├── openurl.go │ │ └── openurl_test.go │ ├── otel/ │ │ ├── metrics.go │ │ ├── trace.go │ │ └── trace_test.go │ ├── releasehelper/ │ │ ├── releasehelper.go │ │ └── releasehelper_test.go │ ├── retry/ │ │ ├── retry.go │ │ └── retry_test.go │ ├── testing/ │ │ ├── alldeps │ │ ├── check_mod_tidy.sh │ │ ├── deploywebsite.sh │ │ ├── git_tag_modules.sh │ │ ├── gomodcleanup.sh │ │ ├── listdeps.sh │ │ ├── oteltest/ │ │ │ ├── diff.go │ │ │ ├── exporter.go │ │ │ └── init.go │ │ ├── runchecks.sh │ │ ├── setup/ │ │ │ └── setup.go │ │ ├── start_local_deps.sh │ │ ├── terraform/ │ │ │ └── terraform.go │ │ ├── test-summary/ │ │ │ ├── test-summary.go │ │ │ └── test-summary_test.go │ │ └── update_deps.sh │ ├── useragent/ │ │ └── useragent.go │ └── website/ │ ├── README.md │ ├── archetypes/ │ │ ├── default.md │ │ └── howto.md │ ├── config.toml │ ├── content/ │ │ ├── _index.md │ │ ├── aws/ │ │ │ ├── _index.md │ │ │ ├── awscloud/ │ │ │ │ └── _index.md │ │ │ └── rds/ │ │ │ └── _index.md │ │ ├── azure/ │ │ │ ├── azurecloud/ │ │ │ │ └── _index.md │ │ │ └── azuredb/ │ │ │ └── _index.md │ │ ├── blob/ │ │ │ ├── _index.md │ │ │ ├── azureblob/ │ │ │ │ └── _index.md │ │ │ ├── driver/ │ │ │ │ └── _index.md │ │ │ ├── drivertest/ │ │ │ │ └── _index.md │ │ │ ├── fileblob/ │ │ │ │ └── _index.md │ │ │ ├── gcsblob/ │ │ │ │ └── _index.md │ │ │ ├── memblob/ │ │ │ │ └── _index.md │ │ │ └── s3blob/ │ │ │ └── _index.md │ │ ├── concepts/ │ │ │ ├── _index.md │ │ │ ├── as.md │ │ │ ├── structure/ │ │ │ │ └── index.md │ │ │ └── urls.md │ │ ├── docstore/ │ │ │ ├── _index.md │ │ │ ├── awsdynamodb/ │ │ │ │ └── v2/ │ │ │ │ └── _index.md │ │ │ ├── driver/ │ │ │ │ └── _index.md │ │ │ ├── drivertest/ │ │ │ │ └── _index.md │ │ │ ├── dynamodocstore/ │ │ │ │ └── _index.md │ │ │ ├── firedocstore/ │ │ │ │ └── _index.md │ │ │ ├── gcpfirestore/ │ │ │ │ └── _index.md │ │ │ ├── internal/ │ │ │ │ └── fields/ │ │ │ │ └── _index.md │ │ │ ├── memdocstore/ │ │ │ │ └── _index.md │ │ │ └── mongodocstore/ │ │ │ └── _index.md │ │ ├── gcerrors/ │ │ │ └── _index.md │ │ ├── gcp/ │ │ │ ├── _index.md │ │ │ ├── cloudsql/ │ │ │ │ └── _index.md │ │ │ └── gcpcloud/ │ │ │ └── _index.md │ │ ├── health/ │ │ │ ├── _index.md │ │ │ └── sqlhealth/ │ │ │ └── _index.md │ │ ├── howto/ │ │ │ ├── _index.md │ │ │ ├── blob/ │ │ │ │ └── _index.md │ │ │ ├── docstore/ │ │ │ │ └── _index.md │ │ │ ├── pubsub/ │ │ │ │ ├── _index.md │ │ │ │ ├── publish.md │ │ │ │ └── subscribe.md │ │ │ ├── runtimevar/ │ │ │ │ └── _index.md │ │ │ ├── secrets/ │ │ │ │ └── _index.md │ │ │ ├── server/ │ │ │ │ └── _index.md │ │ │ └── sql/ │ │ │ └── _index.md │ │ ├── internal/ │ │ │ ├── batcher/ │ │ │ │ └── _index.md │ │ │ ├── escape/ │ │ │ │ └── _index.md │ │ │ ├── gcerr/ │ │ │ │ └── _index.md │ │ │ ├── oc/ │ │ │ │ └── _index.md │ │ │ ├── openurl/ │ │ │ │ └── _index.md │ │ │ ├── otel/ │ │ │ │ └── _index.md │ │ │ ├── releasehelper/ │ │ │ │ └── _index.md │ │ │ ├── retry/ │ │ │ │ └── _index.md │ │ │ ├── testing/ │ │ │ │ ├── _index.md │ │ │ │ ├── cmdtest/ │ │ │ │ │ └── _index.md │ │ │ │ ├── octest/ │ │ │ │ │ └── _index.md │ │ │ │ ├── oteltest/ │ │ │ │ │ └── _index.md │ │ │ │ ├── setup/ │ │ │ │ │ └── _index.md │ │ │ │ ├── terraform/ │ │ │ │ │ └── _index.md │ │ │ │ └── test-summary/ │ │ │ │ └── _index.md │ │ │ ├── trace/ │ │ │ │ └── _index.md │ │ │ ├── useragent/ │ │ │ │ └── _index.md │ │ │ └── website/ │ │ │ └── gatherexamples/ │ │ │ └── _index.md │ │ ├── mysql/ │ │ │ ├── _index.md │ │ │ ├── awsmysql/ │ │ │ │ └── _index.md │ │ │ ├── azuremysql/ │ │ │ │ └── _index.md │ │ │ ├── cloudmysql/ │ │ │ │ └── _index.md │ │ │ ├── gcpmysql/ │ │ │ │ └── _index.md │ │ │ └── rdsmysql/ │ │ │ └── _index.md │ │ ├── postgres/ │ │ │ ├── _index.md │ │ │ ├── awspostgres/ │ │ │ │ └── _index.md │ │ │ ├── cloudpostgres/ │ │ │ │ └── _index.md │ │ │ ├── gcppostgres/ │ │ │ │ └── _index.md │ │ │ └── rdspostgres/ │ │ │ └── _index.md │ │ ├── pubsub/ │ │ │ ├── _index.md │ │ │ ├── awssnssqs/ │ │ │ │ └── _index.md │ │ │ ├── azurepubsub/ │ │ │ │ └── _index.md │ │ │ ├── azuresb/ │ │ │ │ └── _index.md │ │ │ ├── batcher/ │ │ │ │ └── _index.md │ │ │ ├── driver/ │ │ │ │ └── _index.md │ │ │ ├── drivertest/ │ │ │ │ └── _index.md │ │ │ ├── gcppubsub/ │ │ │ │ └── _index.md │ │ │ ├── gcppubsubv2/ │ │ │ │ └── _index.md │ │ │ ├── kafkapubsub/ │ │ │ │ └── _index.md │ │ │ ├── mempubsub/ │ │ │ │ └── _index.md │ │ │ ├── natspubsub/ │ │ │ │ └── _index.md │ │ │ └── rabbitpubsub/ │ │ │ └── _index.md │ │ ├── requestlog/ │ │ │ └── _index.md │ │ ├── runtimevar/ │ │ │ ├── _index.md │ │ │ ├── awsparamstore/ │ │ │ │ └── _index.md │ │ │ ├── awssecretsmanager/ │ │ │ │ └── _index.md │ │ │ ├── blobvar/ │ │ │ │ └── _index.md │ │ │ ├── constantvar/ │ │ │ │ └── _index.md │ │ │ ├── driver/ │ │ │ │ └── _index.md │ │ │ ├── drivertest/ │ │ │ │ └── _index.md │ │ │ ├── etcdvar/ │ │ │ │ └── _index.md │ │ │ ├── filevar/ │ │ │ │ ├── _demo/ │ │ │ │ │ └── _index.md │ │ │ │ └── _index.md │ │ │ ├── gcpruntimeconfig/ │ │ │ │ └── _index.md │ │ │ ├── gcpsecretmanager/ │ │ │ │ └── _index.md │ │ │ ├── hashivault/ │ │ │ │ └── _index.md │ │ │ └── httpvar/ │ │ │ └── _index.md │ │ ├── samples/ │ │ │ ├── appengine/ │ │ │ │ └── _index.md │ │ │ ├── gocdk-blob/ │ │ │ │ └── _index.md │ │ │ ├── gocdk-docstore/ │ │ │ │ └── _index.md │ │ │ ├── gocdk-pubsub/ │ │ │ │ └── _index.md │ │ │ ├── gocdk-runtimevar/ │ │ │ │ └── _index.md │ │ │ ├── gocdk-secrets/ │ │ │ │ └── _index.md │ │ │ ├── guestbook/ │ │ │ │ ├── _index.md │ │ │ │ ├── aws/ │ │ │ │ │ └── provision_db/ │ │ │ │ │ └── _index.md │ │ │ │ ├── gcp/ │ │ │ │ │ ├── deploy/ │ │ │ │ │ │ └── _index.md │ │ │ │ │ └── provision_db/ │ │ │ │ │ └── _index.md │ │ │ │ └── localdb/ │ │ │ │ └── _index.md │ │ │ ├── order/ │ │ │ │ └── _index.md │ │ │ ├── server/ │ │ │ │ └── _index.md │ │ │ └── tutorial/ │ │ │ └── _index.md │ │ ├── secrets/ │ │ │ ├── _index.md │ │ │ ├── awskms/ │ │ │ │ └── _index.md │ │ │ ├── azurekeyvault/ │ │ │ │ └── _index.md │ │ │ ├── driver/ │ │ │ │ └── _index.md │ │ │ ├── drivertest/ │ │ │ │ └── _index.md │ │ │ ├── gcpkms/ │ │ │ │ └── _index.md │ │ │ ├── hashivault/ │ │ │ │ └── _index.md │ │ │ ├── localsecrets/ │ │ │ │ └── _index.md │ │ │ └── vault/ │ │ │ └── _index.md │ │ ├── server/ │ │ │ ├── _index.md │ │ │ ├── driver/ │ │ │ │ └── _index.md │ │ │ ├── health/ │ │ │ │ ├── _index.md │ │ │ │ └── sqlhealth/ │ │ │ │ └── _index.md │ │ │ ├── requestlog/ │ │ │ │ └── _index.md │ │ │ ├── sdserver/ │ │ │ │ └── _index.md │ │ │ └── xrayserver/ │ │ │ └── _index.md │ │ ├── tests/ │ │ │ ├── aws/ │ │ │ │ └── app/ │ │ │ │ └── _index.md │ │ │ ├── gcp/ │ │ │ │ └── app/ │ │ │ │ └── _index.md │ │ │ └── internal/ │ │ │ └── testutil/ │ │ │ └── _index.md │ │ └── tutorials/ │ │ ├── _index.md │ │ ├── cli-uploader.md │ │ ├── guestbook.md │ │ └── order.md │ ├── data/ │ │ └── examples.json │ ├── gatherexamples/ │ │ ├── gatherexamples.go │ │ ├── gatherexamples_test.go │ │ └── run.sh │ ├── go.mod │ ├── go.sum │ ├── layouts/ │ │ ├── 404.html │ │ ├── _default/ │ │ │ ├── baseof.html │ │ │ ├── li.html │ │ │ ├── list.html │ │ │ ├── single.html │ │ │ └── sitemap.xml │ │ ├── howto/ │ │ │ ├── li.html │ │ │ └── list.html │ │ ├── index.html │ │ ├── partials/ │ │ │ ├── header-link.html │ │ │ ├── hook_head_end.html │ │ │ └── page-toc.html │ │ ├── pkg/ │ │ │ ├── list.html │ │ │ └── single.html │ │ └── shortcodes/ │ │ ├── goexample.html │ │ └── snippet.html │ ├── listnewpkgs.sh │ ├── makeimports.sh │ └── static/ │ └── css/ │ ├── style.css │ └── syntax.css ├── mysql/ │ ├── awsmysql/ │ │ ├── awsmysql.go │ │ ├── awsmysql_test.go │ │ ├── example_test.go │ │ ├── main.tf │ │ └── otel_test.go │ ├── azuremysql/ │ │ ├── azuremysql.go │ │ ├── azuremysql_test.go │ │ ├── example_test.go │ │ └── main.tf │ ├── example_test.go │ ├── gcpmysql/ │ │ ├── example_test.go │ │ ├── gcpmysql.go │ │ ├── gcpmysql_test.go │ │ └── main.tf │ ├── main.tf │ ├── mysql.go │ └── mysql_test.go ├── postgres/ │ ├── awspostgres/ │ │ ├── awspostgres.go │ │ ├── awspostgres_test.go │ │ ├── example_test.go │ │ └── main.tf │ ├── example_test.go │ ├── gcppostgres/ │ │ ├── example_test.go │ │ ├── gcppostgres.go │ │ ├── gcppostgres_test.go │ │ └── main.tf │ ├── postgres.go │ └── postgres_test.go ├── pubsub/ │ ├── acks_test.go │ ├── awssnssqs/ │ │ ├── awssnssqs.go │ │ ├── awssnssqs_test.go │ │ ├── example_test.go │ │ └── testdata/ │ │ ├── TestConformanceSNSTopic/ │ │ │ ├── TestAs/ │ │ │ │ ├── aws_test.replay │ │ │ │ └── verify_As_returns_false_when_passed_nil.replay │ │ │ ├── TestBatching.replay │ │ │ ├── TestCancelSendReceive.replay │ │ │ ├── TestDoubleAck.replay │ │ │ ├── TestErrorOnReceiveFromClosedSubscription.replay │ │ │ ├── TestErrorOnSendToClosedTopic.replay │ │ │ ├── TestMetadata.replay │ │ │ ├── TestNack.replay │ │ │ ├── TestNonExistentSubscriptionSucceedsOnOpenButFailsOnReceive.replay │ │ │ ├── TestNonExistentTopicSucceedsOnOpenButFailsOnSend.replay │ │ │ ├── TestNonUTF8MessageBody.replay │ │ │ ├── TestSendReceive.replay │ │ │ ├── TestSendReceiveJSON.replay │ │ │ └── TestSendReceiveTwo.replay │ │ ├── TestConformanceSNSTopicRaw/ │ │ │ ├── TestAs/ │ │ │ │ ├── aws_test.replay │ │ │ │ └── verify_As_returns_false_when_passed_nil.replay │ │ │ ├── TestBatching.replay │ │ │ ├── TestCancelSendReceive.replay │ │ │ ├── TestDoubleAck.replay │ │ │ ├── TestErrorOnReceiveFromClosedSubscription.replay │ │ │ ├── TestErrorOnSendToClosedTopic.replay │ │ │ ├── TestMetadata.replay │ │ │ ├── TestNack.replay │ │ │ ├── TestNonExistentSubscriptionSucceedsOnOpenButFailsOnReceive.replay │ │ │ ├── TestNonExistentTopicSucceedsOnOpenButFailsOnSend.replay │ │ │ ├── TestNonUTF8MessageBody.replay │ │ │ ├── TestSendReceive.replay │ │ │ ├── TestSendReceiveJSON.replay │ │ │ └── TestSendReceiveTwo.replay │ │ ├── TestConformanceSQSTopic/ │ │ │ ├── TestAs/ │ │ │ │ ├── aws_test.replay │ │ │ │ └── verify_As_returns_false_when_passed_nil.replay │ │ │ ├── TestBatching.replay │ │ │ ├── TestCancelSendReceive.replay │ │ │ ├── TestDoubleAck.replay │ │ │ ├── TestErrorOnReceiveFromClosedSubscription.replay │ │ │ ├── TestErrorOnSendToClosedTopic.replay │ │ │ ├── TestMetadata.replay │ │ │ ├── TestNack.replay │ │ │ ├── TestNonExistentSubscriptionSucceedsOnOpenButFailsOnReceive.replay │ │ │ ├── TestNonExistentTopicSucceedsOnOpenButFailsOnSend.replay │ │ │ ├── TestNonUTF8MessageBody.replay │ │ │ ├── TestSendReceive.replay │ │ │ ├── TestSendReceiveJSON.replay │ │ │ └── TestSendReceiveTwo.replay │ │ └── TestFIFO/ │ │ ├── TestSNSTopic/ │ │ │ ├── TestSendReceiveInvalidNoDeduplicationID.replay │ │ │ ├── TestSendReceiveInvalidNoMessageGroupID.replay │ │ │ └── TestSendReceiveValid.replay │ │ └── TestSQSTopic/ │ │ ├── TestSendReceiveInvalidNoDeduplicationID.replay │ │ ├── TestSendReceiveInvalidNoMessageGroupID.replay │ │ └── TestSendReceiveValid.replay │ ├── azuresb/ │ │ ├── azuresb.go │ │ ├── azuresb_test.go │ │ ├── example_test.go │ │ └── testdata/ │ │ └── README │ ├── batcher/ │ │ ├── batcher.go │ │ └── batcher_test.go │ ├── benchmark_test.go │ ├── driver/ │ │ └── driver.go │ ├── drivertest/ │ │ └── drivertest.go │ ├── example_test.go │ ├── gcppubsub/ │ │ ├── example_test.go │ │ ├── gcppubsub.go │ │ ├── gcppubsub_test.go │ │ └── testdata/ │ │ └── TestConformance/ │ │ ├── TestAs/ │ │ │ ├── gcp_test.replay │ │ │ └── verify_As_returns_false_when_passed_nil.replay │ │ ├── TestBatching.replay │ │ ├── TestCancelSendReceive.replay │ │ ├── TestDoubleAck.replay │ │ ├── TestErrorOnReceiveFromClosedSubscription.replay │ │ ├── TestErrorOnSendToClosedTopic.replay │ │ ├── TestMetadata.replay │ │ ├── TestNack.replay │ │ ├── TestNonExistentSubscriptionSucceedsOnOpenButFailsOnReceive.replay │ │ ├── TestNonExistentTopicSucceedsOnOpenButFailsOnSend.replay │ │ ├── TestNonUTF8MessageBody.replay │ │ ├── TestSendReceive.replay │ │ ├── TestSendReceiveJSON.replay │ │ └── TestSendReceiveTwo.replay │ ├── gcppubsubv2/ │ │ ├── example_test.go │ │ ├── gcppubsub.go │ │ └── gcppubsub_test.go │ ├── kafkapubsub/ │ │ ├── example_test.go │ │ ├── go.mod │ │ ├── go.sum │ │ ├── kafka.go │ │ ├── kafka_test.go │ │ └── localkafka.sh │ ├── mempubsub/ │ │ ├── conformance_test.go │ │ ├── example_test.go │ │ ├── mem.go │ │ └── mem_test.go │ ├── natspubsub/ │ │ ├── example_test.go │ │ ├── go.mod │ │ ├── go.sum │ │ ├── nats.go │ │ └── nats_test.go │ ├── pub_test.go │ ├── pubsub.go │ ├── pubsub_test.go │ ├── rabbitpubsub/ │ │ ├── amqp.go │ │ ├── doc.go │ │ ├── example_test.go │ │ ├── fake_test.go │ │ ├── go.mod │ │ ├── go.sum │ │ ├── localrabbit.sh │ │ ├── rabbit.go │ │ └── rabbit_test.go │ └── sub_test.go ├── runtimevar/ │ ├── awsparamstore/ │ │ ├── awsparamstore.go │ │ ├── awsparamstore_test.go │ │ ├── example_test.go │ │ └── testdata/ │ │ └── TestConformance/ │ │ ├── TestAs/ │ │ │ ├── verify_As.replay │ │ │ └── verify_As_returns_false_when_passed_nil.replay │ │ ├── TestDelete.replay │ │ ├── TestInvalidJSON.replay │ │ ├── TestJSON.replay │ │ ├── TestNonExistentVariable.replay │ │ ├── TestString.replay │ │ ├── TestUpdate.replay │ │ └── TestUpdateWithErrors.replay │ ├── awssecretsmanager/ │ │ ├── awssecretsmanager.go │ │ ├── awssecretsmanager_test.go │ │ ├── example_test.go │ │ └── testdata/ │ │ └── TestConformance/ │ │ ├── TestAs/ │ │ │ ├── verify_As.replay │ │ │ └── verify_As_returns_false_when_passed_nil.replay │ │ ├── TestConformanceV2/ │ │ │ ├── TestAs/ │ │ │ │ ├── verify_As.replay │ │ │ │ └── verify_As_returns_false_when_passed_nil.replay │ │ │ ├── TestDelete.replay │ │ │ ├── TestInvalidJSON.replay │ │ │ ├── TestJSON.replay │ │ │ ├── TestNonExistentVariable.replay │ │ │ ├── TestString.replay │ │ │ ├── TestUpdate.replay │ │ │ └── TestUpdateWithErrors.replay │ │ ├── TestDelete.replay │ │ ├── TestInvalidJSON.replay │ │ ├── TestJSON.replay │ │ ├── TestNonExistentVariable.replay │ │ ├── TestString.replay │ │ ├── TestUpdate.replay │ │ └── TestUpdateWithErrors.replay │ ├── blobvar/ │ │ ├── blobvar.go │ │ ├── blobvar_test.go │ │ └── example_test.go │ ├── constantvar/ │ │ ├── constantvar.go │ │ ├── constantvar_test.go │ │ └── example_test.go │ ├── driver/ │ │ └── driver.go │ ├── drivertest/ │ │ └── drivertest.go │ ├── etcdvar/ │ │ ├── etcdvar.go │ │ ├── etcdvar_test.go │ │ ├── example_test.go │ │ ├── go.mod │ │ ├── go.sum │ │ └── localetcd.sh │ ├── example_openvariable_test.go │ ├── example_test.go │ ├── filevar/ │ │ ├── example_test.go │ │ ├── filevar.go │ │ └── filevar_test.go │ ├── gcpruntimeconfig/ │ │ ├── example_test.go │ │ ├── gcpruntimeconfig.go │ │ ├── gcpruntimeconfig_test.go │ │ └── testdata/ │ │ └── TestConformance/ │ │ ├── TestAs/ │ │ │ ├── verify_As.replay │ │ │ └── verify_As_returns_false_when_passed_nil.replay │ │ ├── TestDelete.replay │ │ ├── TestInvalidJSON.replay │ │ ├── TestJSON.replay │ │ ├── TestNonExistentVariable.replay │ │ ├── TestString.replay │ │ ├── TestUpdate.replay │ │ └── TestUpdateWithErrors.replay │ ├── gcpsecretmanager/ │ │ ├── example_test.go │ │ ├── gcpsecretmanager.go │ │ ├── gcpsecretmanager_test.go │ │ └── testdata/ │ │ └── TestConformance/ │ │ ├── TestAs/ │ │ │ ├── verify_As.replay │ │ │ └── verify_As_returns_false_when_passed_nil.replay │ │ ├── TestDelete.replay │ │ ├── TestInvalidJSON.replay │ │ ├── TestJSON.replay │ │ ├── TestNonExistentVariable.replay │ │ ├── TestString.replay │ │ ├── TestUpdate.replay │ │ └── TestUpdateWithErrors.replay │ ├── hashivault/ │ │ ├── example_test.go │ │ ├── go.mod │ │ ├── go.sum │ │ ├── hashivault.go │ │ ├── hashivault_test.go │ │ └── localvault.sh │ ├── httpvar/ │ │ ├── example_test.go │ │ ├── httpvar.go │ │ └── httpvar_test.go │ ├── otel_test.go │ ├── runtimevar.go │ └── runtimevar_test.go ├── samples/ │ ├── appengine/ │ │ ├── .gcloudignore │ │ ├── README.md │ │ ├── app.yaml │ │ └── helloworld.go │ ├── go.mod │ ├── go.sum │ ├── gocdk-blob/ │ │ ├── blob.ct │ │ ├── main.go │ │ └── main_test.go │ ├── gocdk-docstore/ │ │ ├── docstore.ct │ │ ├── main.go │ │ └── main_test.go │ ├── gocdk-pubsub/ │ │ ├── main.go │ │ ├── main_test.go │ │ └── pubsub.ct │ ├── gocdk-runtimevar/ │ │ ├── main.go │ │ ├── main_test.go │ │ └── runtimevar.ct │ ├── gocdk-secrets/ │ │ ├── main.go │ │ ├── main_test.go │ │ └── secrets.ct │ ├── guestbook/ │ │ ├── README.md │ │ ├── aws/ │ │ │ ├── main.tf │ │ │ ├── outputs.tf │ │ │ ├── provision_db/ │ │ │ │ └── main.go │ │ │ └── variables.tf │ │ ├── azure/ │ │ │ ├── main.tf │ │ │ ├── outputs.tf │ │ │ └── variables.tf │ │ ├── blobs/ │ │ │ └── motd.txt │ │ ├── gcp/ │ │ │ ├── .gcloudignore │ │ │ ├── Dockerfile │ │ │ ├── deploy/ │ │ │ │ └── main.go │ │ │ ├── guestbook.yaml.in │ │ │ ├── main.tf │ │ │ ├── outputs.tf │ │ │ ├── provision_db/ │ │ │ │ └── main.go │ │ │ └── variables.tf │ │ ├── inject_aws.go │ │ ├── inject_azure.go │ │ ├── inject_gcp.go │ │ ├── inject_local.go │ │ ├── localdb/ │ │ │ └── main.go │ │ ├── main.go │ │ ├── roles.sql │ │ ├── schema.sql │ │ ├── telemetry.go │ │ └── wire_gen.go │ ├── order/ │ │ ├── common.go │ │ ├── frontend.go │ │ ├── frontend_test.go │ │ ├── index.html │ │ ├── list.htmlt │ │ ├── order-form.htmlt │ │ ├── order.go │ │ ├── processor.go │ │ ├── processor_test.go │ │ ├── style.css │ │ └── testdata/ │ │ ├── bad-image │ │ └── cat1 │ ├── server/ │ │ └── main.go │ ├── tutorial/ │ │ ├── README.md │ │ └── main.go │ └── wire/ │ └── README.md ├── secrets/ │ ├── awskms/ │ │ ├── example_test.go │ │ ├── kms.go │ │ ├── kms_test.go │ │ └── testdata/ │ │ └── TestConformance/ │ │ ├── TestAs/ │ │ │ ├── verify_As_function.replay │ │ │ └── verify_As_returns_false_when_passed_nil.replay │ │ ├── TestDecryptMalformedError.replay │ │ ├── TestEncryptDecrypt.replay │ │ ├── TestMultipleEncryptionsNotEqual.replay │ │ └── TestMultipleKeys.replay │ ├── azurekeyvault/ │ │ ├── akv.go │ │ ├── akv_test.go │ │ ├── example_test.go │ │ └── testdata/ │ │ └── TestConformance/ │ │ ├── TestAs/ │ │ │ ├── verify_As_function.replay │ │ │ └── verify_As_returns_false_when_passed_nil.replay │ │ ├── TestDecryptMalformedError.replay │ │ ├── TestEncryptDecrypt.replay │ │ ├── TestMultipleEncryptionsNotEqual.replay │ │ └── TestMultipleKeys.replay │ ├── driver/ │ │ └── driver.go │ ├── drivertest/ │ │ └── drivertest.go │ ├── example_openkeeper_test.go │ ├── example_test.go │ ├── gcpkms/ │ │ ├── example_test.go │ │ ├── kms.go │ │ ├── kms_test.go │ │ └── testdata/ │ │ ├── TestAdditionalAuthenticatedData.replay │ │ └── TestConformance/ │ │ ├── TestAs/ │ │ │ ├── verify_As_function.replay │ │ │ └── verify_As_returns_false_when_passed_nil.replay │ │ ├── TestDecryptMalformedError.replay │ │ ├── TestEncryptDecrypt.replay │ │ ├── TestMultipleEncryptionsNotEqual.replay │ │ └── TestMultipleKeys.replay │ ├── hashivault/ │ │ ├── example_test.go │ │ ├── go.mod │ │ ├── go.sum │ │ ├── localvault.sh │ │ ├── vault.go │ │ └── vault_test.go │ ├── localsecrets/ │ │ ├── example_test.go │ │ ├── localsecrets.go │ │ └── localsecrets_test.go │ ├── secrets.go │ └── secrets_test.go ├── server/ │ ├── driver/ │ │ └── driver.go │ ├── example_test.go │ ├── health/ │ │ ├── health.go │ │ ├── health_test.go │ │ └── sqlhealth/ │ │ ├── sqlhealth.go │ │ └── sqlhealth_test.go │ ├── requestlog/ │ │ ├── ncsa.go │ │ ├── ncsa_test.go │ │ ├── requestlog.go │ │ ├── requestlog_test.go │ │ ├── stackdriver.go │ │ └── stackdriver_test.go │ ├── sdserver/ │ │ └── server.go │ ├── server.go │ ├── server_test.go │ └── xrayserver/ │ └── server.go └── wire/ └── README.md ================================================ FILE CONTENTS ================================================ ================================================ FILE: .codecov.yml ================================================ codecov: # Removed hardcoded token for security reasons. # The token should be set via CI/CD secrets instead. # Example for GitHub Actions: # - name: Upload coverage to Codecov # run: codecov -t ${{ secrets.CODECOV_TOKEN }} # # See: https://docs.codecov.com/docs/adding-the-codecov-token coverage: status: project: default: target: 0 threshold: null base: auto patch: default: target: 0 threshold: null base: auto ================================================ FILE: .gitattributes ================================================ * text eol=lf *.png -text samples/order/testdata/* -text /internal/website/data/examples.json linguist-generated=true **/testdata/**/*.yaml linguist-generated=true **/testdata/**/*.replay linguist-generated=true *.replay binary ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.md ================================================ --- name: Bug report about: Create a report to help us improve --- Please use a title starting with the name of the affected package, or \"all\", followed by a colon, followed by a short summary of the issue. Example: `blob/gcsblob: not blobby enough`. You can use `go bug` to have a cool, automatically filled out bug template, or fill out the template below. ### Describe the bug A clear and concise description of what the bug is. ### To Reproduce Steps to reproduce the behavior. ## Expected behavior A clear and concise description of what you expected to happen. ### Version Which version(s) of the Go Cloud modules are you seeing the bug with? ### Additional context Add any other context about the problem here. ================================================ FILE: .github/ISSUE_TEMPLATE/feature_request.md ================================================ --- name: Feature request about: Suggest an idea for this project --- Please use a title starting with the name of the affected package, or \"all\", followed by a colon, followed by a short summary of the feature request. Example: `blob/gcsblob: add support for more blobbing`. ### Is your feature request related to a problem? Please describe. A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] ### Describe the solution you'd like A clear and concise description of what you want to happen. ### Describe alternatives you've considered A clear and concise description of any alternative solutions or features you've considered. ### Additional context Add any other context or screenshots about the feature request here. ================================================ FILE: .github/pull_request_template.md ================================================ Please use a title starting with the name of the affected package, or \"all\", followed by a colon, followed by a short summary of the issue. Example: `blob/gcsblob: fix typo in documentation`. Please reference any Issue related to this Pull Request. Example: `Fixes #1`. See [here](https://blog.github.com/2015-01-21-how-to-write-the-perfect-pull-request/) for tips on good Pull Request description. ================================================ FILE: .github/workflows/tests.yml ================================================ # Copyright 2021 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. name: tests on: [push, pull_request] jobs: build: strategy: fail-fast: false matrix: # Note: we used to include windows-latest, but it's super # flaky on Github runners, lots of OOMs. os: [ubuntu-latest, macos-latest] # When updating this, make sure to also update the # latest_go_version variable in internal/testing/runchecks.sh. go-version: [1.26.x] include: - go-version: 1.25.x os: ubuntu-latest runs-on: ${{ matrix.os }} steps: - name: Install Go uses: actions/setup-go@v6 with: go-version: ${{ matrix.go-version }} - name: Checkout code uses: actions/checkout@v6 with: fetch-depth: 2 # required for codecov - name: Run Tests shell: bash run: 'internal/testing/runchecks.sh' - if: matrix.os == 'ubuntu-latest' name: Build for dragonfly run: | go install ./... env: GOARCH: amd64 GOOS: dragonfly ================================================ FILE: .gitignore ================================================ # Binaries for programs and plugins *.exe *.dll *.so *.dylib /internal/contributebot/contributebot /internal/cmd/gocdk/gocdk /internal/website/gatherexamples/gatherexamples /internal/website/public/ /internal/testing/test-summary/test-summary /samples/gocdk-blob/gocdk-blob /samples/gocdk-docstore/gocdk-docstore /samples/gocdk-pubsub/gocdk-pubsub /samples/gocdk-runtimevar/gocdk-runtimevar /samples/gocdk-secrets/gocdk-secrets /samples/guestbook/guestbook /samples/guestbook/gcp/guestbook /samples/tutorial/tutorial /samples/tutorial/upload # Test binary, build with `go test -c` *.test # Output of the go coverage tool, specifically when used with LiteIDE *.out # Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736 .glide/ # Go vendor directory vendor/ # Populated config files /internal/contributebot/dev/ /internal/contributebot/webhook/app.yaml /tests/gcp/app/gcp-test.yaml # Cryptographic keys *.pem # Terraform Temporary Files *.tfstate *.tfstate.* .terraform/ terraform.tfvars # OSX leaves these everywhere on SMB shares ._* # OSX stuff .DS_Store # Eclipse files .classpath .project .settings/** # Files generated by JetBrains IDEs, e.g. Goland .idea/ *.iml # VSCode files .vscode # Emacs save files *~ \#*\# .\#* # Vim-related files [._]*.s[a-w][a-z] [._]s[a-w][a-z] *.un~ Session.vim .netrwhist # Mercurial files **/.hg **/.hg* # runtimevar/etcdvar tests create this directory. runtimevar/etcdvar/default.etcd ================================================ FILE: AUTHORS ================================================ # This is the official list of Go Cloud Development Kit authors for copyright # purposes. # This file is distinct from the CONTRIBUTORS files. # See the latter for an explanation. # Names should be added to this file as one of # Organization's name # Individual's name # Individual's name # See CONTRIBUTORS for the meaning of multiple email addresses. # Please keep the list sorted. Andrey Chernov Ben Hinchley Boris Popovschi Gerasimos (Makis) Maropoulos Google LLC Oleg Kovalov oliverpool Sendil Kumar N Steve Jiang Vishal Saroopchand Zachary Romero ================================================ FILE: CODE_OF_CONDUCT.md ================================================ # Code of Conduct This project is covered under the [Go Code of Conduct][]. In summary: - Treat everyone with respect and kindness. - Be thoughtful in how you communicate. - Don’t be destructive or inflammatory. - If you encounter an issue, please mail conduct@golang.org. [Go Code of Conduct]: https://golang.org/conduct ================================================ FILE: CONTRIBUTING.md ================================================ # How to Contribute We would love to accept your patches and contributions to this project. Here is how you can help. ## Filing issues Filing issues is an important way you can contribute to the Go Cloud Development Kit. We want your feedback on things like bugs, desired API changes, or just anything that isn't working for you. ### Bugs If your issue is a bug, open one [here](https://github.com/google/go-cloud/issues/new). The easiest way to file an issue with all the right information is to run `go bug`. `go bug` will print out a handy template of questions and system information that will help us get to the root of the issue quicker. Please start the title of your bug with the name of the affected package, followed by a colon, followed by a short summary of the issue, like "blob/gcsblob: not blobby enough". ### Changes Unlike the core Go project, we do not have a formal proposal process for changes. If you have a change you would like to see in the Go CDK, please file an issue with the necessary details. ### Triaging The Go CDK team triages issues at least every two weeks, but usually within two business days. Issues that we would like to address, but do not have time for are placed into the [Unplanned][] milestone. [Unplanned]: https://github.com/google/go-cloud/milestone/2 ## Contributing Code We love accepting contributions! If your change is minor, please feel free to submit a [pull request](https://help.github.com/articles/about-pull-requests/). If your change is larger, or adds a feature, please file an issue beforehand so that we can discuss the change. You're welcome to file an implementation pull request immediately as well, although we generally lean towards discussing the change and then reviewing the implementation separately. Be sure to take a look at the [internal docs][], which include more information about conventions and design patterns found in the project. [internal docs]: internal/docs/README.md ### Finding something to work on If you want to write some code, but don't know where to start or what you might want to do, take a look at the [Good First Issue] label and our [Unplanned][] milestone. The latter is where you can find issues we would like to address, but can't currently find time for. See if any of the latest ones look interesting! If you need help before you can start work, you can comment on the issue, and we will try to help as best we can. [Good First Issue]: https://github.com/google/go-cloud/labels/good%20first%20issue ### Contributor License Agreement Contributions to this project can only be made by those who have signed Google's Contributor License Agreement. You (or your employer) retain the copyright to your contribution, so this simply gives us permission to use and redistribute your contributions as part of the project. Head over to to see your current agreements on file or to sign a new one. As a personal contributor, you only need to sign the Google CLA once across all Google projects. If you've already signed the CLA, there is no need to do it again. If you are submitting code on behalf of your employer, there's [a separate corporate CLA that your employer manages for you](https://opensource.google.com/docs/cla/#external-contributors). ### A Warning About Tests Tests that interact with cloud providers are written using a replay method, where the test is run and actually performs the operations, and the requests/results of the operations are stored in a replay file. This replay file is then read back in unit tests on Travis, so the tests get to operate with real data. Unfortunately, while the Go CDK team can generate these replay files against our test cloud infrastructure, it is not yet possible for external contributors to do the same. We want to improve this process in the future and are researching how we can do this. If you have any ideas, please [file an issue](https://github.com/google/go-cloud/issues/new)! #### Writing and running tests against a cloud environment If you can create cloud resources, setup your authentication using either `aws` or `gcloud` and set the default project as the test project. Most tests will have constants defining the resource names they use (for example, for `blob` tests, the bucket name); update the constant and then run `go test -record`. New replay files will be generated. This uses API quota and will create and delete cloud resources. Replay files scrub sensitive information. [Send your PR](#making-a-pull-request) without the replay files, and we can generate new ones to be used by others. ### Dependencies The Go CDK has a policy to depend only on code licensed under one of the [`notice`][notice licenses], [`permissive`][permissive licenses], or [`unencumbered`][unencumbered licenses] categories in the [Google Open Source Licenses][] documentation. This is enforced with a Travis build check that verifies that every dependency is in the [`alldeps` file][]. Do not add new direct or indirect dependencies to the Go CDK unless you have verified that the dependency is released under an acceptable license. [`alldeps` file]: https://github.com/google/go-cloud/blob/master/internal/testing/alldeps [notice licenses]: https://opensource.google.com/docs/thirdparty/licenses/#notice [permissive licenses]: https://opensource.google.com/docs/thirdparty/licenses/#permissive [unencumbered licenses]: https://opensource.google.com/docs/thirdparty/licenses/#unencumbered [Google Open Source Licenses]: https://opensource.google.com/docs/thirdparty/licenses/ ## Making a pull request * Follow the normal [pull request flow](https://help.github.com/articles/creating-a-pull-request/). * Build your changes using Go 1.11 with Go modules enabled. The Go CDK's continuous integration uses Go modules in order to ensure [reproducible builds](https://research.swtch.com/vgo-repro). * Test your changes using `go test ./...`. Please add tests that show the change does what it says it does, even if there wasn't a test in the first place. Don't add the replay files to your commits. * Feel free to make as many commits as you want; we will squash them all into a single commit before merging your change. * Check the diffs, write a useful description (including something like `Fixes #123` if it's fixing a bug) and send the PR out. Please start the title of your pull request with the name of the affected package, followed by a colon, followed by a short summary of the change, like "blob/gcsblob: add more tests". * [Travis CI](http://travis-ci.com) will run tests against the PR. This should happen within 10 minutes or so. If a test fails, go back to the coding stage and try to fix the test and push the same branch again. You won't need to make a new pull request, the changes will be rolled directly into the PR you already opened. Wait for Travis again. There is no need to assign a reviewer to the PR, the project team will assign someone for review during the standard [triage](#triaging) process. ## Code review All submissions, including submissions by project members, require review. It is almost never the case that a pull request is accepted without some changes requested, so please do not be offended! When you have finished making requested changes to your pull request, please make a comment containing "PTAL" (Please Take Another Look) on your pull request. GitHub notifications can be noisy, and it is unfortunately easy for things to be lost in the shuffle. Once your PR is approved (hooray!), the reviewer will squash your commits into a single commit and then merge the commit onto the Go CDK master branch. Thank you! ## Github code review workflow conventions (For project members and frequent contributors.) As a contributor: - Try hard to make each Pull Request as small and focused as possible. In particular, this means that if a reviewer asks you to do something that is beyond the scope of the Pull Request, the best practice is to file another issue and reference it from the Pull Request rather than just adding more commits to the existing PR. - Adding someone as a Reviewer means "please feel free to look and comment"; the review is optional. Choose as many Reviewers as you'd like. - Adding someone as an Assignee means that the Pull Request should not be submitted until they approve. If you choose multiple Assignees, wait until all of them approve. It is fine to ask someone if they are OK with being removed as an Assignee. - Note that if you don't select any assignees, ContributeBot will turn all of your Reviewers into Assignees. - Make as many commits as you want locally, but try not to push them to Github until you've addressed comments; this allows the email notification about the push to be a signal to reviewers that the PR is ready to be looked at again. - When there may be confusion about what should happen next for a PR, be explicit; add a "PTAL" comment if it is ready for review again, or a "Please hold off on reviewing for now" if you are still working on addressing comments. - "Resolve" comments that you are sure you've addressed; let your reviewers resolve ones that you're not sure about. - Do not use `git push --force`; this can cause comments from your reviewers that are associated with a specific commit to be lost. This implies that once you've sent a Pull Request, you should use `git merge` instead of `git rebase` to incorporate commits from the master branch. - Travis checks will fail if you haven't run `gofmt -w -s`. - Travis checks will fail if your PR has backwards-incompatible changes, unless one of your commits has the strings `BREAKING_CHANGE_OK` in the first line of the commit message. As a reviewer: - Be timely in your review process, especially if you are an Assignee. - Try to use `Start a Review` instead of single comments, to reduce email spam. - "Resolve" your own comments if they have been addressed. - If you want your review to be blocking, and are not currently an Assignee, add yourself as an Assignee. When squashing-and-merging: - Ensure that **all** of the Assignees have approved. - Do a final review of the one-line PR summary, ensuring that it meets the guidelines (e.g., "blob: add more blobbing") and accurately describes the change. - Mark breaking changes with `BREAKING_CHANGE` in the commit message (e.g., "blob: BREAKING_CHANGE remove old blob"). - If the PR includes a breaking change, it will be declared via a commit with `BREAKING_CHANGE_OK` in it (see Contributor section above). - You can omit the marker if the change is technically breaking, but not expected to affect users (e.g., it's a breaking change to an object that wasn't in the last tagged release, or it's a change to a portable API function that's only expected to be used by driver implementations). - Delete the automatically added commit lines; these are generally not interesting and make commit history harder to read. ================================================ FILE: CONTRIBUTORS ================================================ # This is the official list of people who can contribute # (and typically have contributed) code to the Go CDK repository. # The AUTHORS file lists the copyright holders; this file # lists people. For example, Google employees are listed here # but not in AUTHORS, because Google holds the copyright. # # Names should be added to this file only after verifying that # the individual or the individual's organization has agreed to # the appropriate Contributor License Agreement, found here: # # http://code.google.com/legal/individual-cla-v1.0.html # http://code.google.com/legal/corporate-cla-v1.0.html # # The agreement for individuals can be filled out on the web. # # When adding J Random Contributor's name to this file, # either J's name or J's organization's name should be # added to the AUTHORS file, depending on whether the # individual or corporate CLA was used. # Names should be added to this file like so: # Individual's name # Individual's name # # An entry with multiple email addresses specifies that the # first address should be used in the submit logs and # that the other addresses should be recognized as the # same person when interacting with Git. # Please keep the list sorted. Andrey Chernov Ben Hinchley Boris Popovschi Chris Lewis Eno Compton Gerasimos (Makis) Maropoulos Issac Trotts Oleg Kovalov oliverpool Robert van Gent Ross Light Sendil Kumar N Steve Jiang Tuo Shan Tyler Bui-Palsulich <26876514+tbpg@users.noreply.github.com> Vishal Saroopchand Vivek Sekhar Zachary Romero ================================================ FILE: LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: README.md ================================================ # The Go Cloud Development Kit (Go CDK) _Write once, run on any cloud ☁️_ [![Build Status](https://github.com/google/go-cloud/actions/workflows/tests.yml/badge.svg?branch=master)](https://github.com/google/go-cloud/actions) [![Go Report Card](https://goreportcard.com/badge/github.com/google/go-cloud)](https://goreportcard.com/report/github.com/google/go-cloud) [![PkgGoDev](https://pkg.go.dev/badge/mod/gocloud.dev)][PkgGoDev] [![Coverage](https://codecov.io/gh/google/go-cloud/branch/master/graph/badge.svg)](https://codecov.io/gh/google/go-cloud) ![GitHub go.mod Go version](https://img.shields.io/github/go-mod/go-version/google/go-cloud) [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)

The Go Cloud Development Kit (Go CDK) allows Go application developers to seamlessly deploy cloud applications on any combination of cloud providers. It does this by providing stable, idiomatic interfaces for common uses like storage and databases. Think `database/sql` for cloud products. Imagine writing this to read from blob storage (like Google Cloud Storage or S3): ```go ctx := context.Background() bucket, err := blob.OpenBucket(ctx, "s3://my-bucket") if err != nil { return err } defer bucket.Close() blobReader, err := bucket.NewReader(ctx, "my-blob", nil) if err != nil { return err } ``` and being able to run that code on any cloud you want, avoiding all the ceremony of cloud-specific authorization, tracing, SDKs and all the other code required to make an application portable across cloud platforms. The project works well with a code generator called [Wire](https://github.com/google/wire/blob/master/README.md). It creates human-readable code that only imports the cloud SDKs for services you use. This allows the Go CDK to grow to support any number of cloud services, without increasing compile times or binary sizes, and avoiding any side effects from `init()` functions. You can learn more about the project from our [announcement blog post][], or our talk at Next 2018: [![Video: Building Go Applications for the Open Cloud (Cloud Next '18)](https://img.youtube.com/vi/_2ZwhvIkgek/0.jpg)][video] [announcement blog post]: https://blog.golang.org/go-cloud [PkgGoDev]: https://pkg.go.dev/mod/gocloud.dev [travis]: https://travis-ci.com/google/go-cloud [video]: https://www.youtube.com/watch?v=_2ZwhvIkgek ## Installation ```shell # First "cd" into your project directory if you have one to ensure "go get" uses # Go modules (or not) appropriately. See "go help modules" for more info. go get gocloud.dev ``` The Go CDK builds at the latest stable release of Go. Previous Go versions may compile but are not supported. ## Documentation Documentation for the project lives primarily on https://gocloud.dev/, including [tutorials][]. You can also browse Go package reference on [pkg.go.dev][PkgGoDev]. [tutorials]: https://gocloud.dev/tutorials/ ## Project status The APIs are still in alpha, but we think they are production-ready and are actively looking for feedback from early adopters. If you have comments or questions please open an issue. At this time we prefer to focus on maintaining the existing APIs and drivers, and are unlikely to accept new ones into the `go-cloud` repository. The modular nature of the Go CDK makes it simple to host new APIs and drivers for existing APIs externally, in separate repositories. If you have a new API or driver that you believe are important and mature enough to be included, feel free to open an issue to discuss this; our default will likely be to suggest starting in a separate repository. We'll also be happy to maintain a list of such external APIs and drivers in this README. ## Current features The Go CDK provides generic APIs for: * Unstructured binary (blob) storage * Publish/Subscribe (pubsub) * Variables that change at runtime (runtimevar) * Connecting to MySQL (including MariaDB) and PostgreSQL databases (mysql, postgres) * Server startup and diagnostics: request logging, tracing, and health checking (server) ## Contributing Thank you for your interest in contributing to the Go Cloud Development Kit! :heart: Everyone is welcome to contribute, whether it's in the form of code, documentation, bug reports, feature requests, or anything else. We encourage you to experiment with the Go CDK and make contributions to help evolve it to meet your needs! The GitHub repository at [google/go-cloud][go-cloud] contains some driver implementations for each portable API. We intend to include [Google Cloud Platform][gcp], [Amazon Web Services][aws], and [Azure][azure] implementations, as well as prominent open source services and at least one implementation suitable for use in local testing. Unfortunately, we cannot support every service directly from the project; however, we encourage contributions in separate repositories. If you create a repository that implements the Go CDK interfaces for other services, let us know! We would be happy to link to it here and give you a heads-up before making any breaking changes. See [the contributing guide](./CONTRIBUTING.md) for more details. [go-cloud]: https://github.com/google/go-cloud [gcp]: http://cloud.google.com [aws]: http://aws.amazon.com [azure]: https://azure.microsoft.com/ ## Community This project is covered by the Go [Code of Conduct][]. [Code of Conduct]: ./CODE_OF_CONDUCT.md ## Legal disclaimer The Go CDK is open-source and released under an [Apache 2.0 License](https://github.com/google/go-cloud/blob/master/LICENSE). Copyright © 2018–2019 The Go Cloud Development Kit Authors. If you are looking for the website of GoCloud Systems, which is unrelated to the Go CDK, visit https://gocloud.systems. ================================================ FILE: allmodules ================================================ # This file lists all the modules in our repository; it's used by scripts that # have to perform operations for each module. # # Any line that doesn't begin with a '#' character and isn't empty is treated # as a path relative to the top of the repository that has a module in it. # The 'released' field specifies whether this is a module we release and tag (a # module importable by users). # # Note: another file that lists all the modules in our repo is # the VSCode workspace gocloud.code-workspace - for now it has to be updated # manually whenever this file changes. # module-directory released . yes docstore/mongodocstore yes internal/website no pubsub/kafkapubsub yes pubsub/natspubsub yes pubsub/rabbitpubsub yes runtimevar/etcdvar yes runtimevar/hashivault yes samples no secrets/hashivault yes ================================================ FILE: aws/aws.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package aws provides fundamental Wire providers for Amazon Web Services (AWS). package aws // import "gocloud.dev/aws" import ( "context" "fmt" "net/url" "strconv" "strings" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/aws/ratelimit" "github.com/aws/aws-sdk-go-v2/aws/retry" "github.com/aws/aws-sdk-go-v2/config" ) const ( requestChecksumCalculationParamKey = "request_checksum_calculation" responseChecksumValidationParamKey = "response_checksum_validation" ) // parseRequestChecksumCalculation parses request checksum calculation mode values. // Supports AWS SDK documented values: "when_supported", "when_required". func parseRequestChecksumCalculation(value string) (aws.RequestChecksumCalculation, error) { switch strings.ToLower(value) { case "when_supported": return aws.RequestChecksumCalculationWhenSupported, nil case "when_required": return aws.RequestChecksumCalculationWhenRequired, nil default: return aws.RequestChecksumCalculationWhenSupported, fmt.Errorf("invalid value for %q: %q. Valid values are: when_supported, when_required", requestChecksumCalculationParamKey, value) } } // parseResponseChecksumValidation parses response checksum validation mode values. // Supports AWS SDK documented values: "when_supported", "when_required". func parseResponseChecksumValidation(value string) (aws.ResponseChecksumValidation, error) { switch strings.ToLower(value) { case "when_supported": return aws.ResponseChecksumValidationWhenSupported, nil case "when_required": return aws.ResponseChecksumValidationWhenRequired, nil default: return aws.ResponseChecksumValidationWhenSupported, fmt.Errorf("invalid value for %q: %q. Valid values are: when_supported, when_required", responseChecksumValidationParamKey, value) } } // NewDefaultV2Config returns a aws.Config for AWS SDK v2, using the default options. func NewDefaultV2Config(ctx context.Context) (aws.Config, error) { return config.LoadDefaultConfig(ctx) } // V2ConfigFromURLParams returns an aws.Config for AWS SDK v2 initialized based on the URL // parameters in q. It is intended to be used by URLOpeners for AWS services if // UseV2 returns true. // // https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws#Config // // It returns an error if q contains any unknown query parameters; callers // should remove any query parameters they know about from q before calling // V2ConfigFromURLParams. // // The following query options are supported: // - region: The AWS region for requests; sets WithRegion. // - anonymous: A value of "true" forces use of anonymous credentials. // - profile: The shared config profile to use; sets SharedConfigProfile. // - endpoint: The AWS service endpoint to send HTTP request. // - hostname_immutable: Make the hostname immutable, only works if endpoint is also set. // - dualstack: A value of "true" enables dual stack (IPv4 and IPv6) endpoints. // - fips: A value of "true" enables the use of FIPS endpoints. // - rate_limiter_capacity: A integer value configures the capacity of a token bucket used // in client-side rate limits. If no value is set, the client-side rate limiting is disabled. // See https://aws.github.io/aws-sdk-go-v2/docs/configuring-sdk/retries-timeouts/#client-side-rate-limiting. // - request_checksum_calculation: Request checksum calculation mode (when_supported, when_required) // - response_checksum_validation: Response checksum validation mode (when_supported, when_required) func V2ConfigFromURLParams(ctx context.Context, q url.Values) (aws.Config, error) { var endpoint string var hostnameImmutable bool var rateLimitCapacity int64 var opts []func(*config.LoadOptions) error for param, values := range q { value := values[0] switch param { case "hostname_immutable": var err error hostnameImmutable, err = strconv.ParseBool(value) if err != nil { return aws.Config{}, fmt.Errorf("invalid value for hostname_immutable: %w", err) } case "region": opts = append(opts, config.WithRegion(value)) case "endpoint": endpoint = value case "profile": opts = append(opts, config.WithSharedConfigProfile(value)) case "dualstack": dualStack, err := strconv.ParseBool(value) if err != nil { return aws.Config{}, fmt.Errorf("invalid value for dualstack: %w", err) } if dualStack { opts = append(opts, config.WithUseDualStackEndpoint(aws.DualStackEndpointStateEnabled)) } case "fips": fips, err := strconv.ParseBool(value) if err != nil { return aws.Config{}, fmt.Errorf("invalid value for fips: %w", err) } if fips { opts = append(opts, config.WithUseFIPSEndpoint(aws.FIPSEndpointStateEnabled)) } case "rate_limiter_capacity": var err error rateLimitCapacity, err = strconv.ParseInt(value, 10, 32) if err != nil { return aws.Config{}, fmt.Errorf("invalid value for capacity: %w", err) } case "anonymous": anon, err := strconv.ParseBool(value) if err != nil { return aws.Config{}, fmt.Errorf("invalid value for anonymous: %w", err) } if anon { opts = append(opts, config.WithCredentialsProvider(aws.AnonymousCredentials{})) } case requestChecksumCalculationParamKey: value, err := parseRequestChecksumCalculation(value) if err != nil { return aws.Config{}, err } opts = append(opts, config.WithRequestChecksumCalculation(value)) case responseChecksumValidationParamKey: value, err := parseResponseChecksumValidation(value) if err != nil { return aws.Config{}, err } opts = append(opts, config.WithResponseChecksumValidation(value)) case "awssdk": // ignore, should be handled before this default: return aws.Config{}, fmt.Errorf("unknown query parameter %q", param) } } if endpoint != "" { customResolver := aws.EndpointResolverWithOptionsFunc( func(service, region string, options ...any) (aws.Endpoint, error) { return aws.Endpoint{ PartitionID: "aws", URL: endpoint, SigningRegion: region, HostnameImmutable: hostnameImmutable, }, nil }) opts = append(opts, config.WithEndpointResolverWithOptions(customResolver)) } var rateLimiter retry.RateLimiter rateLimiter = ratelimit.None if rateLimitCapacity > 0 { rateLimiter = ratelimit.NewTokenRateLimit(uint(rateLimitCapacity)) } opts = append(opts, config.WithRetryer(func() aws.Retryer { return retry.NewStandard(func(so *retry.StandardOptions) { so.RateLimiter = rateLimiter }) })) return config.LoadDefaultConfig(ctx, opts...) } ================================================ FILE: aws/aws_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package aws_test import ( "context" "net/url" "reflect" "strings" "testing" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/aws/retry" gcaws "gocloud.dev/aws" ) func TestV2ConfigFromURLParams(t *testing.T) { const service = "s3" const region = "us-east-1" const partitionID = "aws" ctx := context.Background() tests := []struct { name string query url.Values wantRegion string wantErr bool wantEndpoint *aws.Endpoint }{ { name: "No overrides", query: url.Values{}, }, { name: "Invalid query parameter", query: url.Values{"foo": {"bar"}}, wantErr: true, }, { name: "Region", query: url.Values{"region": {"my_region"}}, wantRegion: "my_region", }, { name: "Endpoint and hostname immutable", query: url.Values{"endpoint": {"foo"}, "hostname_immutable": {"true"}}, wantEndpoint: &aws.Endpoint{ PartitionID: partitionID, SigningRegion: region, URL: "foo", HostnameImmutable: true, }, }, { name: "FIPS and dual stack", query: url.Values{"fips": {"true"}, "dualstack": {"true"}}, }, { name: "anonymous", query: url.Values{"anonymous": {"true"}}, }, { name: "Rate limit capacity", query: url.Values{"rate_limiter_capacity": {"500"}}, }, { name: "Request checksum calculation when_supported", query: url.Values{"request_checksum_calculation": {"when_supported"}}, }, { name: "Request checksum calculation when_required", query: url.Values{"request_checksum_calculation": {"when_required"}}, }, { name: "Response checksum validation when_supported", query: url.Values{"response_checksum_validation": {"when_supported"}}, }, { name: "Response checksum validation when_required", query: url.Values{"response_checksum_validation": {"when_required"}}, }, { name: "Both checksum parameters", query: url.Values{"request_checksum_calculation": {"when_required"}, "response_checksum_validation": {"when_supported"}}, }, { name: "Invalid request checksum value", query: url.Values{"request_checksum_calculation": {"invalid"}}, wantErr: true, }, { name: "Invalid response checksum value", query: url.Values{"response_checksum_validation": {"invalid"}}, wantErr: true, }, { name: "Empty request checksum value", query: url.Values{"request_checksum_calculation": {""}}, wantErr: true, }, { name: "Empty response checksum value", query: url.Values{"response_checksum_validation": {""}}, wantErr: true, }, { name: "Uppercase request checksum", query: url.Values{"request_checksum_calculation": {"WHEN_SUPPORTED"}}, }, { name: "Mixed case response checksum", query: url.Values{"response_checksum_validation": {"When_Required"}}, }, // Can't test "profile", since AWS validates that the profile exists. } for _, test := range tests { t.Run(test.name, func(t *testing.T) { got, err := gcaws.V2ConfigFromURLParams(ctx, test.query) if (err != nil) != test.wantErr { t.Errorf("got err %v want error %v", err, test.wantErr) return } if err != nil { return } if test.wantRegion != "" && got.Region != test.wantRegion { t.Errorf("got region %q, want %q", got.Region, test.wantRegion) } // Check checksum configuration based on query parameters if test.query.Has("request_checksum_calculation") { expectedValue := test.query.Get("request_checksum_calculation") var expectedChecksum aws.RequestChecksumCalculation switch strings.ToLower(expectedValue) { case "when_supported": expectedChecksum = aws.RequestChecksumCalculationWhenSupported case "when_required": expectedChecksum = aws.RequestChecksumCalculationWhenRequired } if got.RequestChecksumCalculation != expectedChecksum { t.Errorf("got RequestChecksumCalculation %v, want %v", got.RequestChecksumCalculation, expectedChecksum) } } if test.query.Has("response_checksum_validation") { expectedValue := test.query.Get("response_checksum_validation") var expectedChecksum aws.ResponseChecksumValidation switch strings.ToLower(expectedValue) { case "when_supported": expectedChecksum = aws.ResponseChecksumValidationWhenSupported case "when_required": expectedChecksum = aws.ResponseChecksumValidationWhenRequired } if got.ResponseChecksumValidation != expectedChecksum { t.Errorf("got ResponseChecksumValidation %v, want %v", got.ResponseChecksumValidation, expectedChecksum) } } if test.wantEndpoint != nil { if got.EndpointResolverWithOptions == nil { t.Fatalf("expected an EndpointResolverWithOptions, got nil") } gotE, err := got.EndpointResolverWithOptions.ResolveEndpoint(service, region) if err != nil { return } if !reflect.DeepEqual(gotE, *test.wantEndpoint) { t.Errorf("got endpoint %+v, want %+v", gotE, *test.wantEndpoint) } } // Unfortunately, we can't look at the options set for the rate limiter. r, ok := got.Retryer().(*retry.Standard) if !ok { t.Errorf("expected a standard retryer, got %v, expected retry.Standard", r) } }) } } ================================================ FILE: aws/awscloud/awscloud.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package awscloud contains Wire providers for AWS services. package awscloud // import "gocloud.dev/aws/awscloud" import ( "net/http" "github.com/google/wire" "gocloud.dev/aws" "gocloud.dev/aws/rds" "gocloud.dev/blob/s3blob" "gocloud.dev/docstore/awsdynamodb/v2" "gocloud.dev/pubsub/awssnssqs" "gocloud.dev/runtimevar/awsparamstore" "gocloud.dev/secrets/awskms" "gocloud.dev/server/xrayserver" ) // AWS is a Wire provider set that includes all Amazon Web Services interface // implementations in the Go CDK and authenticates using the default session. var AWS = wire.NewSet( Services, aws.NewDefaultV2Config, wire.Value(http.DefaultClient), ) // Services is a Wire provider set that includes the default wiring for all // Amazon Web Services interface implementations in the Go CDK but unlike the // AWS set, does not include credentials. Individual services may require // additional configuration. var Services = wire.NewSet( s3blob.Set, awssnssqs.Set, awsparamstore.Set, awskms.Set, rds.CertFetcherSet, awsdynamodb.Set, xrayserver.Set, ) ================================================ FILE: aws/awscloud/example_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package awscloud_test import ( "context" "fmt" "log" "net/http" "github.com/google/wire" sdktrace "go.opentelemetry.io/otel/sdk/trace" "gocloud.dev/aws/awscloud" "gocloud.dev/server" "gocloud.dev/server/health" ) // This is an example of how to bootstrap an HTTP server running on // Amazon Web Services (AWS). The code in this function would be // placed in main(). func Example() { // Connect and authenticate to AWS. srv, cleanup, err := setup(context.Background()) if err != nil { log.Fatal(err) } defer cleanup() // Set up the HTTP routes. http.HandleFunc("/", greet) // Run the server. This behaves much like http.ListenAndServe, // including that passing a nil handler will use http.DefaultServeMux. log.Fatal(srv.ListenAndServe(":8080")) } // setup is a Wire injector function that creates an HTTP server // configured to send diagnostics to AWS X-Ray. The second return // value is a clean-up function that can be called to shut down any // resources created by setup. // // The body of this function will be filled in by running Wire. While // the name of the function does not matter, the signature signals to // Wire what provider functions to call. See // https://github.com/google/wire/blob/master/docs/guide.md#injectors // for more details. func setup(ctx context.Context) (*server.Server, func(), error) { wire.Build( // The AWS set includes all the default wiring for AWS, including // for *server.Server. awscloud.AWS, // Providing nil instructs the server to use the default sampling policy. wire.Value(sdktrace.Sampler(nil)), // Health checks can be added to delay your server reporting healthy // to the load balancer before critical dependencies are available. wire.Value([]health.Checker(nil)), ) return nil, nil, nil } // greet is an ordinary http.HandleFunc. func greet(w http.ResponseWriter, req *http.Request) { fmt.Fprintln(w, "Hello, World!") } ================================================ FILE: aws/rds/rds.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package rds contains Wire providers that are common across RDS. package rds // import "gocloud.dev/aws/rds" import ( "context" "crypto/x509" "encoding/pem" "fmt" "io" "net/http" "github.com/google/wire" "golang.org/x/net/context/ctxhttp" ) // CertFetcherSet is a Wire provider set that provides the RDS certificate pool // by pulling from Amazon's servers. var CertFetcherSet = wire.NewSet( wire.Struct(new(CertFetcher), "Client"), wire.Bind(new(CertPoolProvider), new(*CertFetcher)), ) // A CertPoolProvider obtains a certificate pool that contains the RDS CA certificate. type CertPoolProvider interface { RDSCertPool(context.Context) (*x509.CertPool, error) } // caBundleURL is the URL to the public RDS Certificate Authority keys. const caBundleURL = "https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem" // CertFetcher pulls the RDS CA certificates from Amazon's servers. The zero // value will fetch certificates using the default HTTP client. type CertFetcher struct { // Client is the HTTP client used to make requests. If nil, then // http.DefaultClient is used. Client *http.Client } // RDSCertPool fetches the RDS CA certificates and places them into a pool. // It is safe to call from multiple goroutines. func (cf *CertFetcher) RDSCertPool(ctx context.Context) (*x509.CertPool, error) { certs, err := cf.Fetch(ctx) if err != nil { return nil, err } certPool := x509.NewCertPool() for _, c := range certs { certPool.AddCert(c) } return certPool, nil } // Fetch fetches the RDS CA certificates. It is safe to call from multiple goroutines. func (cf *CertFetcher) Fetch(ctx context.Context) ([]*x509.Certificate, error) { client := cf.Client if client == nil { client = http.DefaultClient } resp, err := ctxhttp.Get(ctx, client, caBundleURL) if err != nil { return nil, fmt.Errorf("fetch RDS certificates: %v", err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return nil, fmt.Errorf("fetch RDS certificates: HTTP %s", resp.Status) } pemData, err := io.ReadAll(&io.LimitedReader{R: resp.Body, N: 1 << 20}) // limit to 1MiB if err != nil { return nil, fmt.Errorf("fetch RDS certificates: %v", err) } var certs []*x509.Certificate for len(pemData) > 0 { var block *pem.Block block, pemData = pem.Decode(pemData) if block == nil { break } if block.Type != "CERTIFICATE" || len(block.Headers) != 0 { continue } c, err := x509.ParseCertificate(block.Bytes) if err != nil { return nil, fmt.Errorf("fetch RDS certificates: %v", err) } certs = append(certs, c) } return certs, nil } ================================================ FILE: azure/azurecloud/azurecloud.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package azurecloud contains Wire providers for Azure services. package azurecloud // import "gocloud.dev/azure/azurecloud" import ( "github.com/google/wire" "gocloud.dev/blob/azureblob" "gocloud.dev/secrets/azurekeyvault" ) // Azure is a Wire provider set that includes the default wiring for all // Microsoft Azure services in this repository, but does not include // credentials. Individual services may require additional configuration. var Azure = wire.NewSet( azurekeyvault.Set, azureblob.Set, ) ================================================ FILE: azure/azuredb/azuredb.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package azuredb contains Wire providers that are common across Azure Database. package azuredb import ( "context" "crypto/x509" "encoding/pem" "fmt" "io" "net/http" "golang.org/x/net/context/ctxhttp" ) const caBundleURL = "https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem" // A CertPoolProvider returns a certificate pool that contains the Azure CA certificate. type CertPoolProvider interface { AzureCertPool(context.Context) (*x509.CertPool, error) } // CertFetcher pulls the Azure CA certificates from Digicert's servers. The zero // value will fetch certificates using the default HTTP client. type CertFetcher struct { // Client is the HTTP client used to make requests. If nil, then // http.DefaultClient is used. Client *http.Client } // AzureCertPool fetches the Azure CA certificates and places them into a pool. // It is safe to call from multiple goroutines. func (cf *CertFetcher) AzureCertPool(ctx context.Context) (*x509.CertPool, error) { certs, err := cf.Fetch(ctx) if err != nil { return nil, err } certPool := x509.NewCertPool() for _, c := range certs { certPool.AddCert(c) } return certPool, nil } // Fetch fetches the Azure CA certificates. It is safe to call from multiple goroutines. func (cf *CertFetcher) Fetch(ctx context.Context) ([]*x509.Certificate, error) { client := cf.Client if client == nil { client = http.DefaultClient } resp, err := ctxhttp.Get(ctx, client, caBundleURL) if err != nil { return nil, fmt.Errorf("fetch Azure certificates: %v", err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return nil, fmt.Errorf("fetch Azure certificates: HTTP %s", resp.Status) } pemData, err := io.ReadAll(&io.LimitedReader{R: resp.Body, N: 1 << 20}) // limit to 1MiB if err != nil { return nil, fmt.Errorf("fetch Azure certificates: %v", err) } var certs []*x509.Certificate for len(pemData) > 0 { var block *pem.Block block, pemData = pem.Decode(pemData) if block == nil { break } if block.Type != "CERTIFICATE" || len(block.Headers) != 0 { continue } c, err := x509.ParseCertificate(block.Bytes) if err != nil { return nil, fmt.Errorf("fetch Azure certificates: %v", err) } certs = append(certs, c) } return certs, nil } ================================================ FILE: blob/azureblob/azureblob.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package azureblob provides a blob implementation that uses Azure Storage’s // BlockBlob. Use OpenBucket to construct a *blob.Bucket. // // NOTE: SignedURLs for PUT created with this package are not fully portable; // they will not work unless the PUT request includes a "x-ms-blob-type" header // set to "BlockBlob". // See https://stackoverflow.com/questions/37824136/put-on-sas-blob-url-without-specifying-x-ms-blob-type-header. // // # URLs // // For blob.OpenBucket, azureblob registers for the scheme "azblob". // // The default URL opener will use environment variables to generate // credentials and a service URL; see // https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob // for a more complete descriptions of each approach. // - AZURE_STORAGE_ACCOUNT: The service account name. Required if used along with AZURE_STORAGE KEY, because it defines // authentication mechanism to be azblob.NewSharedKeyCredential, which creates immutable shared key credentials. // Otherwise, "storage_account" in the URL query string parameter can be used. // - AZURE_STORAGE_KEY: To use a shared key credential. The service account // name and key are passed to NewSharedKeyCredential and then the // resulting credential is passed to NewClientWithSharedKeyCredential. // - AZURE_STORAGE_CONNECTION_STRING or AZURE_STORAGEBLOB_CONNECTIONSTRING: To use a connection string, passed to // NewClientFromConnectionString. // - AZURE_STORAGE_SAS_TOKEN: To use a SAS token. The SAS token is added // as a URL parameter to the service URL, and passed to // NewClientWithNoCredential. // - If none of the above are provided, azureblob defaults to // azidentity.NewDefaultAzureCredential: // https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#NewDefaultAzureCredential. // See the documentation there for the credential types it supports, including // CLI creds, environment variables like AZURE_CLIENT_ID, AZURE_TENANT_ID, etc. // // In addition, the environment variables AZURE_STORAGE_ACCOUNT, AZURE_STORAGE_DOMAIN, // AZURE_STORAGE_PROTOCOL, AZURE_STORAGE_IS_CDN, and AZURE_STORAGE_IS_LOCAL_EMULATOR // can be used to configure how the default URLOpener generates the Azure // Service URL via ServiceURLOptions. These can all be configured via URL // parameters as well. See ServiceURLOptions and NewDefaultServiceURL // for more details. // // To customize the URL opener, or for more details on the URL format, // see URLOpener. // // See https://gocloud.dev/concepts/urls/ for background information. // // # Escaping // // Go CDK supports all UTF-8 strings; to make this work with services lacking // full UTF-8 support, strings must be escaped (during writes) and unescaped // (during reads). The following escapes are performed for azureblob: // - Blob keys: ASCII characters 0-31, 34 ("\""), 35 ("#"), 37 ("%"), 63 ("?"), // 92 ("\"), and 127 are escaped to "__0x__". // Additionally, the "/" in "../" and a trailing "/" in a key (e.g., "foo/") are escaped in the same way. // - Metadata keys: Per https://docs.microsoft.com/en-us/azure/storage/blobs/storage-properties-metadata, // Azure only allows C# identifiers as metadata keys. Therefore, characters // other than "[a-z][A-z][0-9]_" are escaped using "__0x__". In addition, // characters "[0-9]" are escaped when they start the string. // URL encoding would not work since "%" is not valid. // - Metadata values: Escaped using URL encoding. // // # As // // azureblob exposes the following types for As: // - Bucket: *container.Client // - Error: *azcore.ResponseError. You can use bloberror.HasCode directly though. // - ListObject: container.BlobItem for objects, container.BlobPrefix for "directories" // - ListOptions.BeforeList: *container.ListBlobsHierarchyOptions // - Reader: azblobblob.DownloadStreamResponse // - Reader.BeforeRead: *azblob.DownloadStreamOptions // - Attributes: azblobblob.GetPropertiesResponse // - CopyOptions.BeforeCopy: *azblobblob.StartCopyFromURLOptions // - WriterOptions.BeforeWrite: *azblob.UploadStreamOptions // - SignedURLOptions.BeforeSign: *sas.BlobPermissions package azureblob import ( "context" "errors" "fmt" "io" "net/http" "net/url" "os" "sort" "strconv" "strings" "sync" "time" "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azidentity" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" azblobblob "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/bloberror" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blockblob" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/container" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/sas" "github.com/google/wire" "gocloud.dev/blob" "gocloud.dev/blob/driver" "gocloud.dev/gcerrors" "gocloud.dev/internal/escape" "gocloud.dev/internal/gcerr" "gocloud.dev/internal/useragent" ) const ( defaultPageSize = 1000 // default page size for ListPaged (Azure default is 5000) defaultUploadBuffers = 5 // configure the number of rotating buffers that are used when uploading (for degree of parallelism) defaultUploadBlockSize = 8 * 1024 * 1024 // configure the upload buffer size ) // ptrVal returns the value pointed to by p, or the zero value if p is nil. func ptrVal[T any](p *T) (v T) { if p != nil { v = *p } return } func init() { blob.DefaultURLMux().RegisterBucket(Scheme, new(lazyOpener)) } // Set holds Wire providers for this package. var Set = wire.NewSet( NewDefaultServiceURLOptions, NewServiceURL, NewDefaultClient, ) // Options sets options for constructing a *blob.Bucket backed by Azure Blob. type Options struct{} // ServiceURL represents an Azure service URL. type ServiceURL string // ContainerName represents an Azure blob container name. type ContainerName string // ServiceURLOptions sets options for constructing a service URL for Azure Blob. type ServiceURLOptions struct { // AccountName is the account name the credentials are for. AccountName string // SASToken will be appended to the service URL. // See https://docs.microsoft.com/en-us/azure/storage/common/storage-dotnet-shared-access-signature-part-1#shared-access-signature-parameters. SASToken string // StorageDomain can be provided to specify an Azure Cloud Environment // domain to target for the blob storage account (i.e. public, government, china). // Defaults to "blob.core.windows.net". Possible values will look similar // to this but are different for each cloud (i.e. "blob.core.govcloudapi.net" for USGovernment). // Check the Azure developer guide for the cloud environment where your bucket resides. // See the docstring for NewServiceURL to see examples of how this is used // along with the other Options fields. StorageDomain string // Protocol can be provided to specify protocol to access Azure Blob Storage. // Protocols that can be specified are "http" for local emulator and "https" for general. // Defaults to "https". // See the docstring for NewServiceURL to see examples of how this is used // along with the other Options fields. Protocol string // IsCDN can be set to true when using a CDN URL pointing to a blob storage account: // https://docs.microsoft.com/en-us/azure/cdn/cdn-create-a-storage-account-with-cdn // See the docstring for NewServiceURL to see examples of how this is used // along with the other Options fields. IsCDN bool // IsLocalEmulator should be set to true when targeting Local Storage Emulator (Azurite). // See the docstring for NewServiceURL to see examples of how this is used // along with the other Options fields. IsLocalEmulator bool } // NewDefaultServiceURLOptions generates a ServiceURLOptions based on environment variables. func NewDefaultServiceURLOptions() *ServiceURLOptions { isCDN, _ := strconv.ParseBool(os.Getenv("AZURE_STORAGE_IS_CDN")) isLocalEmulator, _ := strconv.ParseBool(os.Getenv("AZURE_STORAGE_IS_LOCAL_EMULATOR")) accountName := os.Getenv("AZURE_STORAGE_ACCOUNT") protocol := os.Getenv("AZURE_STORAGE_PROTOCOL") connectionString := os.Getenv("AZURE_STORAGE_CONNECTION_STRING") if connectionString == "" { connectionString = os.Getenv("AZURE_STORAGEBLOB_CONNECTIONSTRING") } if connectionString != "" { // Parse the connection string to get a default account name and protocol. // Format: DefaultEndpointsProtocol=https;AccountName=some-account;AccountKey=very-secure;EndpointSuffix=core.windows.net for part := range strings.SplitSeq(connectionString, ";") { keyval := strings.Split(part, "=") if len(keyval) == 2 { if accountName == "" && keyval[0] == "AccountName" { accountName = keyval[1] } else if protocol == "" && keyval[0] == "DefaultEndpointsProtocol" { protocol = keyval[1] } } } } return &ServiceURLOptions{ AccountName: accountName, SASToken: os.Getenv("AZURE_STORAGE_SAS_TOKEN"), StorageDomain: os.Getenv("AZURE_STORAGE_DOMAIN"), Protocol: protocol, IsCDN: isCDN, IsLocalEmulator: isLocalEmulator, } } // withOverrides returns o with overrides from urlValues. // See URLOpener for supported overrides. func (o *ServiceURLOptions) withOverrides(urlValues url.Values) (*ServiceURLOptions, error) { retval := *o for param, values := range urlValues { if len(values) > 1 { return nil, fmt.Errorf("multiple values of %v not allowed", param) } value := values[0] switch param { case "domain": retval.StorageDomain = value case "protocol": retval.Protocol = value case "cdn": isCDN, err := strconv.ParseBool(value) if err != nil { return nil, err } retval.IsCDN = isCDN case "localemu": isLocalEmulator, err := strconv.ParseBool(value) if err != nil { return nil, err } retval.IsLocalEmulator = isLocalEmulator case "storage_account": retval.AccountName = value default: return nil, fmt.Errorf("unknown query parameter %q", param) } } return &retval, nil } // NewServiceURL generates a URL for addressing an Azure Blob service // account. It uses several parameters, each of which can be specified // via ServiceURLOptions. // // The generated URL is "://." // with the following caveats: // - If opts.SASToken is provided, it is appended to the URL as a query // parameter. // - If opts.IsCDN is true, the part is dropped. // - If opts.IsLocalEmulator is true, or the domain starts with "localhost" // or "127.0.0.1", the account name and domain are flipped, e.g.: // http://127.0.0.1:10000/myaccount func NewServiceURL(opts *ServiceURLOptions) (ServiceURL, error) { if opts == nil { opts = &ServiceURLOptions{} } accountName := opts.AccountName if accountName == "" { return "", errors.New("azureblob: Options.AccountName is required") } domain := opts.StorageDomain if domain == "" { domain = "blob.core.windows.net" } protocol := opts.Protocol if protocol == "" { protocol = "https" } else if protocol != "http" && protocol != "https" { return "", fmt.Errorf("invalid protocol %q", protocol) } var svcURL string if strings.HasPrefix(domain, "127.0.0.1") || strings.HasPrefix(domain, "localhost") || opts.IsLocalEmulator { svcURL = fmt.Sprintf("%s://%s/%s", protocol, domain, accountName) } else if opts.IsCDN { svcURL = fmt.Sprintf("%s://%s", protocol, domain) } else { svcURL = fmt.Sprintf("%s://%s.%s", protocol, accountName, domain) } if opts.SASToken != "" { svcURL += "?" + opts.SASToken } return ServiceURL(svcURL), nil } // lazyOpener obtains credentials and creates a client on the first call to OpenBucketURL. type lazyOpener struct { init sync.Once opener *URLOpener } func (o *lazyOpener) OpenBucketURL(ctx context.Context, u *url.URL) (*blob.Bucket, error) { o.init.Do(func() { credInfo := newCredInfoFromEnv() opts := NewDefaultServiceURLOptions() o.opener = &URLOpener{ MakeClient: credInfo.NewClient, ServiceURLOptions: *opts, } }) return o.opener.OpenBucketURL(ctx, u) } type credTypeEnumT int const ( credTypeDefault credTypeEnumT = iota credTypeSharedKey credTypeSASViaNone credTypeConnectionString ) type credInfoT struct { CredType credTypeEnumT // For credTypeSharedKey. AccountName string AccountKey string // For credTypeConnectionString ConnectionString string } func newCredInfoFromEnv() *credInfoT { accountName := os.Getenv("AZURE_STORAGE_ACCOUNT") accountKey := os.Getenv("AZURE_STORAGE_KEY") sasToken := os.Getenv("AZURE_STORAGE_SAS_TOKEN") connectionString := os.Getenv("AZURE_STORAGE_CONNECTION_STRING") if connectionString == "" { connectionString = os.Getenv("AZURE_STORAGEBLOB_CONNECTIONSTRING") } credInfo := &credInfoT{ AccountName: accountName, } if accountName != "" && accountKey != "" { credInfo.CredType = credTypeSharedKey credInfo.AccountKey = accountKey } else if sasToken != "" { credInfo.CredType = credTypeSASViaNone } else if connectionString != "" { credInfo.CredType = credTypeConnectionString credInfo.ConnectionString = connectionString } else { credInfo.CredType = credTypeDefault } return credInfo } func (i *credInfoT) NewClient(svcURL ServiceURL, containerName ContainerName) (*container.Client, error) { // Set the ApplicationID. azClientOpts := &container.ClientOptions{} azClientOpts.Telemetry = policy.TelemetryOptions{ ApplicationID: useragent.AzureUserAgentPrefix("blob"), } containerURL, err := url.JoinPath(string(svcURL), string(containerName)) if err != nil { return nil, err } switch i.CredType { case credTypeDefault: cred, err := azidentity.NewDefaultAzureCredential(nil) if err != nil { return nil, fmt.Errorf("failed azidentity.NewDefaultAzureCredential: %v", err) } return container.NewClient(containerURL, cred, azClientOpts) case credTypeSharedKey: sharedKeyCred, err := azblob.NewSharedKeyCredential(i.AccountName, i.AccountKey) if err != nil { return nil, fmt.Errorf("failed azblob.NewSharedKeyCredential: %v", err) } return container.NewClientWithSharedKeyCredential(containerURL, sharedKeyCred, azClientOpts) case credTypeSASViaNone: return container.NewClientWithNoCredential(containerURL, azClientOpts) case credTypeConnectionString: return container.NewClientFromConnectionString(i.ConnectionString, string(containerName), azClientOpts) default: return nil, errors.New("internal error, unknown cred type") } } // Scheme is the URL scheme gcsblob registers its URLOpener under on // blob.DefaultMux. const Scheme = "azblob" // URLOpener opens Azure URLs like "azblob://mybucket". // // The URL host is used as the bucket name. // // The following query options are supported: // - domain: Overrides Options.StorageDomain. // - protocol: Overrides Options.Protocol. // - cdn: Overrides Options.IsCDN. // - localemu: Overrides Options.IsLocalEmulator. type URLOpener struct { // MakeClient must be set to a non-nil value. MakeClient func(svcURL ServiceURL, containerName ContainerName) (*container.Client, error) // ServiceURLOptions specifies default options for generating the service URL. // Some options can be overridden in the URL as described above. ServiceURLOptions ServiceURLOptions // Options specifies the options to pass to OpenBucket. Options Options } // OpenBucketURL opens a blob.Bucket based on u. func (o *URLOpener) OpenBucketURL(ctx context.Context, u *url.URL) (*blob.Bucket, error) { opts, err := o.ServiceURLOptions.withOverrides(u.Query()) if err != nil { return nil, err } svcURL, err := NewServiceURL(opts) if err != nil { return nil, err } client, err := o.MakeClient(svcURL, ContainerName(u.Host)) if err != nil { return nil, err } return OpenBucket(ctx, client, &o.Options) } // bucket represents a Azure Storage Account Container, which handles read, // write and delete operations on objects within it. // See https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction. type bucket struct { client *container.Client opts *Options } // NewDefaultClient returns an Azure Blob container client // with credentials from the environment as described in the package // docstring. func NewDefaultClient(svcURL ServiceURL, containerName ContainerName) (*container.Client, error) { return newCredInfoFromEnv().NewClient(svcURL, containerName) } // OpenBucket returns a *blob.Bucket backed by Azure Storage Account. See the package // documentation for an example and // https://godoc.org/github.com/Azure/azure-storage-blob-go/azblob // for more details. func OpenBucket(ctx context.Context, client *container.Client, opts *Options) (*blob.Bucket, error) { b, err := openBucket(ctx, client, opts) if err != nil { return nil, err } return blob.NewBucket(b), nil } func openBucket(ctx context.Context, client *container.Client, opts *Options) (*bucket, error) { if client == nil { return nil, errors.New("azureblob.OpenBucket: client is required") } if opts == nil { opts = &Options{} } return &bucket{ client: client, opts: opts, }, nil } // Close implements driver.Close. func (b *bucket) Close() error { return nil } // Copy implements driver.Copy. func (b *bucket) Copy(ctx context.Context, dstKey, srcKey string, opts *driver.CopyOptions) error { dstKey = escapeKey(dstKey, false) dstBlobClient := b.client.NewBlobClient(dstKey) srcKey = escapeKey(srcKey, false) srcBlobClient := b.client.NewBlobClient(srcKey) copyOptions := &azblobblob.StartCopyFromURLOptions{} if opts.BeforeCopy != nil { asFunc := func(i any) bool { switch v := i.(type) { case **azblobblob.StartCopyFromURLOptions: *v = copyOptions return true } return false } if err := opts.BeforeCopy(asFunc); err != nil { return err } } resp, err := dstBlobClient.StartCopyFromURL(ctx, srcBlobClient.URL(), copyOptions) if err != nil { return err } nErrors := 0 copyStatus := *resp.CopyStatus for copyStatus == azblobblob.CopyStatusTypePending { // Poll until the copy is complete. time.Sleep(500 * time.Millisecond) propertiesResp, err := dstBlobClient.GetProperties(ctx, nil) if err != nil { // A GetProperties failure may be transient, so allow a couple // of them before giving up. nErrors++ if ctx.Err() != nil || nErrors == 3 { return err } } copyStatus = *propertiesResp.CopyStatus } if copyStatus != azblobblob.CopyStatusTypeSuccess { return fmt.Errorf("Copy failed with status: %s", copyStatus) } return nil } // Delete implements driver.Delete. func (b *bucket) Delete(ctx context.Context, key string) error { key = escapeKey(key, false) blobClient := b.client.NewBlobClient(key) _, err := blobClient.Delete(ctx, nil) return err } // reader reads an azblob. It implements io.ReadCloser. type reader struct { body io.ReadCloser attrs driver.ReaderAttributes raw *azblobblob.DownloadStreamResponse } func (r *reader) Read(p []byte) (int, error) { return r.body.Read(p) } func (r *reader) Close() error { return r.body.Close() } func (r *reader) Attributes() *driver.ReaderAttributes { return &r.attrs } func (r *reader) As(i any) bool { p, ok := i.(*azblobblob.DownloadStreamResponse) if !ok { return false } *p = *r.raw return true } // NewRangeReader implements driver.NewRangeReader. func (b *bucket) NewRangeReader(ctx context.Context, key string, offset, length int64, opts *driver.ReaderOptions) (driver.Reader, error) { key = escapeKey(key, false) blobClient := b.client.NewBlobClient(key) downloadOpts := azblob.DownloadStreamOptions{} if offset != 0 { downloadOpts.Range.Offset = offset } if length >= 0 { downloadOpts.Range.Count = length } if opts.BeforeRead != nil { asFunc := func(i any) bool { if p, ok := i.(**azblobblob.DownloadStreamOptions); ok { *p = &downloadOpts return true } return false } if err := opts.BeforeRead(asFunc); err != nil { return nil, err } } blobDownloadResponse, err := blobClient.DownloadStream(ctx, &downloadOpts) if err != nil { return nil, err } attrs := driver.ReaderAttributes{ ContentType: ptrVal(blobDownloadResponse.ContentType), Size: getSize(blobDownloadResponse.ContentLength, ptrVal(blobDownloadResponse.ContentRange)), ModTime: *blobDownloadResponse.LastModified, } var body io.ReadCloser if length == 0 { body = http.NoBody } else { body = blobDownloadResponse.Body } return &reader{ body: body, attrs: attrs, raw: &blobDownloadResponse, }, nil } func getSize(contentLength *int64, contentRange string) int64 { var size int64 // Default size to ContentLength, but that's incorrect for partial-length reads, // where ContentLength refers to the size of the returned Body, not the entire // size of the blob. ContentRange has the full size. if contentLength != nil { size = *contentLength } if contentRange != "" { // Sample: bytes 10-14/27 (where 27 is the full size). parts := strings.Split(contentRange, "/") if len(parts) == 2 { if i, err := strconv.ParseInt(parts[1], 10, 64); err == nil { size = i } } } return size } // As implements driver.As. func (b *bucket) As(i any) bool { p, ok := i.(**container.Client) if !ok { return false } *p = b.client return true } // As implements driver.ErrorAs. func (b *bucket) ErrorAs(err error, i any) bool { switch v := err.(type) { case *azcore.ResponseError: if p, ok := i.(**azcore.ResponseError); ok { *p = v return true } } return false } func (b *bucket) ErrorCode(err error) gcerrors.ErrorCode { var rErr *azcore.ResponseError if errors.As(err, &rErr) { switch bloberror.Code(rErr.ErrorCode) { case bloberror.AuthenticationFailed: return gcerrors.PermissionDenied case bloberror.BlobAlreadyExists, bloberror.ConditionNotMet, bloberror.TargetConditionNotMet, bloberror.SourceConditionNotMet: // the documented error code is a variation of "ConditionNotMet", but "BlobAlreadyExists" has also been observed return gcerrors.FailedPrecondition case bloberror.BlobNotFound: return gcerrors.NotFound } if rErr.StatusCode == http.StatusNotFound { return gcerrors.NotFound } } if strings.Contains(err.Error(), "no such host") { // This happens with an invalid storage account name; the host // is something like invalidstorageaccount.blob.core.windows.net. return gcerrors.NotFound } return gcerrors.Unknown } // Attributes implements driver.Attributes. func (b *bucket) Attributes(ctx context.Context, key string) (*driver.Attributes, error) { key = escapeKey(key, false) blobClient := b.client.NewBlobClient(key) blobPropertiesResponse, err := blobClient.GetProperties(ctx, nil) if err != nil { return nil, err } md := make(map[string]string, len(blobPropertiesResponse.Metadata)) for k, v := range blobPropertiesResponse.Metadata { // See the package comments for more details on escaping of metadata // keys & values. if v != nil { md[escape.HexUnescape(k)] = escape.URLUnescape(*v) } } var eTag string if blobPropertiesResponse.ETag != nil { eTag = string(*blobPropertiesResponse.ETag) } return &driver.Attributes{ CacheControl: ptrVal(blobPropertiesResponse.CacheControl), ContentDisposition: ptrVal(blobPropertiesResponse.ContentDisposition), ContentEncoding: ptrVal(blobPropertiesResponse.ContentEncoding), ContentLanguage: ptrVal(blobPropertiesResponse.ContentLanguage), ContentType: ptrVal(blobPropertiesResponse.ContentType), Size: ptrVal(blobPropertiesResponse.ContentLength), CreateTime: *blobPropertiesResponse.CreationTime, ModTime: *blobPropertiesResponse.LastModified, MD5: blobPropertiesResponse.ContentMD5, ETag: eTag, Metadata: md, AsFunc: func(i any) bool { p, ok := i.(*azblobblob.GetPropertiesResponse) if !ok { return false } *p = blobPropertiesResponse return true }, }, nil } // ListPaged implements driver.ListPaged. func (b *bucket) ListPaged(ctx context.Context, opts *driver.ListOptions) (*driver.ListPage, error) { pageSize := opts.PageSize if pageSize == 0 { pageSize = defaultPageSize } var marker *string if len(opts.PageToken) > 0 { pt := string(opts.PageToken) marker = &pt } pageSize32 := int32(pageSize) prefix := escapeKey(opts.Prefix, true) azOpts := container.ListBlobsHierarchyOptions{ MaxResults: &pageSize32, Prefix: &prefix, Marker: marker, } if opts.BeforeList != nil { asFunc := func(i any) bool { p, ok := i.(**container.ListBlobsHierarchyOptions) if !ok { return false } *p = &azOpts return true } if err := opts.BeforeList(asFunc); err != nil { return nil, err } } azPager := b.client.NewListBlobsHierarchyPager(escapeKey(opts.Delimiter, true), &azOpts) resp, err := azPager.NextPage(ctx) if err != nil { return nil, err } page := &driver.ListPage{} page.Objects = []*driver.ListObject{} segment := resp.ListBlobsHierarchySegmentResponse.Segment for _, blobPrefix := range segment.BlobPrefixes { page.Objects = append(page.Objects, &driver.ListObject{ Key: unescapeKey(ptrVal(blobPrefix.Name)), Size: 0, IsDir: true, AsFunc: func(i any) bool { v, ok := i.(*container.BlobPrefix) if ok { *v = *blobPrefix } return ok }, }) } for _, blobInfo := range segment.BlobItems { page.Objects = append(page.Objects, &driver.ListObject{ Key: unescapeKey(ptrVal(blobInfo.Name)), ModTime: *blobInfo.Properties.LastModified, Size: *blobInfo.Properties.ContentLength, MD5: blobInfo.Properties.ContentMD5, IsDir: false, AsFunc: func(i any) bool { v, ok := i.(*container.BlobItem) if ok { *v = *blobInfo } return ok }, }) } if resp.NextMarker != nil { page.NextPageToken = []byte(*resp.NextMarker) } if len(segment.BlobPrefixes) > 0 && len(segment.BlobItems) > 0 { sort.Slice(page.Objects, func(i, j int) bool { return page.Objects[i].Key < page.Objects[j].Key }) } return page, nil } // SignedURL implements driver.SignedURL. func (b *bucket) SignedURL(ctx context.Context, key string, opts *driver.SignedURLOptions) (string, error) { if opts.ContentType != "" || opts.EnforceAbsentContentType { return "", gcerr.New(gcerr.Unimplemented, nil, 1, "azureblob: does not enforce Content-Type on PUT") } key = escapeKey(key, false) blobClient := b.client.NewBlobClient(key) perms := sas.BlobPermissions{} switch opts.Method { case http.MethodGet: perms.Read = true case http.MethodPut: perms.Create = true perms.Write = true case http.MethodDelete: perms.Delete = true default: return "", fmt.Errorf("unsupported Method %s", opts.Method) } if opts.BeforeSign != nil { asFunc := func(i any) bool { v, ok := i.(**sas.BlobPermissions) if ok { *v = &perms } return ok } if err := opts.BeforeSign(asFunc); err != nil { return "", err } } start := time.Now().UTC() expiry := start.Add(opts.Expiry) return blobClient.GetSASURL(perms, expiry, &azblobblob.GetSASURLOptions{StartTime: &start}) } type writer struct { ctx context.Context client *blockblob.Client uploadOpts *azblob.UploadStreamOptions // Ends of an io.Pipe, created when the first byte is written. pw *io.PipeWriter pr *io.PipeReader // Alternatively, upload is set to true when Upload was // used to upload data. upload bool donec chan struct{} // closed when done writing // The following fields will be written before donec closes: err error } // escapeKey does all required escaping for UTF-8 strings to work with Azure. // isPrefix indicates whether the key is a full key, or a prefix/delimiter. func escapeKey(key string, isPrefix bool) string { return escape.HexEscape(key, func(r []rune, i int) bool { c := r[i] switch { // Azure does not work well with backslashes in blob names. case c == '\\': return true // Azure doesn't handle these characters (determined via experimentation). case c < 32 || c == 34 || c == 35 || c == 37 || c == 63 || c == 127: return true // Escape trailing "/" for full keys, otherwise Azure can't address them // consistently. case !isPrefix && i == len(key)-1 && c == '/': return true // For "../", escape the trailing slash. case i > 1 && r[i] == '/' && r[i-1] == '.' && r[i-2] == '.': return true } return false }) } // unescapeKey reverses escapeKey. func unescapeKey(key string) string { return escape.HexUnescape(key) } // NewTypedWriter implements driver.NewTypedWriter. func (b *bucket) NewTypedWriter(ctx context.Context, key, contentType string, opts *driver.WriterOptions) (driver.Writer, error) { key = escapeKey(key, false) blobClient := b.client.NewBlockBlobClient(key) if opts.BufferSize == 0 { opts.BufferSize = defaultUploadBlockSize } if opts.MaxConcurrency == 0 { opts.MaxConcurrency = defaultUploadBuffers } md := make(map[string]*string, len(opts.Metadata)) for k, v := range opts.Metadata { // See the package comments for more details on escaping of metadata // keys & values. e := escape.HexEscape(k, func(runes []rune, i int) bool { c := runes[i] switch { case i == 0 && c >= '0' && c <= '9': return true case escape.IsASCIIAlphanumeric(c): return false case c == '_': return false } return true }) if _, ok := md[e]; ok { return nil, fmt.Errorf("duplicate keys after escaping: %q => %q", k, e) } escaped := escape.URLEscape(v) md[e] = &escaped } uploadOpts := &azblob.UploadStreamOptions{ BlockSize: int64(opts.BufferSize), Concurrency: opts.MaxConcurrency, Metadata: md, HTTPHeaders: &azblobblob.HTTPHeaders{ BlobCacheControl: &opts.CacheControl, BlobContentDisposition: &opts.ContentDisposition, BlobContentEncoding: &opts.ContentEncoding, BlobContentLanguage: &opts.ContentLanguage, BlobContentMD5: opts.ContentMD5, BlobContentType: &contentType, }, } if opts.IfNotExist { etagAny := azcore.ETagAny uploadOpts.AccessConditions = &azblob.AccessConditions{ ModifiedAccessConditions: &azblobblob.ModifiedAccessConditions{ IfNoneMatch: &etagAny, }, } } if opts.BeforeWrite != nil { asFunc := func(i any) bool { p, ok := i.(**azblob.UploadStreamOptions) if !ok { return false } *p = uploadOpts return true } if err := opts.BeforeWrite(asFunc); err != nil { return nil, err } } return &writer{ ctx: ctx, client: blobClient, uploadOpts: uploadOpts, donec: make(chan struct{}), }, nil } // Write appends p to w.pw. User must call Close to close the w after done writing. func (w *writer) Write(p []byte) (int, error) { // Avoid opening the pipe for a zero-length write; // the concrete can do these for empty blobs. if len(p) == 0 { return 0, nil } if w.pw == nil { // We'll write into pw and use pr as an io.Reader for the // Upload call to Azure. w.pr, w.pw = io.Pipe() w.open(w.pr, true) } return w.pw.Write(p) } // Upload reads from r. Per the driver, it is guaranteed to be the only // write call for this writer. func (w *writer) Upload(r io.Reader) error { w.upload = true w.open(r, false) return nil } // r may be nil if we're Closing and no data was written. // If closePipeOnError is true, w.pr will be closed if there's an // error uploading to Azure. func (w *writer) open(r io.Reader, closePipeOnError bool) { go func() { defer close(w.donec) if r == nil { r = http.NoBody } _, w.err = w.client.UploadStream(w.ctx, r, w.uploadOpts) if w.err != nil { if closePipeOnError { w.pr.CloseWithError(w.err) w.pr = nil } } }() } // Close completes the writer and closes it. Any error occurring during write will // be returned. If a writer is closed before any Write is called, Close will // create an empty file at the given key. func (w *writer) Close() error { if !w.upload { if w.pr != nil { defer w.pr.Close() } if w.pw == nil { // We never got any bytes written. We'll write an http.NoBody. w.open(nil, false) } else if err := w.pw.Close(); err != nil { return err } } <-w.donec return w.err } ================================================ FILE: blob/azureblob/azureblob_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package azureblob import ( "context" "encoding/base64" "errors" "fmt" "net/http" "net/url" "os" "strings" "testing" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" azblobblob "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/container" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/sas" "github.com/google/go-cmp/cmp" "gocloud.dev/blob" "gocloud.dev/blob/driver" "gocloud.dev/blob/drivertest" "gocloud.dev/internal/testing/setup" ) // Prerequisites for -record mode // 1. Sign-in to your Azure Subscription at http://portal.azure.com. // // 2. Create a Storage Account. // // 3. Locate the Access Key (Primary or Secondary) under your Storage Account > Settings > Access Keys. // // 4. Set the environment variables AZURE_STORAGE_ACCOUNT, AZURE_STORAGE_KEY to // the storage account name and your access key. // // 5. Create a container in your Storage Account > Blob. Update the bucketName // constant to your container name. // // Here is a step-by-step walkthrough using the Azure Portal // https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-portal // // 5. Run the tests with -record. const ( bucketName = "go-cloud-bucket" accountName = "gocloudblobtests" ) type harness struct { clientFn func(bucketName string) (*container.Client, error) closer func() httpClient *http.Client } func newHarness(ctx context.Context, t *testing.T) (drivertest.Harness, error) { t.Helper() var key string if *setup.Record { name := os.Getenv("AZURE_STORAGE_ACCOUNT") if name != accountName { t.Fatalf("Please update the accountName constant to match your settings file so future records work (%q vs %q)", name, accountName) } key = os.Getenv("AZURE_STORAGE_KEY") } else { // In replay mode, we use fake credentials. key = base64.StdEncoding.EncodeToString([]byte("FAKECREDS")) } credential, err := azblob.NewSharedKeyCredential(accountName, key) if err != nil { return nil, err } httpClient, done := setup.NewAzureTestBlobClient(ctx, t) // Hack to work around the fact that SignedURLs for PUTs are not fully // portable; they require a "x-ms-blob-type" header. Intercept all // requests, and insert that header where needed. httpClient.Transport = &requestInterceptor{httpClient.Transport} clientOptions := container.ClientOptions{} clientOptions.Transport = httpClient serviceURL := fmt.Sprintf("https://%s.blob.core.windows.net", accountName) clientFn := func(bucketName string) (*container.Client, error) { return container.NewClientWithSharedKeyCredential(serviceURL+"/"+bucketName, credential, &clientOptions) } return &harness{clientFn: clientFn, closer: done, httpClient: httpClient}, nil } // requestInterceptor implements a hack for the lack of portability for // SignedURLs for PUT. It adds the required "x-ms-blob-type" header where // Azure requires it. type requestInterceptor struct { base http.RoundTripper } func (ri *requestInterceptor) RoundTrip(req *http.Request) (*http.Response, error) { if req.Method == http.MethodPut && strings.Contains(req.URL.Path, "blob-for-signing") { reqClone := *req reqClone.Header.Add("x-ms-blob-type", "BlockBlob") req = &reqClone } return ri.base.RoundTrip(req) } func (h *harness) HTTPClient() *http.Client { return h.httpClient } func (h *harness) MakeDriver(ctx context.Context) (driver.Bucket, error) { client, err := h.clientFn(bucketName) if err != nil { return nil, err } return openBucket(ctx, client, nil) } func (h *harness) MakeDriverForNonexistentBucket(ctx context.Context) (driver.Bucket, error) { client, err := h.clientFn("bucket-does-not-exist") if err != nil { return nil, err } return openBucket(ctx, client, nil) } func (h *harness) Close() { h.closer() } func TestConformance(t *testing.T) { // See setup instructions above for more details. // Disable the conformance tests, we don't have an Azure account anymore. // drivertest.RunConformanceTests(t, newHarness, []drivertest.AsTest{verifyContentLanguage{}}) } func BenchmarkAzureblob(b *testing.B) { name := os.Getenv("AZURE_STORAGE_ACCOUNT") key := os.Getenv("AZURE_STORAGE_KEY") credential, err := azblob.NewSharedKeyCredential(name, key) if err != nil { b.Fatal(err) } containerURL := fmt.Sprintf("https://%s.blob.core.windows.net/%s", accountName, bucketName) client, err := container.NewClientWithSharedKeyCredential(containerURL, credential, nil) if err != nil { b.Fatal(err) } bkt, err := OpenBucket(context.Background(), client, nil) if err != nil { b.Fatal(err) } drivertest.RunBenchmarks(b, bkt) } var language = "nl" // verifyContentLanguage uses As to access the underlying Azure types and // read/write the ContentLanguage field. type verifyContentLanguage struct{} func (verifyContentLanguage) Name() string { return "verify ContentLanguage can be written and read through As" } func (verifyContentLanguage) BucketCheck(b *blob.Bucket) error { var u *container.Client if !b.As(&u) { return errors.New("Bucket.As failed") } return nil } func (verifyContentLanguage) ErrorCheck(b *blob.Bucket, err error) error { return nil } func (verifyContentLanguage) BeforeRead(as func(any) bool) error { var u *azblob.DownloadStreamOptions if !as(&u) { return fmt.Errorf("BeforeRead As failed to get %T", u) } return nil } func (verifyContentLanguage) BeforeWrite(as func(any) bool) error { var azOpts *azblob.UploadStreamOptions if !as(&azOpts) { return errors.New("Writer.As failed") } azOpts.HTTPHeaders.BlobContentLanguage = &language return nil } func (verifyContentLanguage) BeforeCopy(as func(any) bool) error { var co *azblobblob.StartCopyFromURLOptions if !as(&co) { return errors.New("BeforeCopy.As failed") } return nil } func (verifyContentLanguage) BeforeList(as func(any) bool) error { var azOpts *container.ListBlobsHierarchyOptions if !as(&azOpts) { return errors.New("BeforeList.As failed") } return nil } func (verifyContentLanguage) BeforeSign(as func(any) bool) error { var azOpts *sas.BlobPermissions if !as(&azOpts) { return errors.New("BeforeSign.As failed") } return nil } func (verifyContentLanguage) AttributesCheck(attrs *blob.Attributes) error { var resp azblobblob.GetPropertiesResponse if !attrs.As(&resp) { return errors.New("Attributes.As returned false") } if got := *resp.ContentLanguage; got != language { return fmt.Errorf("got %q want %q", got, language) } return nil } func (verifyContentLanguage) ReaderCheck(r *blob.Reader) error { var resp azblobblob.DownloadStreamResponse if !r.As(&resp) { return errors.New("Reader.As returned false") } if got := *resp.ContentLanguage; got != language { return fmt.Errorf("got %q want %q", got, language) } return nil } func (verifyContentLanguage) ListObjectCheck(o *blob.ListObject) error { if o.IsDir { var prefix container.BlobPrefix if !o.As(&prefix) { return errors.New("ListObject.As for dir returned false") } return nil } var item container.BlobItem if !o.As(&item) { return errors.New("ListObject.As for object returned false") } if got := *item.Properties.ContentLanguage; got != language { return fmt.Errorf("got %q want %q", got, language) } return nil } func TestOpenBucket(t *testing.T) { tests := []struct { description string nilClient bool accountName string want string wantErr bool }{ { description: "nil client results in error", nilClient: true, accountName: "myaccount", wantErr: true, }, { description: "success", accountName: "myaccount", want: "foo", }, } ctx := context.Background() for _, test := range tests { t.Run(test.description, func(t *testing.T) { var client *container.Client var err error if !test.nilClient { client, err = container.NewClientWithNoCredential("", nil) if err != nil { t.Fatal(err) } } // Create portable type. b, err := OpenBucket(ctx, client, nil) if b != nil { defer b.Close() } if (err != nil) != test.wantErr { t.Errorf("got err %v want error %v", err, test.wantErr) } }) } } func TestOpenerFromEnv(t *testing.T) { tests := []struct { accountName string accountKey string sasToken string connectionString string connectionString2 string domain string protocol string isCDN bool isLocalEmulator bool want *credInfoT wantOpts *ServiceURLOptions }{ { // Shared key. accountName: "myaccount", accountKey: "fakecreds", want: &credInfoT{ CredType: credTypeSharedKey, AccountName: "myaccount", AccountKey: "fakecreds", }, wantOpts: &ServiceURLOptions{ AccountName: "myaccount", }, }, { // SAS Token. accountName: "myaccount", sasToken: "a-sas-token", want: &credInfoT{ CredType: credTypeSASViaNone, AccountName: "myaccount", }, wantOpts: &ServiceURLOptions{ AccountName: "myaccount", SASToken: "a-sas-token", }, }, { // Connection string. accountName: "myaccount", connectionString: "a-connection-string", want: &credInfoT{ CredType: credTypeConnectionString, AccountName: "myaccount", ConnectionString: "a-connection-string", }, wantOpts: &ServiceURLOptions{ AccountName: "myaccount", }, }, { // Connection string provides default protocol and account name. connectionString: "DefaultEndpointsProtocol=https;AccountName=another-account", want: &credInfoT{ CredType: credTypeConnectionString, ConnectionString: "DefaultEndpointsProtocol=https;AccountName=another-account", }, wantOpts: &ServiceURLOptions{ AccountName: "another-account", Protocol: "https", }, }, { // Alternate connection string. accountName: "myaccount", connectionString2: "a-connection-string", want: &credInfoT{ CredType: credTypeConnectionString, AccountName: "myaccount", ConnectionString: "a-connection-string", }, wantOpts: &ServiceURLOptions{ AccountName: "myaccount", }, }, { // Default. accountName: "anotheraccount", want: &credInfoT{ CredType: credTypeDefault, AccountName: "anotheraccount", }, wantOpts: &ServiceURLOptions{ AccountName: "anotheraccount", }, }, { // Setting protocol and domain. accountName: "myaccount", protocol: "http", domain: "foo.bar.com", want: &credInfoT{ CredType: credTypeDefault, AccountName: "myaccount", }, wantOpts: &ServiceURLOptions{ AccountName: "myaccount", Protocol: "http", StorageDomain: "foo.bar.com", }, }, { // Local emulator. accountName: "myaccount", isLocalEmulator: true, want: &credInfoT{ CredType: credTypeDefault, AccountName: "myaccount", }, wantOpts: &ServiceURLOptions{ AccountName: "myaccount", IsLocalEmulator: true, }, }, } for _, test := range tests { t.Setenv("AZURE_STORAGE_ACCOUNT", test.accountName) t.Setenv("AZURE_STORAGE_KEY", test.accountKey) t.Setenv("AZURE_STORAGE_SAS_TOKEN", test.sasToken) t.Setenv("AZURE_STORAGE_CONNECTION_STRING", test.connectionString) t.Setenv("AZURE_STORAGEBLOB_CONNECTIONSTRING", test.connectionString2) t.Setenv("AZURE_STORAGE_DOMAIN", test.domain) t.Setenv("AZURE_STORAGE_PROTOCOL", test.protocol) if test.isCDN { t.Setenv("AZURE_STORAGE_IS_CDN", "true") } else { t.Setenv("AZURE_STORAGE_IS_CDN", "") } if test.isLocalEmulator { t.Setenv("AZURE_STORAGE_IS_LOCAL_EMULATOR", "true") } else { t.Setenv("AZURE_STORAGE_IS_LOCAL_EMULATOR", "") } got := newCredInfoFromEnv() if diff := cmp.Diff(got, test.want); diff != "" { t.Errorf("unexpected diff in credInfo: %s", diff) } gotOpts := NewDefaultServiceURLOptions() if diff := cmp.Diff(gotOpts, test.wantOpts); diff != "" { t.Errorf("unexpected diff in Options: %s", diff) } } } func TestNewServiceURL(t *testing.T) { tests := []struct { opts ServiceURLOptions query url.Values want ServiceURL wantErrOverrides bool wantErrURL bool }{ { // Unknown query parameter. opts: ServiceURLOptions{ AccountName: "myaccount", }, query: url.Values{ "foo": {"bar"}, }, wantErrOverrides: true, }, { // Duplicate query parameter. opts: ServiceURLOptions{ AccountName: "myaccount", }, query: url.Values{ "domain": {"blob.core.usgovcloudapi.net", "blob.core.windows.net"}, }, wantErrOverrides: true, }, { // Missing account name. opts: ServiceURLOptions{}, wantErrURL: true, }, { // Account name set in the query opts: ServiceURLOptions{}, query: url.Values{ "storage_account": {"testaccount"}, }, want: "https://testaccount.blob.core.windows.net", }, { // Basic working case. opts: ServiceURLOptions{ AccountName: "myaccount", }, want: "https://myaccount.blob.core.windows.net", }, { // SASToken. opts: ServiceURLOptions{ AccountName: "myaccount", SASToken: "my-sas-token", }, want: "https://myaccount.blob.core.windows.net?my-sas-token", }, { // Setting domain from ServiceURLOptions. opts: ServiceURLOptions{ AccountName: "myaccount", StorageDomain: "blob.core.usgovcloudapi.net", }, want: "https://myaccount.blob.core.usgovcloudapi.net", }, { // Setting domain from the URL. opts: ServiceURLOptions{ AccountName: "myaccount", StorageDomain: "overridden", }, query: url.Values{ "domain": {"blob.core.usgovcloudapi.net"}, }, want: "https://myaccount.blob.core.usgovcloudapi.net", }, { // Setting protocol from ServiceURLOptions. opts: ServiceURLOptions{ AccountName: "myaccount", Protocol: "http", }, want: "http://myaccount.blob.core.windows.net", }, { // Setting protocol from the URL. opts: ServiceURLOptions{ AccountName: "myaccount", Protocol: "https", }, query: url.Values{ "protocol": {"http"}, }, want: "http://myaccount.blob.core.windows.net", }, { // Setting IsCDN from ServiceURLOptions. opts: ServiceURLOptions{ AccountName: "myaccount", IsCDN: true, }, want: "https://blob.core.windows.net", }, { // Setting IsCDN from the URL. opts: ServiceURLOptions{ AccountName: "myaccount", }, query: url.Values{ "cdn": {"true"}, }, want: "https://blob.core.windows.net", }, { // Local emulator, implicit from domain. opts: ServiceURLOptions{ AccountName: "myaccount", Protocol: "http", StorageDomain: "localhost:10001", }, want: "http://localhost:10001/myaccount", }, { // Local emulator, implicit from domain through URL parameter. opts: ServiceURLOptions{ AccountName: "myaccount", }, query: url.Values{ "protocol": {"http"}, "domain": {"127.0.0.1:10001"}, }, want: "http://127.0.0.1:10001/myaccount", }, { // Local emulator, explicit through ServiceURLOptions. opts: ServiceURLOptions{ AccountName: "myaccount", StorageDomain: "mylocalemulator", IsLocalEmulator: true, }, want: "https://mylocalemulator/myaccount", }, { // Local emulator, explicit through URL parameter. opts: ServiceURLOptions{ AccountName: "myaccount", StorageDomain: "mylocalemulator", }, query: url.Values{ "localemu": {"true"}, }, want: "https://mylocalemulator/myaccount", }, } for _, test := range tests { opts, err := test.opts.withOverrides(test.query) if (err != nil) != test.wantErrOverrides { t.Fatalf("withOverrides got err %v want error %v", err, test.wantErrOverrides) } if err != nil { continue } got, err := NewServiceURL(opts) if (err != nil) != test.wantErrURL { t.Errorf("NewServiceURL got err %v want error %v", err, test.wantErrURL) } if got != test.want { t.Errorf("got %q want %q", got, test.want) } } } func TestOpenBucketFromURL(t *testing.T) { t.Setenv("AZURE_STORAGE_ACCOUNT", "my-account") t.Setenv("AZURE_STORAGE_KEY", "bXlrZXk=") // mykey base64 encoded tests := []struct { URL string WantErr bool }{ // OK. {"azblob://mybucket", false}, // With storage domain. {"azblob://mybucket?domain=blob.core.usgovcloudapi.net", false}, // With duplicate storage domain. {"azblob://mybucket?domain=blob.core.usgovcloudapi.net&domain=blob.core.windows.net", true}, // With protocol. {"azblob://mybucket?protocol=http", false}, // With invalid protocol. {"azblob://mybucket?protocol=ftp", true}, // With Account. {"azblob://mybucket?storage_account=test", false}, // With CDN. {"azblob://mybucket?cdn=true", false}, // With invalid CDN. {"azblob://mybucket?cdn=42", true}, // With local emulator. {"azblob://mybucket?localemu=true", false}, // With invalid local emulator. {"azblob://mybucket?localemu=42", true}, // Invalid parameter. {"azblob://mybucket?param=value", true}, } ctx := context.Background() for _, test := range tests { b, err := blob.OpenBucket(ctx, test.URL) if b != nil { defer b.Close() } if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } } } ================================================ FILE: blob/azureblob/example_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package azureblob_test import ( "context" "log" "gocloud.dev/blob" "gocloud.dev/blob/azureblob" ) func ExampleOpenBucket() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() const ( // The storage container to access. containerName = "my-container" ) // Construct the service URL. // There are many forms of service URLs, see ServiceURLOptions. opts := azureblob.NewDefaultServiceURLOptions() serviceURL, err := azureblob.NewServiceURL(opts) if err != nil { log.Fatal(err) } // There are many ways to authenticate to Azure. // This approach uses environment variables as described in azureblob package // documentation. // For example, to use shared key authentication, you would set // AZURE_STORAGE_ACCOUNT and AZURE_STORAGE_KEY. // To use a SAS token, you would set AZURE_STORAGE_ACCOUNT and AZURE_STORAGE_SAS_TOKEN. // You can also construct a client using the azblob constructors directly, like // azblob.NewServiceClientWithSharedKey. client, err := azureblob.NewDefaultClient(serviceURL, containerName) if err != nil { log.Fatal(err) } // Create a *blob.Bucket. b, err := azureblob.OpenBucket(ctx, client, nil) if err != nil { log.Fatal(err) } defer b.Close() // Now we can use b to read or write files to the container. data, err := b.ReadAll(ctx, "my-key") if err != nil { log.Fatal(err) } _ = data } func Example_openBucketFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/blob/azureblob" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // blob.OpenBucket creates a *blob.Bucket from a URL. // This URL will open the container "my-container" using default // credentials found in environment variables as documented in // the package. // Assuming AZURE_STORAGE_ACCOUNT is set to "myaccount", // and other options aren't set, the service URL will look like: // "https://myaccount.blob.core.windows.net/my-container". bucket, err := blob.OpenBucket(ctx, "azblob://my-container") if err != nil { log.Fatal(err) } defer bucket.Close() // Another example, against a local emulator. // Assuming AZURE_STORAGE_ACCOUNT is set to "myaccount", // the service URL will look like: // "http://localhost:10001/myaccount/my-container". localbucket, err := blob.OpenBucket(ctx, "azblob://my-container?protocol=http&domain=localhost:10001") if err != nil { log.Fatal(err) } defer localbucket.Close() } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestAs/verify_As_returns_false_when_passed_nil.replay ================================================ { "Initial": "AQAAAA7dVMCoCXoOugAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "263b7cb086987c42", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/mydir%2Fas-test", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "11" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XrY7u+Ae7tCTyyK7j1rNww==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8gd29ybGQ=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XrY7u+Ae7tCTyyK7j1rNww==" ], "Date": [ "Wed, 07 Feb 2024 00:07:03 GMT" ], "Etag": [ "\"0x8DC2770B72624DD\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:07:04 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "vo7q9sPVKY0=" ], "X-Ms-Request-Id": [ "9326ea65-501e-0022-2659-59dd3d000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "b0c2271384f1ba35", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/mydir%2Fas-test", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "11" ], "Content-Md5": [ "XrY7u+Ae7tCTyyK7j1rNww==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:07:03 GMT" ], "Etag": [ "\"0x8DC2770B72624DD\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:07:04 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:07:04 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "9326ea81-501e-0022-3f59-59dd3d000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "4958b3f90ff42b91", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/mydir%2Fas-test", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "11" ], "Content-Md5": [ "XrY7u+Ae7tCTyyK7j1rNww==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:07:03 GMT" ], "Etag": [ "\"0x8DC2770B72624DD\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:07:04 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:07:04 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "9326ea96-501e-0022-5359-59dd3d000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8gd29ybGQ=" } }, { "ID": "3ade4c5a78464254", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=%2F\u0026maxresults=1000\u0026prefix=mydir\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:07:03 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "9326eab1-501e-0022-6e59-59dd3d000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5teWRpcjwvUHJlZml4PjxNYXhSZXN1bHRzPjEwMDA8L01heFJlc3VsdHM+PERlbGltaXRlcj4vPC9EZWxpbWl0ZXI+PEJsb2JzPjxCbG9iUHJlZml4PjxOYW1lPm15ZGlyLzwvTmFtZT48L0Jsb2JQcmVmaXg+PC9CbG9icz48TmV4dE1hcmtlciAvPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "92bb4ce2fe59cf71", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026maxresults=1000\u0026prefix=mydir%2Fas-test\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:07:03 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "9326eac5-501e-0022-0159-59dd3d000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5teWRpci9hcy10ZXN0PC9QcmVmaXg+PE1heFJlc3VsdHM+MTAwMDwvTWF4UmVzdWx0cz48QmxvYnM+PEJsb2I+PE5hbWU+bXlkaXIvYXMtdGVzdDwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5XZWQsIDA3IEZlYiAyMDI0IDAwOjA3OjA0IEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5XZWQsIDA3IEZlYiAyMDI0IDAwOjA3OjA0IEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhEQzI3NzBCNzI2MjRERDwvRXRhZz48Q29udGVudC1MZW5ndGg+MTE8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5Yclk3dStBZTd0Q1R5eUs3ajFyTnd3PT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjwvQmxvYnM+PE5leHRNYXJrZXIgLz48L0VudW1lcmF0aW9uUmVzdWx0cz4=" } }, { "ID": "14ae09b3f7f54dda", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key-does-not-exist", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "215" ], "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:07:03 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Error-Code": [ "BlobNotFound" ], "X-Ms-Request-Id": [ "9326eadb-501e-0022-1759-59dd3d000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RXJyb3I+PENvZGU+QmxvYk5vdEZvdW5kPC9Db2RlPjxNZXNzYWdlPlRoZSBzcGVjaWZpZWQgYmxvYiBkb2VzIG5vdCBleGlzdC4KUmVxdWVzdElkOjkzMjZlYWRiLTUwMWUtMDAyMi0xNzU5LTU5ZGQzZDAwMDAwMApUaW1lOjIwMjQtMDItMDdUMDA6MDc6MDQuMzMzNjA0Nlo8L01lc3NhZ2U+PC9FcnJvcj4=" } }, { "ID": "99d0ff29b9a3532b", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/mydir%2Fas-test-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/mydir%2Fas-test" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:07:03 GMT" ], "Etag": [ "\"0x8DC2770B73D7A0F\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:07:04 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Copy-Id": [ "1a08d5cd-b2c2-425d-9d53-4ebf7e80652c" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Request-Id": [ "9326eaef-501e-0022-2a59-59dd3d000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "d158d20bf63fb935", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/mydir%2Fas-test-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:07:03 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "9326eb1e-501e-0022-5859-59dd3d000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "a7c2e1ede335ea4f", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/mydir%2Fas-test", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:07:03 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "9326eb3a-501e-0022-7259-59dd3d000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestAs/verify_ContentLanguage_can_be_written_and_read_through_As.replay ================================================ { "Initial": "AQAAAA7dVMCnNM6o9QAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "01721fa428e61498", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/mydir%2Fas-test", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "11" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "nl" ], "X-Ms-Blob-Content-Md5": [ "XrY7u+Ae7tCTyyK7j1rNww==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8gd29ybGQ=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XrY7u+Ae7tCTyyK7j1rNww==" ], "Date": [ "Wed, 07 Feb 2024 00:07:03 GMT" ], "Etag": [ "\"0x8DC2770B6FCF804\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:07:03 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "vo7q9sPVKY0=" ], "X-Ms-Request-Id": [ "6ef84252-001e-005d-0b59-5912a6000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "a7694ffd8490b83d", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/mydir%2Fas-test", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Language": [ "nl" ], "Content-Length": [ "11" ], "Content-Md5": [ "XrY7u+Ae7tCTyyK7j1rNww==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:07:03 GMT" ], "Etag": [ "\"0x8DC2770B6FCF804\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:07:03 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:07:03 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "6ef84282-001e-005d-3959-5912a6000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "8bf2231dfb60c2bd", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/mydir%2Fas-test", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Language": [ "nl" ], "Content-Length": [ "11" ], "Content-Md5": [ "XrY7u+Ae7tCTyyK7j1rNww==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:07:03 GMT" ], "Etag": [ "\"0x8DC2770B6FCF804\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:07:03 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:07:03 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "6ef842a6-001e-005d-5c59-5912a6000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8gd29ybGQ=" } }, { "ID": "f180d69676c1b7c9", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=%2F\u0026maxresults=1000\u0026prefix=mydir\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:07:03 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "6ef842cf-001e-005d-0559-5912a6000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5teWRpcjwvUHJlZml4PjxNYXhSZXN1bHRzPjEwMDA8L01heFJlc3VsdHM+PERlbGltaXRlcj4vPC9EZWxpbWl0ZXI+PEJsb2JzPjxCbG9iUHJlZml4PjxOYW1lPm15ZGlyLzwvTmFtZT48L0Jsb2JQcmVmaXg+PC9CbG9icz48TmV4dE1hcmtlciAvPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "40688ac858bc60be", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026maxresults=1000\u0026prefix=mydir%2Fas-test\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:07:04 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "6ef842f4-001e-005d-2a59-5912a6000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5teWRpci9hcy10ZXN0PC9QcmVmaXg+PE1heFJlc3VsdHM+MTAwMDwvTWF4UmVzdWx0cz48QmxvYnM+PEJsb2I+PE5hbWU+bXlkaXIvYXMtdGVzdDwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5XZWQsIDA3IEZlYiAyMDI0IDAwOjA3OjAzIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5XZWQsIDA3IEZlYiAyMDI0IDAwOjA3OjAzIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhEQzI3NzBCNkZDRjgwNDwvRXRhZz48Q29udGVudC1MZW5ndGg+MTE8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2U+bmw8L0NvbnRlbnQtTGFuZ3VhZ2U+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WHJZN3UrQWU3dENUeXlLN2oxck53dz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48L0Jsb2JzPjxOZXh0TWFya2VyIC8+PC9FbnVtZXJhdGlvblJlc3VsdHM+" } }, { "ID": "e83287343cdc46ce", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key-does-not-exist", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "215" ], "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:07:04 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Error-Code": [ "BlobNotFound" ], "X-Ms-Request-Id": [ "6ef8431c-001e-005d-5259-5912a6000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RXJyb3I+PENvZGU+QmxvYk5vdEZvdW5kPC9Db2RlPjxNZXNzYWdlPlRoZSBzcGVjaWZpZWQgYmxvYiBkb2VzIG5vdCBleGlzdC4KUmVxdWVzdElkOjZlZjg0MzFjLTAwMWUtMDA1ZC01MjU5LTU5MTJhNjAwMDAwMApUaW1lOjIwMjQtMDItMDdUMDA6MDc6MDQuMDY0MTQwMlo8L01lc3NhZ2U+PC9FcnJvcj4=" } }, { "ID": "8d127e157ee5ebb5", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/mydir%2Fas-test-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/mydir%2Fas-test" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:07:04 GMT" ], "Etag": [ "\"0x8DC2770B711405A\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:07:04 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Copy-Id": [ "37af6199-5347-4d3f-af0f-4f9f6c4756a1" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Request-Id": [ "6ef8433e-001e-005d-7459-5912a6000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "983526e9b3abd7ac", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/mydir%2Fas-test-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:07:04 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "6ef84385-001e-005d-3b59-5912a6000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "d61ab5e3f854200d", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/mydir%2Fas-test", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:07:04 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "6ef843ab-001e-005d-6159-5912a6000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestAttributes.replay ================================================ { "Initial": "AQAAAA7dVMB3AyjflwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "07d79e112173f31e", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/someDir%2Fblob-for-attributes", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "12" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "no-cache" ], "X-Ms-Blob-Content-Disposition": [ "inline" ], "X-Ms-Blob-Content-Encoding": [ "identity" ], "X-Ms-Blob-Content-Language": [ "en" ], "X-Ms-Blob-Content-Md5": [ "7Qdih1MuhjZehB6Sv8UNjA==" ], "X-Ms-Blob-Content-Type": [ "text/plain" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "SGVsbG8gV29ybGQh" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "7Qdih1MuhjZehB6Sv8UNjA==" ], "Date": [ "Wed, 07 Feb 2024 00:06:15 GMT" ], "Etag": [ "\"0x8DC277099E0B43E\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:15 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "peH8Xsgc5QI=" ], "X-Ms-Request-Id": [ "4eb2518f-c01e-006d-0359-59ac69000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "9099cbc51fadb608", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/not-found", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Wed, 07 Feb 2024 00:06:15 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Error-Code": [ "BlobNotFound" ], "X-Ms-Request-Id": [ "4eb25196-c01e-006d-0859-59ac69000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "9d849cfb58368608", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/someDir", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Wed, 07 Feb 2024 00:06:15 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Error-Code": [ "BlobNotFound" ], "X-Ms-Request-Id": [ "4eb2519e-c01e-006d-0e59-59ac69000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "5d6522afd6f2795c", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/someDir__0x2f__", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Wed, 07 Feb 2024 00:06:15 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Error-Code": [ "BlobNotFound" ], "X-Ms-Request-Id": [ "4eb251a7-c01e-006d-1559-59ac69000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "874738484cf4a9d1", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/someDir%2Fblob-for-attributes", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "no-cache" ], "Content-Disposition": [ "inline" ], "Content-Encoding": [ "identity" ], "Content-Language": [ "en" ], "Content-Length": [ "12" ], "Content-Md5": [ "7Qdih1MuhjZehB6Sv8UNjA==" ], "Content-Type": [ "text/plain" ], "Date": [ "Wed, 07 Feb 2024 00:06:15 GMT" ], "Etag": [ "\"0x8DC277099E0B43E\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:15 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:15 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "4eb251ac-c01e-006d-1a59-59ac69000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "fd98b60aafcc104c", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/someDir%2Fblob-for-attributes", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "no-cache" ], "Content-Disposition": [ "inline" ], "Content-Encoding": [ "identity" ], "Content-Language": [ "en" ], "Content-Length": [ "12" ], "Content-Md5": [ "7Qdih1MuhjZehB6Sv8UNjA==" ], "Content-Type": [ "text/plain" ], "Date": [ "Wed, 07 Feb 2024 00:06:15 GMT" ], "Etag": [ "\"0x8DC277099E0B43E\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:15 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:15 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "4eb251af-c01e-006d-1d59-59ac69000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "SGVsbG8gV29ybGQh" } }, { "ID": "67a95fc9e9c49265", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/someDir%2Fblob-for-attributes", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "12" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "7Qdih1MuhjZehB6Sv8UNjA==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "SGVsbG8gV29ybGQh" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "7Qdih1MuhjZehB6Sv8UNjA==" ], "Date": [ "Wed, 07 Feb 2024 00:06:15 GMT" ], "Etag": [ "\"0x8DC277099F3EB4C\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:15 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "peH8Xsgc5QI=" ], "X-Ms-Request-Id": [ "4eb251b6-c01e-006d-2259-59ac69000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "291af2e2795f3fde", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/someDir%2Fblob-for-attributes", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "12" ], "Content-Md5": [ "7Qdih1MuhjZehB6Sv8UNjA==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:15 GMT" ], "Etag": [ "\"0x8DC277099F3EB4C\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:15 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:15 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "4eb251b8-c01e-006d-2459-59ac69000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "2680d47826e7406a", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/someDir%2Fblob-for-attributes", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:15 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "4eb251bb-c01e-006d-2759-59ac69000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestCanceledWrite/BlobExists.replay ================================================ { "Initial": "AQAAAA7dVMCiBLAKEwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "3d7ad495cc57c2ad", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-canceled-write", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "11" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XrY7u+Ae7tCTyyK7j1rNww==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8gd29ybGQ=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XrY7u+Ae7tCTyyK7j1rNww==" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B3865400\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "vo7q9sPVKY0=" ], "X-Ms-Request-Id": [ "4be00b01-d01e-003c-1759-5931e5000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "2731ae1b79161b62", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-canceled-write", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "11" ], "Content-Md5": [ "XrY7u+Ae7tCTyyK7j1rNww==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B3865400\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "4be00b08-d01e-003c-1c59-5931e5000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8gd29ybGQ=" } }, { "ID": "a4aaa3ea871ace92", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-canceled-write", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "11" ], "Content-Md5": [ "XrY7u+Ae7tCTyyK7j1rNww==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B3865400\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "4be00b10-d01e-003c-2259-5931e5000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8gd29ybGQ=" } }, { "ID": "2223836ab248b04b", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-canceled-write", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "4be00b1b-d01e-003c-2a59-5931e5000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestCanceledWrite/EmptyContentType.replay ================================================ { "Initial": "AQAAAA7dVMChNFKfDgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "6e9395cdc202785a", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-canceled-write", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "215" ], "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Error-Code": [ "BlobNotFound" ], "X-Ms-Request-Id": [ "92be14ee-101e-006e-7559-594d0d000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RXJyb3I+PENvZGU+QmxvYk5vdEZvdW5kPC9Db2RlPjxNZXNzYWdlPlRoZSBzcGVjaWZpZWQgYmxvYiBkb2VzIG5vdCBleGlzdC4KUmVxdWVzdElkOjkyYmUxNGVlLTEwMWUtMDA2ZS03NTU5LTU5NGQwZDAwMDAwMApUaW1lOjIwMjQtMDItMDdUMDA6MDY6NTcuOTUzNDE3Nlo8L01lc3NhZ2U+PC9FcnJvcj4=" } }, { "ID": "17768546db354bf1", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-canceled-write", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "215" ], "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Error-Code": [ "BlobNotFound" ], "X-Ms-Request-Id": [ "92be14f8-101e-006e-7d59-594d0d000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RXJyb3I+PENvZGU+QmxvYk5vdEZvdW5kPC9Db2RlPjxNZXNzYWdlPlRoZSBzcGVjaWZpZWQgYmxvYiBkb2VzIG5vdCBleGlzdC4KUmVxdWVzdElkOjkyYmUxNGY4LTEwMWUtMDA2ZS03ZDU5LTU5NGQwZDAwMDAwMApUaW1lOjIwMjQtMDItMDdUMDA6MDY6NTcuOTcyNDA2MVo8L01lc3NhZ2U+PC9FcnJvcj4=" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestCanceledWrite/NonEmptyContentType.replay ================================================ { "Initial": "AQAAAA7dVMChOjAhtgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "e07ece6d59da230b", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-canceled-write", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "215" ], "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Error-Code": [ "BlobNotFound" ], "X-Ms-Request-Id": [ "5dc61a7a-c01e-0030-2459-59a6ed000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RXJyb3I+PENvZGU+QmxvYk5vdEZvdW5kPC9Db2RlPjxNZXNzYWdlPlRoZSBzcGVjaWZpZWQgYmxvYiBkb2VzIG5vdCBleGlzdC4KUmVxdWVzdElkOjVkYzYxYTdhLWMwMWUtMDAzMC0yNDU5LTU5YTZlZDAwMDAwMApUaW1lOjIwMjQtMDItMDdUMDA6MDY6NTguMDQ4Nzc3OFo8L01lc3NhZ2U+PC9FcnJvcj4=" } }, { "ID": "09faf066d14d05fe", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-canceled-write", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "215" ], "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Error-Code": [ "BlobNotFound" ], "X-Ms-Request-Id": [ "5dc61a85-c01e-0030-2b59-59a6ed000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RXJyb3I+PENvZGU+QmxvYk5vdEZvdW5kPC9Db2RlPjxNZXNzYWdlPlRoZSBzcGVjaWZpZWQgYmxvYiBkb2VzIG5vdCBleGlzdC4KUmVxdWVzdElkOjVkYzYxYTg1LWMwMWUtMDAzMC0yYjU5LTU5YTZlZDAwMDAwMApUaW1lOjIwMjQtMDItMDdUMDA6MDY6NTguMDY4NzY1MVo8L01lc3NhZ2U+PC9FcnJvcj4=" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestConcurrentWriteAndRead.replay ================================================ { "Initial": "AQAAAA7dVMCiDd39qwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "35faf9bb0b90a459", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key5", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "4096" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "YfRaKQkG0Wv1UeeMsD1f+Q==" ], "X-Ms-Blob-Content-Type": [ "application/octet-stream" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ==" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "YfRaKQkG0Wv1UeeMsD1f+Q==" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B3A45EEC\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "nDUBXIJsdys=" ], "X-Ms-Request-Id": [ "80b9adee-b01e-0015-3759-590f91000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "90273f42e536a416", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key12", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "4096" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "VkGQ+3LJseHAFopbb+BYvg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA==" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "VkGQ+3LJseHAFopbb+BYvg==" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B3A374AC\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "rz0qlyRkeGI=" ], "X-Ms-Request-Id": [ "b7910625-301e-0034-7b59-592bea000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "ff9e31c2d535e7bb", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key9", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "4096" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "kfsiuKRZ73D7CzauKodAhg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQ==" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "kfsiuKRZ73D7CzauKodAhg==" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B3A45EEC\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "fb4JIMHbjS0=" ], "X-Ms-Request-Id": [ "c80655ca-601e-0074-1859-592cd2000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "e8c86a57285e0806", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key0", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "4096" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "Yg8LZ6kff3QVG8W+dFtxEA==" ], "X-Ms-Blob-Content-Type": [ "application/octet-stream" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "Yg8LZ6kff3QVG8W+dFtxEA==" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B3A17938\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "TrYi62fTgmQ=" ], "X-Ms-Request-Id": [ "c6b7d4fb-601e-0064-1359-59e9ba000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "47a7a68a5318a47a", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key17", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "4096" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "32eeXsj7ZyhCl0o20wPQ/w==" ], "X-Ms-Blob-Content-Type": [ "application/octet-stream" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "EREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREQ==" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "32eeXsj7ZyhCl0o20wPQ/w==" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B3A26369\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "v6kY2Ee1eCA=" ], "X-Ms-Request-Id": [ "fc0d49d0-401e-005c-6d59-594d7a000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "80d670b0daa1350d", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key14", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "4096" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "NlFDUFM0TpF1S+MXE1PxDg==" ], "X-Ms-Blob-Content-Type": [ "application/octet-stream" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg==" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "NlFDUFM0TpF1S+MXE1PxDg==" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B3A437E4\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "bEbvZqMjdxU=" ], "X-Ms-Request-Id": [ "8232c10a-301e-0046-0259-592ca5000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "35d86e59500abe24", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key4", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "4096" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "H06jyF3ZsJDOcwyB5gg+zw==" ], "X-Ms-Blob-Content-Type": [ "application/octet-stream" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA==" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "H06jyF3ZsJDOcwyB5gg+zw==" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B3A1EE44\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "yEGoCGhcnIo=" ], "X-Ms-Request-Id": [ "fb4f5b57-401e-002e-4859-594a35000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "ae2c68ddada02447", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key15", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "4096" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "qHqy3TOCPLWABZ/YTEeiAg==" ], "X-Ms-Blob-Content-Type": [ "application/octet-stream" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "Dw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw==" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "qHqy3TOCPLWABZ/YTEeiAg==" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Etag": [ "\"0x8DC2770B3A1EE44\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "ODJGMkkTnLQ=" ], "X-Ms-Request-Id": [ "7183feb5-601e-004b-3959-59e471000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "9d050226ccfc3ade", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key1", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "4096" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "qo85ln3rRBpudISWOUWpYA==" ], "X-Ms-Blob-Content-Type": [ "application/octet-stream" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ==" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "qo85ln3rRBpudISWOUWpYA==" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Etag": [ "\"0x8DC2770B3A54925\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "GsKLv43jacU=" ], "X-Ms-Request-Id": [ "7f19919b-501e-0050-1d59-59da72000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "07f3cf75031f4576", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key10", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "4096" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "AXKK1JVcZ791KxchIXYNNg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg==" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "AXKK1JVcZ791KxchIXYNNg==" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B3A54925\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "6rFlhaysafs=" ], "X-Ms-Request-Id": [ "87762cce-f01e-002b-7f59-5998ee000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "9b36985b9de1ac64", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key11", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "4096" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "AbDmWR96f1VIFnW4JQ5/SA==" ], "X-Ms-Blob-Content-Type": [ "application/octet-stream" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "CwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCw==" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "AbDmWR96f1VIFnW4JQ5/SA==" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B3A54925\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "vsXM0Uacglo=" ], "X-Ms-Request-Id": [ "395524dc-501e-000d-0659-59d0f6000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "cc9a0d78b1ea1b8b", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key19", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "4096" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "2w9S4aRqKABHoeAhyiAJMA==" ], "X-Ms-Blob-Content-Type": [ "application/octet-stream" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "ExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEw==" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "2w9S4aRqKABHoeAhyiAJMA==" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Etag": [ "\"0x8DC2770B3A3E9D0\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "fNLdKcDyd1c=" ], "X-Ms-Request-Id": [ "f149b5a4-801e-007c-0f59-5936dd000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "a39417c1066e986a", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key6", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "4096" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "lko2uDqoJrgEyYNnvcJ6vw==" ], "X-Ms-Blob-Content-Type": [ "application/octet-stream" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBg==" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "lko2uDqoJrgEyYNnvcJ6vw==" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Etag": [ "\"0x8DC2770B3A4FB11\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "Czpt+e8bk/0=" ], "X-Ms-Request-Id": [ "f4beaff0-f01e-0049-4259-595ac9000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "20eb4c7fe547675a", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key13", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "4096" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "SsTzFZ3m7R1NrIc42UKW+Q==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "DQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ==" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "SsTzFZ3m7R1NrIc42UKW+Q==" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B3A485F7\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "+0mDw85Uk8M=" ], "X-Ms-Request-Id": [ "a431884f-601e-0080-3959-59e724000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "c12d8dddbd959410", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key2", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "4096" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "ZUHn/UhoC5tg7AVev6McAg==" ], "X-Ms-Blob-Content-Type": [ "application/octet-stream" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg==" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "ZUHn/UhoC5tg7AVev6McAg==" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Etag": [ "\"0x8DC2770B3A54925\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "jc3nGuCUjRM=" ], "X-Ms-Request-Id": [ "56e8fa50-001e-002f-5f59-5915e9000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "4b5f7a6bbc22547a", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key3", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "4096" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "7tBPOyKIo0omYOmbN3Ht7w==" ], "X-Ms-Blob-Content-Type": [ "application/octet-stream" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw==" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "7tBPOyKIo0omYOmbN3Ht7w==" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Etag": [ "\"0x8DC2770B3A4FB11\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "2blOTgqkZrI=" ], "X-Ms-Request-Id": [ "2b3e4806-b01e-003a-3c59-59025a000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "a44153651eaec20d", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key8", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "4096" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "qPZPE0uAGBNKE6LhEQTA8Q==" ], "X-Ms-Blob-Content-Type": [ "application/octet-stream" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA==" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "qPZPE0uAGBNKE6LhEQTA8Q==" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B3A4D408\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "KcqgdCvrZow=" ], "X-Ms-Request-Id": [ "6a2d0c30-801e-0021-2359-593c59000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "c0aad7b8e8f4e0f6", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key16", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "4096" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "65n9CjdrJkNQEaG4fFWMgQ==" ], "X-Ms-Blob-Content-Type": [ "application/octet-stream" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "EBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEA==" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "65n9CjdrJkNQEaG4fFWMgQ==" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Etag": [ "\"0x8DC2770B3A4ACFF\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "692xjK2Fk4E=" ], "X-Ms-Request-Id": [ "41c4e666-a01e-0036-5159-599552000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "753addf13ba893a4", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key18", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "4096" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "wZvI1MtOgANGQD0gzZ4NUg==" ], "X-Ms-Blob-Content-Type": [ "application/octet-stream" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "EhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEg==" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "wZvI1MtOgANGQD0gzZ4NUg==" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Etag": [ "\"0x8DC2770B3A4FB11\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "KKZ0fSrCnPY=" ], "X-Ms-Request-Id": [ "2597e5c4-f01e-0082-4d59-59599c000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "e4525c468c961e68", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key7", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "4096" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "kbuiTp5JEugjwAkgztPoXA==" ], "X-Ms-Blob-Content-Type": [ "application/octet-stream" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "BwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBw==" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "kbuiTp5JEugjwAkgztPoXA==" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B3A59738\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "X07ErQUreFw=" ], "X-Ms-Request-Id": [ "df382daf-c01e-001f-2859-59ab26000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "26fe097b8dfc0dd9", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key4", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "4096" ], "Content-Md5": [ "H06jyF3ZsJDOcwyB5gg+zw==" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B3A1EE44\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "fb4f5b71-401e-002e-6159-594a35000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA==" } }, { "ID": "07deadfa1fa50a87", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key1", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "4096" ], "Content-Md5": [ "qo85ln3rRBpudISWOUWpYA==" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B3A54925\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "c6b7d51f-601e-0064-3559-59e9ba000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ==" } }, { "ID": "5f04ee03f54cc943", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key13", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "4096" ], "Content-Md5": [ "SsTzFZ3m7R1NrIc42UKW+Q==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B3A485F7\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "c6b7d52f-601e-0064-4359-59e9ba000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "DQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ==" } }, { "ID": "dedf915bb1654380", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key2", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "4096" ], "Content-Md5": [ "ZUHn/UhoC5tg7AVev6McAg==" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B3A54925\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "fb4f5b80-401e-002e-6f59-594a35000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg==" } }, { "ID": "d17cf656d5d64521", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key14", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "4096" ], "Content-Md5": [ "NlFDUFM0TpF1S+MXE1PxDg==" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B3A437E4\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "c6b7d539-601e-0064-4d59-59e9ba000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg==" } }, { "ID": "8d7807162b60f184", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key10", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "4096" ], "Content-Md5": [ "AXKK1JVcZ791KxchIXYNNg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Etag": [ "\"0x8DC2770B3A54925\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "fb4f5b88-401e-002e-7759-594a35000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg==" } }, { "ID": "c6bfcbf1e1a2b857", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key5", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "4096" ], "Content-Md5": [ "YfRaKQkG0Wv1UeeMsD1f+Q==" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B3A45EEC\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "c6b7d548-601e-0064-5959-59e9ba000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ==" } }, { "ID": "0afd2bf72ee252b2", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key16", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "4096" ], "Content-Md5": [ "65n9CjdrJkNQEaG4fFWMgQ==" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Etag": [ "\"0x8DC2770B3A4ACFF\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "fb4f5b8f-401e-002e-7e59-594a35000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "EBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEA==" } }, { "ID": "1ec32073ef487318", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key17", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "4096" ], "Content-Md5": [ "32eeXsj7ZyhCl0o20wPQ/w==" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Etag": [ "\"0x8DC2770B3A26369\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "de1d6d10-501e-006f-1259-5912d1000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "EREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREQ==" } }, { "ID": "6dca688273167df4", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key9", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "4096" ], "Content-Md5": [ "kfsiuKRZ73D7CzauKodAhg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B3A45EEC\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "e9dfb127-901e-0012-4459-5963f2000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQ==" } }, { "ID": "75c7c90a95321532", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key19", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "4096" ], "Content-Md5": [ "2w9S4aRqKABHoeAhyiAJMA==" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Etag": [ "\"0x8DC2770B3A3E9D0\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "fbd8baf5-b01e-002a-4059-59c732000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "ExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEw==" } }, { "ID": "27714b93c7c1d3a0", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key6", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "4096" ], "Content-Md5": [ "lko2uDqoJrgEyYNnvcJ6vw==" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Etag": [ "\"0x8DC2770B3A4FB11\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "241ca3e9-201e-0038-3859-59bce2000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBg==" } }, { "ID": "2185cabf029d51a7", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key7", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "4096" ], "Content-Md5": [ "kbuiTp5JEugjwAkgztPoXA==" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Etag": [ "\"0x8DC2770B3A59738\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "a0c1845f-801e-0053-1a59-593b16000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "BwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBw==" } }, { "ID": "df34ad02c8238aaf", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key0", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "4096" ], "Content-Md5": [ "Yg8LZ6kff3QVG8W+dFtxEA==" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B3A17938\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "52966d83-801e-006c-1059-59f3b5000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" } }, { "ID": "ff47e414d7444d0e", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key18", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "4096" ], "Content-Md5": [ "wZvI1MtOgANGQD0gzZ4NUg==" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Etag": [ "\"0x8DC2770B3A4FB11\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "20ff1db7-a01e-0009-6559-595df1000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "EhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEg==" } }, { "ID": "c8381a049bf86db2", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key12", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "4096" ], "Content-Md5": [ "VkGQ+3LJseHAFopbb+BYvg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Etag": [ "\"0x8DC2770B3A374AC\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "ca36575d-e01e-0008-4859-59022d000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA==" } }, { "ID": "4fa11485a6df10c4", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key8", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "4096" ], "Content-Md5": [ "qPZPE0uAGBNKE6LhEQTA8Q==" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B3A4D408\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "6b619a89-901e-004f-3659-596976000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA==" } }, { "ID": "613e20421f735bda", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key3", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "4096" ], "Content-Md5": [ "7tBPOyKIo0omYOmbN3Ht7w==" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B3A4FB11\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "d5a00ca0-701e-0068-2059-597eb2000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw==" } }, { "ID": "469ce3073f304ba7", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key11", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "4096" ], "Content-Md5": [ "AbDmWR96f1VIFnW4JQ5/SA==" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B3A54925\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "e389d7eb-801e-000e-0d59-593192000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "CwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCw==" } }, { "ID": "3aba728c3505516c", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key15", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "4096" ], "Content-Md5": [ "qHqy3TOCPLWABZ/YTEeiAg==" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B3A1EE44\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "7f537300-901e-0060-4559-5964bd000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "Dw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw==" } }, { "ID": "ab3481045a6727db", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key19", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "a9322e60-001e-0062-5359-59da05000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "95605225d1d308a6", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key18", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "a9322e67-001e-0062-5859-59da05000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "23562f8d5b876fdf", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key17", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "a9322e6a-001e-0062-5b59-59da05000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "ee72eb93c46a680a", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key16", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "a9322e6f-001e-0062-6059-59da05000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "e212bc4636ab58ad", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key15", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "a9322e75-001e-0062-6659-59da05000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "aaa999d25bce69c4", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key14", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "a9322e78-001e-0062-6959-59da05000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "b404c4503de3d99d", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key13", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "a9322e7c-001e-0062-6d59-59da05000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "704a8e6bcfc73833", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key12", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "a9322e7f-001e-0062-6f59-59da05000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "6fa0a007dbd6a2b2", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key11", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "a9322e83-001e-0062-7259-59da05000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "70f2bdd3f69545ed", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key10", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "a9322e8b-001e-0062-7a59-59da05000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "3f66aaae92580d04", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key9", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "a9322e97-001e-0062-0659-59da05000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "b56e9b960633df9f", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key8", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "a9322e9b-001e-0062-0a59-59da05000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "ea9c9b34ce96414d", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key7", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "a9322ea7-001e-0062-1159-59da05000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "ff4054568c1eec2e", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key6", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "a9322ea8-001e-0062-1259-59da05000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "243f09f5ac2a8b42", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key5", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "a9322eb0-001e-0062-1859-59da05000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "9233cdde09f73837", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key4", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "a9322eb6-001e-0062-1e59-59da05000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "b9e2e7fada0f2558", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key3", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "a9322ebe-001e-0062-2659-59da05000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "4c05cbd8a7672aeb", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key2", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "a9322ec5-001e-0062-2d59-59da05000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "3cb9ad0e1886bd94", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key1", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "a9322ecb-001e-0062-3359-59da05000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "768387140a4f7510", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key0", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "a9322ed3-001e-0062-3b59-59da05000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestCopy/NonExistentSourceFails.replay ================================================ { "Initial": "AQAAAA7dVMCjNq/IsgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "e1c4cf9539dee835", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-copying-dest", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/does-not-exist" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "215" ], "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Error-Code": [ "BlobNotFound" ], "X-Ms-Request-Id": [ "ba760d19-d01e-0061-4c59-593b61000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RXJyb3I+PENvZGU+QmxvYk5vdEZvdW5kPC9Db2RlPjxNZXNzYWdlPlRoZSBzcGVjaWZpZWQgYmxvYiBkb2VzIG5vdCBleGlzdC4KUmVxdWVzdElkOmJhNzYwZDE5LWQwMWUtMDA2MS00YzU5LTU5M2I2MTAwMDAwMApUaW1lOjIwMjQtMDItMDdUMDA6MDY6NTkuOTkwNTcwNFo8L01lc3NhZ2U+PC9FcnJvcj4=" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestCopy/Works.replay ================================================ { "Initial": "AQAAAA7dVMCjO5aflwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "f87109358f7e8773", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-copying-src", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "11" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "no-cache" ], "X-Ms-Blob-Content-Disposition": [ "inline" ], "X-Ms-Blob-Content-Encoding": [ "identity" ], "X-Ms-Blob-Content-Language": [ "en" ], "X-Ms-Blob-Content-Md5": [ "sQqNsWTgdUEFt6mb5y4/5Q==" ], "X-Ms-Blob-Content-Type": [ "text/plain" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Meta-Foo": [ "bar" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "SGVsbG8gV29ybGQ=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "sQqNsWTgdUEFt6mb5y4/5Q==" ], "Date": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Etag": [ "\"0x8DC2770B4AB4855\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:07:00 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "YeJLfssylmU=" ], "X-Ms-Request-Id": [ "47d5f536-d01e-004e-6659-5936aa000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "d4ffcb5836b6da9c", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-copying-src", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "no-cache" ], "Content-Disposition": [ "inline" ], "Content-Encoding": [ "identity" ], "Content-Language": [ "en" ], "Content-Length": [ "11" ], "Content-Md5": [ "sQqNsWTgdUEFt6mb5y4/5Q==" ], "Content-Type": [ "text/plain" ], "Date": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Etag": [ "\"0x8DC2770B4AB4855\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:07:00 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Mon, 15 Jul 2019 16:10:26 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Meta-Foo": [ "bar" ], "X-Ms-Request-Id": [ "47d5f542-d01e-004e-7159-5936aa000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "92681aca7bed74d4", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-copying-dest-exists", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "10" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "oPqafXJA1cXuvXCJlDDFlw==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "Y2xvYmJlciBtZQ==" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "oPqafXJA1cXuvXCJlDDFlw==" ], "Date": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Etag": [ "\"0x8DC2770B4B1FE0F\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:07:00 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "Y9mFmC2gxu4=" ], "X-Ms-Request-Id": [ "47d5f548-d01e-004e-7659-5936aa000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "7476d61943289e82", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-copying-dest", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-copying-src" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Etag": [ "\"0x8DC2770B4B77B87\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:07:00 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Copy-Id": [ "e437369d-5f58-4180-abbe-0ca024fb430b" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Request-Id": [ "47d5f556-d01e-004e-0359-5936aa000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "c9ce25461774a3b8", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-copying-dest", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "no-cache" ], "Content-Disposition": [ "inline" ], "Content-Encoding": [ "identity" ], "Content-Language": [ "en" ], "Content-Length": [ "11" ], "Content-Md5": [ "sQqNsWTgdUEFt6mb5y4/5Q==" ], "Content-Type": [ "text/plain" ], "Date": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Etag": [ "\"0x8DC2770B4B77B87\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:07:00 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Copy-Completion-Time": [ "Wed, 07 Feb 2024 00:07:00 GMT" ], "X-Ms-Copy-Id": [ "e437369d-5f58-4180-abbe-0ca024fb430b" ], "X-Ms-Copy-Progress": [ "11/11" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-copying-src" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Creation-Time": [ "Mon, 15 Jul 2019 16:10:27 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Meta-Foo": [ "bar" ], "X-Ms-Request-Id": [ "47d5f563-d01e-004e-0f59-5936aa000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "SGVsbG8gV29ybGQ=" } }, { "ID": "0da5cf2b94221cd2", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-copying-dest", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "no-cache" ], "Content-Disposition": [ "inline" ], "Content-Encoding": [ "identity" ], "Content-Language": [ "en" ], "Content-Length": [ "11" ], "Content-Md5": [ "sQqNsWTgdUEFt6mb5y4/5Q==" ], "Content-Type": [ "text/plain" ], "Date": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Etag": [ "\"0x8DC2770B4B77B87\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:07:00 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Copy-Completion-Time": [ "Wed, 07 Feb 2024 00:07:00 GMT" ], "X-Ms-Copy-Id": [ "e437369d-5f58-4180-abbe-0ca024fb430b" ], "X-Ms-Copy-Progress": [ "11/11" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-copying-src" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Creation-Time": [ "Mon, 15 Jul 2019 16:10:27 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Meta-Foo": [ "bar" ], "X-Ms-Request-Id": [ "47d5f56a-d01e-004e-1659-5936aa000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "3c60641b36f7af56", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-copying-dest-exists", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-copying-src" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Etag": [ "\"0x8DC2770B4C29D78\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:07:00 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Copy-Id": [ "9293ce53-a728-4ab7-9f32-ad32faf2d398" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Request-Id": [ "47d5f575-d01e-004e-2159-5936aa000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "5d8bc5c645d4c114", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-copying-dest-exists", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "no-cache" ], "Content-Disposition": [ "inline" ], "Content-Encoding": [ "identity" ], "Content-Language": [ "en" ], "Content-Length": [ "11" ], "Content-Md5": [ "sQqNsWTgdUEFt6mb5y4/5Q==" ], "Content-Type": [ "text/plain" ], "Date": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Etag": [ "\"0x8DC2770B4C29D78\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:07:00 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Copy-Completion-Time": [ "Wed, 07 Feb 2024 00:07:00 GMT" ], "X-Ms-Copy-Id": [ "9293ce53-a728-4ab7-9f32-ad32faf2d398" ], "X-Ms-Copy-Progress": [ "11/11" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-copying-src" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Creation-Time": [ "Mon, 15 Jul 2019 16:10:27 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Meta-Foo": [ "bar" ], "X-Ms-Request-Id": [ "47d5f58a-d01e-004e-3559-5936aa000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "SGVsbG8gV29ybGQ=" } }, { "ID": "702a5e60fd35c8c5", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-copying-dest-exists", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "no-cache" ], "Content-Disposition": [ "inline" ], "Content-Encoding": [ "identity" ], "Content-Language": [ "en" ], "Content-Length": [ "11" ], "Content-Md5": [ "sQqNsWTgdUEFt6mb5y4/5Q==" ], "Content-Type": [ "text/plain" ], "Date": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Etag": [ "\"0x8DC2770B4C29D78\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:07:00 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Copy-Completion-Time": [ "Wed, 07 Feb 2024 00:07:00 GMT" ], "X-Ms-Copy-Id": [ "9293ce53-a728-4ab7-9f32-ad32faf2d398" ], "X-Ms-Copy-Progress": [ "11/11" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-copying-src" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Creation-Time": [ "Mon, 15 Jul 2019 16:10:27 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Meta-Foo": [ "bar" ], "X-Ms-Request-Id": [ "47d5f591-d01e-004e-3c59-5936aa000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestDelete/NonExistentFails.replay ================================================ { "Initial": "AQAAAA7dVMCkEG+1GAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "d588121abef3d1b8", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/does-not-exist", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "215" ], "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:07:00 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Error-Code": [ "BlobNotFound" ], "X-Ms-Request-Id": [ "fcf22d3f-901e-0002-5259-59a69a000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RXJyb3I+PENvZGU+QmxvYk5vdEZvdW5kPC9Db2RlPjxNZXNzYWdlPlRoZSBzcGVjaWZpZWQgYmxvYiBkb2VzIG5vdCBleGlzdC4KUmVxdWVzdElkOmZjZjIyZDNmLTkwMWUtMDAwMi01MjU5LTU5YTY5YTAwMDAwMApUaW1lOjIwMjQtMDItMDdUMDA6MDc6MDAuMzUxMTg4N1o8L01lc3NhZ2U+PC9FcnJvcj4=" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestDelete/Works.replay ================================================ { "Initial": "AQAAAA7dVMCkFXB3sQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "85f0eeebf2720b02", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-deleting", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "11" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "PiWWCnnbxptnTNTsZ6csYg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "SGVsbG8gd29ybGQ=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "PiWWCnnbxptnTNTsZ6csYg==" ], "Date": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Etag": [ "\"0x8DC2770B4E1929E\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:07:00 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "2yoxP9BZ4jg=" ], "X-Ms-Request-Id": [ "d0fa6d4d-301e-001b-6959-592621000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "a4e23bb89bbdc031", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-deleting", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "d0fa6d54-301e-001b-7059-592621000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "84cf6fe201e4935a", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-deleting", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "215" ], "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Error-Code": [ "BlobNotFound" ], "X-Ms-Request-Id": [ "d0fa6d60-301e-001b-7b59-592621000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RXJyb3I+PENvZGU+QmxvYk5vdEZvdW5kPC9Db2RlPjxNZXNzYWdlPlRoZSBzcGVjaWZpZWQgYmxvYiBkb2VzIG5vdCBleGlzdC4KUmVxdWVzdElkOmQwZmE2ZDYwLTMwMWUtMDAxYi03YjU5LTU5MjYyMTAwMDAwMApUaW1lOjIwMjQtMDItMDdUMDA6MDc6MDAuNDcyMTI3N1o8L01lc3NhZ2U+PC9FcnJvcj4=" } }, { "ID": "754a67873654dd01", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-deleting", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "215" ], "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Error-Code": [ "BlobNotFound" ], "X-Ms-Request-Id": [ "d0fa6d64-301e-001b-7f59-592621000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RXJyb3I+PENvZGU+QmxvYk5vdEZvdW5kPC9Db2RlPjxNZXNzYWdlPlRoZSBzcGVjaWZpZWQgYmxvYiBkb2VzIG5vdCBleGlzdC4KUmVxdWVzdElkOmQwZmE2ZDY0LTMwMWUtMDAxYi03ZjU5LTU5MjYyMTAwMDAwMApUaW1lOjIwMjQtMDItMDdUMDA6MDc6MDAuNDkxMTE2OFo8L01lc3NhZ2U+PC9FcnJvcj4=" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestDirsWithCharactersBeforeDelimiter.replay ================================================ { "Initial": "AQAAAA7dVMB1FLqo7gAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "abd22e504b0fd97c", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026maxresults=1000\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "573db1c7-801e-0043-1059-59fe7e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci88L1ByZWZpeD48TWF4UmVzdWx0cz4xMDAwPC9NYXhSZXN1bHRzPjxCbG9icz48QmxvYj48TmFtZT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPlR1ZSwgMDggRmViIDIwMjIgMjM6NTE6MTEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPlR1ZSwgMDggRmViIDIwMjIgMjM6NTE6MTEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ5RUI1REUyQTlDQ0JGPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIxL3Rlc3RGaWxlMWRpcjE8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+VHVlLCAwOCBGZWIgMjAyMiAyMzo1MToxMSBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+VHVlLCAwOCBGZWIgMjAyMiAyMzo1MToxMSBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDlFQjVERTI5Rjk1MDc8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL2RpcjIvdGVzdEZpbGUxZGlyMjwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5UdWUsIDA4IEZlYiAyMDIyIDIzOjUxOjExIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5UdWUsIDA4IEZlYiAyMDIyIDIzOjUxOjExIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhEOUVCNURFMkE1MTI3ODwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PEJsb2I+PE5hbWU+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdC0vdDwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5UdWUsIDA4IEZlYiAyMDIyIDIzOjUxOjExIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5UaHUsIDEyIE9jdCAyMDIzIDE3OjQyOjA1IEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhEQkNCNEE4RDMxMzE3RDwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PEJsb2I+PE5hbWU+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdC90L3Q8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+VHVlLCAwOCBGZWIgMjAyMiAyMzo1MToxMSBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+VHVlLCAwOCBGZWIgMjAyMiAyMzo1MToxMSBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDlFQjVERTI5NDczMEM8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3Rlc3RGaWxlMTwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5UdWUsIDA4IEZlYiAyMDIyIDIzOjUxOjExIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5UdWUsIDA4IEZlYiAyMDIyIDIzOjUxOjExIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhEOUVCNURFMjkwMDZERjwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PC9CbG9icz48TmV4dE1hcmtlciAvPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "583c2eaa4d2a0cb8", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-dirs-with-chars-before-delimiter%2Ft-%2Ft.", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "5" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Etag": [ "\"0x8DC277098E2551A\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "V0JSBnCFdzM=" ], "X-Ms-Request-Id": [ "573db1d1-801e-0043-1759-59fe7e000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "43851d7608e91a18", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=%2F\u0026maxresults=10\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "573db1d5-801e-0043-1b59-59fe7e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci88L1ByZWZpeD48TWF4UmVzdWx0cz4xMDwvTWF4UmVzdWx0cz48RGVsaW1pdGVyPi88L0RlbGltaXRlcj48QmxvYnM+PEJsb2I+PE5hbWU+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZDwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5UdWUsIDA4IEZlYiAyMDIyIDIzOjUxOjExIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5UdWUsIDA4IEZlYiAyMDIyIDIzOjUxOjExIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhEOUVCNURFMkE5Q0NCRjwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PEJsb2JQcmVmaXg+PE5hbWU+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMS88L05hbWU+PC9CbG9iUHJlZml4PjxCbG9iUHJlZml4PjxOYW1lPmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL2RpcjIvPC9OYW1lPjwvQmxvYlByZWZpeD48QmxvYlByZWZpeD48TmFtZT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90LS88L05hbWU+PC9CbG9iUHJlZml4PjxCbG9iUHJlZml4PjxOYW1lPmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QvPC9OYW1lPjwvQmxvYlByZWZpeD48QmxvYj48TmFtZT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90ZXN0RmlsZTE8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+VHVlLCAwOCBGZWIgMjAyMiAyMzo1MToxMSBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+VHVlLCAwOCBGZWIgMjAyMiAyMzo1MToxMSBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDlFQjVERTI5MDA2REY8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjwvQmxvYnM+PE5leHRNYXJrZXIgLz48L0VudW1lcmF0aW9uUmVzdWx0cz4=" } }, { "ID": "6b2b142871f46d54", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=%2F\u0026maxresults=9\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "573db1df-801e-0043-2459-59fe7e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci88L1ByZWZpeD48TWF4UmVzdWx0cz45PC9NYXhSZXN1bHRzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxCbG9icz48QmxvYj48TmFtZT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPlR1ZSwgMDggRmViIDIwMjIgMjM6NTE6MTEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPlR1ZSwgMDggRmViIDIwMjIgMjM6NTE6MTEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ5RUI1REUyQTlDQ0JGPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYlByZWZpeD48TmFtZT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIxLzwvTmFtZT48L0Jsb2JQcmVmaXg+PEJsb2JQcmVmaXg+PE5hbWU+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMi88L05hbWU+PC9CbG9iUHJlZml4PjxCbG9iUHJlZml4PjxOYW1lPmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QtLzwvTmFtZT48L0Jsb2JQcmVmaXg+PEJsb2JQcmVmaXg+PE5hbWU+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdC88L05hbWU+PC9CbG9iUHJlZml4PjxCbG9iPjxOYW1lPmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3Rlc3RGaWxlMTwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5UdWUsIDA4IEZlYiAyMDIyIDIzOjUxOjExIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5UdWUsIDA4IEZlYiAyMDIyIDIzOjUxOjExIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhEOUVCNURFMjkwMDZERjwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PC9CbG9icz48TmV4dE1hcmtlciAvPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "b89dfc8addcf9b05", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=%2F\u0026maxresults=8\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "573db1ea-801e-0043-2d59-59fe7e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci88L1ByZWZpeD48TWF4UmVzdWx0cz44PC9NYXhSZXN1bHRzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxCbG9icz48QmxvYj48TmFtZT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPlR1ZSwgMDggRmViIDIwMjIgMjM6NTE6MTEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPlR1ZSwgMDggRmViIDIwMjIgMjM6NTE6MTEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ5RUI1REUyQTlDQ0JGPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYlByZWZpeD48TmFtZT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIxLzwvTmFtZT48L0Jsb2JQcmVmaXg+PEJsb2JQcmVmaXg+PE5hbWU+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMi88L05hbWU+PC9CbG9iUHJlZml4PjxCbG9iUHJlZml4PjxOYW1lPmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QtLzwvTmFtZT48L0Jsb2JQcmVmaXg+PEJsb2JQcmVmaXg+PE5hbWU+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdC88L05hbWU+PC9CbG9iUHJlZml4PjxCbG9iPjxOYW1lPmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3Rlc3RGaWxlMTwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5UdWUsIDA4IEZlYiAyMDIyIDIzOjUxOjExIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5UdWUsIDA4IEZlYiAyMDIyIDIzOjUxOjExIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhEOUVCNURFMjkwMDZERjwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PC9CbG9icz48TmV4dE1hcmtlciAvPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "38eb44572e16b462", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=%2F\u0026maxresults=7\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "573db1f8-801e-0043-3a59-59fe7e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci88L1ByZWZpeD48TWF4UmVzdWx0cz43PC9NYXhSZXN1bHRzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxCbG9icz48QmxvYj48TmFtZT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPlR1ZSwgMDggRmViIDIwMjIgMjM6NTE6MTEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPlR1ZSwgMDggRmViIDIwMjIgMjM6NTE6MTEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ5RUI1REUyQTlDQ0JGPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYlByZWZpeD48TmFtZT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIxLzwvTmFtZT48L0Jsb2JQcmVmaXg+PEJsb2JQcmVmaXg+PE5hbWU+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMi88L05hbWU+PC9CbG9iUHJlZml4PjxCbG9iUHJlZml4PjxOYW1lPmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QtLzwvTmFtZT48L0Jsb2JQcmVmaXg+PEJsb2JQcmVmaXg+PE5hbWU+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdC88L05hbWU+PC9CbG9iUHJlZml4PjxCbG9iPjxOYW1lPmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3Rlc3RGaWxlMTwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5UdWUsIDA4IEZlYiAyMDIyIDIzOjUxOjExIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5UdWUsIDA4IEZlYiAyMDIyIDIzOjUxOjExIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhEOUVCNURFMjkwMDZERjwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PC9CbG9icz48TmV4dE1hcmtlciAvPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "d092bb8a00744621", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=%2F\u0026maxresults=6\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "573db1ff-801e-0043-4159-59fe7e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci88L1ByZWZpeD48TWF4UmVzdWx0cz42PC9NYXhSZXN1bHRzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxCbG9icz48QmxvYj48TmFtZT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPlR1ZSwgMDggRmViIDIwMjIgMjM6NTE6MTEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPlR1ZSwgMDggRmViIDIwMjIgMjM6NTE6MTEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ5RUI1REUyQTlDQ0JGPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYlByZWZpeD48TmFtZT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIxLzwvTmFtZT48L0Jsb2JQcmVmaXg+PEJsb2JQcmVmaXg+PE5hbWU+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMi88L05hbWU+PC9CbG9iUHJlZml4PjxCbG9iUHJlZml4PjxOYW1lPmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QtLzwvTmFtZT48L0Jsb2JQcmVmaXg+PEJsb2JQcmVmaXg+PE5hbWU+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdC88L05hbWU+PC9CbG9iUHJlZml4PjxCbG9iPjxOYW1lPmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3Rlc3RGaWxlMTwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5UdWUsIDA4IEZlYiAyMDIyIDIzOjUxOjExIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5UdWUsIDA4IEZlYiAyMDIyIDIzOjUxOjExIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhEOUVCNURFMjkwMDZERjwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PC9CbG9icz48TmV4dE1hcmtlciAvPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "a699936fe4fdfbf5", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=%2F\u0026maxresults=5\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "573db209-801e-0043-4b59-59fe7e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci88L1ByZWZpeD48TWF4UmVzdWx0cz41PC9NYXhSZXN1bHRzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxCbG9icz48QmxvYj48TmFtZT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPlR1ZSwgMDggRmViIDIwMjIgMjM6NTE6MTEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPlR1ZSwgMDggRmViIDIwMjIgMjM6NTE6MTEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ5RUI1REUyQTlDQ0JGPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYlByZWZpeD48TmFtZT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIxLzwvTmFtZT48L0Jsb2JQcmVmaXg+PEJsb2JQcmVmaXg+PE5hbWU+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMi88L05hbWU+PC9CbG9iUHJlZml4PjxCbG9iUHJlZml4PjxOYW1lPmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QtLzwvTmFtZT48L0Jsb2JQcmVmaXg+PEJsb2JQcmVmaXg+PE5hbWU+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdC88L05hbWU+PC9CbG9iUHJlZml4PjwvQmxvYnM+PE5leHRNYXJrZXI+MiExMjghTURBd01EVXhJV0pzYjJJdFptOXlMV1JwY25NdGQybDBhQzFqYUdGeWN5MWlaV1p2Y21VdFpHVnNhVzFwZEdWeUwzUmxjM1JHYVd4bE1TRXdNREF3TWpnaE9UazVPUzB4TWkwek1WUXlNem8xT1RvMU9TNDVPVGs1T1RrNVdpRS08L05leHRNYXJrZXI+PC9FbnVtZXJhdGlvblJlc3VsdHM+" } }, { "ID": "a47586c7663543df", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=%2F\u0026marker=2%21128%21MDAwMDUxIWJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3Rlc3RGaWxlMSEwMDAwMjghOTk5OS0xMi0zMVQyMzo1OTo1OS45OTk5OTk5WiE-\u0026maxresults=5\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "573db20f-801e-0043-5159-59fe7e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci88L1ByZWZpeD48TWFya2VyPjIhMTI4IU1EQXdNRFV4SVdKc2IySXRabTl5TFdScGNuTXRkMmwwYUMxamFHRnljeTFpWldadmNtVXRaR1ZzYVcxcGRHVnlMM1JsYzNSR2FXeGxNU0V3TURBd01qZ2hPVGs1T1MweE1pMHpNVlF5TXpvMU9UbzFPUzQ1T1RrNU9UazVXaUUtPC9NYXJrZXI+PE1heFJlc3VsdHM+NTwvTWF4UmVzdWx0cz48RGVsaW1pdGVyPi88L0RlbGltaXRlcj48QmxvYnM+PEJsb2I+PE5hbWU+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdGVzdEZpbGUxPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPlR1ZSwgMDggRmViIDIwMjIgMjM6NTE6MTEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPlR1ZSwgMDggRmViIDIwMjIgMjM6NTE6MTEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ5RUI1REUyOTAwNkRGPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48L0Jsb2JzPjxOZXh0TWFya2VyIC8+PC9FbnVtZXJhdGlvblJlc3VsdHM+" } }, { "ID": "49fefdaf7b109090", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=%2F\u0026maxresults=4\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "573db216-801e-0043-5859-59fe7e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci88L1ByZWZpeD48TWF4UmVzdWx0cz40PC9NYXhSZXN1bHRzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxCbG9icz48QmxvYj48TmFtZT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPlR1ZSwgMDggRmViIDIwMjIgMjM6NTE6MTEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPlR1ZSwgMDggRmViIDIwMjIgMjM6NTE6MTEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ5RUI1REUyQTlDQ0JGPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYlByZWZpeD48TmFtZT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIxLzwvTmFtZT48L0Jsb2JQcmVmaXg+PEJsb2JQcmVmaXg+PE5hbWU+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMi88L05hbWU+PC9CbG9iUHJlZml4PjxCbG9iUHJlZml4PjxOYW1lPmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QtLzwvTmFtZT48L0Jsb2JQcmVmaXg+PC9CbG9icz48TmV4dE1hcmtlcj4yITEyNCFNREF3TURRM0lXSnNiMkl0Wm05eUxXUnBjbk10ZDJsMGFDMWphR0Z5Y3kxaVpXWnZjbVV0WkdWc2FXMXBkR1Z5TDNRdmRDOTBJVEF3TURBeU9DRTVPVGs1TFRFeUxUTXhWREl6T2pVNU9qVTVMams1T1RrNU9UbGFJUS0tPC9OZXh0TWFya2VyPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "8f6c50104f418ba0", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=%2F\u0026marker=2%21124%21MDAwMDQ3IWJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QvdC90ITAwMDAyOCE5OTk5LTEyLTMxVDIzOjU5OjU5Ljk5OTk5OTlaIQ--\u0026maxresults=4\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "573db21f-801e-0043-6159-59fe7e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci88L1ByZWZpeD48TWFya2VyPjIhMTI0IU1EQXdNRFEzSVdKc2IySXRabTl5TFdScGNuTXRkMmwwYUMxamFHRnljeTFpWldadmNtVXRaR1ZzYVcxcGRHVnlMM1F2ZEM5MElUQXdNREF5T0NFNU9UazVMVEV5TFRNeFZESXpPalU1T2pVNUxqazVPVGs1T1RsYUlRLS08L01hcmtlcj48TWF4UmVzdWx0cz40PC9NYXhSZXN1bHRzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxCbG9icz48QmxvYlByZWZpeD48TmFtZT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90LzwvTmFtZT48L0Jsb2JQcmVmaXg+PEJsb2I+PE5hbWU+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdGVzdEZpbGUxPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPlR1ZSwgMDggRmViIDIwMjIgMjM6NTE6MTEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPlR1ZSwgMDggRmViIDIwMjIgMjM6NTE6MTEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ5RUI1REUyOTAwNkRGPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48L0Jsb2JzPjxOZXh0TWFya2VyIC8+PC9FbnVtZXJhdGlvblJlc3VsdHM+" } }, { "ID": "76b659999ddc706c", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=%2F\u0026maxresults=3\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "573db224-801e-0043-6659-59fe7e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci88L1ByZWZpeD48TWF4UmVzdWx0cz4zPC9NYXhSZXN1bHRzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxCbG9icz48QmxvYj48TmFtZT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPlR1ZSwgMDggRmViIDIwMjIgMjM6NTE6MTEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPlR1ZSwgMDggRmViIDIwMjIgMjM6NTE6MTEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ5RUI1REUyQTlDQ0JGPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYlByZWZpeD48TmFtZT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIxLzwvTmFtZT48L0Jsb2JQcmVmaXg+PEJsb2JQcmVmaXg+PE5hbWU+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMi88L05hbWU+PC9CbG9iUHJlZml4PjwvQmxvYnM+PE5leHRNYXJrZXI+MiExMjAhTURBd01EUTJJV0pzYjJJdFptOXlMV1JwY25NdGQybDBhQzFqYUdGeWN5MWlaV1p2Y21VdFpHVnNhVzFwZEdWeUwzUXRMM1FoTURBd01ESTRJVGs1T1RrdE1USXRNekZVTWpNNk5UazZOVGt1T1RrNU9UazVPVm9oPC9OZXh0TWFya2VyPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "92dc6fbe0d63fc53", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=%2F\u0026marker=2%21120%21MDAwMDQ2IWJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QtL3QhMDAwMDI4ITk5OTktMTItMzFUMjM6NTk6NTkuOTk5OTk5OVoh\u0026maxresults=3\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "573db22b-801e-0043-6d59-59fe7e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci88L1ByZWZpeD48TWFya2VyPjIhMTIwIU1EQXdNRFEySVdKc2IySXRabTl5TFdScGNuTXRkMmwwYUMxamFHRnljeTFpWldadmNtVXRaR1ZzYVcxcGRHVnlMM1F0TDNRaE1EQXdNREk0SVRrNU9Ua3RNVEl0TXpGVU1qTTZOVGs2TlRrdU9UazVPVGs1T1ZvaDwvTWFya2VyPjxNYXhSZXN1bHRzPjM8L01heFJlc3VsdHM+PERlbGltaXRlcj4vPC9EZWxpbWl0ZXI+PEJsb2JzPjxCbG9iUHJlZml4PjxOYW1lPmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QtLzwvTmFtZT48L0Jsb2JQcmVmaXg+PEJsb2JQcmVmaXg+PE5hbWU+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdC88L05hbWU+PC9CbG9iUHJlZml4PjxCbG9iPjxOYW1lPmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3Rlc3RGaWxlMTwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5UdWUsIDA4IEZlYiAyMDIyIDIzOjUxOjExIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5UdWUsIDA4IEZlYiAyMDIyIDIzOjUxOjExIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhEOUVCNURFMjkwMDZERjwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PC9CbG9icz48TmV4dE1hcmtlciAvPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "fa455440bfe94e25", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=%2F\u0026maxresults=2\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "573db233-801e-0043-7559-59fe7e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci88L1ByZWZpeD48TWF4UmVzdWx0cz4yPC9NYXhSZXN1bHRzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxCbG9icz48QmxvYj48TmFtZT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPlR1ZSwgMDggRmViIDIwMjIgMjM6NTE6MTEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPlR1ZSwgMDggRmViIDIwMjIgMjM6NTE6MTEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ5RUI1REUyQTlDQ0JGPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYlByZWZpeD48TmFtZT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIxLzwvTmFtZT48L0Jsb2JQcmVmaXg+PC9CbG9icz48TmV4dE1hcmtlcj4yITE0MCFNREF3TURZd0lXSnNiMkl0Wm05eUxXUnBjbk10ZDJsMGFDMWphR0Z5Y3kxaVpXWnZjbVV0WkdWc2FXMXBkR1Z5TDJScGNqSXZkR1Z6ZEVacGJHVXhaR2x5TWlFd01EQXdNamdoT1RrNU9TMHhNaTB6TVZReU16bzFPVG8xT1M0NU9UazVPVGs1V2lFLTwvTmV4dE1hcmtlcj48L0VudW1lcmF0aW9uUmVzdWx0cz4=" } }, { "ID": "1e232989bf24e00e", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=%2F\u0026marker=2%21140%21MDAwMDYwIWJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL2RpcjIvdGVzdEZpbGUxZGlyMiEwMDAwMjghOTk5OS0xMi0zMVQyMzo1OTo1OS45OTk5OTk5WiE-\u0026maxresults=2\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "573db239-801e-0043-7b59-59fe7e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci88L1ByZWZpeD48TWFya2VyPjIhMTQwIU1EQXdNRFl3SVdKc2IySXRabTl5TFdScGNuTXRkMmwwYUMxamFHRnljeTFpWldadmNtVXRaR1ZzYVcxcGRHVnlMMlJwY2pJdmRHVnpkRVpwYkdVeFpHbHlNaUV3TURBd01qZ2hPVGs1T1MweE1pMHpNVlF5TXpvMU9UbzFPUzQ1T1RrNU9UazVXaUUtPC9NYXJrZXI+PE1heFJlc3VsdHM+MjwvTWF4UmVzdWx0cz48RGVsaW1pdGVyPi88L0RlbGltaXRlcj48QmxvYnM+PEJsb2JQcmVmaXg+PE5hbWU+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMi88L05hbWU+PC9CbG9iUHJlZml4PjxCbG9iUHJlZml4PjxOYW1lPmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QtLzwvTmFtZT48L0Jsb2JQcmVmaXg+PC9CbG9icz48TmV4dE1hcmtlcj4yITEyNCFNREF3TURRM0lXSnNiMkl0Wm05eUxXUnBjbk10ZDJsMGFDMWphR0Z5Y3kxaVpXWnZjbVV0WkdWc2FXMXBkR1Z5TDNRdmRDOTBJVEF3TURBeU9DRTVPVGs1TFRFeUxUTXhWREl6T2pVNU9qVTVMams1T1RrNU9UbGFJUS0tPC9OZXh0TWFya2VyPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "85b66a06606cf32a", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=%2F\u0026marker=2%21124%21MDAwMDQ3IWJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QvdC90ITAwMDAyOCE5OTk5LTEyLTMxVDIzOjU5OjU5Ljk5OTk5OTlaIQ--\u0026maxresults=2\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "573db240-801e-0043-0159-59fe7e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci88L1ByZWZpeD48TWFya2VyPjIhMTI0IU1EQXdNRFEzSVdKc2IySXRabTl5TFdScGNuTXRkMmwwYUMxamFHRnljeTFpWldadmNtVXRaR1ZzYVcxcGRHVnlMM1F2ZEM5MElUQXdNREF5T0NFNU9UazVMVEV5TFRNeFZESXpPalU1T2pVNUxqazVPVGs1T1RsYUlRLS08L01hcmtlcj48TWF4UmVzdWx0cz4yPC9NYXhSZXN1bHRzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxCbG9icz48QmxvYlByZWZpeD48TmFtZT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90LzwvTmFtZT48L0Jsb2JQcmVmaXg+PEJsb2I+PE5hbWU+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdGVzdEZpbGUxPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPlR1ZSwgMDggRmViIDIwMjIgMjM6NTE6MTEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPlR1ZSwgMDggRmViIDIwMjIgMjM6NTE6MTEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ5RUI1REUyOTAwNkRGPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48L0Jsb2JzPjxOZXh0TWFya2VyIC8+PC9FbnVtZXJhdGlvblJlc3VsdHM+" } }, { "ID": "adf77f8fbb309f0b", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=%2F\u0026maxresults=1\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "573db243-801e-0043-0459-59fe7e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci88L1ByZWZpeD48TWF4UmVzdWx0cz4xPC9NYXhSZXN1bHRzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxCbG9icz48QmxvYj48TmFtZT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPlR1ZSwgMDggRmViIDIwMjIgMjM6NTE6MTEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPlR1ZSwgMDggRmViIDIwMjIgMjM6NTE6MTEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ5RUI1REUyQTlDQ0JGPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48L0Jsb2JzPjxOZXh0TWFya2VyPjIhMTQwIU1EQXdNRFl3SVdKc2IySXRabTl5TFdScGNuTXRkMmwwYUMxamFHRnljeTFpWldadmNtVXRaR1ZzYVcxcGRHVnlMMlJwY2pFdmRHVnpkRVpwYkdVeFpHbHlNU0V3TURBd01qZ2hPVGs1T1MweE1pMHpNVlF5TXpvMU9UbzFPUzQ1T1RrNU9UazVXaUUtPC9OZXh0TWFya2VyPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "babae1bbd2786a83", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=%2F\u0026marker=2%21140%21MDAwMDYwIWJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL2RpcjEvdGVzdEZpbGUxZGlyMSEwMDAwMjghOTk5OS0xMi0zMVQyMzo1OTo1OS45OTk5OTk5WiE-\u0026maxresults=1\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "573db245-801e-0043-0659-59fe7e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci88L1ByZWZpeD48TWFya2VyPjIhMTQwIU1EQXdNRFl3SVdKc2IySXRabTl5TFdScGNuTXRkMmwwYUMxamFHRnljeTFpWldadmNtVXRaR1ZzYVcxcGRHVnlMMlJwY2pFdmRHVnpkRVpwYkdVeFpHbHlNU0V3TURBd01qZ2hPVGs1T1MweE1pMHpNVlF5TXpvMU9UbzFPUzQ1T1RrNU9UazVXaUUtPC9NYXJrZXI+PE1heFJlc3VsdHM+MTwvTWF4UmVzdWx0cz48RGVsaW1pdGVyPi88L0RlbGltaXRlcj48QmxvYnM+PEJsb2JQcmVmaXg+PE5hbWU+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMS88L05hbWU+PC9CbG9iUHJlZml4PjwvQmxvYnM+PE5leHRNYXJrZXI+MiExNDAhTURBd01EWXdJV0pzYjJJdFptOXlMV1JwY25NdGQybDBhQzFqYUdGeWN5MWlaV1p2Y21VdFpHVnNhVzFwZEdWeUwyUnBjakl2ZEdWemRFWnBiR1V4WkdseU1pRXdNREF3TWpnaE9UazVPUzB4TWkwek1WUXlNem8xT1RvMU9TNDVPVGs1T1RrNVdpRS08L05leHRNYXJrZXI+PC9FbnVtZXJhdGlvblJlc3VsdHM+" } }, { "ID": "8ce1599d1635af39", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=%2F\u0026marker=2%21140%21MDAwMDYwIWJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL2RpcjIvdGVzdEZpbGUxZGlyMiEwMDAwMjghOTk5OS0xMi0zMVQyMzo1OTo1OS45OTk5OTk5WiE-\u0026maxresults=1\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "573db24c-801e-0043-0c59-59fe7e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci88L1ByZWZpeD48TWFya2VyPjIhMTQwIU1EQXdNRFl3SVdKc2IySXRabTl5TFdScGNuTXRkMmwwYUMxamFHRnljeTFpWldadmNtVXRaR1ZzYVcxcGRHVnlMMlJwY2pJdmRHVnpkRVpwYkdVeFpHbHlNaUV3TURBd01qZ2hPVGs1T1MweE1pMHpNVlF5TXpvMU9UbzFPUzQ1T1RrNU9UazVXaUUtPC9NYXJrZXI+PE1heFJlc3VsdHM+MTwvTWF4UmVzdWx0cz48RGVsaW1pdGVyPi88L0RlbGltaXRlcj48QmxvYnM+PEJsb2JQcmVmaXg+PE5hbWU+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMi88L05hbWU+PC9CbG9iUHJlZml4PjwvQmxvYnM+PE5leHRNYXJrZXI+MiExMjAhTURBd01EUTJJV0pzYjJJdFptOXlMV1JwY25NdGQybDBhQzFqYUdGeWN5MWlaV1p2Y21VdFpHVnNhVzFwZEdWeUwzUXRMM1FoTURBd01ESTRJVGs1T1RrdE1USXRNekZVTWpNNk5UazZOVGt1T1RrNU9UazVPVm9oPC9OZXh0TWFya2VyPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "6c94f3791976cd05", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=%2F\u0026marker=2%21120%21MDAwMDQ2IWJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QtL3QhMDAwMDI4ITk5OTktMTItMzFUMjM6NTk6NTkuOTk5OTk5OVoh\u0026maxresults=1\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "573db250-801e-0043-1059-59fe7e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci88L1ByZWZpeD48TWFya2VyPjIhMTIwIU1EQXdNRFEySVdKc2IySXRabTl5TFdScGNuTXRkMmwwYUMxamFHRnljeTFpWldadmNtVXRaR1ZzYVcxcGRHVnlMM1F0TDNRaE1EQXdNREk0SVRrNU9Ua3RNVEl0TXpGVU1qTTZOVGs2TlRrdU9UazVPVGs1T1ZvaDwvTWFya2VyPjxNYXhSZXN1bHRzPjE8L01heFJlc3VsdHM+PERlbGltaXRlcj4vPC9EZWxpbWl0ZXI+PEJsb2JzPjxCbG9iUHJlZml4PjxOYW1lPmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QtLzwvTmFtZT48L0Jsb2JQcmVmaXg+PC9CbG9icz48TmV4dE1hcmtlcj4yITEyNCFNREF3TURRM0lXSnNiMkl0Wm05eUxXUnBjbk10ZDJsMGFDMWphR0Z5Y3kxaVpXWnZjbVV0WkdWc2FXMXBkR1Z5TDNRdmRDOTBJVEF3TURBeU9DRTVPVGs1TFRFeUxUTXhWREl6T2pVNU9qVTVMams1T1RrNU9UbGFJUS0tPC9OZXh0TWFya2VyPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "c7727fbf1ee76c46", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=%2F\u0026marker=2%21124%21MDAwMDQ3IWJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QvdC90ITAwMDAyOCE5OTk5LTEyLTMxVDIzOjU5OjU5Ljk5OTk5OTlaIQ--\u0026maxresults=1\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "573db255-801e-0043-1559-59fe7e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci88L1ByZWZpeD48TWFya2VyPjIhMTI0IU1EQXdNRFEzSVdKc2IySXRabTl5TFdScGNuTXRkMmwwYUMxamFHRnljeTFpWldadmNtVXRaR1ZzYVcxcGRHVnlMM1F2ZEM5MElUQXdNREF5T0NFNU9UazVMVEV5TFRNeFZESXpPalU1T2pVNUxqazVPVGs1T1RsYUlRLS08L01hcmtlcj48TWF4UmVzdWx0cz4xPC9NYXhSZXN1bHRzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxCbG9icz48QmxvYlByZWZpeD48TmFtZT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90LzwvTmFtZT48L0Jsb2JQcmVmaXg+PC9CbG9icz48TmV4dE1hcmtlcj4yITEyOCFNREF3TURVeElXSnNiMkl0Wm05eUxXUnBjbk10ZDJsMGFDMWphR0Z5Y3kxaVpXWnZjbVV0WkdWc2FXMXBkR1Z5TDNSbGMzUkdhV3hsTVNFd01EQXdNamdoT1RrNU9TMHhNaTB6TVZReU16bzFPVG8xT1M0NU9UazVPVGs1V2lFLTwvTmV4dE1hcmtlcj48L0VudW1lcmF0aW9uUmVzdWx0cz4=" } }, { "ID": "5279852eaab7c436", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=%2F\u0026marker=2%21128%21MDAwMDUxIWJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3Rlc3RGaWxlMSEwMDAwMjghOTk5OS0xMi0zMVQyMzo1OTo1OS45OTk5OTk5WiE-\u0026maxresults=1\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "573db25d-801e-0043-1d59-59fe7e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci88L1ByZWZpeD48TWFya2VyPjIhMTI4IU1EQXdNRFV4SVdKc2IySXRabTl5TFdScGNuTXRkMmwwYUMxamFHRnljeTFpWldadmNtVXRaR1ZzYVcxcGRHVnlMM1JsYzNSR2FXeGxNU0V3TURBd01qZ2hPVGs1T1MweE1pMHpNVlF5TXpvMU9UbzFPUzQ1T1RrNU9UazVXaUUtPC9NYXJrZXI+PE1heFJlc3VsdHM+MTwvTWF4UmVzdWx0cz48RGVsaW1pdGVyPi88L0RlbGltaXRlcj48QmxvYnM+PEJsb2I+PE5hbWU+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdGVzdEZpbGUxPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPlR1ZSwgMDggRmViIDIwMjIgMjM6NTE6MTEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPlR1ZSwgMDggRmViIDIwMjIgMjM6NTE6MTEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ5RUI1REUyOTAwNkRGPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48L0Jsb2JzPjxOZXh0TWFya2VyIC8+PC9FbnVtZXJhdGlvblJlc3VsdHM+" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestIfNotExist.replay ================================================ { "Initial": "AQAAAA7go60lHj5a+AA8", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "8f999f472d82297e", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-if-not-exist", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "11" ], "If-None-Match": [ "*" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Type": [ "text" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "dXAgYW5kIGRvd24=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "G3VTPtWoaf9vOuAzbQwzIA==" ], "Date": [ "Mon, 10 Nov 2025 09:53:54 GMT" ], "Etag": [ "\"0x8DE203F0F3E178C\"" ], "Last-Modified": [ "Mon, 10 Nov 2025 09:53:54 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "wOkxZJKwY/U=" ], "X-Ms-Request-Id": [ "6ca9aa03-101e-0055-7027-5298a3000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "dc41a4555ab17ee0", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-if-not-exist", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "11" ], "If-None-Match": [ "*" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Type": [ "text" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "dXAgYW5kIGRvd24=" ] }, "Response": { "StatusCode": 409, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "220" ], "Content-Type": [ "application/xml" ], "Date": [ "Mon, 10 Nov 2025 09:53:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Error-Code": [ "BlobAlreadyExists" ], "X-Ms-Request-Id": [ "6ca9b627-101e-0055-3a27-5298a3000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RXJyb3I+PENvZGU+QmxvYkFscmVhZHlFeGlzdHM8L0NvZGU+PE1lc3NhZ2U+VGhlIHNwZWNpZmllZCBibG9iIGFscmVhZHkgZXhpc3RzLgpSZXF1ZXN0SWQ6NmNhOWI2MjctMTAxZS0wMDU1LTNhMjctNTI5OGEzMDAwMDAwClRpbWU6MjAyNS0xMS0xMFQwOTo1Mzo1OC4xNDg5NzM0WjwvTWVzc2FnZT48L0Vycm9yPg==" } }, { "ID": "2975553d1d753272", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-if-not-exist", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Mon, 10 Nov 2025 09:54:02 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "false" ], "X-Ms-Request-Id": [ "6ca9c1c3-101e-0055-7127-5298a3000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestKeys/ascii-1.replay ================================================ { "Initial": "AQAAAA7dviK+Le0BggAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "61ba13c2677736b3", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "5" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E8BD2746\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "V0JSBnCFdzM=" ], "X-Ms-Request-Id": [ "6c61dd95-601e-0074-6829-982cd2000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "ef672aa6a71993e9", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E8BD2746\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "6c61dd9d-601e-0074-6f29-982cd2000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "acc854af83c13bae", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E8BD2746\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "6c61dda6-601e-0074-7629-982cd2000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "2a941d2d12a1efb8", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__?sp=r\u0026sr=b\u0026sv=2023-11-03", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E8BD2746\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "6c61ddad-601e-0074-7d29-982cd2000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "db6885931c2c7be7", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E8C9F6A8\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Copy-Id": [ "7f4ec50b-d0da-4e2a-b9b8-a397a40d051a" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Request-Id": [ "6c61ddb4-601e-0074-0429-982cd2000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "7743af85aa1de79b", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E8C9F6A8\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Copy-Completion-Time": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "X-Ms-Copy-Id": [ "7f4ec50b-d0da-4e2a-b9b8-a397a40d051a" ], "X-Ms-Copy-Progress": [ "5/5" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "6c61ddbb-601e-0074-0b29-982cd2000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "7f0583082beeb762", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "6c61ddc2-601e-0074-1229-982cd2000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "8d4de367bfdb19ed", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "6c61ddce-601e-0074-1e29-982cd2000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestKeys/ascii-2.replay ================================================ { "Initial": "AQAAAA7dviK/AFHY1wAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "2b4f37be6f1940b6", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "5" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E8E124D3\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "V0JSBnCFdzM=" ], "X-Ms-Request-Id": [ "740677e3-401e-0063-6d29-9885d9000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "d10207c381b3880a", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E8E124D3\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "740677e8-401e-0063-7029-9885d9000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "d0faf17042ed7c69", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E8E124D3\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "740677f0-401e-0063-7629-9885d9000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "02e95e17066eb832", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__?sp=r\u0026sr=b\u0026sv=2023-11-03", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E8E124D3\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "740677f2-401e-0063-7829-9885d9000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "940466b3f8c6f7c4", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E8EDA622\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Copy-Id": [ "67074147-f6b1-4cad-9577-e1439e7e9fec" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Request-Id": [ "740677f5-401e-0063-7b29-9885d9000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "2fb7eca5ca842c5e", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E8EDA622\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Copy-Completion-Time": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "X-Ms-Copy-Id": [ "67074147-f6b1-4cad-9577-e1439e7e9fec" ], "X-Ms-Copy-Progress": [ "5/5" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "740677f6-401e-0063-7c29-9885d9000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "4bcbab2e82433776", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "740677f9-401e-0063-7f29-9885d9000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "fea9587df001c642", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "740677ff-401e-0063-0429-9885d9000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestKeys/ascii-3.replay ================================================ { "Initial": "AQAAAA7dviK/Deb0YQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "52de825322dae101", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%20%21__0x22____0x23__$__0x25__\u0026%27%28%29%2A+%2C-.__0x2f__", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "5" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E902FFCB\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "V0JSBnCFdzM=" ], "X-Ms-Request-Id": [ "d6807b13-f01e-0082-1729-98599c000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "8fbbd75ff8db2119", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%20%21__0x22____0x23__$__0x25__\u0026%27%28%29%2A+%2C-.__0x2f__", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E902FFCB\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "d6807b17-f01e-0082-1a29-98599c000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "6001cb81b48014cc", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%20%21__0x22____0x23__$__0x25__\u0026%27%28%29%2A+%2C-.__0x2f__", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E902FFCB\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "d6807b1e-f01e-0082-2029-98599c000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "f3411d7c1610a71e", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%20%21__0x22____0x23__$__0x25__\u0026%27%28%29%2A+%2C-.__0x2f__?sp=r\u0026sr=b\u0026sv=2023-11-03", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E902FFCB\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "d6807b21-f01e-0082-2329-98599c000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "bcc7355a4bd9a27d", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%20%21__0x22____0x23__$__0x25__\u0026%27%28%29%2A+%2C-.%2F-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%20%21__0x22____0x23__$__0x25__\u0026%27%28%29%2A+%2C-.__0x2f__" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E90E96E0\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Copy-Id": [ "5e829744-6791-4503-ba41-5aa125db0c8e" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Request-Id": [ "d6807b24-f01e-0082-2529-98599c000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "7b51c167feb3e280", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%20%21__0x22____0x23__$__0x25__\u0026%27%28%29%2A+%2C-.%2F-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E90E96E0\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Copy-Completion-Time": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "X-Ms-Copy-Id": [ "5e829744-6791-4503-ba41-5aa125db0c8e" ], "X-Ms-Copy-Progress": [ "5/5" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%20%21__0x22____0x23__$__0x25__\u0026%27%28%29%2A+%2C-.__0x2f__" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "d6807b2c-f01e-0082-2d29-98599c000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "85939eda7410fc68", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%20%21__0x22____0x23__$__0x25__\u0026%27%28%29%2A+%2C-.%2F-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "d6807b2f-f01e-0082-3029-98599c000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "de565421c9efe4fb", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%20%21__0x22____0x23__$__0x25__\u0026%27%28%29%2A+%2C-.__0x2f__", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "d6807b31-f01e-0082-3229-98599c000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestKeys/ascii-4.replay ================================================ { "Initial": "AQAAAA7dviK9AyqergAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "1a5c3464d714cc70", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys:%3B%3C=%3E__0x3f__", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "5" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Date": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Etag": [ "\"0x8DC6640E7B700B2\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "V0JSBnCFdzM=" ], "X-Ms-Request-Id": [ "ba5ef0cd-b01e-0005-5b29-98caf9000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "5d39cdd9574a9e80", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys:%3B%3C=%3E__0x3f__", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Etag": [ "\"0x8DC6640E7B700B2\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "ba5ef0d1-b01e-0005-5e29-98caf9000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "78ca74066af6dd20", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys:%3B%3C=%3E__0x3f__", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Etag": [ "\"0x8DC6640E7B700B2\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "ba5ef0d6-b01e-0005-6229-98caf9000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "3b9c3b4dc140b394", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys:%3B%3C=%3E__0x3f__?sp=r\u0026sr=b\u0026sv=2023-11-03", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Etag": [ "\"0x8DC6640E7B700B2\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "ba5ef0d8-b01e-0005-6429-98caf9000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "dafb250106d39988", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys:%3B%3C=%3E__0x3f__-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys:%3B%3C=%3E__0x3f__" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Etag": [ "\"0x8DC6640E7C2E5E4\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Copy-Id": [ "3f832248-e13f-416c-8109-f6c0c8c582ab" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Request-Id": [ "ba5ef0df-b01e-0005-6b29-98caf9000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "bd86008479a452a0", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys:%3B%3C=%3E__0x3f__-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Etag": [ "\"0x8DC6640E7C2E5E4\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Copy-Completion-Time": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "X-Ms-Copy-Id": [ "3f832248-e13f-416c-8109-f6c0c8c582ab" ], "X-Ms-Copy-Progress": [ "5/5" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys:%3B%3C=%3E__0x3f__" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "ba5ef0e5-b01e-0005-7129-98caf9000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "e085ce9795d54f72", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys:%3B%3C=%3E__0x3f__-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "ba5ef0e9-b01e-0005-7529-98caf9000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "a3b32274b10d90f2", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys:%3B%3C=%3E__0x3f__", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "ba5ef0ee-b01e-0005-7a29-98caf9000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestKeys/ascii-5.replay ================================================ { "Initial": "AQAAAA7dviK7N03TdwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "01a9919ee9741fc4", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys@", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "5" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Date": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "Etag": [ "\"0x8DC6640E70B9730\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "V0JSBnCFdzM=" ], "X-Ms-Request-Id": [ "0f79a716-f01e-0004-3e29-989525000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "f6df458c8d4fbd04", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys@", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "Etag": [ "\"0x8DC6640E70B9730\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "0f79a720-f01e-0004-4529-989525000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "4a96b8215b43f286", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys@", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "Etag": [ "\"0x8DC6640E70B9730\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "0f79a72a-f01e-0004-4d29-989525000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "c30d2ad65f428153", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys@?sp=r\u0026sr=b\u0026sv=2023-11-03", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "Etag": [ "\"0x8DC6640E70B9730\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "0f79a734-f01e-0004-5729-989525000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "8156d280ab351949", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys@-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys@" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "Etag": [ "\"0x8DC6640E71977EA\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Copy-Id": [ "56237f37-e9f3-4184-b86f-ec6b498d0268" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Request-Id": [ "0f79a73e-f01e-0004-6029-989525000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "036084c3f67a5604", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys@-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Etag": [ "\"0x8DC6640E71977EA\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Copy-Completion-Time": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "X-Ms-Copy-Id": [ "56237f37-e9f3-4184-b86f-ec6b498d0268" ], "X-Ms-Copy-Progress": [ "5/5" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys@" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "0f79a742-f01e-0004-6429-989525000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "4ea336b86084db14", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys@-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "0f79a744-f01e-0004-6629-989525000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "8337c1841ba8e984", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys@", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "0f79a74f-f01e-0004-6f29-989525000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestKeys/ascii-6.replay ================================================ { "Initial": "AQAAAA7dviK8ChDYvAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "685c13bd8e74b4e9", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%5B__0x5c__%5D%5E_", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "5" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Date": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "Etag": [ "\"0x8DC6640E72FBBCA\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "V0JSBnCFdzM=" ], "X-Ms-Request-Id": [ "6c432ce8-d01e-0071-6a29-98fe09000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "33a28e8eb03d4d1c", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%5B__0x5c__%5D%5E_", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "Etag": [ "\"0x8DC6640E72FBBCA\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "6c432cf3-d01e-0071-7129-98fe09000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "2fbc2e0b7ca6dbbc", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%5B__0x5c__%5D%5E_", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "Etag": [ "\"0x8DC6640E72FBBCA\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "6c432cf7-d01e-0071-7429-98fe09000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "c0e3bfabd2b3a9bf", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%5B__0x5c__%5D%5E_?sp=r\u0026sr=b\u0026sv=2023-11-03", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "Etag": [ "\"0x8DC6640E72FBBCA\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "6c432cfa-d01e-0071-7729-98fe09000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "c1b2e5fb4aaf8feb", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%5B__0x5c__%5D%5E_-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%5B__0x5c__%5D%5E_" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "Etag": [ "\"0x8DC6640E73C6423\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Copy-Id": [ "28b8d42c-ff7e-49ce-9dd8-eb0bc99d21e0" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Request-Id": [ "6c432cfd-d01e-0071-7a29-98fe09000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "4aaad6e1d721d0ad", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%5B__0x5c__%5D%5E_-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "Etag": [ "\"0x8DC6640E73C6423\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Copy-Completion-Time": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "X-Ms-Copy-Id": [ "28b8d42c-ff7e-49ce-9dd8-eb0bc99d21e0" ], "X-Ms-Copy-Progress": [ "5/5" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%5B__0x5c__%5D%5E_" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "6c432d02-d01e-0071-7f29-98fe09000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "4e08f77f3bf5a763", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%5B__0x5c__%5D%5E_-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "6c432d05-d01e-0071-0229-98fe09000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "34a29b8dec7c1cb1", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%5B__0x5c__%5D%5E_", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "6c432d06-d01e-0071-0329-98fe09000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestKeys/ascii-7.replay ================================================ { "Initial": "AQAAAA7dviK/GnzE5wAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "afdaa3570249e3d9", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%60", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "5" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E923A282\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "V0JSBnCFdzM=" ], "X-Ms-Request-Id": [ "9c760ce9-601e-0016-2429-98eef5000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "ae4fcaedab32d480", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%60", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E923A282\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "9c760cf8-601e-0016-3129-98eef5000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "9aee9a0a8c7d964e", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%60", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E923A282\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "9c760d02-601e-0016-3929-98eef5000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "2e8a45dd4b660350", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%60?sp=r\u0026sr=b\u0026sv=2023-11-03", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E923A282\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "9c760d09-601e-0016-4029-98eef5000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "12714614d8bd260a", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%60-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%60" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E92FFCBE\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Copy-Id": [ "8ed18886-1a28-459b-bc42-2e87622f5a71" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Request-Id": [ "9c760d0f-601e-0016-4629-98eef5000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "18bbb7e9557dbeca", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%60-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E92FFCBE\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Copy-Completion-Time": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "X-Ms-Copy-Id": [ "8ed18886-1a28-459b-bc42-2e87622f5a71" ], "X-Ms-Copy-Progress": [ "5/5" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%60" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:35 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "9c760d15-601e-0016-4c29-98eef5000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "af37c679f2becda8", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%60-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "9c760d1c-601e-0016-5329-98eef5000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "1f01b986b86128b0", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%60", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "9c760d24-601e-0016-5929-98eef5000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestKeys/ascii-8.replay ================================================ { "Initial": "AQAAAA7dviK+E9kiZAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "404163511f6d897e", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%7B%7C%7D~__0x7f__", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "5" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E8792337\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "V0JSBnCFdzM=" ], "X-Ms-Request-Id": [ "2ca324c6-b01e-0015-0f29-980f91000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "afa37dd93a4164ae", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%7B%7C%7D~__0x7f__", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E8792337\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "2ca324c9-b01e-0015-1129-980f91000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "e6d6f03f05bc503a", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%7B%7C%7D~__0x7f__", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E8792337\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "2ca324cd-b01e-0015-1429-980f91000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "c98b25f7cad42d4e", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%7B%7C%7D~__0x7f__?sp=r\u0026sr=b\u0026sv=2023-11-03", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E8792337\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "2ca324ce-b01e-0015-1529-980f91000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "936dfbda8f35faee", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%7B%7C%7D~__0x7f__-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%7B%7C%7D~__0x7f__" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E884E156\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Copy-Id": [ "f0b039da-3ed1-4fea-b590-a6e87b9513ee" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Request-Id": [ "2ca324d0-b01e-0015-1729-980f91000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "08ef887fe3c92045", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%7B%7C%7D~__0x7f__-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E884E156\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Copy-Completion-Time": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "X-Ms-Copy-Id": [ "f0b039da-3ed1-4fea-b590-a6e87b9513ee" ], "X-Ms-Copy-Progress": [ "5/5" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%7B%7C%7D~__0x7f__" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "2ca324d9-b01e-0015-1f29-980f91000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "1e665070e1f6d9f4", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%7B%7C%7D~__0x7f__-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "2ca324e4-b01e-0015-2929-980f91000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "57f75b4966a18237", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%7B%7C%7D~__0x7f__", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "2ca324ea-b01e-0015-2d29-980f91000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestKeys/backslashes.replay ================================================ { "Initial": "AQAAAA7dviK9M7fq/gAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "41a16099906d40bc", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo__0x5c__bar__0x5c__baz", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "5" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Date": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Etag": [ "\"0x8DC6640E83371B4\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "V0JSBnCFdzM=" ], "X-Ms-Request-Id": [ "bbb6b2c6-201e-005a-2729-987ec5000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "3523502640c915e5", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo__0x5c__bar__0x5c__baz", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Etag": [ "\"0x8DC6640E83371B4\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "bbb6b2d1-201e-005a-3129-987ec5000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "667ccf2d21dcced5", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo__0x5c__bar__0x5c__baz", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Etag": [ "\"0x8DC6640E83371B4\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "bbb6b2df-201e-005a-3d29-987ec5000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "5c1d693f3a2b1a08", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo__0x5c__bar__0x5c__baz?sp=r\u0026sr=b\u0026sv=2023-11-03", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Etag": [ "\"0x8DC6640E83371B4\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "bbb6b2ef-201e-005a-4b29-987ec5000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "fe074b6727e3a613", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo__0x5c__bar__0x5c__baz-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo__0x5c__bar__0x5c__baz" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Etag": [ "\"0x8DC6640E8408F33\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Copy-Id": [ "daff5004-b053-46a9-aabe-f081b354c083" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Request-Id": [ "bbb6b2f2-201e-005a-4e29-987ec5000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "32d04d999ccd9891", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo__0x5c__bar__0x5c__baz-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Etag": [ "\"0x8DC6640E8408F33\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Copy-Completion-Time": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "X-Ms-Copy-Id": [ "daff5004-b053-46a9-aabe-f081b354c083" ], "X-Ms-Copy-Progress": [ "5/5" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo__0x5c__bar__0x5c__baz" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "bbb6b2fc-201e-005a-5829-987ec5000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "96622a19a902ea21", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo__0x5c__bar__0x5c__baz-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "bbb6b309-201e-005a-6329-987ec5000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "0b6870d0e241479e", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo__0x5c__bar__0x5c__baz", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "bbb6b318-201e-005a-7129-987ec5000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestKeys/dotdotbackslash.replay ================================================ { "Initial": "AQAAAA7dviK7KFi4+gAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "391b6b8c79543337", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys..__0x5c__foo__0x5c__..__0x5c__bar__0x5c__..__0x5c__..__0x5c__baz..__0x5c__", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "5" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Date": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "Etag": [ "\"0x8DC6640E6E835E0\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "V0JSBnCFdzM=" ], "X-Ms-Request-Id": [ "9e227b9f-b01e-0077-5a29-98cdb6000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "e64f167b4d8eb047", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys..__0x5c__foo__0x5c__..__0x5c__bar__0x5c__..__0x5c__..__0x5c__baz..__0x5c__", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "Etag": [ "\"0x8DC6640E6E835E0\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "9e227baa-b01e-0077-6429-98cdb6000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "46f25e32cdaf7b22", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys..__0x5c__foo__0x5c__..__0x5c__bar__0x5c__..__0x5c__..__0x5c__baz..__0x5c__", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "Etag": [ "\"0x8DC6640E6E835E0\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "9e227bb9-b01e-0077-7229-98cdb6000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "61f7038b9de1e396", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys..__0x5c__foo__0x5c__..__0x5c__bar__0x5c__..__0x5c__..__0x5c__baz..__0x5c__?sp=r\u0026sr=b\u0026sv=2023-11-03", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "Etag": [ "\"0x8DC6640E6E835E0\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "9e227bc0-b01e-0077-7829-98cdb6000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "88dc3bc81192a083", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys..__0x5c__foo__0x5c__..__0x5c__bar__0x5c__..__0x5c__..__0x5c__baz..__0x5c__-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys..__0x5c__foo__0x5c__..__0x5c__bar__0x5c__..__0x5c__..__0x5c__baz..__0x5c__" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "Etag": [ "\"0x8DC6640E6F50537\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Copy-Id": [ "881a063d-e8ca-442c-a49d-5dd37ee9b1c3" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Request-Id": [ "9e227bca-b01e-0077-0229-98cdb6000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "8abd2362e663bbed", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys..__0x5c__foo__0x5c__..__0x5c__bar__0x5c__..__0x5c__..__0x5c__baz..__0x5c__-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "Etag": [ "\"0x8DC6640E6F50537\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Copy-Completion-Time": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "X-Ms-Copy-Id": [ "881a063d-e8ca-442c-a49d-5dd37ee9b1c3" ], "X-Ms-Copy-Progress": [ "5/5" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys..__0x5c__foo__0x5c__..__0x5c__bar__0x5c__..__0x5c__..__0x5c__baz..__0x5c__" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "9e227bd7-b01e-0077-0f29-98cdb6000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "ffdbf0cfdf18c62e", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys..__0x5c__foo__0x5c__..__0x5c__bar__0x5c__..__0x5c__..__0x5c__baz..__0x5c__-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "9e227be2-b01e-0077-1a29-98cdb6000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "8b1fcd16445757b0", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys..__0x5c__foo__0x5c__..__0x5c__bar__0x5c__..__0x5c__..__0x5c__baz..__0x5c__", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "9e227beb-b01e-0077-2329-98cdb6000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestKeys/dotdotslash.replay ================================================ { "Initial": "AQAAAA7dviK9Jqg6XQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "262934c579e79f9b", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys..__0x2f__foo%2F..__0x2f__bar%2F..__0x2f__..__0x2f__baz..__0x2f__", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "5" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Etag": [ "\"0x8DC6640E81148B0\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "V0JSBnCFdzM=" ], "X-Ms-Request-Id": [ "4a04ddc1-901e-0070-5429-98a1d5000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "9d96f1d4452d9f36", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys..__0x2f__foo%2F..__0x2f__bar%2F..__0x2f__..__0x2f__baz..__0x2f__", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Etag": [ "\"0x8DC6640E81148B0\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "4a04ddc4-901e-0070-5629-98a1d5000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "16809e2554eb4b6b", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys..__0x2f__foo%2F..__0x2f__bar%2F..__0x2f__..__0x2f__baz..__0x2f__", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Etag": [ "\"0x8DC6640E81148B0\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "4a04ddc7-901e-0070-5829-98a1d5000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "eff28e735e4aa3be", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys..__0x2f__foo%2F..__0x2f__bar%2F..__0x2f__..__0x2f__baz..__0x2f__?sp=r\u0026sr=b\u0026sv=2023-11-03", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Etag": [ "\"0x8DC6640E81148B0\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "4a04ddc8-901e-0070-5929-98a1d5000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "5fd0f7f52706bb36", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys..__0x2f__foo%2F..__0x2f__bar%2F..__0x2f__..__0x2f__baz..__0x2f__-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys..__0x2f__foo%2F..__0x2f__bar%2F..__0x2f__..__0x2f__baz..__0x2f__" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Etag": [ "\"0x8DC6640E81DF10C\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Copy-Id": [ "4362fcc1-2cf0-47c6-98bd-a978ccdcf1e2" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Request-Id": [ "4a04ddca-901e-0070-5b29-98a1d5000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "2e87c8babfd62fa8", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys..__0x2f__foo%2F..__0x2f__bar%2F..__0x2f__..__0x2f__baz..__0x2f__-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Etag": [ "\"0x8DC6640E81DF10C\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Copy-Completion-Time": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "X-Ms-Copy-Id": [ "4362fcc1-2cf0-47c6-98bd-a978ccdcf1e2" ], "X-Ms-Copy-Progress": [ "5/5" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys..__0x2f__foo%2F..__0x2f__bar%2F..__0x2f__..__0x2f__baz..__0x2f__" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "4a04ddce-901e-0070-5f29-98a1d5000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "5497dae89a50c659", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys..__0x2f__foo%2F..__0x2f__bar%2F..__0x2f__..__0x2f__baz..__0x2f__-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "4a04ddd1-901e-0070-6129-98a1d5000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "6d8241de6ce037fa", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys..__0x2f__foo%2F..__0x2f__bar%2F..__0x2f__..__0x2f__baz..__0x2f__", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "4a04ddd3-901e-0070-6329-98a1d5000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestKeys/fwdslashes.replay ================================================ { "Initial": "AQAAAA7dviK9EGi/5AAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "6935a675545a0f4e", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo%2Fbar%2Fbaz", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "5" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Etag": [ "\"0x8DC6640E7D8B49E\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "V0JSBnCFdzM=" ], "X-Ms-Request-Id": [ "ec0fca3e-301e-0024-4d29-98ee82000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "7bc62ad882825ccf", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo%2Fbar%2Fbaz", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Etag": [ "\"0x8DC6640E7D8B49E\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "ec0fca4a-301e-0024-5729-98ee82000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "43bdbe9c2fb5be82", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo%2Fbar%2Fbaz", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Etag": [ "\"0x8DC6640E7D8B49E\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "ec0fca53-301e-0024-5d29-98ee82000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "cf94e1549813710c", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo%2Fbar%2Fbaz?sp=r\u0026sr=b\u0026sv=2023-11-03", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Etag": [ "\"0x8DC6640E7D8B49E\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "ec0fca59-301e-0024-6329-98ee82000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "a8c0cda285785fbc", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo%2Fbar%2Fbaz-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo%2Fbar%2Fbaz" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Etag": [ "\"0x8DC6640E7E50EEF\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Copy-Id": [ "877e9715-266a-423e-95f1-0bc9f36ac26e" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Request-Id": [ "ec0fca60-301e-0024-6a29-98ee82000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "f555e67682957b60", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo%2Fbar%2Fbaz-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Etag": [ "\"0x8DC6640E7E50EEF\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Copy-Completion-Time": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "X-Ms-Copy-Id": [ "877e9715-266a-423e-95f1-0bc9f36ac26e" ], "X-Ms-Copy-Progress": [ "5/5" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo%2Fbar%2Fbaz" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "ec0fca68-301e-0024-7129-98ee82000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "628c36562a489e0e", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo%2Fbar%2Fbaz-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "ec0fca6d-301e-0024-7629-98ee82000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "ece2b87ee3184c74", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo%2Fbar%2Fbaz", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "ec0fca75-301e-0024-7e29-98ee82000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestKeys/non-UTF8_fails.replay ================================================ { "Initial": "AQAAAA7dviK7HVicvwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": null } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestKeys/quote.replay ================================================ { "Initial": "AQAAAA7dviK8JH3r7QAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "ec53a75d9cc0b744", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo__0x22__bar__0x22__baz", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "5" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Etag": [ "\"0x8DC6640E7734AC4\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "V0JSBnCFdzM=" ], "X-Ms-Request-Id": [ "9760ce18-701e-001a-6129-9879fd000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "4c0458e9d4a85d71", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo__0x22__bar__0x22__baz", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Etag": [ "\"0x8DC6640E7734AC4\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "9760ce25-701e-001a-6d29-9879fd000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "b762090197b20d99", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo__0x22__bar__0x22__baz", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Etag": [ "\"0x8DC6640E7734AC4\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "9760ce2c-701e-001a-7329-9879fd000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "a415a52f06d8e8a2", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo__0x22__bar__0x22__baz?sp=r\u0026sr=b\u0026sv=2023-11-03", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Etag": [ "\"0x8DC6640E7734AC4\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "9760ce34-701e-001a-7a29-9879fd000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "55e3b42c23059d46", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo__0x22__bar__0x22__baz-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo__0x22__bar__0x22__baz" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Etag": [ "\"0x8DC6640E77F7DF3\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Copy-Id": [ "7f12b301-b32d-4b4c-a3a6-b79501b24192" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Request-Id": [ "9760ce36-701e-001a-7c29-9879fd000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "42568ade31bdfc63", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo__0x22__bar__0x22__baz-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Etag": [ "\"0x8DC6640E77F7DF3\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Copy-Completion-Time": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "X-Ms-Copy-Id": [ "7f12b301-b32d-4b4c-a3a6-b79501b24192" ], "X-Ms-Copy-Progress": [ "5/5" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo__0x22__bar__0x22__baz" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "9760ce39-701e-001a-7f29-9879fd000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "53ee6f2d57f5e93c", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo__0x22__bar__0x22__baz-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "9760ce3e-701e-001a-0329-9879fd000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "6077716e9b40a730", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo__0x22__bar__0x22__baz", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "9760ce3f-701e-001a-0429-9879fd000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestKeys/repeatedbackslashes.replay ================================================ { "Initial": "AQAAAA7dviK8F1g/5QAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "0a55a460b7dbc0e7", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys..__0x5c__foo__0x5c____0x5c__bar__0x5c____0x5c____0x5c__baz", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "5" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Date": [ "Fri, 26 Apr 2024 22:33:31 GMT" ], "Etag": [ "\"0x8DC6640E75196D1\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "V0JSBnCFdzM=" ], "X-Ms-Request-Id": [ "6ddbd9ea-101e-0033-7d29-984789000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "4240b64f338790fc", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys..__0x5c__foo__0x5c____0x5c__bar__0x5c____0x5c____0x5c__baz", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Etag": [ "\"0x8DC6640E75196D1\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "6ddbd9f7-101e-0033-0929-984789000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "5900bdd0b16d716c", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys..__0x5c__foo__0x5c____0x5c__bar__0x5c____0x5c____0x5c__baz", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Etag": [ "\"0x8DC6640E75196D1\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "6ddbda09-101e-0033-1929-984789000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "7eb50a161cc45db0", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys..__0x5c__foo__0x5c____0x5c__bar__0x5c____0x5c____0x5c__baz?sp=r\u0026sr=b\u0026sv=2023-11-03", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Etag": [ "\"0x8DC6640E75196D1\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "6ddbda16-101e-0033-2529-984789000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "724b079ed9bf6bf0", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys..__0x5c__foo__0x5c____0x5c__bar__0x5c____0x5c____0x5c__baz-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys..__0x5c__foo__0x5c____0x5c__bar__0x5c____0x5c____0x5c__baz" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Etag": [ "\"0x8DC6640E75DCA01\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Copy-Id": [ "3a9ddc1f-4663-4b87-ac6b-ef82d13461d2" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Request-Id": [ "6ddbda21-101e-0033-2f29-984789000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "f0d38aa4f6f99940", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys..__0x5c__foo__0x5c____0x5c__bar__0x5c____0x5c____0x5c__baz-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Etag": [ "\"0x8DC6640E75DCA01\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Copy-Completion-Time": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "X-Ms-Copy-Id": [ "3a9ddc1f-4663-4b87-ac6b-ef82d13461d2" ], "X-Ms-Copy-Progress": [ "5/5" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys..__0x5c__foo__0x5c____0x5c__bar__0x5c____0x5c____0x5c__baz" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "6ddbda2b-101e-0033-3929-984789000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "ccd71be54801833f", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys..__0x5c__foo__0x5c____0x5c__bar__0x5c____0x5c____0x5c__baz-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "6ddbda35-101e-0033-4229-984789000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "361e1173752ec439", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys..__0x5c__foo__0x5c____0x5c__bar__0x5c____0x5c____0x5c__baz", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "6ddbda3f-101e-0033-4c29-984789000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestKeys/repeatedfwdslashes.replay ================================================ { "Initial": "AQAAAA7dviK9HbCbqAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "3dd8c4bb33030b3d", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo%2F%2Fbar%2F%2F%2Fbaz", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "5" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Date": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Etag": [ "\"0x8DC6640E7F9F375\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "V0JSBnCFdzM=" ], "X-Ms-Request-Id": [ "020288c9-701e-0078-4b29-98bbda000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "a5dc9264f49f690d", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo%2F%2Fbar%2F%2F%2Fbaz", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Etag": [ "\"0x8DC6640E7F9F375\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "020288d6-701e-0078-5729-98bbda000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "b2338004d08aa3cc", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo%2F%2Fbar%2F%2F%2Fbaz", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Etag": [ "\"0x8DC6640E7F9F375\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "020288de-701e-0078-5e29-98bbda000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "ede57b4da6ba5137", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo%2F%2Fbar%2F%2F%2Fbaz?sp=r\u0026sr=b\u0026sv=2023-11-03", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Etag": [ "\"0x8DC6640E7F9F375\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "020288e2-701e-0078-6229-98bbda000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "8a225195a4d93a34", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo%2F%2Fbar%2F%2F%2Fbaz", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:33 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "020288ea-701e-0078-6a29-98bbda000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestKeys/spaces.replay ================================================ { "Initial": "AQAAAA7dviK8Mav5UAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "59ad295a695ac478", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo%20bar%20baz", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "5" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Etag": [ "\"0x8DC6640E79525BA\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "V0JSBnCFdzM=" ], "X-Ms-Request-Id": [ "d5741280-401e-0011-4a29-988296000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "51bd12cba3c60ce2", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo%20bar%20baz", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Etag": [ "\"0x8DC6640E79525BA\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "d574128a-401e-0011-5329-988296000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "d15939ceeb77808f", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo%20bar%20baz", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Etag": [ "\"0x8DC6640E79525BA\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "d5741297-401e-0011-5e29-988296000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "9bddc491fecfd4b2", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo%20bar%20baz?sp=r\u0026sr=b\u0026sv=2023-11-03", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Etag": [ "\"0x8DC6640E79525BA\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "d574129b-401e-0011-6229-988296000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "19c0631bc209a393", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo%20bar%20baz-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo%20bar%20baz" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Etag": [ "\"0x8DC6640E7A15901\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Copy-Id": [ "1bfc31e8-7ed0-4a0e-9e0d-aa491db16344" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Request-Id": [ "d57412a1-401e-0011-6829-988296000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "22e452e33b269f4b", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo%20bar%20baz-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Etag": [ "\"0x8DC6640E7A15901\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Copy-Completion-Time": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "X-Ms-Copy-Id": [ "1bfc31e8-7ed0-4a0e-9e0d-aa491db16344" ], "X-Ms-Copy-Progress": [ "5/5" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo%20bar%20baz" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "d57412a8-401e-0011-6f29-988296000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "866637e5709dd7f4", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo%20bar%20baz-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "d57412ab-401e-0011-7229-988296000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "daf3767c1048a8e4", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keysfoo%20bar%20baz", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:32 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "d57412b0-401e-0011-7729-988296000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestKeys/startwithdigit.replay ================================================ { "Initial": "AQAAAA7dviK+ICt8wwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "b3af6de1a690ddfb", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys12345", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "5" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E899ECF1\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "V0JSBnCFdzM=" ], "X-Ms-Request-Id": [ "a1537ce9-e01e-007a-0929-980562000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "83e6eea7aaa50a9b", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys12345", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E899ECF1\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "a1537cf4-e01e-007a-1129-980562000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "df1ba6a7c3b1f640", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys12345", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E899ECF1\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "a1537cff-e01e-007a-1929-980562000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "b85fde7b612f62ce", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys12345?sp=r\u0026sr=b\u0026sv=2023-11-03", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E899ECF1\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "a1537d09-e01e-007a-2129-980562000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "821eecd33a492ad0", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys12345-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys12345" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E8A6E359\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Copy-Id": [ "2aa08637-8b41-43b8-82ac-57119eb7deb9" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Request-Id": [ "a1537d10-e01e-007a-2829-980562000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "104663afddfcdd27", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys12345-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E8A6E359\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Copy-Completion-Time": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "X-Ms-Copy-Id": [ "2aa08637-8b41-43b8-82ac-57119eb7deb9" ], "X-Ms-Copy-Progress": [ "5/5" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys12345" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "a1537d13-e01e-007a-2b29-980562000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "cb03b0aa3d2a025c", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys12345-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "a1537d17-e01e-007a-2f29-980562000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "422e9afdc85cb27e", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys12345", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "a1537d27-e01e-007a-3e29-980562000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestKeys/unicode.replay ================================================ { "Initial": "AQAAAA7dviK+BlkmUgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "c138eeb26813a8a9", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "5" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E857964E\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "V0JSBnCFdzM=" ], "X-Ms-Request-Id": [ "8ec6e0ae-501e-007f-6329-98d7b9000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "f720de97bb3573a5", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E857964E\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "8ec6e0b7-501e-007f-6a29-98d7b9000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "92ae17927600edf9", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E857964E\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "8ec6e0c2-501e-007f-7229-98d7b9000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "2e953a3440040352", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA?sp=r\u0026sr=b\u0026sv=2023-11-03", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E857964E\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "8ec6e0cf-501e-007f-7f29-98d7b9000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "5beceeaf2156ef54", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E8643EBB\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Copy-Id": [ "365cbb8b-b231-44ad-84d1-0673f7ecb0cc" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Request-Id": [ "8ec6e0d7-501e-007f-0629-98d7b9000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "76f219e332d5e9c3", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Etag": [ "\"0x8DC6640E8643EBB\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Copy-Completion-Time": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "X-Ms-Copy-Id": [ "365cbb8b-b231-44ad-84d1-0673f7ecb0cc" ], "X-Ms-Copy-Progress": [ "5/5" ], "X-Ms-Copy-Source": [ "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA" ], "X-Ms-Copy-Status": [ "success" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "8ec6e0dd-501e-007f-0c29-98d7b9000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8=" } }, { "ID": "07885b880e6d333d", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA-copy", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "8ec6e0df-501e-007f-0e29-98d7b9000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "5b2db57a5ae2901a", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:34 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "8ec6e0e0-501e-007f-0f29-98d7b9000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestList/PaginationConsistencyAfterDelete.replay ================================================ { "Initial": "AQAAAA7dVMB0ADiWHgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "b73a887ff6655376", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026maxresults=1000\u0026prefix=blob-for-list\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:11 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "1cae9ea2-f01e-0076-2f59-59926a000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1saXN0PC9QcmVmaXg+PE1heFJlc3VsdHM+MTAwMDwvTWF4UmVzdWx0cz48QmxvYnM+PEJsb2I+PE5hbWU+YmxvYi1mb3ItbGlzdC0wPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUVGREQ0MDU2PC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5ibG9iLWZvci1saXN0LTE8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNCBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNCBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4REJDQjRBOEM2OTkxQzA8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmJsb2ItZm9yLWxpc3QtMjwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIxIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIxIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VFRkUyMjMzOTwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PC9CbG9icz48TmV4dE1hcmtlciAvPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "b218c74286299203", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026maxresults=2\u0026prefix=blob-for-list\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:12 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "1cae9ed0-f01e-0076-5a59-59926a000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1saXN0PC9QcmVmaXg+PE1heFJlc3VsdHM+MjwvTWF4UmVzdWx0cz48QmxvYnM+PEJsb2I+PE5hbWU+YmxvYi1mb3ItbGlzdC0wPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUVGREQ0MDU2PC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5ibG9iLWZvci1saXN0LTE8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNCBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNCBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4REJDQjRBOEM2OTkxQzA8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjwvQmxvYnM+PE5leHRNYXJrZXI+MiE4MCFNREF3TURFMUlXSnNiMkl0Wm05eUxXeHBjM1F0TWlFd01EQXdNamdoT1RrNU9TMHhNaTB6TVZReU16bzFPVG8xT1M0NU9UazVPVGs1V2lFLTwvTmV4dE1hcmtlcj48L0VudW1lcmF0aW9uUmVzdWx0cz4=" } }, { "ID": "6f8bc6523bd34284", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-list-1", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:12 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "1cae9eea-f01e-0076-7459-59926a000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "bed47585da303715", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026marker=2%2180%21MDAwMDE1IWJsb2ItZm9yLWxpc3QtMiEwMDAwMjghOTk5OS0xMi0zMVQyMzo1OTo1OS45OTk5OTk5WiE-\u0026maxresults=1000\u0026prefix=blob-for-list\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:12 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "1cae9f04-f01e-0076-0e59-59926a000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1saXN0PC9QcmVmaXg+PE1hcmtlcj4yITgwIU1EQXdNREUxSVdKc2IySXRabTl5TFd4cGMzUXRNaUV3TURBd01qZ2hPVGs1T1MweE1pMHpNVlF5TXpvMU9UbzFPUzQ1T1RrNU9UazVXaUUtPC9NYXJrZXI+PE1heFJlc3VsdHM+MTAwMDwvTWF4UmVzdWx0cz48QmxvYnM+PEJsb2I+PE5hbWU+YmxvYi1mb3ItbGlzdC0yPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUVGRTIyMzM5PC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48L0Jsb2JzPjxOZXh0TWFya2VyIC8+PC9FbnVtZXJhdGlvblJlc3VsdHM+" } }, { "ID": "bbb1177c7e1bc29d", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-list-1", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "5" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Date": [ "Wed, 07 Feb 2024 00:06:12 GMT" ], "Etag": [ "\"0x8DC2770981EFA84\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:12 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "V0JSBnCFdzM=" ], "X-Ms-Request-Id": [ "1cae9f1a-f01e-0076-2259-59926a000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestList/PaginationConsistencyAfterInsert.replay ================================================ { "Initial": "AQAAAA7dVMBzMJ5dNgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "310279ddbcc4ae5b", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026maxresults=1000\u0026prefix=blob-for-list\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:11 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "60e7fbb8-e01e-0018-1459-59c745000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1saXN0PC9QcmVmaXg+PE1heFJlc3VsdHM+MTAwMDwvTWF4UmVzdWx0cz48QmxvYnM+PEJsb2I+PE5hbWU+YmxvYi1mb3ItbGlzdC0wPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUVGREQ0MDU2PC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5ibG9iLWZvci1saXN0LTE8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNCBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNCBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4REJDQjRBOEM2OTkxQzA8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmJsb2ItZm9yLWxpc3QtMjwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIxIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIxIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VFRkUyMjMzOTwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PC9CbG9icz48TmV4dE1hcmtlciAvPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "39a332e5f87ac77f", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026maxresults=2\u0026prefix=blob-for-list\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:11 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "60e7fbd0-e01e-0018-2a59-59c745000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1saXN0PC9QcmVmaXg+PE1heFJlc3VsdHM+MjwvTWF4UmVzdWx0cz48QmxvYnM+PEJsb2I+PE5hbWU+YmxvYi1mb3ItbGlzdC0wPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUVGREQ0MDU2PC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5ibG9iLWZvci1saXN0LTE8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNCBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNCBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4REJDQjRBOEM2OTkxQzA8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjwvQmxvYnM+PE5leHRNYXJrZXI+MiE4MCFNREF3TURFMUlXSnNiMkl0Wm05eUxXeHBjM1F0TWlFd01EQXdNamdoT1RrNU9TMHhNaTB6TVZReU16bzFPVG8xT1M0NU9UazVPVGs1V2lFLTwvTmV4dE1hcmtlcj48L0VudW1lcmF0aW9uUmVzdWx0cz4=" } }, { "ID": "4f8ee09244edc66a", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-list-0a", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "5" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Date": [ "Wed, 07 Feb 2024 00:06:11 GMT" ], "Etag": [ "\"0x8DC277097FBE748\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:11 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "V0JSBnCFdzM=" ], "X-Ms-Request-Id": [ "60e7fbe1-e01e-0018-3b59-59c745000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "e73a620e1027c172", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026marker=2%2180%21MDAwMDE1IWJsb2ItZm9yLWxpc3QtMiEwMDAwMjghOTk5OS0xMi0zMVQyMzo1OTo1OS45OTk5OTk5WiE-\u0026maxresults=1000\u0026prefix=blob-for-list\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:11 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "60e7fbf6-e01e-0018-5059-59c745000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1saXN0PC9QcmVmaXg+PE1hcmtlcj4yITgwIU1EQXdNREUxSVdKc2IySXRabTl5TFd4cGMzUXRNaUV3TURBd01qZ2hPVGs1T1MweE1pMHpNVlF5TXpvMU9UbzFPUzQ1T1RrNU9UazVXaUUtPC9NYXJrZXI+PE1heFJlc3VsdHM+MTAwMDwvTWF4UmVzdWx0cz48QmxvYnM+PEJsb2I+PE5hbWU+YmxvYi1mb3ItbGlzdC0yPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUVGRTIyMzM5PC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48L0Jsb2JzPjxOZXh0TWFya2VyIC8+PC9FbnVtZXJhdGlvblJlc3VsdHM+" } }, { "ID": "8e652c811deb6965", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-list-0a", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:11 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "60e7fc03-e01e-0018-5d59-59c745000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestList/by_1.replay ================================================ { "Initial": "AQAAAA7dVMBzF4U6aQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "b429d851fd2f38dd", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026maxresults=1000\u0026prefix=blob-for-list\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:11 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "67f93feb-d01e-005e-7f59-59f3c2000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1saXN0PC9QcmVmaXg+PE1heFJlc3VsdHM+MTAwMDwvTWF4UmVzdWx0cz48QmxvYnM+PEJsb2I+PE5hbWU+YmxvYi1mb3ItbGlzdC0wPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUVGREQ0MDU2PC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5ibG9iLWZvci1saXN0LTE8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNCBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNCBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4REJDQjRBOEM2OTkxQzA8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmJsb2ItZm9yLWxpc3QtMjwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIxIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIxIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VFRkUyMjMzOTwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PC9CbG9icz48TmV4dE1hcmtlciAvPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "284538f23e55c9b2", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026maxresults=1\u0026prefix=blob-for-list\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:11 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "67f93ff8-d01e-005e-0a59-59f3c2000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1saXN0PC9QcmVmaXg+PE1heFJlc3VsdHM+MTwvTWF4UmVzdWx0cz48QmxvYnM+PEJsb2I+PE5hbWU+YmxvYi1mb3ItbGlzdC0wPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUVGREQ0MDU2PC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48L0Jsb2JzPjxOZXh0TWFya2VyPjIhODAhTURBd01ERTFJV0pzYjJJdFptOXlMV3hwYzNRdE1TRXdNREF3TWpnaE9UazVPUzB4TWkwek1WUXlNem8xT1RvMU9TNDVPVGs1T1RrNVdpRS08L05leHRNYXJrZXI+PC9FbnVtZXJhdGlvblJlc3VsdHM+" } }, { "ID": "51ae847f57f0fcec", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026marker=2%2180%21MDAwMDE1IWJsb2ItZm9yLWxpc3QtMSEwMDAwMjghOTk5OS0xMi0zMVQyMzo1OTo1OS45OTk5OTk5WiE-\u0026maxresults=1\u0026prefix=blob-for-list\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:11 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "67f93ffe-d01e-005e-1059-59f3c2000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1saXN0PC9QcmVmaXg+PE1hcmtlcj4yITgwIU1EQXdNREUxSVdKc2IySXRabTl5TFd4cGMzUXRNU0V3TURBd01qZ2hPVGs1T1MweE1pMHpNVlF5TXpvMU9UbzFPUzQ1T1RrNU9UazVXaUUtPC9NYXJrZXI+PE1heFJlc3VsdHM+MTwvTWF4UmVzdWx0cz48QmxvYnM+PEJsb2I+PE5hbWU+YmxvYi1mb3ItbGlzdC0xPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPlRodSwgMTIgT2N0IDIwMjMgMTc6NDI6MDQgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPlRodSwgMTIgT2N0IDIwMjMgMTc6NDI6MDQgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OERCQ0I0QThDNjk5MUMwPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48L0Jsb2JzPjxOZXh0TWFya2VyPjIhODAhTURBd01ERTFJV0pzYjJJdFptOXlMV3hwYzNRdE1pRXdNREF3TWpnaE9UazVPUzB4TWkwek1WUXlNem8xT1RvMU9TNDVPVGs1T1RrNVdpRS08L05leHRNYXJrZXI+PC9FbnVtZXJhdGlvblJlc3VsdHM+" } }, { "ID": "1d878a3f394358a0", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026marker=2%2180%21MDAwMDE1IWJsb2ItZm9yLWxpc3QtMiEwMDAwMjghOTk5OS0xMi0zMVQyMzo1OTo1OS45OTk5OTk5WiE-\u0026maxresults=1\u0026prefix=blob-for-list\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:11 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "67f94003-d01e-005e-1559-59f3c2000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1saXN0PC9QcmVmaXg+PE1hcmtlcj4yITgwIU1EQXdNREUxSVdKc2IySXRabTl5TFd4cGMzUXRNaUV3TURBd01qZ2hPVGs1T1MweE1pMHpNVlF5TXpvMU9UbzFPUzQ1T1RrNU9UazVXaUUtPC9NYXJrZXI+PE1heFJlc3VsdHM+MTwvTWF4UmVzdWx0cz48QmxvYnM+PEJsb2I+PE5hbWU+YmxvYi1mb3ItbGlzdC0yPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUVGRTIyMzM5PC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48L0Jsb2JzPjxOZXh0TWFya2VyIC8+PC9FbnVtZXJhdGlvblJlc3VsdHM+" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestList/by_2.replay ================================================ { "Initial": "AQAAAA7dVMBzIMxpsAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "9744ebab281dd4d0", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026maxresults=1000\u0026prefix=blob-for-list\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:10 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "cded91f2-c01e-007d-0459-596901000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1saXN0PC9QcmVmaXg+PE1heFJlc3VsdHM+MTAwMDwvTWF4UmVzdWx0cz48QmxvYnM+PEJsb2I+PE5hbWU+YmxvYi1mb3ItbGlzdC0wPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUVGREQ0MDU2PC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5ibG9iLWZvci1saXN0LTE8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNCBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNCBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4REJDQjRBOEM2OTkxQzA8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmJsb2ItZm9yLWxpc3QtMjwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIxIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIxIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VFRkUyMjMzOTwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PC9CbG9icz48TmV4dE1hcmtlciAvPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "9f3d05764df001d3", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026maxresults=2\u0026prefix=blob-for-list\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:10 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "cded9200-c01e-007d-1059-596901000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1saXN0PC9QcmVmaXg+PE1heFJlc3VsdHM+MjwvTWF4UmVzdWx0cz48QmxvYnM+PEJsb2I+PE5hbWU+YmxvYi1mb3ItbGlzdC0wPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUVGREQ0MDU2PC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5ibG9iLWZvci1saXN0LTE8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNCBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNCBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4REJDQjRBOEM2OTkxQzA8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjwvQmxvYnM+PE5leHRNYXJrZXI+MiE4MCFNREF3TURFMUlXSnNiMkl0Wm05eUxXeHBjM1F0TWlFd01EQXdNamdoT1RrNU9TMHhNaTB6TVZReU16bzFPVG8xT1M0NU9UazVPVGs1V2lFLTwvTmV4dE1hcmtlcj48L0VudW1lcmF0aW9uUmVzdWx0cz4=" } }, { "ID": "de2a5068d8d21a47", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026marker=2%2180%21MDAwMDE1IWJsb2ItZm9yLWxpc3QtMiEwMDAwMjghOTk5OS0xMi0zMVQyMzo1OTo1OS45OTk5OTk5WiE-\u0026maxresults=2\u0026prefix=blob-for-list\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:10 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "cded9205-c01e-007d-1459-596901000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1saXN0PC9QcmVmaXg+PE1hcmtlcj4yITgwIU1EQXdNREUxSVdKc2IySXRabTl5TFd4cGMzUXRNaUV3TURBd01qZ2hPVGs1T1MweE1pMHpNVlF5TXpvMU9UbzFPUzQ1T1RrNU9UazVXaUUtPC9NYXJrZXI+PE1heFJlc3VsdHM+MjwvTWF4UmVzdWx0cz48QmxvYnM+PEJsb2I+PE5hbWU+YmxvYi1mb3ItbGlzdC0yPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUVGRTIyMzM5PC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48L0Jsb2JzPjxOZXh0TWFya2VyIC8+PC9FbnVtZXJhdGlvblJlc3VsdHM+" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestList/by_3.replay ================================================ { "Initial": "AQAAAA7dVMBzKMlpcgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "06193ace60f00f34", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026maxresults=1000\u0026prefix=blob-for-list\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:11 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "e30724f2-401e-004c-5659-598812000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1saXN0PC9QcmVmaXg+PE1heFJlc3VsdHM+MTAwMDwvTWF4UmVzdWx0cz48QmxvYnM+PEJsb2I+PE5hbWU+YmxvYi1mb3ItbGlzdC0wPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUVGREQ0MDU2PC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5ibG9iLWZvci1saXN0LTE8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNCBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNCBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4REJDQjRBOEM2OTkxQzA8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmJsb2ItZm9yLWxpc3QtMjwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIxIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIxIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VFRkUyMjMzOTwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PC9CbG9icz48TmV4dE1hcmtlciAvPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "8b7f22df8b07dbaa", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026maxresults=3\u0026prefix=blob-for-list\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:11 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "e3072506-401e-004c-6859-598812000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1saXN0PC9QcmVmaXg+PE1heFJlc3VsdHM+MzwvTWF4UmVzdWx0cz48QmxvYnM+PEJsb2I+PE5hbWU+YmxvYi1mb3ItbGlzdC0wPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUVGREQ0MDU2PC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5ibG9iLWZvci1saXN0LTE8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNCBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNCBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4REJDQjRBOEM2OTkxQzA8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmJsb2ItZm9yLWxpc3QtMjwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIxIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIxIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VFRkUyMjMzOTwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PC9CbG9icz48TmV4dE1hcmtlciAvPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestList/exactly_1_object_due_to_prefix.replay ================================================ { "Initial": "AQAAAA7dVMBzCJGs0gAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "f806b29ef6245863", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026maxresults=1000\u0026prefix=blob-for-list\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:10 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "df359e9c-e01e-0037-5b59-59ca8e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1saXN0PC9QcmVmaXg+PE1heFJlc3VsdHM+MTAwMDwvTWF4UmVzdWx0cz48QmxvYnM+PEJsb2I+PE5hbWU+YmxvYi1mb3ItbGlzdC0wPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUVGREQ0MDU2PC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5ibG9iLWZvci1saXN0LTE8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNCBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNCBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4REJDQjRBOEM2OTkxQzA8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmJsb2ItZm9yLWxpc3QtMjwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIxIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIxIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VFRkUyMjMzOTwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PC9CbG9icz48TmV4dE1hcmtlciAvPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "f94523fe99dec916", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026maxresults=1000\u0026prefix=blob-for-list-1\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:10 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "df359ec9-e01e-0037-0359-59ca8e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1saXN0LTE8L1ByZWZpeD48TWF4UmVzdWx0cz4xMDAwPC9NYXhSZXN1bHRzPjxCbG9icz48QmxvYj48TmFtZT5ibG9iLWZvci1saXN0LTE8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNCBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNCBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4REJDQjRBOEM2OTkxQzA8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjwvQmxvYnM+PE5leHRNYXJrZXIgLz48L0VudW1lcmF0aW9uUmVzdWx0cz4=" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestList/no_objects.replay ================================================ { "Initial": "AQAAAA7dVMBzASrIPwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "708ad659faf1b6b3", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026maxresults=1000\u0026prefix=blob-for-list\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:10 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "58b08e69-401e-0001-4959-5947fe000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1saXN0PC9QcmVmaXg+PE1heFJlc3VsdHM+MTAwMDwvTWF4UmVzdWx0cz48QmxvYnM+PEJsb2I+PE5hbWU+YmxvYi1mb3ItbGlzdC0wPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUVGREQ0MDU2PC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5ibG9iLWZvci1saXN0LTE8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNCBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNCBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4REJDQjRBOEM2OTkxQzA8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmJsb2ItZm9yLWxpc3QtMjwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIxIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIxIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VFRkUyMjMzOTwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PC9CbG9icz48TmV4dE1hcmtlciAvPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "780a8b440fe256c9", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026maxresults=1000\u0026prefix=no-objects-with-this-prefix\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:10 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "58b08e81-401e-0001-5c59-5947fe000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5uby1vYmplY3RzLXdpdGgtdGhpcy1wcmVmaXg8L1ByZWZpeD48TWF4UmVzdWx0cz4xMDAwPC9NYXhSZXN1bHRzPjxCbG9icyAvPjxOZXh0TWFya2VyIC8+PC9FbnVtZXJhdGlvblJlc3VsdHM+" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestList/no_pagination.replay ================================================ { "Initial": "AQAAAA7dVMBzD7tYAAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "d6b190ef8e2565e0", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026maxresults=1000\u0026prefix=blob-for-list\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:10 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "9cc5ef16-401e-003e-6d59-598f5d000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1saXN0PC9QcmVmaXg+PE1heFJlc3VsdHM+MTAwMDwvTWF4UmVzdWx0cz48QmxvYnM+PEJsb2I+PE5hbWU+YmxvYi1mb3ItbGlzdC0wPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUVGREQ0MDU2PC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5ibG9iLWZvci1saXN0LTE8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNCBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNCBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4REJDQjRBOEM2OTkxQzA8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmJsb2ItZm9yLWxpc3QtMjwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIxIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIxIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VFRkUyMjMzOTwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PC9CbG9icz48TmV4dE1hcmtlciAvPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "489fe054a0121c8f", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026maxresults=1000\u0026prefix=blob-for-list\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:10 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "9cc5ef38-401e-003e-0c59-598f5d000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1saXN0PC9QcmVmaXg+PE1heFJlc3VsdHM+MTAwMDwvTWF4UmVzdWx0cz48QmxvYnM+PEJsb2I+PE5hbWU+YmxvYi1mb3ItbGlzdC0wPC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUVGREQ0MDU2PC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5ibG9iLWZvci1saXN0LTE8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNCBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNCBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4REJDQjRBOEM2OTkxQzA8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmJsb2ItZm9yLWxpc3QtMjwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIxIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIxIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VFRkUyMjMzOTwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PC9CbG9icz48TmV4dE1hcmtlciAvPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestListDelimiters/abc.replay ================================================ { "Initial": "AQAAAA7dVMB0OxI7mwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "fc7d85fbc7c28a8f", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026maxresults=1000\u0026prefix=blob-for-delimiters-abc\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:12 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "6c5d4d6b-d01e-0013-3f59-593c2e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLWFiYzwvUHJlZml4PjxNYXhSZXN1bHRzPjEwMDA8L01heFJlc3VsdHM+PEJsb2JzPjxCbG9iPjxOYW1lPmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY2EudHh0PC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUYwRDAwOUZDPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmNiLnR4dDwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VGMEQyQzk5RDwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PEJsb2I+PE5hbWU+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjc3ViZGlyYWJjYy50eHQ8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjBENTg5M0U8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY3N1YmRpcmFiY2QudHh0PC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUYwRDdEMzlBPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjJhYmNlLnR4dDwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5UaHUsIDEyIE9jdCAyMDIzIDE3OjQyOjA1IEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5UaHUsIDEyIE9jdCAyMDIzIDE3OjQyOjA1IEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhEQkNCNEE4RDFERkE2MzwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PEJsb2I+PE5hbWU+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmNmLnR4dDwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VGMERDNDEzOTwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PC9CbG9icz48TmV4dE1hcmtlciAvPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "3e02c56c661e378a", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026maxresults=1000\u0026prefix=blob-for-delimiters-abc\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:12 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "6c5d4d81-d01e-0013-5159-593c2e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLWFiYzwvUHJlZml4PjxNYXhSZXN1bHRzPjEwMDA8L01heFJlc3VsdHM+PEJsb2JzPjxCbG9iPjxOYW1lPmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY2EudHh0PC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUYwRDAwOUZDPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmNiLnR4dDwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VGMEQyQzk5RDwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PEJsb2I+PE5hbWU+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjc3ViZGlyYWJjYy50eHQ8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjBENTg5M0U8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY3N1YmRpcmFiY2QudHh0PC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUYwRDdEMzlBPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjJhYmNlLnR4dDwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5UaHUsIDEyIE9jdCAyMDIzIDE3OjQyOjA1IEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5UaHUsIDEyIE9jdCAyMDIzIDE3OjQyOjA1IEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhEQkNCNEE4RDFERkE2MzwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PEJsb2I+PE5hbWU+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmNmLnR4dDwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VGMERDNDEzOTwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PC9CbG9icz48TmV4dE1hcmtlciAvPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "82ff33753c78e9b9", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=abc\u0026maxresults=1000\u0026prefix=blob-for-delimiters-abc\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:12 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "6c5d4d8c-d01e-0013-5859-593c2e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLWFiYzwvUHJlZml4PjxNYXhSZXN1bHRzPjEwMDA8L01heFJlc3VsdHM+PERlbGltaXRlcj5hYmM8L0RlbGltaXRlcj48QmxvYnM+PEJsb2JQcmVmaXg+PE5hbWU+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjPC9OYW1lPjwvQmxvYlByZWZpeD48QmxvYlByZWZpeD48TmFtZT5ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjJhYmM8L05hbWU+PC9CbG9iUHJlZml4PjxCbG9iPjxOYW1lPmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZi50eHQ8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjBEQzQxMzk8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjwvQmxvYnM+PE5leHRNYXJrZXIgLz48L0VudW1lcmF0aW9uUmVzdWx0cz4=" } }, { "ID": "48fb0d635b111669", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=abc\u0026maxresults=1000\u0026prefix=blob-for-delimiters-abcdir1abc\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:12 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "6c5d4d8e-d01e-0013-5a59-593c2e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmM8L1ByZWZpeD48TWF4UmVzdWx0cz4xMDAwPC9NYXhSZXN1bHRzPjxEZWxpbWl0ZXI+YWJjPC9EZWxpbWl0ZXI+PEJsb2JzPjxCbG9iPjxOYW1lPmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY2EudHh0PC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUYwRDAwOUZDPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmNiLnR4dDwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VGMEQyQzk5RDwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PEJsb2JQcmVmaXg+PE5hbWU+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjc3ViZGlyYWJjPC9OYW1lPjwvQmxvYlByZWZpeD48L0Jsb2JzPjxOZXh0TWFya2VyIC8+PC9FbnVtZXJhdGlvblJlc3VsdHM+" } }, { "ID": "31191fcae59cb48e", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=abc\u0026maxresults=1000\u0026prefix=blob-for-delimiters-abcdir1abcsubdirabc\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:12 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "6c5d4d98-d01e-0013-6259-593c2e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmNzdWJkaXJhYmM8L1ByZWZpeD48TWF4UmVzdWx0cz4xMDAwPC9NYXhSZXN1bHRzPjxEZWxpbWl0ZXI+YWJjPC9EZWxpbWl0ZXI+PEJsb2JzPjxCbG9iPjxOYW1lPmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY3N1YmRpcmFiY2MudHh0PC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUYwRDU4OTNFPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmNzdWJkaXJhYmNkLnR4dDwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VGMEQ3RDM5QTwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PC9CbG9icz48TmV4dE1hcmtlciAvPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "188a20602ca7250e", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=abc\u0026maxresults=1000\u0026prefix=blob-for-delimiters-abcdir2abc\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:12 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "6c5d4d9c-d01e-0013-6659-593c2e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjJhYmM8L1ByZWZpeD48TWF4UmVzdWx0cz4xMDAwPC9NYXhSZXN1bHRzPjxEZWxpbWl0ZXI+YWJjPC9EZWxpbWl0ZXI+PEJsb2JzPjxCbG9iPjxOYW1lPmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMmFiY2UudHh0PC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPlRodSwgMTIgT2N0IDIwMjMgMTc6NDI6MDUgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPlRodSwgMTIgT2N0IDIwMjMgMTc6NDI6MDUgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OERCQ0I0QThEMURGQTYzPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48L0Jsb2JzPjxOZXh0TWFya2VyIC8+PC9FbnVtZXJhdGlvblJlc3VsdHM+" } }, { "ID": "825536a9a7773da2", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=abc\u0026maxresults=1\u0026prefix=blob-for-delimiters-abc\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:12 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "6c5d4da0-d01e-0013-6a59-593c2e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLWFiYzwvUHJlZml4PjxNYXhSZXN1bHRzPjE8L01heFJlc3VsdHM+PERlbGltaXRlcj5hYmM8L0RlbGltaXRlcj48QmxvYnM+PEJsb2JQcmVmaXg+PE5hbWU+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjPC9OYW1lPjwvQmxvYlByZWZpeD48L0Jsb2JzPjxOZXh0TWFya2VyPjIhMTA4IU1EQXdNRE0xSVdKc2IySXRabTl5TFdSbGJHbHRhWFJsY25NdFlXSmpaR2x5TW1GaVkyVXVkSGgwSVRBd01EQXlPQ0U1T1RrNUxURXlMVE14VkRJek9qVTVPalU1TGprNU9UazVPVGxhSVEtLTwvTmV4dE1hcmtlcj48L0VudW1lcmF0aW9uUmVzdWx0cz4=" } }, { "ID": "263ddacf08470a85", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=abc\u0026marker=2%21108%21MDAwMDM1IWJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMmFiY2UudHh0ITAwMDAyOCE5OTk5LTEyLTMxVDIzOjU5OjU5Ljk5OTk5OTlaIQ--\u0026maxresults=1\u0026prefix=blob-for-delimiters-abc\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:12 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "6c5d4da5-d01e-0013-6f59-593c2e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLWFiYzwvUHJlZml4PjxNYXJrZXI+MiExMDghTURBd01ETTFJV0pzYjJJdFptOXlMV1JsYkdsdGFYUmxjbk10WVdKalpHbHlNbUZpWTJVdWRIaDBJVEF3TURBeU9DRTVPVGs1TFRFeUxUTXhWREl6T2pVNU9qVTVMams1T1RrNU9UbGFJUS0tPC9NYXJrZXI+PE1heFJlc3VsdHM+MTwvTWF4UmVzdWx0cz48RGVsaW1pdGVyPmFiYzwvRGVsaW1pdGVyPjxCbG9icz48QmxvYlByZWZpeD48TmFtZT5ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjJhYmM8L05hbWU+PC9CbG9iUHJlZml4PjwvQmxvYnM+PE5leHRNYXJrZXI+MiE5NiFNREF3TURJNElXSnNiMkl0Wm05eUxXUmxiR2x0YVhSbGNuTXRZV0pqWmk1MGVIUWhNREF3TURJNElUazVPVGt0TVRJdE16RlVNak02TlRrNk5Ua3VPVGs1T1RrNU9Wb2g8L05leHRNYXJrZXI+PC9FbnVtZXJhdGlvblJlc3VsdHM+" } }, { "ID": "7e98b3b4aef96945", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=abc\u0026marker=2%2196%21MDAwMDI4IWJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZi50eHQhMDAwMDI4ITk5OTktMTItMzFUMjM6NTk6NTkuOTk5OTk5OVoh\u0026maxresults=1\u0026prefix=blob-for-delimiters-abc\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:12 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "6c5d4da9-d01e-0013-7359-593c2e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLWFiYzwvUHJlZml4PjxNYXJrZXI+MiE5NiFNREF3TURJNElXSnNiMkl0Wm05eUxXUmxiR2x0YVhSbGNuTXRZV0pqWmk1MGVIUWhNREF3TURJNElUazVPVGt0TVRJdE16RlVNak02TlRrNk5Ua3VPVGs1T1RrNU9Wb2g8L01hcmtlcj48TWF4UmVzdWx0cz4xPC9NYXhSZXN1bHRzPjxEZWxpbWl0ZXI+YWJjPC9EZWxpbWl0ZXI+PEJsb2JzPjxCbG9iPjxOYW1lPmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZi50eHQ8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjBEQzQxMzk8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjwvQmxvYnM+PE5leHRNYXJrZXIgLz48L0VudW1lcmF0aW9uUmVzdWx0cz4=" } }, { "ID": "ad7ba6734d17ac5f", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-delimiters-abcdir2abce.txt", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:12 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "6c5d4daf-d01e-0013-7859-593c2e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "6c23da92ca81a60c", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=abc\u0026maxresults=1000\u0026prefix=blob-for-delimiters-abc\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:12 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "6c5d4db6-d01e-0013-7d59-593c2e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLWFiYzwvUHJlZml4PjxNYXhSZXN1bHRzPjEwMDA8L01heFJlc3VsdHM+PERlbGltaXRlcj5hYmM8L0RlbGltaXRlcj48QmxvYnM+PEJsb2JQcmVmaXg+PE5hbWU+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjPC9OYW1lPjwvQmxvYlByZWZpeD48QmxvYj48TmFtZT5ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2YudHh0PC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUYwREM0MTM5PC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48L0Jsb2JzPjxOZXh0TWFya2VyIC8+PC9FbnVtZXJhdGlvblJlc3VsdHM+" } }, { "ID": "6852e861526db5cf", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-delimiters-abcdir2abce.txt", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "5" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Date": [ "Wed, 07 Feb 2024 00:06:12 GMT" ], "Etag": [ "\"0x8DC277098CFE144\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "V0JSBnCFdzM=" ], "X-Ms-Request-Id": [ "6c5d4dbb-d01e-0013-0259-593c2e000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestListDelimiters/backslash.replay ================================================ { "Initial": "AQAAAA7dVMB0JvQpPAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "efbc7baaf055d19c", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026maxresults=1000\u0026prefix=blob-for-delimiters-__0x5c__\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:12 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "778ee711-501e-0032-3959-591855000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLV9fMHg1Y19fPC9QcmVmaXg+PE1heFJlc3VsdHM+MTAwMDwvTWF4UmVzdWx0cz48QmxvYnM+PEJsb2I+PE5hbWU+YmxvYi1mb3ItZGVsaW1pdGVycy1fXzB4NWNfX2RpcjFfXzB4NWNfX2EudHh0PC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUYwOUMxRjMxPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5ibG9iLWZvci1kZWxpbWl0ZXJzLV9fMHg1Y19fZGlyMV9fMHg1Y19fYi50eHQ8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjA5RTY5OTE8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmJsb2ItZm9yLWRlbGltaXRlcnMtX18weDVjX19kaXIxX18weDVjX19zdWJkaXJfXzB4NWNfX2MudHh0PC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUYwQTBEQUZGPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5ibG9iLWZvci1kZWxpbWl0ZXJzLV9fMHg1Y19fZGlyMV9fMHg1Y19fc3ViZGlyX18weDVjX19kLnR4dDwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VGMEEzMjU1RjwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PEJsb2I+PE5hbWU+YmxvYi1mb3ItZGVsaW1pdGVycy1fXzB4NWNfX2RpcjJfXzB4NWNfX2UudHh0PC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPlRodSwgMTIgT2N0IDIwMjMgMTc6NDI6MDUgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPlRodSwgMTIgT2N0IDIwMjMgMTc6NDI6MDUgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OERCQ0I0QThDRTkwRjZFPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5ibG9iLWZvci1kZWxpbWl0ZXJzLV9fMHg1Y19fZi50eHQ8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjBBQTJCODk8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjwvQmxvYnM+PE5leHRNYXJrZXIgLz48L0VudW1lcmF0aW9uUmVzdWx0cz4=" } }, { "ID": "fe68d79e519ec3c4", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026maxresults=1000\u0026prefix=blob-for-delimiters-__0x5c__\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:12 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "778ee71e-501e-0032-4459-591855000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLV9fMHg1Y19fPC9QcmVmaXg+PE1heFJlc3VsdHM+MTAwMDwvTWF4UmVzdWx0cz48QmxvYnM+PEJsb2I+PE5hbWU+YmxvYi1mb3ItZGVsaW1pdGVycy1fXzB4NWNfX2RpcjFfXzB4NWNfX2EudHh0PC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUYwOUMxRjMxPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5ibG9iLWZvci1kZWxpbWl0ZXJzLV9fMHg1Y19fZGlyMV9fMHg1Y19fYi50eHQ8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjA5RTY5OTE8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmJsb2ItZm9yLWRlbGltaXRlcnMtX18weDVjX19kaXIxX18weDVjX19zdWJkaXJfXzB4NWNfX2MudHh0PC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUYwQTBEQUZGPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5ibG9iLWZvci1kZWxpbWl0ZXJzLV9fMHg1Y19fZGlyMV9fMHg1Y19fc3ViZGlyX18weDVjX19kLnR4dDwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VGMEEzMjU1RjwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PEJsb2I+PE5hbWU+YmxvYi1mb3ItZGVsaW1pdGVycy1fXzB4NWNfX2RpcjJfXzB4NWNfX2UudHh0PC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPlRodSwgMTIgT2N0IDIwMjMgMTc6NDI6MDUgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPlRodSwgMTIgT2N0IDIwMjMgMTc6NDI6MDUgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OERCQ0I0QThDRTkwRjZFPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5ibG9iLWZvci1kZWxpbWl0ZXJzLV9fMHg1Y19fZi50eHQ8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjBBQTJCODk8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjwvQmxvYnM+PE5leHRNYXJrZXIgLz48L0VudW1lcmF0aW9uUmVzdWx0cz4=" } }, { "ID": "7be223b510d3015a", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=__0x5c__\u0026maxresults=1000\u0026prefix=blob-for-delimiters-__0x5c__\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:12 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "778ee733-501e-0032-5559-591855000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLV9fMHg1Y19fPC9QcmVmaXg+PE1heFJlc3VsdHM+MTAwMDwvTWF4UmVzdWx0cz48RGVsaW1pdGVyPl9fMHg1Y19fPC9EZWxpbWl0ZXI+PEJsb2JzPjxCbG9iUHJlZml4PjxOYW1lPmJsb2ItZm9yLWRlbGltaXRlcnMtX18weDVjX19kaXIxX18weDVjX188L05hbWU+PC9CbG9iUHJlZml4PjxCbG9iUHJlZml4PjxOYW1lPmJsb2ItZm9yLWRlbGltaXRlcnMtX18weDVjX19kaXIyX18weDVjX188L05hbWU+PC9CbG9iUHJlZml4PjxCbG9iPjxOYW1lPmJsb2ItZm9yLWRlbGltaXRlcnMtX18weDVjX19mLnR4dDwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VGMEFBMkI4OTwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PC9CbG9icz48TmV4dE1hcmtlciAvPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "c0176f2070886ec4", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=__0x5c__\u0026maxresults=1000\u0026prefix=blob-for-delimiters-__0x5c__dir1__0x5c__\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:12 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "778ee738-501e-0032-5a59-591855000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLV9fMHg1Y19fZGlyMV9fMHg1Y19fPC9QcmVmaXg+PE1heFJlc3VsdHM+MTAwMDwvTWF4UmVzdWx0cz48RGVsaW1pdGVyPl9fMHg1Y19fPC9EZWxpbWl0ZXI+PEJsb2JzPjxCbG9iPjxOYW1lPmJsb2ItZm9yLWRlbGltaXRlcnMtX18weDVjX19kaXIxX18weDVjX19hLnR4dDwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VGMDlDMUYzMTwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PEJsb2I+PE5hbWU+YmxvYi1mb3ItZGVsaW1pdGVycy1fXzB4NWNfX2RpcjFfXzB4NWNfX2IudHh0PC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUYwOUU2OTkxPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYlByZWZpeD48TmFtZT5ibG9iLWZvci1kZWxpbWl0ZXJzLV9fMHg1Y19fZGlyMV9fMHg1Y19fc3ViZGlyX18weDVjX188L05hbWU+PC9CbG9iUHJlZml4PjwvQmxvYnM+PE5leHRNYXJrZXIgLz48L0VudW1lcmF0aW9uUmVzdWx0cz4=" } }, { "ID": "ee6eb5f69a33b421", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=__0x5c__\u0026maxresults=1000\u0026prefix=blob-for-delimiters-__0x5c__dir1__0x5c__subdir__0x5c__\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:12 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "778ee742-501e-0032-6459-591855000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLV9fMHg1Y19fZGlyMV9fMHg1Y19fc3ViZGlyX18weDVjX188L1ByZWZpeD48TWF4UmVzdWx0cz4xMDAwPC9NYXhSZXN1bHRzPjxEZWxpbWl0ZXI+X18weDVjX188L0RlbGltaXRlcj48QmxvYnM+PEJsb2I+PE5hbWU+YmxvYi1mb3ItZGVsaW1pdGVycy1fXzB4NWNfX2RpcjFfXzB4NWNfX3N1YmRpcl9fMHg1Y19fYy50eHQ8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjBBMERBRkY8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmJsb2ItZm9yLWRlbGltaXRlcnMtX18weDVjX19kaXIxX18weDVjX19zdWJkaXJfXzB4NWNfX2QudHh0PC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUYwQTMyNTVGPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48L0Jsb2JzPjxOZXh0TWFya2VyIC8+PC9FbnVtZXJhdGlvblJlc3VsdHM+" } }, { "ID": "8fe36afe9ef4d708", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=__0x5c__\u0026maxresults=1000\u0026prefix=blob-for-delimiters-__0x5c__dir2__0x5c__\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:12 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "778ee74b-501e-0032-6c59-591855000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLV9fMHg1Y19fZGlyMl9fMHg1Y19fPC9QcmVmaXg+PE1heFJlc3VsdHM+MTAwMDwvTWF4UmVzdWx0cz48RGVsaW1pdGVyPl9fMHg1Y19fPC9EZWxpbWl0ZXI+PEJsb2JzPjxCbG9iPjxOYW1lPmJsb2ItZm9yLWRlbGltaXRlcnMtX18weDVjX19kaXIyX18weDVjX19lLnR4dDwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5UaHUsIDEyIE9jdCAyMDIzIDE3OjQyOjA1IEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5UaHUsIDEyIE9jdCAyMDIzIDE3OjQyOjA1IEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhEQkNCNEE4Q0U5MEY2RTwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PC9CbG9icz48TmV4dE1hcmtlciAvPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "0c06736090c31351", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=__0x5c__\u0026maxresults=1\u0026prefix=blob-for-delimiters-__0x5c__\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:12 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "778ee74f-501e-0032-7059-591855000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLV9fMHg1Y19fPC9QcmVmaXg+PE1heFJlc3VsdHM+MTwvTWF4UmVzdWx0cz48RGVsaW1pdGVyPl9fMHg1Y19fPC9EZWxpbWl0ZXI+PEJsb2JzPjxCbG9iUHJlZml4PjxOYW1lPmJsb2ItZm9yLWRlbGltaXRlcnMtX18weDVjX19kaXIxX18weDVjX188L05hbWU+PC9CbG9iUHJlZml4PjwvQmxvYnM+PE5leHRNYXJrZXI+MiExMjAhTURBd01EUTFJV0pzYjJJdFptOXlMV1JsYkdsdGFYUmxjbk10WDE4d2VEVmpYMTlrYVhJeVgxOHdlRFZqWDE5bExuUjRkQ0V3TURBd01qZ2hPVGs1T1MweE1pMHpNVlF5TXpvMU9UbzFPUzQ1T1RrNU9UazVXaUUtPC9OZXh0TWFya2VyPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "37e5491bc07d80b3", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=__0x5c__\u0026marker=2%21120%21MDAwMDQ1IWJsb2ItZm9yLWRlbGltaXRlcnMtX18weDVjX19kaXIyX18weDVjX19lLnR4dCEwMDAwMjghOTk5OS0xMi0zMVQyMzo1OTo1OS45OTk5OTk5WiE-\u0026maxresults=1\u0026prefix=blob-for-delimiters-__0x5c__\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:12 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "778ee75a-501e-0032-7b59-591855000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLV9fMHg1Y19fPC9QcmVmaXg+PE1hcmtlcj4yITEyMCFNREF3TURRMUlXSnNiMkl0Wm05eUxXUmxiR2x0YVhSbGNuTXRYMTh3ZURWalgxOWthWEl5WDE4d2VEVmpYMTlsTG5SNGRDRXdNREF3TWpnaE9UazVPUzB4TWkwek1WUXlNem8xT1RvMU9TNDVPVGs1T1RrNVdpRS08L01hcmtlcj48TWF4UmVzdWx0cz4xPC9NYXhSZXN1bHRzPjxEZWxpbWl0ZXI+X18weDVjX188L0RlbGltaXRlcj48QmxvYnM+PEJsb2JQcmVmaXg+PE5hbWU+YmxvYi1mb3ItZGVsaW1pdGVycy1fXzB4NWNfX2RpcjJfXzB4NWNfXzwvTmFtZT48L0Jsb2JQcmVmaXg+PC9CbG9icz48TmV4dE1hcmtlcj4yITEwNCFNREF3TURNeklXSnNiMkl0Wm05eUxXUmxiR2x0YVhSbGNuTXRYMTh3ZURWalgxOW1MblI0ZENFd01EQXdNamdoT1RrNU9TMHhNaTB6TVZReU16bzFPVG8xT1M0NU9UazVPVGs1V2lFLTwvTmV4dE1hcmtlcj48L0VudW1lcmF0aW9uUmVzdWx0cz4=" } }, { "ID": "a7beeb6297155487", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=__0x5c__\u0026marker=2%21104%21MDAwMDMzIWJsb2ItZm9yLWRlbGltaXRlcnMtX18weDVjX19mLnR4dCEwMDAwMjghOTk5OS0xMi0zMVQyMzo1OTo1OS45OTk5OTk5WiE-\u0026maxresults=1\u0026prefix=blob-for-delimiters-__0x5c__\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:12 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "778ee761-501e-0032-0259-591855000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLV9fMHg1Y19fPC9QcmVmaXg+PE1hcmtlcj4yITEwNCFNREF3TURNeklXSnNiMkl0Wm05eUxXUmxiR2x0YVhSbGNuTXRYMTh3ZURWalgxOW1MblI0ZENFd01EQXdNamdoT1RrNU9TMHhNaTB6TVZReU16bzFPVG8xT1M0NU9UazVPVGs1V2lFLTwvTWFya2VyPjxNYXhSZXN1bHRzPjE8L01heFJlc3VsdHM+PERlbGltaXRlcj5fXzB4NWNfXzwvRGVsaW1pdGVyPjxCbG9icz48QmxvYj48TmFtZT5ibG9iLWZvci1kZWxpbWl0ZXJzLV9fMHg1Y19fZi50eHQ8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjBBQTJCODk8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjwvQmxvYnM+PE5leHRNYXJrZXIgLz48L0VudW1lcmF0aW9uUmVzdWx0cz4=" } }, { "ID": "28eab1db95075fc2", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-delimiters-__0x5c__dir2__0x5c__e.txt", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:12 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "778ee769-501e-0032-0859-591855000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "d11560abebf32e1f", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=__0x5c__\u0026maxresults=1000\u0026prefix=blob-for-delimiters-__0x5c__\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:12 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "778ee772-501e-0032-1059-591855000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLV9fMHg1Y19fPC9QcmVmaXg+PE1heFJlc3VsdHM+MTAwMDwvTWF4UmVzdWx0cz48RGVsaW1pdGVyPl9fMHg1Y19fPC9EZWxpbWl0ZXI+PEJsb2JzPjxCbG9iUHJlZml4PjxOYW1lPmJsb2ItZm9yLWRlbGltaXRlcnMtX18weDVjX19kaXIxX18weDVjX188L05hbWU+PC9CbG9iUHJlZml4PjxCbG9iPjxOYW1lPmJsb2ItZm9yLWRlbGltaXRlcnMtX18weDVjX19mLnR4dDwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VGMEFBMkI4OTwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PC9CbG9icz48TmV4dE1hcmtlciAvPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "729b2990aec6d783", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-delimiters-__0x5c__dir2__0x5c__e.txt", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "5" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Date": [ "Wed, 07 Feb 2024 00:06:12 GMT" ], "Etag": [ "\"0x8DC2770989948D4\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:12 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "V0JSBnCFdzM=" ], "X-Ms-Request-Id": [ "778ee785-501e-0032-2159-591855000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestListDelimiters/fwdslash.replay ================================================ { "Initial": "AQAAAA7dVMB0EzovHQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "99d95abc09b675ec", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026maxresults=1000\u0026prefix=blob-for-delimiters-%2F\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:11 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "c17b7a64-601e-0016-6859-59eef5000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLS88L1ByZWZpeD48TWF4UmVzdWx0cz4xMDAwPC9NYXhSZXN1bHRzPjxCbG9icz48QmxvYj48TmFtZT5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxL2EudHh0PC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUYwNzdBMDk3PC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxL2IudHh0PC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUYwN0E2MDM3PC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxL3N1YmRpci9jLnR4dDwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VGMDdDODM3QjwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PEJsb2I+PE5hbWU+YmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMS9zdWJkaXIvZC50eHQ8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjA3RTU4OTQ8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmJsb2ItZm9yLWRlbGltaXRlcnMtL2RpcjIvZS50eHQ8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNSBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNSBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4REJDQjRBOENCNDRCODQ8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmJsb2ItZm9yLWRlbGltaXRlcnMtL2YudHh0PC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUYwODJFRDQ2PC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48L0Jsb2JzPjxOZXh0TWFya2VyIC8+PC9FbnVtZXJhdGlvblJlc3VsdHM+" } }, { "ID": "25c21765a7ed1d6a", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026maxresults=1000\u0026prefix=blob-for-delimiters-%2F\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:11 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "c17b7a87-601e-0016-0859-59eef5000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLS88L1ByZWZpeD48TWF4UmVzdWx0cz4xMDAwPC9NYXhSZXN1bHRzPjxCbG9icz48QmxvYj48TmFtZT5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxL2EudHh0PC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUYwNzdBMDk3PC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxL2IudHh0PC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUYwN0E2MDM3PC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxL3N1YmRpci9jLnR4dDwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VGMDdDODM3QjwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PEJsb2I+PE5hbWU+YmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMS9zdWJkaXIvZC50eHQ8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjA3RTU4OTQ8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmJsb2ItZm9yLWRlbGltaXRlcnMtL2RpcjIvZS50eHQ8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNSBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNSBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4REJDQjRBOENCNDRCODQ8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmJsb2ItZm9yLWRlbGltaXRlcnMtL2YudHh0PC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUYwODJFRDQ2PC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48L0Jsb2JzPjxOZXh0TWFya2VyIC8+PC9FbnVtZXJhdGlvblJlc3VsdHM+" } }, { "ID": "f5f7cb24630db9b6", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=%2F\u0026maxresults=1000\u0026prefix=blob-for-delimiters-%2F\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:11 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "c17b7aa5-601e-0016-2359-59eef5000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLS88L1ByZWZpeD48TWF4UmVzdWx0cz4xMDAwPC9NYXhSZXN1bHRzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxCbG9icz48QmxvYlByZWZpeD48TmFtZT5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxLzwvTmFtZT48L0Jsb2JQcmVmaXg+PEJsb2JQcmVmaXg+PE5hbWU+YmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMi88L05hbWU+PC9CbG9iUHJlZml4PjxCbG9iPjxOYW1lPmJsb2ItZm9yLWRlbGltaXRlcnMtL2YudHh0PC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUYwODJFRDQ2PC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48L0Jsb2JzPjxOZXh0TWFya2VyIC8+PC9FbnVtZXJhdGlvblJlc3VsdHM+" } }, { "ID": "4c1eae948318d193", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=%2F\u0026maxresults=1000\u0026prefix=blob-for-delimiters-%2Fdir1%2F\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:11 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "c17b7abd-601e-0016-3959-59eef5000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxLzwvUHJlZml4PjxNYXhSZXN1bHRzPjEwMDA8L01heFJlc3VsdHM+PERlbGltaXRlcj4vPC9EZWxpbWl0ZXI+PEJsb2JzPjxCbG9iPjxOYW1lPmJsb2ItZm9yLWRlbGltaXRlcnMtL2RpcjEvYS50eHQ8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjA3N0EwOTc8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmJsb2ItZm9yLWRlbGltaXRlcnMtL2RpcjEvYi50eHQ8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjA3QTYwMzc8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iUHJlZml4PjxOYW1lPmJsb2ItZm9yLWRlbGltaXRlcnMtL2RpcjEvc3ViZGlyLzwvTmFtZT48L0Jsb2JQcmVmaXg+PC9CbG9icz48TmV4dE1hcmtlciAvPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "8e69937a20a198c9", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=%2F\u0026maxresults=1000\u0026prefix=blob-for-delimiters-%2Fdir1%2Fsubdir%2F\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:11 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "c17b7acf-601e-0016-4959-59eef5000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxL3N1YmRpci88L1ByZWZpeD48TWF4UmVzdWx0cz4xMDAwPC9NYXhSZXN1bHRzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxCbG9icz48QmxvYj48TmFtZT5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxL3N1YmRpci9jLnR4dDwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VGMDdDODM3QjwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PEJsb2I+PE5hbWU+YmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMS9zdWJkaXIvZC50eHQ8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjA3RTU4OTQ8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjwvQmxvYnM+PE5leHRNYXJrZXIgLz48L0VudW1lcmF0aW9uUmVzdWx0cz4=" } }, { "ID": "e3de61ad957e5fae", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=%2F\u0026maxresults=1000\u0026prefix=blob-for-delimiters-%2Fdir2%2F\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:11 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "c17b7adc-601e-0016-5559-59eef5000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIyLzwvUHJlZml4PjxNYXhSZXN1bHRzPjEwMDA8L01heFJlc3VsdHM+PERlbGltaXRlcj4vPC9EZWxpbWl0ZXI+PEJsb2JzPjxCbG9iPjxOYW1lPmJsb2ItZm9yLWRlbGltaXRlcnMtL2RpcjIvZS50eHQ8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNSBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+VGh1LCAxMiBPY3QgMjAyMyAxNzo0MjowNSBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4REJDQjRBOENCNDRCODQ8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjwvQmxvYnM+PE5leHRNYXJrZXIgLz48L0VudW1lcmF0aW9uUmVzdWx0cz4=" } }, { "ID": "baa8109db5a7850b", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=%2F\u0026maxresults=1\u0026prefix=blob-for-delimiters-%2F\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:11 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "c17b7af5-601e-0016-6c59-59eef5000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLS88L1ByZWZpeD48TWF4UmVzdWx0cz4xPC9NYXhSZXN1bHRzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxCbG9icz48QmxvYlByZWZpeD48TmFtZT5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxLzwvTmFtZT48L0Jsb2JQcmVmaXg+PC9CbG9icz48TmV4dE1hcmtlcj4yITEwMCFNREF3TURNeElXSnNiMkl0Wm05eUxXUmxiR2x0YVhSbGNuTXRMMlJwY2pJdlpTNTBlSFFoTURBd01ESTRJVGs1T1RrdE1USXRNekZVTWpNNk5UazZOVGt1T1RrNU9UazVPVm9oPC9OZXh0TWFya2VyPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "fb4c12839d43d00b", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=%2F\u0026marker=2%21100%21MDAwMDMxIWJsb2ItZm9yLWRlbGltaXRlcnMtL2RpcjIvZS50eHQhMDAwMDI4ITk5OTktMTItMzFUMjM6NTk6NTkuOTk5OTk5OVoh\u0026maxresults=1\u0026prefix=blob-for-delimiters-%2F\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:11 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "c17b7b0c-601e-0016-0259-59eef5000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLS88L1ByZWZpeD48TWFya2VyPjIhMTAwIU1EQXdNRE14SVdKc2IySXRabTl5TFdSbGJHbHRhWFJsY25NdEwyUnBjakl2WlM1MGVIUWhNREF3TURJNElUazVPVGt0TVRJdE16RlVNak02TlRrNk5Ua3VPVGs1T1RrNU9Wb2g8L01hcmtlcj48TWF4UmVzdWx0cz4xPC9NYXhSZXN1bHRzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxCbG9icz48QmxvYlByZWZpeD48TmFtZT5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIyLzwvTmFtZT48L0Jsb2JQcmVmaXg+PC9CbG9icz48TmV4dE1hcmtlcj4yITk2IU1EQXdNREkySVdKc2IySXRabTl5TFdSbGJHbHRhWFJsY25NdEwyWXVkSGgwSVRBd01EQXlPQ0U1T1RrNUxURXlMVE14VkRJek9qVTVPalU1TGprNU9UazVPVGxhSVEtLTwvTmV4dE1hcmtlcj48L0VudW1lcmF0aW9uUmVzdWx0cz4=" } }, { "ID": "845e564e7b29aa76", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=%2F\u0026marker=2%2196%21MDAwMDI2IWJsb2ItZm9yLWRlbGltaXRlcnMtL2YudHh0ITAwMDAyOCE5OTk5LTEyLTMxVDIzOjU5OjU5Ljk5OTk5OTlaIQ--\u0026maxresults=1\u0026prefix=blob-for-delimiters-%2F\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:11 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "c17b7b1b-601e-0016-1059-59eef5000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLS88L1ByZWZpeD48TWFya2VyPjIhOTYhTURBd01ESTJJV0pzYjJJdFptOXlMV1JsYkdsdGFYUmxjbk10TDJZdWRIaDBJVEF3TURBeU9DRTVPVGs1TFRFeUxUTXhWREl6T2pVNU9qVTVMams1T1RrNU9UbGFJUS0tPC9NYXJrZXI+PE1heFJlc3VsdHM+MTwvTWF4UmVzdWx0cz48RGVsaW1pdGVyPi88L0RlbGltaXRlcj48QmxvYnM+PEJsb2I+PE5hbWU+YmxvYi1mb3ItZGVsaW1pdGVycy0vZi50eHQ8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjA4MkVENDY8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjwvQmxvYnM+PE5leHRNYXJrZXIgLz48L0VudW1lcmF0aW9uUmVzdWx0cz4=" } }, { "ID": "00c29831bbd08e7b", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-delimiters-%2Fdir2%2Fe.txt", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:11 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "c17b7b2d-601e-0016-2259-59eef5000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "e528d9d805315d1b", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=%2F\u0026maxresults=1000\u0026prefix=blob-for-delimiters-%2F\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:11 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "c17b7b47-601e-0016-3a59-59eef5000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLS88L1ByZWZpeD48TWF4UmVzdWx0cz4xMDAwPC9NYXhSZXN1bHRzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxCbG9icz48QmxvYlByZWZpeD48TmFtZT5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxLzwvTmFtZT48L0Jsb2JQcmVmaXg+PEJsb2I+PE5hbWU+YmxvYi1mb3ItZGVsaW1pdGVycy0vZi50eHQ8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjA4MkVENDY8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjwvQmxvYnM+PE5leHRNYXJrZXIgLz48L0VudW1lcmF0aW9uUmVzdWx0cz4=" } }, { "ID": "ac75c45026b0c6b3", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-delimiters-%2Fdir2%2Fe.txt", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "5" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Date": [ "Wed, 07 Feb 2024 00:06:11 GMT" ], "Etag": [ "\"0x8DC27709865E443\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:12 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "V0JSBnCFdzM=" ], "X-Ms-Request-Id": [ "c17b7b57-601e-0016-4a59-59eef5000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestListWeirdKeys.replay ================================================ { "Initial": "AQAAAA7dVMB0C0xodwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "cc397d3369d5480f", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026maxresults=1000\u0026prefix=list-weirdkeys-\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:11 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "e84baa26-201e-005a-5b59-597ec5000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5saXN0LXdlaXJka2V5cy08L1ByZWZpeD48TWF4UmVzdWx0cz4xMDAwPC9NYXhSZXN1bHRzPjxCbG9icz48QmxvYj48TmFtZT5saXN0LXdlaXJka2V5cy0gISIjJCUmYW1wOycoKSorLC0uX18weDJmX188L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjA1QzRCNkI8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmxpc3Qtd2VpcmRrZXlzLS4uX18weDJmX19mb28vLi5fXzB4MmZfX2Jhci8uLl9fMHgyZl9fLi5fXzB4MmZfX2Jhei4uX18weDJmX188L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjA1OUQ5Rjk8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmxpc3Qtd2VpcmRrZXlzLS4uX18weDVjX19mb29fXzB4NWNfXy4uX18weDVjX19iYXJfXzB4NWNfXy4uX18weDVjX18uLl9fMHg1Y19fYmF6Li5fXzB4NWNfXzwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIxIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIxIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VGMDM1ODI4NjwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PEJsb2I+PE5hbWU+bGlzdC13ZWlyZGtleXMtLi5fXzB4NWNfX2Zvb19fMHg1Y19fX18weDVjX19iYXJfXzB4NWNfX19fMHg1Y19fX18weDVjX19iYXo8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMSBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMSBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjA0NjRFNzA8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmxpc3Qtd2VpcmRrZXlzLTEyMzQ1PC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUYwMzlDOTA5PC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5saXN0LXdlaXJka2V5cy06OyZsdDs9Jmd0Oz88L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjA1NTQ1NEM8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmxpc3Qtd2VpcmRrZXlzLUA8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMSBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMSBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjAzQkVDNEM8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmxpc3Qtd2VpcmRrZXlzLVtfXzB4NWNfX11eXzwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VGMDYzMDM2QzwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PEJsb2I+PE5hbWU+bGlzdC13ZWlyZGtleXMtX18weDBfX19fMHgxX19fXzB4Ml9fX18weDNfX19fMHg0X19fXzB4NV9fX18weDZfX19fMHg3X19fXzB4OF9fX18weDlfX19fMHhhX19fXzB4Yl9fX18weGNfX19fMHhkX19fXzB4ZV9fX18weGZfXzwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VGMDY1NzREQTwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PEJsb2I+PE5hbWU+bGlzdC13ZWlyZGtleXMtX18weDEwX19fXzB4MTFfX19fMHgxMl9fX18weDEzX19fXzB4MTRfX19fMHgxNV9fX18weDE2X19fXzB4MTdfX19fMHgxOF9fX18weDE5X19fXzB4MWFfX19fMHgxYl9fX18weDFjX19fXzB4MWRfX19fMHgxZV9fX18weDFmX188L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjA2N0JGMzQ8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmxpc3Qtd2VpcmRrZXlzLWA8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMSBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMSBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjAzRTVEQkU8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmxpc3Qtd2VpcmRrZXlzLWZvbyBiYXIgYmF6PC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUYwNkM1M0U5PC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5saXN0LXdlaXJka2V5cy1mb28iYmFyImJhejwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIxIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIxIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VGMDM3N0VBRTwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PEJsb2I+PE5hbWU+bGlzdC13ZWlyZGtleXMtZm9vLy9iYXIvLy9iYXo8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMSBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMSBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjA0MkYyNzg8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmxpc3Qtd2VpcmRrZXlzLWZvby9iYXIvYmF6PC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUYwNTdCNkJBPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5saXN0LXdlaXJka2V5cy1mb29fXzB4NWNfX2Jhcl9fMHg1Y19fYmF6PC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUYwNkEzMEE2PC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5saXN0LXdlaXJka2V5cy17fH1+X18weDdmX188L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMSBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMSBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjA0MDgxMDI8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmxpc3Qtd2VpcmRrZXlzLeKYuuKYuuKYujwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VGMDRENTQ5NzwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PC9CbG9icz48TmV4dE1hcmtlciAvPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "61fe7d459ebe5b08", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026maxresults=1000\u0026prefix=list-weirdkeys-\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:11 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "e84baa42-201e-005a-7259-597ec5000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5saXN0LXdlaXJka2V5cy08L1ByZWZpeD48TWF4UmVzdWx0cz4xMDAwPC9NYXhSZXN1bHRzPjxCbG9icz48QmxvYj48TmFtZT5saXN0LXdlaXJka2V5cy0gISIjJCUmYW1wOycoKSorLC0uX18weDJmX188L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjA1QzRCNkI8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmxpc3Qtd2VpcmRrZXlzLS4uX18weDJmX19mb28vLi5fXzB4MmZfX2Jhci8uLl9fMHgyZl9fLi5fXzB4MmZfX2Jhei4uX18weDJmX188L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjA1OUQ5Rjk8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmxpc3Qtd2VpcmRrZXlzLS4uX18weDVjX19mb29fXzB4NWNfXy4uX18weDVjX19iYXJfXzB4NWNfXy4uX18weDVjX18uLl9fMHg1Y19fYmF6Li5fXzB4NWNfXzwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIxIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIxIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VGMDM1ODI4NjwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PEJsb2I+PE5hbWU+bGlzdC13ZWlyZGtleXMtLi5fXzB4NWNfX2Zvb19fMHg1Y19fX18weDVjX19iYXJfXzB4NWNfX19fMHg1Y19fX18weDVjX19iYXo8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMSBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMSBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjA0NjRFNzA8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmxpc3Qtd2VpcmRrZXlzLTEyMzQ1PC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUYwMzlDOTA5PC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5saXN0LXdlaXJka2V5cy06OyZsdDs9Jmd0Oz88L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjA1NTQ1NEM8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmxpc3Qtd2VpcmRrZXlzLUA8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMSBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMSBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjAzQkVDNEM8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmxpc3Qtd2VpcmRrZXlzLVtfXzB4NWNfX11eXzwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VGMDYzMDM2QzwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PEJsb2I+PE5hbWU+bGlzdC13ZWlyZGtleXMtX18weDBfX19fMHgxX19fXzB4Ml9fX18weDNfX19fMHg0X19fXzB4NV9fX18weDZfX19fMHg3X19fXzB4OF9fX18weDlfX19fMHhhX19fXzB4Yl9fX18weGNfX19fMHhkX19fXzB4ZV9fX18weGZfXzwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VGMDY1NzREQTwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PEJsb2I+PE5hbWU+bGlzdC13ZWlyZGtleXMtX18weDEwX19fXzB4MTFfX19fMHgxMl9fX18weDEzX19fXzB4MTRfX19fMHgxNV9fX18weDE2X19fXzB4MTdfX19fMHgxOF9fX18weDE5X19fXzB4MWFfX19fMHgxYl9fX18weDFjX19fXzB4MWRfX19fMHgxZV9fX18weDFmX188L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMiBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjA2N0JGMzQ8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmxpc3Qtd2VpcmRrZXlzLWA8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMSBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMSBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjAzRTVEQkU8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmxpc3Qtd2VpcmRrZXlzLWZvbyBiYXIgYmF6PC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUYwNkM1M0U5PC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5saXN0LXdlaXJka2V5cy1mb28iYmFyImJhejwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIxIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIxIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VGMDM3N0VBRTwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PEJsb2I+PE5hbWU+bGlzdC13ZWlyZGtleXMtZm9vLy9iYXIvLy9iYXo8L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMSBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMSBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjA0MkYyNzg8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmxpc3Qtd2VpcmRrZXlzLWZvby9iYXIvYmF6PC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUYwNTdCNkJBPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5saXN0LXdlaXJka2V5cy1mb29fXzB4NWNfX2Jhcl9fMHg1Y19fYmF6PC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjIgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OEQ3MDkzRUYwNkEzMEE2PC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48Q29udGVudC1UeXBlPnRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTg8L0NvbnRlbnQtVHlwZT48Q29udGVudC1FbmNvZGluZyAvPjxDb250ZW50LUxhbmd1YWdlIC8+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+WFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbCAvPjxDb250ZW50LURpc3Bvc2l0aW9uIC8+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48QmxvYj48TmFtZT5saXN0LXdlaXJka2V5cy17fH1+X18weDdmX188L05hbWU+PFByb3BlcnRpZXM+PENyZWF0aW9uLVRpbWU+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMSBHTVQ8L0NyZWF0aW9uLVRpbWU+PExhc3QtTW9kaWZpZWQ+TW9uLCAxNSBKdWwgMjAxOSAxNjoxMDoyMSBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+MHg4RDcwOTNFRjA0MDgxMDI8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxDb250ZW50LVR5cGU+dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODwvQ29udGVudC1UeXBlPjxDb250ZW50LUVuY29kaW5nIC8+PENvbnRlbnQtTGFuZ3VhZ2UgLz48Q29udGVudC1DUkM2NCAvPjxDb250ZW50LU1ENT5YVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT08L0NvbnRlbnQtTUQ1PjxDYWNoZS1Db250cm9sIC8+PENvbnRlbnQtRGlzcG9zaXRpb24gLz48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48QWNjZXNzVGllcj5Ib3Q8L0FjY2Vzc1RpZXI+PEFjY2Vzc1RpZXJJbmZlcnJlZD50cnVlPC9BY2Nlc3NUaWVySW5mZXJyZWQ+PExlYXNlU3RhdHVzPnVubG9ja2VkPC9MZWFzZVN0YXR1cz48TGVhc2VTdGF0ZT5hdmFpbGFibGU8L0xlYXNlU3RhdGU+PFNlcnZlckVuY3J5cHRlZD50cnVlPC9TZXJ2ZXJFbmNyeXB0ZWQ+PC9Qcm9wZXJ0aWVzPjxPck1ldGFkYXRhIC8+PC9CbG9iPjxCbG9iPjxOYW1lPmxpc3Qtd2VpcmRrZXlzLeKYuuKYuuKYujwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5Nb24sIDE1IEp1bCAyMDE5IDE2OjEwOjIyIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhENzA5M0VGMDRENTQ5NzwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PC9CbG9icz48TmV4dE1hcmtlciAvPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestMD5.replay ================================================ { "Initial": "AQAAAA7dVMCjKbU2hQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "d68b9089fa7b7326", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-md5-aaa", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "5" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Etag": [ "\"0x8DC2770B47DAF4D\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "V0JSBnCFdzM=" ], "X-Ms-Request-Id": [ "cb8ddf44-301e-0024-6059-59ee82000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "d5cf6a585ab5315c", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-md5-bbb", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "7" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "afqrYmg1ApVVDefVh7wyPQ==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "Z29vZGJ5ZQ==" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "afqrYmg1ApVVDefVh7wyPQ==" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Etag": [ "\"0x8DC2770B4815838\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "QEUKcRXwUQA=" ], "X-Ms-Request-Id": [ "cb8ddf50-301e-0024-6b59-59ee82000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "49526966c47aca19", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-md5-aaa", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Etag": [ "\"0x8DC2770B47DAF4D\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "cb8ddf5c-301e-0024-7559-59ee82000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "72322ef6b167c73a", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-md5-bbb", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "7" ], "Content-Md5": [ "afqrYmg1ApVVDefVh7wyPQ==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Etag": [ "\"0x8DC2770B4815838\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "cb8ddf64-301e-0024-7c59-59ee82000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "6120aa89f6ddc39d", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026maxresults=1000\u0026prefix=blob-for-md5-\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "cb8ddf6e-301e-0024-0659-59ee82000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PFByZWZpeD5ibG9iLWZvci1tZDUtPC9QcmVmaXg+PE1heFJlc3VsdHM+MTAwMDwvTWF4UmVzdWx0cz48QmxvYnM+PEJsb2I+PE5hbWU+YmxvYi1mb3ItbWQ1LWFhYTwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5XZWQsIDA3IEZlYiAyMDI0IDAwOjA2OjU5IEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5XZWQsIDA3IEZlYiAyMDI0IDAwOjA2OjU5IEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhEQzI3NzBCNDdEQUY0RDwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PEJsb2I+PE5hbWU+YmxvYi1mb3ItbWQ1LWJiYjwvTmFtZT48UHJvcGVydGllcz48Q3JlYXRpb24tVGltZT5XZWQsIDA3IEZlYiAyMDI0IDAwOjA2OjU5IEdNVDwvQ3JlYXRpb24tVGltZT48TGFzdC1Nb2RpZmllZD5XZWQsIDA3IEZlYiAyMDI0IDAwOjA2OjU5IEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4weDhEQzI3NzBCNDgxNTgzODwvRXRhZz48Q29udGVudC1MZW5ndGg+NzwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04PC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2RpbmcgLz48Q29udGVudC1MYW5ndWFnZSAvPjxDb250ZW50LUNSQzY0IC8+PENvbnRlbnQtTUQ1PmFmcXJZbWcxQXBWVkRlZlZoN3d5UFE9PTwvQ29udGVudC1NRDU+PENhY2hlLUNvbnRyb2wgLz48Q29udGVudC1EaXNwb3NpdGlvbiAvPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjxBY2Nlc3NUaWVyPkhvdDwvQWNjZXNzVGllcj48QWNjZXNzVGllckluZmVycmVkPnRydWU8L0FjY2Vzc1RpZXJJbmZlcnJlZD48TGVhc2VTdGF0dXM+dW5sb2NrZWQ8L0xlYXNlU3RhdHVzPjxMZWFzZVN0YXRlPmF2YWlsYWJsZTwvTGVhc2VTdGF0ZT48U2VydmVyRW5jcnlwdGVkPnRydWU8L1NlcnZlckVuY3J5cHRlZD48L1Byb3BlcnRpZXM+PE9yTWV0YWRhdGEgLz48L0Jsb2I+PC9CbG9icz48TmV4dE1hcmtlciAvPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } }, { "ID": "3662c96729012fac", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-md5-bbb", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "cb8ddf7c-301e-0024-1459-59ee82000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "96c9cc77263dc4b0", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-md5-aaa", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "cb8ddf90-301e-0024-2759-59ee82000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestMetadata/duplicate_case-insensitive_key_fails.replay ================================================ { "Initial": "AQAAAA7dVMCjCuQd1QAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": null } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestMetadata/empty.replay ================================================ { "Initial": "AQAAAA7dVMCjA0D66gAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "538969556364df4e", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-metadata", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "5" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Etag": [ "\"0x8DC2770B41B7952\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "V0JSBnCFdzM=" ], "X-Ms-Request-Id": [ "163de19b-201e-0007-7759-597441000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "82bbea8250fde130", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-metadata", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Etag": [ "\"0x8DC2770B41B7952\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "163de1a6-201e-0007-0159-597441000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "5545d636d50a293d", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-metadata", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "163de1ab-201e-0007-0559-597441000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestMetadata/empty_key_fails.replay ================================================ { "Initial": "AQAAAA7dVMCjCtuhkQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": null } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestMetadata/non-utf8_metadata_key.replay ================================================ { "Initial": "AQAAAA7dVMCjKaZQTQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": null } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestMetadata/non-utf8_metadata_value.replay ================================================ { "Initial": "AQAAAA7dVMCjKa5f2wAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": null } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestMetadata/valid_metadata.replay ================================================ { "Initial": "AQAAAA7dVMCjCusDiQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "14a632549ed0996c", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-metadata", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "5" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Meta-Key_a": [ "value-a" ], "X-Ms-Meta-Key_b": [ "value-b" ], "X-Ms-Meta-Key_c": [ "vAlUe-c" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Date": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Etag": [ "\"0x8DC2770B42E3B52\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "V0JSBnCFdzM=" ], "X-Ms-Request-Id": [ "5b142a43-b01e-0077-4a59-59cdb6000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "83745ed21f469704", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-metadata", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Etag": [ "\"0x8DC2770B42E3B52\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Meta-Key_a": [ "value-a" ], "X-Ms-Meta-Key_b": [ "value-b" ], "X-Ms-Meta-Key_c": [ "vAlUe-c" ], "X-Ms-Request-Id": [ "5b142a4b-b01e-0077-4f59-59cdb6000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "9dc63b97316be1e7", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-metadata", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "5b142a4e-b01e-0077-5159-59cdb6000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestMetadata/valid_metadata_with_content_type.replay ================================================ { "Initial": "AQAAAA7dVMCjGv36sAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "808ec749314c1abb", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-metadata", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "5" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "X-Ms-Blob-Content-Type": [ "text/plain" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Meta-Foo": [ "bar" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Date": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Etag": [ "\"0x8DC2770B4578F45\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "V0JSBnCFdzM=" ], "X-Ms-Request-Id": [ "325adfed-201e-0081-0659-59b8f8000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "62a3132af30e93c1", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-metadata", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain" ], "Date": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Etag": [ "\"0x8DC2770B4578F45\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Meta-Foo": [ "bar" ], "X-Ms-Request-Id": [ "325ae000-201e-0081-1759-59b8f8000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "8bca071c9242e900", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-metadata", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "325ae00f-201e-0081-2559-59b8f8000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestMetadata/valid_metadata_with_empty_body.replay ================================================ { "Initial": "AQAAAA7dVMCjEj8FlAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "cfd3d7c0b0604059", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-metadata", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "5" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Meta-Foo": [ "bar" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Etag": [ "\"0x8DC2770B4414B52\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "V0JSBnCFdzM=" ], "X-Ms-Request-Id": [ "c1fcce93-901e-002d-1e59-59ab51000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "d5ef5dbb8a6903e9", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-metadata", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Etag": [ "\"0x8DC2770B4414B52\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Meta-Foo": [ "bar" ], "X-Ms-Request-Id": [ "c1fcceab-901e-002d-3259-59ab51000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "c83b3f4f6971546f", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-metadata", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "c1fcceb6-901e-002d-3b59-59ab51000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestMetadata/weird_metadata_keys.replay ================================================ { "Initial": "AQAAAA7dVMCjIkG4AgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "e9e2685baec724b4", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-metadata", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "5" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Meta-Foo__0x20__bar__0x20__baz": [ "foo%20bar%20baz" ], "X-Ms-Meta-Foo__0x22__bar__0x22__baz": [ "foo%22bar%22baz" ], "X-Ms-Meta-Foo__0x2f____0x2f__bar__0x2f____0x2f____0x2f__baz": [ "foo%2F%2Fbar%2F%2F%2Fbaz" ], "X-Ms-Meta-Foo__0x2f__bar__0x2f__baz": [ "foo%2Fbar%2Fbaz" ], "X-Ms-Meta-Foo__0x5c__bar__0x5c__baz": [ "foo%5Cbar%5Cbaz" ], "X-Ms-Meta-__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__": [ "%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F" ], "X-Ms-Meta-__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__": [ "%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F" ], "X-Ms-Meta-__0x20____0x21____0x22____0x23____0x24____0x25____0x26____0x27____0x28____0x29____0x2a____0x2b____0x2c____0x2d____0x2e____0x2f__": [ "%20%21%22%23$%25\u0026%27%28%29%2A+%2C-.%2F" ], "X-Ms-Meta-__0x263a____0x263a____0x263a__": [ "%E2%98%BA%E2%98%BA%E2%98%BA" ], "X-Ms-Meta-__0x2e____0x2e____0x2f__foo__0x2f____0x2e____0x2e____0x2f__bar__0x2f____0x2e____0x2e____0x2f____0x2e____0x2e____0x2f__baz__0x2e____0x2e____0x2f__": [ "..%2Ffoo%2F..%2Fbar%2F..%2F..%2Fbaz..%2F" ], "X-Ms-Meta-__0x2e____0x2e____0x5c__foo__0x5c____0x2e____0x2e____0x5c__bar__0x5c____0x2e____0x2e____0x5c____0x2e____0x2e____0x5c__baz__0x2e____0x2e____0x5c__": [ "..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C" ], "X-Ms-Meta-__0x2e____0x2e____0x5c__foo__0x5c____0x5c__bar__0x5c____0x5c____0x5c__baz": [ "..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz" ], "X-Ms-Meta-__0x31__2345": [ "12345" ], "X-Ms-Meta-__0x3a____0x3b____0x3c____0x3d____0x3e____0x3f__": [ ":%3B%3C=%3E%3F" ], "X-Ms-Meta-__0x40__": [ "@" ], "X-Ms-Meta-__0x5b____0x5c____0x5d____0x5e___": [ "%5B%5C%5D%5E_" ], "X-Ms-Meta-__0x60__": [ "%60" ], "X-Ms-Meta-__0x7b____0x7c____0x7d____0x7e____0x7f__": [ "%7B%7C%7D~%7F" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Date": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Etag": [ "\"0x8DC2770B46A2A2A\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "V0JSBnCFdzM=" ], "X-Ms-Request-Id": [ "5daca777-c01e-0052-7a59-5964ca000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "3548e93a704cf317", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-metadata", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Etag": [ "\"0x8DC2770B46A2A2A\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Meta-Foo__0x20__bar__0x20__baz": [ "foo%20bar%20baz" ], "X-Ms-Meta-Foo__0x22__bar__0x22__baz": [ "foo%22bar%22baz" ], "X-Ms-Meta-Foo__0x2f____0x2f__bar__0x2f____0x2f____0x2f__baz": [ "foo%2F%2Fbar%2F%2F%2Fbaz" ], "X-Ms-Meta-Foo__0x2f__bar__0x2f__baz": [ "foo%2Fbar%2Fbaz" ], "X-Ms-Meta-Foo__0x5c__bar__0x5c__baz": [ "foo%5Cbar%5Cbaz" ], "X-Ms-Meta-__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__": [ "%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F" ], "X-Ms-Meta-__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__": [ "%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F" ], "X-Ms-Meta-__0x20____0x21____0x22____0x23____0x24____0x25____0x26____0x27____0x28____0x29____0x2a____0x2b____0x2c____0x2d____0x2e____0x2f__": [ "%20%21%22%23$%25\u0026%27%28%29%2A+%2C-.%2F" ], "X-Ms-Meta-__0x263a____0x263a____0x263a__": [ "%E2%98%BA%E2%98%BA%E2%98%BA" ], "X-Ms-Meta-__0x2e____0x2e____0x2f__foo__0x2f____0x2e____0x2e____0x2f__bar__0x2f____0x2e____0x2e____0x2f____0x2e____0x2e____0x2f__baz__0x2e____0x2e____0x2f__": [ "..%2Ffoo%2F..%2Fbar%2F..%2F..%2Fbaz..%2F" ], "X-Ms-Meta-__0x2e____0x2e____0x5c__foo__0x5c____0x2e____0x2e____0x5c__bar__0x5c____0x2e____0x2e____0x5c____0x2e____0x2e____0x5c__baz__0x2e____0x2e____0x5c__": [ "..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C" ], "X-Ms-Meta-__0x2e____0x2e____0x5c__foo__0x5c____0x5c__bar__0x5c____0x5c____0x5c__baz": [ "..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz" ], "X-Ms-Meta-__0x31__2345": [ "12345" ], "X-Ms-Meta-__0x3a____0x3b____0x3c____0x3d____0x3e____0x3f__": [ ":%3B%3C=%3E%3F" ], "X-Ms-Meta-__0x40__": [ "@" ], "X-Ms-Meta-__0x5b____0x5c____0x5d____0x5e___": [ "%5B%5C%5D%5E_" ], "X-Ms-Meta-__0x60__": [ "%60" ], "X-Ms-Meta-__0x7b____0x7c____0x7d____0x7e____0x7f__": [ "%7B%7C%7D~%7F" ], "X-Ms-Request-Id": [ "5daca780-c01e-0052-0159-5964ca000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "97be359fd9584124", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-metadata", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "5daca78b-c01e-0052-0a59-5964ca000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestNonexistentBucket.replay ================================================ { "Initial": "AQAAAA7dVMByLQxiIwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "a5186170b1dcffac", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/bucket-does-not-exist?comp=list\u0026delimiter=\u0026maxresults=1\u0026prefix=\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "225" ], "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:10 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Error-Code": [ "ContainerNotFound" ], "X-Ms-Request-Id": [ "0bdde196-d01e-002c-7a59-59f48d000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RXJyb3I+PENvZGU+Q29udGFpbmVyTm90Rm91bmQ8L0NvZGU+PE1lc3NhZ2U+VGhlIHNwZWNpZmllZCBjb250YWluZXIgZG9lcyBub3QgZXhpc3QuClJlcXVlc3RJZDowYmRkZTE5Ni1kMDFlLTAwMmMtN2E1OS01OWY0OGQwMDAwMDAKVGltZToyMDI0LTAyLTA3VDAwOjA2OjEwLjk5MDMwOTdaPC9NZXNzYWdlPjwvRXJyb3I+" } }, { "ID": "f4f7f71e382d586f", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket?comp=list\u0026delimiter=\u0026maxresults=1\u0026prefix=\u0026restype=container", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:10 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "0bdde1b0-d01e-002c-1159-59f48d000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW51bWVyYXRpb25SZXN1bHRzIFNlcnZpY2VFbmRwb2ludD0iaHR0cHM6Ly9nb2Nsb3VkYmxvYnRlc3RzLmJsb2IuY29yZS53aW5kb3dzLm5ldC8iIENvbnRhaW5lck5hbWU9ImdvLWNsb3VkLWJ1Y2tldCI+PE1heFJlc3VsdHM+MTwvTWF4UmVzdWx0cz48QmxvYnM+PEJsb2I+PE5hbWU+YmxvYi1mb3ItY29weWluZy1kZXN0PC9OYW1lPjxQcm9wZXJ0aWVzPjxDcmVhdGlvbi1UaW1lPk1vbiwgMTUgSnVsIDIwMTkgMTY6MTA6MjcgR01UPC9DcmVhdGlvbi1UaW1lPjxMYXN0LU1vZGlmaWVkPlRodSwgMTIgT2N0IDIwMjMgMTc6NDI6MTEgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPjB4OERCQ0I0QTkwQTRBMUUwPC9FdGFnPjxDb250ZW50LUxlbmd0aD4xMTwvQ29udGVudC1MZW5ndGg+PENvbnRlbnQtVHlwZT50ZXh0L3BsYWluPC9Db250ZW50LVR5cGU+PENvbnRlbnQtRW5jb2Rpbmc+aWRlbnRpdHk8L0NvbnRlbnQtRW5jb2Rpbmc+PENvbnRlbnQtTGFuZ3VhZ2U+ZW48L0NvbnRlbnQtTGFuZ3VhZ2U+PENvbnRlbnQtQ1JDNjQgLz48Q29udGVudC1NRDU+c1FxTnNXVGdkVUVGdDZtYjV5NC81UT09PC9Db250ZW50LU1ENT48Q2FjaGUtQ29udHJvbD5uby1jYWNoZTwvQ2FjaGUtQ29udHJvbD48Q29udGVudC1EaXNwb3NpdGlvbj5pbmxpbmU8L0NvbnRlbnQtRGlzcG9zaXRpb24+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PEFjY2Vzc1RpZXI+SG90PC9BY2Nlc3NUaWVyPjxBY2Nlc3NUaWVySW5mZXJyZWQ+dHJ1ZTwvQWNjZXNzVGllckluZmVycmVkPjxMZWFzZVN0YXR1cz51bmxvY2tlZDwvTGVhc2VTdGF0dXM+PExlYXNlU3RhdGU+YXZhaWxhYmxlPC9MZWFzZVN0YXRlPjxTZXJ2ZXJFbmNyeXB0ZWQ+dHJ1ZTwvU2VydmVyRW5jcnlwdGVkPjwvUHJvcGVydGllcz48T3JNZXRhZGF0YSAvPjwvQmxvYj48L0Jsb2JzPjxOZXh0TWFya2VyPjIhOTYhTURBd01ESTRJV0pzYjJJdFptOXlMV052Y0hscGJtY3RaR1Z6ZEMxbGVHbHpkSE1oTURBd01ESTRJVGs1T1RrdE1USXRNekZVTWpNNk5UazZOVGt1T1RrNU9UazVPVm9oPC9OZXh0TWFya2VyPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestRead/length_0_read.replay ================================================ { "Initial": "AQAAAA7dVMB2BGw6ZQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "2a1c696bbeb3f22c", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "27" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "YWJjZGVmZ2hpamtsbW5vcHF1cnN0dXZ3eHl6" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Etag": [ "\"0x8DC2770994BB5ED\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "CQSsryslIqA=" ], "X-Ms-Request-Id": [ "f08b50d0-701e-0047-7959-597379000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "1291b49a2fed1cec", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "27" ], "Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Etag": [ "\"0x8DC2770994BB5ED\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "f08b50d8-701e-0047-8059-597379000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "YWJjZGVmZ2hpamtsbW5vcHF1cnN0dXZ3eHl6" } }, { "ID": "d38c131c84b64379", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "27" ], "Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Etag": [ "\"0x8DC2770994BB5ED\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "f08b50e1-701e-0047-0859-597379000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "YWJjZGVmZ2hpamtsbW5vcHF1cnN0dXZ3eHl6" } }, { "ID": "0344a908def7e83e", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "f08b50e5-701e-0047-0c59-597379000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestRead/negative_offset_fails.replay ================================================ { "Initial": "AQAAAA7dVMB2BGHBpwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": null } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestRead/read_a_part_in_middle.replay ================================================ { "Initial": "AQAAAA7dVMB2GgYGrAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "faf3f1b58246ebac", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "27" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "YWJjZGVmZ2hpamtsbW5vcHF1cnN0dXZ3eHl6" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "Date": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Etag": [ "\"0x8DC277099822742\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "CQSsryslIqA=" ], "X-Ms-Request-Id": [ "bafe632c-701e-0057-7459-59b611000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "83ca26d9b305bcc7", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Range": [ "bytes=10-14" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Range": [ "bytes 10-14/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Etag": [ "\"0x8DC277099822742\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "bafe6331-701e-0057-7859-59b611000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "a2xtbm8=" } }, { "ID": "29abdccfde812ac8", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Range": [ "bytes=10-14" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Range": [ "bytes 10-14/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Etag": [ "\"0x8DC277099822742\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "bafe6336-701e-0057-7c59-59b611000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "a2xtbm8=" } }, { "ID": "d8fb09a689a26ae4", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Range": [ "bytes=14-14" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "1" ], "Content-Range": [ "bytes 14-14/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Etag": [ "\"0x8DC277099822742\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "bafe633c-701e-0057-0259-59b611000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "bw==" } }, { "ID": "9223cf8f46921c95", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Range": [ "bytes=14-14" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "1" ], "Content-Range": [ "bytes 14-14/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Etag": [ "\"0x8DC277099822742\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "bafe633d-701e-0057-0359-59b611000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "bw==" } }, { "ID": "943ca0f123fef95f", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Range": [ "bytes=12-14" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "3" ], "Content-Range": [ "bytes 12-14/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Etag": [ "\"0x8DC277099822742\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "bafe6340-701e-0057-0659-59b611000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "bW5v" } }, { "ID": "5bd0daf167cbf34c", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "bafe6343-701e-0057-0959-59b611000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestRead/read_from_positive_offset_to_end.replay ================================================ { "Initial": "AQAAAA7dVMB2Da12yQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "e9e9d838787ab93f", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "27" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "YWJjZGVmZ2hpamtsbW5vcHF1cnN0dXZ3eHl6" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Etag": [ "\"0x8DC27709963321F\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "CQSsryslIqA=" ], "X-Ms-Request-Id": [ "059081d3-501e-001d-2359-59159e000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "4be3b133d5e46337", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Range": [ "bytes=10-" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "17" ], "Content-Range": [ "bytes 10-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Etag": [ "\"0x8DC27709963321F\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "059081e8-501e-001d-3559-59159e000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "a2xtbm9wcXVyc3R1dnd4eXo=" } }, { "ID": "168276e417593df2", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Range": [ "bytes=10-" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "17" ], "Content-Range": [ "bytes 10-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Etag": [ "\"0x8DC27709963321F\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "059081f7-501e-001d-4259-59159e000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "a2xtbm9wcXVyc3R1dnd4eXo=" } }, { "ID": "c68d951e6cf56101", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Range": [ "bytes=22-" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Range": [ "bytes 22-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Etag": [ "\"0x8DC27709963321F\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "059081ff-501e-001d-4959-59159e000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "dnd4eXo=" } }, { "ID": "e24feb1d737d23ea", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Range": [ "bytes=22-" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "5" ], "Content-Range": [ "bytes 22-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Etag": [ "\"0x8DC27709963321F\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "05908205-501e-001d-4f59-59159e000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "dnd4eXo=" } }, { "ID": "1145b9238a4b22de", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Range": [ "bytes=16-" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "11" ], "Content-Range": [ "bytes 16-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Etag": [ "\"0x8DC27709963321F\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "0590820d-501e-001d-5659-59159e000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "cXVyc3R1dnd4eXo=" } }, { "ID": "e0e21c29bf88a43f", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "05908219-501e-001d-6059-59159e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestRead/read_in_full.replay ================================================ { "Initial": "AQAAAA7dVMB2JaSYeAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "49e383875779ecd2", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "27" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "YWJjZGVmZ2hpamtsbW5vcHF1cnN0dXZ3eHl6" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "Date": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Etag": [ "\"0x8DC277099A0CE54\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "CQSsryslIqA=" ], "X-Ms-Request-Id": [ "4fa5c117-601e-005b-6e59-592119000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "faf4151972d76f68", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "27" ], "Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Etag": [ "\"0x8DC277099A0CE54\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "4fa5c125-601e-005b-7b59-592119000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "YWJjZGVmZ2hpamtsbW5vcHF1cnN0dXZ3eHl6" } }, { "ID": "31b96b0df9c5845f", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "27" ], "Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Etag": [ "\"0x8DC277099A0CE54\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "4fa5c132-601e-005b-0559-592119000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "YWJjZGVmZ2hpamtsbW5vcHF1cnN0dXZ3eHl6" } }, { "ID": "e0a1a7fa0f80e5b8", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Range": [ "bytes=18-" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "9" ], "Content-Range": [ "bytes 18-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Etag": [ "\"0x8DC277099A0CE54\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "4fa5c13b-601e-005b-0e59-592119000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "cnN0dXZ3eHl6" } }, { "ID": "296f9643ee676df1", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Range": [ "bytes=18-" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "9" ], "Content-Range": [ "bytes 18-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Etag": [ "\"0x8DC277099A0CE54\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "4fa5c142-601e-005b-1559-592119000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "cnN0dXZ3eHl6" } }, { "ID": "e2b5ce9a0e803515", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Range": [ "bytes=9-" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "18" ], "Content-Range": [ "bytes 9-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Etag": [ "\"0x8DC277099A0CE54\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "4fa5c14b-601e-005b-1e59-592119000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "amtsbW5vcHF1cnN0dXZ3eHl6" } }, { "ID": "1224e53d1e3b3854", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "4fa5c152-601e-005b-2559-592119000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestRead/read_in_full_with_negative_length_not_-1.replay ================================================ { "Initial": "AQAAAA7dVMB2MhiqOgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "d0807eec7cb46206", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "27" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "YWJjZGVmZ2hpamtsbW5vcHF1cnN0dXZ3eHl6" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "Date": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Etag": [ "\"0x8DC277099C0FBDA\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "CQSsryslIqA=" ], "X-Ms-Request-Id": [ "df71ef24-f01e-0004-4159-599525000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "2cc626c6440cddf3", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "27" ], "Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Etag": [ "\"0x8DC277099C0FBDA\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "df71ef2b-f01e-0004-4759-599525000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "YWJjZGVmZ2hpamtsbW5vcHF1cnN0dXZ3eHl6" } }, { "ID": "66d6d1211a7fd2e8", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "27" ], "Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Etag": [ "\"0x8DC277099C0FBDA\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "df71ef33-f01e-0004-4e59-599525000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "YWJjZGVmZ2hpamtsbW5vcHF1cnN0dXZ3eHl6" } }, { "ID": "98cc9815bacd7597", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Range": [ "bytes=18-" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "9" ], "Content-Range": [ "bytes 18-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Etag": [ "\"0x8DC277099C0FBDA\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "df71ef3a-f01e-0004-5559-599525000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "cnN0dXZ3eHl6" } }, { "ID": "8395a07ccf0eedf7", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Range": [ "bytes=18-" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "9" ], "Content-Range": [ "bytes 18-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Etag": [ "\"0x8DC277099C0FBDA\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "df71ef42-f01e-0004-5b59-599525000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "cnN0dXZ3eHl6" } }, { "ID": "8d2d1868db803d67", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Range": [ "bytes=9-" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "18" ], "Content-Range": [ "bytes 9-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Etag": [ "\"0x8DC277099C0FBDA\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "df71ef47-f01e-0004-6059-599525000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "amtsbW5vcHF1cnN0dXZ3eHl6" } }, { "ID": "f9719f35870c1fe1", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "df71ef53-f01e-0004-6a59-599525000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestRead/read_of_nonexistent_key_fails.replay ================================================ { "Initial": "AQAAAA7dVMB1OCLMbQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "7bb0d73519f2bdbe", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "27" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "YWJjZGVmZ2hpamtsbW5vcHF1cnN0dXZ3eHl6" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Etag": [ "\"0x8DC27709937E2A9\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "CQSsryslIqA=" ], "X-Ms-Request-Id": [ "3d382368-001e-0000-4559-591822000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "8da06e4be9503f54", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/key-does-not-exist", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "215" ], "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Error-Code": [ "BlobNotFound" ], "X-Ms-Request-Id": [ "3d382370-001e-0000-4c59-591822000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RXJyb3I+PENvZGU+QmxvYk5vdEZvdW5kPC9Db2RlPjxNZXNzYWdlPlRoZSBzcGVjaWZpZWQgYmxvYiBkb2VzIG5vdCBleGlzdC4KUmVxdWVzdElkOjNkMzgyMzcwLTAwMWUtMDAwMC00YzU5LTU5MTgyMjAwMDAwMApUaW1lOjIwMjQtMDItMDdUMDA6MDY6MTQuMDM5MTczOVo8L01lc3NhZ2U+PC9FcnJvcj4=" } }, { "ID": "ea8bc12ff38fa675", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:13 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "3d382378-001e-0000-5359-591822000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestSignedURL.replay ================================================ { "Initial": "AQAAAA7dviK2JCzi3QAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "e88a3ea7a04f3ee1", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-signing?sp=r\u0026sr=b\u0026sv=2023-11-03", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "11" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Type": [ "BlockBlob" ] }, "MediaType": "", "BodyParts": [ "aGVsbG8gd29ybGQ=" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "279" ], "Content-Type": [ "application/xml" ], "Date": [ "Fri, 26 Apr 2024 22:33:25 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Error-Code": [ "AuthorizationPermissionMismatch" ], "X-Ms-Request-Id": [ "f1cf088c-801e-0021-3329-983c59000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RXJyb3I+PENvZGU+QXV0aG9yaXphdGlvblBlcm1pc3Npb25NaXNtYXRjaDwvQ29kZT48TWVzc2FnZT5UaGlzIHJlcXVlc3QgaXMgbm90IGF1dGhvcml6ZWQgdG8gcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiB1c2luZyB0aGlzIHBlcm1pc3Npb24uClJlcXVlc3RJZDpmMWNmMDg4Yy04MDFlLTAwMjEtMzMyOS05ODNjNTkwMDAwMDAKVGltZToyMDI0LTA0LTI2VDIyOjMzOjI2LjgzNTg3MzFaPC9NZXNzYWdlPjwvRXJyb3I+" } }, { "ID": "2cf85a49503197fa", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-signing?sp=d\u0026sr=b\u0026sv=2023-11-03", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "11" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Type": [ "BlockBlob" ] }, "MediaType": "", "BodyParts": [ "aGVsbG8gd29ybGQ=" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "279" ], "Content-Type": [ "application/xml" ], "Date": [ "Fri, 26 Apr 2024 22:33:25 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Error-Code": [ "AuthorizationPermissionMismatch" ], "X-Ms-Request-Id": [ "f1cf0893-801e-0021-3929-983c59000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RXJyb3I+PENvZGU+QXV0aG9yaXphdGlvblBlcm1pc3Npb25NaXNtYXRjaDwvQ29kZT48TWVzc2FnZT5UaGlzIHJlcXVlc3QgaXMgbm90IGF1dGhvcml6ZWQgdG8gcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiB1c2luZyB0aGlzIHBlcm1pc3Npb24uClJlcXVlc3RJZDpmMWNmMDg5My04MDFlLTAwMjEtMzkyOS05ODNjNTkwMDAwMDAKVGltZToyMDI0LTA0LTI2VDIyOjMzOjI2Ljg1NDk4NzdaPC9NZXNzYWdlPjwvRXJyb3I+" } }, { "ID": "d030a18fe2807069", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-signing?sp=cw\u0026sr=b\u0026sv=2023-11-03", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "11" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Type": [ "BlockBlob" ] }, "MediaType": "", "BodyParts": [ "aGVsbG8gd29ybGQ=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XrY7u+Ae7tCTyyK7j1rNww==" ], "Date": [ "Fri, 26 Apr 2024 22:33:25 GMT" ], "Etag": [ "\"0x8DC6640E3FD4193\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:26 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "vo7q9sPVKY0=" ], "X-Ms-Request-Id": [ "f1cf0897-801e-0021-3d29-983c59000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "aaed499f1908b08a", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-signing?sp=d\u0026sr=b\u0026sv=2023-11-03", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "279" ], "Content-Type": [ "application/xml" ], "Date": [ "Fri, 26 Apr 2024 22:33:26 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Error-Code": [ "AuthorizationPermissionMismatch" ], "X-Ms-Request-Id": [ "f1cf089d-801e-0021-4129-983c59000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RXJyb3I+PENvZGU+QXV0aG9yaXphdGlvblBlcm1pc3Npb25NaXNtYXRjaDwvQ29kZT48TWVzc2FnZT5UaGlzIHJlcXVlc3QgaXMgbm90IGF1dGhvcml6ZWQgdG8gcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiB1c2luZyB0aGlzIHBlcm1pc3Npb24uClJlcXVlc3RJZDpmMWNmMDg5ZC04MDFlLTAwMjEtNDEyOS05ODNjNTkwMDAwMDAKVGltZToyMDI0LTA0LTI2VDIyOjMzOjI2Ljg5Nzc4MTBaPC9NZXNzYWdlPjwvRXJyb3I+" } }, { "ID": "20e8106baa8c5e09", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-signing?sp=cw\u0026sr=b\u0026sv=2023-11-03", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "279" ], "Content-Type": [ "application/xml" ], "Date": [ "Fri, 26 Apr 2024 22:33:26 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Error-Code": [ "AuthorizationPermissionMismatch" ], "X-Ms-Request-Id": [ "f1cf08a3-801e-0021-4629-983c59000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RXJyb3I+PENvZGU+QXV0aG9yaXphdGlvblBlcm1pc3Npb25NaXNtYXRjaDwvQ29kZT48TWVzc2FnZT5UaGlzIHJlcXVlc3QgaXMgbm90IGF1dGhvcml6ZWQgdG8gcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiB1c2luZyB0aGlzIHBlcm1pc3Npb24uClJlcXVlc3RJZDpmMWNmMDhhMy04MDFlLTAwMjEtNDYyOS05ODNjNTkwMDAwMDAKVGltZToyMDI0LTA0LTI2VDIyOjMzOjI2LjkxNjEyNDhaPC9NZXNzYWdlPjwvRXJyb3I+" } }, { "ID": "71a4330d6c1b156a", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-signing", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "223" ], "Content-Type": [ "application/xml" ], "Date": [ "Fri, 26 Apr 2024 22:33:26 GMT" ], "Server": [ "Blob Service Version 1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Request-Id": [ "f1cf08a6-801e-0021-4929-983c59000000" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RXJyb3I+PENvZGU+UmVzb3VyY2VOb3RGb3VuZDwvQ29kZT48TWVzc2FnZT5UaGUgc3BlY2lmaWVkIHJlc291cmNlIGRvZXMgbm90IGV4aXN0LgpSZXF1ZXN0SWQ6ZjFjZjA4YTYtODAxZS0wMDIxLTQ5MjktOTgzYzU5MDAwMDAwClRpbWU6MjAyNC0wNC0yNlQyMjozMzoyNi45MzQyNTczWjwvTWVzc2FnZT48L0Vycm9yPg==" } }, { "ID": "5537485276eba0d8", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-signing?sp=r\u0026sr=b\u0026sv=2023-11-03", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "11" ], "Content-Md5": [ "XrY7u+Ae7tCTyyK7j1rNww==" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Fri, 26 Apr 2024 22:33:26 GMT" ], "Etag": [ "\"0x8DC6640E3FD4193\"" ], "Last-Modified": [ "Fri, 26 Apr 2024 22:33:26 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Fri, 26 Apr 2024 22:33:26 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "f1cf08a8-801e-0021-4b29-983c59000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8gd29ybGQ=" } }, { "ID": "8ac1ef3ac555f51d", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-signing?sp=r\u0026sr=b\u0026sv=2023-11-03", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "279" ], "Content-Type": [ "application/xml" ], "Date": [ "Fri, 26 Apr 2024 22:33:26 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Error-Code": [ "AuthorizationPermissionMismatch" ], "X-Ms-Request-Id": [ "f1cf08ab-801e-0021-4e29-983c59000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RXJyb3I+PENvZGU+QXV0aG9yaXphdGlvblBlcm1pc3Npb25NaXNtYXRjaDwvQ29kZT48TWVzc2FnZT5UaGlzIHJlcXVlc3QgaXMgbm90IGF1dGhvcml6ZWQgdG8gcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiB1c2luZyB0aGlzIHBlcm1pc3Npb24uClJlcXVlc3RJZDpmMWNmMDhhYi04MDFlLTAwMjEtNGUyOS05ODNjNTkwMDAwMDAKVGltZToyMDI0LTA0LTI2VDIyOjMzOjI2Ljk3MTM2NjJaPC9NZXNzYWdlPjwvRXJyb3I+" } }, { "ID": "2d4b51c22891c796", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-signing?sp=cw\u0026sr=b\u0026sv=2023-11-03", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "279" ], "Content-Type": [ "application/xml" ], "Date": [ "Fri, 26 Apr 2024 22:33:26 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Error-Code": [ "AuthorizationPermissionMismatch" ], "X-Ms-Request-Id": [ "f1cf08ae-801e-0021-5129-983c59000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RXJyb3I+PENvZGU+QXV0aG9yaXphdGlvblBlcm1pc3Npb25NaXNtYXRjaDwvQ29kZT48TWVzc2FnZT5UaGlzIHJlcXVlc3QgaXMgbm90IGF1dGhvcml6ZWQgdG8gcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiB1c2luZyB0aGlzIHBlcm1pc3Npb24uClJlcXVlc3RJZDpmMWNmMDhhZS04MDFlLTAwMjEtNTEyOS05ODNjNTkwMDAwMDAKVGltZToyMDI0LTA0LTI2VDIyOjMzOjI2Ljk4OTgxOTdaPC9NZXNzYWdlPjwvRXJyb3I+" } }, { "ID": "b94ff09b49f80ede", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-signing?sp=d\u0026sr=b\u0026sv=2023-11-03", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Fri, 26 Apr 2024 22:33:26 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "f1cf08b1-801e-0021-5429-983c59000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "4e194413626b0905", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-signing?sp=r\u0026sr=b\u0026sv=2023-11-03", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "215" ], "Content-Type": [ "application/xml" ], "Date": [ "Fri, 26 Apr 2024 22:33:26 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Error-Code": [ "BlobNotFound" ], "X-Ms-Request-Id": [ "f1cf08ba-801e-0021-5a29-983c59000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RXJyb3I+PENvZGU+QmxvYk5vdEZvdW5kPC9Db2RlPjxNZXNzYWdlPlRoZSBzcGVjaWZpZWQgYmxvYiBkb2VzIG5vdCBleGlzdC4KUmVxdWVzdElkOmYxY2YwOGJhLTgwMWUtMDAyMS01YTI5LTk4M2M1OTAwMDAwMApUaW1lOjIwMjQtMDQtMjZUMjI6MzM6MjcuMDI4OTQ3M1o8L01lc3NhZ2U+PC9FcnJvcj4=" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestUploadDownload.replay ================================================ { "Initial": "AQAAAA7dVMCiN511SAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "a1573b6ce9672d41", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-upload-download", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "11" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Type": [ "text" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "dXAgYW5kIGRvd24=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "G3VTPtWoaf9vOuAzbQwzIA==" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Etag": [ "\"0x8DC2770B4081B42\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "wOkxZJKwY/U=" ], "X-Ms-Request-Id": [ "3ca15839-a01e-0044-4059-59921d000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "9ed781a5d8e54025", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-upload-download", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "11" ], "Content-Md5": [ "G3VTPtWoaf9vOuAzbQwzIA==" ], "Content-Type": [ "text" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Etag": [ "\"0x8DC2770B4081B42\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "3ca1584b-a01e-0044-5059-59921d000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "dXAgYW5kIGRvd24=" } }, { "ID": "a1573b6ce9672d42", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-upload-download", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "11" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "G3VTPtWoaf9vOuAzbQwzIA==" ], "X-Ms-Blob-Content-Type": [ "text" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "dXAgYW5kIGRvd24=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "G3VTPtWoaf9vOuAzbQwzIA==" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Etag": [ "\"0x8DC2770B4081B42\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:59 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "wOkxZJKwY/U=" ], "X-Ms-Request-Id": [ "3ca15839-a01e-0044-4059-59921d000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "31399688c633573d", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-upload-download", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "3ca15857-a01e-0044-5a59-59921d000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "31399688c633573e", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-upload-download", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:58 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "3ca15857-a01e-0044-5a59-59921d000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestWrite/ContentType_is_discovered_if_not_provided.replay ================================================ { "Initial": "AQAAAA7dVMCMCZBfVAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "4625d8a3d67044cd", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "6354" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Type": [ "text/html; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "PCFET0NUWVBFIGh0bWw+PGh0bWwgbGFuZz0iZW4iPgo8aGVhZCBwcm9maWxlPSJodHRwOi8vYTkuY29tLy0vc3BlYy9vcGVuc2VhcmNoLzEuMS8iPgogIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgPGxpbmsgaHJlZj0iLy0vYm9vdHN0cmFwLm1pbi5jc3M/dj04YmVjMWJiYTNlMjNlY2JhMjJjZmZiMTk3YTJkNDQwYWY0MTBiMTVkIiByZWw9InN0eWxlc2hlZXQiPgogIDxsaW5rIGhyZWY9Ii8tL3NpdGUuY3NzP3Y9N2Q4MWY0MTA0Yzg5ZGJlMzc2MzQ1ZjZiZmUzZTYyYjRlNDBkM2QwNiIgcmVsPSJzdHlsZXNoZWV0Ij4KICA8dGl0bGU+R29Eb2M8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5Pgo8bmF2IGNsYXNzPSJuYXZiYXIgbmF2YmFyLWRlZmF1bHQiIHJvbGU9Im5hdmlnYXRpb24iPgogIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgPGRpdiBjbGFzcz0ibmF2YmFyLWhlYWRlciI+CiAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Im5hdmJhci10b2dnbGUiIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSIgZGF0YS10YXJnZXQ9Ii5uYXZiYXItY29sbGFwc2UiPgogICAgICA8c3BhbiBjbGFzcz0ic3Itb25seSI+VG9nZ2xlIG5hdmlnYXRpb248L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iaWNvbi1iYXIiPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9Imljb24tYmFyIj48L3NwYW4+CiAgICA8L2J1dHRvbj4KICAgIDxhIGNsYXNzPSJuYXZiYXItYnJhbmQiIGhyZWY9Ii8iPjxzdHJvbmc+R29Eb2M8L3N0cm9uZz48L2E+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlIj4KICAgIDx1bCBjbGFzcz0ibmF2IG5hdmJhci1uYXYiPgogICAgICAgIDxsaSBjbGFzcz0iYWN0aXZlIj48YSBocmVmPSIvIj5Ib21lPC9hPjwvbGk+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dDwvYT48L2xpPgogICAgPC91bD4KICAgIDxmb3JtIGNsYXNzPSJuYXZiYXItbmF2IG5hdmJhci1mb3JtIG5hdmJhci1yaWdodCIgaWQ9Ingtc2VhcmNoIiBhY3Rpb249Ii8iIHJvbGU9InNlYXJjaCI+PGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJ4LXNlYXJjaC1xdWVyeSIgdHlwZT0idGV4dCIgbmFtZT0icSIgcGxhY2Vob2xkZXI9IlNlYXJjaCI+PC9mb3JtPgogIDwvZGl2Pgo8L2Rpdj4KPC9uYXY+CjxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgCjxkaXYgY2xhc3M9Imp1bWJvdHJvbiI+CiAgICA8aDI+U2VhcmNoIGZvciBHbyBQYWNrYWdlczwvaDI+CiAgICAKICA8Zm9ybT4KICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5hbWU9InEiIGF1dG9mb2N1cz0iYXV0b2ZvY3VzIiB2YWx1ZT0iIiBwbGFjZWhvbGRlcj0iU2VhcmNoIGZvciBwYWNrYWdlIGJ5IGltcG9ydCBwYXRoIG9yIGtleXdvcmQuIiB0eXBlPSJ0ZXh0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImlucHV0LWdyb3VwLWJ0biI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IiB0eXBlPSJzdWJtaXQiPkdvITwvYnV0dG9uPgogICAgICA8L3NwYW4+CiAgICA8L2Rpdj4KICA8L2Zvcm0+Cgo8L2Rpdj4KCjxwPkdvRG9jIGhvc3RzIGRvY3VtZW50YXRpb24gZm9yIDxhIGhyZWY9Imh0dHA6Ly9nb2xhbmcub3JnLyI+R288L2E+IHBhY2thZ2VzCm9uIEJpdGJ1Y2tldCwgR2l0SHViLCBHb29nbGUgUHJvamVjdCBIb3N0aW5nIGFuZCBMYXVuY2hwYWQuICBSZWFkIHRoZSA8YQogIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dCBQYWdlPC9hPiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYWRkaW5nIHBhY2thZ2VzIHRvIEdvRG9jCmFuZCBtb3JlLgoKPGRpdiBjbGFzcz0icm93Ij4KICA8ZGl2IGNsYXNzPSJjb2wtc20tNiI+CiAgICAKICAgICAgPGg0PlBvcHVsYXIgUGFja2FnZXM8L2g0PgogICAgICA8dWwgY2xhc3M9Imxpc3QtdW5zdHlsZWQiPgogICAgICAgIDxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1nby9hd3MiPmdpdGh1Yi5jb20vYXdzL2F3cy1zZGstZ28vYXdzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9kZ3JpamFsdmEvand0LWdvIj5naXRodWIuY29tL2RncmlqYWx2YS9qd3QtZ288L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dpbi1nb25pYy9naW4iPmdpdGh1Yi5jb20vZ2luLWdvbmljL2dpbjwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXMiPmdpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dvLXNxbC1kcml2ZXIvbXlzcWwiPmdpdGh1Yi5jb20vZ28tc3FsLWRyaXZlci9teXNxbDwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29sYW5nL3Byb3RvYnVmL3Byb3RvIj5naXRodWIuY29tL2dvbGFuZy9wcm90b2J1Zi9wcm90bzwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29tb2R1bGUvcmVkaWdvL3JlZGlzIj5naXRodWIuY29tL2dvbW9kdWxlL3JlZGlnby9yZWRpczwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQiPmdpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQ8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltIj5naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9qaW56aHUvZ29ybSI+Z2l0aHViLmNvbS9qaW56aHUvZ29ybTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vbGliL3BxIj5naXRodWIuY29tL2xpYi9wcTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcGtnL2Vycm9ycyI+Z2l0aHViLmNvbS9wa2cvZXJyb3JzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1cyI+Z2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1czwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcm9iZmlnL2Nyb24iPmdpdGh1Yi5jb20vcm9iZmlnL2Nyb248L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3NpcnVwc2VuL2xvZ3J1cyI+Z2l0aHViLmNvbS9zaXJ1cHNlbi9sb2dydXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0Ij5naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0PC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS91bml4cGlja2xlL2thaG9vdC1oYWNrIj5naXRodWIuY29tL3VuaXhwaWNrbGUva2Fob290LWhhY2s8L2E+PGxpPjxhIGhyZWY9Ii9nby51YmVyLm9yZy96YXAiPmdvLnViZXIub3JnL3phcDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9jcnlwdG8vc3NoIj5nb2xhbmcub3JnL3gvY3J5cHRvL3NzaDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9uZXQvY29udGV4dCI+Z29sYW5nLm9yZy94L25ldC9jb250ZXh0PC9hPjxsaT48YSBocmVmPSIvZ29sYW5nLm9yZy94L29hdXRoMiI+Z29sYW5nLm9yZy94L29hdXRoMjwvYT48bGk+PGEgaHJlZj0iL2dvb2dsZS5nb2xhbmcub3JnL2dycGMiPmdvb2dsZS5nb2xhbmcub3JnL2dycGM8L2E+PGxpPjxhIGhyZWY9Ii9nb3BrZy5pbi9tZ28udjIiPmdvcGtnLmluL21nby52MjwvYT48bGk+PGEgaHJlZj0iL2dvcGtnLmluL3lhbWwudjIiPmdvcGtnLmluL3lhbWwudjI8L2E+PGxpPjxhIGhyZWY9Ii9sYWJpeC5vcmcvdjIvbWdvIj5sYWJpeC5vcmcvdjIvbWdvPC9hPgogICAgICA8L3VsPgogICAgCiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sLXNtLTYiPgogICAgPGg0Pk1vcmUgUGFja2FnZXM8L2g0PgogICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIj4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL2dvIj5HbyBTdGFuZGFyZCBQYWNrYWdlczwvYT4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL3N1YnJlcG8iPkdvIFN1Yi1yZXBvc2l0b3J5IFBhY2thZ2VzPC9hPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9nb2xhbmcub3JnL3dpa2kvUHJvamVjdHMiPlByb2plY3RzIEAgZ28td2lraTwvYT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zZWFyY2g/bz1kZXNjJmFtcDtxPWxhbmd1YWdlJTNBZ28mYW1wO3M9c3RhcnMmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5Nb3N0IHN0YXJzPC9hPiwgCiAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NlYXJjaD9vPWRlc2MmYW1wO3E9bGFuZ3VhZ2UlM0FnbyZhbXA7cz1mb3JrcyZhbXA7dHlwZT1SZXBvc2l0b3JpZXMiPm1vc3QgZm9ya3M8L2E+LCAKICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2VhcmNoP289ZGVzYyZhbXA7cT1sYW5ndWFnZSUzQWdvJmFtcDtzPXVwZGF0ZWQmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5yZWNlbnRseSB1cGRhdGVkPC9hPiBvbiBHaXRIdWIKICAgIDwvdWw+CiAgPC9kaXY+CjwvZGl2PgoKCjwvZGl2Pgo8ZGl2IGlkPSJ4LWZvb3RlciIgY2xhc3M9ImNsZWFyZml4Ij4KICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2dvbGFuZy9nZGRvL2lzc3VlcyI+V2Vic2l0ZSBJc3N1ZXM8L2E+CiAgICA8c3BhbiBjbGFzcz0idGV4dC1tdXRlZCI+fDwvc3Bhbj4gPGEgaHJlZj0iaHR0cDovL2dvbGFuZy5vcmcvIj5HbyBMYW5ndWFnZTwvYT4KICAgIDxzcGFuIGNsYXNzPSJwdWxsLXJpZ2h0Ij48YSBocmVmPSIjIj5CYWNrIHRvIHRvcDwvYT48L3NwYW4+CiAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ieC1zaG9ydGN1dHMiIHRhYmluZGV4PSItMSIgY2xhc3M9Im1vZGFsIj4KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+CiAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvYnV0dG9uPgogICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+S2V5Ym9hcmQgc2hvcnRjdXRzPC9oND4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4/PC9iPjwvdGQ+PHRkPiA6IFRoaXMgbWVudTwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4vPC9iPjwvdGQ+PHRkPiA6IFNlYXJjaCBzaXRlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5mPC9iPjwvdGQ+PHRkPiA6IEp1bXAgdG8gaWRlbnRpZmllcjwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmc8L2I+PC90ZD48dGQ+IDogR28gdG8gdG9wIG9mIHBhZ2U8L3RkPjwvdHI+CiAgICAgICAgICA8dHI+PHRkIGFsaWduPSJyaWdodCI+PGI+ZzwvYj4gdGhlbiA8Yj5iPC9iPjwvdGQ+PHRkPiA6IEdvIHRvIGVuZCBvZiBwYWdlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmk8L2I+PC90ZD48dGQ+IDogR28gdG8gaW5kZXg8L3RkPjwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9InRleHQtbXV0ZWQiPjx0ZCBhbGlnbj0icmlnaHQiPjxiPmc8L2I+IHRoZW4gPGI+ZTwvYj48L3RkPjx0ZD4gOiBHbyB0byBleGFtcGxlczwvdGQ+PC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KPHNjcmlwdCBzcmM9Ii8tL2pxdWVyeS0yLjAuMy5taW4uanM/dj1mYmY5Yzc3ZDBjNGUzYzM0YTQ4NTk4MGMxZTUzMTZiNjIxMjE2MGM4Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL2Jvb3RzdHJhcC5taW4uanM/dj01YWRhN2MxMDNmYzFkZWFiYzkyNWNjMWZkYmJiNmU0NTFjMjFmYzcwIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL3NpdGUuanM/dj0zNzFkZTczMWMxOGQ5MWM0OTlkOTBiMWFiMGJmMzllY2Y2NmQ2Y2Y3Ij48L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "D2p8n/PT13C49/oZwq4Z0A==" ], "Date": [ "Wed, 07 Feb 2024 00:06:35 GMT" ], "Etag": [ "\"0x8DC2770A675FB5A\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:36 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "h/FDiq2zgEw=" ], "X-Ms-Request-Id": [ "06db5877-101e-0041-6159-5940c6000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "923e7ca9e4b0c4b9", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "6354" ], "Content-Md5": [ "D2p8n/PT13C49/oZwq4Z0A==" ], "Content-Type": [ "text/html; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:35 GMT" ], "Etag": [ "\"0x8DC2770A675FB5A\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:36 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:36 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "06db58b2-101e-0041-6f59-5940c6000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "PCFET0NUWVBFIGh0bWw+PGh0bWwgbGFuZz0iZW4iPgo8aGVhZCBwcm9maWxlPSJodHRwOi8vYTkuY29tLy0vc3BlYy9vcGVuc2VhcmNoLzEuMS8iPgogIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgPGxpbmsgaHJlZj0iLy0vYm9vdHN0cmFwLm1pbi5jc3M/dj04YmVjMWJiYTNlMjNlY2JhMjJjZmZiMTk3YTJkNDQwYWY0MTBiMTVkIiByZWw9InN0eWxlc2hlZXQiPgogIDxsaW5rIGhyZWY9Ii8tL3NpdGUuY3NzP3Y9N2Q4MWY0MTA0Yzg5ZGJlMzc2MzQ1ZjZiZmUzZTYyYjRlNDBkM2QwNiIgcmVsPSJzdHlsZXNoZWV0Ij4KICA8dGl0bGU+R29Eb2M8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5Pgo8bmF2IGNsYXNzPSJuYXZiYXIgbmF2YmFyLWRlZmF1bHQiIHJvbGU9Im5hdmlnYXRpb24iPgogIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgPGRpdiBjbGFzcz0ibmF2YmFyLWhlYWRlciI+CiAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Im5hdmJhci10b2dnbGUiIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSIgZGF0YS10YXJnZXQ9Ii5uYXZiYXItY29sbGFwc2UiPgogICAgICA8c3BhbiBjbGFzcz0ic3Itb25seSI+VG9nZ2xlIG5hdmlnYXRpb248L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iaWNvbi1iYXIiPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9Imljb24tYmFyIj48L3NwYW4+CiAgICA8L2J1dHRvbj4KICAgIDxhIGNsYXNzPSJuYXZiYXItYnJhbmQiIGhyZWY9Ii8iPjxzdHJvbmc+R29Eb2M8L3N0cm9uZz48L2E+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlIj4KICAgIDx1bCBjbGFzcz0ibmF2IG5hdmJhci1uYXYiPgogICAgICAgIDxsaSBjbGFzcz0iYWN0aXZlIj48YSBocmVmPSIvIj5Ib21lPC9hPjwvbGk+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dDwvYT48L2xpPgogICAgPC91bD4KICAgIDxmb3JtIGNsYXNzPSJuYXZiYXItbmF2IG5hdmJhci1mb3JtIG5hdmJhci1yaWdodCIgaWQ9Ingtc2VhcmNoIiBhY3Rpb249Ii8iIHJvbGU9InNlYXJjaCI+PGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJ4LXNlYXJjaC1xdWVyeSIgdHlwZT0idGV4dCIgbmFtZT0icSIgcGxhY2Vob2xkZXI9IlNlYXJjaCI+PC9mb3JtPgogIDwvZGl2Pgo8L2Rpdj4KPC9uYXY+CjxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgCjxkaXYgY2xhc3M9Imp1bWJvdHJvbiI+CiAgICA8aDI+U2VhcmNoIGZvciBHbyBQYWNrYWdlczwvaDI+CiAgICAKICA8Zm9ybT4KICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5hbWU9InEiIGF1dG9mb2N1cz0iYXV0b2ZvY3VzIiB2YWx1ZT0iIiBwbGFjZWhvbGRlcj0iU2VhcmNoIGZvciBwYWNrYWdlIGJ5IGltcG9ydCBwYXRoIG9yIGtleXdvcmQuIiB0eXBlPSJ0ZXh0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImlucHV0LWdyb3VwLWJ0biI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IiB0eXBlPSJzdWJtaXQiPkdvITwvYnV0dG9uPgogICAgICA8L3NwYW4+CiAgICA8L2Rpdj4KICA8L2Zvcm0+Cgo8L2Rpdj4KCjxwPkdvRG9jIGhvc3RzIGRvY3VtZW50YXRpb24gZm9yIDxhIGhyZWY9Imh0dHA6Ly9nb2xhbmcub3JnLyI+R288L2E+IHBhY2thZ2VzCm9uIEJpdGJ1Y2tldCwgR2l0SHViLCBHb29nbGUgUHJvamVjdCBIb3N0aW5nIGFuZCBMYXVuY2hwYWQuICBSZWFkIHRoZSA8YQogIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dCBQYWdlPC9hPiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYWRkaW5nIHBhY2thZ2VzIHRvIEdvRG9jCmFuZCBtb3JlLgoKPGRpdiBjbGFzcz0icm93Ij4KICA8ZGl2IGNsYXNzPSJjb2wtc20tNiI+CiAgICAKICAgICAgPGg0PlBvcHVsYXIgUGFja2FnZXM8L2g0PgogICAgICA8dWwgY2xhc3M9Imxpc3QtdW5zdHlsZWQiPgogICAgICAgIDxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1nby9hd3MiPmdpdGh1Yi5jb20vYXdzL2F3cy1zZGstZ28vYXdzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9kZ3JpamFsdmEvand0LWdvIj5naXRodWIuY29tL2RncmlqYWx2YS9qd3QtZ288L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dpbi1nb25pYy9naW4iPmdpdGh1Yi5jb20vZ2luLWdvbmljL2dpbjwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXMiPmdpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dvLXNxbC1kcml2ZXIvbXlzcWwiPmdpdGh1Yi5jb20vZ28tc3FsLWRyaXZlci9teXNxbDwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29sYW5nL3Byb3RvYnVmL3Byb3RvIj5naXRodWIuY29tL2dvbGFuZy9wcm90b2J1Zi9wcm90bzwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29tb2R1bGUvcmVkaWdvL3JlZGlzIj5naXRodWIuY29tL2dvbW9kdWxlL3JlZGlnby9yZWRpczwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQiPmdpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQ8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltIj5naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9qaW56aHUvZ29ybSI+Z2l0aHViLmNvbS9qaW56aHUvZ29ybTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vbGliL3BxIj5naXRodWIuY29tL2xpYi9wcTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcGtnL2Vycm9ycyI+Z2l0aHViLmNvbS9wa2cvZXJyb3JzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1cyI+Z2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1czwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcm9iZmlnL2Nyb24iPmdpdGh1Yi5jb20vcm9iZmlnL2Nyb248L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3NpcnVwc2VuL2xvZ3J1cyI+Z2l0aHViLmNvbS9zaXJ1cHNlbi9sb2dydXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0Ij5naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0PC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS91bml4cGlja2xlL2thaG9vdC1oYWNrIj5naXRodWIuY29tL3VuaXhwaWNrbGUva2Fob290LWhhY2s8L2E+PGxpPjxhIGhyZWY9Ii9nby51YmVyLm9yZy96YXAiPmdvLnViZXIub3JnL3phcDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9jcnlwdG8vc3NoIj5nb2xhbmcub3JnL3gvY3J5cHRvL3NzaDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9uZXQvY29udGV4dCI+Z29sYW5nLm9yZy94L25ldC9jb250ZXh0PC9hPjxsaT48YSBocmVmPSIvZ29sYW5nLm9yZy94L29hdXRoMiI+Z29sYW5nLm9yZy94L29hdXRoMjwvYT48bGk+PGEgaHJlZj0iL2dvb2dsZS5nb2xhbmcub3JnL2dycGMiPmdvb2dsZS5nb2xhbmcub3JnL2dycGM8L2E+PGxpPjxhIGhyZWY9Ii9nb3BrZy5pbi9tZ28udjIiPmdvcGtnLmluL21nby52MjwvYT48bGk+PGEgaHJlZj0iL2dvcGtnLmluL3lhbWwudjIiPmdvcGtnLmluL3lhbWwudjI8L2E+PGxpPjxhIGhyZWY9Ii9sYWJpeC5vcmcvdjIvbWdvIj5sYWJpeC5vcmcvdjIvbWdvPC9hPgogICAgICA8L3VsPgogICAgCiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sLXNtLTYiPgogICAgPGg0Pk1vcmUgUGFja2FnZXM8L2g0PgogICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIj4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL2dvIj5HbyBTdGFuZGFyZCBQYWNrYWdlczwvYT4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL3N1YnJlcG8iPkdvIFN1Yi1yZXBvc2l0b3J5IFBhY2thZ2VzPC9hPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9nb2xhbmcub3JnL3dpa2kvUHJvamVjdHMiPlByb2plY3RzIEAgZ28td2lraTwvYT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zZWFyY2g/bz1kZXNjJmFtcDtxPWxhbmd1YWdlJTNBZ28mYW1wO3M9c3RhcnMmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5Nb3N0IHN0YXJzPC9hPiwgCiAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NlYXJjaD9vPWRlc2MmYW1wO3E9bGFuZ3VhZ2UlM0FnbyZhbXA7cz1mb3JrcyZhbXA7dHlwZT1SZXBvc2l0b3JpZXMiPm1vc3QgZm9ya3M8L2E+LCAKICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2VhcmNoP289ZGVzYyZhbXA7cT1sYW5ndWFnZSUzQWdvJmFtcDtzPXVwZGF0ZWQmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5yZWNlbnRseSB1cGRhdGVkPC9hPiBvbiBHaXRIdWIKICAgIDwvdWw+CiAgPC9kaXY+CjwvZGl2PgoKCjwvZGl2Pgo8ZGl2IGlkPSJ4LWZvb3RlciIgY2xhc3M9ImNsZWFyZml4Ij4KICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2dvbGFuZy9nZGRvL2lzc3VlcyI+V2Vic2l0ZSBJc3N1ZXM8L2E+CiAgICA8c3BhbiBjbGFzcz0idGV4dC1tdXRlZCI+fDwvc3Bhbj4gPGEgaHJlZj0iaHR0cDovL2dvbGFuZy5vcmcvIj5HbyBMYW5ndWFnZTwvYT4KICAgIDxzcGFuIGNsYXNzPSJwdWxsLXJpZ2h0Ij48YSBocmVmPSIjIj5CYWNrIHRvIHRvcDwvYT48L3NwYW4+CiAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ieC1zaG9ydGN1dHMiIHRhYmluZGV4PSItMSIgY2xhc3M9Im1vZGFsIj4KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+CiAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvYnV0dG9uPgogICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+S2V5Ym9hcmQgc2hvcnRjdXRzPC9oND4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4/PC9iPjwvdGQ+PHRkPiA6IFRoaXMgbWVudTwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4vPC9iPjwvdGQ+PHRkPiA6IFNlYXJjaCBzaXRlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5mPC9iPjwvdGQ+PHRkPiA6IEp1bXAgdG8gaWRlbnRpZmllcjwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmc8L2I+PC90ZD48dGQ+IDogR28gdG8gdG9wIG9mIHBhZ2U8L3RkPjwvdHI+CiAgICAgICAgICA8dHI+PHRkIGFsaWduPSJyaWdodCI+PGI+ZzwvYj4gdGhlbiA8Yj5iPC9iPjwvdGQ+PHRkPiA6IEdvIHRvIGVuZCBvZiBwYWdlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmk8L2I+PC90ZD48dGQ+IDogR28gdG8gaW5kZXg8L3RkPjwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9InRleHQtbXV0ZWQiPjx0ZCBhbGlnbj0icmlnaHQiPjxiPmc8L2I+IHRoZW4gPGI+ZTwvYj48L3RkPjx0ZD4gOiBHbyB0byBleGFtcGxlczwvdGQ+PC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KPHNjcmlwdCBzcmM9Ii8tL2pxdWVyeS0yLjAuMy5taW4uanM/dj1mYmY5Yzc3ZDBjNGUzYzM0YTQ4NTk4MGMxZTUzMTZiNjIxMjE2MGM4Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL2Jvb3RzdHJhcC5taW4uanM/dj01YWRhN2MxMDNmYzFkZWFiYzkyNWNjMWZkYmJiNmU0NTFjMjFmYzcwIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL3NpdGUuanM/dj0zNzFkZTczMWMxOGQ5MWM0OTlkOTBiMWFiMGJmMzllY2Y2NmQ2Y2Y3Ij48L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+" } }, { "ID": "91f79674569ba9f7", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "6354" ], "Content-Md5": [ "D2p8n/PT13C49/oZwq4Z0A==" ], "Content-Type": [ "text/html; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:35 GMT" ], "Etag": [ "\"0x8DC2770A675FB5A\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:36 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:36 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "06db58d4-101e-0041-7959-5940c6000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "cc3411340347defc", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:35 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "06db58e3-101e-0041-0159-5940c6000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestWrite/ContentType_is_left_empty_if_not_provided_and_DisableContentTypeDetection_is_true.replay ================================================ { "Initial": "AQAAAA7dVMCMEqb1XQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "1d24ce9ae728ae9a", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "6354" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Type": [ "" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "PCFET0NUWVBFIGh0bWw+PGh0bWwgbGFuZz0iZW4iPgo8aGVhZCBwcm9maWxlPSJodHRwOi8vYTkuY29tLy0vc3BlYy9vcGVuc2VhcmNoLzEuMS8iPgogIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgPGxpbmsgaHJlZj0iLy0vYm9vdHN0cmFwLm1pbi5jc3M/dj04YmVjMWJiYTNlMjNlY2JhMjJjZmZiMTk3YTJkNDQwYWY0MTBiMTVkIiByZWw9InN0eWxlc2hlZXQiPgogIDxsaW5rIGhyZWY9Ii8tL3NpdGUuY3NzP3Y9N2Q4MWY0MTA0Yzg5ZGJlMzc2MzQ1ZjZiZmUzZTYyYjRlNDBkM2QwNiIgcmVsPSJzdHlsZXNoZWV0Ij4KICA8dGl0bGU+R29Eb2M8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5Pgo8bmF2IGNsYXNzPSJuYXZiYXIgbmF2YmFyLWRlZmF1bHQiIHJvbGU9Im5hdmlnYXRpb24iPgogIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgPGRpdiBjbGFzcz0ibmF2YmFyLWhlYWRlciI+CiAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Im5hdmJhci10b2dnbGUiIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSIgZGF0YS10YXJnZXQ9Ii5uYXZiYXItY29sbGFwc2UiPgogICAgICA8c3BhbiBjbGFzcz0ic3Itb25seSI+VG9nZ2xlIG5hdmlnYXRpb248L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iaWNvbi1iYXIiPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9Imljb24tYmFyIj48L3NwYW4+CiAgICA8L2J1dHRvbj4KICAgIDxhIGNsYXNzPSJuYXZiYXItYnJhbmQiIGhyZWY9Ii8iPjxzdHJvbmc+R29Eb2M8L3N0cm9uZz48L2E+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlIj4KICAgIDx1bCBjbGFzcz0ibmF2IG5hdmJhci1uYXYiPgogICAgICAgIDxsaSBjbGFzcz0iYWN0aXZlIj48YSBocmVmPSIvIj5Ib21lPC9hPjwvbGk+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dDwvYT48L2xpPgogICAgPC91bD4KICAgIDxmb3JtIGNsYXNzPSJuYXZiYXItbmF2IG5hdmJhci1mb3JtIG5hdmJhci1yaWdodCIgaWQ9Ingtc2VhcmNoIiBhY3Rpb249Ii8iIHJvbGU9InNlYXJjaCI+PGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJ4LXNlYXJjaC1xdWVyeSIgdHlwZT0idGV4dCIgbmFtZT0icSIgcGxhY2Vob2xkZXI9IlNlYXJjaCI+PC9mb3JtPgogIDwvZGl2Pgo8L2Rpdj4KPC9uYXY+CjxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgCjxkaXYgY2xhc3M9Imp1bWJvdHJvbiI+CiAgICA8aDI+U2VhcmNoIGZvciBHbyBQYWNrYWdlczwvaDI+CiAgICAKICA8Zm9ybT4KICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5hbWU9InEiIGF1dG9mb2N1cz0iYXV0b2ZvY3VzIiB2YWx1ZT0iIiBwbGFjZWhvbGRlcj0iU2VhcmNoIGZvciBwYWNrYWdlIGJ5IGltcG9ydCBwYXRoIG9yIGtleXdvcmQuIiB0eXBlPSJ0ZXh0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImlucHV0LWdyb3VwLWJ0biI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IiB0eXBlPSJzdWJtaXQiPkdvITwvYnV0dG9uPgogICAgICA8L3NwYW4+CiAgICA8L2Rpdj4KICA8L2Zvcm0+Cgo8L2Rpdj4KCjxwPkdvRG9jIGhvc3RzIGRvY3VtZW50YXRpb24gZm9yIDxhIGhyZWY9Imh0dHA6Ly9nb2xhbmcub3JnLyI+R288L2E+IHBhY2thZ2VzCm9uIEJpdGJ1Y2tldCwgR2l0SHViLCBHb29nbGUgUHJvamVjdCBIb3N0aW5nIGFuZCBMYXVuY2hwYWQuICBSZWFkIHRoZSA8YQogIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dCBQYWdlPC9hPiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYWRkaW5nIHBhY2thZ2VzIHRvIEdvRG9jCmFuZCBtb3JlLgoKPGRpdiBjbGFzcz0icm93Ij4KICA8ZGl2IGNsYXNzPSJjb2wtc20tNiI+CiAgICAKICAgICAgPGg0PlBvcHVsYXIgUGFja2FnZXM8L2g0PgogICAgICA8dWwgY2xhc3M9Imxpc3QtdW5zdHlsZWQiPgogICAgICAgIDxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1nby9hd3MiPmdpdGh1Yi5jb20vYXdzL2F3cy1zZGstZ28vYXdzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9kZ3JpamFsdmEvand0LWdvIj5naXRodWIuY29tL2RncmlqYWx2YS9qd3QtZ288L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dpbi1nb25pYy9naW4iPmdpdGh1Yi5jb20vZ2luLWdvbmljL2dpbjwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXMiPmdpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dvLXNxbC1kcml2ZXIvbXlzcWwiPmdpdGh1Yi5jb20vZ28tc3FsLWRyaXZlci9teXNxbDwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29sYW5nL3Byb3RvYnVmL3Byb3RvIj5naXRodWIuY29tL2dvbGFuZy9wcm90b2J1Zi9wcm90bzwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29tb2R1bGUvcmVkaWdvL3JlZGlzIj5naXRodWIuY29tL2dvbW9kdWxlL3JlZGlnby9yZWRpczwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQiPmdpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQ8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltIj5naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9qaW56aHUvZ29ybSI+Z2l0aHViLmNvbS9qaW56aHUvZ29ybTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vbGliL3BxIj5naXRodWIuY29tL2xpYi9wcTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcGtnL2Vycm9ycyI+Z2l0aHViLmNvbS9wa2cvZXJyb3JzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1cyI+Z2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1czwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcm9iZmlnL2Nyb24iPmdpdGh1Yi5jb20vcm9iZmlnL2Nyb248L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3NpcnVwc2VuL2xvZ3J1cyI+Z2l0aHViLmNvbS9zaXJ1cHNlbi9sb2dydXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0Ij5naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0PC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS91bml4cGlja2xlL2thaG9vdC1oYWNrIj5naXRodWIuY29tL3VuaXhwaWNrbGUva2Fob290LWhhY2s8L2E+PGxpPjxhIGhyZWY9Ii9nby51YmVyLm9yZy96YXAiPmdvLnViZXIub3JnL3phcDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9jcnlwdG8vc3NoIj5nb2xhbmcub3JnL3gvY3J5cHRvL3NzaDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9uZXQvY29udGV4dCI+Z29sYW5nLm9yZy94L25ldC9jb250ZXh0PC9hPjxsaT48YSBocmVmPSIvZ29sYW5nLm9yZy94L29hdXRoMiI+Z29sYW5nLm9yZy94L29hdXRoMjwvYT48bGk+PGEgaHJlZj0iL2dvb2dsZS5nb2xhbmcub3JnL2dycGMiPmdvb2dsZS5nb2xhbmcub3JnL2dycGM8L2E+PGxpPjxhIGhyZWY9Ii9nb3BrZy5pbi9tZ28udjIiPmdvcGtnLmluL21nby52MjwvYT48bGk+PGEgaHJlZj0iL2dvcGtnLmluL3lhbWwudjIiPmdvcGtnLmluL3lhbWwudjI8L2E+PGxpPjxhIGhyZWY9Ii9sYWJpeC5vcmcvdjIvbWdvIj5sYWJpeC5vcmcvdjIvbWdvPC9hPgogICAgICA8L3VsPgogICAgCiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sLXNtLTYiPgogICAgPGg0Pk1vcmUgUGFja2FnZXM8L2g0PgogICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIj4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL2dvIj5HbyBTdGFuZGFyZCBQYWNrYWdlczwvYT4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL3N1YnJlcG8iPkdvIFN1Yi1yZXBvc2l0b3J5IFBhY2thZ2VzPC9hPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9nb2xhbmcub3JnL3dpa2kvUHJvamVjdHMiPlByb2plY3RzIEAgZ28td2lraTwvYT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zZWFyY2g/bz1kZXNjJmFtcDtxPWxhbmd1YWdlJTNBZ28mYW1wO3M9c3RhcnMmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5Nb3N0IHN0YXJzPC9hPiwgCiAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NlYXJjaD9vPWRlc2MmYW1wO3E9bGFuZ3VhZ2UlM0FnbyZhbXA7cz1mb3JrcyZhbXA7dHlwZT1SZXBvc2l0b3JpZXMiPm1vc3QgZm9ya3M8L2E+LCAKICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2VhcmNoP289ZGVzYyZhbXA7cT1sYW5ndWFnZSUzQWdvJmFtcDtzPXVwZGF0ZWQmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5yZWNlbnRseSB1cGRhdGVkPC9hPiBvbiBHaXRIdWIKICAgIDwvdWw+CiAgPC9kaXY+CjwvZGl2PgoKCjwvZGl2Pgo8ZGl2IGlkPSJ4LWZvb3RlciIgY2xhc3M9ImNsZWFyZml4Ij4KICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2dvbGFuZy9nZGRvL2lzc3VlcyI+V2Vic2l0ZSBJc3N1ZXM8L2E+CiAgICA8c3BhbiBjbGFzcz0idGV4dC1tdXRlZCI+fDwvc3Bhbj4gPGEgaHJlZj0iaHR0cDovL2dvbGFuZy5vcmcvIj5HbyBMYW5ndWFnZTwvYT4KICAgIDxzcGFuIGNsYXNzPSJwdWxsLXJpZ2h0Ij48YSBocmVmPSIjIj5CYWNrIHRvIHRvcDwvYT48L3NwYW4+CiAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ieC1zaG9ydGN1dHMiIHRhYmluZGV4PSItMSIgY2xhc3M9Im1vZGFsIj4KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+CiAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvYnV0dG9uPgogICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+S2V5Ym9hcmQgc2hvcnRjdXRzPC9oND4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4/PC9iPjwvdGQ+PHRkPiA6IFRoaXMgbWVudTwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4vPC9iPjwvdGQ+PHRkPiA6IFNlYXJjaCBzaXRlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5mPC9iPjwvdGQ+PHRkPiA6IEp1bXAgdG8gaWRlbnRpZmllcjwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmc8L2I+PC90ZD48dGQ+IDogR28gdG8gdG9wIG9mIHBhZ2U8L3RkPjwvdHI+CiAgICAgICAgICA8dHI+PHRkIGFsaWduPSJyaWdodCI+PGI+ZzwvYj4gdGhlbiA8Yj5iPC9iPjwvdGQ+PHRkPiA6IEdvIHRvIGVuZCBvZiBwYWdlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmk8L2I+PC90ZD48dGQ+IDogR28gdG8gaW5kZXg8L3RkPjwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9InRleHQtbXV0ZWQiPjx0ZCBhbGlnbj0icmlnaHQiPjxiPmc8L2I+IHRoZW4gPGI+ZTwvYj48L3RkPjx0ZD4gOiBHbyB0byBleGFtcGxlczwvdGQ+PC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KPHNjcmlwdCBzcmM9Ii8tL2pxdWVyeS0yLjAuMy5taW4uanM/dj1mYmY5Yzc3ZDBjNGUzYzM0YTQ4NTk4MGMxZTUzMTZiNjIxMjE2MGM4Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL2Jvb3RzdHJhcC5taW4uanM/dj01YWRhN2MxMDNmYzFkZWFiYzkyNWNjMWZkYmJiNmU0NTFjMjFmYzcwIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL3NpdGUuanM/dj0zNzFkZTczMWMxOGQ5MWM0OTlkOTBiMWFiMGJmMzllY2Y2NmQ2Y2Y3Ij48L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "D2p8n/PT13C49/oZwq4Z0A==" ], "Date": [ "Wed, 07 Feb 2024 00:06:36 GMT" ], "Etag": [ "\"0x8DC2770A6920AC5\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:36 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "h/FDiq2zgEw=" ], "X-Ms-Request-Id": [ "772045de-b01e-0083-1159-590640000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "452773bba75efcec", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "6354" ], "Content-Md5": [ "D2p8n/PT13C49/oZwq4Z0A==" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Wed, 07 Feb 2024 00:06:36 GMT" ], "Etag": [ "\"0x8DC2770A6920AC5\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:36 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:36 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "772045f5-b01e-0083-1a59-590640000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "PCFET0NUWVBFIGh0bWw+PGh0bWwgbGFuZz0iZW4iPgo8aGVhZCBwcm9maWxlPSJodHRwOi8vYTkuY29tLy0vc3BlYy9vcGVuc2VhcmNoLzEuMS8iPgogIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgPGxpbmsgaHJlZj0iLy0vYm9vdHN0cmFwLm1pbi5jc3M/dj04YmVjMWJiYTNlMjNlY2JhMjJjZmZiMTk3YTJkNDQwYWY0MTBiMTVkIiByZWw9InN0eWxlc2hlZXQiPgogIDxsaW5rIGhyZWY9Ii8tL3NpdGUuY3NzP3Y9N2Q4MWY0MTA0Yzg5ZGJlMzc2MzQ1ZjZiZmUzZTYyYjRlNDBkM2QwNiIgcmVsPSJzdHlsZXNoZWV0Ij4KICA8dGl0bGU+R29Eb2M8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5Pgo8bmF2IGNsYXNzPSJuYXZiYXIgbmF2YmFyLWRlZmF1bHQiIHJvbGU9Im5hdmlnYXRpb24iPgogIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgPGRpdiBjbGFzcz0ibmF2YmFyLWhlYWRlciI+CiAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Im5hdmJhci10b2dnbGUiIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSIgZGF0YS10YXJnZXQ9Ii5uYXZiYXItY29sbGFwc2UiPgogICAgICA8c3BhbiBjbGFzcz0ic3Itb25seSI+VG9nZ2xlIG5hdmlnYXRpb248L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iaWNvbi1iYXIiPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9Imljb24tYmFyIj48L3NwYW4+CiAgICA8L2J1dHRvbj4KICAgIDxhIGNsYXNzPSJuYXZiYXItYnJhbmQiIGhyZWY9Ii8iPjxzdHJvbmc+R29Eb2M8L3N0cm9uZz48L2E+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlIj4KICAgIDx1bCBjbGFzcz0ibmF2IG5hdmJhci1uYXYiPgogICAgICAgIDxsaSBjbGFzcz0iYWN0aXZlIj48YSBocmVmPSIvIj5Ib21lPC9hPjwvbGk+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dDwvYT48L2xpPgogICAgPC91bD4KICAgIDxmb3JtIGNsYXNzPSJuYXZiYXItbmF2IG5hdmJhci1mb3JtIG5hdmJhci1yaWdodCIgaWQ9Ingtc2VhcmNoIiBhY3Rpb249Ii8iIHJvbGU9InNlYXJjaCI+PGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJ4LXNlYXJjaC1xdWVyeSIgdHlwZT0idGV4dCIgbmFtZT0icSIgcGxhY2Vob2xkZXI9IlNlYXJjaCI+PC9mb3JtPgogIDwvZGl2Pgo8L2Rpdj4KPC9uYXY+CjxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgCjxkaXYgY2xhc3M9Imp1bWJvdHJvbiI+CiAgICA8aDI+U2VhcmNoIGZvciBHbyBQYWNrYWdlczwvaDI+CiAgICAKICA8Zm9ybT4KICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5hbWU9InEiIGF1dG9mb2N1cz0iYXV0b2ZvY3VzIiB2YWx1ZT0iIiBwbGFjZWhvbGRlcj0iU2VhcmNoIGZvciBwYWNrYWdlIGJ5IGltcG9ydCBwYXRoIG9yIGtleXdvcmQuIiB0eXBlPSJ0ZXh0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImlucHV0LWdyb3VwLWJ0biI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IiB0eXBlPSJzdWJtaXQiPkdvITwvYnV0dG9uPgogICAgICA8L3NwYW4+CiAgICA8L2Rpdj4KICA8L2Zvcm0+Cgo8L2Rpdj4KCjxwPkdvRG9jIGhvc3RzIGRvY3VtZW50YXRpb24gZm9yIDxhIGhyZWY9Imh0dHA6Ly9nb2xhbmcub3JnLyI+R288L2E+IHBhY2thZ2VzCm9uIEJpdGJ1Y2tldCwgR2l0SHViLCBHb29nbGUgUHJvamVjdCBIb3N0aW5nIGFuZCBMYXVuY2hwYWQuICBSZWFkIHRoZSA8YQogIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dCBQYWdlPC9hPiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYWRkaW5nIHBhY2thZ2VzIHRvIEdvRG9jCmFuZCBtb3JlLgoKPGRpdiBjbGFzcz0icm93Ij4KICA8ZGl2IGNsYXNzPSJjb2wtc20tNiI+CiAgICAKICAgICAgPGg0PlBvcHVsYXIgUGFja2FnZXM8L2g0PgogICAgICA8dWwgY2xhc3M9Imxpc3QtdW5zdHlsZWQiPgogICAgICAgIDxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1nby9hd3MiPmdpdGh1Yi5jb20vYXdzL2F3cy1zZGstZ28vYXdzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9kZ3JpamFsdmEvand0LWdvIj5naXRodWIuY29tL2RncmlqYWx2YS9qd3QtZ288L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dpbi1nb25pYy9naW4iPmdpdGh1Yi5jb20vZ2luLWdvbmljL2dpbjwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXMiPmdpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dvLXNxbC1kcml2ZXIvbXlzcWwiPmdpdGh1Yi5jb20vZ28tc3FsLWRyaXZlci9teXNxbDwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29sYW5nL3Byb3RvYnVmL3Byb3RvIj5naXRodWIuY29tL2dvbGFuZy9wcm90b2J1Zi9wcm90bzwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29tb2R1bGUvcmVkaWdvL3JlZGlzIj5naXRodWIuY29tL2dvbW9kdWxlL3JlZGlnby9yZWRpczwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQiPmdpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQ8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltIj5naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9qaW56aHUvZ29ybSI+Z2l0aHViLmNvbS9qaW56aHUvZ29ybTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vbGliL3BxIj5naXRodWIuY29tL2xpYi9wcTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcGtnL2Vycm9ycyI+Z2l0aHViLmNvbS9wa2cvZXJyb3JzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1cyI+Z2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1czwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcm9iZmlnL2Nyb24iPmdpdGh1Yi5jb20vcm9iZmlnL2Nyb248L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3NpcnVwc2VuL2xvZ3J1cyI+Z2l0aHViLmNvbS9zaXJ1cHNlbi9sb2dydXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0Ij5naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0PC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS91bml4cGlja2xlL2thaG9vdC1oYWNrIj5naXRodWIuY29tL3VuaXhwaWNrbGUva2Fob290LWhhY2s8L2E+PGxpPjxhIGhyZWY9Ii9nby51YmVyLm9yZy96YXAiPmdvLnViZXIub3JnL3phcDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9jcnlwdG8vc3NoIj5nb2xhbmcub3JnL3gvY3J5cHRvL3NzaDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9uZXQvY29udGV4dCI+Z29sYW5nLm9yZy94L25ldC9jb250ZXh0PC9hPjxsaT48YSBocmVmPSIvZ29sYW5nLm9yZy94L29hdXRoMiI+Z29sYW5nLm9yZy94L29hdXRoMjwvYT48bGk+PGEgaHJlZj0iL2dvb2dsZS5nb2xhbmcub3JnL2dycGMiPmdvb2dsZS5nb2xhbmcub3JnL2dycGM8L2E+PGxpPjxhIGhyZWY9Ii9nb3BrZy5pbi9tZ28udjIiPmdvcGtnLmluL21nby52MjwvYT48bGk+PGEgaHJlZj0iL2dvcGtnLmluL3lhbWwudjIiPmdvcGtnLmluL3lhbWwudjI8L2E+PGxpPjxhIGhyZWY9Ii9sYWJpeC5vcmcvdjIvbWdvIj5sYWJpeC5vcmcvdjIvbWdvPC9hPgogICAgICA8L3VsPgogICAgCiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sLXNtLTYiPgogICAgPGg0Pk1vcmUgUGFja2FnZXM8L2g0PgogICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIj4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL2dvIj5HbyBTdGFuZGFyZCBQYWNrYWdlczwvYT4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL3N1YnJlcG8iPkdvIFN1Yi1yZXBvc2l0b3J5IFBhY2thZ2VzPC9hPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9nb2xhbmcub3JnL3dpa2kvUHJvamVjdHMiPlByb2plY3RzIEAgZ28td2lraTwvYT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zZWFyY2g/bz1kZXNjJmFtcDtxPWxhbmd1YWdlJTNBZ28mYW1wO3M9c3RhcnMmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5Nb3N0IHN0YXJzPC9hPiwgCiAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NlYXJjaD9vPWRlc2MmYW1wO3E9bGFuZ3VhZ2UlM0FnbyZhbXA7cz1mb3JrcyZhbXA7dHlwZT1SZXBvc2l0b3JpZXMiPm1vc3QgZm9ya3M8L2E+LCAKICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2VhcmNoP289ZGVzYyZhbXA7cT1sYW5ndWFnZSUzQWdvJmFtcDtzPXVwZGF0ZWQmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5yZWNlbnRseSB1cGRhdGVkPC9hPiBvbiBHaXRIdWIKICAgIDwvdWw+CiAgPC9kaXY+CjwvZGl2PgoKCjwvZGl2Pgo8ZGl2IGlkPSJ4LWZvb3RlciIgY2xhc3M9ImNsZWFyZml4Ij4KICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2dvbGFuZy9nZGRvL2lzc3VlcyI+V2Vic2l0ZSBJc3N1ZXM8L2E+CiAgICA8c3BhbiBjbGFzcz0idGV4dC1tdXRlZCI+fDwvc3Bhbj4gPGEgaHJlZj0iaHR0cDovL2dvbGFuZy5vcmcvIj5HbyBMYW5ndWFnZTwvYT4KICAgIDxzcGFuIGNsYXNzPSJwdWxsLXJpZ2h0Ij48YSBocmVmPSIjIj5CYWNrIHRvIHRvcDwvYT48L3NwYW4+CiAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ieC1zaG9ydGN1dHMiIHRhYmluZGV4PSItMSIgY2xhc3M9Im1vZGFsIj4KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+CiAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvYnV0dG9uPgogICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+S2V5Ym9hcmQgc2hvcnRjdXRzPC9oND4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4/PC9iPjwvdGQ+PHRkPiA6IFRoaXMgbWVudTwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4vPC9iPjwvdGQ+PHRkPiA6IFNlYXJjaCBzaXRlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5mPC9iPjwvdGQ+PHRkPiA6IEp1bXAgdG8gaWRlbnRpZmllcjwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmc8L2I+PC90ZD48dGQ+IDogR28gdG8gdG9wIG9mIHBhZ2U8L3RkPjwvdHI+CiAgICAgICAgICA8dHI+PHRkIGFsaWduPSJyaWdodCI+PGI+ZzwvYj4gdGhlbiA8Yj5iPC9iPjwvdGQ+PHRkPiA6IEdvIHRvIGVuZCBvZiBwYWdlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmk8L2I+PC90ZD48dGQ+IDogR28gdG8gaW5kZXg8L3RkPjwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9InRleHQtbXV0ZWQiPjx0ZCBhbGlnbj0icmlnaHQiPjxiPmc8L2I+IHRoZW4gPGI+ZTwvYj48L3RkPjx0ZD4gOiBHbyB0byBleGFtcGxlczwvdGQ+PC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KPHNjcmlwdCBzcmM9Ii8tL2pxdWVyeS0yLjAuMy5taW4uanM/dj1mYmY5Yzc3ZDBjNGUzYzM0YTQ4NTk4MGMxZTUzMTZiNjIxMjE2MGM4Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL2Jvb3RzdHJhcC5taW4uanM/dj01YWRhN2MxMDNmYzFkZWFiYzkyNWNjMWZkYmJiNmU0NTFjMjFmYzcwIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL3NpdGUuanM/dj0zNzFkZTczMWMxOGQ5MWM0OTlkOTBiMWFiMGJmMzllY2Y2NmQ2Y2Y3Ij48L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+" } }, { "ID": "3c891036536c3bde", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:36 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "77204603-b01e-0083-2159-590640000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestWrite/Content_md5_did_not_match,_blob_existed.replay ================================================ { "Initial": "AQAAAA7dVMCMMXnlVgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "18889ef16c37b9fd", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "16" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "dH9B/ScP7BuCvgMMwc1IAQ==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "ZXhpc3RpbmcgY29udGVudA==" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "dH9B/ScP7BuCvgMMwc1IAQ==" ], "Date": [ "Wed, 07 Feb 2024 00:06:35 GMT" ], "Etag": [ "\"0x8DC2770A6DC0148\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:36 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "vsdKdvBj/oM=" ], "X-Ms-Request-Id": [ "1b824846-d01e-0003-5659-59f946000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "6a1f17607f6fd4a4", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "16" ], "Content-Md5": [ "dH9B/ScP7BuCvgMMwc1IAQ==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:35 GMT" ], "Etag": [ "\"0x8DC2770A6DC0148\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:36 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:36 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "1b824850-d01e-0003-5c59-59f946000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "ZXhpc3RpbmcgY29udGVudA==" } }, { "ID": "8c7980f71320c2fc", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:35 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "1b824860-d01e-0003-6559-59f946000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestWrite/Content_md5_did_not_match.replay ================================================ { "Initial": "AQAAAA7dVMCMLJf7xgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "21b17413210a0e73", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "215" ], "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:36 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Error-Code": [ "BlobNotFound" ], "X-Ms-Request-Id": [ "7662cf48-b01e-0067-1459-5908de000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RXJyb3I+PENvZGU+QmxvYk5vdEZvdW5kPC9Db2RlPjxNZXNzYWdlPlRoZSBzcGVjaWZpZWQgYmxvYiBkb2VzIG5vdCBleGlzdC4KUmVxdWVzdElkOjc2NjJjZjQ4LWIwMWUtMDA2Ny0xNDU5LTU5MDhkZTAwMDAwMApUaW1lOjIwMjQtMDItMDdUMDA6MDY6MzYuODI1NTQwM1o8L01lc3NhZ2U+PC9FcnJvcj4=" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestWrite/Content_md5_match.replay ================================================ { "Initial": "AQAAAA7dVMCMJOHbOAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "1efba82184b182f9", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "11" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Md5": [ "XrY7u+Ae7tCTyyK7j1rNww==" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8gd29ybGQ=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "XrY7u+Ae7tCTyyK7j1rNww==" ], "Date": [ "Wed, 07 Feb 2024 00:06:36 GMT" ], "Etag": [ "\"0x8DC2770A6BBFAE2\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:36 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "vo7q9sPVKY0=" ], "X-Ms-Request-Id": [ "b32a493b-601e-0039-2459-59e33e000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "fc03ac90885e7f3f", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "11" ], "Content-Md5": [ "XrY7u+Ae7tCTyyK7j1rNww==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:36 GMT" ], "Etag": [ "\"0x8DC2770A6BBFAE2\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:36 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:36 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "b32a4958-601e-0039-3459-59e33e000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "aGVsbG8gd29ybGQ=" } }, { "ID": "60cc779a7410e661", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:36 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "b32a496f-601e-0039-3f59-59e33e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestWrite/a_large_jpg_file_gets_a_ContentType.replay ================================================ { "Initial": "AQAAAA7dVMCNBoKDvwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "71c7010a770404d4", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "38430" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Type": [ "image/jpeg" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "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NQu4GCulv823Pv06iufTwprfjG5W58Q3MogJ3LaoNqICOAMEg/jXTaP8OdL0rGyEO3AJZF6D6D9a7K3sY4YgqggAYHtQBmaJ4fs9MiAgt40AGMquDW6IxwMUJGFGOcVJQA3aDTsUUUAFFFFABRRRQAUhGaWigBoQA5Ap1FFABRRRQAUCiigAooooAKKKKAAdKKKKACiiigAooooAKKKKACiiigAooooAKKKKACqOsI0mlXMaruLRsuMZ6j0q9TZF3IRQB5N8MtV8m1n06RGSWGZsfJtDDPXpivSJNSMcO5oyD7mvHPElmngbxu+pmCeSyuvmHlE4Ru4wBirt/wCNZvEMS6X4dtrl5Z12POQcRDHp60Ac5I7+Lvi7LeQITHbuqAhdwwvGa+h7ddsCA9QK4b4f+B/+Ecs/MnObmU7nAOQDXfAYFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAIRmloooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBpUHtVdrRCc4HtVqigCi+nwsclAe4JFQvpFs64aFDnrkVpkUY6UAYf/COaeIti2cIUnLARjBP/wCupl0S0QkLbxjPXCjmtbAoxzQBSWxiRQAg4wOlWBbopGB0qUCloAjVMAVJRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRSY96AFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCpf6baanavbXcKSwv95WHWqml+HNM0hStlaxxAnJ2jqa1qKAAADoKKKKACiiigAooooAKKKKACiiigAooooAKKTNLQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRQKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKO9FGOaACiiigAopAR0zzS0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFGc0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFIeKKKAFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKQnkCiigBaKKKACiiigAooooAKKKKACiiigAooooA//Z" ] }, "Response": { "StatusCode": 502, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Warning": [ "199 \"martian\" \"dial tcp 20.60.80.2:443: connect: connection timed out\" \"Wed, 07 Feb 2024 00:06:56 GMT\"" ] }, "Body": "" } }, { "ID": "8eed9964f1d22ec3", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "38430" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Type": [ "image/jpeg" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "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NQu4GCulv823Pv06iufTwprfjG5W58Q3MogJ3LaoNqICOAMEg/jXTaP8OdL0rGyEO3AJZF6D6D9a7K3sY4YgqggAYHtQBmaJ4fs9MiAgt40AGMquDW6IxwMUJGFGOcVJQA3aDTsUUUAFFFFABRRRQAUhGaWigBoQA5Ap1FFABRRRQAUCiigAooooAKKKKAAdKKKKACiiigAooooAKKKKACiiigAooooAKKKKACqOsI0mlXMaruLRsuMZ6j0q9TZF3IRQB5N8MtV8m1n06RGSWGZsfJtDDPXpivSJNSMcO5oyD7mvHPElmngbxu+pmCeSyuvmHlE4Ru4wBirt/wCNZvEMS6X4dtrl5Z12POQcRDHp60Ac5I7+Lvi7LeQITHbuqAhdwwvGa+h7ddsCA9QK4b4f+B/+Ecs/MnObmU7nAOQDXfAYFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAIRmloooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBpUHtVdrRCc4HtVqigCi+nwsclAe4JFQvpFs64aFDnrkVpkUY6UAYf/COaeIti2cIUnLARjBP/wCupl0S0QkLbxjPXCjmtbAoxzQBSWxiRQAg4wOlWBbopGB0qUCloAjVMAVJRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRSY96AFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCpf6baanavbXcKSwv95WHWqml+HNM0hStlaxxAnJ2jqa1qKAAADoKKKKACiiigAooooAKKKKACiiigAooooAKKTNLQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRQKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKO9FGOaACiiigAopAR0zzS0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFGc0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFIeKKKAFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKQnkCiigBaKKKACiiigAooooAKKKKACiiigAooooA//Z" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "YtQ/og5wv6H9siUQ0cBg0g==" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B3331000\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "3cprLrYfk2E=" ], "X-Ms-Request-Id": [ "cc605ee8-c01e-0042-2b59-59a1a2000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "548d1c705705b6e3", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "38430" ], "Content-Md5": [ "YtQ/og5wv6H9siUQ0cBg0g==" ], "Content-Type": [ "image/jpeg" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B3331000\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "cc605efc-c01e-0042-3e59-59a1a2000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "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NQu4GCulv823Pv06iufTwprfjG5W58Q3MogJ3LaoNqICOAMEg/jXTaP8OdL0rGyEO3AJZF6D6D9a7K3sY4YgqggAYHtQBmaJ4fs9MiAgt40AGMquDW6IxwMUJGFGOcVJQA3aDTsUUUAFFFFABRRRQAUhGaWigBoQA5Ap1FFABRRRQAUCiigAooooAKKKKAAdKKKKACiiigAooooAKKKKACiiigAooooAKKKKACqOsI0mlXMaruLRsuMZ6j0q9TZF3IRQB5N8MtV8m1n06RGSWGZsfJtDDPXpivSJNSMcO5oyD7mvHPElmngbxu+pmCeSyuvmHlE4Ru4wBirt/wCNZvEMS6X4dtrl5Z12POQcRDHp60Ac5I7+Lvi7LeQITHbuqAhdwwvGa+h7ddsCA9QK4b4f+B/+Ecs/MnObmU7nAOQDXfAYFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAIRmloooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBpUHtVdrRCc4HtVqigCi+nwsclAe4JFQvpFs64aFDnrkVpkUY6UAYf/COaeIti2cIUnLARjBP/wCupl0S0QkLbxjPXCjmtbAoxzQBSWxiRQAg4wOlWBbopGB0qUCloAjVMAVJRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRSY96AFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCpf6baanavbXcKSwv95WHWqml+HNM0hStlaxxAnJ2jqa1qKAAADoKKKKACiiigAooooAKKKKACiiigAooooAKKTNLQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRQKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKO9FGOaACiiigAopAR0zzS0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFGc0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFIeKKKAFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKQnkCiigBaKKKACiiigAooooAKKKKACiiigAooooA//Z" } }, { "ID": "de5d33292cd052ac", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "38430" ], "Content-Md5": [ "YtQ/og5wv6H9siUQ0cBg0g==" ], "Content-Type": [ "image/jpeg" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B3331000\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "cc605f0b-c01e-0042-4c59-59a1a2000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "9a0d2115f52419b8", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "cc605f12-c01e-0042-5159-59a1a2000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestWrite/a_large_jpg_file_written_in_two_chunks_gets_a_ContentType.replay ================================================ { "Initial": "AQAAAA7dVMChKbuqXgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "8a61c33a678818cd", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "38430" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Type": [ "image/jpeg" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "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NQu4GCulv823Pv06iufTwprfjG5W58Q3MogJ3LaoNqICOAMEg/jXTaP8OdL0rGyEO3AJZF6D6D9a7K3sY4YgqggAYHtQBmaJ4fs9MiAgt40AGMquDW6IxwMUJGFGOcVJQA3aDTsUUUAFFFFABRRRQAUhGaWigBoQA5Ap1FFABRRRQAUCiigAooooAKKKKAAdKKKKACiiigAooooAKKKKACiiigAooooAKKKKACqOsI0mlXMaruLRsuMZ6j0q9TZF3IRQB5N8MtV8m1n06RGSWGZsfJtDDPXpivSJNSMcO5oyD7mvHPElmngbxu+pmCeSyuvmHlE4Ru4wBirt/wCNZvEMS6X4dtrl5Z12POQcRDHp60Ac5I7+Lvi7LeQITHbuqAhdwwvGa+h7ddsCA9QK4b4f+B/+Ecs/MnObmU7nAOQDXfAYFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAIRmloooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBpUHtVdrRCc4HtVqigCi+nwsclAe4JFQvpFs64aFDnrkVpkUY6UAYf/COaeIti2cIUnLARjBP/wCupl0S0QkLbxjPXCjmtbAoxzQBSWxiRQAg4wOlWBbopGB0qUCloAjVMAVJRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRSY96AFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCpf6baanavbXcKSwv95WHWqml+HNM0hStlaxxAnJ2jqa1qKAAADoKKKKACiiigAooooAKKKKACiiigAooooAKKTNLQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRQKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKO9FGOaACiiigAopAR0zzS0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFGc0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFIeKKKAFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKQnkCiigBaKKKACiiigAooooAKKKKACiiigAooooA//Z" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "YtQ/og5wv6H9siUQ0cBg0g==" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B34E352C\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "3cprLrYfk2E=" ], "X-Ms-Request-Id": [ "a5efc8ba-201e-0075-5859-59730e000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "8f72eff4b6da0fce", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "38430" ], "Content-Md5": [ "YtQ/og5wv6H9siUQ0cBg0g==" ], "Content-Type": [ "image/jpeg" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B34E352C\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "a5efc8ca-201e-0075-6559-59730e000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "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NQu4GCulv823Pv06iufTwprfjG5W58Q3MogJ3LaoNqICOAMEg/jXTaP8OdL0rGyEO3AJZF6D6D9a7K3sY4YgqggAYHtQBmaJ4fs9MiAgt40AGMquDW6IxwMUJGFGOcVJQA3aDTsUUUAFFFFABRRRQAUhGaWigBoQA5Ap1FFABRRRQAUCiigAooooAKKKKAAdKKKKACiiigAooooAKKKKACiiigAooooAKKKKACqOsI0mlXMaruLRsuMZ6j0q9TZF3IRQB5N8MtV8m1n06RGSWGZsfJtDDPXpivSJNSMcO5oyD7mvHPElmngbxu+pmCeSyuvmHlE4Ru4wBirt/wCNZvEMS6X4dtrl5Z12POQcRDHp60Ac5I7+Lvi7LeQITHbuqAhdwwvGa+h7ddsCA9QK4b4f+B/+Ecs/MnObmU7nAOQDXfAYFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAIRmloooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBpUHtVdrRCc4HtVqigCi+nwsclAe4JFQvpFs64aFDnrkVpkUY6UAYf/COaeIti2cIUnLARjBP/wCupl0S0QkLbxjPXCjmtbAoxzQBSWxiRQAg4wOlWBbopGB0qUCloAjVMAVJRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRSY96AFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCpf6baanavbXcKSwv95WHWqml+HNM0hStlaxxAnJ2jqa1qKAAADoKKKKACiiigAooooAKKKKACiiigAooooAKKTNLQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRQKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKO9FGOaACiiigAopAR0zzS0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFGc0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFIeKKKAFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKQnkCiigBaKKKACiiigAooooAKKKKACiiigAooooA//Z" } }, { "ID": "0d28174169b433d9", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "38430" ], "Content-Md5": [ "YtQ/og5wv6H9siUQ0cBg0g==" ], "Content-Type": [ "image/jpeg" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Etag": [ "\"0x8DC2770B34E352C\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "a5efc8d7-201e-0075-7059-59730e000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "d02c078f55191abd", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:57 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "a5efc8de-201e-0075-7659-59730e000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestWrite/a_small_text_file_gets_a_ContentType.replay ================================================ { "Initial": "AQAAAA7dVMCMOTi7MAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "3e4fedee8ab0f8f4", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "20" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "VGhpcyBpcyBhIHRleHQgZmlsZS4=" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "PzMJMSzDJkoTibLSY97OjQ==" ], "Date": [ "Wed, 07 Feb 2024 00:06:36 GMT" ], "Etag": [ "\"0x8DC2770A6EFD48F\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:37 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "t1+o9/4ppWU=" ], "X-Ms-Request-Id": [ "d0fa4863-301e-001b-2359-592621000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "7f9524124d54496b", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "20" ], "Content-Md5": [ "PzMJMSzDJkoTibLSY97OjQ==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:36 GMT" ], "Etag": [ "\"0x8DC2770A6EFD48F\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:37 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:37 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "d0fa4868-301e-001b-2759-592621000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "VGhpcyBpcyBhIHRleHQgZmlsZS4=" } }, { "ID": "c542b853c7c61275", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "20" ], "Content-Md5": [ "PzMJMSzDJkoTibLSY97OjQ==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:36 GMT" ], "Etag": [ "\"0x8DC2770A6EFD48F\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:37 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:37 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "d0fa4873-301e-001b-2e59-592621000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "14ab534fb309eb60", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:36 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "d0fa487d-301e-001b-3659-592621000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestWrite/invalid_ContentType_fails.replay ================================================ { "Initial": "AQAAAA7dVMB3KKpGPgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "f80800bad2ec5a9a", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 502, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Warning": [ "199 \"martian\" \"dial tcp 20.60.80.2:443: connect: connection timed out\" \"Wed, 07 Feb 2024 00:06:35 GMT\"" ] }, "Body": "" } }, { "ID": "36bf63e6a40cb44d", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "215" ], "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:35 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Error-Code": [ "BlobNotFound" ], "X-Ms-Request-Id": [ "446981c6-b01e-0058-2859-59c07d000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RXJyb3I+PENvZGU+QmxvYk5vdEZvdW5kPC9Db2RlPjxNZXNzYWdlPlRoZSBzcGVjaWZpZWQgYmxvYiBkb2VzIG5vdCBleGlzdC4KUmVxdWVzdElkOjQ0Njk4MWM2LWIwMWUtMDA1OC0yODU5LTU5YzA3ZDAwMDAwMApUaW1lOjIwMjQtMDItMDdUMDA6MDY6MzYuMTUxNTE5M1o8L01lc3NhZ2U+PC9FcnJvcj4=" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestWrite/no_write_then_close_results_in_empty_blob,_blob_existed.replay ================================================ { "Initial": "AQAAAA7dVMB3H4AeBAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "941b3cf92d9bafda", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ null ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "1B2M2Y8AsgTpgAmY7PhCfg==" ], "Date": [ "Wed, 07 Feb 2024 00:06:15 GMT" ], "Etag": [ "\"0x8DC27709A2BBC06\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:15 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "AAAAAAAAAAA=" ], "X-Ms-Request-Id": [ "3e5803d1-701e-0035-6c59-597436000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "a4f68aa90e7ee68c", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "0" ], "Content-Md5": [ "1B2M2Y8AsgTpgAmY7PhCfg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:15 GMT" ], "Etag": [ "\"0x8DC27709A2BBC06\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:15 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:15 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "3e5803e7-701e-0035-7f59-597436000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "fb1ff0f8593675c8", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:15 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "3e5803ee-701e-0035-0559-597436000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestWrite/no_write_then_close_results_in_empty_blob.replay ================================================ { "Initial": "AQAAAA7dVMB3F9/72QAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "cc8bb0c9b188ed79", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ null ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "1B2M2Y8AsgTpgAmY7PhCfg==" ], "Date": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Etag": [ "\"0x8DC27709A163B59\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:15 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "AAAAAAAAAAA=" ], "X-Ms-Request-Id": [ "853285a1-a01e-0026-5959-59503a000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "e5b18ee2e03199f0", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "0" ], "Content-Md5": [ "1B2M2Y8AsgTpgAmY7PhCfg==" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Etag": [ "\"0x8DC27709A163B59\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:15 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:15 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "853285b0-a01e-0026-6759-59503a000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "c0ca7694e64db930", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "853285b8-a01e-0026-6d59-59503a000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestWrite/write_to_empty_key_fails.replay ================================================ { "Initial": "AQAAAA7dVMB3Ee6ItAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "4c45c88947e81a8f", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Type": [ "text/plain; charset=utf-8" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ null ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "325" ], "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Microsoft-HTTPAPI/2.0" ], "X-Ms-Error-Code": [ "InvalidUri" ], "X-Ms-Request-Id": [ "2441b67a-e01e-0055-1c59-5908a9000000" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RXJyb3I+PENvZGU+SW52YWxpZFVyaTwvQ29kZT48TWVzc2FnZT5UaGUgcmVxdWVzdGVkIFVSSSBkb2VzIG5vdCByZXByZXNlbnQgYW55IHJlc291cmNlIG9uIHRoZSBzZXJ2ZXIuClJlcXVlc3RJZDoyNDQxYjY3YS1lMDFlLTAwNTUtMWM1OS01OTA4YTkwMDAwMDAKVGltZToyMDI0LTAyLTA3VDAwOjA2OjE1LjM3MjY4NTFaPC9NZXNzYWdlPjxVcmlQYXRoPmh0dHBzOi8vZ29jbG91ZGJsb2J0ZXN0cy5ibG9iLmNvcmUud2luZG93cy5uZXQvZ28tY2xvdWQtYnVja2V0LzwvVXJpUGF0aD48L0Vycm9yPg==" } }, { "ID": "bcb7cbe66eb0e2a1", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "325" ], "Content-Type": [ "application/xml" ], "Date": [ "Wed, 07 Feb 2024 00:06:14 GMT" ], "Server": [ "Microsoft-HTTPAPI/2.0" ], "X-Ms-Error-Code": [ "InvalidUri" ], "X-Ms-Request-Id": [ "2441b67f-e01e-0055-2059-5908a9000000" ] }, "Body": "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RXJyb3I+PENvZGU+SW52YWxpZFVyaTwvQ29kZT48TWVzc2FnZT5UaGUgcmVxdWVzdGVkIFVSSSBkb2VzIG5vdCByZXByZXNlbnQgYW55IHJlc291cmNlIG9uIHRoZSBzZXJ2ZXIuClJlcXVlc3RJZDoyNDQxYjY3Zi1lMDFlLTAwNTUtMjA1OS01OTA4YTkwMDAwMDAKVGltZToyMDI0LTAyLTA3VDAwOjA2OjE1LjM5MDY3NjVaPC9NZXNzYWdlPjxVcmlQYXRoPmh0dHBzOi8vZ29jbG91ZGJsb2J0ZXN0cy5ibG9iLmNvcmUud2luZG93cy5uZXQvZ28tY2xvdWQtYnVja2V0LzwvVXJpUGF0aD48L0Vycm9yPg==" } } ] } ================================================ FILE: blob/azureblob/testdata/TestConformance/TestWrite/write_with_explicit_ContentType_overrides_discovery.replay ================================================ { "Initial": "AQAAAA7dVMCMHDzHRAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "\u003cBlock(l|L)ist\u003e\u003cLatest\u003e.*\u003c/Latest\u003e\u003c/Block(l|L)ist\u003e" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^X-Ms-Version$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^blockid$" ], "RemoveParams": [ "^se$", "^sig$", "^st$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "fdeec03d70573910", "Request": { "Method": "PUT", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "6354" ], "User-Agent": [ "CLEARED" ], "X-Ms-Blob-Cache-Control": [ "" ], "X-Ms-Blob-Content-Disposition": [ "" ], "X-Ms-Blob-Content-Encoding": [ "" ], "X-Ms-Blob-Content-Language": [ "" ], "X-Ms-Blob-Content-Type": [ "application/json" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "PCFET0NUWVBFIGh0bWw+PGh0bWwgbGFuZz0iZW4iPgo8aGVhZCBwcm9maWxlPSJodHRwOi8vYTkuY29tLy0vc3BlYy9vcGVuc2VhcmNoLzEuMS8iPgogIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgPGxpbmsgaHJlZj0iLy0vYm9vdHN0cmFwLm1pbi5jc3M/dj04YmVjMWJiYTNlMjNlY2JhMjJjZmZiMTk3YTJkNDQwYWY0MTBiMTVkIiByZWw9InN0eWxlc2hlZXQiPgogIDxsaW5rIGhyZWY9Ii8tL3NpdGUuY3NzP3Y9N2Q4MWY0MTA0Yzg5ZGJlMzc2MzQ1ZjZiZmUzZTYyYjRlNDBkM2QwNiIgcmVsPSJzdHlsZXNoZWV0Ij4KICA8dGl0bGU+R29Eb2M8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5Pgo8bmF2IGNsYXNzPSJuYXZiYXIgbmF2YmFyLWRlZmF1bHQiIHJvbGU9Im5hdmlnYXRpb24iPgogIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgPGRpdiBjbGFzcz0ibmF2YmFyLWhlYWRlciI+CiAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Im5hdmJhci10b2dnbGUiIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSIgZGF0YS10YXJnZXQ9Ii5uYXZiYXItY29sbGFwc2UiPgogICAgICA8c3BhbiBjbGFzcz0ic3Itb25seSI+VG9nZ2xlIG5hdmlnYXRpb248L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iaWNvbi1iYXIiPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9Imljb24tYmFyIj48L3NwYW4+CiAgICA8L2J1dHRvbj4KICAgIDxhIGNsYXNzPSJuYXZiYXItYnJhbmQiIGhyZWY9Ii8iPjxzdHJvbmc+R29Eb2M8L3N0cm9uZz48L2E+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlIj4KICAgIDx1bCBjbGFzcz0ibmF2IG5hdmJhci1uYXYiPgogICAgICAgIDxsaSBjbGFzcz0iYWN0aXZlIj48YSBocmVmPSIvIj5Ib21lPC9hPjwvbGk+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dDwvYT48L2xpPgogICAgPC91bD4KICAgIDxmb3JtIGNsYXNzPSJuYXZiYXItbmF2IG5hdmJhci1mb3JtIG5hdmJhci1yaWdodCIgaWQ9Ingtc2VhcmNoIiBhY3Rpb249Ii8iIHJvbGU9InNlYXJjaCI+PGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJ4LXNlYXJjaC1xdWVyeSIgdHlwZT0idGV4dCIgbmFtZT0icSIgcGxhY2Vob2xkZXI9IlNlYXJjaCI+PC9mb3JtPgogIDwvZGl2Pgo8L2Rpdj4KPC9uYXY+CjxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgCjxkaXYgY2xhc3M9Imp1bWJvdHJvbiI+CiAgICA8aDI+U2VhcmNoIGZvciBHbyBQYWNrYWdlczwvaDI+CiAgICAKICA8Zm9ybT4KICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5hbWU9InEiIGF1dG9mb2N1cz0iYXV0b2ZvY3VzIiB2YWx1ZT0iIiBwbGFjZWhvbGRlcj0iU2VhcmNoIGZvciBwYWNrYWdlIGJ5IGltcG9ydCBwYXRoIG9yIGtleXdvcmQuIiB0eXBlPSJ0ZXh0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImlucHV0LWdyb3VwLWJ0biI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IiB0eXBlPSJzdWJtaXQiPkdvITwvYnV0dG9uPgogICAgICA8L3NwYW4+CiAgICA8L2Rpdj4KICA8L2Zvcm0+Cgo8L2Rpdj4KCjxwPkdvRG9jIGhvc3RzIGRvY3VtZW50YXRpb24gZm9yIDxhIGhyZWY9Imh0dHA6Ly9nb2xhbmcub3JnLyI+R288L2E+IHBhY2thZ2VzCm9uIEJpdGJ1Y2tldCwgR2l0SHViLCBHb29nbGUgUHJvamVjdCBIb3N0aW5nIGFuZCBMYXVuY2hwYWQuICBSZWFkIHRoZSA8YQogIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dCBQYWdlPC9hPiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYWRkaW5nIHBhY2thZ2VzIHRvIEdvRG9jCmFuZCBtb3JlLgoKPGRpdiBjbGFzcz0icm93Ij4KICA8ZGl2IGNsYXNzPSJjb2wtc20tNiI+CiAgICAKICAgICAgPGg0PlBvcHVsYXIgUGFja2FnZXM8L2g0PgogICAgICA8dWwgY2xhc3M9Imxpc3QtdW5zdHlsZWQiPgogICAgICAgIDxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1nby9hd3MiPmdpdGh1Yi5jb20vYXdzL2F3cy1zZGstZ28vYXdzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9kZ3JpamFsdmEvand0LWdvIj5naXRodWIuY29tL2RncmlqYWx2YS9qd3QtZ288L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dpbi1nb25pYy9naW4iPmdpdGh1Yi5jb20vZ2luLWdvbmljL2dpbjwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXMiPmdpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dvLXNxbC1kcml2ZXIvbXlzcWwiPmdpdGh1Yi5jb20vZ28tc3FsLWRyaXZlci9teXNxbDwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29sYW5nL3Byb3RvYnVmL3Byb3RvIj5naXRodWIuY29tL2dvbGFuZy9wcm90b2J1Zi9wcm90bzwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29tb2R1bGUvcmVkaWdvL3JlZGlzIj5naXRodWIuY29tL2dvbW9kdWxlL3JlZGlnby9yZWRpczwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQiPmdpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQ8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltIj5naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9qaW56aHUvZ29ybSI+Z2l0aHViLmNvbS9qaW56aHUvZ29ybTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vbGliL3BxIj5naXRodWIuY29tL2xpYi9wcTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcGtnL2Vycm9ycyI+Z2l0aHViLmNvbS9wa2cvZXJyb3JzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1cyI+Z2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1czwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcm9iZmlnL2Nyb24iPmdpdGh1Yi5jb20vcm9iZmlnL2Nyb248L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3NpcnVwc2VuL2xvZ3J1cyI+Z2l0aHViLmNvbS9zaXJ1cHNlbi9sb2dydXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0Ij5naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0PC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS91bml4cGlja2xlL2thaG9vdC1oYWNrIj5naXRodWIuY29tL3VuaXhwaWNrbGUva2Fob290LWhhY2s8L2E+PGxpPjxhIGhyZWY9Ii9nby51YmVyLm9yZy96YXAiPmdvLnViZXIub3JnL3phcDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9jcnlwdG8vc3NoIj5nb2xhbmcub3JnL3gvY3J5cHRvL3NzaDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9uZXQvY29udGV4dCI+Z29sYW5nLm9yZy94L25ldC9jb250ZXh0PC9hPjxsaT48YSBocmVmPSIvZ29sYW5nLm9yZy94L29hdXRoMiI+Z29sYW5nLm9yZy94L29hdXRoMjwvYT48bGk+PGEgaHJlZj0iL2dvb2dsZS5nb2xhbmcub3JnL2dycGMiPmdvb2dsZS5nb2xhbmcub3JnL2dycGM8L2E+PGxpPjxhIGhyZWY9Ii9nb3BrZy5pbi9tZ28udjIiPmdvcGtnLmluL21nby52MjwvYT48bGk+PGEgaHJlZj0iL2dvcGtnLmluL3lhbWwudjIiPmdvcGtnLmluL3lhbWwudjI8L2E+PGxpPjxhIGhyZWY9Ii9sYWJpeC5vcmcvdjIvbWdvIj5sYWJpeC5vcmcvdjIvbWdvPC9hPgogICAgICA8L3VsPgogICAgCiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sLXNtLTYiPgogICAgPGg0Pk1vcmUgUGFja2FnZXM8L2g0PgogICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIj4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL2dvIj5HbyBTdGFuZGFyZCBQYWNrYWdlczwvYT4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL3N1YnJlcG8iPkdvIFN1Yi1yZXBvc2l0b3J5IFBhY2thZ2VzPC9hPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9nb2xhbmcub3JnL3dpa2kvUHJvamVjdHMiPlByb2plY3RzIEAgZ28td2lraTwvYT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zZWFyY2g/bz1kZXNjJmFtcDtxPWxhbmd1YWdlJTNBZ28mYW1wO3M9c3RhcnMmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5Nb3N0IHN0YXJzPC9hPiwgCiAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NlYXJjaD9vPWRlc2MmYW1wO3E9bGFuZ3VhZ2UlM0FnbyZhbXA7cz1mb3JrcyZhbXA7dHlwZT1SZXBvc2l0b3JpZXMiPm1vc3QgZm9ya3M8L2E+LCAKICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2VhcmNoP289ZGVzYyZhbXA7cT1sYW5ndWFnZSUzQWdvJmFtcDtzPXVwZGF0ZWQmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5yZWNlbnRseSB1cGRhdGVkPC9hPiBvbiBHaXRIdWIKICAgIDwvdWw+CiAgPC9kaXY+CjwvZGl2PgoKCjwvZGl2Pgo8ZGl2IGlkPSJ4LWZvb3RlciIgY2xhc3M9ImNsZWFyZml4Ij4KICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2dvbGFuZy9nZGRvL2lzc3VlcyI+V2Vic2l0ZSBJc3N1ZXM8L2E+CiAgICA8c3BhbiBjbGFzcz0idGV4dC1tdXRlZCI+fDwvc3Bhbj4gPGEgaHJlZj0iaHR0cDovL2dvbGFuZy5vcmcvIj5HbyBMYW5ndWFnZTwvYT4KICAgIDxzcGFuIGNsYXNzPSJwdWxsLXJpZ2h0Ij48YSBocmVmPSIjIj5CYWNrIHRvIHRvcDwvYT48L3NwYW4+CiAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ieC1zaG9ydGN1dHMiIHRhYmluZGV4PSItMSIgY2xhc3M9Im1vZGFsIj4KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+CiAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvYnV0dG9uPgogICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+S2V5Ym9hcmQgc2hvcnRjdXRzPC9oND4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4/PC9iPjwvdGQ+PHRkPiA6IFRoaXMgbWVudTwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4vPC9iPjwvdGQ+PHRkPiA6IFNlYXJjaCBzaXRlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5mPC9iPjwvdGQ+PHRkPiA6IEp1bXAgdG8gaWRlbnRpZmllcjwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmc8L2I+PC90ZD48dGQ+IDogR28gdG8gdG9wIG9mIHBhZ2U8L3RkPjwvdHI+CiAgICAgICAgICA8dHI+PHRkIGFsaWduPSJyaWdodCI+PGI+ZzwvYj4gdGhlbiA8Yj5iPC9iPjwvdGQ+PHRkPiA6IEdvIHRvIGVuZCBvZiBwYWdlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmk8L2I+PC90ZD48dGQ+IDogR28gdG8gaW5kZXg8L3RkPjwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9InRleHQtbXV0ZWQiPjx0ZCBhbGlnbj0icmlnaHQiPjxiPmc8L2I+IHRoZW4gPGI+ZTwvYj48L3RkPjx0ZD4gOiBHbyB0byBleGFtcGxlczwvdGQ+PC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KPHNjcmlwdCBzcmM9Ii8tL2pxdWVyeS0yLjAuMy5taW4uanM/dj1mYmY5Yzc3ZDBjNGUzYzM0YTQ4NTk4MGMxZTUzMTZiNjIxMjE2MGM4Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL2Jvb3RzdHJhcC5taW4uanM/dj01YWRhN2MxMDNmYzFkZWFiYzkyNWNjMWZkYmJiNmU0NTFjMjFmYzcwIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL3NpdGUuanM/dj0zNzFkZTczMWMxOGQ5MWM0OTlkOTBiMWFiMGJmMzllY2Y2NmQ2Y2Y3Ij48L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+" ] }, "Response": { "StatusCode": 201, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Md5": [ "D2p8n/PT13C49/oZwq4Z0A==" ], "Date": [ "Wed, 07 Feb 2024 00:06:35 GMT" ], "Etag": [ "\"0x8DC2770A6A58FE9\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:36 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Content-Crc64": [ "h/FDiq2zgEw=" ], "X-Ms-Request-Id": [ "fbc0ab6d-301e-0056-4459-59e9cd000000" ], "X-Ms-Request-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "13fc0e5ed8fa5204", "Request": { "Method": "GET", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "6354" ], "Content-Md5": [ "D2p8n/PT13C49/oZwq4Z0A==" ], "Content-Type": [ "application/json" ], "Date": [ "Wed, 07 Feb 2024 00:06:35 GMT" ], "Etag": [ "\"0x8DC2770A6A58FE9\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:36 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:36 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "fbc0ab90-301e-0056-5259-59e9cd000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "PCFET0NUWVBFIGh0bWw+PGh0bWwgbGFuZz0iZW4iPgo8aGVhZCBwcm9maWxlPSJodHRwOi8vYTkuY29tLy0vc3BlYy9vcGVuc2VhcmNoLzEuMS8iPgogIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgPGxpbmsgaHJlZj0iLy0vYm9vdHN0cmFwLm1pbi5jc3M/dj04YmVjMWJiYTNlMjNlY2JhMjJjZmZiMTk3YTJkNDQwYWY0MTBiMTVkIiByZWw9InN0eWxlc2hlZXQiPgogIDxsaW5rIGhyZWY9Ii8tL3NpdGUuY3NzP3Y9N2Q4MWY0MTA0Yzg5ZGJlMzc2MzQ1ZjZiZmUzZTYyYjRlNDBkM2QwNiIgcmVsPSJzdHlsZXNoZWV0Ij4KICA8dGl0bGU+R29Eb2M8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5Pgo8bmF2IGNsYXNzPSJuYXZiYXIgbmF2YmFyLWRlZmF1bHQiIHJvbGU9Im5hdmlnYXRpb24iPgogIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgPGRpdiBjbGFzcz0ibmF2YmFyLWhlYWRlciI+CiAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Im5hdmJhci10b2dnbGUiIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSIgZGF0YS10YXJnZXQ9Ii5uYXZiYXItY29sbGFwc2UiPgogICAgICA8c3BhbiBjbGFzcz0ic3Itb25seSI+VG9nZ2xlIG5hdmlnYXRpb248L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iaWNvbi1iYXIiPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9Imljb24tYmFyIj48L3NwYW4+CiAgICA8L2J1dHRvbj4KICAgIDxhIGNsYXNzPSJuYXZiYXItYnJhbmQiIGhyZWY9Ii8iPjxzdHJvbmc+R29Eb2M8L3N0cm9uZz48L2E+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlIj4KICAgIDx1bCBjbGFzcz0ibmF2IG5hdmJhci1uYXYiPgogICAgICAgIDxsaSBjbGFzcz0iYWN0aXZlIj48YSBocmVmPSIvIj5Ib21lPC9hPjwvbGk+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dDwvYT48L2xpPgogICAgPC91bD4KICAgIDxmb3JtIGNsYXNzPSJuYXZiYXItbmF2IG5hdmJhci1mb3JtIG5hdmJhci1yaWdodCIgaWQ9Ingtc2VhcmNoIiBhY3Rpb249Ii8iIHJvbGU9InNlYXJjaCI+PGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJ4LXNlYXJjaC1xdWVyeSIgdHlwZT0idGV4dCIgbmFtZT0icSIgcGxhY2Vob2xkZXI9IlNlYXJjaCI+PC9mb3JtPgogIDwvZGl2Pgo8L2Rpdj4KPC9uYXY+CjxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgCjxkaXYgY2xhc3M9Imp1bWJvdHJvbiI+CiAgICA8aDI+U2VhcmNoIGZvciBHbyBQYWNrYWdlczwvaDI+CiAgICAKICA8Zm9ybT4KICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5hbWU9InEiIGF1dG9mb2N1cz0iYXV0b2ZvY3VzIiB2YWx1ZT0iIiBwbGFjZWhvbGRlcj0iU2VhcmNoIGZvciBwYWNrYWdlIGJ5IGltcG9ydCBwYXRoIG9yIGtleXdvcmQuIiB0eXBlPSJ0ZXh0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImlucHV0LWdyb3VwLWJ0biI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IiB0eXBlPSJzdWJtaXQiPkdvITwvYnV0dG9uPgogICAgICA8L3NwYW4+CiAgICA8L2Rpdj4KICA8L2Zvcm0+Cgo8L2Rpdj4KCjxwPkdvRG9jIGhvc3RzIGRvY3VtZW50YXRpb24gZm9yIDxhIGhyZWY9Imh0dHA6Ly9nb2xhbmcub3JnLyI+R288L2E+IHBhY2thZ2VzCm9uIEJpdGJ1Y2tldCwgR2l0SHViLCBHb29nbGUgUHJvamVjdCBIb3N0aW5nIGFuZCBMYXVuY2hwYWQuICBSZWFkIHRoZSA8YQogIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dCBQYWdlPC9hPiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYWRkaW5nIHBhY2thZ2VzIHRvIEdvRG9jCmFuZCBtb3JlLgoKPGRpdiBjbGFzcz0icm93Ij4KICA8ZGl2IGNsYXNzPSJjb2wtc20tNiI+CiAgICAKICAgICAgPGg0PlBvcHVsYXIgUGFja2FnZXM8L2g0PgogICAgICA8dWwgY2xhc3M9Imxpc3QtdW5zdHlsZWQiPgogICAgICAgIDxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1nby9hd3MiPmdpdGh1Yi5jb20vYXdzL2F3cy1zZGstZ28vYXdzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9kZ3JpamFsdmEvand0LWdvIj5naXRodWIuY29tL2RncmlqYWx2YS9qd3QtZ288L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dpbi1nb25pYy9naW4iPmdpdGh1Yi5jb20vZ2luLWdvbmljL2dpbjwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXMiPmdpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dvLXNxbC1kcml2ZXIvbXlzcWwiPmdpdGh1Yi5jb20vZ28tc3FsLWRyaXZlci9teXNxbDwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29sYW5nL3Byb3RvYnVmL3Byb3RvIj5naXRodWIuY29tL2dvbGFuZy9wcm90b2J1Zi9wcm90bzwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29tb2R1bGUvcmVkaWdvL3JlZGlzIj5naXRodWIuY29tL2dvbW9kdWxlL3JlZGlnby9yZWRpczwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQiPmdpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQ8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltIj5naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9qaW56aHUvZ29ybSI+Z2l0aHViLmNvbS9qaW56aHUvZ29ybTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vbGliL3BxIj5naXRodWIuY29tL2xpYi9wcTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcGtnL2Vycm9ycyI+Z2l0aHViLmNvbS9wa2cvZXJyb3JzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1cyI+Z2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1czwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcm9iZmlnL2Nyb24iPmdpdGh1Yi5jb20vcm9iZmlnL2Nyb248L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3NpcnVwc2VuL2xvZ3J1cyI+Z2l0aHViLmNvbS9zaXJ1cHNlbi9sb2dydXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0Ij5naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0PC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS91bml4cGlja2xlL2thaG9vdC1oYWNrIj5naXRodWIuY29tL3VuaXhwaWNrbGUva2Fob290LWhhY2s8L2E+PGxpPjxhIGhyZWY9Ii9nby51YmVyLm9yZy96YXAiPmdvLnViZXIub3JnL3phcDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9jcnlwdG8vc3NoIj5nb2xhbmcub3JnL3gvY3J5cHRvL3NzaDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9uZXQvY29udGV4dCI+Z29sYW5nLm9yZy94L25ldC9jb250ZXh0PC9hPjxsaT48YSBocmVmPSIvZ29sYW5nLm9yZy94L29hdXRoMiI+Z29sYW5nLm9yZy94L29hdXRoMjwvYT48bGk+PGEgaHJlZj0iL2dvb2dsZS5nb2xhbmcub3JnL2dycGMiPmdvb2dsZS5nb2xhbmcub3JnL2dycGM8L2E+PGxpPjxhIGhyZWY9Ii9nb3BrZy5pbi9tZ28udjIiPmdvcGtnLmluL21nby52MjwvYT48bGk+PGEgaHJlZj0iL2dvcGtnLmluL3lhbWwudjIiPmdvcGtnLmluL3lhbWwudjI8L2E+PGxpPjxhIGhyZWY9Ii9sYWJpeC5vcmcvdjIvbWdvIj5sYWJpeC5vcmcvdjIvbWdvPC9hPgogICAgICA8L3VsPgogICAgCiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sLXNtLTYiPgogICAgPGg0Pk1vcmUgUGFja2FnZXM8L2g0PgogICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIj4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL2dvIj5HbyBTdGFuZGFyZCBQYWNrYWdlczwvYT4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL3N1YnJlcG8iPkdvIFN1Yi1yZXBvc2l0b3J5IFBhY2thZ2VzPC9hPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9nb2xhbmcub3JnL3dpa2kvUHJvamVjdHMiPlByb2plY3RzIEAgZ28td2lraTwvYT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zZWFyY2g/bz1kZXNjJmFtcDtxPWxhbmd1YWdlJTNBZ28mYW1wO3M9c3RhcnMmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5Nb3N0IHN0YXJzPC9hPiwgCiAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NlYXJjaD9vPWRlc2MmYW1wO3E9bGFuZ3VhZ2UlM0FnbyZhbXA7cz1mb3JrcyZhbXA7dHlwZT1SZXBvc2l0b3JpZXMiPm1vc3QgZm9ya3M8L2E+LCAKICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2VhcmNoP289ZGVzYyZhbXA7cT1sYW5ndWFnZSUzQWdvJmFtcDtzPXVwZGF0ZWQmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5yZWNlbnRseSB1cGRhdGVkPC9hPiBvbiBHaXRIdWIKICAgIDwvdWw+CiAgPC9kaXY+CjwvZGl2PgoKCjwvZGl2Pgo8ZGl2IGlkPSJ4LWZvb3RlciIgY2xhc3M9ImNsZWFyZml4Ij4KICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2dvbGFuZy9nZGRvL2lzc3VlcyI+V2Vic2l0ZSBJc3N1ZXM8L2E+CiAgICA8c3BhbiBjbGFzcz0idGV4dC1tdXRlZCI+fDwvc3Bhbj4gPGEgaHJlZj0iaHR0cDovL2dvbGFuZy5vcmcvIj5HbyBMYW5ndWFnZTwvYT4KICAgIDxzcGFuIGNsYXNzPSJwdWxsLXJpZ2h0Ij48YSBocmVmPSIjIj5CYWNrIHRvIHRvcDwvYT48L3NwYW4+CiAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ieC1zaG9ydGN1dHMiIHRhYmluZGV4PSItMSIgY2xhc3M9Im1vZGFsIj4KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+CiAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvYnV0dG9uPgogICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+S2V5Ym9hcmQgc2hvcnRjdXRzPC9oND4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4/PC9iPjwvdGQ+PHRkPiA6IFRoaXMgbWVudTwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4vPC9iPjwvdGQ+PHRkPiA6IFNlYXJjaCBzaXRlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5mPC9iPjwvdGQ+PHRkPiA6IEp1bXAgdG8gaWRlbnRpZmllcjwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmc8L2I+PC90ZD48dGQ+IDogR28gdG8gdG9wIG9mIHBhZ2U8L3RkPjwvdHI+CiAgICAgICAgICA8dHI+PHRkIGFsaWduPSJyaWdodCI+PGI+ZzwvYj4gdGhlbiA8Yj5iPC9iPjwvdGQ+PHRkPiA6IEdvIHRvIGVuZCBvZiBwYWdlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmk8L2I+PC90ZD48dGQ+IDogR28gdG8gaW5kZXg8L3RkPjwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9InRleHQtbXV0ZWQiPjx0ZCBhbGlnbj0icmlnaHQiPjxiPmc8L2I+IHRoZW4gPGI+ZTwvYj48L3RkPjx0ZD4gOiBHbyB0byBleGFtcGxlczwvdGQ+PC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KPHNjcmlwdCBzcmM9Ii8tL2pxdWVyeS0yLjAuMy5taW4uanM/dj1mYmY5Yzc3ZDBjNGUzYzM0YTQ4NTk4MGMxZTUzMTZiNjIxMjE2MGM4Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL2Jvb3RzdHJhcC5taW4uanM/dj01YWRhN2MxMDNmYzFkZWFiYzkyNWNjMWZkYmJiNmU0NTFjMjFmYzcwIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL3NpdGUuanM/dj0zNzFkZTczMWMxOGQ5MWM0OTlkOTBiMWFiMGJmMzllY2Y2NmQ2Y2Y3Ij48L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+" } }, { "ID": "1cb1bfa003ff24c9", "Request": { "Method": "HEAD", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Disposition": [ "" ], "Content-Length": [ "6354" ], "Content-Md5": [ "D2p8n/PT13C49/oZwq4Z0A==" ], "Content-Type": [ "application/json" ], "Date": [ "Wed, 07 Feb 2024 00:06:35 GMT" ], "Etag": [ "\"0x8DC2770A6A58FE9\"" ], "Last-Modified": [ "Wed, 07 Feb 2024 00:06:36 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Access-Tier": [ "Hot" ], "X-Ms-Access-Tier-Inferred": [ "true" ], "X-Ms-Blob-Type": [ "BlockBlob" ], "X-Ms-Creation-Time": [ "Wed, 07 Feb 2024 00:06:36 GMT" ], "X-Ms-Lease-State": [ "available" ], "X-Ms-Lease-Status": [ "unlocked" ], "X-Ms-Request-Id": [ "fbc0aba3-301e-0056-5a59-59e9cd000000" ], "X-Ms-Server-Encrypted": [ "true" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } }, { "ID": "76ccd4f096f58709", "Request": { "Method": "DELETE", "URL": "https://gocloudblobtests.blob.core.windows.net/go-cloud-bucket/blob-for-reading", "Header": { "Accept": [ "application/xml" ], "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Ms-Date": [ "CLEARED" ], "X-Ms-Version": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 202, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Wed, 07 Feb 2024 00:06:35 GMT" ], "Server": [ "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" ], "X-Ms-Delete-Type-Permanent": [ "true" ], "X-Ms-Request-Id": [ "fbc0abb0-301e-0056-6159-59e9cd000000" ], "X-Ms-Version": [ "CLEARED" ] }, "Body": "" } } ] } ================================================ FILE: blob/blob.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package blob provides an easy and portable way to interact with blobs // within a storage location. Subpackages contain driver implementations of // blob for supported services. // // See https://gocloud.dev/howto/blob/ for a detailed how-to guide. // // *blob.Bucket implements io/fs.FS and io/fs.SubFS, so it can be used with // functions in that package. // // # Errors // // The errors returned from this package can be inspected in several ways: // // The Code function from gocloud.dev/gcerrors will return an error code, also // defined in that package, when invoked on an error. // // The Bucket.ErrorAs method can retrieve the driver error underlying the returned // error. // // # OpenTelemetry Integration // // OpenTelemetry supports tracing, metrics, and logs collection for multiple languages and // backend providers. See https://opentelemetry.io. // // This API collects OpenTelemetry traces and metrics for the following methods: // - Attributes // - Copy // - Delete // - ListPage // - NewRangeReader, from creation until the call to Close. (NewReader and ReadAll // are included because they call NewRangeReader.) // - NewWriter, from creation until the call to Close. // // All trace and metric names begin with the package import path. // The traces add the method name. // For example, "gocloud.dev/blob/Attributes". // The metrics are "completed_calls", a count of completed method calls by driver, // method and status (error code); and "latency", a distribution of method latency // by driver and method. // For example, "gocloud.dev/blob/latency". // // It also collects the following metrics: // - gocloud.dev/blob/bytes_read: the total number of bytes read, by driver. // - gocloud.dev/blob/bytes_written: the total number of bytes written, by driver. // // To enable trace collection in your application, see the documentation at // https://opentelemetry.io/docs/instrumentation/go/getting-started/. // To enable metric collection in your application, see the documentation at // https://opentelemetry.io/docs/instrumentation/go/manual/. package blob // import "gocloud.dev/blob" import ( "bytes" "context" "crypto/md5" "fmt" "hash" "io" "iter" "log" "mime" "net/http" "net/url" "runtime" "strings" "sync" "time" "unicode/utf8" "go.opentelemetry.io/otel/metric" "gocloud.dev/blob/driver" "gocloud.dev/gcerrors" "gocloud.dev/internal/gcerr" "gocloud.dev/internal/openurl" gcdkotel "gocloud.dev/internal/otel" ) // Ensure that Reader implements io.ReadSeekCloser. var _ = io.ReadSeekCloser(&Reader{}) // Reader reads bytes from a blob. // It implements io.ReadSeekCloser, and must be closed after // reads are finished. type Reader struct { b driver.Bucket r driver.Reader key string ctx context.Context // Used to recreate r after Seeks dopts *driver.ReaderOptions // " baseOffset int64 // The base offset provided to NewRangeReader. baseLength int64 // The length provided to NewRangeReader (may be negative). relativeOffset int64 // Current offset (relative to baseOffset). savedOffset int64 // Last relativeOffset for r, saved after relativeOffset is changed in Seek, or -1 if no Seek. end func(error) // Called at Close to finish trace and metric collection. // for metric collection; bytesReadCounter metric.Int64Counter bytesRead int closed bool } // Read implements io.Reader (https://golang.org/pkg/io/#Reader). func (r *Reader) Read(p []byte) (int, error) { if r.savedOffset != -1 { // We've done one or more Seeks since the last read. We may have // to recreate the Reader. // // Note that remembering the savedOffset and lazily resetting the // reader like this allows the caller to Seek, then Seek again back, // to the original offset, without having to recreate the reader. // We only have to recreate the reader if we actually read after a Seek. // This is an important optimization because it's common to Seek // to (SeekEnd, 0) and use the return value to determine the size // of the data, then Seek back to (SeekStart, 0). saved := r.savedOffset if r.relativeOffset == saved { // Nope! We're at the same place we left off. r.savedOffset = -1 } else { // Yep! We've changed the offset. Recreate the reader. length := r.baseLength if length >= 0 { length -= r.relativeOffset if length < 0 { // Shouldn't happen based on checks in Seek. return 0, gcerr.Newf(gcerr.Internal, nil, "blob: invalid Seek (base length %d, relative offset %d)", r.baseLength, r.relativeOffset) } } newR, err := r.b.NewRangeReader(r.ctx, r.key, r.baseOffset+r.relativeOffset, length, r.dopts) if err != nil { return 0, wrapError(r.b, err, r.key) } _ = r.r.Close() r.savedOffset = -1 r.r = newR } } n, err := r.r.Read(p) r.bytesRead += n r.relativeOffset += int64(n) return n, wrapError(r.b, err, r.key) } // Seek implements io.Seeker (https://golang.org/pkg/io/#Seeker). func (r *Reader) Seek(offset int64, whence int) (int64, error) { if r.savedOffset == -1 { // Save the current offset for our reader. If the Seek changes the // offset, and then we try to read, we'll need to recreate the reader. // See comment above in Read for why we do it lazily. r.savedOffset = r.relativeOffset } // The maximum relative offset is the minimum of: // 1. The actual size of the blob, minus our initial baseOffset. // 2. The length provided to NewRangeReader (if it was non-negative). maxRelativeOffset := r.Size() - r.baseOffset if r.baseLength >= 0 && r.baseLength < maxRelativeOffset { maxRelativeOffset = r.baseLength } switch whence { case io.SeekStart: r.relativeOffset = offset case io.SeekCurrent: r.relativeOffset += offset case io.SeekEnd: r.relativeOffset = maxRelativeOffset + offset } if r.relativeOffset < 0 { // "Seeking to an offset before the start of the file is an error." invalidOffset := r.relativeOffset r.relativeOffset = 0 return 0, fmt.Errorf("Seek resulted in invalid offset %d, using 0", invalidOffset) } if r.relativeOffset > maxRelativeOffset { // "Seeking to any positive offset is legal, but the behavior of subsequent // I/O operations on the underlying object is implementation-dependent." // We'll choose to set the offset to the EOF. log.Printf("blob.Reader.Seek set an offset after EOF (base offset/length from NewRangeReader %d, %d; actual blob size %d; relative offset %d -> absolute offset %d).", r.baseOffset, r.baseLength, r.Size(), r.relativeOffset, r.baseOffset+r.relativeOffset) r.relativeOffset = maxRelativeOffset } return r.relativeOffset, nil } // Close implements io.Closer (https://golang.org/pkg/io/#Closer). func (r *Reader) Close() error { r.closed = true err := wrapError(r.b, r.r.Close(), r.key) r.end(err) // Emit only on close to avoid an allocation on each call to Read(). // Record bytes read metric with OpenTelemetry. if r.bytesReadCounter != nil && r.bytesRead > 0 { r.bytesReadCounter.Add( r.ctx, int64(r.bytesRead)) } return err } // ContentType returns the MIME type of the blob. func (r *Reader) ContentType() string { return r.r.Attributes().ContentType } // ModTime returns the time the blob was last modified. func (r *Reader) ModTime() time.Time { return r.r.Attributes().ModTime } // Size returns the size of the blob content in bytes. func (r *Reader) Size() int64 { return r.r.Attributes().Size } // As converts i to driver-specific types. // See https://gocloud.dev/concepts/as/ for background information, the "As" // examples in this package for examples, and the driver package // documentation for the specific types supported for that driver. func (r *Reader) As(i any) bool { return r.r.As(i) } // WriteTo reads from r and writes to w until there's no more data or // an error occurs. // The return value is the number of bytes written to w. // // It implements the io.WriterTo interface. func (r *Reader) WriteTo(w io.Writer) (int64, error) { // If the writer has a ReaderFrom method, use it to do the copy. // Don't do this for our own *Writer to avoid infinite recursion. // Avoids an allocation and a copy. switch w.(type) { case *Writer: default: if rf, ok := w.(io.ReaderFrom); ok { n, err := rf.ReadFrom(r) return n, err } } _, nw, err := readFromWriteTo(r, w) return nw, err } // downloadAndClose is similar to WriteTo, but ensures it's the only read. // This pattern is more optimal for some drivers. func (r *Reader) downloadAndClose(w io.Writer) (err error) { if r.bytesRead != 0 { // Shouldn't happen. return gcerr.Newf(gcerr.Internal, nil, "blob: downloadAndClose isn't the first read") } driverDownloader, ok := r.r.(driver.Downloader) if ok { err = driverDownloader.Download(w) } else { _, err = r.WriteTo(w) } cerr := r.Close() if err == nil && cerr != nil { err = cerr } return err } // readFromWriteTo is a helper for ReadFrom and WriteTo. // It reads data from r and writes to w, until EOF or a read/write error. // It returns the number of bytes read from r and the number of bytes // written to w. func readFromWriteTo(r io.Reader, w io.Writer) (int64, int64, error) { // Note: can't use io.Copy because it will try to use r.WriteTo // or w.WriteTo, which is recursive in this context. buf := make([]byte, 1024*1024) var totalRead, totalWritten int64 for { numRead, rerr := r.Read(buf) if numRead > 0 { totalRead += int64(numRead) numWritten, werr := w.Write(buf[0:numRead]) totalWritten += int64(numWritten) if werr != nil { return totalRead, totalWritten, werr } } if rerr == io.EOF { // Done! return totalRead, totalWritten, nil } if rerr != nil { return totalRead, totalWritten, rerr } } } // Attributes contains attributes about a blob. type Attributes struct { // CacheControl specifies caching attributes that services may use // when serving the blob. // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control CacheControl string // ContentDisposition specifies whether the blob content is expected to be // displayed inline or as an attachment. // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition ContentDisposition string // ContentEncoding specifies the encoding used for the blob's content, if any. // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding ContentEncoding string // ContentLanguage specifies the language used in the blob's content, if any. // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Language ContentLanguage string // ContentType is the MIME type of the blob. It will not be empty. // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type ContentType string // Metadata holds key/value pairs associated with the blob. // Keys are guaranteed to be in lowercase, even if the backend service // has case-sensitive keys (although note that Metadata written via // this package will always be lowercased). If there are duplicate // case-insensitive keys (e.g., "foo" and "FOO"), only one value // will be kept, and it is undefined which one. Metadata map[string]string // CreateTime is the time the blob was created, if available. If not available, // CreateTime will be the zero time. CreateTime time.Time // ModTime is the time the blob was last modified. ModTime time.Time // Size is the size of the blob's content in bytes. Size int64 // MD5 is an MD5 hash of the blob contents or nil if not available. MD5 []byte // ETag for the blob; see https://en.wikipedia.org/wiki/HTTP_ETag. ETag string asFunc func(any) bool } // As converts i to driver-specific types. // See https://gocloud.dev/concepts/as/ for background information, the "As" // examples in this package for examples, and the driver package // documentation for the specific types supported for that driver. func (a *Attributes) As(i any) bool { if a.asFunc == nil { return false } return a.asFunc(i) } // Writer writes bytes to a blob. // // It implements io.WriteCloser (https://golang.org/pkg/io/#Closer), and must be // closed after all writes are done. type Writer struct { b driver.Bucket w driver.Writer key string end func(err error) // called at Close to finish trace and metric collection cancel func() // cancels the ctx provided to NewTypedWriter if contentMD5 verification fails contentMD5 []byte md5hash hash.Hash // Metric collection fields. bytesWrittenCounter metric.Int64Counter bytesWritten int closed bool // These fields are non-zero values only when w is nil (not yet created). // // A ctx is stored in the Writer since we need to pass it into NewTypedWriter // when we finish detecting the content type of the blob and create the // underlying driver.Writer. This step happens inside Write or Close and // neither of them take a context.Context as an argument. // // All 3 fields are only initialized when we create the Writer without // setting the w field, and are reset to zero values after w is created. ctx context.Context opts *driver.WriterOptions buf *bytes.Buffer } // sniffLen is the byte size of Writer.buf used to detect content-type. const sniffLen = 512 // Write implements the io.Writer interface (https://golang.org/pkg/io/#Writer). // // Writes may happen asynchronously, so the returned error can be nil // even if the actual write eventually fails. The write is only guaranteed to // have succeeded if Close returns no error. func (w *Writer) Write(p []byte) (int, error) { if len(w.contentMD5) > 0 { if _, err := w.md5hash.Write(p); err != nil { return 0, err } } if w.w != nil { return w.write(p) } // If w is not yet created due to no content-type being passed in, try to sniff // the MIME type based on at most 512 bytes of the blob content of p. // Detect the content-type directly if the first chunk is at least 512 bytes. if w.buf.Len() == 0 && len(p) >= sniffLen { return w.open(p) } // Store p in w.buf and detect the content-type when the size of content in // w.buf is at least 512 bytes. n, err := w.buf.Write(p) if err != nil { return 0, err } if w.buf.Len() >= sniffLen { // Note that w.open will return the full length of the buffer; we don't want // to return that as the length of this write since some of them were written in // previous writes. Instead, we return the n from this write, above. _, err := w.open(w.buf.Bytes()) return n, err } return n, nil } // Close closes the blob writer. The write operation is not guaranteed to have succeeded until // Close returns with no error. // Close may return an error if the context provided to create the Writer is // canceled or reaches its deadline. func (w *Writer) Close() (err error) { w.closed = true defer func() { w.end(err) // Emit only on close to avoid an allocation on each call to Write(). // Record bytes written metric with OpenTelemetry. if w.bytesWrittenCounter != nil && w.bytesWritten > 0 { w.bytesWrittenCounter.Add( w.ctx, int64(w.bytesWritten)) } }() if len(w.contentMD5) > 0 { // Verify the MD5 hash of what was written matches the ContentMD5 provided // by the user. md5sum := w.md5hash.Sum(nil) if !bytes.Equal(md5sum, w.contentMD5) { // No match! Return an error, but first cancel the context and call the // driver's Close function to ensure the write is aborted. w.cancel() if w.w != nil { _ = w.w.Close() } return gcerr.Newf(gcerr.FailedPrecondition, nil, "blob: the WriterOptions.ContentMD5 you specified (%X) did not match what was written (%X)", w.contentMD5, md5sum) } } defer w.cancel() if w.w != nil { return wrapError(w.b, w.w.Close(), w.key) } if _, err := w.open(w.buf.Bytes()); err != nil { return err } return wrapError(w.b, w.w.Close(), w.key) } // open tries to detect the MIME type of p and write it to the blob. // The error it returns is wrapped. func (w *Writer) open(p []byte) (int, error) { ct := http.DetectContentType(p) var err error if w.w, err = w.b.NewTypedWriter(w.ctx, w.key, ct, w.opts); err != nil { return 0, wrapError(w.b, err, w.key) } // Set the 3 fields needed for lazy NewTypedWriter back to zero values // (see the comment on Writer). w.buf = nil w.ctx = nil w.opts = nil return w.write(p) } func (w *Writer) write(p []byte) (int, error) { n, err := w.w.Write(p) w.bytesWritten += n return n, wrapError(w.b, err, w.key) } // ReadFrom reads from r and writes to w until EOF or error. // The return value is the number of bytes read from r. // // It implements the io.ReaderFrom interface. func (w *Writer) ReadFrom(r io.Reader) (int64, error) { // If the reader has a WriteTo method, use it to do the copy. // Don't do this for our own *Reader to avoid infinite recursion. // Avoids an allocation and a copy. switch r.(type) { case *Reader: default: if wt, ok := r.(io.WriterTo); ok { n, err := wt.WriteTo(w) return n, err } } nr, _, err := readFromWriteTo(r, w) return nr, err } // uploadAndClose is similar to ReadFrom, but ensures it's the only write. // This pattern is more optimal for some drivers. func (w *Writer) uploadAndClose(r io.Reader) (err error) { if w.bytesWritten != 0 { // Shouldn't happen. return gcerr.Newf(gcerr.Internal, nil, "blob: uploadAndClose must be the first write") } // When ContentMD5 is being checked, we can't use Upload. if len(w.contentMD5) > 0 { _, err = w.ReadFrom(r) } else { driverUploader, ok := w.w.(driver.Uploader) if ok { err = driverUploader.Upload(r) } else { _, err = w.ReadFrom(r) } } cerr := w.Close() if err == nil && cerr != nil { err = cerr } return err } // ListOptions sets options for listing blobs via Bucket.List. type ListOptions struct { // Prefix indicates that only blobs with a key starting with this prefix // should be returned. Prefix string // Delimiter sets the delimiter used to define a hierarchical namespace, // like a filesystem with "directories". It is highly recommended that you // use "" or "/" as the Delimiter. Other values should work through this API, // but service UIs generally assume "/". // // An empty delimiter means that the bucket is treated as a single flat // namespace. // // A non-empty delimiter means that any result with the delimiter in its key // after Prefix is stripped will be returned with ListObject.IsDir = true, // ListObject.Key truncated after the delimiter, and zero values for other // ListObject fields. These results represent "directories". Multiple results // in a "directory" are returned as a single result. Delimiter string // BeforeList is a callback that will be called before each call to the // the underlying service's list functionality. // asFunc converts its argument to driver-specific types. // See https://gocloud.dev/concepts/as/ for background information. BeforeList func(asFunc func(any) bool) error } // ListIterator iterates over List results. type ListIterator struct { b *Bucket opts *driver.ListOptions page *driver.ListPage nextIdx int } // Next returns a *ListObject for the next blob. It returns (nil, io.EOF) if // there are no more. func (i *ListIterator) Next(ctx context.Context) (*ListObject, error) { if i.page != nil { // We've already got a page of results. if i.nextIdx < len(i.page.Objects) { // Next object is in the page; return it. dobj := i.page.Objects[i.nextIdx] i.nextIdx++ return &ListObject{ Key: dobj.Key, ModTime: dobj.ModTime, Size: dobj.Size, MD5: dobj.MD5, IsDir: dobj.IsDir, asFunc: dobj.AsFunc, }, nil } if len(i.page.NextPageToken) == 0 { // Done with current page, and there are no more; return io.EOF. return nil, io.EOF } // We need to load the next page. i.opts.PageToken = i.page.NextPageToken } i.b.mu.RLock() defer i.b.mu.RUnlock() if i.b.closed { return nil, errClosed } // Loading a new page. p, err := i.b.b.ListPaged(ctx, i.opts) if err != nil { return nil, wrapError(i.b.b, err, "") } i.page = p i.nextIdx = 0 return i.Next(ctx) } type errorState struct { mu sync.Mutex done bool err error } func (es *errorState) Done() { es.mu.Lock() es.done = true es.mu.Unlock() } func (es *errorState) Set(err error) { if err != nil { es.mu.Lock() es.err = err es.mu.Unlock() } } func (es *errorState) Err() error { es.mu.Lock() defer es.mu.Unlock() return es.err } func (es *errorState) Func() func() error { return func() error { es.mu.Lock() defer es.mu.Unlock() if !es.done { panic("error function called before iteration completed") } return es.err } } // All iterates over the iterator, returning a *ListObject and a download function for each entry. // // Once iteration is complete, the returned "func() error" will return any errors; a non-nil return // value implies that the iteration did not complete. // Calling this function before iteration is complete will panic. func (i *ListIterator) All(ctx context.Context) (iter.Seq2[*ListObject, func(io.Writer, *ReaderOptions) error], func() error) { var es errorState return func(yield func(*ListObject, func(io.Writer, *ReaderOptions) error) bool) { defer es.Done() for { obj, itErr := i.Next(ctx) if itErr == io.EOF { return } if itErr != nil { es.Set(itErr) return } downloadFunc := func(w io.Writer, opts *ReaderOptions) error { return i.b.Download(ctx, obj.Key, w, opts) } if !yield(obj, downloadFunc) { return } } }, es.Func() } // ListObject represents a single blob returned from List. type ListObject struct { // Key is the key for this blob. Key string // ModTime is the time the blob was last modified. ModTime time.Time // Size is the size of the blob's content in bytes. Size int64 // MD5 is an MD5 hash of the blob contents or nil if not available. MD5 []byte // IsDir indicates that this result represents a "directory" in the // hierarchical namespace, ending in ListOptions.Delimiter. Key can be // passed as ListOptions.Prefix to list items in the "directory". // Fields other than Key and IsDir will not be set if IsDir is true. IsDir bool asFunc func(any) bool } // As converts i to driver-specific types. // See https://gocloud.dev/concepts/as/ for background information, the "As" // examples in this package for examples, and the driver package // documentation for the specific types supported for that driver. func (o *ListObject) As(i any) bool { if o.asFunc == nil { return false } return o.asFunc(i) } // Bucket provides an easy and portable way to interact with blobs // within a "bucket", including read, write, and list operations. // To create a Bucket, use constructors found in driver subpackages. type Bucket struct { b driver.Bucket tracer *gcdkotel.Tracer bytesReadCounter metric.Int64Counter bytesWrittenCounter metric.Int64Counter // ioFSCallback is set via SetIOFSCallback, which must be // called before calling various functions implementing interfaces // from the io/fs package. ioFSCallback func() (context.Context, *ReaderOptions) // mu protects the closed variable. // Read locks are kept to allow holding a read lock for long-running calls, // and thereby prevent closing until a call finishes. mu sync.RWMutex closed bool } const pkgName = "gocloud.dev/blob" var ( // OpenTelemetryViews are predefined views for OpenTelemetry metrics. // The views include counts and latency distributions for API method calls. // See the explanations at https://opentelemetry.io/docs/specs/otel/metrics/data-model/ for usage. OpenTelemetryViews = append( append( gcdkotel.Views(pkgName), gcdkotel.CounterView(pkgName, "/bytes_read", "Sum of bytes read from the service.")...), gcdkotel.CounterView(pkgName, "/bytes_written", "Sum of bytes written to the service.")...) ) // NewBucket is intended for use by drivers only. Do not use in application code. var NewBucket = newBucket // newBucket creates a new *Bucket based on a specific driver implementation. // End users should use subpackages to construct a *Bucket instead of this // function; see the package documentation for details. func newBucket(b driver.Bucket) *Bucket { providerName := gcdkotel.ProviderName(b) return &Bucket{ b: b, ioFSCallback: func() (context.Context, *ReaderOptions) { return context.Background(), nil }, tracer: gcdkotel.NewTracer(pkgName, providerName), bytesReadCounter: gcdkotel.BytesMeasure(pkgName, providerName, "/bytes_read", "Total bytes read from blob storage"), bytesWrittenCounter: gcdkotel.BytesMeasure(pkgName, providerName, "/bytes_written", "Total bytes written to blob storage"), } } // As converts i to driver-specific types. // See https://gocloud.dev/concepts/as/ for background information, the "As" // examples in this package for examples, and the driver package // documentation for the specific types supported for that driver. func (b *Bucket) As(i any) bool { if i == nil { return false } return b.b.As(i) } // ErrorAs converts err to driver-specific types. // ErrorAs panics if i is nil or not a pointer. // ErrorAs returns false if err == nil. // See https://gocloud.dev/concepts/as/ for background information. func (b *Bucket) ErrorAs(err error, i any) bool { return gcerr.ErrorAs(err, i, b.b.ErrorAs) } // ReadAll is a shortcut for creating a Reader via NewReader with nil // ReaderOptions, and reading the entire blob. // // Using Download may be more efficient. func (b *Bucket) ReadAll(ctx context.Context, key string) (_ []byte, err error) { b.mu.RLock() defer b.mu.RUnlock() if b.closed { return nil, errClosed } r, err := b.NewReader(ctx, key, nil) if err != nil { return nil, err } defer func() { _ = r.Close() }() return io.ReadAll(r) } // Download writes the content of a blob into an io.Writer w. func (b *Bucket) Download(ctx context.Context, key string, w io.Writer, opts *ReaderOptions) error { b.mu.RLock() defer b.mu.RUnlock() if b.closed { return errClosed } r, err := b.NewReader(ctx, key, opts) if err != nil { return err } return r.downloadAndClose(w) } // List returns a ListIterator that can be used to iterate over blobs in a // bucket, in lexicographical order of UTF-8 encoded keys. The underlying // implementation fetches results in pages. // // A nil ListOptions is treated the same as the zero value. // // List is not guaranteed to include all recently-written blobs; // some services are only eventually consistent. func (b *Bucket) List(opts *ListOptions) *ListIterator { if opts == nil { opts = &ListOptions{} } dopts := &driver.ListOptions{ Prefix: opts.Prefix, Delimiter: opts.Delimiter, BeforeList: opts.BeforeList, } return &ListIterator{b: b, opts: dopts} } // FirstPageToken is the pageToken to pass to ListPage to retrieve the first page of results. var FirstPageToken = []byte("first page") // ListPage returns a page of ListObject results for blobs in a bucket, in lexicographical // order of UTF-8 encoded keys. // // To fetch the first page, pass FirstPageToken as the pageToken. For subsequent pages, pass // the pageToken returned from a previous call to ListPage. // It is not possible to "skip ahead" pages. // // Each call will return pageSize results, unless there are not enough blobs to fill the // page, in which case it will return fewer results (possibly 0). // // If there are no more blobs available, ListPage will return an empty pageToken. Note that // this may happen regardless of the number of returned results -- the last page might have // 0 results (i.e., if the last item was deleted), pageSize results, or anything in between. // // Calling ListPage with an empty pageToken will immediately return io.EOF. When looping // over pages, callers can either check for an empty pageToken, or they can make one more // call and check for io.EOF. // // The underlying implementation fetches results in pages, but one call to ListPage may // require multiple page fetches (and therefore, multiple calls to the BeforeList callback). // // A nil ListOptions is treated the same as the zero value. // // ListPage is not guaranteed to include all recently-written blobs; // some services are only eventually consistent. func (b *Bucket) ListPage(ctx context.Context, pageToken []byte, pageSize int, opts *ListOptions) (retval []*ListObject, nextPageToken []byte, err error) { if opts == nil { opts = &ListOptions{} } if pageSize <= 0 { return nil, nil, gcerr.Newf(gcerr.InvalidArgument, nil, "blob: pageSize must be > 0") } // Nil pageToken means no more results. if len(pageToken) == 0 { return nil, nil, io.EOF } // FirstPageToken fetches the first page. Drivers use nil. // The public API doesn't use nil for the first page because it would be too easy to // keep fetching forever (since the last page return nil for the next pageToken). if bytes.Equal(pageToken, FirstPageToken) { pageToken = nil } b.mu.RLock() defer b.mu.RUnlock() if b.closed { return nil, nil, errClosed } ctx, span := b.tracer.Start(ctx, "ListPage") defer func() { b.tracer.End(ctx, span, err) }() dopts := &driver.ListOptions{ Prefix: opts.Prefix, Delimiter: opts.Delimiter, BeforeList: opts.BeforeList, PageToken: pageToken, PageSize: pageSize, } retval = make([]*ListObject, 0, pageSize) for len(retval) < pageSize { p, err := b.b.ListPaged(ctx, dopts) if err != nil { return nil, nil, wrapError(b.b, err, "") } for _, dobj := range p.Objects { retval = append(retval, &ListObject{ Key: dobj.Key, ModTime: dobj.ModTime, Size: dobj.Size, MD5: dobj.MD5, IsDir: dobj.IsDir, asFunc: dobj.AsFunc, }) } // ListPaged may return fewer results than pageSize. If there are more results // available, signalled by non-empty p.NextPageToken, try to fetch the remainder // of the page. // It does not work to ask for more results than we need, because then we'd have // a NextPageToken on a non-page boundary. dopts.PageSize = pageSize - len(retval) dopts.PageToken = p.NextPageToken if len(dopts.PageToken) == 0 { dopts.PageToken = nil break } } return retval, dopts.PageToken, nil } // IsAccessible returns true if the bucket is accessible, false otherwise. // It is a shortcut for calling ListPage and checking if it returns an error // with code gcerrors.NotFound. func (b *Bucket) IsAccessible(ctx context.Context) (bool, error) { _, _, err := b.ListPage(ctx, FirstPageToken, 1, nil) if err == nil { return true, nil } if gcerrors.Code(err) == gcerrors.NotFound { return false, nil } return false, err } // Exists returns true if a blob exists at key, false if it does not exist, or // an error. // It is a shortcut for calling Attributes and checking if it returns an error // with code gcerrors.NotFound. func (b *Bucket) Exists(ctx context.Context, key string) (bool, error) { _, err := b.Attributes(ctx, key) if err == nil { return true, nil } if gcerrors.Code(err) == gcerrors.NotFound { return false, nil } return false, err } // Attributes returns attributes for the blob stored at key. // // If the blob does not exist, Attributes returns an error for which // gcerrors.Code will return gcerrors.NotFound. func (b *Bucket) Attributes(ctx context.Context, key string) (_ *Attributes, err error) { if !utf8.ValidString(key) { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "blob: Attributes key must be a valid UTF-8 string: %q", key) } b.mu.RLock() defer b.mu.RUnlock() if b.closed { return nil, errClosed } ctx, span := b.tracer.Start(ctx, "Attributes") defer func() { b.tracer.End(ctx, span, err) }() a, err := b.b.Attributes(ctx, key) if err != nil { return nil, wrapError(b.b, err, key) } var md map[string]string if len(a.Metadata) > 0 { // Services are inconsistent, but at least some treat keys // as case-insensitive. To make the behavior consistent, we // force-lowercase them when writing and reading. md = make(map[string]string, len(a.Metadata)) for k, v := range a.Metadata { md[strings.ToLower(k)] = v } } return &Attributes{ CacheControl: a.CacheControl, ContentDisposition: a.ContentDisposition, ContentEncoding: a.ContentEncoding, ContentLanguage: a.ContentLanguage, ContentType: a.ContentType, Metadata: md, CreateTime: a.CreateTime, ModTime: a.ModTime, Size: a.Size, MD5: a.MD5, ETag: a.ETag, asFunc: a.AsFunc, }, nil } // NewReader is a shortcut for NewRangeReader with offset=0 and length=-1. func (b *Bucket) NewReader(ctx context.Context, key string, opts *ReaderOptions) (*Reader, error) { return b.newRangeReader(ctx, key, 0, -1, opts) } // NewRangeReader returns a Reader to read content from the blob stored at key. // It reads at most length bytes starting at offset (>= 0). // If length is negative, it will read till the end of the blob. // // For the purposes of Seek, the returned Reader will start at offset and // end at the minimum of the actual end of the blob or (if length > 0) offset + length. // // Note that ctx is used for all reads performed during the lifetime of the reader. // // If the blob does not exist, NewRangeReader returns an error for which // gcerrors.Code will return gcerrors.NotFound. Exists is a lighter-weight way // to check for existence. // // A nil ReaderOptions is treated the same as the zero value. // // The caller must call Close on the returned Reader when done reading. func (b *Bucket) NewRangeReader(ctx context.Context, key string, offset, length int64, opts *ReaderOptions) (_ *Reader, err error) { return b.newRangeReader(ctx, key, offset, length, opts) } func (b *Bucket) newRangeReader(ctx context.Context, key string, offset, length int64, opts *ReaderOptions) (_ *Reader, err error) { b.mu.RLock() defer b.mu.RUnlock() if b.closed { return nil, errClosed } if offset < 0 { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "blob: NewRangeReader offset must be non-negative (%d)", offset) } if !utf8.ValidString(key) { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "blob: NewRangeReader key must be a valid UTF-8 string: %q", key) } if opts == nil { opts = &ReaderOptions{} } dopts := &driver.ReaderOptions{ BeforeRead: opts.BeforeRead, } ctx, span := b.tracer.Start(ctx, "NewRangeReader") defer func() { // If err == nil, we handed the end closure off to the returned *Reader; it // will be called when the Reader is Closed. if err != nil { b.tracer.End(ctx, span, err) } }() var dr driver.Reader dr, err = b.b.NewRangeReader(ctx, key, offset, length, dopts) if err != nil { return nil, wrapError(b.b, err, key) } end := func(err error) { b.tracer.End(ctx, span, err) } r := &Reader{ b: b.b, r: dr, key: key, ctx: ctx, dopts: dopts, baseOffset: offset, baseLength: length, savedOffset: -1, end: end, bytesReadCounter: b.bytesReadCounter, } _, file, lineno, ok := runtime.Caller(2) runtime.SetFinalizer(r, func(r *Reader) { if !r.closed { var caller string if ok { caller = fmt.Sprintf(" (%s:%d)", file, lineno) } log.Printf("A blob.Reader reading from %q was never closed%s", key, caller) } }) return r, nil } // WriteAll is a shortcut for creating a Writer via NewWriter and writing p. // // If opts.ContentMD5 is not set, WriteAll will compute the MD5 of p and use it // as the ContentMD5 option for the Writer it creates. // // Using Upload may be more efficient. func (b *Bucket) WriteAll(ctx context.Context, key string, p []byte, opts *WriterOptions) (err error) { realOpts := new(WriterOptions) if opts != nil { *realOpts = *opts } if len(realOpts.ContentMD5) == 0 { sum := md5.Sum(p) realOpts.ContentMD5 = sum[:] } w, err := b.NewWriter(ctx, key, realOpts) if err != nil { return err } if _, err := w.Write(p); err != nil { _ = w.Close() return err } return w.Close() } // Upload reads from an io.Reader r and writes into a blob. // // opts.ContentType is required. func (b *Bucket) Upload(ctx context.Context, key string, r io.Reader, opts *WriterOptions) error { if opts == nil || opts.ContentType == "" { return gcerr.Newf(gcerr.InvalidArgument, nil, "blob: Upload requires WriterOptions.ContentType") } w, err := b.NewWriter(ctx, key, opts) if err != nil { return err } return w.uploadAndClose(r) } // NewWriter returns a Writer that writes to the blob stored at key. // A nil WriterOptions is treated the same as the zero value. // // If a blob with this key already exists, it will be replaced. // The blob being written is not guaranteed to be readable until Close // has been called; until then, any previous blob will still be readable. // Even after Close is called, newly written blobs are not guaranteed to be // returned from List; some services are only eventually consistent. // // The returned Writer will store ctx for later use in Write and/or Close. // To abort a write, cancel ctx; otherwise, it must remain open until // Close is called. // // The caller must call Close on the returned Writer, even if the write is // aborted. func (b *Bucket) NewWriter(ctx context.Context, key string, opts *WriterOptions) (_ *Writer, err error) { if !utf8.ValidString(key) { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "blob: NewWriter key must be a valid UTF-8 string: %q", key) } if opts == nil { opts = &WriterOptions{} } dopts := &driver.WriterOptions{ CacheControl: opts.CacheControl, ContentDisposition: opts.ContentDisposition, ContentEncoding: opts.ContentEncoding, ContentLanguage: opts.ContentLanguage, ContentMD5: opts.ContentMD5, BufferSize: opts.BufferSize, MaxConcurrency: opts.MaxConcurrency, BeforeWrite: opts.BeforeWrite, DisableContentTypeDetection: opts.DisableContentTypeDetection, IfNotExist: opts.IfNotExist, } if len(opts.Metadata) > 0 { // Services are inconsistent, but at least some treat keys // as case-insensitive. To make the behavior consistent, we // force-lowercase them when writing and reading. md := make(map[string]string, len(opts.Metadata)) for k, v := range opts.Metadata { if k == "" { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "blob: WriterOptions.Metadata keys may not be empty strings") } if !utf8.ValidString(k) { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "blob: WriterOptions.Metadata keys must be valid UTF-8 strings: %q", k) } if !utf8.ValidString(v) { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "blob: WriterOptions.Metadata values must be valid UTF-8 strings: %q", v) } lowerK := strings.ToLower(k) if _, found := md[lowerK]; found { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "blob: WriterOptions.Metadata has a duplicate case-insensitive metadata key: %q", lowerK) } md[lowerK] = v } dopts.Metadata = md } b.mu.RLock() defer b.mu.RUnlock() if b.closed { return nil, errClosed } ctx, cancel := context.WithCancel(ctx) ctx, span := b.tracer.Start(ctx, "NewWriter") end := func(err error) { b.tracer.End(ctx, span, err) } defer func() { if err != nil { end(err) } }() w := &Writer{ b: b.b, end: end, cancel: cancel, key: key, contentMD5: opts.ContentMD5, md5hash: md5.New(), bytesWrittenCounter: b.bytesWrittenCounter, } if opts.ContentType != "" || opts.DisableContentTypeDetection { var ct string if opts.ContentType != "" { t, p, err := mime.ParseMediaType(opts.ContentType) if err != nil { cancel() return nil, err } ct = mime.FormatMediaType(t, p) } dw, err := b.b.NewTypedWriter(ctx, key, ct, dopts) if err != nil { cancel() return nil, wrapError(b.b, err, key) } w.w = dw } else { // Save the fields needed to called NewTypedWriter later, once we've gotten // sniffLen bytes; see the comment on Writer. w.ctx = ctx w.opts = dopts w.buf = bytes.NewBuffer([]byte{}) } _, file, lineno, ok := runtime.Caller(1) runtime.SetFinalizer(w, func(w *Writer) { if !w.closed { var caller string if ok { caller = fmt.Sprintf(" (%s:%d)", file, lineno) } log.Printf("A blob.Writer writing to %q was never closed%s", key, caller) } }) return w, nil } // Copy the blob stored at srcKey to dstKey. // A nil CopyOptions is treated the same as the zero value. // // If the source blob does not exist, Copy returns an error for which // gcerrors.Code will return gcerrors.NotFound. // // If the destination blob already exists, it is overwritten. func (b *Bucket) Copy(ctx context.Context, dstKey, srcKey string, opts *CopyOptions) (err error) { if !utf8.ValidString(srcKey) { return gcerr.Newf(gcerr.InvalidArgument, nil, "blob: Copy srcKey must be a valid UTF-8 string: %q", srcKey) } if !utf8.ValidString(dstKey) { return gcerr.Newf(gcerr.InvalidArgument, nil, "blob: Copy dstKey must be a valid UTF-8 string: %q", dstKey) } if opts == nil { opts = &CopyOptions{} } dopts := &driver.CopyOptions{ BeforeCopy: opts.BeforeCopy, } b.mu.RLock() defer b.mu.RUnlock() if b.closed { return errClosed } ctx, span := b.tracer.Start(ctx, "Copy") defer func() { b.tracer.End(ctx, span, err) }() return wrapError(b.b, b.b.Copy(ctx, dstKey, srcKey, dopts), fmt.Sprintf("%s -> %s", srcKey, dstKey)) } // Delete deletes the blob stored at key. // // If the blob does not exist, Delete returns an error for which // gcerrors.Code will return gcerrors.NotFound. func (b *Bucket) Delete(ctx context.Context, key string) (err error) { if !utf8.ValidString(key) { return gcerr.Newf(gcerr.InvalidArgument, nil, "blob: Delete key must be a valid UTF-8 string: %q", key) } b.mu.RLock() defer b.mu.RUnlock() if b.closed { return errClosed } ctx, span := b.tracer.Start(ctx, "Delete") defer func() { b.tracer.End(ctx, span, err) }() return wrapError(b.b, b.b.Delete(ctx, key), key) } // SignedURL returns a URL that can be used to GET (default), PUT or DELETE // the blob for the duration specified in opts.Expiry. // // A nil SignedURLOptions is treated the same as the zero value. // // It is valid to call SignedURL for a key that does not exist. // // If the driver does not support this functionality, SignedURL // will return an error for which gcerrors.Code will return gcerrors.Unimplemented. func (b *Bucket) SignedURL(ctx context.Context, key string, opts *SignedURLOptions) (string, error) { if !utf8.ValidString(key) { return "", gcerr.Newf(gcerr.InvalidArgument, nil, "blob: SignedURL key must be a valid UTF-8 string: %q", key) } dopts := new(driver.SignedURLOptions) if opts == nil { opts = new(SignedURLOptions) } switch { case opts.Expiry < 0: return "", gcerr.Newf(gcerr.InvalidArgument, nil, "blob: SignedURLOptions.Expiry must be >= 0 (%v)", opts.Expiry) case opts.Expiry == 0: dopts.Expiry = DefaultSignedURLExpiry default: dopts.Expiry = opts.Expiry } switch opts.Method { case "": dopts.Method = http.MethodGet case http.MethodGet, http.MethodPut, http.MethodDelete: dopts.Method = opts.Method default: return "", fmt.Errorf("blob: unsupported SignedURLOptions.Method %q", opts.Method) } if opts.ContentType != "" && opts.Method != http.MethodPut { return "", fmt.Errorf("blob: SignedURLOptions.ContentType must be empty for signing a %s URL", opts.Method) } if opts.EnforceAbsentContentType && opts.Method != http.MethodPut { return "", fmt.Errorf("blob: SignedURLOptions.EnforceAbsentContentType must be false for signing a %s URL", opts.Method) } dopts.ContentType = opts.ContentType dopts.EnforceAbsentContentType = opts.EnforceAbsentContentType dopts.BeforeSign = opts.BeforeSign b.mu.RLock() defer b.mu.RUnlock() if b.closed { return "", errClosed } sURL, err := b.b.SignedURL(ctx, key, dopts) return sURL, wrapError(b.b, err, key) } // Close releases any resources used for the bucket. func (b *Bucket) Close() error { b.mu.Lock() prev := b.closed b.closed = true b.mu.Unlock() if prev { return errClosed } return wrapError(b.b, b.b.Close(), "") } // DefaultSignedURLExpiry is the default duration for SignedURLOptions.Expiry. const DefaultSignedURLExpiry = 1 * time.Hour // SignedURLOptions sets options for SignedURL. type SignedURLOptions struct { // Expiry sets how long the returned URL is valid for. // Defaults to DefaultSignedURLExpiry. Expiry time.Duration // Method is the HTTP method that can be used on the URL; one of "GET", "PUT", // or "DELETE". Defaults to "GET". Method string // ContentType specifies the Content-Type HTTP header the user agent is // permitted to use in the PUT request. It must match exactly. See // EnforceAbsentContentType for behavior when ContentType is the empty string. // If a bucket does not implement this verification, then it returns an // Unimplemented error. // // Must be empty for non-PUT requests. ContentType string // If EnforceAbsentContentType is true and ContentType is the empty string, // then PUTing to the signed URL will fail if the Content-Type header is // present. Not all buckets support this: ones that do not will return an // Unimplemented error. // // If EnforceAbsentContentType is false and ContentType is the empty string, // then PUTing without a Content-Type header will succeed, but it is // implementation-specific whether providing a Content-Type header will fail. // // Must be false for non-PUT requests. EnforceAbsentContentType bool // BeforeSign is a callback that will be called before each call to the // the underlying service's sign functionality. // asFunc converts its argument to driver-specific types. // See https://gocloud.dev/concepts/as/ for background information. BeforeSign func(asFunc func(any) bool) error } // ReaderOptions sets options for NewReader and NewRangeReader. type ReaderOptions struct { // BeforeRead is a callback that will be called before // any data is read (unless NewReader returns an error before then, in which // case it may not be called at all). // // Calling Seek may reset the underlying reader, and result in BeforeRead // getting called again with a different underlying provider-specific reader.. // // asFunc converts its argument to driver-specific types. // See https://gocloud.dev/concepts/as/ for background information. BeforeRead func(asFunc func(any) bool) error } // WriterOptions sets options for NewWriter. type WriterOptions struct { // BufferSize changes the default size in bytes of the chunks that // Writer will upload in a single request; larger blobs will be split into // multiple requests. // // This option may be ignored by some drivers. // // If 0, the driver will choose a reasonable default. // // If the Writer is used to do many small writes concurrently, using a // smaller BufferSize may reduce memory usage. BufferSize int // MaxConcurrency changes the default concurrency for parts of an upload. // // This option may be ignored by some drivers. // // If 0, the driver will choose a reasonable default. MaxConcurrency int // CacheControl specifies caching attributes that services may use // when serving the blob. // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control CacheControl string // ContentDisposition specifies whether the blob content is expected to be // displayed inline or as an attachment. // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition ContentDisposition string // ContentEncoding specifies the encoding used for the blob's content, if any. // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding ContentEncoding string // ContentLanguage specifies the language used in the blob's content, if any. // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Language ContentLanguage string // ContentType specifies the MIME type of the blob being written. If not set, // it will be inferred from the content using the algorithm described at // http://mimesniff.spec.whatwg.org/. // Set DisableContentTypeDetection to true to disable the above and force // the ContentType to stay empty. // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type ContentType string // When true, if ContentType is the empty string, it will stay the empty // string rather than being inferred from the content. // Note that while the blob will be written with an empty string ContentType, // most providers will fill one in during reads, so don't expect an empty // ContentType if you read the blob back. DisableContentTypeDetection bool // ContentMD5 is used as a message integrity check. // If len(ContentMD5) > 0, the MD5 hash of the bytes written must match // ContentMD5, or Close will return an error without completing the write. // https://tools.ietf.org/html/rfc1864 ContentMD5 []byte // Metadata holds key/value strings to be associated with the blob, or nil. // Keys may not be empty, and are lowercased before being written. // Duplicate case-insensitive keys (e.g., "foo" and "FOO") will result in // an error. Metadata map[string]string // BeforeWrite is a callback that will be called exactly once, before // any data is written (unless NewWriter returns an error, in which case // it will not be called at all). Note that this is not necessarily during // or after the first Write call, as drivers may buffer bytes before // sending an upload request. // // asFunc converts its argument to driver-specific types. // See https://gocloud.dev/concepts/as/ for background information. BeforeWrite func(asFunc func(any) bool) error // IfNotExist is used for conditional writes. When set to 'true', // if a blob exists for the same key in the bucket, the write // operation won't succeed and the current blob for the key will // be left untouched. An error for which gcerrors.Code will return // gcerrors.PreconditionFailed will be returned by Write or Close. IfNotExist bool } // CopyOptions sets options for Copy. type CopyOptions struct { // BeforeCopy is a callback that will be called before the copy is // initiated. // // asFunc converts its argument to driver-specific types. // See https://gocloud.dev/concepts/as/ for background information. BeforeCopy func(asFunc func(any) bool) error } // BucketURLOpener represents types that can open buckets based on a URL. // The opener must not modify the URL argument. OpenBucketURL must be safe to // call from multiple goroutines. // // This interface is generally implemented by types in driver packages. type BucketURLOpener interface { OpenBucketURL(ctx context.Context, u *url.URL) (*Bucket, error) } // URLMux is a URL opener multiplexer. It matches the scheme of the URLs // against a set of registered schemes and calls the opener that matches the // URL's scheme. // See https://gocloud.dev/concepts/urls/ for more information. // // The zero value is a multiplexer with no registered schemes. type URLMux struct { schemes openurl.SchemeMap } // BucketSchemes returns a sorted slice of the registered Bucket schemes. func (mux *URLMux) BucketSchemes() []string { return mux.schemes.Schemes() } // ValidBucketScheme returns true iff scheme has been registered for Buckets. func (mux *URLMux) ValidBucketScheme(scheme string) bool { return mux.schemes.ValidScheme(scheme) } // RegisterBucket registers the opener with the given scheme. If an opener // already exists for the scheme, RegisterBucket panics. func (mux *URLMux) RegisterBucket(scheme string, opener BucketURLOpener) { mux.schemes.Register("blob", "Bucket", scheme, opener) } // OpenBucket calls OpenBucketURL with the URL parsed from urlstr. // OpenBucket is safe to call from multiple goroutines. func (mux *URLMux) OpenBucket(ctx context.Context, urlstr string) (*Bucket, error) { opener, u, err := mux.schemes.FromString("Bucket", urlstr) if err != nil { return nil, err } return applyPrefixParam(ctx, opener.(BucketURLOpener), u) } // OpenBucketURL dispatches the URL to the opener that is registered with the // URL's scheme. OpenBucketURL is safe to call from multiple goroutines. func (mux *URLMux) OpenBucketURL(ctx context.Context, u *url.URL) (*Bucket, error) { opener, err := mux.schemes.FromURL("Bucket", u) if err != nil { return nil, err } return applyPrefixParam(ctx, opener.(BucketURLOpener), u) } func applyPrefixParam(ctx context.Context, opener BucketURLOpener, u *url.URL) (*Bucket, error) { prefix := u.Query().Get("prefix") singleKey := u.Query().Get("key") if prefix != "" || singleKey != "" { // Make a copy of u with the "prefix" and "key" parameters removed. urlCopy := *u q := urlCopy.Query() q.Del("prefix") q.Del("key") urlCopy.RawQuery = q.Encode() u = &urlCopy } bucket, err := opener.OpenBucketURL(ctx, u) if err != nil { return nil, err } if prefix != "" { bucket = PrefixedBucket(bucket, prefix) } if singleKey != "" { bucket = SingleKeyBucket(bucket, singleKey) } return bucket, nil } var defaultURLMux = new(URLMux) // DefaultURLMux returns the URLMux used by OpenBucket. // // Driver packages can use this to register their BucketURLOpener on the mux. func DefaultURLMux() *URLMux { return defaultURLMux } // OpenBucket opens the bucket identified by the URL given. // // See the URLOpener documentation in driver subpackages for // details on supported URL formats, and https://gocloud.dev/concepts/urls/ // for more information. // // In addition to driver-specific query parameters, OpenBucket supports // the following query parameters: // // - prefix: wraps the resulting Bucket using PrefixedBucket with the // given prefix. // - key: wraps the resulting Bucket using SingleKeyBucket with the // given key. func OpenBucket(ctx context.Context, urlstr string) (*Bucket, error) { return defaultURLMux.OpenBucket(ctx, urlstr) } func wrapError(b driver.Bucket, err error, key string) error { if err == nil { return nil } if gcerr.DoNotWrap(err) { return err } msg := "blob" if key != "" { msg += fmt.Sprintf(" (key %q)", key) } code := gcerrors.Code(err) if code == gcerrors.Unknown { code = b.ErrorCode(err) } return gcerr.New(code, err, 2, msg) } var errClosed = gcerr.Newf(gcerr.FailedPrecondition, nil, "blob: Bucket has been closed") // PrefixedBucket returns a *Bucket based on b with all keys modified to have // prefix, which will usually end with a "/" to target a subdirectory in the // bucket. // // bucket will be closed and no longer usable after this function returns. func PrefixedBucket(bucket *Bucket, prefix string) *Bucket { bucket.mu.Lock() defer bucket.mu.Unlock() bucket.closed = true return NewBucket(driver.NewPrefixedBucket(bucket.b, prefix)) } // SingleKeyBucket returns a *Bucket based on b that always references singleKey. // List methods will not work. // singleKey acts as srcKey for Copy. // // bucket will be closed and no longer usable after this function returns. func SingleKeyBucket(bucket *Bucket, singleKey string) *Bucket { bucket.mu.Lock() defer bucket.mu.Unlock() bucket.closed = true return NewBucket(driver.NewSingleKeyBucket(bucket.b, singleKey)) } ================================================ FILE: blob/blob_fs.go ================================================ // Copyright 2023 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package blob import ( "context" "fmt" "io" "io/fs" "path/filepath" "time" "gocloud.dev/gcerrors" "gocloud.dev/internal/gcerr" ) // Ensure that Bucket implements various io/fs interfaces. var ( _ = fs.FS(&Bucket{}) _ = fs.SubFS(&Bucket{}) ) // iofsFileInfo describes a single file in an io/fs.FS. // It implements fs.FileInfo and fs.DirEntry. type iofsFileInfo struct { lo *ListObject name string } func (f *iofsFileInfo) Name() string { return f.name } func (f *iofsFileInfo) Size() int64 { return f.lo.Size } func (f *iofsFileInfo) Mode() fs.FileMode { return fs.ModeIrregular } func (f *iofsFileInfo) ModTime() time.Time { return f.lo.ModTime } func (f *iofsFileInfo) IsDir() bool { return false } func (f *iofsFileInfo) Sys() any { return f.lo } func (f *iofsFileInfo) Info() (fs.FileInfo, error) { return f, nil } func (f *iofsFileInfo) Type() fs.FileMode { return fs.ModeIrregular } // iofsOpenFile describes a single open file in an io/fs.FS. // It implements fs.FileInfo and fs.File. type iofsOpenFile struct { *Reader name string } func (f *iofsOpenFile) Name() string { return f.name } func (f *iofsOpenFile) Mode() fs.FileMode { return fs.ModeIrregular } func (f *iofsOpenFile) IsDir() bool { return false } func (f *iofsOpenFile) Sys() any { return f.r } func (f *iofsOpenFile) Stat() (fs.FileInfo, error) { return f, nil } // iofsDir describes a single directory in an io/fs.FS. // It implements fs.FileInfo, fs.DirEntry, and fs.File. type iofsDir struct { b *Bucket key string name string // If opened is true, we've read entries via openOnce(). opened bool entries []fs.DirEntry offset int } func newDir(b *Bucket, key, name string) *iofsDir { return &iofsDir{b: b, key: key, name: name} } func (d *iofsDir) Name() string { return d.name } func (d *iofsDir) Size() int64 { return 0 } func (d *iofsDir) Mode() fs.FileMode { return fs.ModeDir } func (d *iofsDir) Type() fs.FileMode { return fs.ModeDir } func (d *iofsDir) ModTime() time.Time { return time.Time{} } func (d *iofsDir) IsDir() bool { return true } func (d *iofsDir) Sys() any { return d } func (d *iofsDir) Info() (fs.FileInfo, error) { return d, nil } func (d *iofsDir) Stat() (fs.FileInfo, error) { return d, nil } func (d *iofsDir) Read([]byte) (int, error) { return 0, &fs.PathError{Op: "read", Path: d.key, Err: fs.ErrInvalid} } func (d *iofsDir) Close() error { return nil } func (d *iofsDir) ReadDir(count int) ([]fs.DirEntry, error) { if err := d.openOnce(); err != nil { return nil, err } n := len(d.entries) - d.offset if n == 0 && count > 0 { return nil, io.EOF } if count > 0 && n > count { n = count } list := make([]fs.DirEntry, n) for i := range list { list[i] = d.entries[d.offset+i] } d.offset += n return list, nil } func (d *iofsDir) openOnce() error { if d.opened { return nil } d.opened = true // blob expects directories to end in the delimiter, except at the top level. prefix := d.key if prefix != "" { prefix += "/" } listOpts := ListOptions{ Prefix: prefix, Delimiter: "/", } ctx, _ := d.b.ioFSCallback() // Fetch all the directory entries. // Conceivably we could only fetch a few here, and fetch the rest lazily // on demand, but that would add significant complexity. iter := d.b.List(&listOpts) for { item, err := iter.Next(ctx) if err == io.EOF { break } if err != nil { return err } name := filepath.Base(item.Key) if item.IsDir { d.entries = append(d.entries, newDir(d.b, item.Key, name)) } else { d.entries = append(d.entries, &iofsFileInfo{item, name}) } } // There is no such thing as an empty directory in Bucket, so if // we didn't find anything, it doesn't exist. if len(d.entries) == 0 { return fs.ErrNotExist } return nil } // SetIOFSCallback sets a callback that is used during Open and calls on the objects // returned from Open. // // fn should return a context.Context and *ReaderOptions that can be used in // calls to List and NewReader on b. It may be called more than once. // // If SetIOFSCallback is never called, io.FS functions will use context.Background // and a default ReaderOptions. func (b *Bucket) SetIOFSCallback(fn func() (context.Context, *ReaderOptions)) { b.ioFSCallback = fn } // Open implements fs.FS.Open (https://pkg.go.dev/io/fs#FS). func (b *Bucket) Open(path string) (fs.File, error) { if !fs.ValidPath(path) { return nil, &fs.PathError{Op: "open", Path: path, Err: fs.ErrInvalid} } // Check if it's a file. If not, assume it's a directory until proven otherwise. ctx, readerOpts := b.ioFSCallback() var isDir bool var key, name string // name is the last part of the path if path == "." { // Root is always a directory, but blob doesn't want the "." in the key. isDir = true key, name = "", "." } else { exists, _ := b.Exists(ctx, path) isDir = !exists key, name = path, filepath.Base(path) } // If it's a directory, list the directory contents. We can't do this lazily // because we need to error out here if it doesn't exist. if isDir { dir := newDir(b, key, name) err := dir.openOnce() if err != nil { if err == fs.ErrNotExist && path == "." { // The root directory must exist. return dir, nil } return nil, &fs.PathError{Op: "open", Path: path, Err: err} } return dir, nil } // It's a file; open it and return a wrapper. r, err := b.NewReader(ctx, path, readerOpts) if err != nil { code := gcerrors.Code(err) switch code { case gcerrors.NotFound: err = fmt.Errorf("%w: %w", err, fs.ErrNotExist) case gcerrors.PermissionDenied: err = fmt.Errorf("%w: %w", err, fs.ErrPermission) } return nil, &fs.PathError{Op: "open", Path: path, Err: err} } return &iofsOpenFile{r, filepath.Base(path)}, nil } // Sub implements fs.SubFS.Sub. // // SetIOFSCallback must be called prior to calling this function. func (b *Bucket) Sub(dir string) (fs.FS, error) { if b.ioFSCallback == nil { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "blob: Sub -- SetIOFSCallback must be called before Sub") } if dir == "." { return b, nil } // blob expects directories to end in the delimiter, except at the top level. pb := PrefixedBucket(b, dir+"/") pb.SetIOFSCallback(b.ioFSCallback) return pb, nil } ================================================ FILE: blob/blob_fs_test.go ================================================ // Copyright 2023 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package blob_test import ( "context" "io/fs" "sort" "testing" "testing/fstest" "github.com/google/go-cmp/cmp" "gocloud.dev/blob" "gocloud.dev/blob/memblob" ) var fsFiles = []string{ "a/very/deeply/nested/sub/dir/with/a/file.txt", "baz.txt", "bazfoo.txt", "dir/foo.txt", "dir/subdir/foo.txt", "foo.txt", "foobar.txt", } func initBucket(t *testing.T, files []string) *blob.Bucket { t.Helper() ctx := context.Background() b := memblob.OpenBucket(nil) for _, f := range files { if err := b.WriteAll(ctx, f, []byte("data"), nil); err != nil { t.Fatal(err) } } return b } // TestIOFS runs the test/fstest test suite for fs.FS. func TestIOFS(t *testing.T) { tests := []struct { Description string Files []string }{ { Description: "empty bucket", }, { Description: "non-empty bucket", Files: fsFiles, }, } for _, test := range tests { t.Run(test.Description, func(t *testing.T) { b := initBucket(t, test.Files) defer b.Close() if err := fstest.TestFS(b, test.Files...); err != nil { t.Error(err) } }) } } // TestGlob does some basic verification that fs.Glob works as expected // when given a blob.Bucket. func TestGlob(t *testing.T) { b := initBucket(t, fsFiles) defer b.Close() tests := []struct { Pattern string Want []string }{ { Pattern: "*", Want: []string{"a", "baz.txt", "bazfoo.txt", "dir", "foo.txt", "foobar.txt"}, }, { Pattern: "foo*", Want: []string{"foo.txt", "foobar.txt"}, }, { Pattern: "*foo*", Want: []string{"bazfoo.txt", "foo.txt", "foobar.txt"}, }, } for _, test := range tests { t.Run(test.Pattern, func(t *testing.T) { if got, err := fs.Glob(b, test.Pattern); err != nil { t.Fatalf("Failed to glob: %v", err) } else if diff := cmp.Diff(got, test.Want); diff != "" { t.Error(diff) } }) } } // TestWalkDir does some basic verification that fs.WalkDir works as expected // when given a blob.Bucket. func TestWalkDir(t *testing.T) { b := initBucket(t, fsFiles) defer b.Close() var got []string fn := func(path string, _ fs.DirEntry, err error) error { if err != nil { t.Errorf("WalkFunc with path %s got error: %v", path, err) return err } got = append(got, path) return nil } if err := fs.WalkDir(b, ".", fn); err != nil { t.Fatalf("WalkDir got an unexpected error: %v", err) } // We want all of the files, plus the directories. want := append(fsFiles, ".", "a", "a/very", "a/very/deeply", "a/very/deeply/nested", "a/very/deeply/nested/sub", "a/very/deeply/nested/sub/dir", "a/very/deeply/nested/sub/dir/with", "a/very/deeply/nested/sub/dir/with/a", "dir", "dir/subdir", ) sort.Strings(want) if diff := cmp.Diff(got, want); diff != "" { t.Error(diff) } } ================================================ FILE: blob/blob_iter_test.go ================================================ package blob_test import ( "bytes" "context" "fmt" "testing" "github.com/google/go-cmp/cmp" "gocloud.dev/blob/memblob" ) // Verify ListIterator.All. func TestListIterator_All(t *testing.T) { ctx := context.Background() b := memblob.OpenBucket(nil) defer b.Close() // Initialize the bucket with some keys. want := map[string]string{} for _, key := range []string{"a", "b", "c"} { contents := fmt.Sprintf("%s-contents", key) if err := b.WriteAll(ctx, key, []byte(contents), nil); err != nil { t.Fatalf("failed to initialize key %q: %v", key, err) } want[key] = contents } // Iterate over the bucket using iter.All. got := map[string]string{} li := b.List(nil) iter, errFn := li.All(ctx) for obj, download := range iter { var buf bytes.Buffer if dErr := download(&buf, nil); dErr != nil { t.Errorf("failed to download %q: %v", obj.Key, dErr) } got[obj.Key] = string(buf.Bytes()) } if err := errFn(); err != nil { t.Fatalf("iteration failed: %v", err) } if diff := cmp.Diff(got, want); diff != "" { t.Errorf("got %v, want %v, diff %s", got, want, diff) } } ================================================ FILE: blob/blob_reader_test.go ================================================ // Copyright 2022 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package blob_test import ( "bytes" "context" "io" "testing" "testing/iotest" "gocloud.dev/blob/memblob" ) // TestReader verifies that blob.Reader implements io package interfaces correctly. func TestReader(t *testing.T) { const myKey = "testkey" bucket := memblob.OpenBucket(nil) defer bucket.Close() // Get some random data, of a large enough size to require multiple // reads/writes given our buffer size of 1024. data, err := randomData(1024*10 + 10) if err != nil { t.Fatal(err) } // Write the data to a key. ctx := context.Background() bucket.WriteAll(ctx, myKey, data, nil) // Create a blob.Reader. r1, err := bucket.NewReader(ctx, myKey, nil) if err != nil { t.Fatal(err) } r1.Close() if err := iotest.TestReader(r1, data); err != nil { t.Error(err) } // Create another blob.Reader to exercise the ReadFrom code path r2, err := bucket.NewReader(ctx, myKey, nil) if err != nil { t.Fatal(err) } defer r2.Close() var buffer bytes.Buffer n, err := io.Copy(&buffer, r2) if err != nil { t.Fatal(err) } else if n != int64(len(data)) { t.Fatal("wrote fewer bytes than expected") } else if !bytes.Equal(buffer.Bytes(), data) { t.Fatal("wrote invalid bytes") } } ================================================ FILE: blob/blob_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package blob import ( "bytes" "context" "errors" "fmt" "io" "net/url" "strings" "sync" "testing" "github.com/google/go-cmp/cmp" "gocloud.dev/blob/driver" "gocloud.dev/gcerrors" "gocloud.dev/internal/gcerr" ) var ( errFake = errors.New("fake") errNotFound = errors.New("fake not found") ) func TestExists(t *testing.T) { tests := []struct { Description string Err error Want bool WantErr bool }{ { Description: "no error -> exists", Err: nil, Want: true, WantErr: false, }, { Description: "notfound error -> !exists", Err: errNotFound, Want: false, WantErr: false, }, { Description: "other error -> error", Err: errFake, Want: false, WantErr: true, }, } for _, test := range tests { t.Run(test.Description, func(t *testing.T) { drv := &fakeAttributes{attributesErr: test.Err} b := NewBucket(drv) defer b.Close() got, gotErr := b.Exists(context.Background(), "key") if got != test.Want { t.Errorf("got %v want %v", got, test.Want) } if (gotErr != nil) != test.WantErr { t.Errorf("got err %v want %v", gotErr, test.WantErr) } }) } } // fakeAttributes implements driver.Bucket. Only Attributes is implemented, // returning a zero Attributes struct and attributesErr. type fakeAttributes struct { driver.Bucket attributesErr error } func (b *fakeAttributes) Attributes(ctx context.Context, key string) (*driver.Attributes, error) { if b.attributesErr != nil { return nil, b.attributesErr } return &driver.Attributes{}, nil } func (b *fakeAttributes) ErrorCode(err error) gcerrors.ErrorCode { if err == errNotFound { return gcerrors.NotFound } return gcerrors.Unknown } func (b *fakeAttributes) Close() error { return nil } // Verify that ListIterator works even if driver.ListPaged returns empty pages. func TestListIterator(t *testing.T) { ctx := context.Background() want := []string{"a", "b", "c"} db := &fakeLister{ pages: [][]string{{"a"}, {}, {}, {"b", "c"}, {}, {}}, wantPageSizes: []int{0, 0, 0, 0, 0, 0}, } b := NewBucket(db) defer b.Close() iter := b.List(nil) var got []string for { obj, err := iter.Next(ctx) if err == io.EOF { break } if err != nil { t.Fatal(err) } got = append(got, obj.Key) } if !cmp.Equal(got, want) { t.Errorf("got %v, want %v", got, want) } } // Verify that ListPage works even if driver.ListPaged returns empty pages. func TestListPage(t *testing.T) { ctx := context.Background() want := [][]string{{"a", "b"}, {"c", "d"}, {"e"}} db := &fakeLister{ pages: [][]string{{}, {"a", "b"}, {}, {}, {"c"}, {}, {"d"}, {}, {}, {"e"}}, wantPageSizes: []int{2, 2, 2, 2, 2, 1, 1, 2, 2, 2}, } b := NewBucket(db) defer b.Close() nextToken := FirstPageToken got := [][]string{} for { page, token, err := b.ListPage(ctx, nextToken, 2, nil) if err == io.EOF { break } if err != nil { t.Fatal(err) } gotPage := make([]string, len(page)) for i, o := range page { gotPage[i] = o.Key } got = append(got, gotPage) nextToken = token } if !cmp.Equal(got, want) { t.Errorf("got %v, want %v", got, want) } } // fakeLister implements driver.Bucket. Only ListPaged is implemented, // returning static data from pages. type fakeLister struct { driver.Bucket pages [][]string wantPageSizes []int } func (b *fakeLister) ListPaged(ctx context.Context, opts *driver.ListOptions) (*driver.ListPage, error) { if len(b.pages) != len(b.wantPageSizes) { return nil, fmt.Errorf("invalid fakeLister setup") } if len(b.pages) == 0 { return &driver.ListPage{}, nil } page := b.pages[0] wantPageSize := b.wantPageSizes[0] b.pages = b.pages[1:] b.wantPageSizes = b.wantPageSizes[1:] if opts.PageSize != wantPageSize { return nil, fmt.Errorf("got page size %d, want %d", opts.PageSize, wantPageSize) } var objs []*driver.ListObject for _, key := range page { objs = append(objs, &driver.ListObject{Key: key}) } return &driver.ListPage{Objects: objs, NextPageToken: []byte{1}}, nil } func (*fakeLister) Close() error { return nil } func (*fakeLister) ErrorCode(err error) gcerrors.ErrorCode { return gcerrors.Unknown } type stubReader struct { driver.Reader downloaded bool } func (r *stubReader) Download(w io.Writer) error { r.downloaded = true return nil } func (*stubReader) Close() error { return nil } type stubWriter struct { driver.Writer uploaded bool } func (w *stubWriter) Upload(r io.Reader) error { w.uploaded = true return nil } func (*stubWriter) Close() error { return nil } // loaderBucket implements driver.Bucket's NewTypedWriter and NewRangedReader methods, // returning stubReader and stubWriter. It is used to verify that the special driver.Uploader // and driver.Downloader overrides work when called. type loaderBucket struct { driver.Bucket w stubWriter r stubReader } func (b *loaderBucket) NewTypedWriter(ctx context.Context, key, contentType string, opts *driver.WriterOptions) (driver.Writer, error) { return &b.w, nil } func (b *loaderBucket) NewRangeReader(ctx context.Context, key string, offset, length int64, opts *driver.ReaderOptions) (driver.Reader, error) { return &b.r, nil } func (*loaderBucket) Close() error { return nil } func TestUploader(t *testing.T) { ctx := context.Background() lb := &loaderBucket{} b := NewBucket(lb) defer b.Close() err := b.Upload(ctx, "key", nil, &WriterOptions{ContentType: "text/html"}) if err != nil { t.Fatalf("Upload failed: %v", err) } if !lb.w.uploaded { t.Error("Uploader wasn't called") } } func TestDownloader(t *testing.T) { ctx := context.Background() lb := &loaderBucket{} b := NewBucket(lb) defer b.Close() err := b.Download(ctx, "key", nil, nil) if err != nil { t.Fatalf("Download failed: %v", err) } if !lb.r.downloaded { t.Error("Downloader wasn't called") } } func TestSeekAfterReadFailure(t *testing.T) { const filename = "f.txt" ctx := context.Background() bucket := NewBucket(&oneTimeReadBucket{first: true}) defer bucket.Close() reader, err := bucket.NewRangeReader(ctx, filename, 0, 100, nil) if err != nil { t.Fatalf("failed NewRangeReader: %v", err) } defer reader.Close() b := make([]byte, 10) _, err = reader.Read(b) if err != nil { t.Fatalf("failed Read#1: %v", err) } _, err = reader.Seek(0, io.SeekStart) if err != nil { t.Fatalf("failed Seek#1: %v", err) } // This Read will force a recreation of the reader via NewRangeReader, // which will fail. _, err = reader.Read(b) if err == nil { t.Fatalf("unexpectedly succeeded Read#2: %v", err) } _, err = reader.Seek(0, io.SeekStart) if err != nil { t.Fatalf("failed Seek#2: %v", err) } } // oneTimeReadBucket implements driver.Bucket for TestSeekAfterReadFailure. // It returns a fake reader that succeeds once, then fails. type oneTimeReadBucket struct { driver.Bucket first bool } type workingReader struct { driver.Reader } func (r *workingReader) Read(p []byte) (int, error) { return len(p), nil } func (r *workingReader) Attributes() *driver.ReaderAttributes { return &driver.ReaderAttributes{} } func (r *workingReader) Close() error { return nil } func (b *oneTimeReadBucket) NewRangeReader(ctx context.Context, key string, offset, length int64, opts *driver.ReaderOptions) (driver.Reader, error) { if b.first { b.first = false return &workingReader{}, nil } return nil, errFake } func (b *oneTimeReadBucket) ErrorCode(err error) gcerrors.ErrorCode { return gcerrors.Unknown } func (b *oneTimeReadBucket) Close() error { return nil } // erroringBucket implements driver.Bucket. All interface methods that return // errors are implemented, and return errFake. // In addition, when passed the key "work", NewRangeReader and NewTypedWriter // will return a Reader/Writer respectively, that always return errFake // from Read/Write and Close. type erroringBucket struct { driver.Bucket } type erroringReader struct { driver.Reader } func (r *erroringReader) Read(p []byte) (int, error) { return 0, errFake } func (r *erroringReader) Close() error { return errFake } type erroringWriter struct { driver.Writer } func (r *erroringWriter) Write(p []byte) (int, error) { return 0, errFake } func (r *erroringWriter) Close() error { return errFake } func (b *erroringBucket) Attributes(ctx context.Context, key string) (*driver.Attributes, error) { return nil, errFake } func (b *erroringBucket) ListPaged(ctx context.Context, opts *driver.ListOptions) (*driver.ListPage, error) { return nil, errFake } func (b *erroringBucket) NewRangeReader(ctx context.Context, key string, offset, length int64, opts *driver.ReaderOptions) (driver.Reader, error) { if key == "work" { return &erroringReader{}, nil } return nil, errFake } func (b *erroringBucket) NewTypedWriter(ctx context.Context, key, contentType string, opts *driver.WriterOptions) (driver.Writer, error) { if key == "work" { return &erroringWriter{}, nil } return nil, errFake } func (b *erroringBucket) Copy(ctx context.Context, dstKey, srcKey string, opts *driver.CopyOptions) error { return errFake } func (b *erroringBucket) Delete(ctx context.Context, key string) error { return errFake } func (b *erroringBucket) SignedURL(ctx context.Context, key string, opts *driver.SignedURLOptions) (string, error) { return "", errFake } func (b *erroringBucket) Close() error { return errFake } func (b *erroringBucket) ErrorCode(err error) gcerrors.ErrorCode { return gcerrors.Unknown } // TestErrorsAreWrapped tests that all errors returned from the driver are // wrapped exactly once by the portable type. func TestErrorsAreWrapped(t *testing.T) { ctx := context.Background() buf := bytes.Repeat([]byte{'A'}, sniffLen) b := NewBucket(&erroringBucket{}) // verifyWrap ensures that err is wrapped exactly once. verifyWrap := func(description string, err error) { if err == nil { t.Errorf("%s: got nil error, wanted non-nil", description) return } if _, ok := err.(*gcerr.Error); !ok { t.Errorf("%s: not wrapped: %v", description, err) } if s := err.Error(); !strings.HasPrefix(s, "blob ") { t.Logf("short form of error: %v", err) t.Logf("with details: %+v", err) t.Errorf("%s: Error() for wrapped error doesn't start with blob: prefix: %s", description, s) } } _, err := b.Attributes(ctx, "") verifyWrap("Attributes", err) iter := b.List(nil) _, err = iter.Next(ctx) verifyWrap("ListIterator.Next", err) _, err = b.NewRangeReader(ctx, "", 0, 1, nil) verifyWrap("NewRangeReader", err) _, err = b.ReadAll(ctx, "") verifyWrap("ReadAll", err) // Providing ContentType means driver.NewTypedWriter is called right away. _, err = b.NewWriter(ctx, "", &WriterOptions{ContentType: "foo"}) verifyWrap("NewWriter", err) err = b.WriteAll(ctx, "", buf, &WriterOptions{ContentType: "foo"}) verifyWrap("WriteAll", err) // Not providing ContentType means driver.NewTypedWriter is only called // after writing sniffLen bytes. w, _ := b.NewWriter(ctx, "", nil) _, err = w.Write(buf) verifyWrap("NewWriter (no ContentType)", err) w.Close() err = b.WriteAll(ctx, "", buf, nil) verifyWrap("WriteAll (no ContentType)", err) r, _ := b.NewRangeReader(ctx, "work", 0, 1, nil) _, err = r.Read(buf) verifyWrap("Reader.Read", err) err = r.Close() verifyWrap("Reader.Close", err) w, _ = b.NewWriter(ctx, "work", &WriterOptions{ContentType: "foo"}) _, err = w.Write(buf) verifyWrap("Writer.Write", err) err = w.Close() verifyWrap("Writer.Close", err) err = b.Copy(ctx, "", "", nil) verifyWrap("Copy", err) err = b.Delete(ctx, "") verifyWrap("Delete", err) _, err = b.SignedURL(ctx, "", nil) verifyWrap("SignedURL", err) err = b.Close() verifyWrap("Close", err) } var ( testOpenOnce sync.Once testOpenGot *url.URL ) // TestBucketIsClosed verifies that all Bucket functions return an error // if the Bucket is closed. func TestBucketIsClosed(t *testing.T) { ctx := context.Background() buf := bytes.Repeat([]byte{'A'}, sniffLen) bucket := NewBucket(&erroringBucket{}) bucket.Close() if _, err := bucket.Attributes(ctx, ""); err != errClosed { t.Error(err) } iter := bucket.List(nil) if _, err := iter.Next(ctx); err != errClosed { t.Error(err) } if _, err := bucket.NewRangeReader(ctx, "", 0, 1, nil); err != errClosed { t.Error(err) } if _, err := bucket.ReadAll(ctx, ""); err != errClosed { t.Error(err) } if _, err := bucket.NewWriter(ctx, "", nil); err != errClosed { t.Error(err) } if err := bucket.WriteAll(ctx, "", buf, nil); err != errClosed { t.Error(err) } if _, err := bucket.NewRangeReader(ctx, "work", 0, 1, nil); err != errClosed { t.Error(err) } if err := bucket.Copy(ctx, "", "", nil); err != errClosed { t.Error(err) } if err := bucket.Delete(ctx, ""); err != errClosed { t.Error(err) } if _, err := bucket.SignedURL(ctx, "", nil); err != errClosed { t.Error(err) } if err := bucket.Close(); err != errClosed { t.Error(err) } } func TestURLMux(t *testing.T) { ctx := context.Background() mux := new(URLMux) fake := &fakeOpener{} mux.RegisterBucket("foo", fake) mux.RegisterBucket("err", fake) if diff := cmp.Diff(mux.BucketSchemes(), []string{"err", "foo"}); diff != "" { t.Errorf("Schemes: %s", diff) } if !mux.ValidBucketScheme("foo") || !mux.ValidBucketScheme("err") { t.Errorf("ValidBucketScheme didn't return true for valid scheme") } if mux.ValidBucketScheme("foo2") || mux.ValidBucketScheme("http") { t.Errorf("ValidBucketScheme didn't return false for invalid scheme") } for _, tc := range []struct { name string url string wantErr bool }{ { name: "empty URL", wantErr: true, }, { name: "invalid URL", url: ":foo", wantErr: true, }, { name: "invalid URL no scheme", url: "foo", wantErr: true, }, { name: "unregistered scheme", url: "bar://mybucket", wantErr: true, }, { name: "func returns error", url: "err://mybucket", wantErr: true, }, { name: "no query options", url: "foo://mybucket", }, { name: "empty query options", url: "foo://mybucket?", }, { name: "query options", url: "foo://mybucket?aAa=bBb&cCc=dDd", }, { name: "multiple query options", url: "foo://mybucket?x=a&x=b&x=c", }, { name: "fancy bucket name", url: "foo:///foo/bar/baz", }, { name: "using api scheme prefix", url: "blob+foo:///foo/bar/baz", }, { name: "using api+type scheme prefix", url: "blob+bucket+foo:///foo/bar/baz", }, } { t.Run(tc.name, func(t *testing.T) { _, gotErr := mux.OpenBucket(ctx, tc.url) if (gotErr != nil) != tc.wantErr { t.Fatalf("got err %v, want error %v", gotErr, tc.wantErr) } if gotErr != nil { return } if got := fake.u.String(); got != tc.url { t.Errorf("got %q want %q", got, tc.url) } // Repeat with OpenBucketURL. parsed, err := url.Parse(tc.url) if err != nil { t.Fatal(err) } _, gotErr = mux.OpenBucketURL(ctx, parsed) if gotErr != nil { t.Fatalf("got err %v want nil", gotErr) } if got := fake.u.String(); got != tc.url { t.Errorf("got %q want %q", got, tc.url) } }) } } type fakeOpener struct { u *url.URL // last url passed to OpenBucketURL } func (o *fakeOpener) OpenBucketURL(ctx context.Context, u *url.URL) (*Bucket, error) { if u.Scheme == "err" { return nil, errors.New("fail") } o.u = u return nil, nil } ================================================ FILE: blob/blob_writer_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package blob_test import ( "bytes" "context" "crypto/rand" "fmt" "io" "testing" "github.com/google/go-cmp/cmp" "gocloud.dev/blob" "gocloud.dev/blob/memblob" ) // TestWriteReturnValues verifies that blob.Writer returns the correct n // even when it is doing content sniffing. func TestWriteReturnValues(t *testing.T) { ctx := context.Background() for _, withContentType := range []bool{true, false} { t.Run(fmt.Sprintf("withContentType %v", withContentType), func(t *testing.T) { bucket := memblob.OpenBucket(nil) defer bucket.Close() var opts *blob.WriterOptions if withContentType { opts = &blob.WriterOptions{ContentType: "application/octet-stream"} } w, err := bucket.NewWriter(ctx, "testkey", opts) if err != nil { t.Fatalf("couldn't create writer with options: %v", err) } defer func() { if err := w.Close(); err != nil { t.Errorf("failed to close writer: %v", err) } }() n, err := io.CopyN(w, rand.Reader, 182) if err != nil || n != 182 { t.Fatalf("CopyN(182) got %d, want 182: %v", n, err) } n, err = io.CopyN(w, rand.Reader, 1812) if err != nil || n != 1812 { t.Fatalf("CopyN(1812) got %d, want 1812: %v", n, err) } }) } } func randomData(nBytes int64) ([]byte, error) { var buf bytes.Buffer n, err := io.CopyN(&buf, rand.Reader, nBytes) if err != nil || n != nBytes { return nil, fmt.Errorf("failed to get random data (%d want %d): %v", n, nBytes, err) } return buf.Bytes(), nil } // Ensure that blob.Reader implements io.WriterTo. var _ io.WriterTo = &blob.Reader{} // Ensure that blob.Writer implements io.ReaderFrom. var _ io.ReaderFrom = &blob.Writer{} func TestReadFrom(t *testing.T) { const dstKey = "dstkey" // Get some random data, of a large enough size to require multiple // reads/writes given our buffer size of 1024. data, err := randomData(1024*10 + 10) if err != nil { t.Fatal(err) } bucket := memblob.OpenBucket(nil) defer bucket.Close() // Create a blob.Writer and write to it using ReadFrom given a buffer // holding the random data. ctx := context.Background() w, err := bucket.NewWriter(ctx, dstKey, nil) if err != nil { t.Fatal(err) } n, err := w.ReadFrom(bytes.NewBuffer(data)) if err != nil || n != int64(len(data)) { t.Fatalf("failed to ReadFrom (%d want %d): %v", n, len(data), err) } if err := w.Close(); err != nil { t.Fatal(err) } // Verify the data was copied correctly. got, err := bucket.ReadAll(ctx, dstKey) if err != nil { t.Fatal(err) } if !cmp.Equal(got, data) { t.Errorf("got %v, want %v", got, data) } } func TestWriteTo(t *testing.T) { const srcKey = "srckey" // Get some random data, of a large enough size to require multiple // reads/writes given our buffer size of 1024. data, err := randomData(1024*10 + 10) if err != nil { t.Fatal(err) } bucket := memblob.OpenBucket(nil) defer bucket.Close() // Write the data to a key. ctx := context.Background() if err := bucket.WriteAll(ctx, srcKey, data, nil); err != nil { t.Fatal(err) } // Create a blob.Reader for that key and read from it, writing to a buffer. r, err := bucket.NewReader(ctx, srcKey, nil) if err != nil { t.Fatal(err) } var buf bytes.Buffer n, err := r.WriteTo(&buf) if err != nil || n != int64(len(data)) { t.Fatalf("failed to WriteTo (%d want %d): %v", n, len(data), err) } if err := r.Close(); err != nil { t.Fatal(err) } // Verify the data was copied correctly. got := buf.Bytes() if !cmp.Equal(got, data) { t.Errorf("got %v, want %v", got, data) } } // TestCopyBytes uses io.Copy to copy bytes from one key to another. func TestCopyBytes(t *testing.T) { const srcKey = "testkey-src" const dstKey = "testkey-dst" ctx := context.Background() // Get some random data, of a large enough size to require multiple // reads/writes given our buffer size of 1024. data, err := randomData(1024*10 + 10) if err != nil { t.Fatal(err) } bucket := memblob.OpenBucket(nil) defer bucket.Close() // Write the data to srcKey. bucket.WriteAll(ctx, srcKey, data, nil) // Create a reader for srcKey. r, err := bucket.NewReader(ctx, srcKey, nil) if err != nil { t.Fatalf("failed to create reader: %v", err) } // Create a writer for dstKey. w, err := bucket.NewWriter(ctx, dstKey, nil) if err != nil { t.Fatalf("failed to create writer: %v", err) } // Copy the data. io.Copy(w, r) if err := r.Close(); err != nil { t.Fatal(err) } if err := w.Close(); err != nil { t.Fatal(err) } // Verify the data was copied correctly. got, err := bucket.ReadAll(ctx, dstKey) if err != nil { t.Fatal(err) } if !cmp.Equal(got, data) { t.Errorf("got %v, want %v", got, data) } } ================================================ FILE: blob/driver/driver.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package driver defines interfaces to be implemented by blob drivers, which // will be used by the blob package to interact with the underlying services. // Application code should use package blob. package driver // import "gocloud.dev/blob/driver" import ( "context" "errors" "io" "strings" "time" "gocloud.dev/gcerrors" ) // ReaderOptions controls Reader behaviors. type ReaderOptions struct { // BeforeRead is a callback that must be called exactly once before // any data is read, unless NewRangeReader returns an error before then, in // which case it should not be called at all. // asFunc allows drivers to expose driver-specific types; // see Bucket.As for more details. BeforeRead func(asFunc func(any) bool) error } // Reader reads an object from the blob. type Reader interface { io.ReadCloser // Attributes returns a subset of attributes about the blob. // The portable type will not modify the returned ReaderAttributes. Attributes() *ReaderAttributes // As allows drivers to expose driver-specific types; // see Bucket.As for more details. As(any) bool } // Downloader has an optional extra method for readers. // It is similar to io.WriteTo, but without the count of bytes returned. type Downloader interface { // Download is similar to io.WriteTo, but without the count of bytes returned. Download(w io.Writer) error } // Writer writes an object to the blob. type Writer interface { io.WriteCloser } // Uploader has an optional extra method for writers. type Uploader interface { // Upload is similar to io.ReadFrom, but without the count of bytes returned. Upload(r io.Reader) error } // WriterOptions controls behaviors of Writer. type WriterOptions struct { // BufferSize changes the default size in byte of the maximum part Writer can // write in a single request, if supported. Larger objects will be split into // multiple requests. BufferSize int // MaxConcurrency changes the default concurrency for uploading parts. MaxConcurrency int // CacheControl specifies caching attributes that services may use // when serving the blob. // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control CacheControl string // ContentDisposition specifies whether the blob content is expected to be // displayed inline or as an attachment. // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition ContentDisposition string // ContentEncoding specifies the encoding used for the blob's content, if any. // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding ContentEncoding string // ContentLanguage specifies the language used in the blob's content, if any. // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Language ContentLanguage string // ContentMD5 is used as a message integrity check. // The portable type checks that the MD5 hash of the bytes written matches // ContentMD5. // If len(ContentMD5) > 0, driver implementations may pass it to their // underlying network service to guarantee the integrity of the bytes in // transit. ContentMD5 []byte // Metadata holds key/value strings to be associated with the blob. // Keys are guaranteed to be non-empty and lowercased. Metadata map[string]string // When true, the driver should attempt to disable any automatic // content-type detection that the provider applies on writes with an // empty ContentType. DisableContentTypeDetection bool // BeforeWrite is a callback that must be called exactly once before // any data is written, unless NewTypedWriter returns an error, in // which case it should not be called. // asFunc allows drivers to expose driver-specific types; // see Bucket.As for more details. BeforeWrite func(asFunc func(any) bool) error // IfNotExist is used for conditional writes. // When set to true, if a blob exists for the same key in the bucket, the write operation // won't take place. IfNotExist bool } // CopyOptions controls options for Copy. type CopyOptions struct { // BeforeCopy is a callback that must be called before initiating the Copy. // asFunc allows drivers to expose driver-specific types; // see Bucket.As for more details. BeforeCopy func(asFunc func(any) bool) error } // ReaderAttributes contains a subset of attributes about a blob that are // accessible from Reader. type ReaderAttributes struct { // ContentType is the MIME type of the blob object. It must not be empty. // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type ContentType string // ModTime is the time the blob object was last modified. ModTime time.Time // Size is the size of the object in bytes. Size int64 } // Attributes contains attributes about a blob. type Attributes struct { // CacheControl specifies caching attributes that services may use // when serving the blob. // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control CacheControl string // ContentDisposition specifies whether the blob content is expected to be // displayed inline or as an attachment. // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition ContentDisposition string // ContentEncoding specifies the encoding used for the blob's content, if any. // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding ContentEncoding string // ContentLanguage specifies the language used in the blob's content, if any. // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Language ContentLanguage string // ContentType is the MIME type of the blob object. It must not be empty. // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type ContentType string // Metadata holds key/value pairs associated with the blob. // Keys will be lowercased by the portable type before being returned // to the user. If there are duplicate case-insensitive keys (e.g., // "foo" and "FOO"), only one value will be kept, and it is undefined // which one. Metadata map[string]string // CreateTime is the time the blob object was created. If not available, // leave as the zero time. CreateTime time.Time // ModTime is the time the blob object was last modified. ModTime time.Time // Size is the size of the object in bytes. Size int64 // MD5 is an MD5 hash of the blob contents or nil if not available. MD5 []byte // ETag for the blob; see https://en.wikipedia.org/wiki/HTTP_ETag. ETag string // AsFunc allows drivers to expose driver-specific types; // see Bucket.As for more details. // If not set, no driver-specific types are supported. AsFunc func(any) bool } // ListOptions sets options for listing objects in the bucket. type ListOptions struct { // Prefix indicates that only results with the given prefix should be // returned. Prefix string // Delimiter sets the delimiter used to define a hierarchical namespace, // like a filesystem with "directories". // // An empty delimiter means that the bucket is treated as a single flat // namespace. // // A non-empty delimiter means that any result with the delimiter in its key // after Prefix is stripped will be returned with ListObject.IsDir = true, // ListObject.Key truncated after the delimiter, and zero values for other // ListObject fields. These results represent "directories". Multiple results // in a "directory" are returned as a single result. Delimiter string // PageSize sets the maximum number of objects to be returned. // 0 means no maximum; driver implementations should choose a reasonable // max. It is guaranteed to be >= 0. PageSize int // PageToken may be filled in with the NextPageToken from a previous // ListPaged call. PageToken []byte // BeforeList is a callback that must be called exactly once during ListPaged, // before the underlying service's list is executed. // asFunc allows drivers to expose driver-specific types; // see Bucket.As for more details. BeforeList func(asFunc func(any) bool) error } // ListObject represents a specific blob object returned from ListPaged. type ListObject struct { // Key is the key for this blob. Key string // ModTime is the time the blob object was last modified. ModTime time.Time // Size is the size of the object in bytes. Size int64 // MD5 is an MD5 hash of the blob contents or nil if not available. MD5 []byte // IsDir indicates that this result represents a "directory" in the // hierarchical namespace, ending in ListOptions.Delimiter. Key can be // passed as ListOptions.Prefix to list items in the "directory". // Fields other than Key and IsDir will not be set if IsDir is true. IsDir bool // AsFunc allows drivers to expose driver-specific types; // see Bucket.As for more details. // If not set, no driver-specific types are supported. AsFunc func(any) bool } // ListPage represents a page of results return from ListPaged. type ListPage struct { // Objects is the slice of objects found. If ListOptions.PageSize > 0, // it should have at most ListOptions.PageSize entries. // // Objects should be returned in lexicographical order of UTF-8 encoded keys, // including across pages. I.e., all objects returned from a ListPage request // made using a PageToken from a previous ListPage request's NextPageToken // should have Key >= the Key for all objects from the previous request. Objects []*ListObject // NextPageToken should be left empty unless there are more objects // to return. The value may be returned as ListOptions.PageToken on a // subsequent ListPaged call, to fetch the next page of results. // It can be an arbitrary []byte; it need not be a valid key. NextPageToken []byte } // Bucket provides read, write and delete operations on objects within it on the // blob service. type Bucket interface { // ErrorCode should return a code that describes the error, which was returned by // one of the other methods in this interface. ErrorCode(error) gcerrors.ErrorCode // As converts i to driver-specific types. // See https://gocloud.dev/concepts/as/ for background information. As(i any) bool // ErrorAs allows drivers to expose driver-specific types for returned // errors. // See https://gocloud.dev/concepts/as/ for background information. ErrorAs(error, any) bool // Attributes returns attributes for the blob. If the specified object does // not exist, Attributes must return an error for which ErrorCode returns // gcerrors.NotFound. // The portable type will not modify the returned Attributes. Attributes(ctx context.Context, key string) (*Attributes, error) // ListPaged lists objects in the bucket, in lexicographical order by // UTF-8-encoded key, returning pages of objects at a time. // Services are only required to be eventually consistent with respect // to recently written or deleted objects. That is to say, there is no // guarantee that an object that's been written will immediately be returned // from ListPaged. // opts is guaranteed to be non-nil. ListPaged(ctx context.Context, opts *ListOptions) (*ListPage, error) // NewRangeReader returns a Reader that reads part of an object, reading at // most length bytes starting at the given offset. If length is negative, it // will read until the end of the object. If the specified object does not // exist, NewRangeReader must return an error for which ErrorCode returns // gcerrors.NotFound. // opts is guaranteed to be non-nil. // // The returned Reader *may* also implement Downloader if the underlying // implementation can take advantage of that. The Download call is guaranteed // to be the only call to the Reader. For such readers, offset will always // be 0 and length will always be -1. NewRangeReader(ctx context.Context, key string, offset, length int64, opts *ReaderOptions) (Reader, error) // NewTypedWriter returns Writer that writes to an object associated with key. // // A new object will be created unless an object with this key already exists. // Otherwise any previous object with the same key will be replaced. // The object may not be available (and any previous object will remain) // until Close has been called. // // contentType sets the MIME type of the object to be written. // opts is guaranteed to be non-nil. // // The caller must call Close on the returned Writer when done writing. // // Implementations should abort an ongoing write if ctx is later canceled, // and do any necessary cleanup in Close. Close should then return ctx.Err(). // // The returned Writer *may* also implement Uploader if the underlying // implementation can take advantage of that. The Upload call is guaranteed // to be the only non-Close call to the Writer.. NewTypedWriter(ctx context.Context, key, contentType string, opts *WriterOptions) (Writer, error) // Copy copies the object associated with srcKey to dstKey. // // If the source object does not exist, Copy must return an error for which // ErrorCode returns gcerrors.NotFound. // // If the destination object already exists, it should be overwritten. // // opts is guaranteed to be non-nil. Copy(ctx context.Context, dstKey, srcKey string, opts *CopyOptions) error // Delete deletes the object associated with key. If the specified object does // not exist, Delete must return an error for which ErrorCode returns // gcerrors.NotFound. Delete(ctx context.Context, key string) error // SignedURL returns a URL that can be used to GET the blob for the duration // specified in opts.Expiry. opts is guaranteed to be non-nil. // If not supported, return an error for which ErrorCode returns // gcerrors.Unimplemented. SignedURL(ctx context.Context, key string, opts *SignedURLOptions) (string, error) // Close cleans up any resources used by the Bucket. Once Close is called, // there will be no method calls to the Bucket other than As, ErrorAs, and // ErrorCode. There may be open readers or writers that will receive calls. // It is up to the driver as to how these will be handled. Close() error } // SignedURLOptions sets options for SignedURL. type SignedURLOptions struct { // Expiry sets how long the returned URL is valid for. It is guaranteed to be > 0. Expiry time.Duration // Method is the HTTP method that can be used on the URL; one of "GET", "PUT", // or "DELETE". Drivers must implement all 3. Method string // ContentType specifies the Content-Type HTTP header the user agent is // permitted to use in the PUT request. It must match exactly. See // EnforceAbsentContentType for behavior when ContentType is the empty string. // If this field is not empty and the bucket cannot enforce the Content-Type // header, it must return an Unimplemented error. // // This field will not be set for any non-PUT requests. ContentType string // If EnforceAbsentContentType is true and ContentType is the empty string, // then PUTing to the signed URL must fail if the Content-Type header is // present or the implementation must return an error if it cannot enforce // this. If EnforceAbsentContentType is false and ContentType is the empty // string, implementations should validate the Content-Type header if possible. // If EnforceAbsentContentType is true and the bucket cannot enforce the // Content-Type header, it must return an Unimplemented error. // // This field will always be false for non-PUT requests. EnforceAbsentContentType bool // BeforeSign is a callback that will be called before each call to the // the underlying service's sign functionality. // asFunc converts its argument to driver-specific types. // See https://gocloud.dev/concepts/as/ for background information. BeforeSign func(asFunc func(any) bool) error } // prefixedBucket implements Bucket by prepending prefix to all keys. type prefixedBucket struct { base Bucket prefix string } // NewPrefixedBucket returns a Bucket based on b with all keys modified to have // prefix. func NewPrefixedBucket(b Bucket, prefix string) Bucket { return &prefixedBucket{base: b, prefix: prefix} } func (b *prefixedBucket) ErrorCode(err error) gcerrors.ErrorCode { return b.base.ErrorCode(err) } func (b *prefixedBucket) As(i any) bool { return b.base.As(i) } func (b *prefixedBucket) ErrorAs(err error, i any) bool { return b.base.ErrorAs(err, i) } func (b *prefixedBucket) Attributes(ctx context.Context, key string) (*Attributes, error) { return b.base.Attributes(ctx, b.prefix+key) } func (b *prefixedBucket) ListPaged(ctx context.Context, opts *ListOptions) (*ListPage, error) { var myopts ListOptions if opts != nil { myopts = *opts } myopts.Prefix = b.prefix + myopts.Prefix page, err := b.base.ListPaged(ctx, &myopts) if err != nil { return nil, err } for _, p := range page.Objects { p.Key = strings.TrimPrefix(p.Key, b.prefix) } return page, nil } func (b *prefixedBucket) NewRangeReader(ctx context.Context, key string, offset, length int64, opts *ReaderOptions) (Reader, error) { return b.base.NewRangeReader(ctx, b.prefix+key, offset, length, opts) } func (b *prefixedBucket) NewTypedWriter(ctx context.Context, key, contentType string, opts *WriterOptions) (Writer, error) { if key == "" { return nil, errors.New("invalid key (empty string)") } return b.base.NewTypedWriter(ctx, b.prefix+key, contentType, opts) } func (b *prefixedBucket) Copy(ctx context.Context, dstKey, srcKey string, opts *CopyOptions) error { return b.base.Copy(ctx, b.prefix+dstKey, b.prefix+srcKey, opts) } func (b *prefixedBucket) Delete(ctx context.Context, key string) error { return b.base.Delete(ctx, b.prefix+key) } func (b *prefixedBucket) SignedURL(ctx context.Context, key string, opts *SignedURLOptions) (string, error) { return b.base.SignedURL(ctx, b.prefix+key, opts) } func (b *prefixedBucket) Close() error { return b.base.Close() } // singleKeyBucket implements Bucket by hardwiring a specific key. type singleKeyBucket struct { base Bucket key string } // NewSingleKeyBucket returns a Bucket based on b that always references key. func NewSingleKeyBucket(b Bucket, key string) Bucket { return &singleKeyBucket{base: b, key: key} } func (b *singleKeyBucket) ErrorCode(err error) gcerrors.ErrorCode { return b.base.ErrorCode(err) } func (b *singleKeyBucket) As(i any) bool { return b.base.As(i) } func (b *singleKeyBucket) ErrorAs(err error, i any) bool { return b.base.ErrorAs(err, i) } func (b *singleKeyBucket) Attributes(ctx context.Context, _ string) (*Attributes, error) { return b.base.Attributes(ctx, b.key) } func (b *singleKeyBucket) ListPaged(ctx context.Context, opts *ListOptions) (*ListPage, error) { return nil, errors.New("List not supported for SingleKey buckets") } func (b *singleKeyBucket) NewRangeReader(ctx context.Context, _ string, offset, length int64, opts *ReaderOptions) (Reader, error) { return b.base.NewRangeReader(ctx, b.key, offset, length, opts) } func (b *singleKeyBucket) NewTypedWriter(ctx context.Context, _, contentType string, opts *WriterOptions) (Writer, error) { return b.base.NewTypedWriter(ctx, b.key, contentType, opts) } func (b *singleKeyBucket) Copy(ctx context.Context, dstKey, _ string, opts *CopyOptions) error { return b.base.Copy(ctx, dstKey, b.key, opts) } func (b *singleKeyBucket) Delete(ctx context.Context, _ string) error { return b.base.Delete(ctx, b.key) } func (b *singleKeyBucket) SignedURL(ctx context.Context, _ string, opts *SignedURLOptions) (string, error) { return b.base.SignedURL(ctx, b.key, opts) } func (b *singleKeyBucket) Close() error { return b.base.Close() } ================================================ FILE: blob/drivertest/bindata.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // This file was auto-generated using go-bindata (https://github.com/jteeuwen/go-bindata). package drivertest import ( "bytes" "compress/gzip" "fmt" "io" "strings" ) func bindataRead(data []byte, name string) ([]byte, error) { gz, err := gzip.NewReader(bytes.NewBuffer(data)) if err != nil { return nil, fmt.Errorf("Read %q: %v", name, err) } var buf bytes.Buffer _, err = io.Copy(&buf, gz) gz.Close() if err != nil { return nil, fmt.Errorf("Read %q: %v", name, err) } return buf.Bytes(), nil } var _testLargeJpg = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfc\x65\x54\x9b\xd1\xba\x2e\x0c\x3f\xc1\x82\x07\x2f\x0e\x45\x0a\x05\x4a\x8b\x16\x97\xb6\x78\xd1\x16\xd7\x22\xc5\xdd\x82\x07\x77\x2f\xd0\xa2\xc1\x9d\x40\x71\x77\x2f\x4e\xa1\x40\xd1\x40\xf1\x42\xd0\x94\x52\xf8\xc6\x5a\x67\x9d\xfd\xae\xbd\xf6\xda\xdf\x58\xfb\x1d\x7b\x9f\xf7\xcf\x99\x63\x5c\xff\x92\x99\x5c\x79\xe6\x3d\x6f\xbd\x72\xff\xed\x7e\x03\x20\x51\x96\x57\x92\x07\x40\x18\x00\x00\x02\x40\x00\x70\xbf\x02\xbc\x04\x70\x71\x70\xc0\x38\xd8\xb8\x60\x30\x18\x0f\x0f\x17\x9f\x90\x82\x88\x90\x80\x80\x90\x86\x8c\x1c\x42\xc1\x40\xcb\xc4\xc8\x40\x4b\x4f\xcf\xcc\xc6\xcb\xc1\xcc\xc2\xc3\x4a\x4f\xcf\xf9\xfc\x31\xcf\x33\x3e\x41\x41\x41\x26\x0e\x51\x49\x11\x7e\x09\x5e\x01\x41\xfe\xbf\x6c\x02\xc2\xc3\xc3\x23\x24\x20\xa4\x26\x22\xa2\xe6\x7f\x48\xff\x90\xff\xbf\xbc\xee\x7b\x00\x52\x5c\xd0\x05\xe6\x1e\x26\x88\x05\xc0\x20\x05\x61\x92\x82\xee\x07\x00\x26\x00\x00\x61\x83\xfe\xba\x80\xbf\x2d\x10\x06\x26\x16\x36\x0e\x18\x17\x0f\x9f\xe0\x7e\x00\x68\x24\x01\x30\x40\x98\x98\x18\x58\x98\xd8\xd8\x58\x58\x00\x00\x0a\x00\x61\x60\x02\x58\xa4\xd8\x64\x0f\xf9\x64\x71\xc8\x35\xdf\x81\x59\x5c\x29\xf8\x83\x93\xf3\x71\x59\x5f\xd4\xf5\x52\x6a\xcd\x9c\xb2\x09\x98\xbb\x85\xe0\xe1\x53\x3d\xa0\xa6\xa1\x65\x7f\xc4\xc1\xf9\x98\x4b\x50\x48\xf8\xb9\x88\xa8\xd8\xcb\x57\x72\xf2\x0a\x8a\x4a\xca\x6f\xde\x6a\xeb\xe8\xea\xe9\x1b\x58\x58\x5a\xbd\xb7\xb6\xb1\xb5\x73\xf7\xf0\xf4\xf2\x86\xfa\xf8\x86\x86\x85\x47\x44\x46\x45\xc7\xa4\xa4\x7e\x48\x4b\xcf\xf8\xf8\x29\xb3\xa0\xb0\xa8\xb8\xa4\xb4\xac\xbc\xe2\x73\x7d\x43\x63\x53\x73\x4b\x6b\x5b\x5f\xff\xc0\xe0\xd0\xf0\xc8\xe8\xd8\xec\xdc\xfc\xd7\x85\xc5\x6f\x4b\xcb\x9b\x5b\xc8\xed\x9d\x1f\xbb\x7b\xfb\x07\xa8\xb3\xf3\x8b\xcb\xab\x6b\xf4\xaf\x9b\xbf\xf0\x02\x01\x98\xa0\xff\xbd\xfe\x29\x2f\x52\x00\x03\x84\x81\x85\x85\x89\x05\xfe\x0b\x2f\x10\x86\xf7\x5f\x5e\x40\x8a\x85\xfd\x90\x0f\x87\x4c\x56\x13\xfc\xce\x95\x9c\x85\x3f\x18\x97\xe2\x45\x72\x7e\x5d\x2f\x1e\xab\x80\xd6\x29\xa5\xb9\xdb\x0c\x3e\x15\x9b\xe0\x26\x3b\xea\x2f\xd4\xfe\xca\xec\x5f\x23\x16\xf2\xff\x8a\xd9\xbf\x11\xfb\x7f\x78\x2d\x03\x84\x98\x20\x00\x83\x14\x93\x14\x90\x06\xae\x6f\x38\x0b\x60\xf8\xff\x01\x82\xee\x32\xd8\x14\x9a\xff\x17\xff\x17\xff\x22\xde\xb0\x25\xb3\x68\xfd\xec\x7d\xeb\xc9\x36\x8d\xb9\x57\x71\x0f\x38\x46\xba\x1a\x1f\x66\x5b\xd3\x94\xa7\x7d\x8d\x90\x1d\x81\x83\x35\xe5\x28\x80\xff\x09\x80\x82\xe5\x28\x34\x40\xff\xdf\x62\xd1\x53\x46\x85\x04\x38\x50\x05\xc4\x62\xfa\x3a\x51\x11\xe1\x66\xbf\x79\x85\xc4\x6d\x56\x12\x08\x43\xbb\x95\x33\x94\x50\x52\xc9\xd5\xf9\x01\x52\x37\x34\x3d\xe2\x6a\x0b\xdb\x4c\xc5\x80\x83\xa6\x22\xae\x24\xd1\x13\x80\x42\x53\x0e\xa0\xd0\x4c\x96\x03\x28\xb4\xde\xa7\xba\x5c\xc2\xc1\x9a\xaa\x6b\x92\x72\x8f\xcd\xc4\x63\x00\x9a\x90\x72\x0e\x38\x02\x8c\x8e\x46\xea\x37\xaa\x5a\x5d\xc4\x82\x3b\xfa\x9a\x06\x13\x30\xe3\x8f\x20\x81\x92\x9d\xf7\x00\xfe\x65\x10\xcd\xa1\xeb\x5e\x20\x55\x67\xb7\xe3\xb0\x25\x94\xce\x8f\xbc\x47\xe8\xc7\x3a\x5e\x87\x28\x56\x93\x9b\x7d\x86\x9c\x75\x5b\x4b\x72\x8e\x71\x2f\x3b\x8e\xaf\xbb\x0c\xb5\xf0\x3a\xe4\xd6\x5a\xa8\xee\xab\xae\xa6\x9f\x3d\xfc\xe5\xa0\x1d\xbb\x04\xe4\xc5\x5a\xe3\x37\x28\xe6\xb0\x6f\xf5\x5d\xb5\x70\x78\x95\x4c\xb9\x8f\xd3\x27\x73\x10\x76\xeb\x4f\x71\x2f\xc4\x6b\xbd\x69\xb9\x38\x62\x6c\xe8\x91\xdb\x80\x94\xf8\xea\xaf\xd7\x4b\x7c\xd8\x66\x22\x34\xcb\x62\x48\x04\x63\x03\xe8\x38\xb9\x69\x1b\x27\x4f\x53\xf6\xae\x2a\x80\xcb\x00\xe0\x2c\x88\xf9\x97\x20\x30\xf1\xd7\x03\xa2\x45\x06\x7e\x23\x43\x20\xf7\xdc\xf7\x26\xc6\x4b\x16\x8e\x11\xc3\xf9\x37\x3c\xe6\x04\xd9\xfc\xc3\x3b\x1e\x0b\x4c\x3c\xf9\x9f\x39\x2d\xff\x15\xc4\xb9\x14\xdd\xe8\x46\xf8\x6b\xa1\xe6\x9b\x79\x6f\x84\x73\xf5\x0d\x03\x09\xb2\x6b\x14\x8f\xa7\xe8\x6f\x16\x1b\xed\x1e\x60\x2c\xf7\xd9\x46\xf7\xbc\x7a\xd4\x15\x74\x5a\xa5\x93\x79\x0f\x0c\x1c\x66\x45\x3f\x5c\xa9\x8b\x66\xba\x98\x4e\xb8\x00\x35\x6e\x4c\x85\x35\x5d\xa7\xd7\x1e\x88\xed\xd9\x16\xa7\xf0\xfd\x4e\x67\xb3\xc8\x3e\x0f\x9d\x70\xb2\x33\xc5\x73\x3c\x96\x9e\xf3\x17\xf0\xe6\xcd\x0a\xfc\xf4\xb8\xf1\x9a\xd5\x75\x7a\x97\xe3\x0c\xf1\x3a\x44\x30\x82\x04\x0c\xe0\x47\xac\xbc\x6d\x68\xf3\x52\x2c\x91\xb7\x14\x31\x83\x28\x03\xe7\x89\xc4\xfe\x0a\x2d\xf5\xf3\x6f\x5e\xa0\x5e\x99\x2f\xbe\x39\xc7\xc7\x19\xa2\x1c\x36\x97\x4c\x54\xbe\x40\x3b\x91\x59\x12\xc6\xe1\xb2\x0a\xfd\x90\xa6\x96\xe0\x6d\x6b\x8a\xfd\x53\x6a\x33\xce\x70\xf9\x91\x87\xae\x64\xfb\x27\x3f\x77\xcc\x6c\x17\xef\xea\x12\xda\xd3\xbc\xa9\xf9\xfc\x84\xf4\x45\x3d\xfd\xf1\x9b\xb9\x43\x19\xa6\x97\x82\x31\x85\x6c\x31\x85\x7e\xd5\x7a\x7a\x2f\x2c\x5b\xdb\x62\x28\xe9\x53\x7e\x02\x18\x1d\x4e\xeb\x86\xa8\xee\xa8\x5d\x43\xad\x54\x43\x70\x24\xa1\x46\xe0\x09\x47\xce\x0a\x6c\x4a\x6d\xe9\xd0\x90\xcf\xff\xd9\xfc\xcf\x63\x2d\x95\x55\x27\xaf\x8f\x67\x07\x7b\x55\xad\x97\x34\xf4\x4c\x43\x30\xb1\x95\x6e\x46\x5b\xaf\x99\x86\xd1\xe7\xcb\xac\xa6\x5d\x33\x84\x61\xfb\x8b\xe7\x94\x89\xf7\x00\x81\xbd\x02\xd5\x79\xd7\x4a\x44\x0a\xbf\x2b\x59\x89\x8a\x7b\x70\x88\xc8\xee\xa1\xd6\xd2\xed\xe3\x19\xf3\x20\x7e\xe4\x44\x0b\xdb\x76\x34\x5d\x68\xee\x37\x86\xca\xc2\x86\xd3\xc0\x68\x6b\x96\x71\xec\x30\x3c\x96\x38\x27\x5c\x81\x18\xe0\xfc\xf7\x3d\x10\xa7\x6c\x49\xf2\xcd\xf6\xbc\x5b\xf5\xa8\xa7\xdc\x84\x1f\xca\xda\xbc\x50\x7f\x7c\x6b\x85\x94\x54\xcd\x54\x95\x56\x6b\xa1\x9b\xff\x38\x3e\xd8\x2a\x15\x29\x82\xd9\xcc\x2a\x74\x44\x50\xa8\xc7\xb5\x61\xd0\x87\xe3\x0e\x0b\xad\xd6\x4f\x58\x16\xe9\xc1\x8f\x01\xf6\x83\x65\x18\x5f\x5d\x9b\x92\x6d\x85\x4d\x4e\xaf\x6c\x60\x7e\xe0\xd2\xcb\x85\x32\x13\xe7\x7d\x2a\x6e\x6e\x41\x7f\x70\x88\x86\x6a\x4c\x3d\xd6\xfa\xc4\xba\x6d\x74\x9e\xe7\xcf\x34\xdb\x19\x6a\x8e\xa4\xa6\xc0\xd2\xfc\xa6\x01\x8e\x53\x29\x80\xde\x03\xda\x73\x8c\xe2\xfb\xef\x52\xbf\x0c\xad\xf8\x68\xcb\x68\x89\x6d\x27\xde\x75\x2a\x58\xbf\x43\x11\x28\xe9\x6d\xc4\xd0\x41\xf3\xe5\x36\x9f\x20\x55\x5b\xa7\x56\x77\xe7\x19\x5b\x8e\x4d\x16\x6b\x7d\x35\x34\x18\xe7\x41\xdb\x1c\x6f\xd0\x29\x4d\xc5\xdb\x8d\xcd\x60\xaf\xe9\x2e\x93\x1f\x1c\x8b\xa1\x73\xb5\xfb\x27\x46\x6a\x39\x5b\x74\x39\x4f\x87\x9b\x9f\x2f\x77\x65\x4f\x1b\xf9\x97\xbb\x39\xfe\x02\x25\x88\x8a\x1e\x27\x2a\xdf\x68\x0c\x15\x79\x50\xbe\xfc\xcd\x38\x3e\x95\xf2\xce\x99\x3a\xe5\x65\x86\x63\xe8\x93\x4b\x38\xb1\xee\x4b\x74\x1a\xfc\xc0\x06\x63\xf2\xb4\xe9\xb8\x74\xea\x05\x9c\xfe\x82\x87\x5f\x00\xbd\x68\x8b\x3d\xff\xa6\x64\xdb\xf3\xdd\x01\xb1\x7d\x02\x0a\xd2\xaf\xca\x6d\xa0\x63\xf3\xe9\x68\x69\xc5\x2f\xd6\x05\xa3\xdd\x0c\x36\xe0\x7b\xbe\x78\xcb\x1d\xa9\x8e\x8b\x3e\xe9\x33\x80\x39\x32\x9e\x19\xcb\x8f\xea\x51\x46\x8d\x51\x7a\x9d\x27\xbd\xf4\xbe\xa6\x00\x1d\xff\xa2\x68\xfc\x61\x20\x3d\xc8\x99\xdf\xf6\xfb\x41\xd4\xf1\x50\x16\x3f\x92\x7d\x74\x28\xe0\x4c\x64\x4a\x68\xaf\x29\x63\xe1\x7a\xba\x68\x61\xb6\x2a\xb9\x76\xec\x73\x76\xa8\x0c\xd5\xbf\x62\xcd\x8f\xf1\x00\xf7\x97\xcf\xb4\xd9\x16\x13\x6f\x95\xd1\x45\xcb\x2a\x5d\x89\x45\xc2\xce\xa3\xdf\x06\xac\xb9\xd4\x4b\xc4\xa7\xc1\xba\x48\xe9\xa8\x1b\xd3\xb0\x19\xf3\xf7\xe4\x6b\x52\x2f\x5e\x44\x8a\x48\xa1\xf7\x4d\xcc\x6f\xae\x07\x82\xe8\x46\x66\x6d\x47\x3c\x0e\x3d\xcd\xc4\x4b\x7c\x8e\x73\x55\xed\xa1\xe4\x9b\xab\x6b\xa5\xae\x54\xf5\x5b\x8e\x73\xea\x39\xfb\x74\xd9\xc8\xec\xed\x7b\x20\xdc\x8f\x47\xf8\x59\x5f\x4c\x19\x0c\xfb\x2f\x4f\x93\xc0\x67\x33\x31\x6a\xd9\xb8\x74\x79\x45\x37\x73\xd7\x96\x70\x94\xa2\xca\xd0\x86\xfe\xcc\x75\xdf\x50\x8a\x00\x9d\x5a\x26\xe7\xed\x6c\x55\xf5\x85\x9d\xfc\xe7\x0a\x2b\x2f\x7e\x9a\xc8\x30\xcd\x54\xb5\x9f\x68\xbc\xf2\x06\x4c\xce\xa7\x7b\x00\x02\x36\x94\xcb\xff\x7e\xb0\xfc\x56\xd3\x70\x6d\x59\xb4\xe3\x49\x02\x7d\x82\xa1\xf7\xa6\x0c\x63\x32\x45\x88\xe2\xd7\xf9\x6d\xd2\xcc\x00\x77\x46\xdc\x45\x9c\xe6\xcd\x15\xf1\x82\x11\x63\x24\x76\x08\x3d\xcc\x6f\x51\xfd\xbf\xe8\xf4\xf0\x39\x81\x82\x98\xff\x63\xc0\xcc\x42\xf5\xb4\xdf\x03\x61\xe6\x87\x47\xd9\x5d\xeb\x9f\x5e\xa4\x8f\x5d\xef\x9b\x60\x6f\x1a\xab\xff\xe6\x1e\xae\x1b\x4b\x6c\xe3\x48\xaa\x3c\xc1\xa2\x27\x3f\x31\x55\x57\x0e\x79\xc5\xd9\xcf\x1c\x47\x7b\x8a\x88\xbe\x03\xa7\xaa\xb5\x19\x3b\xab\xc0\x3e\xb2\x88\x97\xbc\x35\x0b\x07\xbb\x67\x02\x57\x68\x36\x72\x43\xcc\x79\x52\x93\x07\x5b\xab\x2a\x1a\xa7\xde\xb1\x12\x68\xb6\xe4\xfc\xcc\x17\x83\x31\x9b\x0a\x75\x97\x08\xc5\xd3\xa0\xe8\x77\x5f\x25\xa4\x9d\xf9\x47\xf0\x96\x29\x42\x7a\x2e\x36\xe6\x03\xd9\x4f\xc3\x11\x51\xf9\x01\x33\xac\x23\xb2\x8f\x5b\x72\x4a\xa5\x5a\xe0\xb8\x12\xe2\x5b\xf6\xd2\x0f\x6c\xc7\x0e\x36\x92\xfb\x0b\x89\xef\x01\xe5\xf3\x2c\x15\x1b\x09\x26\x94\xf2\xae\x7a\xee\x7c\x96\xaa\x4c\x64\x64\x70\x5c\x8a\xb8\x1f\xed\x9e\xc4\xe3\x0d\x06\xeb\xbe\x35\xae\x75\x90\x0f\x0f\xbd\xff\x4e\xb6\x59\x80\xa4\xfa\xa6\x49\x64\x0d\x54\xfa\x35\x0a\xb2\x54\xd4\x19\xde\xf1\xdb\x6b\x9d\x70\xa6\x4e\xf7\xe5\x91\x1c\x60\xb7\x64\x38\x54\xf7\x58\x0e\xb0\x88\xc3\x6f\xc3\x56\x70\xc4\x0d\xc1\x8a\x23\x7b\x01\xe3\xf7\xcd\x4c\xff\x27\x51\x6a\x01\x0c\x5f\xb5\x20\x3d\x06\xf8\x21\xa1\xbf\xc9\x2d\x19\x38\x18\xfd\x39\xc4\xbe\x88\xa9\xfd\x5c\x1e\x74\xc5\x31\xdb\xd1\xb6\xea\xaf\x7d\xda\xd3\x38\xfa\x39\xe5\x44\xf1\xe9\x27\x8b\x18\xd5\x71\xdc\x29\x6d\x86\x20\xb1\xeb\x98\x04\x3d\x2d\x4b\xce\x03\xfc\x5c\x5c\x41\x50\xf4\x26\x82\x72\xbf\x8b\x63\xce\xa2\xb3\xb6\x45\x9f\xb2\xc5\x6a\x6f\xcc\x2f\x44\x9c\x76\xfd\xd0\xc4\x6a\x8b\x29\x72\xd1\xd7\x71\x3e\x73\x37\xf4\xfd\x6f\x22\xb4\x78\x51\xa3\xe6\xef\x4f\x7f\xa2\xf6\x20\x9d\xd2\x7d\xf7\x00\x05\xbc\xb3\x5d\x4c\xad\xd5\xc1\xa3\xd3\x80\xa5\x9c\x8d\x3f\x39\x82\xcd\xb5\x61\x1a\x5c\xac\xa9\x39\xcc\x35\x52\x21\x3b\x29\xa7\xf4\xff\xe7\xd4\x68\xdb\xff\x62\x14\xa7\x59\xe6\xb5\x22\xad\x93\xcd\xb6\x44\x26\xd8\x60\x4e\x04\xf2\x40\x6f\x6d\x7c\xdd\xf7\x7d\x3d\xc6\x9c\x77\x7f\xf1\x47\xb2\x83\x0e\x2f\x84\x26\x6e\x45\xd1\x7e\xdb\xab\xbc\x75\x55\x22\x99\x5b\x72\x63\x0f\xb1\xc2\xa7\x44\x45\x4f\x4c\xcc\x3d\xcb\x1c\x3b\xde\x48\xfe\x6c\xb5\x12\x9a\xe8\x53\xfc\x16\x2b\xde\xe5\xbf\xdb\x5a\xad\x72\x0f\x44\xdd\xb1\x7d\x75\x4e\x71\x7c\xf8\xa8\x31\x82\x84\x4a\xf0\x4d\x1a\x78\xfe\x4a\x3a\x1e\x08\x50\x75\x98\x51\xa0\xd6\x66\x0d\x7e\xf3\xab\x42\x0d\x84\xf8\x24\x18\x8b\x88\x5e\xfe\x52\x2f\xd9\x79\x3c\xa0\x45\xff\x4e\x39\xfc\x35\xe9\xa2\x50\x5d\xd0\x3b\x14\x47\xbf\xf0\x44\x8d\xc9\xe1\x10\xb4\xa0\x5f\x85\x8c\x8f\x99\xf0\xc6\x8c\xd0\x5d\x86\xe9\x45\xf9\x84\x9c\x8f\x23\xe5\x6a\xf6\xc2\x39\xef\x5e\xf1\x8b\x84\xd2\x16\x56\x2c\x1d\xf5\xb0\xcb\xe2\x45\x7f\x69\xfb\x80\xbc\xcc\x57\xbf\xba\x3a\x0f\x1d\xbb\xf6\xe1\x10\x06\xb4\xc6\x68\xd1\xe1\x4d\x57\x9c\xf6\xcc\xd6\xa7\x2e\xa3\x90\x16\x42\x05\x30\x42\x46\x6c\xf1\xb3\x6e\xb8\xbe\x91\x64\xc6\xd0\x1f\xa5\x87\xa1\xbe\x02\x6e\x5f\x26\xce\x70\x80\x6d\xe2\xec\xd4\x1b\xdd\x16\x39\x66\x0f\x2c\x8f\x41\x40\xe5\x1f\x23\x2a\xa5\x4e\xf7\xb8\xb8\x45\x1a\xe4\x3a\xbd\xdc\xa6\xfd\x43\x2c\xea\x54\x8d\x6c\x73\xce\x5e\x1a\x9a\x0d\x7a\x4f\x89\x2b\xc4\xa3\xdc\xdd\xa1\xeb\xa7\x8f\x4a\xd9\xc4\x62\xa8\xb4\x53\xbf\xbc\x95\x78\xfa\x26\xce\x4d\xe4\x38\x78\x16\x26\x15\x3f\x22\xa8\x1b\x0d\xf5\xde\x8a\x5f\xfb\xe4\x4d\xd9\x55\x2f\xa1\xeb\xa5\x25\x35\xd0\x1e\xdf\x2a\xdb\xf3\x2b\x42\x20\x0e\x95\x6a\x32\x6a\x15\xe4\x1c\xe4\x4c\x7f\x75\x56\x95\xdc\xf2\xbd\x58\xcd\x8d\x13\x63\xe2\xef\x1f\x0d\xa6\xc8\x8f\x7f\x33\x37\xbe\xff\xa3\x01\x34\xee\x30\xbe\xaa\xcf\xd3\xc1\x20\x7a\xa9\x2c\xa6\x2b\xf6\xf8\xba\xdc\x83\x2d\x81\x6c\xd8\x4a\xd0\x86\x88\x68\x4d\xf7\x50\xa0\x40\xd3\x69\x53\xee\x2c\xc5\xf9\x4f\xba\xb0\x70\x23\x1c\xd1\x93\x09\x9f\x93\xfe\x13\xc2\xef\xd0\x50\xe3\x36\x94\x5a\x1d\x7d\xdc\x6c\xf7\x8d\xc8\xc7\xed\xe3\xcb\x21\x69\x1e\x0d\x30\x11\xbc\x34\xba\x83\x49\xb2\x7e\x8a\x00\xd7\x5a\x0a\x4a\xd4\x97\xd0\x6a\xe4\x85\x80\xdf\x8a\xd6\xac\xd8\x5d\x91\xa8\xd3\x80\x56\x5f\x3a\x7c\xc7\x63\x32\x7a\x1b\xc8\x79\x1a\xdf\x1c\x75\x21\xea\xc0\x64\xe9\xa4\xf0\xb3\xf8\x71\x2a\x9d\x6f\xcc\x8f\x5b\x86\xd3\x1f\xe7\xfd\xfc\x75\xcf\x6d\x1f\x7e\xef\x16\xc1\xa2\xd2\xf0\xa5\x9f\x06\x17\x95\x31\xb8\xf6\x96\xce\x72\xf6\x60\xfc\x9d\x15\xda\x0b\xcf\x4c\xc8\xba\xfb\x10\x35\x38\x9c\x89\x80\x64\x85\xb6\xef\x1e\xa1\xb3\xfd\x97\x78\x2e\x3e\x75\xcd\x79\xd0\x61\x50\xe7\x9b\x4f\x84\x4e\x42\xd4\xcf\xd1\x1a\xe0\xaa\x09\x1f\xa2\xb6\x07\xe9\x72\x1a\x38\x6e\x6a\xdc\x2c\x27\x83\xbe\x56\xf0\x97\xec\x5f\x2c\x5c\x87\xd7\xa9\xe9\xad\x33\xcf\x0a\x0b\xa0\xd7\x03\x3f\xa3\x56\x04\x2b\xe5\x59\x1f\x16\x3f\x7d\x24\x3d\x35\xdb\xc6\xcd\x14\x2a\xa6\xdc\x9a\x7e\x77\xf0\xf3\x32\x47\x26\x49\x95\x03\xeb\x26\xce\x8d\x13\x13\x9e\xb5\xa5\x1e\xb1\xc9\x45\xf7\x26\xd4\x9e\x1e\xa3\x3a\x6f\xe7\xa2\xda\xef\x29\x85\xed\xf3\xe9\x68\xb3\xae\x88\xb7\x92\x5f\x2b\x73\xa5\xf1\x3a\xb8\xdc\xef\x01\xb2\x81\x51\xe3\xd2\x5d\xa7\xdc\x1c\xbb\xf0\xa9\xde\x78\x50\xa1\x47\xbd\x5f\xbb\x6a\x0f\xe1\x20\xdf\xed\xaf\x09\xc0\x1b\x65\xe7\x55\x2f\xfa\xea\x13\xcd\x3c\xc6\x18\x1d\xdb\xfb\x6a\x9e\x98\x55\x5c\x21\x24\x6d\x69\x9f\x29\x89\x2c\x8f\xfb\xbe\x14\x67\xfb\xda\x47\x0d\xab\xe4\x60\xbc\x84\x4f\xf4\x4c\x63\xf5\x8e\x12\x16\x5b\xf7\x00\xa0\x4e\x2f\xc5\x19\xb7\xaa\x97\xc1\xbd\x8b\x41\xd3\x43\xd3\x2b\x72\x89\xac\x06\xfc\x56\x29\xc3\xf3\xa1\x79\x6a\x8b\x0e\xc8\xdc\x31\xcf\x64\x3d\xeb\x12\x6e\x17\x12\x5f\x0d\x8c\x19\x39\x0a\x20\x4c\x17\x0f\xb9\x1e\xe9\x65\xc2\xdd\xf4\xfb\x95\xf4\xde\x4d\xb6\xb4\xa0\x40\xfe\x4a\x8a\xf8\xf3\xb2\x9a\xb3\xa4\xb8\x69\xf0\x07\x28\xf9\x90\x77\xed\x01\x3f\xd4\x62\xe0\xd9\x28\x4e\xa9\x13\xd4\x9a\x95\x8c\xf8\x9b\x24\x7a\x57\x68\x3f\xb1\x6c\xf9\x05\x6c\x5c\xc2\x76\xda\xff\x0b\x58\x68\xb7\x9b\xea\xf6\xa9\xab\x4f\x21\x91\xbb\x62\xf2\xe6\xfc\xc5\x99\x15\x11\x93\xae\x86\x28\x78\x8f\x7b\x4a\x8a\x11\x1d\x70\xeb\x6d\xcb\x3e\xf1\xb3\xd9\xeb\x9c\x27\xec\x75\xdc\x40\xf6\xd5\x81\x6b\x62\x1f\x4c\x32\xe4\x70\x4b\x37\xd2\xf1\x7d\x0a\x47\xdb\xfb\xb3\x9b\xcf\xaf\xbe\x74\x7f\xa4\xa4\x5f\x27\xbf\x15\xa5\xa8\xa4\x6e\x49\x7f\xe1\x9a\xc7\xfb\xc8\xb1\xe8\x4a\x84\xc1\xce\x91\x60\xf3\x2e\xbe\xc0\x09\x6a\x6e\x6b\x65\x91\x72\xd6\x84\x9c\xa3\x2c\xf2\x67\x2f\xfc\x64\xe2\x5c\xdb\xc7\xe6\x46\xf0\xcc\x88\x3c\x04\xf7\xee\x05\x8c\x88\x6e\xb0\x4d\xad\x95\xae\x33\x67\xc4\x2c\xee\x6d\x04\xb6\x9a\x82\x09\x91\xc3\xb0\x84\x56\x5c\x61\x39\x78\x7a\x91\xa8\xd2\xff\xc9\x8c\x13\xdc\xeb\x73\xfc\xd1\x4f\x43\x36\x15\x8a\x38\x7e\x75\x84\x24\x77\x5c\xdd\xa9\x77\x82\x04\xc7\x93\xf9\x26\xdf\x2a\x6f\x92\x72\x53\x2e\x32\x95\x07\x98\x4d\x10\x02\x19\xc6\x0d\x4e\x04\xdf\x8c\xd4\xe3\x17\xf5\x72\xef\x6a\x56\xc6\xad\xfc\x2d\xcf\x14\x3d\x7a\xac\x87\x9d\xd4\xc0\xac\xd5\xbe\xaf\x1f\x90\x7e\x97\x67\x14\xc6\x62\xb4\xc1\x30\xf8\xfb\x2b\x3e\x06\x4a\xe6\xc1\x35\x46\x2c\x2f\x5a\x6e\x03\x27\x7e\x76\x2b\x39\xfd\x46\xf7\x79\xf5\x3b\x82\x8e\x4f\xa3\x9e\x44\x53\xc8\xd9\xe6\xe3\x0b\x43\x02\xc5\xab\x97\x8e\x64\x9c\x7b\x94\x32\x94\x6e\x57\x1b\x86\x06\x1d\x45\x96\x9c\x13\x50\xaf\x3a\x54\xaa\x71\x7b\x57\xfa\xb8\xcc\xac\x8e\x12\xe9\xc7\x07\x5c\x5f\x00\xf0\xb4\x39\x4c\xf2\xa3\xc1\x4a\xbf\x87\x32\xb6\xd1\x99\x4c\xcd\x9b\x2d\xf9\x6a\x2b\xeb\x8d\x55\x2d\xe1\x5c\x52\xc1\x24\xfe\x02\x1a\x8c\x74\x8e\x04\x6e\x58\x73\xde\x56\x50\x54\xc3\x75\x78\x8e\xe3\x42\xd0\x87\xd1\x6d\x47\x2e\x62\xf1\xdd\x43\xb5\xc8\x8d\xdc\xf6\xb2\x0a\x06\xfb\x01\xad\x11\x0a\x50\x9d\xca\x73\xa6\x68\x38\xfe\x3d\x40\x70\x1b\xe0\x5c\x0a\xb5\x59\x5e\xfb\x42\xb2\xa2\xf4\xf5\x23\x20\xfb\xa3\xfd\xdb\x1d\x2f\xda\x67\x8e\xf8\xbc\xc4\xbd\x31\x4e\x81\xe8\x62\xd0\xd2\x96\x09\xa3\x21\x56\x64\x6a\xb9\xc4\xe7\x7b\x82\xb8\x79\xdb\x9e\x14\x1d\xda\x89\x5a\x47\xfa\xa8\xdd\x3d\xa1\xd4\x9a\x03\x05\x87\xe4\x7a\xde\x03\x54\xab\xf7\x40\x9f\x77\x50\xf5\x3e\xca\x08\x77\x47\x44\xe3\x3b\x39\xec\x99\xaf\xc7\x15\x42\x0e\x1d\x80\x72\x3a\x3b\x7f\xa3\xca\x31\xa0\x73\x68\xcf\xf3\x91\x54\xf9\x2d\xdc\x62\x4f\xf6\xc4\xa4\x4c\x82\xa3\x90\x93\xba\x2e\x96\x7b\x3a\x6d\xc2\x67\x78\x28\x80\x7f\x76\xbd\xff\x2a\xc3\xb5\x42\xce\x95\xb2\x87\xef\x73\x70\x7b\xfe\x14\xc3\x6f\x0d\x70\xed\xd0\xd6\x2b\xe2\x52\xe6\x8b\x52\x5d\xf1\x8d\x4e\x25\x4f\x69\xc2\x6f\x93\x35\x88\xb6\x87\x63\x17\x23\x1b\x8b\x72\x7f\x77\x07\x69\xf8\x6a\x80\xc3\xa0\x33\x8e\x97\xea\xb1\x99\x0e\xfc\x8a\xfa\x3a\x1a\xb8\x04\x21\xed\x7e\x9e\x97\x8c\x21\x9d\x9f\x97\x97\xf9\x30\x60\x85\xd4\x08\x32\x74\x86\x33\x55\x06\x0a\x63\xec\xc6\x78\x2f\x91\xa5\x25\x89\x59\x5c\x4d\xe1\x65\xde\x64\x67\x0c\x91\xce\x32\x03\x1f\x2f\xfb\x27\x2a\xe6\xac\x58\xf2\x15\x1a\x38\xe1\x84\x7b\x8f\x01\x4e\x4b\xe4\xb1\x8e\x32\x53\x9c\xc4\xab\x42\x42\x6b\xfa\xc4\x72\x04\xfb\x5c\xe3\x84\xca\xa6\x77\x1c\xdb\xec\xa5\x52\x8d\x93\xa0\x8f\xdb\xcc\xc8\xb0\x8b\x1c\x07\x90\x78\x68\x3c\x59\x8c\x2a\xed\x4b\x77\x42\xc5\x46\x5b\x7a\x82\xe9\x58\xa5\xf9\x18\x23\x3a\x22\x87\xba\x84\xef\x81\xb0\x7a\x9d\x7a\x47\xee\xd7\x6d\x9f\x58\x47\x96\x58\xc8\xa6\x72\xbf\x7b\x9d\xc8\x30\xbd\xde\xf7\xed\x2c\xa9\xb6\x62\xf8\x5a\x34\xca\xa3\xc5\xc9\x35\xe6\x86\x5b\xd9\xbe\x28\x32\x32\xe1\xdf\xba\x79\x88\x88\xd2\xf9\x54\x3b\x73\xc4\x5b\x6d\xe1\x30\xa6\xf5\x96\xab\x55\xe2\x74\xf8\x97\xae\x71\xf1\xfe\x3d\x40\x5e\x44\xe4\xee\xf1\xdb\x34\x31\xb9\x98\x46\x7a\x53\x86\x71\x6f\x96\x25\x41\x0f\x52\x5e\xf2\xa7\x84\x1e\x39\xf1\x3a\x77\x25\x1c\x9a\xdd\x45\x8b\xba\x98\xcb\x8a\x5d\x22\xea\x6b\x16\x27\x84\x47\xfd\x81\x31\xf8\x05\x36\x1a\x38\x13\x42\x9b\xe4\xa4\xf7\xac\x52\x45\x08\xdb\x43\x79\x41\x47\xea\xbf\x26\x00\xbf\xee\x2c\x9a\x3b\xa1\xdb\xfd\xde\xe0\x3d\x39\xa8\xde\xac\x84\xbe\xa3\xf0\xaf\x77\x5d\x36\x6f\xcb\x06\xde\x3c\x1b\x56\xcb\x19\x29\xcb\x5f\xf0\x97\x2b\x21\xa5\x58\x34\xa8\xf2\x27\x23\x01\x36\x48\x04\x12\xe4\x83\x08\xaf\xe1\x10\xdf\x82\x0e\xde\xb9\xad\xf4\x0e\x4b\xc5\xf7\xcf\xf0\xf0\x4f\x56\x04\x5f\x67\x29\x74\xb7\xd6\x94\xaa\xa2\xe1\x27\xb5\x26\xb6\x35\xfd\x30\xcb\x26\xe7\x67\x6e\x02\xd9\x16\x82\xa0\x7d\x0f\x5d\xf1\x12\xe8\xe2\xab\xaf\xd4\x0a\x94\x07\x6c\xa5\x77\xfa\xe3\x67\xcf\xb7\xed\x03\xd8\x95\x48\xf8\x45\xac\x24\x71\x05\x81\x1b\xf1\x19\x39\x00\x6b\x2b\xe6\x31\x1e\x66\x27\xf0\x84\x32\xa3\x0c\x1a\xab\x34\x3b\x4e\x30\x8e\x66\xe1\xe2\xef\xcd\xb6\x84\x68\x49\x3e\xf6\xf8\x13\xa4\xf2\x55\x1a\x39\x76\x83\x97\x20\x10\xe6\x02\xbd\x84\x13\x89\x71\x82\x05\xff\x67\x6b\x22\xfa\xbe\x77\xf5\xce\xf9\xb6\xe4\xeb\xdf\x6b\xf1\x68\x77\xb1\x2e\xa5\x42\x1a\x46\x7b\x26\xa0\x88\xc1\x1c\xcf\x46\x63\x83\xc5\xfe\x05\xbf\xed\x7e\x9c\x64\x4d\xa5\x71\x46\xe0\x10\x3d\x8d\xcd\x04\xd9\x7f\x03\x3d\x1f\x3c\xb7\x5b\xce\xfc\xf1\x15\x77\x85\x0e\xd6\x93\xd0\x3f\x97\x58\xec\x17\x90\x93\xed\x95\x54\xe5\x5a\xa6\x0d\x00\xc0\xbe\xd1\x49\x88\xbf\x28\x24\xf2\xc2\x23\xdc\xc7\x5b\x3c\xa7\x2e\x2e\xd5\xd8\x0a\x78\x44\x6c\x6b\xf3\x77\x37\x45\x71\x85\xa9\x42\xa9\xde\xa8\xfb\xa3\xad\x32\x51\xfc\x56\x21\x97\x24\x78\xea\xb4\x6e\xf2\xad\x02\x2a\x60\xf0\xeb\x77\x13\xc6\xe9\x9f\xf5\xae\x6e\x2b\x34\xc8\x7e\xd0\xb7\x10\x5c\xe9\x6d\x0d\x1c\xd5\x7b\x20\xea\xd2\x94\x09\x9a\xae\x4a\x27\x97\x93\x3f\x67\xc1\xd4\x95\x03\xc2\xf2\x98\x62\xb3\x98\xb7\x58\xee\xa4\xeb\xbb\xc3\x99\xbd\x15\x35\x4f\x36\xec\xab\xfa\xf5\x7d\xb6\x2d\xfe\x4b\x80\xbb\xf6\x2d\xf6\x06\x5a\x42\xa0\x18\x37\x98\x5f\x9d\x63\x4a\xb0\x14\x9d\xd9\x2e\xc3\x27\x43\xa4\xf7\x55\x06\x24\x53\x3a\x23\x07\x50\x17\xc4\x44\xa8\x94\xb1\x38\x48\xc4\x94\x4e\x67\x02\x59\x94\x69\xd5\x68\x3f\xb5\xc5\xa3\xe5\x15\x8d\xc6\x04\xe8\xc8\x5e\x7f\x69\x4b\x65\xdd\xda\xca\xd8\xa0\x96\xb6\xb9\xd8\xc6\x2e\xa5\x08\x73\x02\x27\x66\xaf\x90\x73\xa4\x14\xf3\x29\x75\xaa\xf6\x69\xf5\x75\x6e\x99\xde\x47\xc6\xa7\x59\xb6\xd7\x93\xc4\xd2\xf8\x87\x81\x74\xb7\x0a\xce\xa4\x85\x7a\x07\xe5\x94\x5d\xa5\xa4\xfd\xaf\x20\xeb\xd7\x18\x9d\xfc\x8a\x0b\x72\x5c\x3d\x24\x50\xe6\xc5\xd0\x5b\xd9\x99\xed\x53\xd3\xd8\xa3\x0e\x85\x92\x2a\x5b\xc2\x14\x60\x26\x0c\xf3\x00\xac\xd6\x00\x3a\xe1\x5a\x81\x49\x35\x1c\x4c\xcc\x20\x32\x34\xe7\xcc\x5a\x5f\x78\x8d\x04\xc3\x24\x7d\x28\x8b\xff\x6a\xea\x84\x29\x42\xc9\xf8\xb5\x23\x42\x9b\xcf\x4f\x9f\xf7\x3b\x47\xa3\x46\x42\x9d\xd2\x2a\x95\x8d\xf3\x98\x3c\x13\xdc\xba\x3e\x4e\x12\xf9\xf5\x8a\x20\xb8\xd1\xfb\xe6\x8b\x26\xf8\xe4\x03\xf0\x71\x67\xb1\xd1\x9c\x56\x66\x6f\xe6\x2b\x38\x44\xad\x29\xcd\x2a\x9c\x9a\x7e\xfb\x7d\x69\x0d\xeb\x66\x42\xe3\x9f\xfa\x4d\x02\xf1\x88\xa4\x8e\x60\x2f\x01\xc6\xa2\x04\xee\x66\x38\x46\x61\x3a\xe5\x07\x12\x05\xbb\x94\xd0\x41\xc0\x67\x3d\x51\x8a\xe9\xdb\xa1\xce\x89\xbf\x65\xfa\xe3\x2d\xba\x8e\x91\x24\xaa\x1e\x86\xba\x09\xf7\x3c\x88\xc4\x3b\xd7\xd2\xc3\x37\x50\x67\xad\xec\x71\xda\x3a\xaa\x0c\x62\xd7\x1f\x65\x47\x02\x79\x06\x97\xe3\x59\x23\xac\xf2\xe7\xc6\xda\x32\xdb\x75\x3d\x88\xdc\x2e\xb6\x15\x08\x31\x74\x4e\x7d\xbe\xea\x43\x54\xce\x87\x42\x84\x1c\xf3\x59\xeb\xc9\xe1\x14\xc2\x00\xb8\x11\xa5\xf3\x0d\x3d\x54\xab\x4a\x24\xb6\xe3\x3b\xc8\x14\xea\x9c\x7f\xf5\x21\x19\x13\xc3\xde\xe4\xdf\x8e\x01\x09\xfd\xec\x8c\x1c\xa0\x33\xcf\x9a\xa2\x42\x93\x42\x52\xf2\x22\x8c\x17\x19\x6c\xc2\x70\x9a\xb3\xf0\x94\xca\xde\xc0\x71\x72\x5d\xfc\xcb\x1a\x65\xa4\x28\x56\xa8\xc9\xe9\x3d\xe0\x82\xac\x86\x6a\x19\x34\x45\xa2\xfa\xa1\xa6\xbc\xdc\xb3\x6c\x00\xd3\x89\xe7\x1f\x1b\xcc\x55\x2a\x21\x6d\x80\xb3\x74\x2b\x59\x4d\x46\x88\x68\xbe\x84\xce\xd6\x52\x43\x49\x9b\x07\x38\x19\x04\x14\xcf\x58\x02\xb6\xb0\x35\x3b\x16\x05\x0f\xb1\x9f\x78\xfa\x61\x31\xbb\x79\x8f\x60\xfb\x6f\x6e\x31\xd1\xa1\x0b\x4d\x17\xd7\x66\xb9\x77\x1b\x12\x7d\xe4\xe2\xd5\x56\x8b\x02\x4b\xa9\x0f\x8d\x89\x22\xfb\x6c\x9f\x6e\x25\xec\x6a\x2e\x94\x7e\xcc\x16\xd5\xd6\xe0\xf7\x0b\x51\x73\xe3\xc4\xac\x5f\x94\x12\x82\xba\xab\x3d\x25\xca\xea\xfc\xd3\xb3\xc1\xf6\x32\x14\xbd\x98\xab\x54\x85\x6e\xde\x72\x2a\xbd\x82\x1e\xdf\x8d\x9a\xe9\x95\xff\x59\xd0\xd6\x9d\x4f\x9d\xbf\xb8\x07\x0e\x75\x02\x2b\x37\xe9\xd4\xf1\xd0\xf7\x80\xca\x52\xf3\x11\xb9\x62\xd9\xcb\x72\xf7\xd4\xc3\xe4\xe0\x49\xee\xbd\x00\xfe\x05\x5c\x33\xf5\x27\x14\x84\x5e\x14\x20\x70\x58\x83\xf0\xb4\xa0\x22\x4f\xe6\x1b\x6e\xe6\x9d\x78\x67\x4b\xfc\xe0\xdd\x57\x2f\x54\x40\xc1\x46\xce\xb1\x12\xb6\xc4\xf1\x16\x3c\x21\x9b\x16\xcb\x02\x1d\x67\xe0\xe6\xf9\x69\xb0\xed\x93\xf9\x67\x35\xbb\x49\xa0\x9f\xf6\x79\xf3\xfe\x7e\x9b\xab\x3c\xd2\xcb\x42\x9c\x98\x25\x6e\xc1\x9f\xa1\x88\x87\x4d\x59\x83\x52\xe2\xab\x7f\x32\x19\xd7\xbe\xe4\x65\x6e\x21\x59\xa5\xc6\x3a\x07\xbd\xef\x18\xd0\x16\x45\xfb\x0b\x33\x74\x51\xe9\x3f\x76\xc5\x8b\xd2\x2d\x09\xf5\x90\xdf\x5d\xa4\x3e\x80\xe8\xd7\x69\x25\xa4\x8a\x7e\x51\xdd\x84\x8f\x0c\x05\x79\x3a\xa9\x05\x4d\x49\xa7\xd9\xae\xf8\x6b\x9d\x7e\x39\xc5\x63\x6f\x4f\x59\xad\x6b\x19\x96\xe0\x8d\x03\xd7\xf0\xcd\xad\x17\x7b\x68\xd8\xe8\x50\x8d\x61\xe9\xa0\x10\x35\xf3\x98\x42\xea\x06\xa7\xe9\x89\x35\x3d\xc9\x76\x54\xcf\xbe\x94\xb9\xb5\x7f\xb0\x74\x4d\x80\x68\xca\x50\x09\x22\x28\x6c\x6e\x16\x4e\x8e\x7e\xa3\x39\x96\x5d\x56\xe8\xc9\xa4\x0a\x1a\xb6\x5b\x12\x38\xc7\xeb\x61\x70\xcb\x14\x3f\xdd\x70\x68\xfb\xe6\xd7\x8c\xf0\xb0\xe5\xae\xf8\xca\xd1\x92\x91\x42\xbe\x82\xd4\xd1\xe1\xd7\x67\x7e\xba\xe4\xe0\xf8\x0e\xdb\xad\x95\xb7\x33\xcc\xb9\xba\xdc\x67\xe3\x2c\x84\xf5\x71\x97\xe6\x60\x06\x71\x0d\xb0\x29\x2a\x71\x8b\x38\xb9\x5c\x9f\x37\xed\x1d\xd3\x72\xc9\x7a\xf2\xb3\x11\x82\x10\x05\xc6\x4e\xa9\xb4\x71\x9b\x4c\x8e\xd8\x5b\x3f\xa1\xa2\x07\xee\xdf\x87\x4b\x0b\xca\xcc\xb5\x93\x71\x31\xe7\x5a\x87\x8b\xbd\x03\x21\x68\x91\x51\xa1\xce\xbb\x56\x4f\xb6\xf3\x12\x6a\x96\x3a\x66\x8b\x12\xa5\xdd\x53\xc4\xfb\xc6\xcf\x11\x0b\xcf\x92\x0b\xca\x30\x61\xd8\x80\x8f\x49\xce\xe9\xd3\x57\x51\x41\x45\x46\x46\x22\xbb\xcc\x24\xf0\x10\xf7\x04\x49\x51\x84\xcc\x9c\x04\x7b\xd1\xbe\x62\xc8\xf2\x2c\x3b\x67\xfb\xcb\xe3\x71\x8b\xc3\x85\x66\x1b\x38\x2e\x76\x95\x4a\x8f\x0c\x78\xb6\xf8\x2d\x66\xa3\x58\xdc\x34\x86\x99\xaf\x66\xf0\xbe\x8a\x1c\xf0\x68\xda\x37\x26\xfe\x38\x3f\x29\x04\x55\x49\x3a\xc7\x52\x5c\x00\x13\xad\x56\xe8\x69\x63\x2c\x76\x71\x62\x6b\xb6\xf9\xc1\xc1\xbe\xe5\x56\x2a\x32\x6c\xf7\xe3\xe7\x1d\xe9\x32\x69\xd7\xf0\xdb\xf6\x10\x17\x37\x9a\x2c\x97\x5b\x5f\xeb\xee\xc0\xcb\x7d\xc1\xd0\x4c\xe0\xcc\xfe\x1e\x88\xf4\x1d\x55\x20\x35\xe6\x29\xc5\xbc\x4e\xc9\xcb\x0a\x1e\x7a\x26\x70\xe7\xbb\x20\x9c\x53\x06\x1d\xee\x73\xb0\x6a\x69\x6c\x6b\x6d\xd6\xa0\x44\x4a\xf3\xf3\x12\xf3\x13\xcb\x4b\xa5\xfd\xf4\xc4\x9e\x28\x7a\xe0\xd2\xf0\x66\x20\x85\xd5\x53\x87\x86\x02\xb4\x83\x89\x74\x20\x31\x89\x72\x3a\x5a\x22\x07\x29\xe1\xab\x4f\xac\x7f\x23\xce\x39\x9c\xf5\x48\x24\xd1\xb3\x17\xf3\x35\x31\x30\x62\x4b\x7e\xee\x29\x3a\xe8\xd2\x25\x8c\x76\x64\x2c\x1b\x7d\x12\xf9\xb3\x19\xc5\x6c\x84\x21\x79\xbe\x98\xb7\x6f\xa2\xd6\xb4\xc6\x73\xba\x50\xbb\x46\x3d\xe7\x89\xfb\x53\xf5\x1b\x68\x4b\xe1\xe9\xce\xcd\x8d\xc5\x39\x1c\xe2\x89\x92\x1e\x50\x7d\xda\x3f\xe9\xd8\x93\x72\x70\xc2\x74\x50\x40\xff\x94\x86\x2e\x7a\x43\xf7\x93\x11\x74\x78\x98\x91\xaf\xd3\x72\x26\x5d\xc5\xcf\x71\x03\xc2\x2e\x8c\x5a\xe7\x71\x9f\xf0\xca\xa5\x45\x1b\x16\x2f\xaf\x28\x48\x55\xd2\x99\xac\x3d\x23\x62\x7d\x7d\x84\x64\x9d\x26\x37\xde\x69\x6c\xac\x2e\xc0\x8a\x27\xc5\x48\xf8\xd8\x43\x01\x42\x52\x05\x81\x85\x8c\x95\x5f\xb5\x2d\x08\x8d\x1a\x98\xbb\xf5\xd3\xdd\x5c\x6e\xe7\xed\xeb\x4b\x3d\x3a\x35\xba\x07\x20\x6c\x8d\x5d\xf5\x5f\x9d\xd2\x31\x7b\xb9\x60\x3b\xc1\x93\xb8\x23\x0c\xdc\x7b\x7a\x35\xcc\x69\x31\x72\x2c\x02\x4f\xb1\x30\x53\xb8\x13\xd1\x25\x33\xc3\x1b\x59\x25\xc9\x6e\xde\x9c\x89\xf8\xc4\x74\x92\x3e\xe0\x35\x98\xe0\x2d\x79\xa5\xb1\x3d\x23\x63\xc8\xc1\xb1\x57\x3b\xb1\xc8\x30\x43\x7b\xe6\x3e\x77\x1a\x3a\x08\x73\x05\xad\xb5\x20\x4a\xaa\x11\xbe\xf1\x78\x84\x75\x11\x26\x9d\xe6\xf9\xf6\xbf\xb1\xbc\xcc\x21\x7a\x05\xc7\xfe\x87\xfa\x0e\x46\x49\xbe\x47\xba\x97\xdb\x97\x6d\x6c\x39\xb6\x54\x13\xcd\x8d\x11\xe9\x4d\x36\x94\xe7\x5d\xcb\x4a\x9c\xf9\x8b\x7c\x65\x47\xa3\x38\x8b\xb8\xcb\xdb\xca\x02\x74\x79\xb9\xba\xe3\xe6\x92\x23\x9c\x53\x02\x55\x17\x3d\xe9\xe2\x8b\x64\xe0\x9a\xea\xaf\xa6\xf1\x48\x84\xc8\x52\x6b\x30\x74\x79\x8b\x4e\x2a\x5d\xc3\x89\x67\x05\x71\xe1\xf8\xae\x22\x34\x70\xcd\x04\x9b\xff\x55\x61\x2f\xda\x15\x6c\xf8\xcb\xc7\x83\xf2\xaa\xbf\xc7\xaa\x32\x1e\x98\x5b\xfc\xb2\x10\x21\x13\x9e\x56\x93\xb4\x1f\x96\xa2\xda\x9b\xb5\x17\xfb\xb3\x1e\xf5\x73\x41\xa0\x35\x46\xae\x51\x81\x69\x77\xad\xdd\x39\xd6\x3b\x62\xb1\x37\x15\x44\xef\xdc\x19\xb2\x79\x3e\x3c\x87\xe5\xae\x13\x48\xb7\x1f\x5b\x0a\x55\x1e\xc4\xb2\xa9\x9a\x89\x70\xec\xc4\x93\x98\x06\x5b\xd0\x62\x19\x81\xd4\x86\x25\x6d\x6d\xfe\x5a\xd1\x27\xec\xf4\x7e\x63\xfc\x54\x35\xdd\xcb\x4c\xb8\x5c\x62\x11\x36\x8a\x38\x64\x14\x44\xb1\xee\x5f\x3d\x57\x77\xfa\xc8\xf1\x65\x74\x44\x73\x98\xfa\x66\x31\xdf\xdf\xac\x33\x7d\x45\x26\xcf\x21\xf8\x59\xeb\x2e\xba\x33\xdc\xfd\x1e\x20\x2e\x9e\x69\x38\x21\x2e\xbe\x68\x4e\xf6\xa9\x2a\xfe\x94\xf3\xcb\x64\xdb\x13\x0e\x11\x59\xd0\x1d\xe8\x22\x44\x51\xe8\x94\xea\x3e\xe1\x89\xfe\xf1\x58\x97\x99\x34\x17\x74\x5b\x39\x1b\xc8\xe4\x6f\x9c\xa5\xd1\xf6\x9b\xaa\xd6\x82\x4e\x1e\x2b\xca\x05\xa2\xd6\x2a\x84\xcc\x15\x47\x51\x04\xb2\xa1\xfc\x17\x6b\x47\xdb\xbe\xbd\x63\x59\x4d\xc2\x48\x44\x28\x97\x16\x09\xa6\x37\x37\xed\x8e\x63\x91\xb9\x46\x1c\x8e\xf4\xc2\x21\x4d\x48\xcf\x64\xcc\xc7\x58\xa4\x49\x72\xae\x41\x14\x0d\x7a\x9e\xce\x58\x6b\x19\x32\x56\xcd\x2f\x05\x1d\xe7\x6c\x29\x5b\x37\x95\x2c\xb3\xfa\xd3\x9d\x39\xfb\x3f\x0e\xc9\x56\x66\x76\x36\x3c\xc8\x34\x9e\xe8\xec\xe3\xee\x67\x73\xa8\xa9\x9e\x0e\xe1\xc4\x8c\x43\xbf\xa9\xc8\x51\xe8\x6b\xea\x8d\x5a\xa5\x7a\x03\xe3\x0b\x9e\xcb\x97\xac\x9c\xb6\xef\x93\x82\x3c\xa8\xfb\x5a\x73\x44\xb5\xc9\x16\xc5\xf7\x2d\x44\xe3\x9b\xd1\xe5\x56\xe7\x37\x0f\x38\x76\xd5\xb1\x85\x41\xdd\x0c\x8f\x65\x47\x77\x4b\x02\x75\x12\x79\xba\xc8\xa4\x38\xe4\x8d\x01\xa1\x0b\x1e\x02\x40\x79\x0e\x4e\x25\x4a\xb1\x30\x3c\xd4\xab\xce\x49\xd7\x7d\xf7\x0e\xe6\x3e\x4e\x7a\x38\x47\x01\xaa\x2f\xbb\xb5\xeb\x6a\x69\x26\xdf\x33\xa1\x6b\x6b\x0d\xf5\x9a\x13\x84\x1d\xdf\x0a\x27\x1e\x1a\x25\xc6\x48\xb1\x41\x33\x74\x67\x6a\x3c\x7e\xff\xc1\x95\xa5\x1c\xfb\x38\x90\x45\xc7\x76\xcd\xcc\x34\xdc\x6d\x77\xf5\x87\x5c\xf5\xf3\x5c\x03\xda\xf1\xa1\x9c\xde\x16\x00\x3a\x8c\xe9\xf4\x2b\x59\x32\x5e\xf9\x90\x89\xe5\x69\x0e\x65\xcd\xbf\x84\x43\xe8\xd1\xc6\x28\x02\xf5\xb9\xea\xcd\x19\xde\x8d\x94\x35\x6d\xb3\xe0\x3e\x17\xa5\x4b\xcc\x64\x13\x14\x45\xc8\x2b\x42\xf1\xc5\xc9\x6e\x12\x09\x92\x5c\xba\xaf\xc4\xed\x18\x61\xf5\x5a\x70\x9e\xd7\x6e\xd5\x2b\xa1\x17\x0c\xdc\x4b\xfe\x04\x95\x52\xf5\x9b\x7e\xdc\xc3\x5a\x55\xa8\xb8\xd0\xf5\x35\x98\x58\xcc\x28\x8a\xb1\xa4\x4d\x3e\xde\xd5\x6b\xa2\x81\x65\x57\xa8\xda\x48\x61\x50\x91\x97\xe3\xd4\x78\xcc\x30\xef\x23\x52\x02\x19\x03\xa0\x4c\x49\x0e\xd6\x1e\xa3\x9e\xe6\x94\x61\xf2\x88\xb9\x48\x19\x08\x5a\x6e\xf8\x92\x09\x8c\x3c\x6a\x71\x54\xfb\xfd\x36\xe2\xa5\xb3\x8f\x44\x96\xfe\xcb\x23\x70\x04\xb8\x2b\xe0\xb0\xa2\x05\x35\x52\x7b\x7a\xe4\xab\xb0\xd4\xaf\xc0\xc6\xc2\x4f\x91\x34\xd2\x73\x79\x43\xbb\x75\xf9\xe4\xe5\x71\xd7\xdb\x0a\x4a\x7d\xf2\xf7\xa0\xd1\x1e\xe4\x25\x1c\x52\x72\x47\x6c\x47\xe0\xbd\x31\xfe\x4a\x97\xc7\x62\xac\x99\x15\xb1\x6b\x92\x6a\x22\x77\xca\x3b\x66\xef\x8c\x17\xfd\xde\xc8\x67\x96\xca\x84\x6f\x58\x7d\xdf\xa4\xfd\xdf\xd7\x55\x7c\x98\x06\xc7\xe5\xe7\x2e\x8d\x1f\x98\x44\x48\xf8\xa8\x99\xa7\x0d\x09\xcc\x53\x5e\x4b\xaa\xfa\xee\xb8\x74\x53\x1d\x75\x2d\x6d\xd0\x0d\xd1\x7c\xe1\xf9\x4c\x54\xc8\x51\x23\x5d\x0d\x78\xde\x58\xcd\xae\xd9\xd6\xaa\x95\x3e\x9c\xa6\x4d\xdf\x79\xde\x73\x38\xc5\x4a\xaf\x8b\x77\x9a\x68\x48\x8b\x08\x3d\x9e\xc9\xfe\xc4\xfc\x67\xc5\x1a\x41\xb9\xde\x32\x96\x2c\xc3\xc4\x08\x9d\x1d\xbd\xe8\xf4\xfa\xd5\x8f\x9d\xb2\x86\xca\x70\xf2\x8d\xd8\x15\xb9\x95\x36\xd8\x3f\x92\xe2\x80\x36\xec\x27\x4a\xa6\x27\x24\xda\x12\x42\x7d\x68\xe8\xe8\x31\x27\xdd\xb8\xbd\xb7\x9a\xc3\x33\x21\xd4\x2b\x76\xe3\x58\x5a\xcb\xc6\xef\x18\x8c\x23\xf9\xad\xe9\x43\x57\x18\x73\x2f\x8c\xd6\x0f\x33\x0c\x28\x9a\xa8\x68\xb1\x3b\xd3\x4a\x53\x2c\xbc\x5a\x52\xcd\x80\x04\x17\xbe\x6f\x41\x5c\xc0\x66\xb5\xb3\xbf\x26\x32\x88\x7c\x69\xf5\x35\xad\x26\x1d\x5b\xb1\xb9\x34\x57\x99\xc8\x08\xcd\xe1\x42\x67\xe8\x60\xae\x78\x6a\xbf\xf9\x94\x6a\xc3\x59\x71\xe7\x47\x60\xe4\xc8\xfb\x69\x09\xf0\xd3\x7d\xa1\xae\x0b\x22\x54\xb8\x9f\x41\x82\xa3\x93\x8b\xa7\xaf\x17\xc7\x28\x70\x68\x12\x84\x7a\xaa\x9d\xce\x14\xf5\x80\xbc\x43\x71\x02\xd3\xc7\x4e\x89\x79\xc3\xe3\x24\x06\xe8\xac\xf2\x97\x45\xe9\x04\x07\x6d\x7f\x5f\x1f\xf6\xfc\xc1\x6c\xcb\x22\xdd\x7b\x84\x3b\xdc\xa9\x7f\xda\x19\x51\x88\x82\x98\xaa\x1c\xab\x2a\xef\xa3\x92\x74\x20\x9b\xe6\x92\x01\xf6\x53\x47\xc7\xbc\x97\x13\x8e\x68\xf9\xe4\x6f\x34\x04\x8c\x7c\x77\x72\x01\xa2\xa7\xbf\xfb\x0f\x8b\x6d\x4e\x71\xe4\x20\xc1\xd9\x1a\x60\xc3\xe2\x7d\x17\x3d\x43\x05\x7a\xcd\x30\x6d\xea\x65\x6c\x5b\x00\xe8\xd9\x82\x3d\x13\x29\x86\x63\xb4\xac\xd3\x41\x7f\x2e\xf6\x2d\xe4\x1a\xd9\x71\x74\xb9\x78\xbd\xa2\x26\xea\xda\xbd\x15\x5f\x68\x8e\xf1\x57\x70\xde\xcc\x21\x0b\x78\xe1\x62\x04\xff\xc5\x6a\xda\x71\xe4\x0b\x32\x95\xd6\x1f\x2e\x87\x1e\x9a\xb4\xb4\x26\x90\x3f\x19\x88\xeb\x72\xf8\x4c\x54\x49\x3d\x29\xb3\xb1\x7b\x06\x27\x5c\x99\xdb\x82\xd0\x1f\x4c\xf0\x14\x78\xad\xe6\x49\x8e\xfe\x62\x31\xfa\x33\x2d\xee\xb1\x7f\x62\xb2\xbf\x01\xc1\x5a\x82\x5a\x2b\xe8\xe5\x47\x65\xb8\xb7\xe6\xc0\x46\x39\xe6\xbf\x4e\x11\xa0\xc5\x86\xe5\xe7\x74\x20\xf5\xf9\x6c\x3f\x93\x36\x72\x26\x0e\x47\x85\x16\x14\x68\xe5\xf3\xb5\x5d\xc0\xb2\xfb\x32\xf8\x15\x14\x66\x84\x6f\xca\xaa\xd4\xc9\xa0\xa5\xaf\x4f\xbb\xb2\x17\x33\xe3\xb6\x04\x99\x3c\x7d\x33\xa4\x60\xbe\xd3\x38\xe3\x62\x70\xf6\x8f\x00\x77\x34\x0a\x3c\x70\x4c\xae\xf0\x61\xc5\xb0\xfe\xe0\x41\xeb\x72\xd3\x55\xa1\x1f\xf9\xfe\xb0\xf2\x96\xfb\x56\x5e\xf4\x75\xb5\x98\xd1\x54\xb1\x0d\xcd\x80\xeb\x63\xae\xf3\xa7\x6e\x8a\x12\x3f\xda\xa7\x88\xfd\xc5\x67\xfc\xa5\x48\x8f\x8f\xdf\x7e\x11\xe5\xaf\x63\x8f\xbe\x55\x05\xdc\x13\x91\x10\x26\x3b\x7e\xe9\x2b\xef\x70\x64\x63\xbc\x2e\xf4\x81\x93\x8a\xc8\x15\x2b\xc0\x64\x37\xd5\x8a\x7a\x3a\x68\xa8\xf1\x79\x7c\xf3\xb7\x37\xe0\xdf\xc7\xda\x2e\x9d\x6a\x2d\x74\xa4\x42\xc6\xd9\xa3\xa9\x6c\xa1\xe5\x26\x03\x87\x30\xc5\x22\x19\x16\x32\x27\x1e\x44\x09\x8a\x57\x8a\x92\x6c\x24\x15\x85\x04\x71\x1d\xfb\x8b\xa3\x08\x5e\xa0\xe8\x65\x96\x56\x4b\x33\x7d\x07\x86\x89\xa5\xf1\xf7\x1f\xd5\x36\xe5\x28\xa6\x50\x3a\x5c\x8e\xd4\x90\x6b\xa3\x15\xf2\xbf\x0b\x18\xed\x9b\xab\x0a\x5f\x58\x16\x4d\x8b\x02\x4c\xd7\xee\x31\xc0\x05\x56\xee\xf3\xbd\xbe\x22\x44\x5e\x42\xfd\x16\x02\x04\xad\x59\x5b\x31\xc9\xd5\x3f\xa2\x4e\x53\xc9\xbe\x4d\x10\x19\x52\xb0\xb8\x13\x3a\xf6\x7d\xd4\x69\x5d\xad\x5f\x74\x55\xcf\x16\xd3\x5f\x91\x3d\x8d\xd3\xf8\x37\xbb\xa1\x97\x1e\x40\x50\x25\x12\xdb\x8c\x3a\x3b\x69\x22\x7e\x4e\x8e\x24\x47\xef\x7f\x47\x4d\xbc\xf7\x97\x3a\x7d\xb3\x7f\xc2\xdb\x58\xfe\x0e\xf1\xb3\x55\xc2\x25\xb4\x06\xc7\xcd\xbe\x64\xc1\xff\x41\xc9\x61\xe6\x71\x6e\xb9\x6f\x84\x42\xe3\xef\x28\xbd\xe3\xa9\x72\x4a\xeb\x81\x66\x32\xdb\x35\xa6\x16\x7b\x7b\x9f\xe2\x24\x5e\xca\x87\x60\xd6\xb3\x63\x19\xea\x5c\x2e\xd4\xd7\xa6\x58\x6e\x3d\x43\x56\x15\xcf\x66\x9e\x31\x59\x52\x42\x4f\x56\x89\x3f\xdc\xe3\xe6\xf3\xfe\x72\x95\x76\x4f\x25\xbf\x6e\xbf\xaa\x0f\x8f\x9d\xc8\xb0\x6b\xbb\x07\xda\x47\x46\xa7\x5e\x5f\x55\x3b\x13\xfb\xf3\xdf\x03\x61\x09\xee\xd5\x76\x49\x13\x76\xb3\x8a\x4a\x4d\x6e\xbe\x81\x61\xba\xaa\x4f\xfb\xec\x71\xe1\x41\x75\xa3\xcc\xef\x5d\x7a\xc4\xb3\x9f\xce\xc2\xc4\xa4\xf1\xf6\x22\x55\xa3\x6b\x1e\x89\xe6\x6a\x83\x12\x8e\x36\x40\x73\x92\x87\xb1\xe8\x68\xbf\x32\x68\xec\xc0\x55\x20\xfd\x2c\xf2\x9c\x39\x3c\xd4\x48\xd4\xb8\xd7\x90\xde\x7a\x0e\xa3\xad\x9b\xc2\x3e\x19\xfa\xb4\x8f\x3d\x56\x40\xb5\xe1\x25\xb0\xf3\x29\x8f\x5e\x47\xbd\x1f\x02\x69\x6c\x8c\x6b\x1b\xdc\x1a\xbd\xfa\x7d\x75\xce\x7e\x2e\x22\x9d\x61\x07\x9c\x78\xb4\xbb\x3b\x96\xf6\x93\x03\x34\x1a\x18\x60\x4a\x37\x18\x9f\xdc\xdf\x9a\xf6\xff\x00\x0d\xf7\xe5\x7f\xad\x17\xfe\x9f\x23\x29\x9b\x70\x1a\x63\x46\xee\xe1\x9e\x0d\xe6\xc8\x1d\xe7\xb0\x67\xd9\xc1\x95\x30\x49\x1f\x93\xbb\x65\x84\x83\xeb\xaf\xc5\x22\x1b\xe1\x82\x29\x95\x10\x50\x62\x32\xf0\x87\x7b\xec\x8e\x83\x26\x68\x93\x75\x96\x3d\x9e\xb2\xf0\xfc\xd4\x45\x74\x52\x61\xc7\xa4\xb1\xf8\x1e\x18\x8e\xb3\xbc\xc1\x07\xba\xe5\x80\x1f\xff\x7e\xf3\x73\xf5\xb8\xcf\x94\xa7\xc7\x9f\xc3\x89\xda\x5c\xf8\x6a\xf9\xee\x81\x43\x5d\xab\xcd\x06\xbd\x0b\xc3\xb7\x46\x66\xf2\x85\x89\xc5\xee\xf7\x00\xc5\x56\x1c\x5a\x5e\xbf\xa8\x29\xc2\x82\x8e\xa8\xcb\xf9\x34\x4f\xf3\x44\xf7\x16\x1c\xf8\xb4\x83\xcf\xea\xd1\x8e\xc5\x0e\xcc\xeb\x62\x0b\x26\x56\xf1\xb7\xf4\x4a\x04\x11\xcd\x48\xa9\x4e\xbe\x47\x84\x9b\xa0\x90\x06\xa1\x63\xc3\x1b\xf6\xdf\x8d\xd3\x1d\xf7\x1d\x8e\xe4\xf5\xa0\x6b\x65\x6d\x95\x4f\x61\xfe\x02\x07\xf7\x63\x10\x8b\x52\x5e\x8d\xd2\xd4\xf8\xe9\x9c\x9a\x44\x57\x8d\xb2\x65\xe8\xd8\x98\xa8\x77\xf5\x00\x86\x28\x38\x24\xde\xbc\xfe\x57\x41\x1a\xf1\x8f\x91\x3f\xdf\xe8\x12\xec\xe7\xee\xe8\x6f\xc5\xbb\xbf\x5e\xda\x34\xaa\xec\x99\xd0\x99\xfd\x02\x4a\x04\x12\xa0\x17\x08\xe7\x7a\xb4\xe7\xe6\xa1\x52\x73\x75\x9c\x73\xf3\x4f\x1c\x9a\x15\x63\xc9\xce\x2a\xe1\x3a\xdc\xcd\x78\x4d\xb0\x4c\x21\x06\x8c\x6a\x8d\x14\x8b\x9b\x36\x0e\x78\xc6\x25\xf9\xe2\x55\x4c\x9f\x0f\x93\x38\x95\x30\x07\xe3\xc7\x4a\xa1\xe8\xad\x89\x17\x0c\x02\xfd\x19\xcd\x02\x63\x75\x05\x03\x3e\x52\x5d\xd9\x1a\xe0\xc4\x5b\x66\x3c\xd7\xad\x78\x1d\x9b\x15\xd2\xa2\x38\x16\x42\x7e\x7d\xa5\xcb\x5b\xee\xb5\xe7\xd8\xaf\x53\x61\x62\x99\xa8\xee\x30\x2a\x32\x39\xc2\xeb\x94\x7a\xff\x5d\xae\xea\x51\xe0\x4c\x74\x4a\xc8\x62\x0b\x92\x70\x42\xbb\x0d\xf5\x96\x79\xf3\x64\xfe\x57\x82\xbc\x66\xb6\x17\xb3\xaf\xc5\xbe\x0c\x83\x7a\xf4\x1d\xab\x2d\x2d\x05\x31\xe5\xc4\x97\x42\xee\xcf\xbc\x9f\x86\x5c\xdb\x4b\x77\x32\x4f\xe3\xe5\x91\x83\x9a\x87\xf1\x5b\xc6\xdc\xfd\xd7\x54\xc9\x93\xbe\x55\xef\x5f\x2c\x5d\xde\x03\x97\xf8\x97\x27\x60\xff\x67\x73\x3c\x0e\xcc\x2d\xf3\x8e\x0b\x3f\x2e\xee\x50\x99\x6a\x2f\x72\x3b\x20\x03\x8b\x05\x0a\xa5\x2b\xc3\x24\xf1\x16\x1a\x85\x70\x0c\x98\x84\xb7\x2c\x2a\xa1\x90\x82\xeb\xe9\x66\xcb\x03\x43\xb7\x19\x89\x77\x62\x41\x5c\x4b\xa9\x5b\xac\x2a\x8e\x6c\xae\x3e\x24\x93\x60\x05\x7f\xe4\x61\xcc\xcf\x4b\x08\x91\x6d\x66\xa2\xc0\xd2\xc0\x36\xe6\x57\xdf\x3f\x76\xf1\xa5\x21\x1e\xf6\x3e\x8c\xea\x47\xbf\x9d\x85\x86\x68\xd2\x25\x2c\x35\xc0\x61\xe8\xf1\x01\xee\x0a\x39\x1e\x88\x0f\x6f\xbe\x3b\x17\x8c\x55\x36\xaa\x60\xb7\x0c\x99\x57\xed\xf7\xbc\x5f\xe5\x7d\xfd\x69\x7c\x9c\x56\x72\x87\x3c\xbf\xc0\x6c\x05\x3a\x75\xd3\x29\xb6\xda\x20\x2d\x06\xab\x29\x47\x9e\x35\x45\x68\xc7\x3e\x74\x46\xe2\x65\x25\x1a\x6c\xec\xc8\xad\x2b\x63\xc6\x4f\x56\x9d\x77\x19\xa3\x86\x49\x0c\x67\x14\xb3\xd4\x00\x77\x25\xa4\xe9\xdc\x0d\x3d\x79\xf1\x15\xfe\x49\xf6\xcd\xb7\xb8\x18\x43\xba\xc6\x8e\x46\xa5\x8c\xc2\xb8\xe0\x7d\x1d\x77\x19\x46\xf6\x2d\xe7\xe0\x69\x53\x53\x55\x6f\x6b\x51\x22\xee\xf4\xc7\x49\xc1\xee\xb9\xd9\x8c\x97\x7d\x87\xb9\x38\x9f\x4f\x4b\x22\xe9\x9f\xf3\x0d\x2d\x4f\x7c\x2f\x26\x95\xe8\xf9\x12\x7d\xf0\xa0\xbb\x94\xb1\xf1\xa2\xa6\xb9\x62\xd9\x66\x59\x6e\xe2\xcf\x76\xf0\xc3\x70\x25\xb6\x24\x81\xe3\x09\x68\x50\x18\xf6\x62\x62\x87\xe7\xa3\x56\x1f\x32\x3a\xa8\x5e\x58\x7c\xc4\x71\x8c\x40\x03\xb1\xd8\xc6\xae\xe8\xdd\x07\xd0\x21\x23\x68\x76\x73\x4e\xe2\x89\x15\x21\xdf\x07\x53\x1e\x7a\xc6\x8e\x33\xfb\x8a\xb2\x8d\xe8\x77\xe1\x9a\x32\x20\x79\x80\x92\xfd\xdf\xd9\x23\x25\xf6\x36\x81\xbb\x35\x0f\x4f\x45\xef\x74\x0d\xee\x94\x5d\x6e\xe8\x2c\x4c\x42\x61\x93\x2d\xf2\x35\x4a\xaa\xb1\x48\xac\xe3\x75\x8a\x13\xa9\x14\x7f\x77\x06\xe5\x71\x67\xe5\x80\x84\xe2\xfa\x69\x8c\xbf\x75\x63\x47\x82\x2e\xd5\x0d\x0c\x47\x9b\x03\xa6\xa6\x40\xef\x31\x72\x8d\x70\x08\x1f\x48\xe6\x26\xde\x82\x49\xfc\xde\xba\x84\x67\xf5\x11\xb9\x50\xbe\x94\x65\x76\x1c\xae\x95\x60\xda\x35\x92\xcc\x0b\xf3\xc8\xca\x21\x9b\xbd\x07\x74\x16\x6b\x5e\x93\x26\xb3\x0e\xb3\xf7\x70\xe7\x6e\xdc\x03\xbc\xdc\xdf\xfc\x0d\xcd\x3c\x9f\x12\x99\x2e\xe7\xf7\x77\x3c\x69\x3e\x8c\x8b\xf9\xf5\xbb\x9f\x64\x9f\xb6\xba\x71\xf8\xea\x22\x6e\xd4\x31\x5d\x6b\x2e\x09\xc7\x37\x04\x74\x98\x7c\xf3\x5b\x03\x67\x21\xb5\x6a\x5f\x8c\x63\x20\xdf\x3e\x3f\x2c\x65\xf6\x12\x83\xdf\x10\x86\xf1\x8c\x41\x7d\x47\xdf\x94\xf2\xc2\xaa\x11\x85\x69\x4f\x6e\x28\x78\x35\x0b\xc7\xb4\x61\x63\x75\xcf\x3e\xbf\x28\x67\xe9\x68\xf8\x7a\xab\x50\xca\x84\xbb\x57\xdf\xa0\x53\xe3\xbf\x04\xe0\x57\x09\xcc\xff\x11\x3b\x37\x86\x0c\xb6\xb2\x87\xf6\xc7\xd3\xbd\xd3\x9f\x8f\xb3\x38\x87\x13\x2b\x6c\xf2\xa6\xf2\x96\x57\xd0\x25\x75\xb7\xe9\x8e\xa7\xc0\x43\x8f\x4d\x15\xf5\x97\x8b\xab\x82\xb8\x90\x52\x7f\xb8\xc7\xa4\xf0\x56\x5e\x08\x52\xa6\x29\xf0\xa8\xc9\x8b\xb9\x9b\xf4\x4c\xbe\xf8\xed\x3b\x8d\x1d\xfc\x9a\x57\xca\xf9\x9d\x36\x5b\xa7\x62\x06\x6f\x0f\xc8\x68\x38\xda\xdf\xda\xbe\xd8\xe6\xc1\xa2\x0a\xb3\x3e\x6b\x7c\x93\x87\xa8\x73\x31\xe0\x93\x18\x77\x82\x90\x70\x47\x11\x35\xc4\x52\x92\x7d\x5b\xda\xa4\x4f\x71\xa9\xfe\x8e\x94\xb8\x63\xe9\x34\xec\x5b\x7b\xd0\x34\xf3\xa4\x8e\xd0\x4c\xc0\x6d\x9b\xf0\x7d\xc7\xfa\xc6\xd5\x27\x57\xd6\x35\x7b\xb1\x60\xab\x94\xb3\x17\x63\xa5\x22\x43\xea\x42\xc7\xa7\xe1\xb8\x7c\x31\x40\x86\x33\xbd\xd6\x34\xa7\x20\x28\x63\x8b\xc8\x6b\xae\x7f\xf9\xd5\x4d\x3c\xd2\x5c\x24\xc2\x35\x57\xef\x0a\x73\xad\x43\xa5\xaf\xed\x7d\x21\x8a\x63\xe0\x64\x8b\xc1\xb2\x7d\xbf\x6c\x5b\xd6\x69\xf7\xf1\x22\x0c\xc7\x97\x98\xdb\x7d\xf8\x3a\xe8\x34\x13\x3d\xbb\xd2\xa7\xe3\xa4\xda\x59\x88\xf7\x94\x21\x20\xa8\x1d\x1d\x64\x70\xd1\x4d\xbc\xa7\xd3\xc6\x98\x9b\xde\x54\x17\x16\xaf\x80\xb9\x06\x7b\xba\xa4\xf7\xd2\x9a\x5a\x31\x59\x5b\xa6\x07\x30\xc3\x6f\x96\x7b\x68\x06\x66\xd3\xc0\x98\x59\xcb\x64\x7b\x33\x1d\x8a\x9e\x2b\xfb\x6b\x23\xfd\xa9\xf1\x8c\xa3\xd0\x04\x97\x1f\x5d\x4b\xda\x56\x1a\x7e\x92\x1c\x94\xad\xb2\xd2\x9f\x13\x45\x56\xc5\x5e\x23\x38\xec\x02\x24\xe5\x25\x59\xff\xd2\x9d\xb9\x1c\xf6\x7f\x71\x3a\xef\x7b\x15\xfa\x74\xb4\x4d\x71\x91\xd9\xa2\x0c\x4e\xb4\x0a\xd1\x0d\xd5\x9b\x33\x6f\x0d\xef\x07\x1b\x65\x33\x46\x34\x72\xf7\x75\x91\xa3\x53\x1c\x9f\x9a\xe4\xf5\x7b\x1f\xf5\xaa\x19\x60\xfc\x71\xcd\x8d\xe8\x9c\xa7\x8f\x9b\xfe\x6b\x19\x54\xd5\x52\x97\xda\x0c\xf7\x27\x91\x58\x0c\x20\x93\x2f\x0f\x60\x94\xdb\x2d\x17\x97\x24\x96\x8e\xfb\xf9\xf1\x0f\x12\xda\xe9\x7f\x4a\xe0\xba\x74\x35\x11\x38\xb5\x9a\x8a\xfd\x79\x6c\x9e\x8e\x82\xd7\x85\x3e\x69\xc4\x51\xe1\x43\xe6\xba\x5e\x1c\xca\x30\x8a\x23\x57\xbd\x35\x50\xaf\xee\x81\x95\xba\x5f\x33\x7a\x7a\xad\xbf\xf9\x3f\xca\xca\x08\xc0\x06\x76\x53\x5c\xd7\x8b\x7d\x15\xfa\x99\x18\x57\xec\x97\xdd\x0c\xbe\x8c\x64\xd4\xdd\xd6\x84\xc6\xfd\x8e\x39\x16\x3c\x21\xb4\x5d\x7e\x9f\x22\x88\x7e\x32\x37\x4a\xd0\x50\x6e\xd2\xd5\x8a\x80\xa0\xba\xc3\x76\xd0\xde\x5b\xdc\xaa\xce\x72\xb6\xac\xf5\xde\x6c\x43\xb0\x9c\x52\x51\xe6\xbc\x97\x32\x4c\x72\x18\xb8\x23\xc5\x35\xde\x7d\x8c\x6c\x4d\xa8\x47\xb1\xd8\x47\x44\xfd\x4f\x99\x91\x5c\x7e\xa1\xc6\xb8\xff\x3e\x35\x2d\x3a\x51\xf9\x4f\xfc\xde\x7f\x11\xd4\x7f\xdd\x4d\xf2\xb1\x2d\xe4\x65\x0c\x70\x96\x17\x43\xca\x74\xfc\x84\x56\x46\x39\xb1\xc1\xbd\xd1\x2d\xc0\x7e\xb6\x61\x1d\x7d\x1e\x4b\x74\xcb\xda\xe8\xb3\x38\x68\xb3\x2c\xae\xc2\x1d\x9e\x6a\x3f\x28\xb5\xa1\x02\xba\x07\x16\x6b\xfa\xfb\xde\xa8\xf0\xa6\x92\xa4\xcb\x3e\xc4\x8c\x60\xfc\x00\x9a\xf9\x87\x94\x1a\x94\xb8\x15\x20\xe4\x69\x0a\x31\x31\x10\x7c\xff\x62\x26\xa7\xa2\x65\x54\xb2\x2e\x97\x7b\xb2\x8b\xd2\x8e\x7f\x59\xc5\xa7\xd0\x28\xfa\x65\xef\x23\x85\x8f\xc1\xae\xb9\xdf\x03\x29\x0f\xc3\x2c\xcd\x3b\x4c\xb7\x84\xf3\x38\xc2\x24\x64\x1d\xb7\x0c\x49\xd9\x5c\xc6\xb6\xd5\x77\xce\xd3\xaf\x6f\x90\xfb\x32\x8c\xd3\xa5\x2e\x13\x4f\xdc\x4d\x28\x51\x72\x79\x51\x82\x7b\xbb\xcd\x81\x15\x78\x6f\xe6\x75\x55\x32\xff\x9d\x4f\xe5\x1e\x09\xe4\xb7\x4f\x94\xd0\xe9\xa2\xfb\x6c\x4b\x6b\x9f\xfe\x65\xfc\x81\x46\x67\xcb\xb0\x54\xcb\x15\x42\x1e\x85\xd3\x6d\x0d\xdf\x4f\x35\x5e\x55\x2e\xab\x2b\x67\xe5\xa0\x91\x4a\x3b\xff\x11\xc9\x5b\x88\xc2\x1c\x0e\x5a\xfe\x2c\x58\x4d\xa1\x15\x67\xb1\xd3\xb7\x1b\x7c\x01\x87\xa8\xce\xf0\x3c\x3a\x6d\x0e\xf9\xd1\x42\xca\xd7\x12\x43\xa6\x46\xce\x5e\x8b\x0b\xc6\x68\xc9\x8b\xa0\xf3\x0c\xa2\x31\xb5\x7b\xc0\x3f\xce\x3a\x9c\x3e\x50\x1a\x3f\x70\x0e\xf3\xd5\x6d\xa6\xc3\xca\x53\x49\x59\x5a\xe4\xda\x6f\x08\x9d\xed\x78\x60\x34\x27\x64\x1a\x29\xc5\x1a\x6a\x18\xcc\xf6\x51\x29\x15\x4a\xd3\xab\xa3\xa5\x20\xfb\xed\xb7\x9f\x06\x78\x46\x23\xb8\xd6\x0c\x15\x93\xd9\xca\x44\x88\x46\xca\x2d\x56\x59\xa4\x4c\xde\x3d\x70\x83\x37\xf8\x45\xec\x5c\xb1\x34\x3f\x5a\x38\x7a\x32\xdd\xb1\xa8\x59\x00\x4a\xd1\x87\x0d\x02\xb6\x9a\x26\xf6\x7e\xa8\xfa\xbe\xa6\x8c\x1f\xf3\xea\x3c\x30\xcf\x4f\xe4\x9c\x92\xa2\x95\x77\x0c\xe8\x4f\x85\x87\xbf\xbf\xf2\x9a\x2b\x51\xe4\x65\x78\x6b\x1e\x4e\x00\xde\x0a\xd4\x08\x5c\xf4\xf6\x28\x71\x7d\x91\x62\x5d\xab\xff\x33\x6b\x7a\xae\x1a\x85\xc0\x75\x53\xbb\x0b\x06\xfb\x2d\xf9\xf0\x62\x03\x89\xd8\xb2\x65\x15\xae\x6c\x0a\xf2\x04\xa9\x96\xa9\x1d\x13\xd2\x2d\x26\x2a\x05\x24\x13\x83\xa1\x89\xc9\x33\x31\xc7\x5a\x8c\xe7\x72\xdc\xc9\x27\xc9\x07\x36\x98\x7b\x53\x78\x82\x87\x9b\xbf\x35\xdd\x9f\xa5\x8d\x61\x76\x53\x8f\x54\x8a\xad\x47\x0b\x4e\x60\xcc\x4d\xcd\xf3\x22\x83\x21\x98\xae\x3b\x9d\xb0\x13\x13\x9e\x7b\x80\xf2\xd2\xaf\x35\xb0\x1f\xae\x37\x4c\x61\x53\x68\x3f\xb6\xe4\x7d\x7c\x96\xf0\xa1\x0e\xfa\x7c\xa0\x8b\xa7\xbd\xb1\xed\x6b\x0d\xe1\x27\x51\xab\xf7\xec\xc0\x01\x74\x12\xd4\x3b\x04\x0c\x02\x36\xc6\x76\xbe\x89\x83\xf1\x56\x47\x55\xc5\xb9\x8b\x32\xc1\xb5\x5f\x2a\x20\xb9\x50\x51\xd1\x9b\xdf\x17\x08\xbd\x69\x41\x02\x63\xe2\x51\xb3\xe6\x78\xd9\x03\x45\x0d\x7e\xbf\x6c\x7c\x63\x02\xd9\xfa\x19\x47\x2a\x3a\x3d\x32\x21\xfa\x4d\x79\x6e\xf3\x7f\x32\x59\x72\x22\x07\xf8\x38\x0f\xa9\x80\x8d\x85\xe7\xde\xaa\xe6\xed\x9d\x85\xac\xd4\x67\x27\x7c\xec\xb9\x59\xf4\xde\xac\xdc\x99\xf7\xe0\x56\x09\xf7\x74\x44\x85\x28\xe7\x0a\x24\xd8\xe6\x72\xcf\xdd\x03\x0d\x1d\xa2\x3e\xb8\xf8\x46\x8f\x76\x56\xa9\x03\x15\x24\x21\x94\x43\xb7\x2c\x5f\x33\x8d\x69\x91\xaa\x1f\x41\x4f\xb2\xbf\x84\x61\xae\xdc\x68\x80\x0b\x27\x83\x91\x66\x7e\x31\xbf\x0c\x07\xc4\x1e\xe5\x15\xdf\xbe\x6a\xad\xff\x38\xfe\xa4\xe3\xdc\xc9\x26\x6d\x8c\x53\xf4\xa7\xba\xc9\xe5\xa5\x11\xec\x83\xb8\xef\xe2\x94\x29\xa5\xe0\xa8\x43\xc7\xbb\xab\x9d\xd7\xf2\x07\x74\x3b\x1b\xc8\xee\x20\xa3\x69\xf0\x67\xa8\xb5\x5c\xed\xdc\xc5\xb7\xd9\x59\x8a\x57\xdc\xb9\xe2\xb9\xad\x53\xbe\xc8\x3b\x3e\xb4\x53\x80\x7a\xdf\x99\x91\x21\x86\x65\xe8\x0f\x66\x7a\xd7\xe4\xbc\x39\xa1\x25\x34\xff\x9e\x09\xda\x6e\xcc\xc5\xcd\xe0\x61\x2e\x9f\xa1\xb7\xf0\xbe\x3b\xe6\x20\xf3\x58\x2d\x2b\x05\x68\xc7\x14\xcc\x16\x86\x76\x34\xa7\x26\x2b\x64\x40\x23\x25\x16\x0b\xec\xae\x51\xfb\x57\x5b\x4a\xd4\x9c\x16\x71\xb9\x21\x1d\x9f\x05\xa4\x83\x03\x99\x55\x9c\x8e\xc9\xf6\x33\x8a\x28\xb4\x7b\x96\xbe\x91\x49\x15\x34\x77\xb1\xd9\xfb\xba\x9c\x56\x16\x2d\x72\xb2\xb1\x49\x28\xd3\xfd\x60\xb3\x06\x97\x21\xa5\x4d\x3e\x80\x7a\xed\x0c\x6a\x5a\x51\xe4\x03\xde\x3a\x54\x0f\x04\x96\x6c\x75\xc2\xca\xa1\xd1\x44\x8f\x27\xc5\xee\x3c\x43\x2b\x6e\x79\xe7\xb7\x92\x99\xeb\xdb\x3f\x46\x4a\x77\x9c\x1b\x32\x27\x96\xfa\x66\x6d\x76\xc7\xf3\x08\x4a\xbe\xdf\x22\x7a\xa1\xad\xc8\xbb\xee\xef\xf6\x78\x2c\x5f\xf2\xa5\xaf\x6e\xc7\xca\xb8\x45\x79\xd5\x73\xaf\x66\xbe\xb6\xda\x5f\xca\x49\xda\x65\x98\xbb\x2d\x27\x12\xef\x36\xa8\x98\x1c\xfd\x12\xeb\x8f\x19\xf5\xa3\x09\x06\x44\xf7\xdc\x67\x3b\xb3\x7a\xa4\x49\xab\x6e\xd5\x99\x92\x8e\x58\xdb\xe5\xb0\x53\x6b\xec\x2b\xe7\x9f\x38\x58\xd5\x5a\xb5\x24\x08\x1b\xf9\xf7\xc2\x86\xc4\x17\x27\x33\x8d\x57\x0b\x6e\xd5\x92\x05\x15\x33\xc5\x75\xb2\x03\x8f\xac\x00\xd1\x5d\x91\x91\x21\x1b\xcc\x03\x6d\xb3\xfe\x98\xea\x72\xa3\xea\xdc\x1c\x57\x97\xe3\x06\x05\x3a\xe1\xc0\x50\x54\xe9\x72\x9d\x0d\x49\x6e\xcb\x8f\x96\xf5\x58\xdd\x29\xeb\x0d\x82\xe3\x94\xa8\x65\x1d\xc5\xde\xcb\x71\x62\x69\x65\x60\x27\x90\x4c\x2f\xa0\xed\xfc\xcd\xe2\x0f\xf6\x92\xf6\x4f\x9f\x57\x9e\xe1\x62\x5d\x20\xde\x51\x6b\x4f\xba\x60\xbb\xe6\x11\x55\xa5\xcf\xf5\xe9\x70\x52\x60\xee\x44\x88\xfc\x54\xf5\x12\x08\x99\x16\x0b\x4e\x79\x9b\xd0\x02\x27\x7e\x39\xb0\x26\x56\x3f\xf7\x76\x79\xe9\x7b\xcf\x75\x0d\xdd\xb8\x0e\x5b\x88\x82\x43\x62\x20\x77\x70\xf7\x82\x84\x61\xd9\x92\xe1\xb8\x60\x6a\x58\x52\xc8\xa8\x4d\x56\x06\xd6\xb5\x43\xe0\x47\x84\x38\x6a\xbe\x7e\x3f\xf0\x61\x0e\xdb\x59\x6c\xa4\x59\x5c\x85\x5b\x7f\xa9\xe8\x56\xf1\x4c\xd7\x23\xbb\x65\xb5\x68\xfc\x0f\x31\x66\x55\xb2\x93\x81\x66\x62\x10\x8b\x0b\x38\xd1\xa1\x74\xd4\xf2\x50\xc6\x96\x34\x8b\xed\x4f\xda\x51\xfa\x13\x7d\x1c\x7d\x79\x5f\xd8\x33\x17\xbe\xd9\xce\xdd\xfe\xcc\xcb\xa6\xce\x92\x61\x77\xe7\x67\xa9\xac\xb9\xcf\x64\xaf\x19\x2a\x91\xc6\xea\xfa\xa9\x7a\x8b\x3b\xdd\x79\x0f\x2d\xdd\x56\xc4\xc2\x71\x3a\xdb\x37\x9a\xaa\x99\xa5\x54\xd2\x08\x1e\x23\x13\x3a\x5c\x13\x38\x31\x57\x6d\xe0\x1e\x05\x30\x7c\xfb\x32\x2b\xe6\x0b\xc1\x83\x97\xb3\x30\x29\x37\x54\xd6\xa3\x70\x94\xd3\xd0\x16\x98\xf3\x98\x2b\xc2\x89\x2f\x74\x30\x80\xc0\xea\x69\x96\x2d\xdd\xae\xa8\xa6\xa9\xa4\xbf\xbd\xb6\x29\x55\xaf\xa0\x63\x13\xd2\xad\x4c\x9b\x66\x8a\x39\xd4\xe4\x78\xb3\xd9\x7a\xa6\x3a\x96\xbc\x7d\xdc\x68\x17\xa1\x0c\x7c\xfb\x7b\x97\x31\x32\x29\x30\x61\x85\x8e\x54\xa6\x9d\x0c\xf7\x79\x97\x53\x62\xf3\x09\x93\xd0\x35\xd9\xe0\x83\x06\x78\x32\x88\xa8\x51\x1c\x81\x87\x1e\xbd\xa0\x9b\x98\x1e\xf8\x39\x5a\x37\x82\xe9\x22\x41\x7a\x98\x79\xf3\xe8\x31\x56\x72\x04\x58\x94\x72\xb3\x9b\x46\x42\xf8\xc6\x29\x9f\x29\xba\xda\xe8\x57\x70\xf0\x5b\x5c\x11\x33\xb7\x80\x09\x5f\x5d\x58\x63\x7d\x0d\xda\x6e\x01\x35\xad\xc0\x0a\xe7\x85\xed\x82\x3b\x01\x4f\x8f\xff\xed\x5a\x2c\xfe\xfb\x07\xf3\x20\xca\xc0\xf9\x7a\xcc\x42\xb4\xfb\x66\xa9\x2b\x57\xe1\xc0\xc1\x46\xda\x94\xef\xf4\x29\xf6\x74\xcb\x74\x75\x96\x97\x1e\x7c\x75\x48\x5a\x39\x63\x68\xe1\xfd\x75\xbf\x58\xd8\x6b\xd0\x9f\x15\xd2\x6c\xcf\x41\xf7\x6e\x42\x4f\x76\x31\x7f\xaa\x38\xd9\x64\x1c\xbc\x35\x62\x1b\xcc\xb9\x3d\xf8\x3f\x7c\x2f\xed\xae\xcf\x11\x37\xab\xf9\xb9\x42\xc9\x74\x15\xb5\x23\x42\x76\x31\xc0\xe9\x14\x09\x54\x5a\xe3\x94\xb1\x76\x79\x3d\x22\xac\xdb\xca\xa1\x61\xda\xe9\x97\xc2\x8c\xcc\xbe\xf1\x7a\xd8\x6d\xd0\xbb\x6a\x43\x8e\x1c\xe6\x08\x24\x93\x18\xdf\x5e\x60\x27\xf7\xe7\x96\xe6\x84\x2d\x61\x05\x8d\x9e\x38\x12\xbf\xc5\xcc\xc3\x75\x22\xc3\xe3\xa9\x80\xc2\x2c\xe8\xfb\xd4\x08\xc2\x30\x33\x3f\x33\xe4\x05\x1c\xf2\x5a\xa9\x30\x59\x56\x41\x0b\x92\x5f\xba\xed\xbb\x18\xcd\x05\x5d\x57\x80\x16\x44\x8c\x29\x68\x9e\xa5\xeb\x47\x53\x5f\x17\x49\x49\xa1\x24\xe3\x0f\xe5\x84\x73\xb8\xb9\xb6\xc9\xa7\x38\x50\x70\x88\xd3\x48\xa1\xcb\x25\x82\xd2\x39\xb6\x79\x86\xfb\x4f\xa1\x8a\xcb\x98\x28\x69\xd3\x51\x36\x12\x71\xa8\x39\x85\x7a\xa3\x99\x8e\x43\xb5\x30\xc9\x31\x49\x29\xec\x22\x72\x77\xe5\xbb\x3d\x0d\x6e\x98\xf0\x24\x24\xf8\xc4\xa6\xcd\xf8\xa3\xb5\xda\x7e\xd8\x57\x3e\xd5\xe9\x4c\xd5\x85\x52\x46\xa2\x99\x86\xb5\xf6\x52\x68\x27\x69\x1d\x8d\x1c\xe0\xab\xde\x7e\x21\x1e\xf4\x11\x56\xcf\x4a\xa6\x9b\x20\x73\x0f\x5c\xea\x44\x46\xdc\x31\x1c\x88\x45\xc0\x17\xbb\xd8\x83\x9a\x94\xbe\x62\x86\x50\x4a\x85\x0a\x82\xa6\x0e\x74\xc5\x10\x03\x9d\x2e\x3e\xfc\x62\xfb\xc9\x8a\xc2\x43\x63\x38\xc8\x0b\xa1\xc3\x35\xc2\xd3\x22\x31\xaa\xdc\x07\x47\x87\x14\xd5\x39\xdb\xa0\x73\x37\x9f\xea\x6a\x81\x17\x75\x73\x49\x04\x7e\x50\x24\xb3\xc5\x8e\x06\xf7\x5b\x40\x4c\x03\x83\x6b\xc3\xbc\xdc\xce\x40\x35\xbd\xda\x79\xdb\x64\x45\x41\x22\x68\xd5\x73\xa4\xf2\x42\x03\x1c\xe9\x2f\x87\x56\x2f\xd6\xdf\xcf\x30\x98\xcc\x72\xe6\x57\x22\x59\x7b\xd7\xfc\x50\x5e\x52\x81\xa1\xce\x84\x83\x28\x75\xf5\xfb\xb2\x4f\x06\xef\xbe\x38\x8c\x4c\x97\xd5\x1b\x51\x76\x10\x64\xf0\xdb\x1c\x9a\x6e\xf3\x89\xe1\x25\x37\x21\x89\xdf\xe2\x14\xed\x75\x84\xc7\x0a\x24\xca\xf4\x7d\xdd\xdc\x78\x91\x5b\x25\xee\x07\x86\xba\x7a\xb3\xdd\x84\xef\x1e\xfb\x32\xb4\xf7\xc0\x69\x61\x83\xf5\x67\xfd\x87\x2d\xad\xf1\x93\x04\x0c\x4b\xc8\x16\xc6\xb4\x9e\xfd\x3c\x62\x96\x85\xc6\x68\x78\x6d\xf7\xa3\x65\x61\x51\xf7\x9c\x6f\xe0\x7c\x2c\xc8\x64\x57\xec\xd7\x13\xdd\xd7\xa7\xf1\xab\xa3\x4c\x07\x70\x0b\x98\x9a\xaf\x9f\x6e\xde\x2d\xff\x74\xed\x35\x6d\xa8\x80\x22\x1b\x87\xbd\x18\xcc\x7d\xbd\x94\xa3\xd9\x00\x38\x5f\xc7\x82\x3e\x50\x9f\x97\x70\xf7\x2b\x3e\xe0\x13\xac\x33\x48\xc1\xb1\x64\xe2\x23\xda\xe3\x5e\xcb\x47\xbb\x6e\x0e\x6a\x33\x2d\xed\x51\xb8\x37\x2a\x11\xfc\x82\x54\xfb\xfc\x0c\xb6\x49\x37\xa5\x3e\x09\x11\x90\xda\x57\x32\xa7\x70\x34\x8a\xdb\xc8\xf6\x44\xb8\x32\x70\x62\xf2\xae\xf7\xb7\x19\x57\xe2\x44\x8c\x61\xbd\xeb\x61\xe1\xcb\x53\x9e\x55\x4c\xc6\xa1\x94\x61\xec\xcb\xfb\xcf\xc3\x30\xe1\x57\x64\xf2\x23\xbe\xcf\x7a\x11\xe4\xa7\x37\xf7\x40\xdf\x63\x94\x5d\x00\x17\x2b\x73\xc8\x11\x99\x4a\xdc\x4f\x49\x79\x48\x2d\xc2\x09\x41\x81\x2e\x27\x99\x95\xf0\x86\x1f\x92\x0c\x69\xe7\xca\x30\xf4\xf6\x48\x04\xdf\xd6\xc9\x30\xce\x13\xeb\x74\x0c\x23\x19\x63\x78\xfd\x25\x32\xb3\x75\x4e\xc7\x85\x0a\x2d\x7f\x45\xd2\x98\xbe\xde\xd6\x2d\xd2\x1f\xfd\xb1\x2c\x7f\x57\x41\x64\x0d\x2d\x55\x73\x34\xec\x17\x8b\x8f\x83\x9e\x3f\x6a\xf6\x7c\x7d\x0f\xf8\xd1\x07\x36\x80\x22\x4f\xd7\x76\xd8\x4f\x8b\x0b\x1f\xbd\x48\xdb\xcf\xfd\x73\x58\x2f\x11\x83\x42\x84\x2e\x77\xa7\x39\x3f\x8a\x15\x70\x4c\x07\x3b\x27\xa1\xd6\x73\x21\x92\xaa\x7e\xcc\x3b\x41\xc4\xf3\xa0\x2d\x26\xda\x46\xc5\x97\xcb\x83\x0c\x05\x74\x0d\xae\xd1\xfa\xf2\xdb\x34\xc7\x79\x06\xf9\x9b\x4c\xe1\xa4\x07\x49\x86\xeb\xf6\x8b\x0f\x1e\xbc\xee\xe1\x97\x39\x23\x2b\x13\x0b\x3e\x79\x2b\xe1\x53\xaa\xc2\x31\xa8\x07\xef\x7c\x2a\xa6\x8c\x4a\x73\xcc\xa6\x9c\x7a\x09\x93\xdd\x8d\xb9\xee\xe4\x5a\x62\x69\x8c\xd7\x94\xc1\xc7\xe1\xdb\x97\xa1\xe7\xad\x3f\x8d\x95\xfb\xaa\xf9\x5a\xe3\x4f\xda\x62\x87\x34\xaf\xfd\xa7\x26\xb4\x0a\x62\xcf\x2d\x63\x56\x68\x54\x5b\x38\xb9\x5e\xa4\xf7\x48\x61\xdf\xe4\x07\x50\x08\x4c\x83\xc3\x4d\xa1\xe4\xc3\xbe\xdb\xe4\xbd\x41\xd5\xc9\x4e\x2e\x15\xd5\xd9\xb5\xbd\xdb\xc7\x92\x3e\xb7\x95\xb1\xa7\x97\xa1\x68\xcc\xa1\x82\x29\x93\xe6\xd7\xbf\xf2\xda\xb3\xe3\x08\xe9\xfd\x7b\x72\xbf\x5e\x8a\xc6\x31\x7e\xfd\xb1\x4e\x23\x18\x6b\x9f\x88\xfb\xa7\x1a\x69\x2a\x8c\x97\x54\x79\xad\xa1\x26\x16\x03\x9c\x5c\xac\x7c\x68\xad\x57\x62\xb5\xb2\x62\x65\x0e\x5d\xe8\xf8\x8d\xb4\x1a\x9a\xc2\x55\xa0\x8e\x92\xb2\x26\x56\xda\xb5\x61\x40\xa1\xe7\xd7\x09\x9c\xac\xee\x86\x9e\x09\x3a\x25\x15\x06\xee\x29\xba\x79\xe5\xda\xe6\x51\x55\x95\xb6\x9d\xfe\xa6\x9e\x29\x7a\x8b\x95\xe4\x75\x4c\xcf\xe8\xe2\x77\x71\x0f\x48\xca\x88\xe5\x81\x1d\xef\x81\x30\xaf\x71\x20\xa8\xdc\xb4\x7d\xae\xd8\x43\x52\xce\xc5\x94\xe0\x64\xed\xbc\x4f\x58\x7c\x9b\x4c\xb1\x82\x32\x8b\x7a\x52\xa4\xe6\x06\x26\xc1\x81\x94\x0e\x16\x7a\xf2\xe2\x1e\xf8\x6d\xde\x37\x77\x2c\x33\xc4\xba\x9c\x1f\xfb\xf8\xa4\x07\x89\x12\xda\xd4\x4d\xcf\x0c\xaf\x8c\x35\x8c\x7d\xec\xb8\xcc\xde\x5f\xfe\x02\x22\x39\x11\x30\x3b\x46\xff\x2e\xc2\x3e\x09\xf5\xa0\xdf\x19\x82\x4e\xd1\x67\x6f\x6f\x58\x11\x88\x13\x4c\xae\xd3\x0a\xc0\x1b\x36\x1d\x82\x49\x49\xd7\xad\x5e\xd5\x96\xe3\x7a\xbd\x8b\x13\x0a\x20\x38\x35\x95\xc9\x65\xcf\xd3\xc8\x5d\x1f\x97\x77\x90\x37\x4c\x77\xb0\xe6\xb8\x94\x36\xd8\x13\x5c\x0f\xe9\xa2\x9b\x7b\xcf\xcf\xe6\x2e\xec\x7b\x92\x2a\xc2\x98\xb6\xa7\x23\x16\xd0\x95\xe7\x94\x64\x38\x50\x37\x14\x0a\x7a\x6b\x86\x0f\x34\xfe\x35\x1d\xb2\x08\x67\xbb\xa0\x38\x28\xad\x58\x7d\x92\xfe\xc9\xd5\x65\xa9\xef\x21\x07\x05\xe8\xbc\x3b\x21\xd4\x3e\x88\x82\xa7\x9a\xf5\xfd\x23\xa5\xe0\xc3\xe4\x06\x26\xe7\xe2\x00\x82\xe2\x97\xdb\xcb\x2c\x48\x6a\x4d\x13\xec\x8d\xa8\x7b\x60\xf3\x21\x3a\xcf\x13\x7a\x40\xc3\xf3\xb5\xf6\xc0\x8d\x80\xfc\xe6\x1a\x91\xef\x68\x71\xb6\xa9\xa1\x06\x3d\x91\x21\x9f\xf9\x87\x4c\x20\xab\x66\xdf\xc5\x9e\x56\x72\xe2\x03\xaa\xb2\x2a\x4a\x86\x50\x04\x4c\x4f\x7b\x16\x14\xd6\xec\x66\xb3\x3c\x54\xb8\xb9\x12\xb6\xc4\xe6\x46\x43\xb2\x7b\x42\x1c\xd1\x59\xb6\x98\x00\x5d\x10\xb9\x7d\x8c\x62\x55\x5d\xc4\xe2\x79\xf2\xb3\x57\x49\xff\xb9\x85\xd4\x9f\x32\xcc\x6f\xc1\x23\xc5\x15\x57\xba\xa4\xdf\x97\x87\x05\x1d\xf0\xc5\x42\x70\x2b\xff\x49\x0b\x4f\x5e\xf4\x9f\xe9\xe6\xfe\x15\xfc\xc3\xf0\x0d\x98\x6f\x6b\x74\x55\xb0\xb2\xe1\x15\xd6\x2f\xcb\xb8\x3f\xdc\x30\xb4\x0a\x47\x0e\x45\x22\x73\xe2\x24\x59\x76\x52\x11\xdf\xcd\x8f\xf6\x29\xaa\x56\x63\xb1\xfd\x0f\x96\x15\x96\x84\x8b\xe9\xb7\x9c\xf6\xc1\x55\x26\x6a\x3d\x1f\x52\x8c\xac\x45\x69\x46\xe1\x10\x3f\x86\xc7\xb6\x65\x6e\x21\x39\xff\x71\xac\xf4\x21\x30\x3b\x23\x43\x68\xa3\x19\xc9\xc5\x55\xb5\xec\xd8\xd1\xed\xcb\xce\xe6\xb1\x55\x33\x23\x43\x3d\xb5\xb9\xf2\xe0\xd0\x99\x69\x47\xe5\x41\xa4\x03\x8b\xa8\x21\x74\x3e\x4f\x8e\xb2\x4e\x0e\x78\x13\xab\x1e\x41\x09\xd2\x20\xf4\xd5\x4e\x8b\x7e\x7b\x8a\x2d\xf5\xff\x64\x3b\x10\x96\x8e\xdd\x41\x46\xea\x45\x3a\x63\x47\x5d\x45\xee\x87\x56\x53\x1f\x66\x49\x30\x41\xc3\x34\x3f\x3a\x1f\xe4\x19\x18\x00\xa8\x09\x85\x57\xe8\xc8\x8a\x6f\xe3\x16\x6e\x57\x05\x78\x5b\x0f\xaf\x2a\x4e\x5d\xe3\xbb\x36\x2e\x8f\xe3\xae\xf7\x8d\x9d\x83\x25\x1e\xbb\x6f\xe6\x10\x39\x3a\x59\xe9\xb3\xfd\x1e\x48\x18\x38\x4f\x0c\x7a\xbd\x68\x1f\x2c\xbb\x67\x83\x39\x78\x21\xd2\xe4\x6f\x36\xaf\xa4\x65\x69\x8b\xe7\x50\xb2\x5a\x48\x43\x2d\xf9\x3b\xd0\xf3\xe8\x20\x50\xd3\x44\xa1\xe8\xfb\x40\xe0\x33\xbb\xf1\x9d\x94\x1e\x8b\x2f\xa2\x17\xf4\xee\x17\xc3\x9b\x26\x85\xc2\x85\x8e\xb6\x4e\x56\x2d\x9f\x58\xe4\x0e\x26\x7b\x20\x0b\x30\xde\x19\x23\x86\xeb\xc1\x6e\x02\xfd\x2f\x33\x4f\xf6\xb3\x11\x6b\x36\x1a\x9f\x13\x3a\xef\x01\xe2\xaf\xbc\x19\xa8\x97\xfd\xbe\x29\xf9\x0f\x2a\x49\xbd\xbf\x55\x72\x2e\x2b\xdd\xf8\xfa\x4d\x83\x9d\xe5\xe4\x08\x51\xdf\xe5\x3f\xbf\xea\x4d\x8b\x90\x65\x38\xf8\xe7\x1a\x26\xee\x70\x74\x65\xd1\x70\x19\x54\x6c\xeb\x70\x0c\x22\x99\xfb\x28\x91\x20\x9d\xb1\x65\xab\xbd\xa2\xb0\xaa\xcf\x49\xd0\xaf\x25\xed\x4a\xe0\xd5\x37\xc7\xf6\x5a\xd7\xfd\x35\xd8\xb3\x5b\x50\xcd\xa3\xd6\x4d\x3f\xfd\xf9\xf8\x83\x60\x86\x00\x6a\x5d\xad\x7e\x2e\x39\xe8\x49\xef\x13\x95\xed\xaf\x82\x9d\xbf\xd3\x09\x42\xc6\x7c\xad\xd9\xae\x10\x16\x70\x48\x5e\xc7\xdc\x66\x50\x6c\xbc\xb5\xd4\x65\x82\x61\x06\xf4\xf4\x3b\x29\x07\xab\x74\x8e\xdf\xd7\xfa\x5f\x49\xe5\x87\x99\x28\xd3\xb8\xba\x20\x4b\x74\xa9\xe2\xe2\x43\xce\x84\x22\xe7\xf7\x74\xf5\x0d\x37\x16\xd3\x8b\x35\x36\xba\x75\xeb\xfb\xb5\x53\x74\x4e\x0a\x1a\x3d\x48\x0a\xd0\xae\x34\x8d\x84\x40\x10\x34\x5d\xec\x47\x1a\xa9\x5f\x25\x8b\x8a\x83\xf1\x44\xf0\xc8\x30\x63\xeb\xed\x81\x3a\xf6\xad\xce\xec\xd3\x86\xed\xd8\xb7\x6d\x11\x93\x57\xec\x2b\xfc\xca\x5e\x71\x09\x10\x83\x4b\x51\x73\xfd\x42\x4b\x17\xfc\xe4\x11\xa1\x2d\x53\x72\x7f\x9a\xcd\x09\xaa\x31\x55\x35\x22\x49\xb9\xed\xa9\xb3\x2a\xcb\xb2\x4b\x0e\x20\x06\xb8\xa4\x0b\xa2\xb1\x79\xf0\xd0\x3f\xde\x60\x62\xdc\x05\xe3\x4b\x69\xe6\x92\xca\xc7\x22\xa0\x12\xb1\x6b\x42\xb0\x39\x15\xde\x64\x70\x0f\x44\xe4\x77\xae\x3e\xc9\xf9\x3e\xde\xa9\xc7\xf7\x6e\x91\x39\x29\x28\xcd\x02\x1a\xa1\x4e\x75\x2b\xb1\x70\xb1\x93\x68\x90\xa5\x11\x4b\xf7\x45\x94\x63\x87\x1a\xcc\xbc\x0b\x4c\x83\xe7\xc4\x83\x6b\x20\x5b\x3f\xe7\x36\xb8\x6b\xf8\xef\x2c\xfd\xe4\x5d\x53\x3b\x82\x2e\x0f\xb3\x6a\xd1\xbb\x85\x21\x2c\x9d\xf5\x9d\xcd\x49\x8f\x25\x86\x70\xd9\xbc\x36\x16\x45\xb7\x12\xa9\x4c\xfd\x95\xf8\xf4\x6d\x75\xdc\x1f\xe5\xd1\x45\xb0\x87\xbe\x7f\xcf\xd0\xb2\x1f\x37\x0d\x86\xdf\x0a\xc7\x8e\xcd\x98\xe9\x3a\x9e\x25\x9f\xd3\x87\x4e\x6d\x1a\x07\x36\xbe\x63\xb8\xcb\xe1\x79\x9a\x4d\x22\xdb\x3b\x68\x85\x7e\xae\x9c\xf5\x7a\xc6\x2c\x64\xf3\xc5\x48\xec\xa4\xe8\x9d\xe7\x5c\x1a\x96\xbb\x0c\x23\xc7\xc6\xea\x7b\x53\x5c\xf4\x67\x53\xe2\x03\x02\x96\x5e\x89\xb8\x85\xcf\x63\x4b\x53\x4d\x7e\x8b\x8d\x0a\x2c\x6d\x21\xb8\xfb\x46\x1c\x09\x1d\x8f\x84\xfc\x54\x4f\xdb\xd9\x07\xac\xfd\x9d\x4a\xe9\x13\x96\x2e\x6b\x74\xfb\xba\x49\x9f\x5e\xe8\x9b\xaa\xa1\x64\x98\xe5\xce\x8a\xb6\x04\xce\x3d\x36\x7e\x4f\x83\x1b\x34\xb5\x05\xff\xc8\xaf\x68\x35\xaa\xc4\xda\xea\x28\x7e\xb7\xe4\xcf\x0e\xd5\xd9\x03\x0a\x92\xe2\x66\xa7\x41\x72\x14\x61\x5b\x30\x8a\x6c\xfc\xb3\xc4\x38\x46\xee\xbb\xa9\x59\xcb\xba\x10\xad\xcf\xcf\x7a\x87\xc4\x13\xab\x3d\xef\xf8\x50\x82\xbe\x94\xc1\x4b\xcf\x0c\x43\xf0\x30\x9d\xa0\x0c\x37\x8b\x13\x19\x8f\x7d\x50\xe0\x21\x8d\x15\xfd\x48\x4b\xaf\x81\x7a\x4e\x91\x61\xf7\x29\x35\x71\x0d\x70\x89\x3f\xf1\x8c\xbe\xc7\x78\x8e\x52\x44\xbf\xc7\x2f\x80\x18\xa6\xdb\x04\x07\xc9\x30\x60\xbf\x83\xea\xca\x26\xca\xcc\x3e\xac\x8f\xf2\x8f\xca\x97\xb7\x0f\xfc\x8f\x77\xc7\x56\x20\xe7\x9e\x4a\x35\x5a\x78\x47\x07\x2b\xc5\xc6\x95\xcd\x2a\x8b\xce\x75\x7e\x77\xdf\xb8\xf1\xed\xfc\xf4\x68\xc9\xf7\x82\x4b\x9b\x6f\x84\x35\x3f\xd7\x72\xf6\x30\x3f\xa1\x5d\xcb\x03\xba\xfb\xbc\x2c\xd3\x9e\xd0\xfe\x72\x6c\x4e\x4e\x1e\xc6\x69\xa7\x3d\x63\x0a\xbd\xc9\xfa\x74\x69\xcc\xb7\x72\x27\xf9\x53\xaf\xe2\x78\x05\xa6\x5e\x2a\x6b\xd2\x21\xf6\x3f\x35\x07\xe8\x05\x27\x16\x18\xf2\x6e\xba\xd2\x39\x0f\x80\x37\xcd\x91\xd3\x83\x72\x81\x1a\xdd\x4d\xe1\xcc\xc4\x77\xec\xeb\xe9\x6f\x95\xf8\x2c\xa7\x4c\x3a\xf7\xf3\xa8\x3c\xbd\xc2\xe8\xf8\x5c\x6b\xc7\x9e\x55\x30\x61\x77\xca\x83\x0d\xf6\xa5\xa8\x97\xa3\x24\x04\x9c\x7a\x77\x02\x90\x5e\x56\x46\xcf\xa5\xe6\x41\xab\xc1\xc1\x31\x06\x9c\x7f\xa7\x1a\xfc\x17\x90\xdc\xb5\x5f\x5c\xf6\x63\x44\x9e\x79\x03\x70\x97\x61\x12\x39\x08\xe4\x9a\x27\xdf\x92\xfa\x9c\x89\xc5\x37\x21\x98\xe2\x78\xce\x3f\x4c\x8d\xa4\x96\xf0\x64\xe8\xb4\x77\x53\x07\x41\x2b\x07\x66\x7a\x79\xcb\xcb\x33\xa6\xbe\x68\x9f\x87\x8b\xee\x81\x9d\xb8\xae\xfb\x57\xc4\x55\xa6\xa8\x0e\xae\x67\x72\x10\x6c\x55\x34\x34\xa1\xbb\xa9\x23\x42\x47\xae\x03\x31\x15\x32\x7b\x9c\x98\x93\x17\xeb\xe1\x5e\xc2\x47\x44\x13\x03\xe7\x8f\x81\xe4\x96\x04\x9f\xa9\x97\x06\xb4\xdd\xfd\x39\x64\x57\xbd\x05\x09\x4b\x8e\x25\xda\x52\x46\x28\xa2\x62\x88\xd1\x9d\x79\xbb\xdb\x8b\x3b\xca\xdd\x7b\x80\x54\x22\xe0\xdd\xe6\x9f\x47\x3f\x66\x09\xaa\x0e\xdc\xf2\x15\x93\x75\xbd\xf0\x7e\x06\x70\x62\x3e\xdf\x7c\x1e\xf5\xf4\x84\xb5\x7d\xd6\xf9\x91\xc0\x9f\xe8\x2f\xe6\x2f\x00\x8e\x14\xbe\xe0\x6f\x16\xd5\xbe\xf0\x6d\xdd\x74\x7f\x86\xe9\x1f\x75\xd3\xaa\xf3\x7b\xb1\x3c\x3f\x8d\x8e\x8d\x98\x06\x7e\x74\xaa\xc1\xf0\xf9\x26\x6d\x0a\x60\xf8\x96\x9f\xab\x9e\x75\xd4\xb8\x94\x15\x47\x5f\x60\xe4\x69\x0b\xa9\x04\x35\xee\x7b\xeb\xec\xb2\xa9\x10\x3c\xc4\xa4\x11\xa5\x3e\x91\x61\xf4\x71\xae\x82\x26\x0e\x0a\xa8\xfa\x95\xd8\xe1\x59\x39\xa4\x52\x90\x7c\x00\xbb\x85\xf6\x8a\x6e\x93\x41\x0e\x24\xb9\xd5\x7b\x72\xb9\xdb\xe6\xad\x5b\x67\x85\x74\x21\xe5\xcb\xed\x78\xf8\x35\x20\x1a\x64\x72\x2f\x82\x29\xd5\x18\xc5\x14\x79\xb1\xb2\xca\xa0\xf9\x24\x4e\xeb\x87\x7e\xdf\xe6\x07\x2a\x06\x88\x9a\x98\xab\xc9\xc4\x86\x29\xe4\x51\x86\x33\x3b\x72\x6c\xce\x68\x35\x99\x27\x85\xcc\x47\xe4\x82\x23\x6e\x1a\x6c\x2f\x47\x41\x9a\xfc\x37\x71\xd8\x67\xde\xbd\xb1\x9b\x18\x4f\x0a\xd0\xc6\xb2\xbb\xd2\xa6\x7a\xdc\xb9\x81\xb8\x98\xa1\xd1\x06\x33\x2b\xa8\x7e\x6e\x31\x38\xce\x0b\xe1\x2d\xff\x1d\x96\x70\xb9\x25\x4d\xe7\xf0\xbe\xf6\xab\xc7\xaa\xef\x1a\x15\x36\x03\xe5\xce\x24\xce\x4b\x17\x69\xe5\xcb\x55\x0c\xb4\x1d\xed\x93\xea\x69\xd1\x73\x56\x9d\xdb\x41\xc0\x35\x8f\x5a\xf0\x6b\xcb\xe9\xbc\x37\xfc\xd1\xa1\xcf\x33\xfd\x0c\x11\x9d\x8d\x7b\x40\x39\x76\x53\xbe\xad\x79\x59\x5c\x2f\x39\xfa\x89\xda\xac\xc2\xcb\x5c\xe4\x5c\x36\xca\x18\x11\x5d\xf5\x40\xeb\xf4\xf2\xb8\x4e\x63\xb0\x80\x5d\x76\x6a\x8d\x3e\x21\x77\x43\x37\xd6\x9f\xbb\x8d\xca\x84\xbf\xb5\xbe\x87\x40\xe2\xe1\x99\x5e\x8a\x1e\x3d\x13\x62\x01\x26\x79\xd3\xf1\x66\x2b\x5b\x7a\xf9\x4e\x70\xae\x61\x98\x59\x7e\x8c\xfc\x07\xd6\x46\x6a\x4a\x8f\x8b\x74\x8e\x9f\x41\x76\xb0\x51\x64\xa2\x04\xd3\x3d\x80\x27\xf5\x61\xdc\xe1\x5d\xc8\x1f\xd1\x84\x9d\x54\x9e\xae\x9e\x44\x87\x69\x9c\x84\x68\x47\xa2\x84\x0c\xec\x0e\x3d\x02\xda\xf0\x1e\x86\x70\x1f\xa6\x81\xf6\xd2\xac\x2d\xa9\x0c\x67\x0a\x98\xcf\x3b\x6a\x07\xa3\x16\x87\xec\x38\x88\xa6\x5e\xdb\x55\x3d\x0a\xbc\x39\x40\x6a\x68\x64\x3c\xe8\xee\x70\xa4\x23\xfa\xdd\x89\x27\x40\x54\xb4\xb0\xd7\x20\x28\x5a\x42\x15\x49\xdd\x98\x23\xcf\xd1\x93\x24\x9a\xa2\x08\x20\xb1\xcc\x5c\x07\x01\xbf\xf8\xdc\x50\x0b\x6f\x87\x92\xad\x59\x1a\x02\x5e\x62\x74\xef\xc8\x75\xb5\x8a\x24\xed\x50\x1f\x7f\x7a\xd3\xcc\xab\xa2\x5d\x3b\x66\xcd\x1b\xed\x2c\xbd\x38\x97\x8a\x5c\xf8\xdb\x0b\x00\x06\x00\xf4\xe6\xe9\x31\x9c\xa0\x9a\x58\x96\xe3\x77\xc9\x46\x4c\x71\xfe\x54\x99\x31\x59\x95\x7a\x0f\x8e\xf1\x7b\xb6\x5d\x93\x93\x17\x4f\x29\xd7\xb5\x48\x70\x7b\x29\x40\x1b\x99\x26\x95\x5b\x10\x4c\x9f\x3e\xea\x85\x9f\x3d\x75\xef\x9c\x53\x18\xa5\x35\x8f\x0f\x4d\xa2\x37\x4f\xa2\xdb\x18\x1b\xb7\x07\x9c\xa8\x08\x22\x99\x0e\xb6\xcd\x70\x9d\xd5\xab\x3d\xda\x72\x83\x4b\xed\x16\x10\xce\xde\xf6\xf4\x51\x7f\xdc\x44\x6f\x0f\x23\xba\xd1\xa2\x05\xdf\x87\xb6\x1e\xe5\xf2\xeb\xd5\x0e\x94\x86\xc8\x0b\xdc\x76\x73\x01\x17\x36\x35\xe6\x69\xde\xac\x21\x92\x15\xc6\xfd\x92\xf6\xa3\x4f\x02\x19\xa1\x08\xc5\xb6\xf7\x73\xb7\x32\x6b\x4a\x1a\x05\xa2\x9f\xb2\x30\x13\x72\xef\xee\x81\xbb\x36\x04\x6f\x28\x8a\x77\x35\xcd\x7c\x5e\xb3\xdf\xf2\xc1\x39\xbf\xae\xe4\x24\xf4\x0f\x27\xe6\x02\x6f\xa3\xb8\xb8\xd0\xfb\x96\x96\x84\x67\x85\x1c\xee\xa0\x60\x13\xc7\xad\xa9\xf8\x65\xaa\x18\x83\x15\xd5\xc9\x42\x2f\x59\xcc\xd1\x1d\x8a\xab\xd1\x13\xb4\x0e\xdd\x2d\xdd\xd7\x4b\xe7\xac\x37\x0b\x3b\xc4\x27\x6d\xb6\x20\x9e\xa9\xe3\xe3\x85\x76\x08\xd1\x2d\xdb\xe9\x6e\xe4\x82\x28\xd9\x28\x47\x9b\xfa\x2f\xc7\xe7\x5f\xdc\x0f\xf7\xa4\xf1\x81\x33\xdc\x5b\x69\xa4\x7a\xd4\xe2\x49\x40\x39\xc7\xb7\x63\x6b\xb3\x6f\x56\xbd\x2b\x47\x52\xb9\x8d\x3f\xa5\x08\x4e\xb5\x13\xc3\x2f\x46\x36\x42\x48\xa8\xdd\xf4\xce\x94\x6a\xd2\x09\xa8\xe1\xdb\xbc\xea\x0e\x57\x95\x22\x70\x6c\xfa\x7f\x1a\x9b\xd9\xc7\xe5\x33\x16\xe4\xc8\xee\xcb\x30\x3e\xdd\xf8\x8d\xd7\xd0\x1d\x63\x50\x65\x35\x0d\xc6\x0a\x7b\x0d\x8a\x43\xa5\x51\x1e\x1d\x4e\xeb\x7e\x5a\x6b\xfb\x76\x6b\x2e\xcf\x55\xf4\x7d\x39\x38\xe5\x0f\xdf\x71\x22\x0a\xa1\xf2\x32\x8d\x02\x38\xe0\x2c\x80\xfd\xb7\x5f\xa1\x9a\x46\xca\x0f\x83\x73\x12\x00\x06\x3b\x83\x41\x14\x4e\x21\x65\x5a\x5c\xcd\xa4\x94\x1c\x4f\x7f\x97\xd4\x07\xd0\xf9\xc9\x80\xdf\x7e\x63\x1e\x7d\xaf\x23\xf6\x26\x7e\x0d\xc5\x70\x47\x9a\x96\x78\xf2\x49\xe6\x35\x02\x0c\x37\xc6\x58\xcc\x97\xd2\xdb\x26\xc4\x3f\x45\x10\x0d\x32\xc5\xfa\x3b\x4b\xde\x28\x34\x52\x99\xe1\x3d\x0e\x4d\x4e\x79\x26\xaf\x20\xbb\xd6\x15\x57\x1b\x26\xeb\x90\x5c\xb1\x01\x92\xa1\xda\xfb\xb7\xd0\x27\xe1\x5f\xfc\xcf\x07\x4b\x74\xe6\x4e\xb5\xff\xf3\xb2\xd7\x79\x01\x66\x01\xdd\x46\xae\x06\x5f\xbf\xa0\xef\x76\x1c\xfd\xe9\xca\x14\x7b\x89\x59\x37\xa4\xf8\x72\xe7\x41\x3d\x50\x02\xdd\xd9\x0b\x63\x16\xc3\xac\x51\x1d\xaa\x14\x73\xa9\xf7\xa3\x6c\x67\xbe\x99\xfb\x88\xbb\xc7\x7b\x62\x01\x88\xec\xb9\x07\x89\xb0\x70\x5c\xf1\xcf\x02\xdf\x2e\xee\x01\x4c\x13\x7b\x8b\xd3\x15\x6d\xd4\x93\xb6\x09\xc6\x42\xca\xce\xa2\xee\x67\x6f\x79\xbf\x8d\x80\x22\x04\x12\x02\xbb\x95\x7f\x36\x24\x86\xd2\x32\x64\x7c\x98\x03\x7f\x9a\x3e\x61\xaf\x1b\x37\x83\xa8\x81\x69\x30\x60\xcf\x84\x4c\x63\x6e\x86\x1a\x74\x86\xfb\x7d\x55\x78\x66\x6f\xbb\x3c\xbe\xd0\x28\x98\x64\xa9\x5f\x1e\xaa\x6c\x40\x22\x75\xd5\x2b\x6a\x9a\xab\xab\x12\x5d\x14\xcd\x79\x1f\xb8\x3b\xb1\xa6\xa6\x04\x04\xd1\x5e\xc6\x3e\x85\xd8\x2e\x60\x09\x52\x95\xc5\xe1\x3c\x07\x4d\xd8\x56\x70\x5d\x00\x1a\x58\x5e\x57\xa8\x15\xb8\xe2\x3c\x57\x02\xec\xed\xfc\xdf\xe8\xb1\x06\xcc\x5d\x14\x17\x39\xb7\xd9\x60\xee\x42\xa8\x5f\x72\xdb\x4b\xf1\xa7\x88\x2c\x15\x3a\x3f\xd1\x92\xe1\x6b\x09\xe1\x17\x95\x40\x66\x5e\xdd\x03\x38\xf5\xd2\x11\x82\x57\x56\xfd\x74\x1e\x6c\xd6\xdf\x74\xa3\xd1\x35\x78\x0e\x2b\x83\x54\xe7\x43\xac\x64\xab\x2f\x62\x40\xdf\xdb\x09\xb6\x49\x83\x87\x4b\xd1\xba\x1d\xd0\x00\xb2\x27\x8c\xab\xe4\xd8\x3a\x42\xc0\x0d\x4a\x86\xb6\xe1\xef\xf2\x70\xd7\x3c\xf2\x5b\xb1\xb5\x87\xa7\xc6\xdf\x9f\x95\x1c\x46\x45\x7e\x22\xb9\x64\x45\x55\x30\xe1\x36\x36\x7f\x95\xe0\xa0\x20\x1b\xd2\x32\x7c\xb9\xdd\x24\x8f\x37\x5c\x76\x59\x73\x63\x93\x6e\x63\xf2\x5c\x63\x6c\x4c\x16\xdc\xe9\xf3\xa0\x7f\x27\xaf\x7f\x4d\xea\xeb\x85\x5f\xd4\xed\xc7\x52\x77\x36\x4e\x30\x16\xe6\xe2\x32\x4c\x32\x60\x9e\x3f\x4d\x12\x62\xf0\xab\xdf\x44\xc9\x9f\x1b\xc5\x30\xcb\xb9\xcc\x46\xee\x14\x55\xe0\x42\x92\x8d\x64\xc5\xcc\xbe\xb8\x42\x14\xd9\x0f\x77\x09\xda\xfc\x8a\x58\x79\x93\x08\x35\xf7\x2f\x7d\x7c\x38\x49\x0c\x36\xe9\x2e\x06\x7c\xd3\x53\x3d\x78\xab\x0a\x93\xdc\x5b\x65\x2b\x07\x2c\x75\x73\xfc\xf9\x51\xa0\xae\x69\xc7\x85\xf7\x18\x72\xc6\x35\x90\x32\xc4\x4b\xb2\x72\xe3\x95\x08\x49\x1b\xcc\x81\x3b\x49\x99\xd4\x78\x5a\xf2\xe4\xf3\x76\xa7\x29\x86\x48\xe5\x4b\x69\xc2\x65\x05\x9c\x64\x87\xca\x49\x56\xfa\x3b\xca\xed\x7b\xe0\x41\x8e\x53\x87\x67\xc1\x0a\xbf\xc0\x50\x45\xfb\xb0\xb8\xcb\x97\x00\xf0\x25\xc2\x6a\x96\x55\xaf\x8a\xe5\x95\x11\xa7\x06\x00\x27\xb8\xf8\xc7\x8e\x50\x21\x46\x0c\x27\x30\xf8\x97\x9f\x1d\x9c\xfc\x0f\x19\x16\xe9\xff\xb6\x02\x45\x1b\x56\x41\x0d\x70\xca\xad\x2c\xbf\xde\xad\xdc\xe9\x9f\x7b\xe0\x83\x7f\x93\x94\x9e\x83\x6b\x8a\xcf\xee\x19\x42\xbb\xc9\x71\xfa\xf1\x15\x42\x18\x5d\x4b\xd4\x39\x14\x1a\x38\x93\x1e\x43\x57\x4b\x1f\xbe\x8d\x99\x80\xde\xea\x24\x57\xf7\x4c\x1f\xe3\x30\x09\x97\xa5\x00\x39\xfd\xaf\xa8\x80\x02\xd0\xcc\x7c\x2c\x20\x43\x20\xc7\xbc\xaf\xf2\xdf\xa3\xdb\xf3\xa5\x45\xad\xc7\xb6\xe5\x2c\xe4\x14\x09\x55\x77\xd4\xfa\x64\x38\x37\xdc\x6e\x3c\x63\x5c\x42\xbc\x4b\x0e\xc9\x67\xdb\x30\xef\x20\x1f\xd4\x42\xc4\x4a\x71\x18\xea\x1b\x2c\x37\xe4\x59\x62\x3f\x72\x2b\x02\x24\xcf\x38\x31\x6b\xd1\x86\x9b\x4b\x82\x13\x38\x54\x2d\x6f\xcf\xa9\x71\x7e\xc9\x0c\x6f\xc6\x5c\x34\x52\x53\x57\x88\x69\x57\x2c\x2f\x0d\xd3\x26\x50\xca\x50\xfa\xff\x2f\x21\xd9\x7f\x48\x3c\x15\x94\xff\xf3\xc2\x25\x42\x1c\x5d\xe7\x12\x5f\x64\x60\x7b\x4c\x2e\xd2\x96\x85\x1d\x09\x72\x11\xcf\x26\x9d\x52\xbe\x50\x3e\x53\x8f\xaa\xef\xf7\xdb\x6a\x17\x57\x5a\x53\xe7\xc2\x22\x6a\x54\x47\xa5\x0e\x2f\x36\x17\x03\xde\xb9\x54\xb5\x11\xe3\x0a\x21\x9c\x19\x76\x16\xcc\x94\xc3\x06\xeb\x15\xb4\xaf\x1d\x19\xc2\x94\xb7\xd3\x97\x05\x32\xbb\xff\x3d\x5d\x21\xf4\x9b\x8b\x62\x36\x7c\x84\x8f\x3b\x43\x63\x51\xbd\x28\x48\x93\x80\xfc\x82\x02\x74\xb6\x9e\x78\x52\xaa\x4e\x67\xbf\xec\x2e\x36\x4e\x39\x50\xbe\x23\xcc\xaf\x51\x89\x99\x20\x7e\x89\xc8\xef\x00\x73\x4f\x6c\x4a\x4a\x16\x99\x4d\x3e\xd4\x18\xa6\xde\x26\xd4\x9d\x62\xe4\xaf\xcb\x34\x16\xf8\xed\xfb\x16\x43\xe9\x52\xca\x2b\x84\x1f\x7f\xdb\xec\x8e\xf2\x24\x8f\x78\xf1\xe8\x8e\xe2\xb3\x7c\xea\x97\x27\xd4\x66\xeb\x26\x36\x98\x9f\x0b\x92\x9e\x39\x45\xfc\x9d\xd4\x10\x95\x48\xfb\x19\x6a\xbf\xd5\x95\x55\x51\x55\x4d\xb6\xf6\x88\xad\x0f\x46\x2c\xb2\xbd\x58\xbf\x98\xe3\x6f\x30\x83\x6c\x9d\x61\x9d\x3f\x6f\x52\x91\xc8\x8e\x6a\x4e\x07\x83\x69\x8e\x47\xe0\xc4\x37\x93\x9e\xad\x0d\x31\x56\xa2\xc4\xf0\x98\x1f\xb7\x01\x25\x52\xe5\x9b\xc6\xf2\xd4\xab\xc9\x0b\x64\x63\x6f\x2d\x4f\x45\x91\xdf\x2d\xdf\xde\x61\xb5\xff\x76\x0e\x73\x78\xb4\x46\xe7\x21\xb3\x4b\xd9\xee\x4e\x92\xfe\xe0\xe5\xcc\x87\x50\x19\x26\x1e\x34\xb7\x4c\x86\x7e\x47\x47\xc2\x9c\x4e\xfb\xdc\xcf\x82\xd4\x1d\x1b\x4b\x87\x00\xd7\x21\x39\x6f\x57\x7b\x46\x91\x53\xec\x3e\x06\xc7\x84\xc6\x02\x48\x5a\x69\xb4\x3b\xcb\xd3\x72\x86\xc0\xd6\xa9\x85\xda\x0b\x43\xed\xd3\xee\x41\xef\x3a\x7d\xcc\xe1\xc7\x56\x23\xc8\x27\x8b\xe7\x08\x9f\x68\xd6\xd6\xe0\x97\x9c\xcc\xd7\x83\x00\x14\x1c\xe5\xff\xae\x08\xdd\x3f\x44\x2b\xf9\x35\x3f\x69\x98\x5a\x3b\xc3\xcd\x6c\xc8\xdb\x35\xfb\x14\x8c\x34\x7d\x65\x1b\x16\x10\x23\x41\x1f\x87\x7f\xea\x1c\x6d\xc2\xd4\x38\x27\xe1\x58\x38\x85\xa5\x21\x47\xd4\x0f\x62\xd6\xbb\x3a\xe9\xdd\xce\x76\xb1\x5f\xbd\xa8\x22\xa0\xae\x8b\x73\xa4\x1e\x04\x4c\xfe\xdf\x68\xc6\xc7\xef\x84\xc2\xef\x81\x30\xdf\x89\xb1\x3a\x02\xb7\x56\x2e\x01\xe3\xee\x08\x06\xab\xe9\x6a\x36\xa3\x8d\x81\x4e\xdf\x8b\x1a\x05\x24\x51\x8a\x31\xd4\x98\xe1\x87\xde\x6d\xf9\xd7\x2e\x9b\xd8\x44\x35\xd7\xb9\x43\xc3\x3b\xdc\x4f\x1c\xa7\x8d\xc9\x11\xda\xef\x76\x82\x5b\x30\x43\x7f\x9d\xcb\x30\xc8\xfd\x0f\x88\x5e\xa9\xa5\x9e\x7d\xd5\x55\x38\x5d\xdd\x59\x32\xc3\x97\x57\xfc\x75\x95\x7a\x21\x22\xb1\x88\x77\x3a\xa7\x72\xfe\xf3\xa9\x90\x9b\xe9\x73\x07\x3a\x7b\x95\x1f\xa4\xeb\x79\x2f\x27\xac\x6f\x75\x50\xf4\x8b\xcb\x8d\x88\xc8\x86\x5f\xc9\x9f\xf2\x04\x1c\x68\xb8\xc0\x0e\x57\xa3\xc7\x26\x19\x9b\x7e\xe4\xb6\x45\x3d\x35\x52\x01\xa1\xae\xd7\x83\x80\x13\xd7\xa6\x4c\xe9\xbf\xda\x91\xd6\xa2\x02\x2c\xb3\xf1\x31\x31\x44\x04\x01\xef\xe2\xbf\x79\x41\xcb\x1a\xd6\xf8\x9c\x04\x80\xe6\x51\xc7\x2b\x13\xde\x56\xa4\xdf\xf8\xa5\xd7\x19\x56\xae\x2e\x3e\x35\x69\x92\x74\x87\x8b\xeb\x77\x5f\xdd\x52\x28\x52\xfb\x6e\xe4\xb4\xf8\x78\xac\x45\xc9\x8b\x32\x2e\x39\xef\xe3\x6f\x6f\x84\xf0\x29\x51\xdc\x9c\x9d\xed\x18\xff\x8e\x55\x5a\x53\x99\x24\x2a\x38\x2e\xa1\x7b\xf7\x11\x4c\x32\x73\xc9\xab\x27\x74\xb9\xe4\xff\x47\xdd\x5f\x7f\xc5\xf9\xef\x59\xa2\xf8\x03\x05\x14\x6e\x81\xe0\x16\x20\x78\xf0\xe0\x50\x24\xc1\x42\x08\x84\xe0\x16\x08\x0e\xc1\xad\x70\x0b\xee\x10\x20\xb8\x5b\xb0\x40\x70\x77\x87\xc2\x49\x70\x28\x9c\x40\xaa\xd0\xc2\xbf\xab\xcf\xe9\xd3\x73\xa6\xbf\x33\xdd\xd3\xd3\x9f\x7b\xd7\xba\x3f\xec\x3f\xe0\x59\xcf\x7b\xbd\x7c\xef\x5d\x9c\xdb\x13\xf8\xf6\x1f\x7a\x27\x15\x07\x91\xba\xe1\x80\xb3\x52\x2e\xf8\x51\xe4\xb6\x8f\x26\x5c\x59\x86\x48\x8f\xae\x9a\x2c\x95\x27\x90\x5a\xd0\xc4\x25\xd3\xd9\x7f\xc2\x36\x07\xb9\x1b\x57\x54\x7b\x72\x56\x49\xca\xd2\xda\xd2\x82\x1f\xb9\x77\xcb\x44\x17\xc7\x60\x24\x55\x4e\x24\x8b\xf2\x70\xab\x7a\xcd\xdb\xa6\xae\xa5\x90\xe0\xd9\x18\xc7\x89\x76\xc9\x4c\x86\xa6\x7e\xb9\x59\x7f\x3e\x37\x23\xfb\x88\x1d\xd2\x0d\xfe\x75\xda\x76\x13\x38\x1b\xed\xd2\x6f\x06\x0d\xee\xa3\x17\x9d\xcf\x6f\xa9\x99\xe1\xf9\x63\x84\x9e\xa7\x3b\x26\xe1\xd3\xcf\xa9\x30\x0a\x03\xb2\x7d\x6d\x17\xb9\x7d\x98\x0b\x7e\xbd\x8a\x20\xcc\xb1\xcf\xe3\x6f\xbc\x34\xce\x99\x68\xd0\x9a\x66\xdd\x0b\x0a\x90\x36\xb5\xe3\xea\x5f\x2c\x09\x9b\x08\x5f\x24\x98\x2e\xde\x4e\xc0\x0f\x60\x97\x1f\x16\x1b\x06\xc5\x39\x78\xcd\x3d\x00\x9f\x33\x36\x89\x42\x2a\x19\xeb\x5a\xa6\x25\x9b\x10\xe8\x42\x4a\x4d\x84\x6b\xbd\x39\x23\x1d\xe1\x37\x42\x90\xbb\xee\x97\x8b\x7d\xf0\x1d\x35\xbf\x3a\xb4\x75\x3f\x1a\x54\x63\xa5\x82\xfb\xf7\x83\x1a\xfe\x5f\x8c\x4a\x22\x03\xa6\x18\xde\x66\xa6\x1e\x3e\xb4\x6e\xd5\x8e\xd3\x6e\x19\x2a\x46\x53\xf6\x3c\xc5\x0a\xea\x68\x12\x3a\xb4\x66\x96\xf5\x5a\x73\xb7\xfc\xc5\xb6\xe2\x3e\x29\x1e\xee\x43\xfb\x6c\x6c\x20\x0c\x06\x35\x5f\xdb\x91\xaa\x33\x18\xf1\x2d\x6f\x4b\xca\xf5\x84\x42\xc7\x64\xe0\x07\x01\xee\x14\x57\xaa\x6e\xd1\x6b\xef\x40\x08\xfd\x86\x9c\x09\xd4\xb2\x6f\x9e\x9e\x75\x26\xe5\x78\x44\xed\xc0\x2b\xfa\xa4\x64\x72\xfe\xe8\xef\x97\x3f\x39\x95\x3a\x0d\x05\xf9\x2b\x8b\x2c\xc5\x22\x29\x02\xdf\xd6\xd1\x35\x2e\x44\x85\xf3\xfe\xa5\x9e\xd3\x46\xc4\xa9\xb7\xc4\x4a\xdc\x51\x23\x1a\x6e\x94\x22\x8b\xb5\x41\xf4\x41\xed\xef\x4b\xab\x99\x90\x1f\x47\x37\x54\xc3\xc5\x2d\xca\x1f\xe9\x2e\xe9\x2e\x77\x26\x33\x51\x69\xf9\xae\x38\x83\xc1\xe0\xce\xe9\xf6\x8f\x38\x9f\x27\x43\xdf\x67\x46\x02\x57\x7f\xe0\x3c\x59\xf3\x09\x9b\x37\x2a\x2f\x06\xde\xd3\x4e\xf3\x41\x63\x05\x83\x27\x2f\xce\x2b\x79\x89\x7c\xd4\xe7\xce\xc2\xdf\xf9\x68\x16\x2b\x11\x94\x51\xc6\x9e\x60\x47\xc8\x4b\x3f\x00\x21\x0e\xb7\x8e\x75\x1f\x7e\xdb\x49\xbc\xb3\x75\x10\x5d\x5a\xa6\xad\x52\x70\xca\x86\x6e\x39\x1d\xe9\xd3\x13\xd4\x36\xcc\xdd\xb2\x9a\xd9\xe7\x86\x42\xd4\x48\x43\x64\xd5\x9c\xf6\x5c\x20\xf4\x0e\x70\x5e\x32\x5d\x68\xa3\xc6\x94\xbd\xeb\x68\x8a\x95\xcf\x8e\xc2\x5a\x97\x3a\x7f\x70\x5d\xe4\x65\x25\x23\x49\x49\x0f\x9e\x3d\x13\x04\x56\x09\x2d\xe9\x1b\x27\xed\x55\x59\x10\x1a\xfa\xcd\xc3\x53\x79\x7a\x9a\x15\xa8\x4d\x29\x36\x21\x40\xe4\xe0\x97\x7c\x24\xce\x31\x91\x86\x06\xd3\xc0\x0a\x10\xfa\xf7\x42\x3a\x7f\xcf\xac\xff\x11\x18\x5e\xb3\xe7\x12\x49\xa2\xfa\x8e\x18\x82\x96\xbf\x39\x8c\x0d\x51\xda\x77\x0d\x96\x09\x5b\x6e\xf8\x44\xdf\x3f\xaa\xc7\x3f\x18\xcb\x2d\x5b\xf4\x9f\xb0\xe5\x82\xbf\xb2\xb0\xc3\x9a\x60\x0a\x6c\xf1\x49\xd4\xa7\x03\xcf\x17\xa2\xa4\x63\x18\x42\x47\x28\x88\x1a\xb4\xb6\x68\x2f\x73\x89\x94\xff\x16\x6d\x92\x32\x91\x7f\x4d\x52\xfd\xfb\xae\x6c\xd6\x3e\x65\xa2\xc7\x7a\x79\xe3\x1d\xde\xa3\x78\x99\x2c\xbd\x2a\xff\x01\xed\xe1\x12\xd4\xc7\x0b\x0f\xfe\x10\x6c\xd9\x53\x42\x34\x98\x0d\x70\xa2\x8a\xb9\xc4\x16\xd9\xe6\x56\x66\xa3\x4d\x53\xa4\xf3\xf4\x6e\xf5\x12\xa3\x7a\x1d\x8b\x68\xbe\x7d\x7e\x05\xfd\x55\x2e\xbe\x93\xd1\x4b\x84\x11\x95\xd9\xcc\xf1\xb3\x55\xec\xcd\x58\x85\x9e\xdf\x94\x04\xb1\xa8\x7e\x6f\xd2\x2a\xe0\x7f\xa5\x47\xc5\x4c\xfc\x4d\x29\x17\x33\xff\x9b\x5c\xe9\x92\xb2\xeb\xc5\x28\x27\x55\xbc\x79\x92\x07\xa3\x46\xaa\xf6\xbb\x45\x7d\x25\xc9\xcf\xd8\x70\xf5\x31\xa5\x01\x4c\x40\x55\xce\xa5\x45\x24\xba\xae\xdd\xf1\xb5\x1d\x2b\x86\x02\x53\x74\xe6\x39\xf3\xcc\xac\xd6\x7a\xb6\x54\x1a\x37\x3f\x04\xe3\x92\x6f\xe9\xe9\x55\xa1\xc6\xbb\xd9\x9a\x2e\xf2\x09\x9b\x6c\x99\x49\xa1\x56\x8f\x74\x7d\x54\x26\xaf\x2c\x8d\x3d\xb7\x2f\xb8\xd2\x73\xad\x2f\x87\x84\x1d\x89\x6b\x3d\x63\xa3\x42\xd0\x8c\xf6\xeb\xd5\x6b\x88\x81\x69\xf5\xfb\x2b\x6d\x89\x8b\x4e\x1c\x3c\x72\x13\x09\x83\x72\x52\x9f\xce\x1f\x1b\x11\x5b\x5e\x8e\xd2\x5f\xd0\x16\x1f\x80\x9e\x83\x1f\x29\xe7\x8f\xb9\xb4\xf8\x86\x6e\xc8\x6a\xba\x07\xcb\xe0\x80\x76\x81\xee\xe1\xf3\x4b\xad\x08\xc7\x5a\x26\x79\x2a\x0c\x7a\xae\x9d\xea\x86\x8e\xa2\x82\xe5\xa5\xfd\x55\x86\x06\xad\x80\x94\xf4\x8f\xad\xe4\x10\x49\x7a\xa2\x92\x76\xd7\x0e\x10\x62\x7b\x37\xdc\xf5\x4c\xe4\x72\xda\x37\x9d\x4d\xc2\x24\xf6\xc3\x97\x7b\xd0\x9a\xd4\x1e\x68\xe9\x99\xa4\x4a\xe1\x12\xd6\xa9\x43\x2e\x7e\x01\x77\x87\xf1\xd0\xf5\x02\x83\x1b\x52\x40\xd7\x7e\x4c\xdc\xe2\xeb\x82\x52\x13\x1a\xe3\x47\x67\xec\xc3\x00\x71\xf7\xf2\x79\x69\xf4\x99\xa3\x2a\x7a\x6b\x96\x74\x43\x14\x2b\xd5\xfd\xfb\x09\x6f\x37\xfa\x81\xc6\xe9\xe9\x89\x01\x12\x5a\xe2\x81\x00\x47\xf4\x52\x40\x0d\x0c\x6e\x1d\xb8\x67\xfc\x91\xe8\x1d\x55\x3f\xc3\x33\x9b\x82\x43\x4a\x9e\x04\x78\x3f\x00\x7a\xb3\x28\xbb\x4d\xfd\x2c\x6d\x15\x2b\xde\x62\x6b\xfb\x27\xf6\xba\x3f\x52\xd4\xa1\x47\xfa\xd4\xbb\xe1\xae\xbe\x58\xfd\xd9\xd7\x17\xec\xbd\x8e\x65\x59\x63\x7d\xd7\x68\xc3\x55\xa0\x0d\x97\xbe\x96\xbb\x5b\x3e\x8a\x9f\x3a\x39\x59\x10\x16\xcb\xe0\x23\xd4\x24\xb8\x2e\x56\x8e\xe7\xc9\xdd\xd4\xbf\xbc\x29\x75\xfe\xc5\xc2\xec\x59\xb4\x6d\x7f\x4a\x87\xaf\xdd\x96\x25\x79\x06\xcd\xdc\x2f\xcb\xba\x61\x74\x5e\x96\x49\xdd\x95\xbc\x61\xe2\xda\x3f\x8f\xc6\xd2\xa2\xff\xa8\xfd\x7c\x43\xd7\x0e\x65\x63\xd8\x5d\x6c\xba\xf3\x73\x5f\x68\x73\x91\x9a\x8d\x1f\x40\xf4\xbc\x22\xae\x5e\xd4\x54\x8e\x7d\xeb\xb5\xe5\x8b\xbd\x2b\x65\xbb\xe0\x8a\xa7\xd9\x30\xbd\xae\x19\xfd\x94\x18\xdf\x52\xa6\x12\xb0\xfd\x97\xff\xff\x39\x40\xc0\x86\xb5\x29\xa2\x45\x54\x26\x46\x6b\xde\xf5\x01\x38\x52\x79\xba\x39\xf6\x7a\x8a\x4a\xad\xd4\x8d\x8d\xd3\x1f\x17\x71\x24\xd1\x7b\xa9\x75\xbd\x32\x1f\x23\x5d\xe3\x6d\x5a\xfa\xca\xa3\x9f\x45\x90\xb8\xaa\x19\xce\x4c\xf9\x34\x40\x6a\x6f\x22\x10\x2f\x11\x3d\xd6\x76\xd8\x47\x15\x6e\xa7\xda\x27\x5e\xb7\x4a\x8f\x18\x93\x85\xbf\xdc\x5e\x31\x48\x94\x07\x33\x06\x28\xbc\xcd\x72\x31\xd8\x8d\xaa\xe7\x25\xd9\x0b\x4f\x37\xec\xf8\x7e\x9d\x38\x91\xa7\xc7\xc1\xc7\xf2\xfe\xfe\x64\x7d\x1d\xde\xee\xf1\x00\x10\x9d\x51\x9e\xdd\x11\xe2\x2f\xb1\x08\x8a\x87\xa5\x52\x89\x99\x0e\x6f\x9d\x42\x88\xa1\xca\x5d\xc4\xd6\x2e\x51\xa3\xbd\xbb\x46\x22\x12\x71\x72\x2c\x2e\x81\x77\xb6\x53\x4c\x21\xa6\x6a\x00\x7d\xdd\x50\x82\x46\x36\x9f\xcd\x08\x9c\x0c\xc8\x35\x36\xfe\xc7\x1b\xd6\x78\xaf\x3f\x28\x69\x47\x1b\x49\xa5\x63\x1c\xbc\xac\x51\xa7\x06\x4e\xb4\xd5\x33\x5f\xe8\xed\x24\x26\xf0\x78\xc3\x7b\x17\xe1\xc2\x4e\x31\x5f\x1e\xfd\x4a\x71\x63\x41\xea\x47\x60\xe4\x59\xbb\xc4\xfb\xa0\xfb\xf1\x67\xa6\x09\xba\x74\x2f\xd1\x09\x94\x4b\x7f\x76\x97\xea\x2a\xdb\x39\x91\x2a\xd1\x46\x6a\x26\x87\xca\x92\x9f\x9e\xa5\xa6\x5f\x7e\xae\x8f\x8a\xc3\xdb\x5f\x88\xa0\xa6\xe2\x47\x4b\xcd\x49\x6e\x31\x36\x95\xd9\x9a\x04\x4f\x52\x88\x27\x57\xa6\x87\x35\x65\x8b\x26\x31\xda\xbb\xe3\x8a\xed\xcf\xe7\xd8\xfa\xdb\x79\x51\x2e\x8d\x25\x62\x8a\x4a\xbc\x75\xb4\xed\xad\xb7\xc3\xba\x56\xe1\x39\x27\x22\xb1\xd5\x7e\xd4\x8b\x1b\x84\xc8\xc3\xa5\x6a\x45\xbb\x9a\x5f\xe8\x2e\xa7\xaa\xac\x74\x78\xb6\xac\x98\xb0\x3c\xfa\x45\xeb\xa3\xbc\x94\xbc\x1c\xe0\x8d\x49\x46\xf8\x45\x0d\x9c\x73\xab\x87\xb8\xa5\x86\x85\xe8\xb9\x47\xba\x67\x4f\xb5\x0d\xa5\x13\xea\xfa\x42\x8f\x45\xcb\xd7\x88\x84\x7f\x9e\x77\xe2\x2d\xbd\xc1\x59\xfd\x46\x7e\xda\x3d\x74\x68\xa8\x79\x9e\x29\x72\xe1\xbc\xb8\x2c\x5f\x2b\xf7\xe4\xc8\xcc\xa4\x9b\x7c\x2b\x1b\x57\x01\x11\x17\xe3\x26\x43\xa4\x8c\x91\xd0\xcf\x95\x66\xb7\xc5\x13\xc2\xb5\x87\x26\x63\xf4\x05\xad\x13\x19\xab\x19\xd7\x75\x22\xdd\x63\x76\xfa\x22\x17\xc4\x16\x2f\xa7\x8b\x32\xc7\x53\x58\x3f\x24\x33\xce\xfd\xbd\x87\x46\x29\x13\xe3\xcc\x40\x29\x6c\x52\x66\x68\x7d\x8d\xd9\x92\x96\xe3\x91\x79\x48\xb9\xfc\xd2\x9f\x88\x0a\xf6\xe6\xde\x6d\xdf\xef\x71\xed\xf3\x16\x9e\xda\xaf\x6d\x0d\xec\x78\x4c\x92\xc1\x10\xfa\x0f\xc8\xda\xb9\xfe\xfb\x04\x3e\xdc\xd1\x14\x06\x3e\x30\xed\xe9\xd2\xb2\xf6\x37\xa8\x9e\xce\xf6\x64\xa5\xde\x93\x8a\x0e\xbd\xe8\x32\x78\xa0\x01\xd1\x20\x06\xc3\x4f\xf7\xb7\x23\xb8\xdc\x25\x92\x66\x67\x43\x47\xf7\xe4\x0b\x3e\x32\xaf\x54\x71\x75\xb9\x3f\x85\xf8\xd4\x5c\x7a\xa9\x81\xb5\xff\xeb\xa3\x80\xaf\xb9\x44\x42\xa8\xb1\x1a\x99\xd0\xa3\x4b\xcb\x31\xdd\x60\x46\x5c\x55\xe6\x65\xd7\x62\x1f\x06\x05\x15\xb4\xd9\xaa\xb9\xd3\x0c\x0c\x7f\xe2\x52\x3f\x61\x18\xb5\xd5\x05\x53\x63\x39\x4e\x04\x61\x7b\x53\x79\x27\x36\xf3\xd2\x86\xe8\x30\xd8\xfd\x82\x5b\xd9\x92\x4d\xca\x0a\x34\xb5\x6f\xcd\xff\xaf\xf1\x19\x2b\x92\xfd\x2f\x39\xe8\x23\xdf\x79\x00\x1e\x27\x67\xbc\x74\x4e\xb8\x8a\x2e\x5d\xe3\xe0\x89\xab\xa6\xd5\x2e\xc8\xae\xdf\xf9\x40\x49\xef\xf0\xdb\x5c\x51\x4b\xcb\x74\x4e\x4b\xa5\x54\xe1\x46\x67\x6b\x12\xb3\xf3\xf3\x41\xd4\xfa\x21\x4f\xab\xdf\xfe\xbd\xdb\xde\x8b\xb6\x99\x0d\x42\xff\x0d\x92\xc6\x6e\xd0\x8e\x24\x00\xdd\x2d\x11\xde\x37\x76\x82\xe0\xfd\x4f\x1f\x4d\x55\x9a\xbe\xc9\xb2\xd2\xdc\xb5\x34\x3c\x9c\x8b\x63\x23\xf6\x15\x1b\x26\x1c\xe8\x0f\x57\x79\x02\xf3\x62\xb9\xf7\xf9\xd6\x1a\xf9\x0a\xa7\xeb\x9c\xed\x7b\xd5\xeb\xd3\x4d\x82\xfb\x46\x13\x62\xc4\x45\x86\x64\xed\x44\xbf\x72\x32\x93\x29\xa8\x99\x1b\x60\x7c\x00\xf4\x00\xd8\x94\x7d\x61\x14\xfc\x59\x09\xc5\xd7\x37\x16\xc4\x8e\x6f\x7d\xc5\xaa\x55\xe6\xde\xc3\xa6\x8e\xe3\xf3\xa5\x4d\x99\x6d\xe1\xe0\xd8\xf3\xf5\x74\xd6\xbb\xcb\xb0\x0e\xee\x36\xf1\xb6\x61\x96\x54\xdf\xb9\x08\x90\x94\xf8\x29\x4a\xbb\xd3\x41\xb7\xe2\xeb\xa3\x5e\x5e\x99\xd7\xc0\x55\x86\x0a\xd2\xa0\xe3\xf1\xdc\x1f\x1e\xf5\x6e\x8b\xcc\xd1\x76\x2d\xac\x2b\x7f\x88\xaf\x84\xb6\xad\xc5\xaa\x08\x32\x53\xf1\xe9\x44\x96\xd9\x68\x3c\xe9\x8b\x98\x9c\xde\x44\xa9\x18\x97\x74\xac\x08\x73\x70\xdf\xcd\xa1\x77\xb8\xf9\xc9\xdc\xd7\xde\x5d\x2f\xcb\x4a\x6f\xf3\x94\xca\x42\xbd\x17\xcc\x22\x0d\x43\xef\xa3\xa9\x80\xc1\x43\x08\xfd\x23\xb8\x03\xc6\x78\xfe\x4a\x2f\xf7\xe9\xb0\x73\x2c\x48\x50\xc2\x2c\x48\xf0\x30\xc9\x50\xa1\x97\x86\x4e\xea\x7e\xce\x5a\x38\x13\x6b\x07\xcc\x6a\xc1\x95\x38\xa2\xb4\x9b\xde\x88\xe4\x35\x9c\xae\x1f\xa5\xb2\x73\xfd\x22\x92\x3a\x45\x94\xad\xf3\x71\x99\xd9\xe8\x01\x10\x79\xbd\xe9\x43\xe3\x5d\x91\x25\x5b\x30\x43\xa5\xae\x5c\xf8\x62\xe2\x37\x18\xaf\x7b\x40\x76\x37\x12\x38\x3b\x12\x18\x99\x5f\xe8\xf7\x9a\x4f\x67\x86\x34\x72\xfe\x78\x46\x01\xc2\xb0\x93\x29\xad\xf0\xa5\xd1\x9f\x6e\x63\xaa\x32\x7a\xe9\x5f\xfa\x55\xf5\x16\x99\x1c\x41\xe7\x55\xca\xdc\x59\x6f\x41\x23\xf3\xc8\xfa\x9e\x7f\x46\x58\x4a\xeb\xe2\x69\xa8\xf6\x8d\xb4\xa9\x41\x3c\xa1\x22\xc6\xba\xa5\xcc\xeb\xc9\x79\xd7\x15\xce\x0f\xf4\xb2\x3c\xbf\xf1\x58\x62\xbb\x65\x93\x58\x4c\x41\x94\x68\x4e\x0b\xb3\xe9\xc0\xaa\x7f\xf8\xa5\x5e\x61\x10\x2f\xa1\xd5\x82\x5e\x50\xce\x17\x03\x53\x33\x89\x8e\x8e\x64\xa9\xce\xe0\x5b\x85\x8a\xa1\x69\xdb\x96\xdb\x72\x8c\xcf\x3f\xf4\xf4\x88\xb8\xd1\xee\x56\x56\x9c\xee\x85\xa7\xa2\x2a\x05\x5f\xce\xdc\x0e\xef\x04\x2d\x92\x4f\x08\x86\xd0\xb7\x73\x3d\x55\x8d\xec\xa0\xfe\x4c\x42\x37\x36\xc3\x67\x10\x12\x89\x25\xd1\x91\xa9\x86\x15\x9a\xb3\x4e\x44\xb4\xff\xec\x69\xfd\xcc\x86\x2e\x45\xfc\x6f\x3c\x92\x33\x36\xd1\x2a\x05\x59\x8d\x19\x3f\x4e\x9b\xf9\x02\x6f\xcf\x9f\x09\xca\x0c\x2d\xfc\xd9\x52\xb5\x36\xb7\x39\x8f\x84\x69\xb6\xd9\x14\x10\x1d\x45\xce\xcd\x1b\xcb\x18\xea\x52\x9e\x55\x46\x37\xef\x9a\xc3\x06\x17\xed\xf3\x4a\xf5\x47\x09\xfa\x4a\x8b\x72\x0d\xf8\x8d\x14\xcf\xce\x06\x5f\x2e\x06\x48\x4d\x11\x6a\xbc\xff\x46\x63\x79\xca\xf8\xfe\xe8\xbd\x1a\x9a\x6e\xcb\x71\x1e\x7d\x6a\xfe\xca\xca\x90\x1a\x36\x9c\xc5\xc1\x31\x20\xbb\x97\x2d\x50\x4f\x73\x47\x86\x5c\xf8\x01\x60\xb2\x73\x2d\x55\x74\xf7\xd0\x4a\x13\x21\x67\xf2\x76\x65\x0e\x0e\x4e\x07\xb6\x24\xc9\x89\x67\x25\x65\xf1\x02\x6e\xf0\xd2\xb4\x09\x29\x4b\xec\x9b\xa4\x22\xcf\xfa\xbd\xc7\xb0\x49\x59\xdf\x4d\xe2\xae\xdf\x62\x16\xbf\x24\x93\x37\x56\x1d\x71\x7f\xf2\x7d\x03\xf8\x8d\x43\xbe\x16\x9b\xf9\xf7\xce\x5d\x9b\x1c\x5e\x8d\xff\x00\xd8\xfc\xa2\x39\x7c\x31\x65\xf3\x7c\x44\x8f\x42\x7e\x40\xd5\x80\xe1\x5d\x3c\x57\x7d\xc5\x8a\xbb\x2c\x56\x94\x27\x87\xc4\x8b\x17\xe3\x39\x6f\x70\x01\xa4\x0c\xb6\xee\x70\x05\x34\xd2\x5a\x58\xdf\x33\x66\x5e\xc6\x77\x67\x7d\x30\x5b\x14\x84\xa8\x36\x68\x6f\x8f\x7b\x31\x65\xcf\x4b\x25\xf0\xfd\x15\xac\xce\x69\xd2\xa2\xed\x66\x23\x24\xa6\x75\x31\xeb\x35\x16\xef\x6e\x83\x60\xd7\x80\x84\x1d\x28\x6e\x6c\xc1\x14\xae\x1f\x12\xdc\x9d\xfe\x25\xd1\x01\xfb\x3b\xed\x6f\x46\x86\xb1\x49\x30\x8d\x25\xb2\xa5\xc7\x35\x51\xbf\x9d\xf3\x9e\x32\x51\x25\x86\xc5\x7a\xe7\xa9\xff\x2a\xf9\xa4\xf5\x1a\x85\x24\xaf\x9b\x60\xd7\xc2\xbd\xac\x91\x87\x01\x53\x8c\xea\x64\xfa\x86\x1f\x19\x25\xb7\x24\x6b\xe9\x87\x03\x34\xad\x9f\x6f\x26\x74\x43\xdf\x62\x89\x5f\x2f\xc8\x3d\x00\x38\x0f\x40\xa0\xc3\x32\x4b\xaa\xfb\x78\x26\xbe\x32\xa1\x8c\x64\x24\x70\x00\xee\x27\xc2\x31\xe3\x58\xe0\xee\xf5\x72\xb8\x1c\xd4\xab\x95\x7e\x82\xd2\xa9\x88\x16\x6e\xe5\x29\x85\xb0\x4d\x50\x0e\x53\xad\x5f\xee\xf9\x73\xf6\x37\xd4\x21\x0c\xc7\x1b\x3e\x36\x4e\xeb\x71\x48\x3d\x16\x20\xf2\x47\x94\xf8\x7f\x84\x3e\x9d\x17\x63\xbb\xa1\x4f\xa6\x4e\x19\x4d\x0c\xc7\x52\x60\xd8\x3d\x84\x3c\xde\x45\xd5\xac\xdf\x78\x4a\x36\xcc\x57\xae\x3c\x00\xfb\x5f\x9f\xc9\xf0\x61\x97\xd5\x39\x44\x88\x3f\x6e\x2d\x8f\x11\x1f\xd0\x35\x92\x67\xe0\xba\xe2\x26\xbb\x1c\x70\x1a\x84\xbf\xd3\xdd\xcf\x66\x58\xd5\xea\xc1\x23\x77\x3b\xa8\x79\xb2\x8b\xec\x77\x6c\x71\x1d\xeb\x7c\x5c\x55\x69\x6c\x4a\xf8\x4b\x96\xf5\xad\xe6\x40\xf7\x80\x84\xc7\xed\x1e\x68\x59\x76\x28\x3f\x8d\x64\x04\x7f\x66\x0f\x60\x8e\x44\xaa\xc6\x50\x2b\x2f\xc1\x2c\x2b\xf4\xab\x3e\x38\xaa\xa3\x9b\x05\x95\x30\x83\x67\x4f\xb8\x16\x0f\x43\x50\x45\x56\x0b\x46\x64\x4e\x24\xe8\xe6\x09\xaf\x9f\x3b\xc5\x0e\x66\x2f\x3f\x82\xd0\x3b\x5e\xff\xb9\x65\x73\xd1\xd9\x7f\xae\x3f\x8f\xa9\x72\xf9\x2a\x70\x98\x31\x40\x86\x48\xcd\xf6\xa7\xa4\x54\xb1\x5c\x89\x4e\x3f\x86\x31\xe7\x40\x9e\x36\x7d\xf2\xc6\x03\x40\x50\x52\x57\x87\x0c\x19\xaf\x1d\x11\x94\xf4\x9e\x04\xb5\x76\x8e\xe1\x9c\x0f\x4b\xb5\x6a\x4f\xba\x53\x9e\xdc\x29\xe6\xe2\xf5\x16\xfd\x4b\x90\x75\x5a\x15\x42\x48\x1a\x71\x3c\xbf\xc4\x73\x62\xad\x9f\xab\x79\x2a\x46\x7c\x7a\x7b\x58\x93\x1f\x20\xb9\xd6\xc3\x80\xb7\x31\xcd\x2a\xb2\xd8\x36\xf0\x00\xbc\x63\x55\x4c\x7f\xd9\x6a\x65\x14\x60\x79\xb5\x50\xc0\x89\x61\xc0\xbe\x99\x25\x07\x78\xfe\xe9\x8f\x52\xad\x87\x3a\x3f\x5e\x69\x1c\xcd\x72\xfa\x82\x41\x0a\xdd\x95\x02\xa3\xe6\x3e\x7c\x16\x99\x1e\x2f\x50\x01\xd9\x59\x6d\x7c\xf9\x46\xde\x05\x78\x01\x12\xda\xca\xf0\x1b\x7e\xcf\xf5\x9b\x6d\xfe\xab\x0c\x6d\xe8\x87\x92\x92\xbc\xcb\xaa\x47\xeb\xb3\xcd\xde\x43\x9b\x16\x7c\x55\x93\x68\x74\x52\xed\x32\x9c\xc0\x05\xe7\xbf\x0d\xb9\x4b\xed\xed\xf3\x7e\x34\x7a\xee\x3a\xd1\x2a\x0a\x8c\x79\xab\x61\xcc\x6a\xea\xf3\xbc\x58\x52\xfb\xac\x6c\xc7\x39\x14\x96\x07\x16\x3a\x5c\x1a\x12\xba\x51\xb2\x3f\x2e\xd2\xc9\x8d\x50\x96\x68\x84\x60\x02\x3a\xf9\x65\xd6\x8b\x95\x29\x95\x40\xfa\xc0\x8e\x18\x5c\x6a\x72\xa7\x6a\xf2\x3f\xdd\xfb\x11\x51\xa0\xb6\xa1\x93\x4a\x45\x03\x55\x5f\x59\xd3\x92\x82\xfc\x9a\x84\x97\x7c\x44\xea\x6c\x1d\x70\x74\xc3\x0c\x24\x18\x3f\xf2\xcf\x08\x77\xf9\x98\x6b\xc5\xf5\x3d\x17\x79\x36\x75\x65\xa4\xf4\x86\x24\x29\xc7\x48\x6c\xf0\x49\xbb\x60\xd7\x54\x9b\xdf\xe3\x1a\x6d\x31\x13\xd2\x13\xc1\xfd\x3f\xe3\x80\x6b\xdd\x3b\x39\x80\x09\x3d\x25\xda\x22\x12\x78\x7b\x56\xf7\x17\xf5\x16\x8e\xfe\x8f\x78\x9e\x36\x4f\xa3\x69\xfa\xb3\xba\xec\x88\x8b\xaa\x17\x1c\x28\xde\xcb\xb7\xd6\x3a\x72\x65\x23\x7d\x2b\xdb\xef\x83\x25\xdf\x1f\xb3\x63\xfd\xe6\x3c\xde\x3f\x0a\x86\xd0\x8a\x74\x97\x07\x3e\xcd\x70\x23\xcd\x94\x4f\x22\x8e\x6a\xab\x61\x88\xa8\xd6\x03\x33\x57\x42\x15\x7a\x08\xde\xe8\xdb\x52\x87\xa6\xb1\x7c\xfe\xf8\x42\x53\x8a\xcf\x29\x7a\xa1\x65\xc0\x39\xe0\x7a\x12\xb4\x97\x9f\x44\x99\x8b\x99\x1f\x19\xeb\x6e\x16\xf2\x8b\xb8\x15\x2d\xbe\xa0\x1d\xd0\x9e\x15\x96\x50\x11\x58\x29\x6e\x49\x63\x96\xa3\x62\x49\x5f\xaf\xee\xe0\xb3\x4e\x98\xe0\xa9\x3b\xc4\x6b\x3d\x0c\x5a\x7a\x21\x0f\x96\x59\x38\xab\x16\x9f\xc3\x58\x65\x41\x56\x9e\xd1\x33\xcd\x9a\xd5\xd4\xcb\x3f\x15\x76\x7f\x77\xb2\x9b\x90\x9d\x55\x5e\xf3\x03\xc9\x10\xec\x23\xf4\x78\x95\x81\x77\x0c\xc6\x8b\xef\x1d\x31\xe8\xdc\xa5\x86\xd1\x68\xc4\x8a\xdc\xa9\xd8\xae\x6b\xa7\xaa\x80\xcb\xb8\x2e\x93\x1b\xf8\xca\x0e\xcb\x94\xc0\xdf\xc4\xf5\xf8\xb1\xb4\xa7\x15\x2e\x48\x2a\xbe\xe6\x63\xca\x8f\x64\xa5\xa2\x6b\x66\xbe\xd6\x80\x6f\x32\x1b\xa5\x52\x6b\x25\xf8\x3b\x7e\x43\x53\xc2\x60\xe0\x62\x80\xb8\xfc\xd1\xdd\xcf\x85\xc2\xfa\x6a\xeb\xd2\x63\x36\x66\x78\x0a\x65\x0e\x36\x98\xc7\x96\xf6\x07\xfc\xb3\x00\x03\x71\x85\x20\x1f\x56\xfa\x9b\xc6\xa8\x31\x82\xa6\xab\x69\x8a\x8f\x6b\xc7\xd7\xf7\xe4\xe6\x92\x16\x0b\x66\xb2\x1b\x77\x84\xc7\x48\x72\x05\xd8\xf6\x95\x62\xf3\xd1\xa9\xe9\x59\xa5\x14\xf3\x46\x55\x94\x29\x8b\xc7\xa3\xbe\xcb\x54\xc8\xee\x44\xf3\xc7\x5d\x99\x97\x5d\x55\x23\x12\x3a\xf9\x06\x9c\x68\x67\x64\x68\xa7\x97\x31\xb7\xc2\xe5\xc3\xf6\xd9\x4f\x5a\x6a\x62\x09\xde\x3e\x27\xfc\x18\x9e\xaa\x2e\x7a\x68\x68\x19\xd2\xc1\x61\x75\x49\xad\x14\x79\x8d\x34\x69\x8a\x78\x91\x6c\x9a\x38\x48\xd7\xb4\x3b\x43\x59\xfd\x6a\x9e\x27\x3f\xfd\x57\xaf\x29\xe5\x2d\xd7\x58\xbd\x03\x16\x54\xdd\x9d\x42\x64\x7a\xa9\xfb\x99\xcb\x67\x26\x65\xe4\xfe\x7c\x80\xa8\x04\xcf\xb3\x0f\x74\x3e\xb2\xb3\x0e\x4f\xda\x5b\x23\x47\x9d\x70\x18\x59\x9e\x4b\x61\x79\xe1\x9e\x1f\x51\x6c\x14\x07\x5a\xdb\x44\x09\x27\x2e\x37\xaa\x2f\x50\x39\xab\x56\x0b\x07\x16\xd8\x64\x53\x20\x56\x87\x2a\x8c\xb4\x78\x53\x00\x7c\x7b\x99\x58\xa9\x72\x7b\x78\xbf\x1f\x63\x13\x5a\x9d\x2f\xce\x56\x48\xa8\xe6\x8e\x84\xb3\x74\x1a\x19\x9a\xed\x80\x97\x4a\x7b\x75\x30\xaf\xdd\x6f\x46\x45\xac\x31\x22\x1e\xcd\x17\xb1\xbb\xf5\xd0\xb5\xe0\x7a\x51\xed\xbe\xe7\xe8\x62\x06\xd8\x3f\x07\xd4\xb2\x73\x63\x0b\x63\xc5\x77\xa7\xdb\xe9\x2f\x15\x91\x39\xe1\x76\xba\xc2\x34\x87\xde\x94\x13\xe0\x64\xd2\x44\x4a\xe3\x5d\xc9\x9b\x85\x98\x35\x2b\x8e\x7c\x54\xba\xbe\x28\x6f\x92\x5b\xd3\x29\x96\xb2\xa3\x02\x0b\x2d\xd1\x36\x84\x3e\x15\xde\x49\x65\xfd\x6c\xbe\xc5\xb7\x6e\x9f\xe5\x62\x01\xfb\x18\xc0\x70\x1b\x40\x93\xba\x4f\x36\x1d\x7c\xbe\x40\x44\xd0\x90\xf7\x49\x93\x36\xbf\x33\x8d\x8d\xf3\x33\xc9\x9e\x80\x8c\xf8\xae\x64\x27\x8e\x21\xea\x99\x77\xca\x0d\xe9\x01\x77\x0c\xe3\x1a\xe3\x5a\xe7\x12\x1b\xf3\x62\xd1\xac\x34\xa3\xb5\xb6\x34\xf6\x8f\x20\xe5\x66\xbf\xd9\x56\xad\x57\x6f\x89\x18\xd4\x64\xf7\x21\x74\x25\xa1\x7e\x0c\x8b\x07\x24\x4b\x07\xe9\xe3\xdb\x13\x45\x2e\x4f\xca\x37\x2d\xa5\xf5\xb2\xdb\x78\x51\x0b\x79\x8b\x7b\xf3\xcf\xad\x1e\xd3\x58\x15\x30\xfc\x66\x24\xdf\xbe\x66\xe8\x97\x22\xed\x55\x6e\xf8\x11\x7c\xd4\x98\x8a\x47\x1d\x50\x46\xaf\xdb\x3c\xf8\x3e\x50\x7d\xc5\xc7\xa0\x2d\xd1\x35\xee\xed\xe4\x33\xd6\x65\x08\x4d\x06\x5b\x89\x24\x3b\x73\x5c\x25\xe0\x55\x92\x40\xca\x86\x17\x18\xed\x5a\xfd\x14\x95\x6b\x57\x71\x7e\x47\xea\xea\x78\x29\x40\x1a\xf4\x88\xfe\xae\x97\x39\xe1\x14\xdf\x2d\xcf\x47\x0e\x89\xa7\x97\xb2\x8a\x2d\x84\x34\x66\x65\xf3\x19\xa0\x0d\x68\xa2\x3d\x79\x4b\x24\x9d\x39\xd7\xfe\x68\xe3\x4d\xad\xcd\xda\x62\x07\xcb\x2c\xeb\xac\xbd\xec\x98\x2d\x33\x29\xf1\x1d\xf4\x0e\xc8\x25\x52\x99\xfe\x95\xde\x43\xba\xf2\x1a\x7f\xdd\xb4\xde\xb0\x74\x23\xc2\x24\xc2\xd4\x08\x3d\x1a\x37\x31\x80\xa9\xa5\x29\x76\x7e\x5e\x77\xdb\x38\x61\xa0\x28\x2d\xce\x98\x6b\x77\x29\x6a\x66\x33\x8e\x02\x56\xfa\xe3\xd1\xcd\x34\x63\x74\xd5\xa4\x06\x3e\xa1\xe2\xee\x02\x72\xb3\x9d\x68\x33\x27\x92\x75\xaa\xae\xa9\x92\x87\x15\x4f\xaa\x97\x78\x34\xc0\xf9\xab\x18\xed\x19\xec\x35\x0c\x65\x6d\x8c\x3b\xf2\x87\x34\x7c\x08\x3f\x87\x7d\xcf\x9f\xc8\x14\x42\x57\x1d\x7a\x36\x30\xf3\xfb\x49\xcc\xaf\x8c\x6d\x8c\xe3\x8f\x7d\x0c\x03\x2d\x68\x6f\xe4\x70\x73\x09\xbf\x5c\x03\xec\xf9\x69\xcc\x5f\x0c\x02\x73\x8a\x00\xe9\x66\x18\x2d\x8c\x4c\x9a\x68\xb6\x6d\xd7\x4c\xe1\x73\x9e\xb9\x4a\x9f\x65\x6c\xd6\xf5\xfc\x03\x90\xde\x24\x79\x56\xf5\x68\xb3\x72\x59\x79\x7d\x5f\x73\x87\x7f\xc0\x4c\xed\xb8\x1d\x02\x73\xf0\x1f\x09\x78\x82\x72\x33\xbb\x58\xa5\xae\x27\x95\x8c\xde\x7a\x94\x26\xca\x62\x39\xd3\x48\x3e\x89\x4a\x92\xbb\x5f\x9b\xac\x72\x9d\xde\x14\x14\x3f\xc2\x97\x95\x50\xad\xb6\x81\x21\xfa\x22\xb0\xe2\x6c\x19\x32\x9a\x2a\x6c\x87\xa5\xa0\x55\xd1\x06\xaf\x0e\xa4\xfd\x87\x26\xc1\xd1\xbb\x7a\x28\x17\xa6\x99\xdd\x99\xdd\x39\xd7\x30\xcc\xf1\x3e\x76\x65\xc6\xc1\x15\xe6\xdb\xf3\x6f\x46\xd4\x51\x6f\x90\x39\xb1\xac\xad\x37\xf8\x5c\xe6\xb4\xd2\x7a\xcc\x4b\x70\x3f\xcf\xdd\x68\x33\xff\x10\xf7\x07\x80\xd4\x07\xc2\xed\xfa\xf5\x88\x67\xcc\xce\xcd\xef\xfe\x05\x97\x88\xa8\x94\x2a\xed\x8d\xfb\xe1\xac\xd6\x60\x80\x10\xbb\x50\x0c\x35\xfb\x9c\x46\xa7\x7a\x17\x7e\xe6\x29\x84\x64\x10\x01\xeb\x2d\x7d\x95\xf3\x6b\x32\xa6\xd3\x4d\x1e\x42\xbe\xeb\x4f\x5c\x57\x8d\xb5\x27\x80\x63\x3e\xb3\xe9\xb9\xc5\xda\xf6\x7d\xfc\x34\x07\x82\xf6\xc7\xe8\xd0\x45\xe0\x25\x48\x90\x18\xa0\x5d\x88\x8c\xd2\x77\xa0\x40\xfd\x5e\x1b\x22\xf9\x5d\xa1\x53\x68\x33\x3a\x77\x3a\x2c\x79\x3a\x74\x08\xa1\x65\x0b\x73\xc3\x33\x14\x31\x8c\xd3\x4c\xb2\x48\xdd\x0e\x6e\x98\x9e\xc7\xf2\x70\x3b\xa6\x8a\x9b\x6e\xed\x04\xba\xdd\xca\x51\x27\x0f\x80\x61\xfa\xbc\xce\xf4\x8b\xd5\x77\xd0\x86\x0d\x67\x3e\x31\x3a\xa7\x3f\x46\x09\x8f\xd3\x8a\x1e\x2f\xdb\xe5\xb2\x51\xb2\xe4\x56\xd2\x58\xd4\x87\x7d\xc6\x6e\x5a\x37\x25\x43\xab\xc8\x71\x7d\xff\x2d\x7d\xf5\x15\xf8\x99\xf8\x66\xe1\x8d\x01\xa3\x25\x74\x70\x3e\x80\x5b\xcb\xa8\xf1\x53\x63\x8a\x00\x44\xc9\xb0\x97\x29\x70\x8b\x64\x48\x58\xa8\xa5\xa8\xc5\xcc\x33\xaa\xc9\x1d\xf6\xba\x67\xee\x7c\x08\x1e\xd3\x61\xd2\x09\x94\xc2\x5e\x03\x57\x8d\x4a\x09\xae\x0e\x14\x5c\xe8\x65\x2e\x76\x65\x75\x66\xc8\x91\x9a\x41\x87\xc1\xe6\xea\x72\xa1\x32\x8c\x94\xd2\xf5\x5d\x4e\x02\x9f\x0c\xc9\x1c\x2b\x54\x32\x47\x72\xe8\x2f\x5e\x49\x58\x32\x94\xad\x94\xfc\x5c\x26\xcc\xec\x01\x80\xc4\xc9\xac\x90\xa1\x35\xff\x53\xa6\xc2\xf4\xfe\x29\xd7\x5f\xf8\x3d\x1e\xdb\x8d\x2b\xf8\x98\x6b\xc0\x8f\xfe\x00\x24\x8f\x0c\xcd\x2b\x5c\xfe\x7a\x62\xb6\x58\x28\x0d\x4f\xd8\xdf\x93\x49\xf6\xb6\x06\x55\x42\x79\xc3\xc9\xf6\x1f\x00\x92\x6a\xf3\xf4\x4d\xda\xc1\x27\x92\x1f\x5f\xf5\xf2\x49\x86\x60\x70\xc0\x9c\xae\xd4\xc0\xed\x1c\x23\xc1\xca\x9a\xae\x87\xc9\x6d\x33\xeb\x59\xd2\x87\xb9\x26\x5a\x7f\xe3\x98\x01\x55\x0e\x83\x22\xbc\x76\x1b\xde\xc1\xb4\xf2\xef\x99\xb0\xd5\xf8\xf1\x65\xcf\x06\xbd\xf6\xb9\x12\x50\x61\x34\x9d\xa1\xba\x41\x03\x2f\x5e\x57\xf8\x0c\x74\x1d\xc6\x36\xd3\xd7\xa1\xbd\xdc\x58\x69\xfc\x75\x36\xbf\x24\xde\xfc\x21\x3e\x57\x2d\xd7\x74\x7f\x0d\x29\xac\xbd\x79\x5c\x3a\xdf\x81\xe7\xad\x5e\x32\xd6\x96\x60\x0a\x00\x0a\x60\xc9\xdd\x92\xd7\xb3\x08\x82\xef\x2a\x4c\x16\xbf\xa8\x85\xc2\x76\x74\x26\x34\x9d\x06\xd0\x86\xe1\x91\xf0\x7b\x7e\x43\x65\xa7\x32\x6b\x2f\x8d\x77\xc7\xef\xd3\x44\x3f\xd1\xee\x82\x0e\xa7\x03\x84\xef\x49\xf6\x2f\xb5\xae\x5f\x1a\xac\xbc\x65\xf1\xfc\xce\x47\x86\x8f\x36\xf8\x6e\xbe\x5d\xa0\x39\x0e\x04\x31\x41\x6c\x7f\xfb\x82\xfb\x82\x10\x7c\x25\x3c\x33\x89\x26\xfb\x1f\xa6\x4b\x75\x06\x3d\x00\x29\x13\xfd\x2d\xaa\xda\xba\x62\xf8\x93\x46\x1e\xfe\x07\xd6\xeb\x1b\x17\xd4\x42\x39\x14\x9a\x37\x75\x94\x26\x58\x37\xd0\xee\x97\xbc\xc3\x40\xfd\x24\xc1\xa1\xae\x79\x9a\x7d\x45\xb7\x81\xf4\x00\xba\x7b\x52\xfd\x06\x31\xaf\xff\xb2\x61\xa8\xfb\x64\x50\xb5\x08\xb0\x7b\xb7\x56\x24\x44\xd0\x0e\xd6\x73\x03\xc8\xde\x29\xfd\x4b\xa3\x67\x19\x6b\xf5\xdf\xd6\xc4\x2d\x7d\x56\x95\x57\x17\xb8\x93\xad\x19\x2b\x4c\x65\xf1\x11\x20\x17\xab\xc6\x46\x75\x57\xaf\x18\x1e\xbc\xdb\xbb\x38\x69\x0a\xf6\x2a\x1f\x88\x94\x35\x5d\xde\x65\x8e\xeb\x9a\xc4\x1a\x8c\x96\xe6\xf9\x94\x71\x23\xd3\xcb\x43\xde\xb7\x9e\xc0\x8d\xe2\x66\xde\x9f\xf4\x98\xf0\x3a\xab\xa2\xb5\xa5\xe7\x9f\x55\x97\xf7\xfd\x78\xfb\x23\xae\xc9\x44\xed\xab\xf4\x16\x1a\x0a\xf7\xf0\x96\x07\x81\x50\xb6\xc3\x33\xec\x49\x78\xc1\xd7\x8d\x1e\xb0\x75\xf3\xfd\x01\x38\x5f\x28\xd1\xd9\x6b\xd0\xf3\x2d\x8d\xa4\x4c\x56\xd8\x9d\x60\x07\xed\xca\x60\x45\x8d\x33\x6f\x12\xd4\xae\x18\xd8\xf3\xb2\x8d\x8d\x85\x28\x27\x4a\x0d\xaa\x7a\x5d\xfb\xcd\x35\x42\x4a\x66\xb5\x63\x6f\xb5\xa6\xe1\x33\xd5\x75\xed\x5e\xab\x94\xdd\x41\xe6\xa4\xcd\x26\x5d\x30\x63\xdb\xd9\x33\x89\x9f\xc7\x67\x3f\x59\xe5\xb5\x08\x03\x10\xbe\xa5\x20\xbd\x48\xf6\x5c\xe0\xac\x70\x90\xb2\x28\x3f\x40\x52\x79\x13\x16\xfa\x24\xee\x7d\xfd\x1c\x9a\x61\x31\xc4\x40\x71\x90\xce\xf3\x70\x52\x5b\x77\xc3\x01\x7f\x8f\x5f\xfe\x99\xdd\xa7\x5c\x82\x27\xbb\x63\x03\x9b\xb2\x5b\xd1\xe9\x7b\xb7\x9a\x79\xfa\x87\x2d\xaf\x1a\x4e\x8d\x69\xcd\x44\xf2\xaa\xe9\x11\xc9\xf7\x75\xa9\x1e\x2d\xcf\xd3\x7c\xed\xb5\xa8\xb0\xaf\x9a\xcc\xa9\xba\xb9\x66\xd5\xc0\x8d\xbd\x76\xb6\x18\xde\x9a\xc4\x44\xb2\x8b\x79\x6d\x73\x9f\x84\x50\xaf\x52\x29\xf8\x5e\x75\x54\xad\x6b\xa3\x4b\x0a\x97\x8f\x33\x2b\x78\x56\x2e\x4b\x92\x1a\x53\x76\xb3\x90\x0f\xb1\x58\xd4\x99\x20\xb4\x22\x6c\x77\x94\xdc\x5f\x0d\xfd\x14\x4d\x0b\xa5\x58\xbb\xb5\x42\xdf\x5e\xe8\xc3\xf3\x67\x69\x48\x33\x75\xf1\xff\x59\xcb\xa1\x09\x2b\x56\xfc\xd6\xf3\x00\x0c\xe8\xd5\x0f\xf4\x85\xae\xa9\xd4\x33\xa7\x3a\x75\xa8\x76\x59\x44\xdc\xea\x6e\xf8\xa2\x63\x05\x71\x98\x3e\x15\x8c\x7b\xba\x22\xe0\xf2\xd3\xd8\x69\xdc\xc5\xa3\x93\xbc\xca\x72\xae\xa3\x3b\xcf\xaa\x76\x45\x7a\x1d\x94\xb9\x11\x56\x0d\x0a\xcc\xde\x09\x10\x61\x41\xf8\xe5\xb9\x57\xb4\x84\x36\xbb\x3c\x69\x54\xab\x18\x1d\x2c\x31\x78\xcf\x88\x90\x0e\xb6\xa6\x7c\x24\x31\x42\x86\x16\x51\xc2\xea\xd7\xc4\x46\x67\xfb\x58\x42\x35\xdc\x8f\xb1\xf9\x8b\x61\x65\x7d\x48\x79\xb4\x1d\xb7\x12\x3d\xdc\x7a\xc2\xaf\x38\xc7\x1c\x11\x79\x5e\x99\x4d\x73\xe4\xbc\x3d\xf9\x7d\xe8\x4d\x80\xa3\xcb\x84\x52\x2e\x41\x99\x70\x1c\xb6\x15\x71\xc2\x45\x94\xc1\x60\x4e\x32\xe1\x05\x9c\xd6\xe9\x9c\x21\xeb\xe3\xca\xad\x7a\x43\xb3\x7c\x18\xe4\xbb\x77\x79\x56\x89\x4d\x6d\xa3\xd1\x32\xe0\x72\xb5\x20\x6b\x82\x48\xea\x6d\x08\x15\x64\x6d\x5d\x26\xdb\xdf\x1d\xd2\xcf\x6e\x17\xd7\xd6\x2e\x41\x79\xa8\xcc\x68\xe0\xe9\x8b\x9a\x80\x6e\xc2\x31\x01\xe8\xef\xd4\x0f\x64\x6e\xb9\x18\x8f\x6b\x7e\xf5\x37\x26\x3c\x23\xae\xf9\x73\xcc\x15\x84\xa4\x08\x74\xb3\x25\xd0\xb4\x9c\xff\x63\xea\xfb\xd3\xfa\x29\xf7\x98\xd8\x1e\xd6\xc6\x07\x5d\x4f\x8e\xbb\x29\x5d\xf1\xc1\xb0\x4f\xe7\x6e\xe8\x56\x49\x8c\x76\x2b\x75\xa4\x0a\x25\xd3\x01\xd2\x86\x0d\x53\x92\x62\x0e\x9f\xa4\x7f\xf9\x59\x36\xa3\x5d\x5c\x71\x3e\xa7\x25\x14\xbf\x89\x1b\xf8\x66\xad\x6c\x82\x99\xbc\xec\xa1\xa7\x31\x2d\x2a\x16\xa4\xa9\xee\x4c\x04\x38\x45\xc7\x0d\xb6\xfb\x72\x58\x23\x76\x5f\x04\x89\xa9\x2b\x8b\x6e\x9d\xa6\x7e\x4a\x53\x13\x21\xca\xdd\xcc\x94\xa6\x41\x79\x71\xe4\x26\xe2\x91\x45\x0d\x33\x06\x7c\x0e\x50\xc8\xa3\x1b\x44\xa9\x81\xe9\x10\xb0\x9e\x86\xcb\xe7\xaa\x1e\xfe\xc5\x10\x83\x9c\x15\xc1\x01\x11\x4c\x49\x78\xc9\xeb\x73\x65\x3b\xce\xe9\xb9\x17\xfd\x0e\xd4\x68\x93\x9c\x01\x9c\xb6\xde\x3a\x95\x5f\x58\xf8\xbf\x31\x52\xa2\x29\xa0\x57\xa8\x61\x7c\xa4\x9c\xdd\x7a\xc6\xb1\x8c\x0e\xf6\x72\xca\x0f\xc0\xad\x2c\x35\x52\x28\xf9\x39\xea\xc6\xff\x44\xf4\xcb\x0f\x63\xb3\x75\xcd\xf4\x93\xb8\xc8\x55\xb6\x61\x15\xf4\xa9\xc0\xe4\xf0\x44\x47\x9d\x52\xae\x09\x2c\x85\x26\xd8\x06\x84\x56\x6a\xe5\x1a\x3a\x3a\xe0\x7c\xe0\x8c\x13\xed\x54\x5b\x81\x8b\x7d\x05\x81\x61\x58\x9e\x8f\x7b\x37\x84\x99\xd0\xb5\xa7\x8b\x0f\x90\xa7\xc9\xc3\x97\xef\x54\x1c\x3b\xb0\x10\x7d\xcf\x4f\x8b\x46\xf4\xda\x9c\xec\x86\x96\xe1\x65\x67\x80\x23\xd7\x2c\x33\xa4\x3c\x76\x16\xd8\xe8\x2a\xca\x8f\x04\x5e\x38\x0a\x1a\x79\xc3\x89\xc2\x47\x37\xee\x5e\x4b\x50\x56\xe2\x4f\x2b\x62\x0f\xfb\xe6\x3a\xe5\xec\x1b\x7d\x5e\x73\x5d\x88\x38\x48\xe9\x5c\x92\x21\xc3\x87\x12\xd1\x35\xf1\x26\x3a\x83\x5c\x1f\x00\xb1\x5c\x7c\xae\x23\xef\xc1\x1e\xeb\x2a\x73\xdd\x90\xb6\x60\xfe\x6f\x58\xd2\xed\x5f\x90\xb3\x1e\x47\x06\x1d\x65\xde\xf0\x18\x8b\x01\x5b\x79\x8b\x74\x0a\x87\x2c\x05\xa4\xd3\x4c\xb6\x82\x1f\xd7\x7e\x94\xdd\x13\x70\xe8\xf3\x14\x61\x36\xda\x60\x75\x82\xc7\xb3\x32\xa3\xf8\xa6\xd2\x41\x01\xd2\x56\x3f\xfc\x19\x7e\x2e\x15\xbe\xab\x80\x93\xe0\xdb\x1b\x78\xfa\xad\xde\xfa\xda\x7e\xe4\xf1\x18\x9c\x32\x60\xc6\x66\x83\x6e\x19\x56\x55\x15\xb0\x3b\x7a\xc2\xfc\x6d\xae\x89\xf7\x53\x76\xef\x75\x9f\x61\x1f\x46\xca\x16\x77\x37\xd2\x50\xc4\x66\xaa\x81\x47\x28\xbc\xe2\x22\x84\x65\xc8\xf5\x7b\xfd\x2c\xbc\xbf\x46\xf0\x07\x7d\x1d\x6c\x22\x3f\x1b\x0c\x35\x69\x09\x7b\x1d\xf0\x1a\xdb\x38\x20\x5e\x55\xb8\x6b\xdc\x9c\xe8\xf6\x59\x6d\x62\x5c\x32\x0f\x9a\x6c\x63\x90\x5f\xf3\x35\xd2\xa8\x15\xc3\x58\x3e\x0f\x02\xa8\x81\x99\xe1\x47\xaf\x77\x06\x7b\x29\x6a\xbb\x36\x58\x74\x60\xc2\x9b\x2d\xcf\xc3\xe0\x0a\x53\x3c\x85\x33\x6f\x9c\x98\xfc\x05\xa5\x70\x0e\xe7\xdb\x95\xe1\xdc\x89\x4b\x50\x71\xad\xcf\x96\xcf\xf2\xbe\x3b\x7a\x5d\xdc\x71\x3e\x00\xbd\xed\x8d\x46\x64\x3f\x12\xe2\x83\xb4\x59\x44\x0c\x26\xc1\x59\x0f\x80\xa9\x8f\xb2\xb7\xf1\x89\xa1\x5c\x2a\x68\x1b\x94\x70\xce\xbc\x7f\x3d\x27\xf0\x00\x90\x70\xef\xe8\x4c\xa4\xba\x71\x17\xc4\x1c\x74\xe5\xd1\x81\xfd\x07\x3a\xc2\x15\x99\x07\xd0\xa3\xdf\xdf\x8f\xd3\x03\x8b\xa2\xb9\x44\x38\x3f\x3a\x51\x5f\xa6\x28\xb7\x11\x67\xac\x69\x50\x9e\xa7\x2b\x9d\x46\x36\x5b\x22\x39\x24\x1f\xa3\x59\x16\x5f\x29\x34\x68\x41\x00\xf8\x8c\xcc\x7c\x7b\x8d\xb1\xdc\x3d\xc9\xdb\x93\x99\x9b\x82\x93\x5c\x22\x9c\xe6\xb9\x36\x17\x9b\x1b\x7d\x88\xb5\xec\xe1\xf6\xf0\x80\x8b\xc1\x7d\xfb\xe6\xb8\xf9\x66\x22\xcd\x38\xd6\x09\x07\x2e\x9f\xbc\x95\x3e\x9d\xd8\x30\x2d\xf5\xf5\xbb\xdc\x98\x30\xf6\xce\x64\x73\x1b\x2f\x1f\x22\xd0\x9f\x70\x81\x23\x96\x38\x1b\xe0\x8a\x73\x72\x4d\x61\x93\x46\xe5\xf5\x2a\x69\xec\x10\x0b\x6b\xed\x68\xf6\x57\xb1\xfd\xe9\xf6\x9c\xde\x9c\x47\x89\xab\xfc\x58\xe5\x56\xf3\x13\xed\x86\x6f\xcf\xa5\xe1\xe4\xca\xdd\x35\xfb\x8b\x73\xab\x25\x18\x8e\x71\x8c\x2a\x21\x4a\x64\x8f\x86\xb6\xb4\xb5\x3d\x10\x70\xb9\xa6\xb8\x31\x7d\x21\x6d\x8c\x78\xb5\xe4\xdd\x85\x48\xe0\xb0\x0e\x46\xfc\xeb\xe0\xf1\xa8\x90\x08\xf6\xde\x5b\x01\xa2\xab\xfe\x4f\x05\x61\x06\xc1\xe9\x27\xba\x3e\x4c\x9e\x05\x4b\x75\xe9\x76\xb3\x85\x89\x84\xbd\xb1\x7e\xc5\xad\x39\x38\x07\x02\x2b\xfb\x43\x8d\x78\x11\x5f\x4c\x4a\x41\x05\xff\xc8\x16\xcc\xc2\xdb\x0c\x8f\xcf\xc2\xf8\x17\x6d\xe2\x5f\x54\x0a\xd9\xd5\x14\x32\x45\x80\x82\xc4\xdd\xc7\xbd\xda\x9d\x65\x48\x2a\xd3\x77\x7b\x44\x2c\x44\x2f\xdb\x20\x8a\x14\x8c\xae\xd2\x70\xf0\x3e\xe4\xb1\x24\x4e\xa9\xbf\x15\x4a\x6f\xc2\x48\xf0\x3b\xa1\x54\x79\x71\x35\x0f\x4a\xee\x5b\xe8\x8c\xd9\x4c\x66\xce\xf3\xa7\xc3\x98\x4e\x75\xf4\x7d\xee\xd2\x73\x07\x7f\x57\x05\xd3\x96\x82\x2b\x6e\xa7\xf6\x52\x7c\x94\x80\xee\x5e\x39\xbf\x1b\xa6\x25\x84\xd3\x26\xa1\x22\xf7\x6c\xea\x8f\xf2\x8d\x16\x95\xec\xd7\xc9\x1d\x65\x87\x26\xd8\x41\x89\x28\xff\xd2\xa8\x6a\xc2\x9e\xcd\xe5\x9e\x66\x46\xc6\x8f\x10\x60\xdd\x54\x72\xb3\xa9\x33\x7c\xd5\xa2\x06\x1e\x45\xa3\xc3\xec\x71\xc3\x08\x79\x8d\x25\xa1\x4c\x9b\xb4\x27\x5a\x49\x59\x29\xf9\x61\x83\xa6\xac\xf2\x77\x05\x56\x81\x05\xec\x4b\xfc\x98\x73\x6e\xce\x1b\x27\x15\xc4\x42\x70\xbd\x44\xbb\x9f\xdd\x7b\xfd\x46\x7f\xb1\xac\xda\x55\x4f\x5c\x4f\x18\x5e\x34\x3c\xd3\x38\x7b\x16\x6d\x9f\x9a\x3c\xbe\x66\x3a\x37\xc0\x55\x03\xd0\xca\x12\x10\xfa\x19\xa8\x00\xe1\x38\xfb\x0f\xb5\xc8\xd4\xbc\xde\xc9\x01\xd0\x3f\x83\x18\xc4\xbd\xc5\x86\x64\xc9\x43\xf1\x01\xe4\xf7\x46\x62\x5b\xda\xde\xeb\x19\xf5\xad\x88\xb9\xcc\x91\x26\x02\x4a\x51\xe1\xe1\x5b\xc7\x99\x9d\x66\xc4\x17\x6d\x35\xae\x24\x87\x67\x3a\x25\xe6\xcc\x49\xf7\xbe\x36\x97\x3d\x76\x4a\xbc\x6d\xcc\x9f\xb0\xd6\x3f\xd2\x10\xc2\x93\x06\x2b\x01\x2f\xba\xa7\x9e\xfd\x7f\x53\x89\x2e\x1c\x14\x02\x4a\x16\xe3\x03\x14\x24\xa7\xa7\xfe\x51\x4e\xa4\xff\x5f\x0b\xa4\x70\x8d\xb7\xd9\xad\xdb\xae\x68\xab\xc7\x69\xcc\x8c\xd1\xfb\xbc\xa1\xa4\xa2\x60\x41\x9b\x45\x33\x4a\x92\x03\xa0\xbf\xfd\xa4\xe7\x7f\x17\x47\x4e\x18\x92\xf7\x85\xcb\x78\x69\x98\xf9\x85\xc5\x0d\x7c\x1b\x86\xfb\x93\xd9\xbc\xdd\x5c\xe5\xb7\x69\x6d\x58\x87\x4c\xf4\x66\xb7\x13\x9d\x54\x9b\xa4\xbe\xa9\x4d\x51\xe5\x3f\x2a\x10\x20\xda\x5c\x14\x7c\x61\x3d\x3f\x65\x3a\x1a\x42\xb1\x97\xab\x06\x0e\x39\xb8\xa7\x59\xb8\xb5\xa3\x2d\xbd\x14\x0c\x4f\x80\xda\xc6\xcb\xc3\x0f\xc8\x1d\x05\xa4\x0e\x4d\x37\x44\xc2\x2d\x82\x36\x1d\x08\xd7\x9c\x9c\x6c\x4f\xaa\xcc\xd7\xe2\x45\xcf\xab\x3f\xde\x48\x1a\x3b\xe6\x6a\x87\xa3\xe0\x2f\xdb\x11\x1e\xd1\x4c\x48\xac\x38\xba\xd1\x97\xce\x4a\x4d\x24\xf2\x54\xda\x87\x91\xc0\x25\x99\x5d\x17\xc9\xdb\x2a\xdb\x1e\x69\x96\xb0\x3e\xf1\x37\x1e\xfc\xdb\xfa\xc7\x2d\x22\x98\xfa\xd3\x2d\x7f\x67\x1c\xd8\xb2\x1b\xcb\x52\x81\x4b\xab\x69\x91\x58\xc1\x65\x56\xd2\xbc\xa9\x9a\x53\xae\xeb\x93\x09\xa9\x06\x26\x7c\x9e\x12\xf2\x5e\x3b\xed\x29\xe9\xef\x54\xd5\x08\x00\xa8\x4a\x1f\x03\x49\xfd\xcd\x57\xb3\x10\xcc\x42\x82\xcb\xf8\x1a\x39\x10\xa2\xd7\xfd\xce\x56\xed\x96\x63\x5e\x58\x43\xf5\x48\xca\xa9\xcb\xc0\xa7\x86\x2b\x61\xe9\x66\xcc\x97\xeb\xe7\x67\x9b\xa6\x9e\xc0\x48\x03\x34\x08\x2d\x66\x58\x8f\x2a\x81\x5e\xc3\xfe\xa7\x90\x5e\xa7\x24\x8e\x21\xd1\x8b\x7d\x43\xb7\xd8\xb0\x92\xfd\xa9\x0a\xf7\x86\xf8\x9e\x48\x3e\x0c\x2b\x4c\xeb\x77\x91\x80\x71\x0c\xd0\x45\x59\xb2\x19\xc9\x0e\x1c\xfd\x6b\x41\x8c\x4e\x2d\xfe\x6f\xff\x4a\xd3\xbb\xb5\xa9\xe2\x68\xd5\x3a\xf3\x09\xe3\xf0\xd3\x00\x0e\x68\xb0\x6e\xd8\xcb\xa9\x63\x87\xed\xad\x57\x69\x78\xd9\x25\xdf\x6f\x0f\x07\x84\xa4\xe8\xff\x0c\xd0\xf3\x66\x68\x74\x28\x51\x72\x9c\x3e\x96\x13\x55\xf3\xc6\x64\x16\x03\x2d\x2c\x66\x6c\x12\x58\xec\x0e\x2e\x2e\x27\xe8\x2b\xd7\x4e\xff\x0a\xfa\x44\xc5\x96\x34\x08\x2a\x93\xf4\xe5\x9a\x6b\x63\xdd\x40\x16\xea\x06\x9d\x0c\xb3\xc4\xa2\xb1\x22\x07\x1b\x55\x2b\x01\x7b\x5d\x3d\x6e\xe2\x27\x21\xdd\x20\x72\xe7\x48\x76\xa0\x80\xec\x1d\x04\x3f\xad\xe1\xc5\x98\x17\x5a\xfa\x09\x11\xf6\x95\x87\x3f\xb1\x1b\xc7\xdc\x87\xe8\xcc\xc7\x43\x06\xd9\xf0\x85\xc8\xb3\x07\x80\xf8\x43\x7f\xf1\x5e\xa3\xf6\x23\xc5\xd2\x6f\x61\x29\xfb\x39\xaf\x4f\x88\x3e\xbf\xbf\x2b\xd1\x99\x33\x37\x5e\xca\x36\xec\x6f\xea\xde\xcd\xce\xc4\x05\x2e\x31\x40\x0e\x64\x75\x11\x97\x72\x1c\xc6\x05\x49\x10\x2c\x0e\x9a\x40\x15\xc1\xa7\x7e\x88\x12\x33\x62\x02\x00\xfa\x00\xf4\xf1\x3f\x0f\x81\xdf\x3d\x32\x78\xf1\x46\x90\xe8\x87\xb4\x4b\xbd\xe7\x9f\x73\x82\xc1\xb7\xc9\x07\x17\xaa\x1d\x98\xd2\xb9\xd4\xf0\x0e\xce\x9f\x77\x25\xdd\x2e\x13\x21\x29\xfa\x0a\xba\x53\xb3\xe8\xf2\xe2\xd9\xbe\xe5\x2e\x3d\x2d\xe9\x36\xe2\x04\xc9\x7d\x9f\x0c\xcd\x42\xde\x6e\xf2\x67\x8b\x4f\x82\x65\x90\x16\xbf\x8a\x11\x86\x5b\x01\x74\x35\x9f\x4c\xbf\x6f\x84\x4d\x08\xc8\x96\xcb\x10\xf2\x90\xae\xf5\x34\xbc\xfb\x46\x86\x1b\x70\xc4\xd3\x4a\xb5\x5b\xed\x35\x8f\x8c\x89\x3a\x90\x26\x9d\xb3\x83\x7f\xac\x95\x6a\x3d\x62\x2e\x65\xb4\xbc\xd6\xf2\xe8\xb5\x50\x40\xf8\x06\x57\xc8\xf3\x99\x76\x83\x9b\x69\x2d\x91\x87\x10\xba\xc8\x68\xdc\xbf\x9d\xb9\xbf\x89\xd4\x03\x38\x53\x4a\x48\x52\x7a\xcc\xd4\x41\x02\x7c\x54\xd7\x9a\x8b\xe5\x7e\x4b\x9f\xb6\x1d\x5e\xb1\x9d\xe5\x12\x61\xa0\xde\x54\xd2\xb7\x96\x32\xa3\xe3\x8a\xa9\x53\x2e\xb4\xc9\x07\xbc\x6c\xa4\x2b\xef\xed\x20\xf4\x2f\x3c\x10\x2f\xea\x8e\xc3\x3d\xa5\xa5\xf5\x5e\x68\xcd\xed\x83\xe6\x12\x3a\xf4\xfb\x37\x21\xe6\x7e\xf7\xa8\x72\x14\xc4\x39\x3a\xfd\x8c\x0c\xeb\xf2\x40\xff\xf3\x32\xe8\x63\xf7\x30\x6d\x7a\x01\x52\xfa\xae\xa2\x8d\xbc\x94\xdc\x18\xef\xa9\xd8\x9f\x9c\xd7\x96\x3d\x4d\xb7\x39\x38\x8b\xc9\x16\x4c\xa1\x47\x95\x99\xd1\x17\x3b\x01\x52\xb8\x91\xe0\x7f\xbd\x36\xfb\x76\x39\x3f\xec\x61\x29\x44\x98\x5b\x11\xae\x11\xbc\xf6\xa4\x42\xcd\x4b\x0d\x0c\xeb\xa0\xcc\x6a\xe3\x87\x47\xf0\x3c\x4d\xd4\x09\xcb\xfe\x68\xee\xf8\x22\x1b\x0a\x4a\x1a\xf7\xbe\x55\xed\xe0\xfb\x75\x68\xc4\x8c\xfc\xa0\x14\xac\x30\x9f\x37\xaf\xf5\x0e\x5d\x79\x88\xbb\x2f\x4e\xf0\x97\x42\x15\x58\x26\xc6\x8b\x2d\x40\x78\xaf\x1e\x86\xbf\x68\xc0\xd2\x61\xf2\x93\x3c\xee\xe6\x65\x25\xe0\xf6\x8f\xc3\x48\x26\xb5\x15\x39\x34\xc8\xfe\xff\xa1\xe2\x84\x4b\xb6\xf8\x77\x5f\x85\xee\xeb\xe4\xb6\x4f\x9a\xd1\x72\xb5\x44\x25\xa2\x77\x5c\x63\xd2\x78\x36\xaf\x96\x8d\x74\x49\x97\xb4\xf1\x41\x58\xd7\x4e\x89\xb6\x8b\xc7\xf0\xd3\x4a\xf3\x38\x51\xee\x22\x67\x09\x6d\x58\x36\x86\xb5\xab\x7f\x84\xc8\xe3\x19\x03\x74\x18\x73\x01\x3b\x40\xea\x12\xaf\x02\xf8\x92\xb6\x73\x58\x27\x64\x96\x9e\xf5\x4b\xff\x7d\x50\xfa\x42\x50\x59\xfe\xef\x1d\xca\xfe\x5f\x22\x88\x2c\xcd\x3c\x95\xbb\xe0\x2a\x91\x81\xf7\x79\x35\x31\x8f\x72\x42\xec\x48\x6f\xd6\x34\x12\xb8\x82\x75\xfb\x31\xa5\x76\x19\x31\xb5\x4d\x9d\xcb\x37\x9f\xa8\x05\xa6\xa8\xb6\xf8\x95\xd4\xfb\x82\x4c\xbd\xc9\x8f\xea\x5c\x5e\x75\x27\xcc\x12\x2b\x38\x19\xc4\xc5\xde\x62\xda\x6d\xea\x6b\x67\xcf\x3d\x09\x53\x07\x6d\x65\x15\x10\x64\x3a\xa3\x5d\x54\x29\x74\x77\x70\xb7\x4f\xd5\x9f\x21\x8e\x6b\x04\xd3\x3a\x0e\xc2\x5e\x88\x5d\xb0\x9c\x3d\x00\x92\x6a\xe0\x1f\x53\xef\xfa\x39\x87\xd2\xb0\x0a\xff\x13\x9a\x04\x67\xfd\xd1\xef\xc7\x8f\xa7\x0d\x0c\x5e\xd7\xf4\x53\xa7\x58\x98\x06\x60\x02\x4a\x4e\x4e\x74\x75\xbc\xdc\x15\xe4\xc4\xe6\x11\x52\x98\x50\x86\x18\x1f\xc3\x52\x54\x6b\xdf\xf3\x45\xa3\xaf\x27\x0a\x1f\x2b\x46\xf6\x70\xb4\x78\x32\x7d\x7a\x83\xf7\xfb\x79\x63\xfd\x18\x97\xa1\x89\xf7\x04\x82\x8a\xb1\x3b\x2a\xa2\xcd\xba\xe9\x8c\x7b\x4a\xb0\x52\x3a\x51\x99\x2c\xb7\x35\x82\x5b\xce\x8b\x20\xef\xf2\xf0\x31\x5b\x66\x13\x63\xb1\x1e\x78\xa7\xe4\x24\x56\x6a\xef\x03\x80\xa5\x90\xa7\x13\x96\x4c\x03\xfb\x72\xec\x3b\x28\x36\xa8\xda\xd3\x8a\xc8\xc5\xc7\x7d\xa5\xf6\x0d\xa0\xec\x17\xff\xb7\x83\x3f\xbe\x5b\x03\x16\x69\xea\xb6\x93\x42\x92\x06\x58\x9b\xb7\x76\xaa\x0f\x4d\x1d\x1f\xac\x54\xd1\x9c\x34\xe5\x6b\xa2\xbc\x23\xe1\x5b\x27\xa3\x18\x78\x84\x99\x34\x75\x47\x10\x7b\xba\x12\xfd\x63\x4e\xb0\x33\x98\xbc\xc7\x87\x26\x56\xb5\xd6\xb0\xad\x6d\xc8\x82\x75\x60\x92\x6f\x05\x45\x86\x76\x98\xf4\x26\x65\x1e\xc6\x1d\x86\x1d\xa9\x93\x79\x41\x0e\x5f\x8c\x6d\xae\x86\x36\x0e\x50\x88\xdb\x27\x94\xd6\x57\x7e\x71\xc2\xaf\x7b\x25\xba\x3b\x1b\x1b\x96\x19\x4d\x3f\x77\xb8\x10\x5f\x77\xf1\xfe\x55\x09\xfe\x90\x06\xad\x65\x3d\x34\xe7\xb3\x9b\xad\x03\x36\x2a\xe3\x7d\xed\xfc\x2f\x3b\xf3\xa6\x2f\x94\x5b\x6e\x3d\xd9\x6d\x8f\xee\x9d\x50\x6a\x20\xe1\x76\xa2\x7e\x23\x92\x7a\x95\xd7\xaa\x8f\x0c\x0d\xf4\xe4\x0f\x70\x5d\x60\x92\x96\xd9\x69\x87\x87\x46\x8d\x1b\x95\x6f\x0e\xd2\xe9\x2a\x47\x5f\x27\x0a\x85\xe3\x98\x89\x61\xdc\x68\xaa\xd8\x3c\x00\xaa\xfe\x84\x2b\xca\x2c\x23\x26\x24\x82\xf6\xea\x44\x80\x65\x6c\xfd\x88\x0f\x9d\xf5\x44\x98\xa0\xfd\x7b\xab\x99\x9a\x00\xf6\x75\xa2\x99\x2b\x35\x70\xbe\xcd\x7c\xb9\x77\xd1\xf2\x92\xa8\x96\x2e\xb3\x39\x53\xa8\x02\x33\x79\xd7\x2d\x5b\x0b\xc3\xcf\xa4\x9f\xe0\xe5\x86\x24\x21\x08\x3c\xda\xfd\xb7\xe8\x2d\xd7\xb4\x8e\xb9\x8a\xe7\x87\x90\x22\x65\xa2\x08\xf1\xfb\x34\x8a\xd4\xad\x56\xb0\x66\x34\xa2\xd0\x51\x9e\xbf\x7b\xcb\xf5\x69\x80\x94\xfc\x0e\x6b\x53\x03\x34\x23\xd9\x8d\x31\x4e\xcd\x36\x1a\x65\x5f\x6d\x5e\xbc\x62\xed\x32\xc6\xe2\xad\x9c\x46\xe2\xa8\x80\xd7\x04\x0f\x9c\x6e\xd5\xec\x8e\x66\xb0\x39\x0d\x3f\x2d\xf0\xd1\x4b\x11\x5e\xda\xfe\xd0\xbd\x63\xd7\x05\x76\x3c\x80\x1e\x42\xe8\xd3\x74\x17\x27\xea\xcd\xf3\x7e\xd6\xaf\xfc\xce\x60\xfe\xd0\x97\xde\x11\xd3\x2c\x5b\x05\xda\xcc\x6d\xbb\xef\x25\xc2\x7f\xf7\x95\x22\xcd\x5c\x74\x04\xff\x62\x98\xce\xbf\xc4\x0b\xc8\xb3\x83\xdf\x59\xea\x34\x37\xd9\x09\xaa\x9c\xda\x99\x12\x6c\xb7\x0c\x8c\x37\xc5\x06\xb3\x04\xc2\xf6\x23\x3b\x0b\x6f\xe5\xd7\x3c\xed\x4c\x2a\xac\x2f\xb5\xb4\xdf\x0f\x99\x1a\x22\xf9\x5e\x78\x05\xe6\xf8\x0f\x34\xb4\x71\x11\xa4\xef\x69\x05\x4d\x69\xc8\x6d\x47\xa3\x2d\x36\xaf\x45\xf2\x7e\x6a\xe1\xe6\x14\x6d\x51\x7a\xf5\xfd\x0b\x50\x5b\x7b\x9a\xed\xed\x75\x67\x05\x9a\x52\x97\x7d\xb2\xe5\x5a\x11\x47\x0e\xbb\xf8\x80\x7b\xf0\xe3\x01\x80\x49\x28\xe9\x17\x7b\x71\x94\xa0\xdc\x77\x94\x57\x08\xa7\x37\x35\x17\x4f\x5e\x55\xf4\x4e\x26\x68\xb4\xb9\x30\xcb\xad\xaf\x98\x7c\x59\x8f\x52\xe2\xf3\x95\x7e\x0f\xa1\xff\x80\x10\x00\x5c\x6f\xd2\x70\x89\x8f\x9e\xb9\x0c\xc1\xe8\x93\x8f\xd9\xb6\x0d\x16\xe2\x6f\x29\x42\xe4\x3f\x4f\x3c\x59\xd4\x1d\x5a\x76\x49\x41\x6f\x77\xfa\xb1\xb5\xdb\x0e\x78\x96\xf4\x5f\xbd\xf2\x23\x6e\x7a\x81\x1a\xa6\x53\x30\xb2\x55\xdd\x08\x7e\x8c\xc8\x0a\xdf\x22\xa1\xc4\xa0\x9f\x83\xdd\x9a\x7e\xad\x0e\xc3\xf8\xd4\xe7\xe0\x88\x7d\xec\x97\x49\xbd\x7f\x4f\xc7\x14\xd5\xdb\x50\x8a\x4b\x86\xfd\x3c\x19\x1e\xad\x06\xb6\x8b\xe5\xf8\x27\xe5\x71\xd1\x07\x20\xdc\x0b\x67\xde\x47\x72\x1c\xff\x85\x72\xc6\xa7\x36\x45\x08\x63\xf6\x2d\xf5\x69\xce\x67\xaf\xbe\x94\xf4\xb9\x8b\x38\x2e\x8c\xab\xe8\xc8\x0c\xf7\x1b\x5a\xc2\xe5\x3b\xdb\xe5\x9d\x68\xe5\x47\x4c\xf7\x4c\x91\x57\x0f\x40\x7f\x8b\xe6\x60\x90\x8f\x8d\x70\x86\x71\xbf\x32\x23\x4f\xa3\xc4\xec\xdd\xa6\x2a\xa0\x06\x9e\x64\xef\xfe\x42\x6c\x3d\x97\x9a\x67\xa3\x76\x90\x6e\x26\xa2\x26\x6a\xb5\xa5\xd6\x15\xe7\x35\xfb\x5f\x62\x40\x61\x30\x33\x93\x6f\x2c\xe6\x3e\xf7\xa7\xda\x50\x68\xe5\xfe\xed\xc1\xf9\x1b\xe0\x4c\x98\x11\x3e\xd6\x3c\x6d\xec\x3f\x6b\x55\x0d\xbf\xf6\xbf\xd0\xc7\x6c\x4d\xd3\xd4\x58\xdf\x7a\xee\x74\x5b\x0a\x5a\xd3\xba\xc0\xce\xc7\x3f\xe1\x8c\xf6\x10\x2d\xb3\x3b\x5e\x6f\xa1\xc9\x4b\xa6\xf5\xaf\x75\x31\x12\x2e\xb9\xe5\x9b\x13\x2e\x3c\xbd\x55\xaa\x5e\x9d\x50\x7d\x42\xb9\xc5\x19\x29\xc5\xa1\xaf\xe4\x1f\x2a\xcd\x3c\x93\xf1\xb6\x23\xdb\x50\xfa\x5a\x95\x53\xdf\x33\x47\x42\xb5\x54\xf4\x32\x97\xc8\x36\xbf\x20\xa4\xb1\xaf\xfa\x40\x50\x5d\x0d\x80\x16\x1e\x2a\xcb\x8b\xfd\xd7\x78\x5b\xff\x31\x8e\xfa\x01\xf0\x6a\x13\x2f\x03\x0a\x1f\x1a\xbd\x64\xa3\x25\xc0\xd3\x51\x64\xb5\x94\xf8\xc6\xd2\xf9\xbc\xbb\x0a\xe1\xd4\x4f\x99\x4b\xc4\x84\xf0\x8f\xad\x57\x91\xd1\x12\x97\x89\xa4\xc7\x5e\x92\x30\xcd\x39\xc6\x92\x74\x74\x31\xaa\xb1\xf3\x20\x18\x7b\x8d\x54\xac\x2a\xc9\x7b\x9f\x60\xb0\x16\xd5\x46\x52\x02\x4d\x19\x81\x5c\x4c\xde\x95\x7f\x6b\xe5\xf5\xf7\x3a\x59\xaa\x34\xed\xcb\xc1\xcb\xd6\xf7\x4e\x22\xbb\xb6\xbe\xaa\x1c\x32\xe0\x3c\xbd\x54\xb8\xfa\x03\xa1\xbf\x91\x73\xe9\x20\x41\x92\x42\xe3\x5e\x36\x76\xbe\x89\xe3\x97\x97\xa5\xec\xae\x8a\xfc\x77\xdc\x91\x23\xa5\x26\x8f\x5c\xcc\xfc\xbc\x94\x03\x76\x79\xc3\x00\xfa\xc2\x79\xf3\xcb\x88\xb3\x18\x31\xaa\xe3\x73\x3c\xab\x17\xd1\xf1\x27\x80\x15\xc8\xe2\xeb\x49\xa1\x29\x77\x17\xee\xc9\xca\x7b\xf8\xdb\xaf\x2c\xe9\x74\xd4\x13\xbb\xea\xd0\x6e\x6e\x64\xd5\x2c\x43\xc4\x2e\x43\x88\x93\xde\xdc\x5a\xb4\x8f\x09\xe6\xd2\xca\x87\x86\x0c\x07\x42\x27\x5b\x7a\xb5\xa4\x68\xb8\xa4\x3d\x7c\x8d\x0c\xed\xe0\x9e\x1d\x95\x94\x8b\x32\xc7\x85\x39\x3f\x6d\xbe\xa7\x64\xba\xca\xbc\xf3\x95\xa1\x46\x8e\x7b\xf4\x7b\x95\xc4\x3a\xac\xff\x68\x9d\xfd\x38\xf3\xbb\x24\x9e\xa8\xa6\xa2\xc9\x2e\xec\xe6\xe7\x2e\xdb\x6a\xbd\x34\x8d\x95\xb8\xef\xee\xd7\xa4\x9e\x7b\x77\xd0\xe3\x64\x59\x01\xd0\x9a\x3b\x4e\x55\xdc\xa0\x1f\xba\xa7\x1d\xf3\xac\xab\x99\x46\x4b\x40\xd9\x09\x9c\x72\x15\x8c\x02\x41\x68\xfc\x48\x10\xae\xd4\x1a\x8e\x5f\xdc\x48\x72\x45\xe5\x18\xbc\xa5\x4b\xda\x3d\x10\x7d\x35\xb9\xb8\x58\x52\xe5\x63\x7e\xd4\xa8\x06\x43\x4d\xfa\xc5\x0b\x7d\x13\x81\x4c\x6e\x2b\xb8\x23\xa8\x81\x6b\x56\x6d\x0b\x9d\x1f\x42\xf8\xcf\x77\xc6\x31\xa8\x84\x27\xfd\x1b\x04\xb2\x1d\x86\xe3\x38\xb2\x29\xb8\x02\xbe\xe3\x2e\x32\x60\xe6\x93\x33\x75\x50\x61\x8e\xc8\x9a\x9a\xe7\xf5\xfc\x60\x7f\xc6\x6c\x2d\x22\xa4\xb7\xcd\x96\xd1\xb4\xd1\x96\x54\xf0\x4a\x93\xe1\x73\x59\x0c\x6b\x5c\xf2\xf6\x80\xc1\x17\x35\xe8\xbb\x3d\x76\xd0\x0c\xda\xd0\x66\xed\x79\x1c\xa1\xb5\xde\x51\x67\x52\xe9\xaf\x97\x8e\x19\xc1\x26\x0b\x92\x91\xb3\x7a\x6e\x80\xa7\xf0\x65\xb7\xbe\x7e\x46\x03\xce\xb7\xe5\x41\x53\xe6\x54\x5b\xa7\x49\x97\x4c\x5e\x63\x09\xd7\x7d\xa3\x88\xbc\x3d\xf7\x96\xc7\x69\x04\x31\xf9\x76\x91\xac\xb8\x60\xaf\xb9\x7e\xca\x5c\xac\x84\xee\x6a\xe6\x48\x7e\x4b\x64\x0f\x2a\x57\xf3\x46\xae\x25\x65\x59\x89\x65\xdd\x59\x74\xd0\xc1\x68\xee\xb0\x72\xba\x2d\xe5\x7a\xa5\xaa\x43\x88\xe2\xe3\xb7\xef\xfa\x55\x7c\x5d\xfc\x43\xb7\x43\x3b\x01\x52\x7a\xcc\x5f\xbb\x44\xab\x39\x91\x37\xfe\x96\x3e\xaf\x11\x95\xeb\x3d\x9e\xc5\x8a\xba\xa3\xa6\xcc\xcc\x71\xb7\xd0\x85\x6f\x2f\xef\x2b\x88\x6c\x90\x6b\xd1\xd3\xec\x48\x8a\x90\x1a\x6e\x13\x78\xd6\x4f\x74\x45\xb1\x11\x53\xc4\x66\x80\x54\xe8\x5c\x63\x4f\xc9\x62\x5a\xa9\x8e\x6c\x99\xce\xa8\xb5\x73\x24\xf2\x75\xab\xae\x22\x86\x5f\xfd\xe3\xc4\xed\x8a\x8f\xcb\xce\x4b\xf2\x2a\x1f\x72\x89\x78\x67\x7c\x04\x37\x3b\x71\x0c\x57\x9e\x65\xce\x5f\x2e\xfa\x54\xb6\x88\x16\xfa\x66\x6b\xd3\xae\xbb\xc3\x64\x62\xd4\x32\xe4\x91\xfe\x91\x6e\x56\x39\x9a\x3f\x62\x47\x86\x12\xab\xa9\x9b\xd8\xec\x55\xc5\x06\x5c\xd6\x4a\xbc\xce\x4f\xd0\x0e\x38\x9e\x07\xb8\x44\x02\xd5\xe6\x36\x0d\xee\x35\x5d\x91\xe8\xf2\x79\x10\xba\x10\x97\x0f\x24\x0e\xd2\xfd\xeb\xbe\xea\xda\xa0\xaf\x0d\x84\x22\x96\x2c\x84\x59\xd7\x0b\x86\x06\x44\xfd\xf5\xd6\x92\x04\x2e\xd4\x94\xbd\x9e\x11\x41\x77\xe2\xf7\x9d\xaf\x81\x22\x44\xfa\xb8\x5d\x1b\xcf\x27\x6d\x07\xd8\x29\x5d\xc7\xed\x3d\xf9\xde\x6f\x81\x30\x49\x6d\x86\x75\x4a\x2d\x5e\xc2\x5f\xdf\x02\xc8\x18\x45\x07\x24\xb4\x3f\xde\x96\x48\x49\xed\x81\x06\xfc\x04\x85\x8c\x75\x0a\xa3\x73\x1f\x6f\xeb\x7e\x27\xca\xbb\x1d\xaa\x5a\xeb\xaa\xa9\xdd\x73\xe4\xfa\xc4\xfd\x0d\x4b\x2d\x7d\x5d\x5a\xa8\x76\xb4\x74\xef\x02\x6e\x6d\xe1\xdf\x9a\x00\x63\xd4\x2e\x86\xbe\xe0\x49\x97\x04\x8d\x62\xbb\xe3\x07\x42\xe8\x18\xf7\x95\x15\xc5\xd5\x27\xd1\xe4\x98\x60\x36\x46\x2e\x47\x7f\x6f\x25\x9c\xb3\xa5\xa7\xfc\xeb\x6f\x45\x9c\x13\xf2\xd3\xdc\xd7\x49\x0b\x1f\x80\x67\xbe\x87\xe5\x85\x9c\xd8\xdd\xc0\x24\x38\xda\x47\x68\xe1\x99\x2b\x81\x1a\xca\x54\xd3\xec\x8d\xe5\xc8\x68\x90\xcb\xb2\x5b\xb5\xa5\x16\xbe\x00\x81\x67\x63\x5f\x0e\xbe\x9c\x53\x71\xd6\xdb\xe1\xbc\xba\x96\x06\x69\xe3\xf8\xa3\x37\x09\x43\x62\x92\x84\xb6\xbc\x5d\x9d\xe4\x95\x0e\xf8\x5e\x5a\x95\xa2\x86\x72\x6f\xe7\x39\x05\x62\x62\xaf\x68\xd5\xc0\xd5\xef\xde\xbd\x14\x7f\x93\x97\x10\x48\x79\xf0\x5f\x70\xa7\x0c\x3d\x70\x6d\x68\x48\xb4\x14\xd5\x50\x57\x1a\xf7\xd9\x2e\x36\xea\xdf\x84\x45\x4f\x1b\x91\xd3\xbf\x61\x69\xc1\xcf\x8c\x76\x9a\xb0\x6d\x47\x8d\xc2\xa3\xa4\x68\x5e\x64\x28\xc4\xaa\x2f\x2c\x30\x5a\xf0\xc9\x04\x4b\x6e\x5d\x54\x93\x21\x0c\x8c\x58\x9b\x67\x9f\xb1\x20\xfa\xab\x16\x92\x03\xac\x73\x08\xb6\xe3\xde\xa4\x03\xd7\xa6\x06\x48\xfa\x8c\x8d\x2c\xca\xe5\xd5\x11\x2c\x51\xc5\xd9\xed\xcc\x6b\xb4\xd5\xa6\x2c\xd0\x8b\xb9\x5b\xbb\x4a\xb9\x4d\x29\x9f\xaf\x76\x70\x99\xbd\x06\x9b\xa6\x9e\x5d\xc6\xc6\x4e\xbf\xba\x74\x85\x1e\xdb\x8c\x9b\xfa\x59\x49\xcd\xb2\x71\x7f\x51\xe3\x61\xfa\x13\x72\xa9\x10\xaf\xf6\xac\x0a\xf7\x94\x43\x32\x53\xdc\x02\xd0\x3e\xe4\x91\x7c\x2b\xb3\xe6\x00\x1f\xc7\xd9\x57\x3a\xeb\xff\xfe\xcc\xfc\x7f\xc9\x1a\xe1\x41\x2d\x70\x3b\xa1\x8c\xd8\x0d\x41\x9e\x33\x98\x8c\xd7\x6e\xd5\xea\xd5\x4c\x28\x98\x50\xd9\xf3\xd8\x80\x23\xf9\x2f\xd1\x7f\xcc\xef\x14\x50\x6a\x58\x97\xbd\x34\x8a\x95\xb7\x3c\x0e\xb4\x0e\x4d\xf4\xaa\x63\x44\x1f\x9c\xf4\xe9\xd9\xe6\x84\xed\x48\x99\x3c\xcc\x3f\x3d\x5b\xdf\xdb\xef\xe2\x8f\x33\xb8\x24\x8f\x42\x0c\x4b\x56\x3e\xfb\xf4\x7c\xfb\xf4\x2d\x76\xea\x18\x0c\xae\x97\x43\x52\xcf\x5c\x8c\xe2\x7d\x97\x45\xe1\xf2\xf5\x02\x2d\x51\x1c\xb9\x18\x20\x79\xf3\x0a\x75\x68\xc7\xe2\x52\x55\x69\x8f\x7c\x53\x02\x1a\x36\xec\xbd\x9a\xff\x22\x43\x23\xb4\xa3\x06\xa3\x32\x40\x94\x3a\xea\xc0\xab\x1c\xa1\x47\x03\x5c\x5c\x1b\x0a\x61\xb9\xad\xb5\x29\xca\xe5\x1a\x16\x0e\x1d\x2c\x54\xc3\x92\x97\x55\xf7\xaa\xa1\xd2\xe4\xe9\x2e\x12\xfb\xc4\x54\x38\xc3\x5d\x8c\x7e\xba\xfd\x80\xb1\x7f\xcf\xce\x0c\x7e\xb8\x3a\x29\x22\xd3\xde\xcd\x5e\x9b\x59\x32\xb2\xd9\x16\x69\xab\x98\x7d\xd6\xd7\x3d\x2f\xf9\x68\xc7\x9d\xe1\xc3\xeb\xc9\xa4\x0d\xcb\xcf\x85\x2a\x95\x05\xb2\xb0\x4b\x67\x19\x35\x9b\x8c\x5b\x5a\x44\xd2\xba\xf0\xe7\x10\x05\xd9\x8b\x34\xd1\x07\x60\xb0\x14\xa4\x29\xcd\xb4\x47\xfa\x3a\x21\xea\xe7\xc0\x36\x37\x1e\x1f\x28\xce\x45\x97\xc2\x9f\x4a\x92\xc3\x66\x09\x73\x49\x71\x85\x28\x25\x23\x40\xaa\x99\x56\xbd\xa4\x7b\x0d\xe7\x18\xb3\x82\x32\x84\x06\x22\xd8\xf9\xb6\xed\x74\xdc\x4a\x01\x31\xd8\x53\x86\x2b\x77\x97\x84\x83\xeb\x92\xa8\x24\x76\xbd\x13\x20\xc6\x15\x17\x63\x0d\x7d\x23\xfe\x34\xc1\xc5\x8d\x5f\xf4\xe5\x53\x12\xdf\xd3\x33\xf2\xc8\x0e\x6e\x54\xf2\x37\x0e\x6f\x9d\x8a\x7c\x05\x8c\xd2\xa5\x3f\x5d\xbb\x88\xea\x8f\x8d\x88\xf9\xd4\x4f\x64\x72\x96\xa4\x47\x62\x94\xef\xf4\xf0\x2c\x71\x4d\x3f\x19\x7f\x0c\x90\x86\x66\xa8\x20\x07\xc3\x9f\x91\xd2\xe9\x5d\x5f\x2b\x52\x06\xed\x63\x78\x6b\x3a\xcb\xe0\x5f\xdc\x1e\xcc\x95\xf4\x88\x2d\x9a\xb0\x7c\xbf\xea\xf6\xa2\xb0\xc0\xb8\x93\xc5\xd0\x9e\xc4\xb3\x23\x3d\x93\x55\x25\xf9\xb6\x0b\xb8\x40\xe8\x3d\x37\x3a\x43\xe7\xf5\xdc\x52\x93\x5d\x83\x8c\x7b\x77\xe4\x69\x3d\xe0\x74\xfc\xc3\x55\xdf\xfe\xf4\x5e\xfc\xd8\x4f\xd2\xc5\x56\x53\x78\x62\x37\xb0\x2a\xae\xb5\xca\x9e\x4b\x94\x73\x54\x51\x7d\x4f\x0f\x1d\xb4\x9b\xe9\xb9\x68\x64\x7c\x6c\x1e\x9f\x5f\xa5\x48\x85\xeb\xa5\x5d\xaf\x67\x20\xe7\x89\x5e\x2b\xde\xf2\x1d\x83\xd8\x99\xc0\xc4\x07\x82\x88\x36\x62\x99\xa6\x83\x37\x28\xf1\xe6\xbd\xdc\x4a\xba\x6d\x79\x00\xc4\x4f\x54\xf1\x51\x4b\xef\x10\x21\x73\xfd\xc5\x0d\x0e\x90\x98\x70\xd7\x04\x90\x65\xa6\x23\x74\x70\x47\x81\x0c\x6d\x06\xda\x2a\xef\x80\x8d\xca\xe6\x25\xfe\xd9\x35\x30\xaf\x84\x96\xf3\xa9\x84\x29\xd6\x25\x64\x80\x0f\xba\x2b\x7c\x20\xcd\x30\x3b\xa3\x39\xbd\xde\x12\x4d\x5c\x9b\x6b\x4c\x53\x09\x5d\x88\xee\x60\xd5\x41\x85\xbd\x35\x64\x53\x52\x6e\x7e\x9a\x3c\x2b\x88\xd1\x05\x92\x8c\xb6\x64\xdb\x3f\x32\xaa\x5c\x1f\x97\xb4\xce\xa6\xaf\x6f\x54\xeb\xc2\xa0\x25\x96\x27\xf2\x93\xf0\x65\x07\x15\xe7\xc7\xd3\xfe\x8d\x84\x0f\x4a\x07\xd8\xf3\x83\x21\xf4\x86\xc8\xd8\x07\x60\x18\x71\xc6\x5e\xb8\xa9\xe4\x7e\x5b\xc0\x82\xf0\x72\xe6\x52\xd8\x48\x2e\xd0\x47\x79\x3d\xf5\xfd\xe5\x94\x2d\xcf\x05\x82\x4b\xf6\x48\x89\xcf\x61\x77\x59\x37\x3b\x6f\xd9\x51\x1e\x70\x95\xa1\xdc\x7e\xdc\x93\x2c\xf9\x46\xeb\x3a\x65\x4e\x82\x6d\xb0\x30\x79\xe8\x4a\xff\x56\x5c\x60\x29\x6e\xbc\x8b\xd8\xc3\xf4\x54\x0d\xbd\x3c\x94\x21\xae\xaf\x54\xbb\xb2\x23\x73\xa6\x71\x35\x13\xbb\x29\x34\xbd\xa2\x9e\x46\x15\xc0\xb1\xcf\x62\x84\xac\xb5\x62\x69\xd4\xdb\x7a\x58\x4c\xbf\xb3\x51\xed\x6b\x75\x30\x40\x3d\x5d\xe9\xa8\x59\x38\xee\x13\xd8\x89\x04\xdd\x96\xb7\x9c\x5d\x20\x74\xb5\x26\xa6\x6c\x45\x3e\x77\xc8\xc4\xb3\x35\xe8\xe2\x3c\xe5\x9b\xaa\x94\xe7\xeb\x43\x8f\xf2\x7f\xf0\x0d\xfa\x79\xc5\xce\x1d\xeb\x75\x94\x10\x26\x14\x2d\xaf\x2d\x77\xfc\x34\x8e\x1e\x1a\xfc\xa9\x3d\x3a\xa8\x93\xa4\xb3\x30\xbe\x55\x7a\x6f\x91\xe7\x6e\x69\x1c\x76\x9c\x9f\x93\x2a\xfd\xeb\xf2\x9e\x1a\xb8\x0e\xee\xad\x6c\x55\x6a\x94\x7c\x00\xca\x69\x49\xa2\x9d\xf4\xce\x13\x36\x26\x0f\x0b\x97\x22\xb0\x9f\x11\x5b\x82\x99\x8b\x6c\xff\x76\x88\x83\xfe\x28\x30\xc9\xc8\x12\x59\x65\xa1\x0a\x8c\xd7\x44\x36\x66\xd1\x53\xba\x8b\x55\xbf\x71\x68\x71\x31\xfa\x80\x0c\x7a\x2f\x12\xba\x55\xdf\xf5\xf3\xad\xd3\x31\x26\x60\x7f\x2b\x61\xca\x1b\x52\x77\xe9\xec\x21\x84\xd7\x44\x72\x64\x18\x75\x37\xb2\xdd\x86\xc3\x90\xbc\x51\x4e\x8e\xf3\xe3\x92\x6b\x70\xc3\x50\xb2\x04\x5b\xb5\x1e\x80\xa6\xf6\x75\x3b\xb0\xc5\xba\x16\x25\x72\x50\x96\x02\x26\xdf\x09\x55\x85\x0f\xd3\xf1\x95\xe9\x3e\xdb\xe4\x96\x82\xa2\x17\x22\xa0\xf3\x07\xd6\xf7\x3c\x7a\x4b\x11\x64\xf2\xa5\xad\xb5\x8e\xde\x09\xd7\x9b\xed\xa3\x4a\xb0\x9f\xf9\x6c\x32\xae\x6a\x58\x31\x7f\x1b\x1f\x79\xfc\x6b\x61\xf4\xc2\x49\xd9\x20\xac\x8f\x88\xf2\xe5\x86\x0a\x4e\x31\xf7\xab\x13\xba\x9a\x0d\x0f\xd3\x03\x01\x76\xd0\x84\x1f\x2f\x34\x5b\xbf\x35\x74\xda\xc4\x5a\x7a\x2c\x93\xec\x65\xcc\x6f\xc1\xb5\xa4\x59\x5f\xd1\x2a\x07\x25\x94\xaa\xbb\xcf\xf3\xf4\x8a\x61\x66\x43\xd1\x53\x7c\x9c\x5e\xcc\x41\x7b\x22\x29\x64\xe4\x2a\xca\x73\x23\xc2\xc7\xb0\x62\x74\xd3\xd7\x1c\x8f\xb3\x83\xa7\x80\xd9\xca\xde\x2b\x79\xf8\xe2\x8f\xd1\xe2\x2b\xad\x86\xdf\x3a\xdf\x06\x29\x77\x25\x3f\x06\x48\x82\x20\xc8\xd4\x70\x49\x0a\x1a\xd6\x3e\xe7\x03\xea\x8f\x4a\xf5\xb5\x83\x3e\xd2\xcb\x0f\xc0\x75\x47\xf2\x31\x3d\x1d\xf2\x6d\xce\x26\x17\x46\xcb\x8f\xaf\x7c\x92\xe4\x92\xe4\xd2\x9f\xb5\xe3\xa0\x43\x0c\x8f\x6d\x5d\x06\x4d\xa8\x1a\x3e\xfb\xe4\xbf\x92\x11\x2a\xf4\x58\x5a\xd6\xa4\x81\x81\xa0\x61\xdd\x03\xd3\x37\x4a\x1d\x69\x4a\x34\xc5\x50\xb8\x3b\x06\xbc\x9c\x7d\x48\x26\x06\xf0\x7d\x8c\x2d\x45\xc0\x03\x85\x05\xdf\xf3\x34\x66\xb7\x78\x44\xe0\xf6\x3a\xc5\xb2\x75\xe1\xae\xa9\x89\xd3\x6a\x57\xe8\x1c\x34\xa4\x47\x73\xf0\xd4\x0d\x73\x8a\x0e\x99\x7d\x0a\x86\x50\x94\x16\xe2\x13\xbd\xfc\x4f\x38\x11\xc2\x3f\x39\x49\x55\x5f\xab\x3b\x72\x8d\x76\x70\xdc\x2a\x34\x4c\x72\x67\x28\x7c\x7f\x02\x7f\xdf\xac\x9e\x41\xd2\x1c\x4d\xbf\x4b\x77\xc7\x0e\x1a\xe9\x60\x59\x7b\x00\x7a\xf4\x91\x74\x9f\x3e\x35\x74\x2c\x10\xc3\x47\x41\xd2\xcd\x8c\xa7\xd7\xda\x93\xf4\x44\x88\xed\x86\x90\xfc\xa5\x25\x05\xd2\xe2\x59\xaa\xae\x03\x5b\x98\x34\x21\x8a\xb5\xb2\x92\x41\x6f\xd6\xd8\xc4\x4d\x6c\x24\x82\x02\x53\xce\xfb\x05\xa3\x26\xe0\x9a\x8b\x39\xf0\xcf\x0d\xcb\x5f\x0e\x78\xc7\x13\xa8\x49\x9b\x5c\x9e\x7f\x41\x1f\xfd\xc9\xca\xe7\x04\x63\x82\x41\x3a\x08\x5b\xb1\x6d\x4d\x7e\x80\x34\x74\xf2\xd6\xd3\x65\x43\x22\xa5\xb6\x79\xc6\x3c\x54\x50\x50\x68\x6a\xc8\xf3\x85\xd7\xfa\x25\x88\xfe\x4b\x07\x3f\xf2\x07\x74\x63\x63\xc6\x15\x95\xf1\x9b\x7d\x7d\x94\x39\x48\x84\x1e\x5e\x3a\x20\x75\xbd\xd0\xae\x5a\xf4\xcb\xe0\x87\xd0\xfc\x94\xa2\x8e\x71\x0a\xc4\x99\x4b\x9a\x08\xd7\xda\x3d\x95\xde\xad\xbe\xa5\x4b\xf9\x8f\x5b\xb8\x9d\xb6\xf4\x66\x80\x40\x1b\x78\x63\x76\x4a\xe8\x33\xc8\x6f\xf7\x2a\x76\x67\x42\x8a\xff\xc8\x30\x46\x58\x83\xb1\x27\x1a\xd7\xed\x9f\x86\x44\xff\xc3\x6b\x1a\x38\x35\xd8\x69\x5d\xaf\xc4\xfb\x90\xc6\x36\xcb\x4d\x6a\xfd\x3e\x40\x89\x39\xee\x2d\x81\xab\xab\x1a\x18\xcd\x1c\x31\x28\x5b\xd7\xa6\x5c\x63\x59\x2b\xe7\x7c\x90\xff\x32\x30\x5b\xdc\x97\xeb\xa5\x3e\x32\x25\x79\xa3\x2e\x82\xd5\x79\x3b\xc3\x9e\xe2\xfb\xb1\x8d\x03\x15\x2a\x7d\x41\x76\xda\x42\xc0\x80\xd2\xd2\x4c\xda\x88\xb8\x51\x38\x78\x23\x0e\x47\x01\x9a\x70\xd0\x52\x2a\xf2\x48\x31\xb7\xd0\x99\x97\x84\xd7\x00\xed\x30\xdb\x0a\xdd\xb3\x83\x73\x0f\x39\x64\x4a\xb2\xfc\xa8\x5e\x57\xa7\x78\x4e\xa2\xc5\xd9\xcb\x4f\x58\x38\xb5\xaf\xfd\xd9\xc6\xd7\xb7\x7e\xe3\xd4\x0d\x30\xfe\x65\xe3\x9c\xd3\x43\x3d\xf1\x81\xb4\x22\xdd\xfd\x6a\x96\x8b\x9a\x3a\xc7\x98\x2e\xf2\x5d\x46\x63\x53\x86\x64\xcf\x17\x50\xa6\x36\xfb\x23\x1f\x26\x6a\x57\x20\x8e\xbd\x74\xa5\xc9\xeb\x68\x4f\xe2\x63\x80\x14\xa1\x6a\x94\xf4\xe3\xc8\xf7\x14\x17\x41\x35\xf8\xda\x8e\x60\x2a\xfa\x4c\x97\x73\x5a\x4d\x5d\x3f\xee\x7d\x65\x73\xf2\x59\x47\x83\x51\xfc\x68\xf9\xad\x77\x81\x71\x2e\x06\x21\x97\x3d\x2a\xcf\x07\x55\xac\x63\x6e\x22\xfc\xd4\xcd\x9b\xc4\xba\x41\xb4\x68\xb1\x4e\x9a\x92\x62\x79\x7b\x8f\x1b\x9d\xae\x5a\x32\x1b\xb9\x2b\xc6\x86\xf6\xeb\xa9\x86\x0f\xd0\xa8\x6e\x31\x01\xaf\x9d\x04\xb8\x14\xb3\x1e\xde\x85\x7e\xbc\xce\xd9\xcb\xee\xaa\x70\x3e\x27\x23\xa9\x0a\xa8\x18\x31\xcf\x7d\x98\xf3\x64\x1b\x83\x58\xb4\xe0\x73\x55\x23\x2c\xa8\xf0\x02\x8a\xad\x8f\xf7\xdb\x4f\xc5\xa7\xc9\x2c\x89\x14\xec\xba\xb2\xc0\xbd\xef\x1e\x28\x1e\xb5\x99\xf8\x00\x98\xeb\xff\x56\x19\x65\x26\xde\x82\x5b\x51\xde\xbb\xb5\x23\x8a\x02\x10\x95\x99\x26\xc3\x4b\x94\x92\xd7\xd4\xd2\x9c\xf2\xa9\xf4\x54\x69\xce\xa0\x10\x56\x47\x01\x97\x23\x1d\x3f\x30\xd2\x3d\xd9\xa4\xe0\x97\xfe\xb0\x73\x14\x67\xdf\xb7\x2e\x8e\xfb\xa0\x00\xa9\xcf\xea\x0b\x22\x76\x70\x1e\x7a\x6d\xab\xfb\xc5\xc8\xd1\x59\x69\xed\xab\x3b\xdb\x17\x32\xc4\xd6\x3f\x18\x56\x56\xbb\xd6\x14\xc8\xd0\xca\xd4\x0c\xc7\x1a\x2e\x60\x5c\x0d\x73\x72\xdc\x4a\xbf\x39\x93\x57\x5b\x4d\xad\x49\x12\xf5\xbf\xce\x81\x9d\x7b\xda\xca\xfb\xfc\x78\xdb\x91\x3e\x71\xc5\xfb\x68\x1d\x23\x3a\xe8\xeb\x31\x15\xed\xa3\xfe\xb2\x10\xf2\x4f\x4f\x54\x29\xa1\xf7\xa7\x3a\x6e\x09\x95\x3c\x23\xe1\x20\xa2\xf8\x8b\x95\xcc\x1b\xed\xf2\x5f\xad\x94\x5f\x4a\x99\x20\xeb\xb1\xe7\x11\x1b\x31\x24\x9f\xea\x9a\x8e\x56\x62\x35\x80\xb7\x6f\x95\x2a\x79\x5c\x74\x6a\x11\x17\x09\xc2\x47\xcb\x41\xa2\x3c\x70\x6e\x55\x97\x3d\x76\x50\x28\xaa\x7f\x33\xbc\xa2\x8e\xf7\xb7\xe2\x92\xdb\x4e\xfe\x48\x90\xb0\xe4\xe7\x95\x61\x19\xa3\x9c\x18\x4f\xcb\xc0\xb3\x1a\xb7\x8a\xb7\x3e\x29\x89\x72\xf4\x1a\xe8\xda\x06\xb1\xbf\x64\xde\xe0\x6b\x6a\xce\xc5\x45\xb4\x59\xba\x54\xac\x52\x60\x74\x1c\x42\x1b\xed\x17\x15\x56\x28\x0f\x20\xf0\x22\xf7\x55\x50\x9d\xdb\xc2\xf1\xef\x55\x59\x96\xd2\x83\xed\x91\xc4\xde\x62\x2f\x84\xb8\xf7\x24\xb8\x69\x4f\xab\xd3\x74\x86\xe7\xe8\x44\x35\x95\xd2\x20\xe9\x48\x2f\x59\x7d\xf6\xdb\xab\x02\x66\xd1\x72\x48\xd0\xdf\xdd\xd1\xe5\xf7\x8d\x94\x90\x91\x76\xe9\x06\x7c\x47\x26\xbb\xaf\xc9\xf8\x44\xbb\x61\x7a\xe7\xf9\xbd\x39\x36\x27\x32\x91\x97\x24\xcb\x87\xe2\x84\xd9\x39\x12\x69\x63\xb1\x60\x48\xf0\x02\xf2\x5e\x03\x6d\x05\xaa\xff\xc9\x4b\x83\xa4\xca\xef\x15\xe8\xac\xd2\xfb\x57\xb2\x5d\xda\xd7\x75\x3f\xcd\x81\xfd\x96\xdb\xe7\xf3\x98\xf3\x3a\x83\x2c\x98\x30\xc6\xd8\xfa\x31\xd4\xe0\xa6\x54\x7b\x72\x99\x62\xd5\x47\x6b\x7d\xc6\x57\x02\xfd\x9d\xcf\xbe\xa0\x8d\x42\x83\x14\xff\x74\x08\x75\x05\x99\xd6\xbf\x20\x26\x57\xda\xf2\xcf\x99\xef\x08\x9c\xe9\xd2\x37\x1b\xda\xe9\x70\x43\x3c\x4f\x28\xb3\xf5\xe3\xf1\xb5\xdb\x80\x26\x7f\x95\xde\x9e\xa0\x49\x58\xbe\x13\xd7\x9e\x6a\x48\xa8\x5d\x2a\x3e\x26\x14\xcb\xc5\xd3\xf8\xa7\xe1\x2c\x93\x68\x35\x80\x8a\x2a\x83\xb9\xc0\x4d\x8b\x55\x9c\x7d\xca\x2c\x14\x7f\x19\xa1\x85\xbc\x75\x8a\xde\x95\xcc\x6e\xba\xe3\xda\xc3\x3d\x8d\x0b\xa7\xc7\xb2\x53\x3f\x96\xb2\x9f\x74\x68\xfd\x1c\x33\xb2\x8b\x52\x30\x87\xbd\x06\x0e\xce\xf4\x6d\xed\x44\x5e\x47\xb2\x93\x68\x92\xfb\xa9\xe5\x12\x8d\x34\xc5\xd1\xa3\x7a\xa8\xd8\x92\x14\x82\x90\x4f\x3e\x33\x9d\x6e\x45\xe3\x50\x36\xba\x82\x1a\xaf\x2e\x2b\xda\x55\x37\xe9\x8b\x4a\xf6\x45\x1e\x0f\x17\xd7\x69\x2b\x51\x2e\x4e\xfc\xa2\x45\xc6\x83\xa5\xb3\xe7\xa2\xd6\x3f\x60\xd8\xb4\xfc\x52\x6e\x37\x56\xe4\xa1\x8b\xfa\xfa\x33\x5a\x46\x6c\x02\x9b\xed\x4a\x0d\xec\x84\xf8\xa3\x12\x6c\x0a\xc3\xd0\x67\x62\x73\x1c\x6f\x8e\xce\x3c\x5d\xbb\xd6\x2e\xf0\x54\xd4\xb6\x56\x53\x68\x7f\x69\x6a\x4e\x10\x53\x2b\x8b\x8b\x29\x47\x09\x10\x26\x5b\x04\x88\xa9\x92\xf8\xc8\x4c\x49\x2a\x10\xa5\xba\x7d\x22\x3e\x5e\xe9\xe0\xfd\xb2\xdb\xe1\x6b\x3b\x56\xdd\x46\xb1\x09\x43\x53\x65\xfd\x13\x56\xe2\x5d\xee\xfe\xc9\xd3\xdc\x23\xbe\x60\x89\xd6\x8f\xfc\x0f\x59\x88\xec\x21\x84\x5e\x2c\xd7\xc7\x04\x0a\x34\x20\x9f\xe6\x08\x27\x77\xd9\xe5\x35\x20\xfa\xdc\xd6\xcf\xaa\xe5\xa6\x6e\xf5\x0b\x6d\x39\x8b\x27\x2e\xc4\xf0\x08\xba\x5f\x3a\x83\x9b\x8e\xd4\x6d\xfd\xc8\xa6\x85\x0f\x2d\x82\xae\x47\x38\x40\xf8\x96\x56\x43\xd7\xd4\x27\x6b\xc4\xb7\xf4\x29\x03\x9e\xbc\x6d\x12\xce\x48\xf1\x00\xd3\x48\x46\xf2\xee\x3f\x30\xff\x12\x32\xb4\xa3\xc0\x40\x2a\xb0\x50\xfd\x69\x65\x49\x4c\x9b\xc3\x86\xfe\x1a\xaf\x36\xaf\x9b\x3d\x91\xc4\xe6\x55\xe0\xd9\x3a\xee\x99\x0a\xd1\xe6\x45\x60\x99\x7c\xd0\xce\xba\xde\x68\xac\x96\x11\x78\x17\x42\x1f\x23\x67\xbe\x7f\x7d\x9f\x56\x66\xff\xd8\xe3\xbb\x6a\x23\xd5\xc9\x32\xad\xd6\x57\x73\xa9\x7f\x93\x76\xc6\xe9\x07\xc8\xd4\xcd\xbc\xa6\x12\x0e\x21\x78\x72\x4f\xe5\xf8\x77\x63\xb0\x74\x67\x89\x2a\x01\x25\x45\x45\x3a\xdb\xe4\x79\xe9\x27\x50\x53\xf9\x58\xf9\x96\xb9\x23\x0f\xc6\x89\xbe\x78\x41\x91\xef\xa0\x76\x4f\xbf\x3c\x24\x5e\x3f\xfd\xf3\x79\x0a\x39\xc4\x32\xe8\x6d\x43\x3c\xe9\x0c\x3f\xe1\x8d\x94\xea\xa5\x5f\x96\x15\xc8\x61\x33\xb5\x8f\xa6\x15\x2f\xbc\x4e\x95\x70\x15\xad\x54\xf1\x67\xea\x47\x7b\xab\x7e\xc1\xae\x0f\xf8\xac\x91\x0f\xc0\x8d\x77\x1f\xa9\xef\xb7\xbb\x7b\x73\x18\x67\xf3\xc5\x79\xa5\x3f\xc8\x87\x3f\xea\x65\xfc\x9a\x8d\xfd\xb3\x73\x2c\xbb\x81\xf7\x49\xb7\x87\xd3\x09\xe8\x8c\x6a\x7c\x98\x80\x00\x25\x29\x39\x6e\x24\x7a\xec\x1c\xcf\x5f\x21\xa1\x41\xbb\xf3\x7f\xb1\x6d\x2c\x64\x23\xfb\x9b\x4d\x12\xf0\xde\xb0\x21\xcf\x41\x36\xdd\x4d\xd6\x93\x66\xd4\x52\xc8\xa9\x59\xc1\x8c\x91\xef\x80\x00\xf0\x4c\xc9\xc1\x1c\x8c\xf4\xf9\xe0\xeb\xe9\xe2\x24\xfe\x6b\x51\x65\xbb\xa8\x2d\x2a\xa0\xef\xd1\xb5\xcb\x74\xbb\xc0\x2a\x6b\x04\x5f\x2e\xbe\x6b\x35\x33\xa2\xe3\x87\xc7\x86\x9d\xd6\xee\xdb\xf9\x00\xb9\x94\x8f\x87\x12\xa2\xa2\x2c\x70\x70\x87\x14\xd7\x3c\x63\x7b\xa4\x06\x7e\x55\x21\xb1\x18\x19\x5a\x3f\x74\x67\x7d\xed\x20\x85\x9a\xcc\xf4\x89\xe5\x9a\x0c\x37\x5f\xf0\xfe\xd9\x1f\x43\xf3\xe4\x42\xf7\x8b\xd2\xf0\xc8\xd2\x6f\x7c\xc0\x00\x50\x25\x32\x20\xc2\x51\x84\x2a\x50\x99\x63\x70\x48\x71\xa1\x8d\x0b\x8c\xc7\x01\x3c\xe8\x3b\xce\x17\x17\x0d\x06\xa5\x6a\xc9\x8d\x65\x19\xb2\x00\xcf\xd4\xc8\x2a\xb6\x85\x67\xbc\x3e\xe5\xa1\xca\xb6\x58\x9c\x08\x0e\x46\x45\x8d\x20\x25\x16\xa7\x73\xf2\x2e\x25\xa7\xd2\x95\x2b\x8a\xe7\x4e\xfe\x7d\x1d\xfc\xdf\xc5\x9b\x92\x53\x17\x12\xb9\x26\x25\xdf\x30\x40\x90\x2c\xe3\x2e\x0e\x76\x77\x59\xdf\x44\x92\x6f\xaa\xdb\x33\x1d\x5f\x5f\xfe\x49\x9a\x89\x83\xc5\xae\x94\xa2\xac\x2d\xea\x82\x66\x97\x7f\x19\x88\x1c\xef\xa8\x1b\x6a\xd0\x62\xa2\x79\xb8\x5f\x48\x7f\x41\x9b\xb9\x95\x98\xdb\xe9\x6c\x6d\xfd\x91\xd6\x17\x9d\x2b\x7d\x5b\x3d\x46\xf4\x16\x80\x47\xfe\x9c\xaa\xdc\x9e\xbe\x75\xf2\x34\xfb\xc1\x18\x64\x2e\x58\xa8\x0b\xaa\x36\xc0\xdf\xad\xf2\x1c\xf4\x0a\xde\xd8\x89\xf0\x28\xee\x15\x1e\x47\x44\xf9\xe4\xb8\x72\x9b\x28\x7e\x78\xe1\x3d\x9b\x72\xb9\x5f\xea\xa3\x98\x33\x9a\xec\x93\xa1\xa3\x61\x8f\x4b\x08\x9f\x90\xf7\x15\xcb\x25\xcc\xf8\x80\x38\x39\x4c\xd7\xec\xcf\x3c\xa8\xa8\x2d\xdb\xba\xa8\x66\x68\x45\xc9\x38\xa7\xe2\x9b\xb4\x5a\xc9\xca\xb0\x53\x31\x32\x14\xbb\x18\xa1\x78\x4d\x34\x76\xe4\x6e\x0f\x93\x90\x0c\xb1\x92\x32\xf9\x81\x17\x19\x71\xcf\xed\xa7\xfa\x32\x22\x76\x17\x4a\x1c\x8c\x66\xd1\x76\x5e\x6e\x2c\x44\x12\x3f\x1f\x2d\x57\x62\xde\x7b\xfc\x6a\xc2\xe9\x30\xbb\x9d\x33\xb4\xa6\xc4\x56\x8f\x3c\x03\x56\x2a\x6b\x13\xd5\x28\xc3\x92\xe1\x12\xeb\x08\xf6\xcb\xe2\xaa\xc8\x18\xd4\x5b\x6d\xf6\xb8\xa0\x23\x9d\x17\x55\x6e\x58\x13\x8d\xdf\xf6\x3c\x8c\xc5\xe2\x4f\xf7\x4b\x5d\xe7\xb1\xd4\x98\x57\x39\x6e\x16\x34\xe6\x50\x8b\xe2\x70\x5c\x11\xdb\x15\xa5\x75\xbd\xcc\x25\xe2\x88\x92\x47\x12\x45\x1c\x07\xeb\xe9\x8f\x7c\x0f\x3e\xa5\x1b\xef\x92\xe9\xf1\x7f\xb6\x7a\xfe\x5b\x1a\x17\xe1\xda\x42\x6b\x35\x03\xda\x69\x10\x39\xf1\x14\x5e\xd9\x6f\xe1\x29\x4e\xa6\x0c\x65\x4f\x64\x65\x0b\x28\x28\x93\x52\xd1\x6d\x6f\x69\x98\x99\x19\x4f\xd7\x88\x79\x7e\xcc\x1a\x8b\x05\x7e\x0f\x21\xaf\xfa\x93\x3b\x5d\xa9\xe7\x9d\xa6\xce\x3e\x69\x9e\x35\x01\x5c\xa7\x5f\xc1\x07\xb3\x45\xda\x90\xa1\x15\x0d\xf3\x53\x8f\x67\x78\x0a\x37\x98\x47\x85\x3e\x33\x74\x76\xed\xdf\x7b\x2f\x7c\x80\xd3\x7d\x78\x8f\x0a\x2c\x25\x22\xb2\x8a\x24\x1d\xe2\xf3\x2c\xb6\x18\xfc\x8a\x36\x24\x7a\x18\x1b\x86\x24\x9f\x85\xca\x6c\x14\xea\xc9\xb3\xb5\x73\x48\x75\xdb\xfd\x62\x27\x9c\x89\x76\xf4\x7a\x00\xae\xaf\xd5\xc0\x91\x56\x0d\xd4\x73\x45\xb7\x22\x31\x85\xcb\xc9\x98\xe1\xa9\xa3\x6c\x54\x7f\x0c\xe5\x3a\x6a\xca\xad\x45\x3c\x28\x64\x2c\xa0\x6c\x8e\x38\x63\xfe\xfe\x99\x4e\xc1\xc3\x3b\x1d\x41\x2a\x02\x18\x4c\x3e\xf5\x8b\x84\x5e\xef\xb7\xa6\x79\x2c\x37\x15\xdf\x85\x42\x87\x72\x89\xc8\x1a\x50\x49\x65\x2f\x0e\x92\x60\xf6\x15\xef\xf4\x3f\x05\x7e\xd9\x3a\x07\xc7\x15\xb9\x36\x7c\x78\xa4\x23\xf7\x48\x99\x85\xf4\xd8\xa0\x61\x80\xd6\xed\xf2\xd0\xf0\x76\x95\x7a\xc6\x9e\x82\x74\xb1\x67\x4d\x83\x3c\x55\xa6\x17\x46\x00\x6b\xf5\x4b\xfe\xe4\x41\x9b\x13\xef\x02\xa1\x1c\xdc\x0c\xf9\x42\x8a\xd9\x64\x66\x10\x9b\x17\x2a\x78\x5e\xf6\x68\xb3\x2a\xec\x49\x56\x2a\xae\xe2\x21\x6c\xff\xb6\x6c\x81\x01\x5b\x92\x43\x4c\xdd\x75\x4e\xbd\xfd\xb9\x04\xd1\xe1\x3b\xb6\xee\x35\x02\x16\x2c\xd6\x48\x33\x75\x97\x93\x11\x97\xab\x49\x8c\x5a\x9f\x37\x88\x9b\xfe\x07\x80\x09\x3b\xf9\x2b\x1c\xdf\x51\x0e\x9a\x13\xeb\xa3\x4c\xb7\x10\xb5\xd9\x56\x93\xe5\xc0\xa4\xc9\x19\xf9\xf9\x78\xd9\x25\xdb\xbf\xc8\x2b\xb6\x08\xa1\xf0\xe6\x2b\xc8\xda\x45\xc8\x80\x21\x19\xd1\x75\x67\x03\x0b\xf3\x23\xdd\x4f\x17\x54\xe0\xde\x6b\x7c\xc4\x36\x52\x31\x7a\x69\x05\x1a\x16\xa2\xe3\xea\x37\x62\xe1\x21\x28\x7b\xee\x98\x72\x95\xfd\x26\x38\x76\xdd\xc5\x28\x67\x63\xed\xf3\xe3\xc7\x36\xb5\x1f\xfc\x0b\xc7\x5b\x9d\xb8\xdf\x0a\xa2\x16\x8a\x16\xad\x9f\xcf\x07\x70\xbf\xcb\x0f\xfc\x89\x3b\xa9\x49\x86\x96\x51\x62\x35\xbf\xe8\x6a\x13\xdf\x57\xca\xdf\x85\x5e\x0f\x06\x91\x7d\xfc\x77\x1e\xf4\xd8\x18\xc6\xd1\x91\xec\xb9\xb8\xea\xfb\xd4\x3e\x33\x38\xd9\xd3\x8f\xbf\xe0\xdb\xb3\x0b\x6a\x99\x86\x3c\xa1\x94\x03\xbc\x35\xbe\xfc\x8f\x48\xa4\x08\x11\xaa\x53\xc3\x94\x68\x17\x98\x38\x43\x73\x72\xa0\xfd\x2a\x46\xf3\x85\xfa\x54\x86\xd4\xe7\xc9\x8f\x96\xac\x63\x57\x14\x1c\x64\x4b\xc4\x31\x58\x33\x40\x53\xe5\x57\x7f\x48\xa6\x06\x1e\x4d\x82\xbe\xd4\x98\x9a\x33\x0b\xb5\x1d\x17\x77\x15\x4d\x48\xbb\xd7\xa6\x84\xe3\xf3\x07\xc3\x54\x11\x95\x19\x76\x0e\x83\x5e\xaf\x71\x66\xde\xe9\x07\xe8\x3b\x29\x41\x19\x1f\xc5\xc6\x7c\x80\xac\xe8\xe8\xad\xf6\x4c\x19\x40\x12\x07\x56\x34\x17\x18\xe7\x25\x50\x82\x2f\x13\x22\xc4\x7d\x3b\x99\xc1\xec\x62\x64\x68\x3b\xf3\x0f\xc0\x63\xe1\x76\xb1\x80\xb9\xb3\x25\xf7\x18\x79\x33\xa8\x39\x95\x51\x70\x02\xac\x52\xb9\xd4\xc7\x65\xa6\x60\xc6\x5e\x93\xa7\x48\xbf\x8b\x2f\xa1\xf3\x85\x94\x8b\xe1\xe7\x35\x02\x57\xa5\x2a\x65\x21\xd0\xb0\xcc\xc9\x90\xa3\xe0\xe1\xa0\x9f\x2d\xb8\x8f\x01\xcf\xb5\x70\xa6\xda\xde\x2e\xef\x25\x67\x57\xb7\x48\x1f\x0d\xad\xaf\x80\x0a\xe0\x26\x8d\x81\xa4\xed\x60\x45\x1c\xb5\xdf\x4e\x61\x78\xd0\x61\xf9\x4b\xdb\x96\x6d\xb6\x9d\x6e\x08\xcf\xce\x40\x5f\xaf\x4d\x2c\xb5\xe3\xc4\x05\xc6\xa2\xf5\x7b\x51\x9d\xff\x81\xd0\x4b\x21\x15\x06\xa8\xe3\x42\x7d\xde\x99\x5e\x00\xc7\xaf\x39\xf8\xa3\xe3\x7b\x45\x07\x0d\x88\xaa\xf5\x06\x93\xe0\x22\xe1\xf0\x66\x5b\xa7\x0d\x54\xa2\x5a\x33\x5a\x31\xcf\xd2\x12\xe8\xfc\xdb\x03\x40\x5e\xe3\x89\xa4\x9e\x98\xc3\x21\x34\xd6\xc0\xa0\x25\x49\xf4\xa4\x3f\x5f\xb1\x96\xc1\x13\x62\x2e\xc2\x6c\xaa\xe7\x11\x2a\x4f\x63\x79\xa6\xfc\x28\xee\xfd\x38\xe0\x79\xbb\x46\x76\x6b\xea\x5a\xa1\xb1\x7f\xe1\x24\xad\xc1\x8f\x11\xef\x2f\x5d\x3f\xf2\xe1\xc0\xeb\xb8\x84\x54\xc9\x63\x53\xf9\x2a\x5d\x73\x44\x1f\x52\x25\x62\x06\x5f\xa0\x94\xae\x3f\x13\x8e\xeb\x5d\x41\x1f\x60\xe0\xe1\x66\x72\xd4\x17\x73\xc3\xb8\x93\x4e\x2e\x67\x08\x75\x0d\xdf\x26\xad\xfc\x8c\xd6\x4d\x29\x01\xa6\xcc\x25\xc2\x41\xc0\xba\x47\x8f\xde\x5a\x1d\x0b\xb3\x28\x1a\x8b\xda\xc5\x36\x7f\xc4\xa6\x75\xdf\x69\x6f\xec\xbd\x27\x9e\xf6\x91\x20\x1c\xc5\x63\xcf\x83\xad\x9a\xd3\xe6\x94\x55\x9e\xc5\xa8\x99\x40\xd0\xb3\x20\xd8\x00\x08\x3d\xe5\xff\x81\xa9\xdc\xff\x0e\xff\xdb\x7d\xf8\x57\x38\x59\x9d\x1a\x58\xac\x1a\xaa\xa0\x32\x1f\xe8\x59\x39\xdb\x7c\xb8\x24\x7d\xeb\x51\xc5\x09\xef\x11\xbf\x08\x13\x50\x2e\x3e\xd0\xae\xc6\x96\x7c\x99\xd5\x0d\xa1\xb5\x64\xeb\xf4\xe3\x9a\xe7\xa8\x08\xfc\x12\x24\x98\x0e\x20\xc6\x1d\xde\x23\x31\xef\x73\x3c\x4c\xbf\x59\x4d\xad\x3c\xf1\x1d\xb4\xc0\xfe\xb5\x6b\x3d\x00\x3d\xba\x9e\x77\x08\x91\x7e\x0a\xcb\x7f\xdd\x20\x5e\x14\xb2\xac\xa5\x1c\x90\xd8\xbc\xcc\x0c\xce\x85\x15\x79\xf7\x4f\xa4\xda\x39\x37\xa5\x93\xf9\xb9\x0c\x55\x79\x7c\x40\x79\xe6\xdb\x22\x06\xe9\xc6\xf3\x83\xc2\x38\x0f\xbb\x19\xe0\xa8\x49\x0c\xed\xb5\x5f\x7e\x02\x93\x23\x15\x65\x92\x02\xa5\xbd\xf2\x6b\xb1\x02\xe2\xda\x59\x46\xd6\xf4\x6c\x88\x5b\x27\x3c\x0a\xed\x40\x9d\xd0\x53\x83\x16\x78\xb4\xaf\xc4\x19\x79\x8d\x13\x62\x57\x13\x71\x94\xc1\x40\x64\xa3\x5d\x18\xd7\x4a\x78\x8e\x77\x08\x53\x2d\x21\x8f\x23\xac\x41\xa2\x4f\xa8\x72\x1a\xf2\x3c\x83\xbf\x01\xed\xf2\xa6\x8c\x5f\x9f\xa2\x70\x81\x58\x5e\x72\xd4\xc0\xe6\x5c\x81\x2f\x9b\x19\x29\xba\xe4\xa1\x99\x05\x9b\x18\xad\xcb\xa0\x69\xba\x21\xde\xc6\x7d\x7e\x0d\x6b\x7f\xdf\x27\x3d\xdf\x71\x21\x7f\x2b\x73\x3f\x45\xc6\x6b\x74\xce\xf7\xf0\x6a\xe2\x25\xfe\x47\x28\xeb\x44\x3e\x1c\x00\x6b\xf9\x27\x73\xee\x60\xe7\xa1\x16\x51\xbf\xc4\x4f\x13\x5d\xc2\xd8\x6f\x63\xdb\xe8\x12\xb5\x89\xf2\x68\x18\x76\x97\xb9\x18\xa9\x1b\x1d\x45\xdc\x91\x65\x1e\x9c\x7d\x84\x4e\xdc\x85\x35\x06\xa6\xf6\x4e\xd7\x37\x97\x83\x12\x5e\x1e\x3d\x77\xe2\x62\x6f\x52\x2b\xb9\x8f\x01\x8d\xe5\xad\xdf\x6a\xce\x64\xde\x16\xa5\x0c\x51\xa1\x42\x51\xe3\x93\xc7\x8f\xc6\xed\x32\x46\xa3\x41\x43\xbb\x71\xa6\xea\x22\xfd\xfa\xb5\xd9\x6f\xe8\xe9\x5a\xbd\x7b\x14\x39\x89\x86\xeb\x9c\x9a\x9e\x8b\xd1\x7a\xa9\x81\xf3\x7f\x59\x3f\xbf\x98\xfa\x56\xf8\xba\xd5\x8b\x98\xf3\xe6\xab\xf1\x9b\x1f\x98\x6a\x02\x4a\xeb\xb8\x27\x81\xf0\x6a\xca\x55\x45\x95\xec\xa0\x84\x57\xc4\x7c\x8f\x48\x75\x9b\x8f\xe2\xaa\x6c\x0a\xc5\x19\xa2\x6e\x6d\xba\xcf\x0f\xcb\xa3\xb8\x44\x0c\x8b\xe7\x9f\xff\x3a\xdf\x5f\x40\x9e\xe7\x12\x96\xf7\x7d\x20\x39\xf3\x16\x18\x2e\x51\x14\xc6\x6b\xa2\xe4\x2a\xea\x1c\x6f\x94\xbe\x13\x8f\xdc\x9d\xe9\x49\x5f\x8b\xb6\xd7\xda\xed\x13\x11\x08\xc7\x59\x6e\x28\x7d\x9e\x8f\x2e\x0a\xc2\x08\x46\x2d\xa8\x14\xdc\x8a\x4d\x9f\x55\x7c\xfa\x2c\xe1\x88\x63\x66\x14\xbc\x27\xa3\xf7\xbb\xf2\xb7\x69\x28\xe3\x37\x6c\xc0\xd8\x5b\x0d\xcb\x22\x62\xe3\x46\x4a\x80\x91\xb1\x31\x06\xa0\x1c\xa9\x22\xb0\x0f\x1f\x04\x91\xb1\x98\xc8\x8b\xf5\x2b\x41\x08\x16\x09\x24\xfe\x27\x29\x59\xaa\xa2\xfc\x00\x6a\x62\x50\x3c\xc7\x3f\x54\xb2\xd0\xff\xe9\x45\xd2\xfd\x47\xf5\x14\x67\xec\xf7\x98\xa7\xc9\x2e\xd4\x55\x9b\x53\xb5\x70\xaa\x03\x29\xce\xf3\xe7\x72\xcb\x9f\xd5\xc0\x49\x3e\x02\x73\x3e\x19\xba\x67\xfb\x24\x89\x3a\x16\x9f\x7c\x32\x5e\xe2\x9f\xef\x47\x9e\x45\x08\x33\xd3\x4a\xa4\x0b\x10\x35\x57\xd3\x22\x59\xd3\xa1\x34\x03\x7f\xca\xbe\xb2\x25\x8e\x1c\xee\xd0\xbf\x13\x95\x3f\xe6\xc3\xe2\x3c\x7a\x00\x62\x2c\x90\xf8\xca\x45\x28\xf7\xc5\xed\xed\x2c\x77\xc9\x2d\xda\x57\xfc\xfb\x87\x10\xda\xad\xd8\xfb\x67\xa8\x56\x9e\x2d\xec\x37\xee\xc7\xa5\xd8\x86\xbd\x78\x03\xb6\x7b\xde\x6e\x4b\xe8\xa0\x59\xdc\x8d\x0e\x06\x14\xc3\x3d\xc9\xa8\x8c\x80\x4b\x46\xda\xdb\x5d\x60\x0b\x64\x88\xa0\xfc\xab\x9c\x3c\xff\x07\x3e\x5b\xfc\x45\x61\x00\xad\x48\xf6\x48\x73\x71\x0a\x67\x02\x5c\xaf\x97\x1f\xc0\xde\x91\x83\x47\xfb\x05\xdc\xc4\xa2\xc1\x5b\xa8\x2f\xbe\x91\xf7\x32\xbb\x99\xbc\x58\x8e\x72\x1f\x42\xe9\x8f\x88\xb5\xde\xe4\x89\xb2\xc4\x56\x77\xee\x92\xe7\x53\x7d\x00\xaa\x8a\x0d\x49\xa7\x70\xf0\x1c\x28\x61\x06\xec\x3b\xf5\xdf\xd9\x07\x85\xd0\x94\x3e\x7d\x94\x03\x18\xe1\xa0\x22\x9d\xc7\x7b\x85\xc6\xae\x65\x90\xa2\x5c\xec\x39\x3e\x4c\xa5\xff\xa3\x6f\x7a\x2a\xb5\x87\xf6\xef\x35\x45\xfe\x57\x28\xf3\x2f\x5e\xb4\x71\xaf\xb6\xf3\xc0\x55\xc6\xbb\xdb\x36\x99\xff\x66\xed\x47\x3b\x23\x14\xc2\x65\x6e\x4b\x0b\xc9\xcc\x2a\x28\xab\xb4\x61\x07\x00\xc2\xa0\xff\xed\x56\xf7\xcd\xf4\x7f\x46\x29\xfc\x0b\x81\xfe\xdf\xb5\x6a\xfb\x4f\xf0\x47\x8e\x72\xe7\xef\xf5\x01\x07\x1a\x9d\xe0\x38\xcf\x5f\xc2\xb4\xff\x6b\x91\x39\xf5\x97\x6b\x39\xfd\x7f\x16\x4c\x9b\x91\xec\xff\x47\x8f\xfc\xff\x0d\x70\xe0\x6c\xe1\xb2\xff\xff\x19\x03\xff\xdb\x92\xfd\xe1\xd7\xff\x2f\x00\x00\xff\xff\xfc\x4b\x38\xf0\x1e\x96\x00\x00") func testLargeJpg() ([]byte, error) { return bindataRead( _testLargeJpg, "testdata/test-large.jpg", ) } var _testMediumHTML = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x59\x5b\x73\xeb\xb6\xf1\x7f\xf7\xa7\x40\xf0\x9f\x7f\x9e\x0e\x05\x51\x92\x65\x2b\xa1\x78\x9a\x4b\xc7\x69\x9b\x4c\xcf\x24\x99\xe9\xf4\xa9\x83\xcb\x92\x84\x05\x02\x34\x00\xca\x56\xa6\x1f\xbe\x03\x90\xba\x50\xa6\xa4\xd3\x4e\xf2\x70\x2c\x02\xbb\xfb\xdb\xc5\x62\x77\xb1\xc0\xc9\xbe\xf8\xfe\xef\xdf\xfd\xfa\xcf\x4f\x7f\x46\x95\xaf\x55\x9e\x85\xbf\x48\x51\x5d\xae\x31\x68\x9c\xdf\x65\x15\x50\x81\x1a\x6b\x0a\xa9\x60\x8d\x2b\xef\x9b\xaf\x08\xa1\xab\x09\x37\x35\x49\x88\x6b\x80\x13\xd3\x80\x76\x40\x2d\xaf\x48\x3a\x49\x09\xce\xef\x10\xca\x6a\xf0\x14\xf1\x8a\x5a\x07\x7e\x8d\x5b\x5f\x24\x8f\x27\x04\x4d\x6b\x58\xe3\xad\x84\xd7\xc6\x58\x8f\x11\x37\xda\x83\xf6\x6b\xfc\x2a\x85\xaf\xd6\x02\xb6\x92\x43\x12\x07\x1f\x90\xd4\xd2\x4b\xaa\x12\xc7\xa9\x82\x75\x3a\x99\x76\x40\x4a\xea\x0d\xaa\x2c\x14\x6b\x4c\x12\xc2\x8c\xf1\xce\x5b\xda\x4c\x6a\xa9\x27\xdc\xb9\x8f\xdb\xf5\x23\x03\x9e\x32\x46\xe7\x30\x9b\x03\x67\x74\x36\xe3\x45\xc1\xd2\xd5\x03\x9d\x89\xc5\x62\x4a\x8b\x45\x3a\x65\xe9\xbd\xc0\xc8\x82\x5a\x63\xe7\x77\x0a\x5c\x05\xe0\xc7\x14\x38\xe9\xa1\xc7\x7d\x10\x8f\x69\x90\x5d\xf0\xc7\x95\x60\x30\x7f\x58\xce\x17\xf7\xc5\x92\x15\x30\x87\xe5\x8c\x2d\x60\x31\x15\x73\x31\x5d\x5e\xc0\xf5\xd2\x2b\xc8\x9f\xcc\xf7\x86\x67\xa4\x1b\xdc\x65\x24\x38\x3a\xbf\xcb\x98\x11\xbb\xfc\x2e\xd3\x74\x8b\xb8\xa2\xce\xad\xb1\xa6\x5b\x46\x2d\xea\x7e\x12\x01\x05\x6d\x95\xc7\xc8\x9a\xb0\x21\x9a\x6e\x65\x49\xbd\x34\xba\xc3\x16\xf2\x20\x17\x7c\x4a\xa5\x06\xfb\x8e\xd2\x43\x05\x8d\x3d\x15\xa1\x8c\xb5\xde\x1b\x8d\xfc\xae\x81\x35\xee\x06\xf8\x4c\xc0\x9b\xb2\x54\x80\x91\xa0\x9e\xf6\x83\xa0\x46\x29\xda\xb8\xc3\x34\xb5\x65\xd8\xf1\x49\x2f\x73\x20\x77\x6a\x10\xca\x5c\x43\xf5\x1e\xd8\xd9\xc4\x68\xb5\xc3\xf9\xaf\x11\x0d\x1d\x97\x93\x91\xc0\x37\x2a\x24\xb9\xd1\x09\xa3\x16\xe7\x7f\x0c\x53\x46\xba\xe5\xf7\x23\x7a\xe6\x05\x66\xa9\x16\x78\x1f\x18\x38\xcf\x9c\xb7\x46\x97\xfb\x0d\xed\x47\x19\xa1\xd1\xed\x44\xc8\xed\xfb\x9d\xe9\x7c\x82\xc6\x7d\x94\xb5\xea\x44\xe5\x9e\x49\xd3\xed\xc1\x87\x31\x38\xf7\x3c\x94\x7b\xb9\x05\x9c\x67\xf4\x68\xd3\x0f\xa6\x86\x60\x41\x46\x94\x1c\x08\x9d\x70\x25\x84\x32\xd3\x7a\x9c\x7f\x13\x7e\x86\xdc\x19\x69\x55\xff\x55\x18\x5b\x9f\x79\xe0\xc4\xaa\x48\xed\xbf\xad\x2c\x2b\x8f\x91\x14\x6b\xfc\x96\x74\x05\x01\xa3\x60\x9d\xd1\xc1\xa8\x3e\x62\x7b\x42\x9e\x49\xdd\xb4\x7e\x8f\x1c\x70\x92\x10\xb1\xd6\xa8\x21\x44\xf2\xd2\x82\xdd\xe1\x3e\x30\x3d\xbc\x79\xdc\x97\x8f\x17\x8c\x1a\x45\x39\x54\x46\x09\xb0\x6b\xfc\xcb\x1e\x99\x04\xb4\x13\xef\x1f\x7e\x34\x0d\x3f\x17\x73\x64\x40\x7a\x6e\x6b\x66\xc2\x5e\xee\x77\xa5\x9a\xe5\x9d\x06\x54\x18\x8b\x9e\x0c\xfa\x44\xf9\x86\x96\xe0\x32\x52\xcd\x3a\x9e\xbb\xde\x5f\xbd\xc4\x09\x5a\x5c\x6c\x52\x5a\xd3\x36\xc7\x4c\xb8\xe2\x81\xc3\x0a\x69\xeb\x4d\x61\x78\x1b\x36\x7a\xff\x89\xd1\x96\xaa\x16\xd6\x78\xd4\x01\xd1\xbc\xa6\xb3\x0d\xb1\x1d\x92\x75\xa8\xb1\xa8\xa1\xbe\x42\xc6\xa2\x0d\xec\x5e\x8d\x15\x93\x81\x47\xc7\xb3\xe3\x68\x73\xc2\xbc\x3e\x8d\xbe\xbe\x58\xf4\x8c\xcc\x6b\xc4\xbc\x3e\xd6\xa6\x0e\xd9\xb5\xac\x96\x1e\xe7\x4f\xe6\x8b\x61\x4a\x85\x8d\x39\x4d\xb7\x7d\x8a\xf4\xfb\xb6\xdf\xaf\xbb\xac\xe9\x92\x0a\x55\xc6\x79\x87\x84\xe1\x6d\x0d\xda\xc7\xfa\x10\x57\x79\x08\xe6\xfe\x5c\x2a\x4d\x38\xba\x26\xc6\x96\x24\xa8\x0d\x31\xbd\xf7\x84\xbb\x33\x1a\x7d\x2b\x3d\x6b\xf9\x06\xfc\x07\xf4\x24\xfd\x0f\x2d\xfb\x80\x9e\x8c\x09\x85\xe7\x93\x35\xcf\xc0\x3d\xfa\xc1\x38\x2f\x75\x89\xa8\x16\xe8\x47\xda\x6a\x5e\x35\x54\x4c\x10\xfa\x39\x1c\x83\xbe\x02\x94\xd1\x3b\x34\x9e\x41\xe8\x13\x2d\x63\xd2\x45\xd3\xa4\x0e\x8b\xe9\x4c\x8d\x5c\x88\x0a\x11\x90\xf7\xf6\x20\x6f\x50\x5c\xdd\x5d\xd0\x55\x1b\x0b\x93\xbb\x41\x00\x5a\xf3\x3a\x52\xd3\x55\xe2\xea\x64\x89\x0f\xf1\xd6\x85\xe6\x22\xff\x64\x9a\x56\x51\x7b\x1a\x94\x8b\x83\xb7\x8f\x05\x45\x49\xe7\x93\x56\xc7\x23\x49\xe0\x4b\xa5\xa1\x94\xbe\x6a\x59\x3c\xe3\xe9\xab\x0b\xff\x12\x27\x36\x49\x69\xc2\x27\xce\xaf\x92\x63\x21\xb9\x84\x26\x4a\x2b\x9f\xa9\xda\x52\xf2\xfc\xea\x93\xd2\x0c\xb0\xce\x89\x57\x91\x4a\xa9\x93\xd2\x68\xc9\xc3\xd7\x00\x66\x40\xb9\x8e\x61\x12\x0b\x42\x3a\x12\xff\x0e\x41\x06\xa4\x5b\x28\xee\x45\x25\xc2\xca\x2d\x58\x52\xef\xdc\x8b\x3a\x87\x3a\xa7\xdf\xc0\x0b\x41\x4c\x1a\x6b\xbc\x61\x6d\xd1\x7d\x9c\x21\x8e\x70\xdc\xc0\xac\x8d\x68\x15\xc4\xe5\x94\x66\x74\xc1\x23\x1c\x37\x30\xad\x54\x8a\x92\x57\x60\xce\x84\xa4\x3a\xc3\x3b\xa3\x5e\xc5\xaa\x76\x0d\x58\x05\xa2\x04\x4b\x0a\xca\xac\xe4\x84\x1b\x0b\x84\x57\x54\x6a\x6e\x04\x10\x57\xc9\x7a\xa0\xe0\xf3\x44\xae\x6a\x7d\x96\xfa\xb7\xaa\x0d\xa6\x0e\xa1\x4f\xe6\xaf\xca\x2b\xc9\x48\xf3\x32\x10\xed\xa6\xae\x4a\x35\x9b\x92\x80\xb5\xc6\x0e\x37\xe0\x38\x7d\x5d\xda\x9a\x1a\x7c\x05\xad\x23\x5c\x49\xd0\xfe\x5f\xc7\x68\xe8\x09\x43\xd8\xdb\xfc\x57\xf5\x59\xc3\x0a\x59\x12\x1e\x0f\xc2\xf1\xf9\xab\xf2\x4e\xda\xb6\x71\xa0\x89\x32\xa5\x3d\xb3\xed\x8c\x76\x1d\xc7\x5b\xf0\xbc\xb2\xc4\x83\xf3\xb2\xd8\x11\xea\x1c\xd8\x61\xcc\x5d\xe0\xb9\x8a\xdb\x6a\xf9\xd6\x48\xbe\x51\x40\x36\xb4\x32\xc6\x27\x15\xe5\x9b\x01\xec\x38\xcb\x08\xaa\x99\xb4\x0c\x6c\x3c\x7e\x7e\xa3\x0d\xce\xcf\x26\xc6\x24\x0e\xe7\xd5\x1b\xe1\x76\xd7\x78\x43\x9c\xab\x82\xe4\x28\xe1\x06\x82\x06\x4f\xe2\x4d\x2a\x9c\xe8\x97\x28\x37\x30\x0c\x6d\x7d\x35\x3b\x13\xef\x26\xc7\x24\xc3\xe1\x39\x39\xe1\x2d\x6d\xc3\x83\xf0\xd8\xfc\x98\x7c\xb3\x29\x27\x52\x93\xba\x34\x93\x6d\xd4\x3a\x98\xb8\x22\xb1\xa3\xb5\x1a\x8a\xf4\x33\xef\x65\x14\x65\xf2\x2d\x5a\xb1\x9d\x05\x60\x9c\x9f\xcf\xf4\xcd\xfa\xb0\xf3\xbd\xd2\xbd\x9f\x9e\xc1\xe1\xf0\xfd\xc9\x58\x18\x39\x79\x6f\x9e\xbb\xe7\x0d\x79\xb0\xed\xc9\xa0\x5f\x3c\xd5\x82\x5a\x71\x02\x49\x2f\x89\xb8\x96\x59\x68\x7a\xb9\x96\x25\x61\xe0\xa4\x37\x76\x77\x53\x3a\x34\x4d\x6e\xd8\x35\xbd\xca\x8d\x24\x7d\x2f\xe4\x70\xbe\xff\x42\x7f\x42\xa5\x49\x02\xf1\x26\xd6\x49\x36\xc6\x6e\xf4\xa3\x59\x0b\x70\xfc\x4b\x5a\x37\x5f\xbf\xac\x83\xa2\x96\x96\xf0\xff\xf3\x6f\x4a\x13\xe7\xdc\xda\x79\x6a\x5d\xfc\x8e\x6d\xe3\xcf\xfb\x05\x48\x70\x38\xff\xc9\x38\x8f\x22\x47\xd0\xfc\x01\x1d\x1b\x96\xdf\x41\x73\x61\xec\xe6\xa2\xe6\x3a\x68\x8e\x1c\x7f\x80\xe6\xb6\x11\xd4\x83\xb8\xa4\xdb\x02\x07\xed\xd5\x0e\xf5\x7c\xb1\xab\x34\xba\x6f\x5a\x07\x37\xb4\xe1\x15\xe7\xd0\x3b\xc7\x80\xed\xae\x51\x85\x31\x1e\xec\xe1\x2e\xcf\x15\x50\x5b\xc8\xb7\x1b\xef\x05\xd7\xd7\xd9\x9f\x21\xa5\x10\x86\x48\xe7\xda\x60\xf4\x3f\x80\x39\xe9\x01\xfd\x25\x8e\x0f\x81\x32\xb8\x52\x84\x02\x94\xd4\xad\x0f\x39\xf0\xef\xfe\x12\x70\xab\x8b\x47\x3f\xf6\x0e\x1c\x87\x6c\x5a\xa5\xfa\xab\xe7\x31\x1c\xff\x0f\xe7\xdf\x52\xbe\x09\x3d\xb6\x37\x5d\xe1\x3d\xdc\x38\xce\x3c\x76\xe2\x29\x57\x19\xeb\x79\xeb\x1d\x46\x9e\x32\xa9\x05\xbc\xad\x71\x92\x1e\x5c\x57\x1b\x41\x15\x7e\x7f\xb9\x8b\xf3\x89\x90\x54\x99\xf2\x98\xdb\xef\x18\xfa\x47\xae\xd3\xae\xfb\x1d\xcf\xe0\x4d\x66\x78\xd9\x1a\x7d\x99\xe1\xca\x1c\x9e\x5e\x84\x74\xb5\x3c\xda\x89\xa8\x95\x34\xa9\xa4\x10\xa0\xd7\xd8\xdb\x16\x70\xfe\xa5\x97\x35\xb8\xaf\xcf\xaf\x63\x7d\x1d\x1b\x9a\x12\x5f\xa6\x70\xfe\x37\xd8\x31\x13\x8a\xd1\xc1\x3b\xa7\x57\x8b\x93\x1a\x79\x69\x49\xcc\x88\xdd\x70\x41\x9e\x32\x05\xc3\x19\x9b\x67\x5e\x20\xaa\x64\xa9\xd7\x78\xbf\x9b\x2c\xff\x98\x11\x96\x67\xc4\x8b\x40\xce\xd1\x57\xe8\xd7\x4a\x3a\x54\x83\x6e\xbb\x49\xe2\xed\x67\xe1\x90\x73\x9c\xfe\xaa\x1c\x02\xf6\x12\xd2\x58\xcc\x8e\x82\x17\xe7\xe0\x7f\x6d\xeb\x26\x84\x9e\x14\xa0\xbd\x2c\x24\xd8\xff\xce\xda\x32\x00\x86\xdb\xa6\x46\xfb\xd1\x29\xfc\x93\xe9\xe3\x1a\x99\x02\x35\x31\x31\xfe\x77\x74\x36\x8e\x0e\x5a\xdc\x42\xff\x6c\xff\x0c\x15\xca\x71\x85\x31\xdb\x7e\x67\x55\x70\x61\x6d\x6f\xb4\x6e\x54\x28\x51\x63\xda\xc8\x59\x74\xde\x8c\xef\xbe\xbe\x7e\x76\xca\x32\xaf\xc7\x13\x36\xff\x2e\x24\xf3\xfb\xa7\x92\x83\xfe\x93\x97\x92\xc1\xbb\x96\xe3\x56\x36\x1e\x39\xcb\x63\x4b\xf0\x1c\x5f\xcc\x92\xd9\x64\x3a\x99\xc7\xd7\xf0\x67\xf7\x71\xbb\x2e\x58\xb1\xe2\x0f\x0f\x62\xca\x17\x30\xe7\xf3\x05\x5d\x3c\xde\xaf\x1e\xa7\x3c\x85\xfb\x79\xba\x64\xcb\x59\x3a\x4b\x97\x53\xfe\x18\xdf\x42\x23\xe0\x7b\xe4\xe1\x23\x7b\x84\xbd\xa7\x82\x3e\xf0\x74\x3a\x2f\x78\x2a\x80\x32\xbe\x9a\xdd\x73\x9e\x16\x82\x31\xb6\x84\xc5\x7d\xca\x67\x69\xc1\x1f\xa6\xd7\x60\xe3\xd3\x7a\x44\x9b\x3f\xa4\x02\x1e\xe6\x29\x4f\x1f\xc5\x2a\xe5\x8b\xd5\x4a\xac\xa6\x2c\xa5\x6c\xca\x8a\xf9\x0a\x78\xb1\x5c\x8a\x25\x2f\x1e\x06\x68\xa4\x7f\x33\x27\xf1\xbf\x30\xfe\x13\x00\x00\xff\xff\xaa\x02\x23\x78\xd2\x18\x00\x00") func testMediumHTML() ([]byte, error) { return bindataRead( _testMediumHTML, "testdata/test-medium.html", ) } var _testSmallTxt = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x0a\xc9\xc8\x2c\x56\xc8\x2c\x56\x48\x54\x28\x49\xad\x28\x51\x48\xcb\xcc\x49\xd5\x03\x04\x00\x00\xff\xff\x11\xe2\x00\xb1\x14\x00\x00\x00") func testSmallTxt() ([]byte, error) { return bindataRead( _testSmallTxt, "testdata/test-small.txt", ) } // Asset loads and returns the asset for the given name. // It returns an error if the asset could not be found or // could not be loaded. func Asset(name string) ([]byte, error) { cannonicalName := strings.Replace(name, "\\", "/", -1) if f, ok := _bindata[cannonicalName]; ok { return f() } return nil, fmt.Errorf("Asset %s not found", name) } // AssetNames returns the names of the assets. func AssetNames() []string { names := make([]string, 0, len(_bindata)) for name := range _bindata { names = append(names, name) } return names } // _bindata is a table, holding each asset generator, mapped to its name. var _bindata = map[string]func() ([]byte, error){ "test-large.jpg": testLargeJpg, "test-medium.html": testMediumHTML, "test-small.txt": testSmallTxt, } // AssetDir returns the file names below a certain // directory embedded in the file by go-bindata. // For example if you run go-bindata on data/... and data contains the // following hierarchy: // // data/ // foo.txt // img/ // a.png // b.png // // then AssetDir("data") would return []string{"foo.txt", "img"} // AssetDir("data/img") would return []string{"a.png", "b.png"} // AssetDir("foo.txt") and AssetDir("notexist") would return an error // AssetDir("") will return []string{"data"}. func AssetDir(name string) ([]string, error) { node := _bintree if len(name) != 0 { cannonicalName := strings.Replace(name, "\\", "/", -1) pathList := strings.SplitSeq(cannonicalName, "/") for p := range pathList { node = node.Children[p] if node == nil { return nil, fmt.Errorf("Asset %s not found", name) } } } if node.Func != nil { return nil, fmt.Errorf("Asset %s not found", name) } rv := make([]string, 0, len(node.Children)) for name := range node.Children { rv = append(rv, name) } return rv, nil } type _bintreeT struct { Func func() ([]byte, error) Children map[string]*_bintreeT } var _bintree = &_bintreeT{nil, map[string]*_bintreeT{ "testdata": {nil, map[string]*_bintreeT{ "test-large.jpg": {testLargeJpg, map[string]*_bintreeT{}}, "test-medium.html": {testMediumHTML, map[string]*_bintreeT{}}, "test-small.txt": {testSmallTxt, map[string]*_bintreeT{}}, }}, }} ================================================ FILE: blob/drivertest/drivertest.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package drivertest provides a conformance test for implementations of // driver. package drivertest // import "gocloud.dev/blob/drivertest" import ( "bytes" "context" "crypto/md5" "errors" "fmt" "io" "log" "net/http" "net/url" "reflect" "regexp" "strconv" "strings" "sync" "sync/atomic" "testing" "testing/iotest" "time" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "gocloud.dev/blob" "gocloud.dev/blob/driver" "gocloud.dev/gcerrors" "gocloud.dev/internal/escape" ) // Harness descibes the functionality test harnesses must provide to run // conformance tests. type Harness interface { // MakeDriver creates a driver.Bucket to test. // Multiple calls to MakeDriver during a test run must refer to the // same storage bucket; i.e., a blob created using one driver.Bucket must // be readable by a subsequent driver.Bucket. MakeDriver(ctx context.Context) (driver.Bucket, error) // MakeDriverForNonexistentBucket creates a driver.Bucket for a nonexistent // bucket. If that concept doesn't make sense for a driver, return (nil, nil). MakeDriverForNonexistentBucket(ctx context.Context) (driver.Bucket, error) // HTTPClient should return an unauthorized *http.Client, or nil. // Required if the service supports SignedURL. HTTPClient() *http.Client // Close closes resources used by the harness. Close() } // HarnessMaker describes functions that construct a harness for running tests. // It is called exactly once per test; Harness.Close() will be called when the test is complete. type HarnessMaker func(ctx context.Context, t *testing.T) (Harness, error) // AsTest represents a test of As functionality. // The conformance test: // 1. Calls BucketCheck. // 2. Creates a blob in a directory, using BeforeWrite as a WriterOption. // 3. Fetches the blob's attributes and calls AttributeCheck. // 4. Creates a Reader for the blob using BeforeReader as a ReaderOption, // // and calls ReaderCheck with the resulting Reader. // // 5. Calls List using BeforeList as a ListOption, with Delimiter set so // // that only the directory is returned, and calls ListObjectCheck // on the single directory list entry returned. // // 6. Calls List using BeforeList as a ListOption, and calls ListObjectCheck // // on the single blob entry returned. // // 7. Tries to read a non-existent blob, and calls ErrorCheck with the error. // 8. Makes a copy of the blob, using BeforeCopy as a CopyOption. // 9. Calls SignedURL using BeforeSign as a SignedURLOption for each supported // // signing method (i.e. GET, PUT and DELETE). // // For example, an AsTest might set a driver-specific field to a custom // value in BeforeWrite, and then verify the custom value was returned in // AttributesCheck and/or ReaderCheck. type AsTest interface { // Name should return a descriptive name for the test. Name() string // BucketCheck will be called to allow verification of Bucket.As. BucketCheck(b *blob.Bucket) error // ErrorCheck will be called to allow verification of Bucket.ErrorAs. ErrorCheck(b *blob.Bucket, err error) error // BeforeRead will be passed directly to ReaderOptions as part of reading // a test blob. BeforeRead(as func(any) bool) error // BeforeWrite will be passed directly to WriterOptions as part of creating // a test blob. BeforeWrite(as func(any) bool) error // BeforeCopy will be passed directly to CopyOptions as part of copying // the test blob. BeforeCopy(as func(any) bool) error // BeforeList will be passed directly to ListOptions as part of listing the // test blob. BeforeList(as func(any) bool) error // BeforeSign will be passed directly to SignedURLOptions as part of // generating a signed URL to the test blob. BeforeSign(as func(any) bool) error // AttributesCheck will be called after fetching the test blob's attributes. // It should call attrs.As and verify the results. AttributesCheck(attrs *blob.Attributes) error // ReaderCheck will be called after creating a blob.Reader. // It should call r.As and verify the results. ReaderCheck(r *blob.Reader) error // ListObjectCheck will be called after calling List with the test object's // name as the Prefix. It should call o.As and verify the results. ListObjectCheck(o *blob.ListObject) error } type verifyAsFailsOnNil struct{} func (verifyAsFailsOnNil) Name() string { return "verify As returns false when passed nil" } func (verifyAsFailsOnNil) BucketCheck(b *blob.Bucket) error { if b.As(nil) { return errors.New("want Bucket.As to return false when passed nil") } return nil } func (verifyAsFailsOnNil) ErrorCheck(b *blob.Bucket, err error) (ret error) { defer func() { if recover() == nil { ret = errors.New("want ErrorAs to panic when passed nil") } }() b.ErrorAs(err, nil) return nil } func (verifyAsFailsOnNil) BeforeRead(as func(any) bool) error { if as(nil) { return errors.New("want BeforeReader's As to return false when passed nil") } return nil } func (verifyAsFailsOnNil) BeforeWrite(as func(any) bool) error { if as(nil) { return errors.New("want BeforeWrite's As to return false when passed nil") } return nil } func (verifyAsFailsOnNil) BeforeCopy(as func(any) bool) error { if as(nil) { return errors.New("want BeforeCopy's As to return false when passed nil") } return nil } func (verifyAsFailsOnNil) BeforeList(as func(any) bool) error { if as(nil) { return errors.New("want BeforeList's As to return false when passed nil") } return nil } func (verifyAsFailsOnNil) BeforeSign(as func(any) bool) error { if as(nil) { return errors.New("want BeforeSign's As to return false when passed nil") } return nil } func (verifyAsFailsOnNil) AttributesCheck(attrs *blob.Attributes) error { if attrs.As(nil) { return errors.New("want Attributes.As to return false when passed nil") } return nil } func (verifyAsFailsOnNil) ReaderCheck(r *blob.Reader) error { if r.As(nil) { return errors.New("want Reader.As to return false when passed nil") } return nil } func (verifyAsFailsOnNil) ListObjectCheck(o *blob.ListObject) error { if o.As(nil) { return errors.New("want ListObject.As to return false when passed nil") } return nil } // RunConformanceTests runs conformance tests for driver implementations of blob. func RunConformanceTests(t *testing.T, newHarness HarnessMaker, asTests []AsTest) { t.Helper() t.Run("TestNonexistentBucket", func(t *testing.T) { testNonexistentBucket(t, newHarness) }) t.Run("TestList", func(t *testing.T) { testList(t, newHarness) }) t.Run("TestListWeirdKeys", func(t *testing.T) { testListWeirdKeys(t, newHarness) }) t.Run("TestListDelimiters", func(t *testing.T) { testListDelimiters(t, newHarness) }) t.Run("TestDirsWithCharactersBeforeDelimiter", func(t *testing.T) { testDirsWithCharactersBeforeDelimiter(t, newHarness) }) t.Run("TestRead", func(t *testing.T) { testRead(t, newHarness) }) t.Run("TestAttributes", func(t *testing.T) { testAttributes(t, newHarness) }) t.Run("TestWrite", func(t *testing.T) { testWrite(t, newHarness) }) t.Run("TestCanceledWrite", func(t *testing.T) { testCanceledWrite(t, newHarness) }) t.Run("TestConcurrentWriteAndRead", func(t *testing.T) { testConcurrentWriteAndRead(t, newHarness) }) t.Run("TestUploadDownload", func(t *testing.T) { testUploadDownload(t, newHarness) }) t.Run("TestMetadata", func(t *testing.T) { testMetadata(t, newHarness) }) t.Run("TestMD5", func(t *testing.T) { testMD5(t, newHarness) }) t.Run("TestCopy", func(t *testing.T) { testCopy(t, newHarness) }) t.Run("TestDelete", func(t *testing.T) { testDelete(t, newHarness) }) t.Run("TestKeys", func(t *testing.T) { testKeys(t, newHarness) }) t.Run("TestSignedURL", func(t *testing.T) { testSignedURL(t, newHarness) }) t.Run("TestIfNotExist", func(t *testing.T) { testIfNotExist(t, newHarness) }) asTests = append(asTests, verifyAsFailsOnNil{}) t.Run("TestAs", func(t *testing.T) { for _, st := range asTests { if st.Name() == "" { t.Fatalf("AsTest.Name is required") } t.Run(st.Name(), func(t *testing.T) { testAs(t, newHarness, st) }) } }) } // RunBenchmarks runs benchmarks for driver implementations of blob. func RunBenchmarks(b *testing.B, bkt *blob.Bucket) { b.Helper() b.Run("BenchmarkRead", func(b *testing.B) { benchmarkRead(b, bkt) }) b.Run("BenchmarkWriteReadDelete", func(b *testing.B) { benchmarkWriteReadDelete(b, bkt) }) } // testNonexistentBucket tests the functionality of IsAccessible. func testNonexistentBucket(t *testing.T, newHarness HarnessMaker) { t.Helper() ctx := context.Background() h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() // Get a driver instance pointing to a nonexistent bucket. { drv, err := h.MakeDriverForNonexistentBucket(ctx) if err != nil { t.Fatal(err) } if drv == nil { // No such thing as a "nonexistent bucket" for this driver. t.Skip() } b := blob.NewBucket(drv) defer b.Close() exists, err := b.IsAccessible(ctx) if err != nil { t.Fatal(err) } if exists { t.Error("got IsAccessible true for nonexistent bucket, want false") } } // Verify that IsAccessible returns true for a real bucket. { drv, err := h.MakeDriver(ctx) if err != nil { t.Fatal(err) } b := blob.NewBucket(drv) defer b.Close() exists, err := b.IsAccessible(ctx) if err != nil { t.Fatal(err) } if !exists { t.Error("got IsAccessible false for real bucket, want true") } } } // testList tests the functionality of List. func testList(t *testing.T, newHarness HarnessMaker) { t.Helper() const keyPrefix = "blob-for-list" content := []byte("hello") keyForIndex := func(i int) string { return fmt.Sprintf("%s-%d", keyPrefix, i) } gotIndices := func(t *testing.T, objs []*driver.ListObject) []int { t.Helper() var got []int for _, obj := range objs { if !strings.HasPrefix(obj.Key, keyPrefix) { t.Errorf("got name %q, expected it to have prefix %q", obj.Key, keyPrefix) continue } i, err := strconv.Atoi(obj.Key[len(keyPrefix)+1:]) if err != nil { t.Error(err) continue } got = append(got, i) } return got } tests := []struct { name string pageSize int prefix string wantPages [][]int want []int }{ { name: "no objects", prefix: "no-objects-with-this-prefix", wantPages: [][]int{nil}, }, { name: "exactly 1 object due to prefix", prefix: keyForIndex(1), wantPages: [][]int{{1}}, want: []int{1}, }, { name: "no pagination", prefix: keyPrefix, wantPages: [][]int{{0, 1, 2}}, want: []int{0, 1, 2}, }, { name: "by 1", prefix: keyPrefix, pageSize: 1, wantPages: [][]int{{0}, {1}, {2}}, want: []int{0, 1, 2}, }, { name: "by 2", prefix: keyPrefix, pageSize: 2, wantPages: [][]int{{0, 1}, {2}}, want: []int{0, 1, 2}, }, { name: "by 3", prefix: keyPrefix, pageSize: 3, wantPages: [][]int{{0, 1, 2}}, want: []int{0, 1, 2}, }, } ctx := context.Background() // Creates blobs for sub-tests below. // We only create the blobs once, for efficiency and because there's // no guarantee that after we create them they will be immediately returned // from List. The very first time the test is run against a Bucket, it may be // flaky due to this race. init := func(t *testing.T) (driver.Bucket, func()) { t.Helper() h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } drv, err := h.MakeDriver(ctx) if err != nil { t.Fatal(err) } // See if the blobs are already there. b := blob.NewBucket(drv) iter := b.List(&blob.ListOptions{Prefix: keyPrefix}) found := iterToSetOfKeys(ctx, t, iter) for i := range 3 { key := keyForIndex(i) if !found[key] { if err := b.WriteAll(ctx, key, content, nil); err != nil { b.Close() t.Fatal(err) } } } return drv, func() { b.Close(); h.Close() } } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { drv, done := init(t) defer done() var gotPages [][]int var got []int var nextPageToken []byte for { page, err := drv.ListPaged(ctx, &driver.ListOptions{ PageSize: tc.pageSize, Prefix: tc.prefix, PageToken: nextPageToken, }) if err != nil { t.Fatal(err) } gotThisPage := gotIndices(t, page.Objects) got = append(got, gotThisPage...) gotPages = append(gotPages, gotThisPage) if len(page.NextPageToken) == 0 { break } nextPageToken = page.NextPageToken } if diff := cmp.Diff(gotPages, tc.wantPages); diff != "" { t.Errorf("got\n%v\nwant\n%v\ndiff\n%s", gotPages, tc.wantPages, diff) } if diff := cmp.Diff(got, tc.want); diff != "" { t.Errorf("got\n%v\nwant\n%v\ndiff\n%s", got, tc.want, diff) } }) } // Verify pagination works when inserting in a retrieved page. t.Run("PaginationConsistencyAfterInsert", func(t *testing.T) { drv, done := init(t) defer done() // Fetch a page of 2 results: 0, 1. page, err := drv.ListPaged(ctx, &driver.ListOptions{ PageSize: 2, Prefix: keyPrefix, }) if err != nil { t.Fatal(err) } got := gotIndices(t, page.Objects) want := []int{0, 1} if diff := cmp.Diff(got, want); diff != "" { t.Fatalf("got\n%v\nwant\n%v\ndiff\n%s", got, want, diff) } // Insert a key "0a" in the middle of the page we already retrieved. b := blob.NewBucket(drv) defer b.Close() key := page.Objects[0].Key + "a" if err := b.WriteAll(ctx, key, content, nil); err != nil { t.Fatal(err) } defer func() { _ = b.Delete(ctx, key) }() // Fetch the next page. It should not include 0, 0a, or 1, and it should // include 2. page, err = drv.ListPaged(ctx, &driver.ListOptions{ Prefix: keyPrefix, PageToken: page.NextPageToken, }) if err != nil { t.Fatal(err) } got = gotIndices(t, page.Objects) want = []int{2} if diff := cmp.Diff(got, want); diff != "" { t.Errorf("got\n%v\nwant\n%v\ndiff\n%s", got, want, diff) } }) // Verify pagination works when deleting in a retrieved page. t.Run("PaginationConsistencyAfterDelete", func(t *testing.T) { drv, done := init(t) defer done() // Fetch a page of 2 results: 0, 1. page, err := drv.ListPaged(ctx, &driver.ListOptions{ PageSize: 2, Prefix: keyPrefix, }) if err != nil { t.Fatal(err) } got := gotIndices(t, page.Objects) want := []int{0, 1} if diff := cmp.Diff(got, want); diff != "" { t.Fatalf("got\n%v\nwant\n%v\ndiff\n%s", got, want, diff) } // Delete key "1". b := blob.NewBucket(drv) defer b.Close() key := page.Objects[1].Key if err := b.Delete(ctx, key); err != nil { t.Fatal(err) } defer func() { _ = b.WriteAll(ctx, key, content, nil) }() // Fetch the next page. It should not include 0 or 1, and it should // include 2. page, err = drv.ListPaged(ctx, &driver.ListOptions{ Prefix: keyPrefix, PageToken: page.NextPageToken, }) if err != nil { t.Fatal(err) } got = gotIndices(t, page.Objects) want = []int{2} if diff := cmp.Diff(got, want); diff != "" { t.Errorf("got\n%v\nwant\n%v\ndiff\n%s", got, want, diff) } }) } // testListWeirdKeys tests the functionality of List on weird keys. func testListWeirdKeys(t *testing.T, newHarness HarnessMaker) { t.Helper() const keyPrefix = "list-weirdkeys-" content := []byte("hello") ctx := context.Background() // We're going to create a blob for each of the weird key strings, and // then verify we can see them with List. want := map[string]bool{} for _, k := range escape.WeirdStrings { want[keyPrefix+k] = true } // Creates blobs for sub-tests below. // We only create the blobs once, for efficiency and because there's // no guarantee that after we create them they will be immediately returned // from List. The very first time the test is run against a Bucket, it may be // flaky due to this race. init := func(t *testing.T) (*blob.Bucket, func()) { t.Helper() h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } drv, err := h.MakeDriver(ctx) if err != nil { t.Fatal(err) } // See if the blobs are already there. b := blob.NewBucket(drv) iter := b.List(&blob.ListOptions{Prefix: keyPrefix}) found := iterToSetOfKeys(ctx, t, iter) for _, k := range escape.WeirdStrings { key := keyPrefix + k if !found[key] { if err := b.WriteAll(ctx, key, content, nil); err != nil { b.Close() t.Fatal(err) } } } return b, func() { b.Close(); h.Close() } } b, done := init(t) defer done() iter := b.List(&blob.ListOptions{Prefix: keyPrefix}) got := iterToSetOfKeys(ctx, t, iter) if diff := cmp.Diff(got, want); diff != "" { t.Errorf("got\n%v\nwant\n%v\ndiff\n%s", got, want, diff) } } // listResult is a recursive view of the hierarchy. It's used to verify List // using Delimiter. type listResult struct { Key string IsDir bool // If IsDir is true and recursion is enabled, the recursive listing of the directory. Sub []listResult } // doList lists b using prefix and delim. // If recurse is true, it recurses into directories filling in listResult.Sub. func doList(ctx context.Context, b *blob.Bucket, prefix, delim string, recurse bool) ([]listResult, error) { iter := b.List(&blob.ListOptions{ Prefix: prefix, Delimiter: delim, }) var retval []listResult for { obj, err := iter.Next(ctx) if err == io.EOF { if obj != nil { return nil, errors.New("obj is not nil on EOF") } break } if err != nil { return nil, err } var sub []listResult if obj.IsDir && recurse { sub, err = doList(ctx, b, obj.Key, delim, true) if err != nil { return nil, err } } retval = append(retval, listResult{ Key: obj.Key, IsDir: obj.IsDir, Sub: sub, }) } return retval, nil } // testListDelimiters tests the functionality of List using Delimiters. func testListDelimiters(t *testing.T, newHarness HarnessMaker) { t.Helper() const keyPrefix = "blob-for-delimiters-" content := []byte("hello") // The set of files to use for these tests. The strings in each entry will // be joined using delim, so the result is a directory structure like this // (using / as delimiter): // dir1/a.txt // dir1/b.txt // dir1/subdir/c.txt // dir1/subdir/d.txt // dir2/e.txt // f.txt keys := [][]string{ {"dir1", "a.txt"}, {"dir1", "b.txt"}, {"dir1", "subdir", "c.txt"}, {"dir1", "subdir", "d.txt"}, {"dir2", "e.txt"}, {"f.txt"}, } // Test with several different delimiters. tests := []struct { name, delim string // Expected result of doList with an empty delimiter. // All keys should be listed at the top level, with no directories. wantFlat []listResult // Expected result of doList with delimiter and recurse = true. // All keys should be listed, with keys in directories in the Sub field // of their directory. wantRecursive []listResult // Expected result of repeatedly calling driver.ListPaged with delimiter // and page size = 1. wantPaged []listResult // expected result of doList with delimiter and recurse = false // after dir2/e.txt is deleted // dir1/ and f.txt should be listed; dir2/ should no longer be present // because there are no keys in it. wantAfterDel []listResult }{ { name: "fwdslash", delim: "/", wantFlat: []listResult{ {Key: keyPrefix + "/dir1/a.txt"}, {Key: keyPrefix + "/dir1/b.txt"}, {Key: keyPrefix + "/dir1/subdir/c.txt"}, {Key: keyPrefix + "/dir1/subdir/d.txt"}, {Key: keyPrefix + "/dir2/e.txt"}, {Key: keyPrefix + "/f.txt"}, }, wantRecursive: []listResult{ { Key: keyPrefix + "/dir1/", IsDir: true, Sub: []listResult{ {Key: keyPrefix + "/dir1/a.txt"}, {Key: keyPrefix + "/dir1/b.txt"}, { Key: keyPrefix + "/dir1/subdir/", IsDir: true, Sub: []listResult{ {Key: keyPrefix + "/dir1/subdir/c.txt"}, {Key: keyPrefix + "/dir1/subdir/d.txt"}, }, }, }, }, { Key: keyPrefix + "/dir2/", IsDir: true, Sub: []listResult{ {Key: keyPrefix + "/dir2/e.txt"}, }, }, {Key: keyPrefix + "/f.txt"}, }, wantPaged: []listResult{ { Key: keyPrefix + "/dir1/", IsDir: true, }, { Key: keyPrefix + "/dir2/", IsDir: true, }, {Key: keyPrefix + "/f.txt"}, }, wantAfterDel: []listResult{ { Key: keyPrefix + "/dir1/", IsDir: true, }, {Key: keyPrefix + "/f.txt"}, }, }, { name: "backslash", delim: "\\", wantFlat: []listResult{ {Key: keyPrefix + "\\dir1\\a.txt"}, {Key: keyPrefix + "\\dir1\\b.txt"}, {Key: keyPrefix + "\\dir1\\subdir\\c.txt"}, {Key: keyPrefix + "\\dir1\\subdir\\d.txt"}, {Key: keyPrefix + "\\dir2\\e.txt"}, {Key: keyPrefix + "\\f.txt"}, }, wantRecursive: []listResult{ { Key: keyPrefix + "\\dir1\\", IsDir: true, Sub: []listResult{ {Key: keyPrefix + "\\dir1\\a.txt"}, {Key: keyPrefix + "\\dir1\\b.txt"}, { Key: keyPrefix + "\\dir1\\subdir\\", IsDir: true, Sub: []listResult{ {Key: keyPrefix + "\\dir1\\subdir\\c.txt"}, {Key: keyPrefix + "\\dir1\\subdir\\d.txt"}, }, }, }, }, { Key: keyPrefix + "\\dir2\\", IsDir: true, Sub: []listResult{ {Key: keyPrefix + "\\dir2\\e.txt"}, }, }, {Key: keyPrefix + "\\f.txt"}, }, wantPaged: []listResult{ { Key: keyPrefix + "\\dir1\\", IsDir: true, }, { Key: keyPrefix + "\\dir2\\", IsDir: true, }, {Key: keyPrefix + "\\f.txt"}, }, wantAfterDel: []listResult{ { Key: keyPrefix + "\\dir1\\", IsDir: true, }, {Key: keyPrefix + "\\f.txt"}, }, }, { name: "abc", delim: "abc", wantFlat: []listResult{ {Key: keyPrefix + "abcdir1abca.txt"}, {Key: keyPrefix + "abcdir1abcb.txt"}, {Key: keyPrefix + "abcdir1abcsubdirabcc.txt"}, {Key: keyPrefix + "abcdir1abcsubdirabcd.txt"}, {Key: keyPrefix + "abcdir2abce.txt"}, {Key: keyPrefix + "abcf.txt"}, }, wantRecursive: []listResult{ { Key: keyPrefix + "abcdir1abc", IsDir: true, Sub: []listResult{ {Key: keyPrefix + "abcdir1abca.txt"}, {Key: keyPrefix + "abcdir1abcb.txt"}, { Key: keyPrefix + "abcdir1abcsubdirabc", IsDir: true, Sub: []listResult{ {Key: keyPrefix + "abcdir1abcsubdirabcc.txt"}, {Key: keyPrefix + "abcdir1abcsubdirabcd.txt"}, }, }, }, }, { Key: keyPrefix + "abcdir2abc", IsDir: true, Sub: []listResult{ {Key: keyPrefix + "abcdir2abce.txt"}, }, }, {Key: keyPrefix + "abcf.txt"}, }, wantPaged: []listResult{ { Key: keyPrefix + "abcdir1abc", IsDir: true, }, { Key: keyPrefix + "abcdir2abc", IsDir: true, }, {Key: keyPrefix + "abcf.txt"}, }, wantAfterDel: []listResult{ { Key: keyPrefix + "abcdir1abc", IsDir: true, }, {Key: keyPrefix + "abcf.txt"}, }, }, } ctx := context.Background() // Creates blobs for sub-tests below. // We only create the blobs once, for efficiency and because there's // no guarantee that after we create them they will be immediately returned // from List. The very first time the test is run against a Bucket, it may be // flaky due to this race. init := func(t *testing.T, delim string) (driver.Bucket, *blob.Bucket, func()) { t.Helper() h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } drv, err := h.MakeDriver(ctx) if err != nil { t.Fatal(err) } b := blob.NewBucket(drv) // See if the blobs are already there. prefix := keyPrefix + delim iter := b.List(&blob.ListOptions{Prefix: prefix}) found := iterToSetOfKeys(ctx, t, iter) for _, keyParts := range keys { key := prefix + strings.Join(keyParts, delim) if !found[key] { if err := b.WriteAll(ctx, key, content, nil); err != nil { b.Close() t.Fatal(err) } } } return drv, b, func() { b.Close(); h.Close() } } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { drv, b, done := init(t, tc.delim) defer done() // Fetch without using delimiter. got, err := doList(ctx, b, keyPrefix+tc.delim, "", true) if err != nil { t.Fatal(err) } if diff := cmp.Diff(got, tc.wantFlat); diff != "" { t.Errorf("with no delimiter, got\n%v\nwant\n%v\ndiff\n%s", got, tc.wantFlat, diff) } // Fetch using delimiter, recursively. got, err = doList(ctx, b, keyPrefix+tc.delim, tc.delim, true) if err != nil { t.Fatal(err) } if diff := cmp.Diff(got, tc.wantRecursive); diff != "" { t.Errorf("with delimiter, got\n%v\nwant\n%v\ndiff\n%s", got, tc.wantRecursive, diff) } // Test pagination via driver.ListPaged. var nextPageToken []byte got = nil for { page, err := drv.ListPaged(ctx, &driver.ListOptions{ Prefix: keyPrefix + tc.delim, Delimiter: tc.delim, PageSize: 1, PageToken: nextPageToken, }) if err != nil { t.Fatal(err) } if len(page.Objects) > 1 { t.Errorf("got %d objects on a page, want 0 or 1", len(page.Objects)) } for _, obj := range page.Objects { got = append(got, listResult{ Key: obj.Key, IsDir: obj.IsDir, }) } if len(page.NextPageToken) == 0 { break } nextPageToken = page.NextPageToken } if diff := cmp.Diff(got, tc.wantPaged); diff != "" { t.Errorf("paged got\n%v\nwant\n%v\ndiff\n%s", got, tc.wantPaged, diff) } // Delete dir2/e.txt and verify that dir2/ is no longer returned. key := strings.Join(append([]string{keyPrefix}, "dir2", "e.txt"), tc.delim) if err := b.Delete(ctx, key); err != nil { t.Fatal(err) } // Attempt to restore dir2/e.txt at the end of the test for the next run. defer func() { _ = b.WriteAll(ctx, key, content, nil) }() got, err = doList(ctx, b, keyPrefix+tc.delim, tc.delim, false) if err != nil { t.Fatal(err) } if diff := cmp.Diff(got, tc.wantAfterDel); diff != "" { t.Errorf("after delete, got\n%v\nwant\n%v\ndiff\n%s", got, tc.wantAfterDel, diff) } }) } } // testDirsWithCharactersBeforeDelimiter tests a case where there's // a directory on a pagination boundary that ends with a character that's // less than the delimiter. // See https://github.com/google/go-cloud/issues/3089. func testDirsWithCharactersBeforeDelimiter(t *testing.T, newHarness HarnessMaker) { t.Helper() const keyPrefix = "blob-for-dirs-with-chars-before-delimiter/" content := []byte("hello") // The set of files to use for these tests. keys := []string{ "testFile1", "t/t/t", "t-/t.", "dir1/testFile1dir1", "dir2/testFile1dir2", "d", } // Note that "t-/" is before "t/". The delimiter is included in the // alphabetical ordering. want := []string{"d", "dir1/", "dir2/", "t-/", "t/", "testFile1"} // Create blobs. // We only create the blobs once, for efficiency and because there's // no guarantee that after we create them they will be immediately returned // from List. The very first time the test is run against a Bucket, it may be // flaky due to this race. ctx := context.Background() h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } drv, err := h.MakeDriver(ctx) if err != nil { t.Fatal(err) } b := blob.NewBucket(drv) // See if the blobs are already there. iter := b.List(&blob.ListOptions{Prefix: keyPrefix}) found := iterToSetOfKeys(ctx, t, iter) for _, key := range keys { key = keyPrefix + key if !found[key] { if err := b.WriteAll(ctx, key, content, nil); err != nil { b.Close() t.Fatal(err) } } } defer b.Close() defer h.Close() opts := &blob.ListOptions{ Prefix: keyPrefix, Delimiter: "/", } // All page sizes should return the same end result. for pageSize := 10; pageSize != 0; pageSize-- { var got []string objs, token, err := b.ListPage(ctx, blob.FirstPageToken, pageSize, opts) for { if err != nil { t.Fatal(err) } for _, o := range objs { key := strings.TrimPrefix(o.Key, keyPrefix) got = append(got, key) } if token == nil { break } objs, token, err = b.ListPage(ctx, token, pageSize, opts) } if !reflect.DeepEqual(want, got) { t.Fatalf("For page size %d, got \n%v\nwant\n%v", pageSize, got, want) } } } func iterToSetOfKeys(ctx context.Context, t *testing.T, iter *blob.ListIterator) map[string]bool { t.Helper() retval := map[string]bool{} for { if item, err := iter.Next(ctx); err == io.EOF { break } else if err != nil { t.Fatal(err) } else { retval[item.Key] = true } } return retval } // testRead tests the functionality of NewReader, NewRangeReader, and Reader. func testRead(t *testing.T, newHarness HarnessMaker) { t.Helper() const key = "blob-for-reading" content := []byte("abcdefghijklmnopqurstuvwxyz") contentSize := int64(len(content)) tests := []struct { name string key string offset, length int64 want []byte wantReadSize int64 wantErr bool // set to true to skip creation of the object for // tests where we expect an error without any actual // read. skipCreate bool }{ { name: "read of nonexistent key fails", key: "key-does-not-exist", length: -1, wantErr: true, }, { name: "negative offset fails", key: key, offset: -1, wantErr: true, skipCreate: true, }, { name: "length 0 read", key: key, want: []byte{}, }, { name: "read from positive offset to end", key: key, offset: 10, length: -1, want: content[10:], wantReadSize: contentSize - 10, }, { name: "read a part in middle", key: key, offset: 10, length: 5, want: content[10:15], wantReadSize: 5, }, { name: "read in full", key: key, length: -1, want: content, wantReadSize: contentSize, }, { name: "read in full with negative length not -1", key: key, length: -42, want: content, wantReadSize: contentSize, }, } ctx := context.Background() // Creates a blob for sub-tests below. init := func(t *testing.T, skipCreate bool) (*blob.Bucket, func()) { t.Helper() h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } drv, err := h.MakeDriver(ctx) if err != nil { t.Fatal(err) } b := blob.NewBucket(drv) if skipCreate { return b, func() { b.Close(); h.Close() } } if err := b.WriteAll(ctx, key, content, nil); err != nil { b.Close() t.Fatal(err) } return b, func() { _ = b.Delete(ctx, key) b.Close() h.Close() } } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { b, done := init(t, tc.skipCreate) defer done() r, err := b.NewRangeReader(ctx, tc.key, tc.offset, tc.length, nil) if (err != nil) != tc.wantErr { t.Errorf("got err %v want error %v", err, tc.wantErr) } if err != nil { return } defer r.Close() // Make the buffer bigger than needed to make sure we actually only read // the expected number of bytes. got := make([]byte, tc.wantReadSize+10) n, err := r.Read(got) // EOF error is optional, see https://golang.org/pkg/io/#Reader. if err != nil && err != io.EOF { t.Errorf("unexpected error during read: %v", err) } if int64(n) != tc.wantReadSize { t.Errorf("got read length %d want %d", n, tc.wantReadSize) } if !cmp.Equal(got[:tc.wantReadSize], tc.want) { t.Errorf("got %q want %q", string(got), string(tc.want)) } if r.Size() != contentSize { t.Errorf("got size %d want %d", r.Size(), contentSize) } if r.ModTime().IsZero() { t.Errorf("got zero mod time, want non-zero") } // For tests that successfully read, recreate the io.Reader and // test it with iotest.TestReader. r, err = b.NewRangeReader(ctx, tc.key, tc.offset, tc.length, nil) if err != nil { t.Errorf("failed to recreate Reader: %v", err) return } defer r.Close() if err = iotest.TestReader(r, tc.want); err != nil { t.Errorf("iotest.TestReader failed: %v", err) return } }) } } // testAttributes tests Attributes. func testAttributes(t *testing.T, newHarness HarnessMaker) { t.Helper() const ( dirKey = "someDir" key = dirKey + "/blob-for-attributes" contentType = "text/plain" cacheControl = "no-cache" contentDisposition = "inline" contentEncoding = "identity" contentLanguage = "en" ) content := []byte("Hello World!") ctx := context.Background() // Creates a blob for sub-tests below. init := func(t *testing.T) (*blob.Bucket, func()) { t.Helper() h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } drv, err := h.MakeDriver(ctx) if err != nil { t.Fatal(err) } b := blob.NewBucket(drv) opts := &blob.WriterOptions{ ContentType: contentType, CacheControl: cacheControl, ContentDisposition: contentDisposition, ContentEncoding: contentEncoding, ContentLanguage: contentLanguage, } if err := b.WriteAll(ctx, key, content, opts); err != nil { b.Close() t.Fatal(err) } return b, func() { _ = b.Delete(ctx, key) b.Close() h.Close() } } b, done := init(t) defer done() for _, badKey := range []string{ "not-found", dirKey, dirKey + "/", } { _, err := b.Attributes(ctx, badKey) if err == nil { t.Errorf("got nil want error") } else if gcerrors.Code(err) != gcerrors.NotFound { t.Errorf("got %v want NotFound error", err) } else if !strings.Contains(err.Error(), badKey) { t.Errorf("got %v want error to include missing key", err) } } a, err := b.Attributes(ctx, key) if err != nil { t.Fatalf("failed Attributes: %v", err) } // Also make a Reader so we can verify the subset of attributes // that it exposes. r, err := b.NewReader(ctx, key, nil) if err != nil { t.Fatalf("failed Attributes: %v", err) } if a.CacheControl != cacheControl { t.Errorf("got CacheControl %q want %q", a.CacheControl, cacheControl) } if a.ContentDisposition != contentDisposition { t.Errorf("got ContentDisposition %q want %q", a.ContentDisposition, contentDisposition) } if a.ContentEncoding != contentEncoding { t.Errorf("got ContentEncoding %q want %q", a.ContentEncoding, contentEncoding) } if a.ContentLanguage != contentLanguage { t.Errorf("got ContentLanguage %q want %q", a.ContentLanguage, contentLanguage) } if a.ContentType != contentType { t.Errorf("got ContentType %q want %q", a.ContentType, contentType) } if r.ContentType() != contentType { t.Errorf("got Reader.ContentType() %q want %q", r.ContentType(), contentType) } if !a.CreateTime.IsZero() { if a.CreateTime.After(a.ModTime) { t.Errorf("CreateTime %v is after ModTime %v", a.CreateTime, a.ModTime) } } if a.ModTime.IsZero() { t.Errorf("ModTime not set") } if a.Size != int64(len(content)) { t.Errorf("got Size %d want %d", a.Size, len(content)) } if r.Size() != int64(len(content)) { t.Errorf("got Reader.Size() %d want %d", r.Size(), len(content)) } if a.ETag == "" { t.Error("ETag not set") } // Some basic syntax checks on ETag based on https://en.wikipedia.org/wiki/HTTP_ETag. // It should be of the form "xxxx" or W/"xxxx". if !strings.HasPrefix(a.ETag, "W/\"") && !strings.HasPrefix(a.ETag, "\"") { t.Errorf("ETag should start with W/\" or \" (got %s)", a.ETag) } if !strings.HasSuffix(a.ETag, "\"") { t.Errorf("ETag should end with \" (got %s)", a.ETag) } r.Close() // Modify and re-fetch attributes. if err := b.WriteAll(ctx, key, content, nil); err != nil { t.Fatal(err) } a2, err := b.Attributes(ctx, key) if err != nil { t.Errorf("failed Attributes#2: %v", err) } if a2.ModTime.Before(a.ModTime) { t.Errorf("ModTime %v is before %v", a2.ModTime, a.ModTime) } } // loadTestData loads test data, inlined using go-bindata. func loadTestData(tb testing.TB, name string) []byte { tb.Helper() data, err := Asset(name) if err != nil { tb.Fatal(err) } return data } // testWrite tests the functionality of NewWriter and Writer. func testWrite(t *testing.T, newHarness HarnessMaker) { t.Helper() const key = "blob-for-reading" const existingContent = "existing content" smallText := loadTestData(t, "test-small.txt") mediumHTML := loadTestData(t, "test-medium.html") largeJpg := loadTestData(t, "test-large.jpg") helloWorld := []byte("hello world") helloWorldMD5 := md5.Sum(helloWorld) tests := []struct { name string key string exists bool content []byte contentType string disableContentTypeDetection bool contentMD5 []byte firstChunk int wantContentType *regexp.Regexp wantErr bool wantReadErr bool // if wantErr is true, and Read after err should fail with something other than NotExists }{ { name: "write to empty key fails", wantErr: true, wantReadErr: true, // read from empty key fails, but not always with NotExists }, { name: "no write then close results in empty blob", key: key, }, { name: "no write then close results in empty blob, blob existed", key: key, }, { name: "invalid ContentType fails", key: key, contentType: "application/octet/stream", wantErr: true, }, { name: "ContentType is discovered if not provided", key: key, content: mediumHTML, wantContentType: regexp.MustCompile("text/html"), }, { name: "ContentType is left empty if not provided and DisableContentTypeDetection is true", key: key, content: mediumHTML, disableContentTypeDetection: true, // Sadly we can't really verify this; even though we write the ContentType // empty, different providers return different values when we read it, // from "application/octet-stream" to their own sniffing. // wantContentType: regexp.MustCompile("^$"), }, { name: "write with explicit ContentType overrides discovery", key: key, content: mediumHTML, contentType: "application/json", wantContentType: regexp.MustCompile("application/json"), }, { name: "Content md5 match", key: key, content: helloWorld, contentMD5: helloWorldMD5[:], }, { name: "Content md5 did not match", key: key, content: []byte("not hello world"), contentMD5: helloWorldMD5[:], wantErr: true, }, { name: "Content md5 did not match, blob existed", exists: true, key: key, content: []byte("not hello world"), contentMD5: helloWorldMD5[:], wantErr: true, }, { name: "a small text file gets a ContentType", key: key, content: smallText, wantContentType: regexp.MustCompile("text/plain.*"), }, { name: "a large jpg file gets a ContentType", key: key, content: largeJpg, wantContentType: regexp.MustCompile("image/jpeg"), }, { name: "a large jpg file written in two chunks gets a ContentType", key: key, firstChunk: 10, content: largeJpg, wantContentType: regexp.MustCompile("image/jpeg"), }, // TODO(issue #304): Fails for GCS. /* { name: "ContentType is parsed and reformatted", key: key, content: []byte("foo"), contentType: `FORM-DATA;name="foo"`, wantContentType: `form-data; name=foo`, }, */ } ctx := context.Background() for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() drv, err := h.MakeDriver(ctx) if err != nil { t.Fatal(err) } b := blob.NewBucket(drv) defer b.Close() // If the test wants the blob to already exist, write it. if tc.exists { if err := b.WriteAll(ctx, key, []byte(existingContent), nil); err != nil { t.Fatal(err) } defer func() { _ = b.Delete(ctx, key) }() } // Write the content. opts := &blob.WriterOptions{ ContentType: tc.contentType, DisableContentTypeDetection: tc.disableContentTypeDetection, ContentMD5: tc.contentMD5[:], } w, err := b.NewWriter(ctx, tc.key, opts) if err == nil { if len(tc.content) > 0 { if tc.firstChunk == 0 { // Write the whole thing. _, err = w.Write(tc.content) } else { // Write it in 2 chunks. _, err = w.Write(tc.content[:tc.firstChunk]) if err == nil { _, err = w.Write(tc.content[tc.firstChunk:]) } } } if err == nil { err = w.Close() } } if (err != nil) != tc.wantErr { t.Errorf("NewWriter or Close got err %v want error %v", err, tc.wantErr) } if err != nil { // The write failed; verify that it had no effect. buf, err := b.ReadAll(ctx, tc.key) if tc.exists { // Verify the previous content is still there. if !bytes.Equal(buf, []byte(existingContent)) { t.Errorf("Write failed as expected, but content doesn't match expected previous content; got \n%s\n want \n%s", string(buf), existingContent) } } else { // Verify that the read fails with NotFound. if err == nil { t.Error("Write failed as expected, but Read after that didn't return an error") } else if !tc.wantReadErr && gcerrors.Code(err) != gcerrors.NotFound { t.Errorf("Write failed as expected, but Read after that didn't return the right error; got %v want NotFound", err) } else if !strings.Contains(err.Error(), tc.key) { t.Errorf("got %v want error to include missing key", err) } } return } defer func() { _ = b.Delete(ctx, tc.key) }() // Read it back. buf, err := b.ReadAll(ctx, tc.key) if err != nil { t.Fatal(err) } if !bytes.Equal(buf, tc.content) { if len(buf) < 100 && len(tc.content) < 100 { t.Errorf("read didn't match write; got \n%s\n want \n%s", string(buf), string(tc.content)) } else { t.Error("read didn't match write, content too large to display") } } // Verify the ContentType. if tc.wantContentType != nil { attrs, err := b.Attributes(ctx, tc.key) if err != nil { t.Fatal(err) } if !tc.wantContentType.MatchString(attrs.ContentType) { t.Errorf("got ContentType %q, want one matching %v", attrs.ContentType, tc.wantContentType) } } }) } } // testCanceledWrite tests the functionality of canceling an in-progress write. func testCanceledWrite(t *testing.T, newHarness HarnessMaker) { t.Helper() const key = "blob-for-canceled-write" content := []byte("hello world") cancelContent := []byte("going to cancel") tests := []struct { description string contentType string exists bool }{ { // The write will be buffered in the portable type as part of // ContentType detection, so the first call to the Driver will be Close. description: "EmptyContentType", }, { // The write will be sent to the Driver, which may do its own // internal buffering. description: "NonEmptyContentType", contentType: "text/plain", }, { description: "BlobExists", exists: true, }, // TODO(issue #482): Find a way to test that a chunked upload that's interrupted // after some chunks are uploaded cancels correctly. } ctx := context.Background() for _, test := range tests { t.Run(test.description, func(t *testing.T) { cancelCtx, cancel := context.WithCancel(ctx) h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() drv, err := h.MakeDriver(ctx) if err != nil { t.Fatal(err) } b := blob.NewBucket(drv) defer b.Close() opts := &blob.WriterOptions{ ContentType: test.contentType, } // If the test wants the blob to already exist, write it. if test.exists { if err := b.WriteAll(ctx, key, content, opts); err != nil { t.Fatal(err) } defer func() { _ = b.Delete(ctx, key) }() } // Create a writer with the context that we're going // to cancel. w, err := b.NewWriter(cancelCtx, key, opts) if err != nil { t.Fatal(err) } // Write the content. if _, err := w.Write(cancelContent); err != nil { t.Fatal(err) } // Verify that the previous content (if any) is still readable, // because the write hasn't been Closed yet. got, err := b.ReadAll(ctx, key) if test.exists { // The previous content should still be there. if !cmp.Equal(got, content) { t.Errorf("during unclosed write, got %q want %q", string(got), string(content)) } } else { // The read should fail; the write hasn't been Closed so the // blob shouldn't exist. if err == nil { t.Error("wanted read to return an error when write is not yet Closed") } } // Cancel the context to abort the write. cancel() // Close should return some kind of canceled context error. // We can't verify the kind of error cleanly, so we just verify there's // an error. if err := w.Close(); err == nil { t.Errorf("got Close error %v want canceled ctx error", err) } // Verify the write was truly aborted. got, err = b.ReadAll(ctx, key) if test.exists { // The previous content should still be there. if !cmp.Equal(got, content) { t.Errorf("after canceled write, got %q want %q", string(got), string(content)) } } else { // The read should fail; the write was aborted so the // blob shouldn't exist. if err == nil { t.Error("wanted read to return an error when write was canceled") } } }) } } // testMetadata tests writing and reading the key/value metadata for a blob. func testMetadata(t *testing.T, newHarness HarnessMaker) { t.Helper() const key = "blob-for-metadata" hello := []byte("hello") weirdMetadata := map[string]string{} for _, k := range escape.WeirdStrings { weirdMetadata[k] = k } tests := []struct { name string metadata map[string]string content []byte contentType string want map[string]string wantErr bool }{ { name: "empty", content: hello, metadata: map[string]string{}, want: nil, }, { name: "empty key fails", content: hello, metadata: map[string]string{"": "empty key value"}, wantErr: true, }, { name: "duplicate case-insensitive key fails", content: hello, metadata: map[string]string{"abc": "foo", "aBc": "bar"}, wantErr: true, }, { name: "valid metadata", content: hello, metadata: map[string]string{ "key_a": "value-a", "kEy_B": "value-b", "key_c": "vAlUe-c", }, want: map[string]string{ "key_a": "value-a", "key_b": "value-b", "key_c": "vAlUe-c", }, }, { name: "valid metadata with empty body", content: nil, metadata: map[string]string{"foo": "bar"}, want: map[string]string{"foo": "bar"}, }, { name: "valid metadata with content type", content: hello, contentType: "text/plain", metadata: map[string]string{"foo": "bar"}, want: map[string]string{"foo": "bar"}, }, { name: "weird metadata keys", content: hello, metadata: weirdMetadata, want: weirdMetadata, }, { name: "non-utf8 metadata key", content: hello, metadata: map[string]string{escape.NonUTF8String: "bar"}, wantErr: true, }, { name: "non-utf8 metadata value", content: hello, metadata: map[string]string{"foo": escape.NonUTF8String}, wantErr: true, }, } ctx := context.Background() for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() drv, err := h.MakeDriver(ctx) if err != nil { t.Fatal(err) } b := blob.NewBucket(drv) defer b.Close() opts := &blob.WriterOptions{ Metadata: tc.metadata, ContentType: tc.contentType, } err = b.WriteAll(ctx, key, hello, opts) if (err != nil) != tc.wantErr { t.Errorf("got error %v want error %v", err, tc.wantErr) } if err != nil { return } defer func() { _ = b.Delete(ctx, key) }() a, err := b.Attributes(ctx, key) if err != nil { t.Fatal(err) } if diff := cmp.Diff(a.Metadata, tc.want); diff != "" { t.Errorf("got\n%v\nwant\n%v\ndiff\n%s", a.Metadata, tc.want, diff) } }) } } // testMD5 tests reading MD5 hashes via List and Attributes. func testMD5(t *testing.T, newHarness HarnessMaker) { t.Helper() ctx := context.Background() // Define two blobs with different content; we'll write them and then verify // their returned MD5 hashes. const aKey, bKey = "blob-for-md5-aaa", "blob-for-md5-bbb" aContent, bContent := []byte("hello"), []byte("goodbye") aMD5 := md5.Sum(aContent) bMD5 := md5.Sum(bContent) h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() drv, err := h.MakeDriver(ctx) if err != nil { t.Fatal(err) } b := blob.NewBucket(drv) defer b.Close() // Write the two blobs. if err := b.WriteAll(ctx, aKey, aContent, nil); err != nil { t.Fatal(err) } defer func() { _ = b.Delete(ctx, aKey) }() if err := b.WriteAll(ctx, bKey, bContent, nil); err != nil { t.Fatal(err) } defer func() { _ = b.Delete(ctx, bKey) }() // Check the MD5 we get through Attributes. Note that it's always legal to // return a nil MD5. aAttr, err := b.Attributes(ctx, aKey) if err != nil { t.Fatal(err) } if aAttr.MD5 != nil && !bytes.Equal(aAttr.MD5, aMD5[:]) { t.Errorf("got MD5\n%x\nwant\n%x", aAttr.MD5, aMD5) } bAttr, err := b.Attributes(ctx, bKey) if err != nil { t.Fatal(err) } if bAttr.MD5 != nil && !bytes.Equal(bAttr.MD5, bMD5[:]) { t.Errorf("got MD5\n%x\nwant\n%x", bAttr.MD5, bMD5) } // Check the MD5 we get through List. Note that it's always legal to // return a nil MD5. iter := b.List(&blob.ListOptions{Prefix: "blob-for-md5-"}) obj, err := iter.Next(ctx) if err != nil { t.Fatal(err) } if obj.Key != aKey { t.Errorf("got name %q want %q", obj.Key, aKey) } if obj.MD5 != nil && !bytes.Equal(obj.MD5, aMD5[:]) { t.Errorf("got MD5\n%x\nwant\n%x", obj.MD5, aMD5) } obj, err = iter.Next(ctx) if err != nil { t.Fatal(err) } if obj.Key != bKey { t.Errorf("got name %q want %q", obj.Key, bKey) } if obj.MD5 != nil && !bytes.Equal(obj.MD5, bMD5[:]) { t.Errorf("got MD5\n%x\nwant\n%x", obj.MD5, bMD5) } } // testCopy tests the functionality of Copy. func testCopy(t *testing.T, newHarness HarnessMaker) { t.Helper() const ( srcKey = "blob-for-copying-src" dstKey = "blob-for-copying-dest" dstKeyExists = "blob-for-copying-dest-exists" contentType = "text/plain" cacheControl = "no-cache" contentDisposition = "inline" contentEncoding = "identity" contentLanguage = "en" ) contents := []byte("Hello World") ctx := context.Background() t.Run("NonExistentSourceFails", func(t *testing.T) { h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() drv, err := h.MakeDriver(ctx) if err != nil { t.Fatal(err) } b := blob.NewBucket(drv) defer b.Close() err = b.Copy(ctx, dstKey, "does-not-exist", nil) if err == nil { t.Errorf("got nil want error") } else if gcerrors.Code(err) != gcerrors.NotFound { t.Errorf("got %v want NotFound error", err) } else if !strings.Contains(err.Error(), "does-not-exist") { t.Errorf("got %v want error to include missing key", err) } }) t.Run("Works", func(t *testing.T) { h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() drv, err := h.MakeDriver(ctx) if err != nil { t.Fatal(err) } b := blob.NewBucket(drv) defer b.Close() // Create the source blob. wopts := &blob.WriterOptions{ ContentType: contentType, CacheControl: cacheControl, ContentDisposition: contentDisposition, ContentEncoding: contentEncoding, ContentLanguage: contentLanguage, Metadata: map[string]string{"foo": "bar"}, } if err := b.WriteAll(ctx, srcKey, contents, wopts); err != nil { t.Fatal(err) } // Grab its attributes to compare to the copy's attributes later. wantAttr, err := b.Attributes(ctx, srcKey) if err != nil { t.Fatal(err) } // Clear uncomparable fields. clearUncomparableFields := func(a *blob.Attributes) { a.CreateTime = time.Time{} a.ModTime = time.Time{} a.ETag = "" } clearUncomparableFields(wantAttr) // Create another blob that we're going to overwrite. if err := b.WriteAll(ctx, dstKeyExists, []byte("clobber me"), nil); err != nil { t.Fatal(err) } // Copy the source to the destination. if err := b.Copy(ctx, dstKey, srcKey, nil); err != nil { t.Errorf("got unexpected error copying blob: %v", err) } // Read the copy. got, err := b.ReadAll(ctx, dstKey) if err != nil { t.Fatal(err) } if !cmp.Equal(got, contents) { t.Errorf("got %q want %q", string(got), string(contents)) } // Verify attributes of the copy. gotAttr, err := b.Attributes(ctx, dstKey) if err != nil { t.Fatal(err) } clearUncomparableFields(gotAttr) if diff := cmp.Diff(gotAttr, wantAttr, cmpopts.IgnoreUnexported(blob.Attributes{})); diff != "" { t.Errorf("got %v want %v diff %s", gotAttr, wantAttr, diff) } // Copy the source to the second destination, where there's an existing blob. // It should be overwritten. if err := b.Copy(ctx, dstKeyExists, srcKey, nil); err != nil { t.Errorf("got unexpected error copying blob: %v", err) } // Read the copy. got, err = b.ReadAll(ctx, dstKeyExists) if err != nil { t.Fatal(err) } if !cmp.Equal(got, contents) { t.Errorf("got %q want %q", string(got), string(contents)) } // Verify attributes of the copy. gotAttr, err = b.Attributes(ctx, dstKeyExists) if err != nil { t.Fatal(err) } clearUncomparableFields(gotAttr) if diff := cmp.Diff(gotAttr, wantAttr, cmpopts.IgnoreUnexported(blob.Attributes{})); diff != "" { t.Errorf("got %v want %v diff %s", gotAttr, wantAttr, diff) } }) } // testDelete tests the functionality of Delete. func testDelete(t *testing.T, newHarness HarnessMaker) { t.Helper() const key = "blob-for-deleting" ctx := context.Background() t.Run("NonExistentFails", func(t *testing.T) { h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() drv, err := h.MakeDriver(ctx) if err != nil { t.Fatal(err) } b := blob.NewBucket(drv) defer b.Close() err = b.Delete(ctx, "does-not-exist") if err == nil { t.Errorf("got nil want error") } else if gcerrors.Code(err) != gcerrors.NotFound { t.Errorf("got %v want NotFound error", err) } else if !strings.Contains(err.Error(), "does-not-exist") { t.Errorf("got %v want error to include missing key", err) } }) t.Run("Works", func(t *testing.T) { h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() drv, err := h.MakeDriver(ctx) if err != nil { t.Fatal(err) } b := blob.NewBucket(drv) defer b.Close() // Create the blob. if err := b.WriteAll(ctx, key, []byte("Hello world"), nil); err != nil { t.Fatal(err) } // Delete it. if err := b.Delete(ctx, key); err != nil { t.Errorf("got unexpected error deleting blob: %v", err) } // Subsequent read fails with NotFound. _, err = b.NewReader(ctx, key, nil) if err == nil { t.Errorf("read after delete got nil, want error") } else if gcerrors.Code(err) != gcerrors.NotFound { t.Errorf("read after delete want NotFound error, got %v", err) } else if !strings.Contains(err.Error(), key) { t.Errorf("got %v want error to include missing key", err) } // Subsequent delete also fails. err = b.Delete(ctx, key) if err == nil { t.Errorf("delete after delete got nil, want error") } else if gcerrors.Code(err) != gcerrors.NotFound { t.Errorf("delete after delete got %v, want NotFound error", err) } else if !strings.Contains(err.Error(), key) { t.Errorf("got %v want error to include missing key", err) } }) } // testConcurrentWriteAndRead tests that concurrent writing to multiple blob // keys and concurrent reading from multiple blob keys works. func testConcurrentWriteAndRead(t *testing.T, newHarness HarnessMaker) { t.Helper() ctx := context.Background() h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() drv, err := h.MakeDriver(ctx) if err != nil { t.Fatal(err) } b := blob.NewBucket(drv) defer b.Close() // Prepare data. Each of the numKeys blobs has dataSize bytes, with each byte // set to the numeric key index. For example, the blob at "key0" consists of // all dataSize bytes set to 0. const numKeys = 20 const dataSize = 4 * 1024 keyData := make(map[int][]byte) for k := range numKeys { data := make([]byte, dataSize) for i := range dataSize { data[i] = byte(k) } keyData[k] = data } blobName := func(k int) string { return fmt.Sprintf("key%d", k) } var wg sync.WaitGroup errs := make(chan error, numKeys) // Write all blobs concurrently. for k := range numKeys { wg.Add(1) go func(key int) { if err := b.WriteAll(ctx, blobName(key), keyData[key], nil); err != nil { errs <- fmt.Errorf("WriteAll key=%v: %w", key, err) } wg.Done() }(k) defer b.Delete(ctx, blobName(k)) } wg.Wait() close(errs) for err := range errs { t.Fatalf("got error from concurrent blob write: %v", err) } errs = make(chan error, numKeys) // Read all blobs concurrently and verify that they contain the expected data. for k := range numKeys { wg.Add(1) go func(key int) { buf, err := b.ReadAll(ctx, blobName(key)) if err != nil { errs <- err } else if !bytes.Equal(buf, keyData[key]) { errs <- fmt.Errorf("read data mismatch for key %d", key) } wg.Done() }(k) } wg.Wait() close(errs) for err := range errs { t.Fatalf("got error from concurrent blob write: %v", err) } } // testUploadDownload tests that Upload and Download work. For many drivers, // these are implemented in the concrete type, but drivers that implement Reader.Download // and/or Writer.Upload will have those called directly. func testUploadDownload(t *testing.T, newHarness HarnessMaker) { t.Helper() const key = "blob-for-upload-download" const contents = "up and down" contentsMD5 := md5.Sum([]byte(contents)) ctx := context.Background() h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() drv, err := h.MakeDriver(ctx) if err != nil { t.Fatal(err) } b := blob.NewBucket(drv) defer b.Close() // Write a blob using Upload. if err := b.Upload(ctx, key, strings.NewReader(contents), &blob.WriterOptions{ContentType: "text"}); err != nil { t.Fatal(err) } defer b.Delete(ctx, key) // Read the blob using Download. var bb bytes.Buffer err = b.Download(ctx, key, &bb, nil) if err != nil { t.Fatal(err) } if bb.String() != contents { t.Errorf("read data mismatch for key %s", key) } // Write another blob using Upload and ContentMD5 checking (this disables the Upload optimization). if err := b.Upload(ctx, key, strings.NewReader(contents), &blob.WriterOptions{ContentMD5: contentsMD5[:], ContentType: "text"}); err != nil { t.Fatal(err) } defer b.Delete(ctx, key) } // testKeys tests a variety of weird keys. func testKeys(t *testing.T, newHarness HarnessMaker) { t.Helper() const keyPrefix = "weird-keys" content := []byte("hello") ctx := context.Background() t.Run("non-UTF8 fails", func(t *testing.T) { h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() drv, err := h.MakeDriver(ctx) if err != nil { t.Fatal(err) } b := blob.NewBucket(drv) defer b.Close() // Write the blob. key := keyPrefix + escape.NonUTF8String if err := b.WriteAll(ctx, key, content, nil); err == nil { t.Error("got nil error, expected error for using non-UTF8 string as key") } }) for description, key := range escape.WeirdStrings { t.Run(description, func(t *testing.T) { h, err := newHarness(ctx, t) if err != nil { t.Fatalf("Failed to create harness: %v", err) } defer h.Close() drv, err := h.MakeDriver(ctx) if err != nil { t.Fatalf("Failed to make driver: %v", err) } b := blob.NewBucket(drv) defer b.Close() // Write the blob. key = keyPrefix + key if err := b.WriteAll(ctx, key, content, nil); err != nil { t.Fatalf("Failed to write blob at key %q: %v", key, err) } defer func() { err := b.Delete(ctx, key) if err != nil { t.Errorf("Failed to delete blob at key %q: %v", key, err) } }() // Verify read works. got, err := b.ReadAll(ctx, key) if err != nil { t.Fatalf("Failed to read blob at key %q: %v", key, err) } if !cmp.Equal(got, content) { t.Errorf("When reading blob, got %q want %q", string(got), string(content)) } // Verify Attributes works. _, err = b.Attributes(ctx, key) if err != nil { t.Errorf("Failed to get attributes for key %q: %v", key, err) } // Verify SignedURL works. url, err := b.SignedURL(ctx, key, nil) if gcerrors.Code(err) != gcerrors.Unimplemented { if err != nil { t.Errorf("Failed to get SignedURL for key %q: %v", key, err) } client := h.HTTPClient() if client == nil { t.Error("can't verify SignedURL, Harness.HTTPClient() returned nil") } resp, err := client.Get(url) if err != nil { t.Fatalf("GET using SignedURL for key %q failed: %v", key, err) } defer resp.Body.Close() if resp.StatusCode != 200 { t.Fatalf("GET using SignedURL for key %q got status code %d, want 200", key, resp.StatusCode) } got, err := io.ReadAll(resp.Body) if err != nil { t.Fatalf("GET using SignedURL for key %q got 200, but failed to ready body: %v", key, err) } if !bytes.Equal(got, content) { t.Errorf("GET using SignedURL for key %q got body %q, want %q", key, string(got), string(content)) } } // Copy the blob. copyToKey := key + "-copy" if err := b.Copy(ctx, copyToKey, key, nil); err != nil { t.Fatal(err) } defer func() { err := b.Delete(ctx, copyToKey) if err != nil { t.Error(err) } }() got, err = b.ReadAll(ctx, copyToKey) if err != nil { t.Fatal(err) } if !cmp.Equal(got, content) { t.Errorf("copied got %q want %q", string(got), string(content)) } }) } } // testSignedURL tests the functionality of SignedURL. func testSignedURL(t *testing.T, newHarness HarnessMaker) { t.Helper() const key = "blob-for-signing" const contents = "hello world" ctx := context.Background() h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() drv, err := h.MakeDriver(ctx) if err != nil { t.Fatal(err) } b := blob.NewBucket(drv) defer b.Close() // Verify that a negative Expiry gives an error. This is enforced in the // portable type, so works regardless of driver support. _, err = b.SignedURL(ctx, key, &blob.SignedURLOptions{Expiry: -1 * time.Minute}) if err == nil { t.Error("got nil error, expected error for negative SignedURLOptions.Expiry") } // Generate a signed URL for GET. getURL, err := b.SignedURL(ctx, key, nil) if err != nil { if gcerrors.Code(err) == gcerrors.Unimplemented { t.Skipf("SignedURL not supported") return } t.Fatal(err) } else if getURL == "" { t.Fatal("got empty GET url") } // Copy getURL, but remove all query params. This URL should not be allowed // to GET since the client is unauthorized. getURLNoParamsURL, err := url.Parse(getURL) if err != nil { t.Fatalf("failed to parse getURL: %v", err) } getURLNoParamsURL.RawQuery = "" getURLNoParams := getURLNoParamsURL.String() const ( allowedContentType = "text/plain" differentContentType = "application/octet-stream" ) // Generate a signed URL for PUT, with a non-empty ContentType. putURLWithContentType, err := b.SignedURL(ctx, key, &blob.SignedURLOptions{ Method: http.MethodPut, ContentType: allowedContentType, }) if gcerrors.Code(err) == gcerrors.Unimplemented { t.Log("PUT URLs with content type not supported, skipping") } else if err != nil { t.Fatal(err) } else if putURLWithContentType == "" { t.Fatal("got empty PUT url") } // Generate a signed URL for PUT, with an empty ContentType that's enforced. putURLEnforcedAbsentContentType, err := b.SignedURL(ctx, key, &blob.SignedURLOptions{ Method: http.MethodPut, EnforceAbsentContentType: true, }) if gcerrors.Code(err) == gcerrors.Unimplemented { t.Log("PUT URLs with enforced absent content type not supported, skipping") } else if err != nil { t.Fatal(err) } else if putURLEnforcedAbsentContentType == "" { t.Fatal("got empty PUT url") } // Same as above, but not enforced. putURLWithoutContentType, err := b.SignedURL(ctx, key, &blob.SignedURLOptions{ Method: http.MethodPut, }) if err != nil { t.Fatal(err) } else if putURLWithoutContentType == "" { t.Fatal("got empty PUT url") } // Generate a signed URL for DELETE. deleteURL, err := b.SignedURL(ctx, key, &blob.SignedURLOptions{Method: http.MethodDelete}) if gcerrors.Code(err) == gcerrors.Unimplemented { t.Log("DELETE URLs not supported, skipping") } else if err != nil { t.Fatal(err) } else if deleteURL == "" { t.Fatal("got empty DELETE url") } client := h.HTTPClient() if client == nil { t.Fatal("can't verify SignedURL, Harness.HTTPClient() returned nil") } // PUT the blob. Try with all URLs, only putURL should work when given the // content type used in the signature. type signedURLTest struct { urlDescription string url string contentType string wantSuccess bool } tests := []signedURLTest{ {"getURL", getURL, "", false}, } if deleteURL != "" { tests = append(tests, signedURLTest{"deleteURL", deleteURL, "", false}) } if putURLWithContentType != "" { // Allowed content type should work. // Different or empty content type should fail. tests = append(tests, signedURLTest{"putURLWithContentType", putURLWithContentType, allowedContentType, true}) tests = append(tests, signedURLTest{"putURLWithContentType", putURLWithContentType, differentContentType, false}) tests = append(tests, signedURLTest{"putURLWithContentType", putURLWithContentType, "", false}) } if putURLEnforcedAbsentContentType != "" { // Empty content type should work, non-empty should fail. tests = append(tests, signedURLTest{"putURLEnforcedAbsentContentType", putURLEnforcedAbsentContentType, "", true}) tests = append(tests, signedURLTest{"putURLEnforcedAbsentContentType", putURLEnforcedAbsentContentType, differentContentType, false}) } if putURLWithoutContentType != "" { // Empty content type should work. tests = append(tests, signedURLTest{"putURLWithoutContentType", putURLWithoutContentType, "", true}) // From the SignedURLOptions docstring: // If EnforceAbsentContentType is false and ContentType is the empty string, // then PUTing without a Content-Type header will succeed, but it is // implementation-specific whether providing a Content-Type header will fail. // --> so, we don't have a test for putURLWithoutContentType and a non-empty ContentType. } for _, test := range tests { req, err := http.NewRequest(http.MethodPut, test.url, strings.NewReader(contents)) if err != nil { t.Fatalf("failed to create PUT HTTP request using %q: %v", test.urlDescription, err) } if test.contentType != "" { req.Header.Set("Content-Type", test.contentType) } if resp, err := client.Do(req); err != nil { t.Fatalf("PUT to %q with ContentType %q failed: %v", test.urlDescription, test.contentType, err) } else { defer resp.Body.Close() success := resp.StatusCode >= 200 && resp.StatusCode < 300 if success != test.wantSuccess { t.Errorf("PUT to %q with ContentType %q got status code %d, wanted 2xx? %v", test.urlDescription, test.contentType, resp.StatusCode, test.wantSuccess) gotBody, _ := io.ReadAll(resp.Body) t.Error(string(gotBody)) } } } // GET it. Try with all URLs, only getURL should work. tests = nil if deleteURL != "" { tests = append(tests, signedURLTest{"deleteURL", deleteURL, "", false}) } tests = append(tests, []signedURLTest{ {"putURLWithoutContentType", putURLWithoutContentType, "", false}, {"getURLNoParams", getURLNoParams, "", false}, {"getURL", getURL, "", true}, }...) for _, test := range tests { if resp, err := client.Get(test.url); err != nil { t.Fatalf("GET with %s URL failed: %v", test.urlDescription, err) } else { defer resp.Body.Close() success := resp.StatusCode >= 200 && resp.StatusCode < 300 if success != test.wantSuccess { t.Errorf("GET to %q got status code %d, want 2xx? %v", test.urlDescription, resp.StatusCode, test.wantSuccess) gotBody, _ := io.ReadAll(resp.Body) t.Error(string(gotBody)) } else if success { gotBody, err := io.ReadAll(resp.Body) if err != nil { t.Errorf("GET to %q failed to read response body: %v", test.urlDescription, err) } else if gotBodyStr := string(gotBody); gotBodyStr != contents { t.Errorf("GET to %q got body %q, want %q", test.urlDescription, gotBodyStr, contents) } } } } // DELETE it. Try with all URLs, only deleteURL should work. tests = []signedURLTest{ {"getURL", getURL, "", false}, {"putURLWithoutContentType", putURLWithoutContentType, "", false}, } if deleteURL != "" { tests = append(tests, signedURLTest{"deleteURL", deleteURL, "", true}) } for _, test := range tests { req, err := http.NewRequest(http.MethodDelete, test.url, nil) if err != nil { t.Fatalf("failed to create DELETE HTTP request using %q: %v", test.urlDescription, err) } if resp, err := client.Do(req); err != nil { t.Fatalf("DELETE to %q failed: %v", test.urlDescription, err) } else { defer resp.Body.Close() success := resp.StatusCode >= 200 && resp.StatusCode < 300 if success != test.wantSuccess { gotBody, _ := io.ReadAll(resp.Body) t.Error(string(gotBody)) t.Fatalf("DELETE to %q got status code %d, want 2xx? %v", test.urlDescription, resp.StatusCode, test.wantSuccess) } } } // GET should fail now that the blob has been deleted. if deleteURL != "" { if resp, err := client.Get(getURL); err != nil { t.Errorf("GET after DELETE failed: %v", err) } else { defer resp.Body.Close() if resp.StatusCode != 404 { t.Errorf("GET after DELETE got status code %d, want 404", resp.StatusCode) gotBody, _ := io.ReadAll(resp.Body) t.Error(string(gotBody)) } } } } // testAs tests the various As functions, using AsTest. func testAs(t *testing.T, newHarness HarnessMaker, st AsTest) { t.Helper() const ( dir = "mydir" key = dir + "/as-test" copyKey = dir + "/as-test-copy" ) content := []byte("hello world") ctx := context.Background() h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() drv, err := h.MakeDriver(ctx) if err != nil { t.Fatal(err) } b := blob.NewBucket(drv) defer b.Close() // Verify Bucket.As. if err := st.BucketCheck(b); err != nil { t.Error(err) } // Create a blob, using the provided callback. if err := b.WriteAll(ctx, key, content, &blob.WriterOptions{BeforeWrite: st.BeforeWrite}); err != nil { t.Error(err) } defer func() { _ = b.Delete(ctx, key) }() // Verify Attributes.As. attrs, err := b.Attributes(ctx, key) if err != nil { t.Fatal(err) } if err := st.AttributesCheck(attrs); err != nil { t.Error(err) } // Verify Reader.As. r, err := b.NewReader(ctx, key, &blob.ReaderOptions{BeforeRead: st.BeforeRead}) if err != nil { t.Fatal(err) } defer r.Close() if err := st.ReaderCheck(r); err != nil { t.Error(err) } // Verify ListObject.As for the directory. iter := b.List(&blob.ListOptions{Prefix: dir, Delimiter: "/", BeforeList: st.BeforeList}) found := false for { obj, err := iter.Next(ctx) if err == io.EOF { break } if found { t.Fatal("got a second object returned from List, only wanted one") } found = true if err != nil { log.Fatal(err) } if err := st.ListObjectCheck(obj); err != nil { t.Error(err) } } // Verify ListObject.As for the blob. iter = b.List(&blob.ListOptions{Prefix: key, BeforeList: st.BeforeList}) found = false for { obj, err := iter.Next(ctx) if err == io.EOF { break } if found { t.Fatal("got a second object returned from List, only wanted one") } found = true if err != nil { log.Fatal(err) } if err := st.ListObjectCheck(obj); err != nil { t.Error(err) } } _, gotErr := b.NewReader(ctx, "key-does-not-exist", nil) if gotErr == nil { t.Fatalf("got nil error from NewReader for nonexistent key, want an error") } if err := st.ErrorCheck(b, gotErr); err != nil { t.Error(err) } // Copy the blob, using the provided callback. if err := b.Copy(ctx, copyKey, key, &blob.CopyOptions{BeforeCopy: st.BeforeCopy}); err != nil { t.Error(err) } else { defer func() { _ = b.Delete(ctx, copyKey) }() } for _, method := range []string{http.MethodGet, http.MethodPut, http.MethodDelete} { _, err = b.SignedURL(ctx, key, &blob.SignedURLOptions{Method: method, BeforeSign: st.BeforeSign}) if err != nil && gcerrors.Code(err) != gcerrors.Unimplemented { t.Errorf("got err %v when signing url with method %q", err, method) } } } func testIfNotExist(t *testing.T, newHarness HarnessMaker) { t.Helper() const key = "blob-for-if-not-exist" const contents = "up and down" ctx := context.Background() h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() drv, err := h.MakeDriver(ctx) if err != nil { t.Fatal(err) } b := blob.NewBucket(drv) defer func() { _ = b.Close() }() opts := blob.WriterOptions{ ContentType: "text", IfNotExist: true, } // Create the new blob; expected to work since it doesn't exist. w1, err := b.NewWriter(ctx, key, &opts) if err != nil { t.Fatal(err) } defer func() { _ = b.Delete(ctx, key) }() if _, err := w1.Write([]byte(contents)); err != nil { t.Fatal(err) } if err := w1.Close(); err != nil { t.Fatal(err) } // Attempt a second write to the same key; expected to fail in // either Write or Close, with FailedPrecondition. w2, err := b.NewWriter(ctx, key, &opts) if err != nil { t.Fatal(err) } if _, err = w2.Write([]byte(contents)); err == nil { err = w2.Close() } else { _ = w2.Close() } if err == nil { t.Error("expected error rewriting key with IfNotExist, got nil") } if code := gcerrors.Code(err); code != gcerrors.FailedPrecondition { t.Errorf("expected FailedPrecondition error, got %v", code) } } func benchmarkRead(b *testing.B, bkt *blob.Bucket) { b.Helper() ctx := context.Background() const key = "readbenchmark-blob" content := loadTestData(b, "test-large.jpg") if err := bkt.WriteAll(ctx, key, content, nil); err != nil { b.Fatal(err) } defer func() { _ = bkt.Delete(ctx, key) }() b.ResetTimer() b.RunParallel(func(pb *testing.PB) { var buffer bytes.Buffer buffer.Grow(len(content)) for pb.Next() { buffer.Reset() r, err := bkt.NewReader(ctx, key, nil) if err != nil { b.Error(err) } if _, err = io.Copy(&buffer, r); err != nil { b.Error(err) } r.Close() if !bytes.Equal(buffer.Bytes(), content) { b.Error("read didn't match write") } } }) } func benchmarkWriteReadDelete(b *testing.B, bkt *blob.Bucket) { b.Helper() ctx := context.Background() const baseKey = "writereaddeletebenchmark-blob-" content := loadTestData(b, "test-large.jpg") var nextID uint32 b.ResetTimer() b.RunParallel(func(pb *testing.PB) { key := fmt.Sprintf("%s%d", baseKey, atomic.AddUint32(&nextID, 1)) for pb.Next() { if err := bkt.WriteAll(ctx, key, content, nil); err != nil { b.Error(err) continue } buf, err := bkt.ReadAll(ctx, key) if err != nil { b.Error(err) } if !bytes.Equal(buf, content) { b.Error("read didn't match write") } if err := bkt.Delete(ctx, key); err != nil { b.Error(err) continue } } }) } ================================================ FILE: blob/example_openbucket_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package blob_test import ( "context" "fmt" "log" "gocloud.dev/blob" _ "gocloud.dev/blob/memblob" ) func Example_openFromURL() { ctx := context.Background() // Connect to a bucket using a URL. // This example uses "memblob", the in-memory implementation. // We need to add a blank import line to register the memblob driver's // URLOpener, which implements blob.BucketURLOpener: // import _ "gocloud.dev/blob/memblob" // memblob registers for the "mem" scheme. // All blob.OpenBucket URLs also work with "blob+" or "blob+bucket+" prefixes, // e.g., "blob+mem://" or "blob+bucket+mem://". b, err := blob.OpenBucket(ctx, "mem://") if err != nil { log.Fatal(err) } defer b.Close() // Now we can use b to read or write to blobs in the bucket. if err := b.WriteAll(ctx, "my-key", []byte("hello world"), nil); err != nil { log.Fatal(err) } data, err := b.ReadAll(ctx, "my-key") if err != nil { log.Fatal(err) } fmt.Println(string(data)) // Output: // hello world } func Example_openFromURLWithPrefix() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // Connect to a bucket using a URL, using the "prefix" query parameter to // target a subfolder in the bucket. // The prefix should end with "/", so that the resulting bucket operates // in a subfolder. b, err := blob.OpenBucket(ctx, "mem://?prefix=a/subfolder/") if err != nil { log.Fatal(err) } defer b.Close() // Bucket operations on will be translated to "a/subfolder/". } func Example_openFromURLWithSingleKey() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // Connect to a bucket using a URL, using the "key" query parameter to // make the bucket always reference that key. b, err := blob.OpenBucket(ctx, "mem://?key=foo.txt") if err != nil { log.Fatal(err) } defer b.Close() // Bucket operations will ignore the passed-in key and always reference foo.txt. } ================================================ FILE: blob/example_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package blob_test import ( "bytes" "context" "fmt" "io" "log" "os" "cloud.google.com/go/storage" "github.com/aws/smithy-go" "gocloud.dev/blob" "gocloud.dev/blob/fileblob" _ "gocloud.dev/blob/gcsblob" _ "gocloud.dev/blob/s3blob" ) func ExampleBucket_NewReader() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() var bucket *blob.Bucket // Open the key "foo.txt" for reading with the default options. r, err := bucket.NewReader(ctx, "foo.txt", nil) if err != nil { log.Fatal(err) } defer r.Close() // Readers also have a limited view of the blob's metadata. fmt.Println("Content-Type:", r.ContentType()) fmt.Println() // Copy from the reader to stdout. if _, err := io.Copy(os.Stdout, r); err != nil { log.Fatal(err) } } func ExampleBucket_NewRangeReader() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() var bucket *blob.Bucket // Open the key "foo.txt" for reading at offset 1024 and read up to 4096 bytes. r, err := bucket.NewRangeReader(ctx, "foo.txt", 1024, 4096, nil) if err != nil { log.Fatal(err) } defer r.Close() // Copy from the read range to stdout. if _, err := io.Copy(os.Stdout, r); err != nil { log.Fatal(err) } } func ExampleBucket_NewWriter() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() var bucket *blob.Bucket // Open the key "foo.txt" for writing with the default options. w, err := bucket.NewWriter(ctx, "foo.txt", nil) if err != nil { log.Fatal(err) } _, writeErr := fmt.Fprintln(w, "Hello, World!") // Always check the return value of Close when writing. closeErr := w.Close() if writeErr != nil { log.Fatal(writeErr) } if closeErr != nil { log.Fatal(closeErr) } } func ExampleBucket_NewWriter_cancel() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() var bucket *blob.Bucket // Create a cancelable context from the existing context. writeCtx, cancelWrite := context.WithCancel(ctx) defer cancelWrite() // Open the key "foo.txt" for writing with the default options. w, err := bucket.NewWriter(writeCtx, "foo.txt", nil) if err != nil { log.Fatal(err) } // Assume some writes happened and we encountered an error. // Now we want to abort the write. if err != nil { // First cancel the context. cancelWrite() // You must still close the writer to avoid leaking resources. w.Close() } } func ExampleBucket_Delete() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() var bucket *blob.Bucket if err := bucket.Delete(ctx, "foo.txt"); err != nil { log.Fatal(err) } } func Example() { // Connect to a bucket when your program starts up. // This example uses the file-based implementation in fileblob, and creates // a temporary directory to use as the root directory. dir, cleanup := newTempDir() defer cleanup() bucket, err := fileblob.OpenBucket(dir, nil) if err != nil { log.Fatal(err) } defer bucket.Close() // We now have a *blob.Bucket! We can write our application using the // *blob.Bucket type, and have the freedom to change the initialization code // above to choose a different service-specific driver later. // In this example, we'll write a blob and then read it. ctx := context.Background() if err := bucket.WriteAll(ctx, "foo.txt", []byte("Go Cloud Development Kit"), nil); err != nil { log.Fatal(err) } b, err := bucket.ReadAll(ctx, "foo.txt") if err != nil { log.Fatal(err) } fmt.Println(string(b)) // Output: // Go Cloud Development Kit } func ExampleBucket_ErrorAs() { // This example is specific to the s3blob implementation; it demonstrates // access to the underlying smithy.APIError type. // The types exposed for ErrorAs by s3blob are documented in // https://godoc.org/gocloud.dev/blob/s3blob#hdr-As ctx := context.Background() b, err := blob.OpenBucket(ctx, "s3://my-bucket") if err != nil { log.Fatal(err) } defer b.Close() _, err = b.ReadAll(ctx, "nosuchfile") if err != nil { var awsErr smithy.APIError if b.ErrorAs(err, &awsErr) { fmt.Println(awsErr.ErrorCode()) } } } func ExampleBucket_List() { // Connect to a bucket when your program starts up. // This example uses the file-based implementation. dir, cleanup := newTempDir() defer cleanup() // Create the file-based bucket. bucket, err := fileblob.OpenBucket(dir, nil) if err != nil { log.Fatal(err) } defer bucket.Close() // Create some blob objects for listing: "foo[0..4].txt". ctx := context.Background() for i := range 5 { if err := bucket.WriteAll(ctx, fmt.Sprintf("foo%d.txt", i), []byte("Go Cloud Development Kit"), nil); err != nil { log.Fatal(err) } } // Iterate over them. // This will list the blobs created above because fileblob is strongly // consistent, but is not guaranteed to work on all services. li := bucket.List(nil) for { obj, err := li.Next(ctx) if err == io.EOF { break } if err != nil { log.Fatal(err) } fmt.Println(obj.Key) } // Alternatively, use All to iterate (and optionally download): fmt.Println() fmt.Println("Now, using an iterator:") li = bucket.List(nil) iter, errFn := li.All(ctx) for obj, download := range iter { var buf bytes.Buffer if err := download(&buf, nil /* default ReaderOptions */); err != nil { log.Fatalf("download of %q failed: %v", obj.Key, err) } fmt.Printf("%s: %s\n", obj.Key, string(buf.Bytes())) } if err := errFn(); err != nil { log.Fatalf("iteration failed: %v", err) } // Output: // foo0.txt // foo1.txt // foo2.txt // foo3.txt // foo4.txt // // Now, using an iterator: // foo0.txt: Go Cloud Development Kit // foo1.txt: Go Cloud Development Kit // foo2.txt: Go Cloud Development Kit // foo3.txt: Go Cloud Development Kit // foo4.txt: Go Cloud Development Kit } func ExampleBucket_List_withDelimiter() { // Connect to a bucket when your program starts up. // This example uses the file-based implementation. dir, cleanup := newTempDir() defer cleanup() // Create the file-based bucket. bucket, err := fileblob.OpenBucket(dir, nil) if err != nil { log.Fatal(err) } defer bucket.Close() // Create some blob objects in a hierarchy. ctx := context.Background() for _, key := range []string{ "dir1/subdir/a.txt", "dir1/subdir/b.txt", "dir2/c.txt", "d.txt", } { if err := bucket.WriteAll(ctx, key, []byte("Go Cloud Development Kit"), nil); err != nil { log.Fatal(err) } } // list lists files in b starting with prefix. It uses the delimiter "/", // and recurses into "directories", adding 2 spaces to indent each time. // It will list the blobs created above because fileblob is strongly // consistent, but is not guaranteed to work on all services. var list func(context.Context, *blob.Bucket, string, string) list = func(ctx context.Context, b *blob.Bucket, prefix, indent string) { iter := b.List(&blob.ListOptions{ Delimiter: "/", Prefix: prefix, }) for { obj, err := iter.Next(ctx) if err == io.EOF { break } if err != nil { log.Fatal(err) } fmt.Printf("%s%s\n", indent, obj.Key) if obj.IsDir { list(ctx, b, obj.Key, indent+" ") } } } list(ctx, bucket, "", "") // Output: // d.txt // dir1/ // dir1/subdir/ // dir1/subdir/a.txt // dir1/subdir/b.txt // dir2/ // dir2/c.txt } func ExampleBucket_ListPage() { // Connect to a bucket when your program starts up. // This example uses the file-based implementation. dir, cleanup := newTempDir() defer cleanup() // Create the file-based bucket. bucket, err := fileblob.OpenBucket(dir, nil) if err != nil { log.Fatal(err) } defer bucket.Close() // Create some blob objects for listing: "foo[0..7].txt". ctx := context.Background() for i := range 8 { if err := bucket.WriteAll(ctx, fmt.Sprintf("foo%d.txt", i), []byte("Go Cloud Development Kit"), nil); err != nil { log.Fatal(err) } } // Iterate over them in pages. // This will list the blobs created above because fileblob is strongly // consistent, but is not guaranteed to work on all services. // The first page of 3 results. objs, token, err := bucket.ListPage(ctx, blob.FirstPageToken, 3, nil) if err != nil { log.Fatal(err) } for _, obj := range objs { fmt.Println(obj.Key) } fmt.Println("END OF PAGE 1") // The second page of 3 results. objs, token, err = bucket.ListPage(ctx, token, 3, nil) if err != nil { log.Fatal(err) } for _, obj := range objs { fmt.Println(obj.Key) } fmt.Println("END OF PAGE 2") // The third page with the last 2 results. objs, token, err = bucket.ListPage(ctx, token, 3, nil) if err != nil { log.Fatal(err) } for _, obj := range objs { fmt.Println(obj.Key) } fmt.Println("END OF PAGE 3") // There are no more pages, so token is now nil. Calling ListPage again will return io.EOF. if token != nil { fmt.Println("Token was not nil.") } // Output: // foo0.txt // foo1.txt // foo2.txt // END OF PAGE 1 // foo3.txt // foo4.txt // foo5.txt // END OF PAGE 2 // foo6.txt // foo7.txt // END OF PAGE 3 } func ExampleBucket_As() { // This example is specific to the gcsblob implementation; it demonstrates // access to the underlying cloud.google.com/go/storage.Client type. // The types exposed for As by gcsblob are documented in // https://godoc.org/gocloud.dev/blob/gcsblob#hdr-As // This URL will open the bucket "my-bucket" using default credentials. ctx := context.Background() b, err := blob.OpenBucket(ctx, "gs://my-bucket") if err != nil { log.Fatal(err) } defer b.Close() // Access storage.Client fields via gcsClient here. var gcsClient *storage.Client if b.As(&gcsClient) { email, err := gcsClient.ServiceAccount(ctx, "project-name") if err != nil { log.Fatal(err) } _ = email } else { log.Println("Unable to access storage.Client through Bucket.As") } } func ExampleWriterOptions() { // This example is specific to the gcsblob implementation; it demonstrates // access to the underlying cloud.google.com/go/storage.Writer type. // The types exposed for As by gcsblob are documented in // https://godoc.org/gocloud.dev/blob/gcsblob#hdr-As ctx := context.Background() b, err := blob.OpenBucket(ctx, "gs://my-bucket") if err != nil { log.Fatal(err) } defer b.Close() beforeWrite := func(as func(any) bool) error { var sw *storage.Writer if as(&sw) { fmt.Println(sw.ChunkSize) } return nil } options := blob.WriterOptions{BeforeWrite: beforeWrite} if err := b.WriteAll(ctx, "newfile.txt", []byte("hello\n"), &options); err != nil { log.Fatal(err) } } func ExampleListObject_As() { // This example is specific to the gcsblob implementation; it demonstrates // access to the underlying cloud.google.com/go/storage.ObjectAttrs type. // The types exposed for As by gcsblob are documented in // https://godoc.org/gocloud.dev/blob/gcsblob#hdr-As ctx := context.Background() b, err := blob.OpenBucket(ctx, "gs://my-bucket") if err != nil { log.Fatal(err) } defer b.Close() iter := b.List(nil) for { obj, err := iter.Next(ctx) if err == io.EOF { break } if err != nil { log.Fatal(err) } // Access storage.ObjectAttrs via oa here. var oa storage.ObjectAttrs if obj.As(&oa) { _ = oa.Owner } } } func ExampleListOptions() { // This example is specific to the gcsblob implementation; it demonstrates // access to the underlying cloud.google.com/go/storage.Query type. // The types exposed for As by gcsblob are documented in // https://godoc.org/gocloud.dev/blob/gcsblob#hdr-As ctx := context.Background() b, err := blob.OpenBucket(ctx, "gs://my-bucket") if err != nil { log.Fatal(err) } defer b.Close() beforeList := func(as func(any) bool) error { // Access storage.Query via q here. var q *storage.Query if as(&q) { _ = q.Delimiter } return nil } iter := b.List(&blob.ListOptions{Prefix: "", Delimiter: "/", BeforeList: beforeList}) for { obj, err := iter.Next(ctx) if err == io.EOF { break } if err != nil { log.Fatal(err) } _ = obj } } func ExamplePrefixedBucket() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. var bucket *blob.Bucket // Wrap the bucket using blob.PrefixedBucket. // The prefix should end with "/", so that the resulting bucket operates // in a subfolder. bucket = blob.PrefixedBucket(bucket, "a/subfolder/") // The original bucket is no longer usable; it has been closed. // The wrapped bucket should be closed when done. defer bucket.Close() // Bucket operations on will be translated to "a/subfolder/". } func ExampleSingleKeyBucket() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. var bucket *blob.Bucket // Wrap the bucket using blob.SingleKeyBucket. // The bucket always references the provided key. bucket = blob.SingleKeyBucket(bucket, "foo.txt") // The original bucket is no longer usable; it has been closed. // The wrapped bucket should be closed when done. defer bucket.Close() // Bucket operations will ignore the passed-in key and always reference foo.txt. } func ExampleReader_As() { // This example is specific to the gcsblob implementation; it demonstrates // access to the underlying cloud.google.com/go/storage.Reader type. // The types exposed for As by gcsblob are documented in // https://godoc.org/gocloud.dev/blob/gcsblob#hdr-As ctx := context.Background() b, err := blob.OpenBucket(ctx, "gs://my-bucket") if err != nil { log.Fatal(err) } defer b.Close() r, err := b.NewReader(ctx, "gopher.png", nil) if err != nil { log.Fatal(err) } defer r.Close() // Access storage.Reader via sr here. var sr *storage.Reader if r.As(&sr) { _ = sr.Attrs } } func ExampleAttributes_As() { // This example is specific to the gcsblob implementation; it demonstrates // access to the underlying cloud.google.com/go/storage.ObjectAttrs type. // The types exposed for As by gcsblob are documented in // https://godoc.org/gocloud.dev/blob/gcsblob#hdr-As ctx := context.Background() b, err := blob.OpenBucket(ctx, "gs://my-bucket") if err != nil { log.Fatal(err) } defer b.Close() attrs, err := b.Attributes(ctx, "gopher.png") if err != nil { log.Fatal(err) } var oa storage.ObjectAttrs if attrs.As(&oa) { fmt.Println(oa.Owner) } } func newTempDir() (string, func()) { dir, err := os.MkdirTemp("", "go-cloud-blob-example") if err != nil { panic(err) } return dir, func() { os.RemoveAll(dir) } } ================================================ FILE: blob/fileblob/attrs.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package fileblob import ( "encoding/json" "fmt" "os" ) const attrsExt = ".attrs" var errAttrsExt = fmt.Errorf("file extension %q is reserved", attrsExt) // xattrs stores extended attributes for an object. The format is like // filesystem extended attributes, see // https://www.freedesktop.org/wiki/CommonExtendedAttributes. type xattrs struct { CacheControl string `json:"user.cache_control"` ContentDisposition string `json:"user.content_disposition"` ContentEncoding string `json:"user.content_encoding"` ContentLanguage string `json:"user.content_language"` ContentType string `json:"user.content_type"` Metadata map[string]string `json:"user.metadata"` MD5 []byte `json:"md5"` } // setAttrs creates a "path.attrs" file along with blob to store the attributes, // it uses JSON format. func setAttrs(path string, xa xattrs) error { f, err := os.Create(path + attrsExt) if err != nil { return err } if err := json.NewEncoder(f).Encode(xa); err != nil { f.Close() os.Remove(f.Name()) return err } return f.Close() } // getAttrs looks at the "path.attrs" file to retrieve the attributes and // decodes them into a xattrs struct. It doesn't return error when there is no // such .attrs file. func getAttrs(path string) (xattrs, error) { f, err := os.Open(path + attrsExt) if err != nil { if os.IsNotExist(err) { // Handle gracefully for non-existent .attr files. return xattrs{ ContentType: "application/octet-stream", }, nil } return xattrs{}, err } xa := new(xattrs) if err := json.NewDecoder(f).Decode(xa); err != nil { f.Close() return xattrs{}, err } return *xa, f.Close() } ================================================ FILE: blob/fileblob/example_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package fileblob_test import ( "context" "fmt" "log" "os" "path/filepath" "strings" "gocloud.dev/blob" "gocloud.dev/blob/fileblob" ) func ExampleOpenBucket() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // The directory you pass to fileblob.OpenBucket must exist first. const myDir = "path/to/local/directory" if err := os.MkdirAll(myDir, 0o777); err != nil { log.Fatal(err) } // Create a file-based bucket. bucket, err := fileblob.OpenBucket(myDir, nil) if err != nil { log.Fatal(err) } defer bucket.Close() } func Example_openBucketFromURL() { // Create a temporary directory. dir, err := os.MkdirTemp("", "go-cloud-fileblob-example") if err != nil { log.Fatal(err) } defer os.RemoveAll(dir) // On Unix, append the dir to "file://". // On Windows, convert "\" to "/" and add a leading "/": dirpath := filepath.ToSlash(dir) if os.PathSeparator != '/' && !strings.HasPrefix(dirpath, "/") { dirpath = "/" + dirpath } // blob.OpenBucket creates a *blob.Bucket from a URL. ctx := context.Background() b, err := blob.OpenBucket(ctx, "file://"+dirpath) if err != nil { log.Fatal(err) } defer b.Close() // Now we can use b to read or write files to the container. err = b.WriteAll(ctx, "my-key", []byte("hello world"), nil) if err != nil { log.Fatal(err) } data, err := b.ReadAll(ctx, "my-key") if err != nil { log.Fatal(err) } fmt.Println(string(data)) // Output: // hello world } ================================================ FILE: blob/fileblob/fileblob.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package fileblob provides a blob implementation that uses the filesystem. // Use OpenBucket to construct a *blob.Bucket. // // To avoid partial writes, fileblob writes to a temporary file and then renames // the temporary file to the final path on Close. By default, it creates these // temporary files in `os.TempDir`. If `os.TempDir` is on a different mount than // your base bucket path, the `os.Rename` will fail with `invalid cross-device link`. // To avoid this, either configure the temp dir to use by setting the environment // variable `TMPDIR`, or set `Options.NoTempDir` to `true` (fileblob will create // the temporary files next to the actual files instead of in a temporary directory). // // By default fileblob stores blob metadata in "sidecar" files under the original // filename with an additional ".attrs" suffix. // This behaviour can be changed via `Options.Metadata`; // writing of those metadata files can be suppressed by setting it to // `MetadataDontWrite` or its equivalent "metadata=skip" in the URL for the opener. // In either case, absent any stored metadata many `blob.Attributes` fields // will be set to default values. // // # URLs // // For blob.OpenBucket, fileblob registers for the scheme "file". // To customize the URL opener, or for more details on the URL format, // see URLOpener. // See https://gocloud.dev/concepts/urls/ for background information. // // # Escaping // // Go CDK supports all UTF-8 strings; to make this work with services lacking // full UTF-8 support, strings must be escaped (during writes) and unescaped // (during reads). The following escapes are performed for fileblob: // - Blob keys: ASCII characters 0-31 are escaped to "__0x__". // If os.PathSeparator != "/", it is also escaped. // Additionally, the "/" in "../", the trailing "/" in "//", and a trailing // "/" is key names are escaped in the same way. // On Windows, the characters "<>:"|?*" are also escaped. // // # As // // fileblob exposes the following types for As: // - Bucket: os.FileInfo // - Error: *os.PathError // - ListObject: os.FileInfo // - Reader: io.Reader // - ReaderOptions.BeforeRead: *os.File // - Attributes: os.FileInfo // - CopyOptions.BeforeCopy: *os.File // - WriterOptions.BeforeWrite: *os.File package fileblob // import "gocloud.dev/blob/fileblob" import ( "context" "crypto/hmac" "crypto/md5" "crypto/sha256" "encoding/base64" "errors" "fmt" "hash" "io" "io/fs" "net/url" "os" "path/filepath" "strconv" "strings" "sync" "time" "gocloud.dev/blob" "gocloud.dev/blob/driver" "gocloud.dev/gcerrors" "gocloud.dev/internal/escape" "gocloud.dev/internal/gcerr" ) const defaultPageSize = 1000 func init() { blob.DefaultURLMux().RegisterBucket(Scheme, &URLOpener{}) } // Scheme is the URL scheme fileblob registers its URLOpener under on // blob.DefaultMux. const Scheme = "file" // URLOpener opens file bucket URLs like "file:///foo/bar/baz". // // The URL's host is ignored unless it is ".", which is used to signal a // relative path. For example, "file://./../.." uses "../.." as the path. // // If os.PathSeparator != "/", any leading "/" from the path is dropped // and remaining '/' characters are converted to os.PathSeparator. // // The following query parameters are supported: // // - create_dir: (any non-empty value) the directory is created (using os.MkDirAll) // if it does not already exist. // - dir_file_mode: any directories that are created (the base directory when create_dir // is true, or subdirectories for keys) are created using this os.FileMode, parsed // using os.Parseuint. Defaults to 0777. // - no_tmp_dir: (any non-empty value) temporary files are created next to the final // path instead of in os.TempDir. // - base_url: the base URL to use to construct signed URLs; see URLSignerHMAC // - secret_key_path: path to read for the secret key used to construct signed URLs; // see URLSignerHMAC // - metadata: if set to "skip", won't write metadata such as blob.Attributes // as per the package docstring // // If either of base_url / secret_key_path are provided, both must be. // // - file:///a/directory // -> Passes "/a/directory" to OpenBucket. // - file://localhost/a/directory // -> Also passes "/a/directory". // - file://./../.. // -> The hostname is ".", signaling a relative path; passes "../..". // - file:///c:/foo/bar on Windows. // -> Passes "c:\foo\bar". // - file://localhost/c:/foo/bar on Windows. // -> Also passes "c:\foo\bar". // - file:///a/directory?base_url=/show&secret_key_path=secret.key // -> Passes "/a/directory" to OpenBucket, and sets Options.URLSigner // to a URLSignerHMAC initialized with base URL "/show" and secret key // bytes read from the file "secret.key". type URLOpener struct { // Options specifies the default options to pass to OpenBucket. Options Options } // OpenBucketURL opens a blob.Bucket based on u. func (o *URLOpener) OpenBucketURL(ctx context.Context, u *url.URL) (*blob.Bucket, error) { path := u.Path // Hostname == "." means a relative path, so drop the leading "/". // Also drop the leading "/" on Windows. if u.Host == "." || os.PathSeparator != '/' { path = strings.TrimPrefix(path, "/") } opts, err := o.forParams(ctx, u.Query()) if err != nil { return nil, fmt.Errorf("open bucket %v: %v", u, err) } return OpenBucket(filepath.FromSlash(path), opts) } var recognizedParams = map[string]bool{ "create_dir": true, "base_url": true, "secret_key_path": true, "metadata": true, "no_tmp_dir": true, "dir_file_mode": true, } type metadataOption string // Not exported as subject to change. // Settings for Options.Metadata. const ( // Metadata gets written to a separate file. MetadataInSidecar metadataOption = "" // Writes won't carry metadata, as per the package docstring. MetadataDontWrite metadataOption = "skip" ) func (o *URLOpener) forParams(ctx context.Context, q url.Values) (*Options, error) { for k := range q { if _, ok := recognizedParams[k]; !ok { return nil, fmt.Errorf("invalid query parameter %q", k) } } opts := new(Options) *opts = o.Options // Note: can't just use q.Get, because then we can't distinguish between // "not set" (we should leave opts alone) vs "set to empty string" (which is // one of the legal values, we should override opts). metadataVal := q["metadata"] if len(metadataVal) > 0 { switch metadataOption(metadataVal[0]) { case MetadataDontWrite: opts.Metadata = MetadataDontWrite case MetadataInSidecar: opts.Metadata = MetadataInSidecar default: return nil, errors.New("fileblob.OpenBucket: unsupported value for query parameter 'metadata'") } } if q.Get("create_dir") != "" { opts.CreateDir = true } if fms := q.Get("dir_file_mode"); fms != "" { fm, err := strconv.ParseUint(fms, 10, 32) if err != nil { return nil, fmt.Errorf("fileblob.OpenBucket: invalid dir_file_mode %q: %v", fms, err) } opts.DirFileMode = os.FileMode(fm) } if q.Get("no_tmp_dir") != "" { opts.NoTempDir = true } baseURL := q.Get("base_url") keyPath := q.Get("secret_key_path") if (baseURL == "") != (keyPath == "") { return nil, errors.New("fileblob.OpenBucket: must supply both base_url and secret_key_path query parameters") } if baseURL != "" { burl, err := url.Parse(baseURL) if err != nil { return nil, err } sk, err := os.ReadFile(keyPath) if err != nil { return nil, err } opts.URLSigner = NewURLSignerHMAC(burl, sk) } return opts, nil } // Options sets options for constructing a *blob.Bucket backed by fileblob. type Options struct { // URLSigner implements signing URLs (to allow access to a resource without // further authorization) and verifying that a given URL is unexpired and // contains a signature produced by the URLSigner. // URLSigner is only required for utilizing the SignedURL API. URLSigner URLSigner // If true, create the directory backing the Bucket if it does not exist // (using os.MkdirAll). CreateDir bool // The FileMode to use when creating directories for the top-level directory // backing the bucket (when CreateDir is true), and for subdirectories for keys. // Defaults to 0777. DirFileMode os.FileMode // If true, don't use os.TempDir for temporary files, but instead place them // next to the actual files. This may result in "stranded" temporary files // (e.g., if the application is killed before the file cleanup runs). // // If your bucket directory is on a different mount than os.TempDir, you will // need to set this to true, as os.Rename will fail across mount points. NoTempDir bool // Refers to the strategy for how to deal with metadata (such as blob.Attributes). // For supported values please see the Metadata* constants. // If left unchanged, 'MetadataInSidecar' will be used. Metadata metadataOption } type bucket struct { dir string opts *Options } // openBucket creates a driver.Bucket that reads and writes to dir. // dir must exist. func openBucket(dir string, opts *Options) (driver.Bucket, error) { if opts == nil { opts = &Options{} } if opts.DirFileMode == 0 { opts.DirFileMode = os.FileMode(0o777) } absdir, err := filepath.Abs(dir) if err != nil { return nil, fmt.Errorf("failed to convert %s into an absolute path: %v", dir, err) } info, err := os.Stat(absdir) // Optionally, create the directory if it does not already exist. if err != nil && opts.CreateDir && os.IsNotExist(err) { err = os.MkdirAll(absdir, opts.DirFileMode) if err != nil { return nil, fmt.Errorf("tried to create directory but failed: %v", err) } info, err = os.Stat(absdir) } if err != nil { return nil, err } if !info.IsDir() { return nil, fmt.Errorf("%s is not a directory", absdir) } return &bucket{dir: absdir, opts: opts}, nil } // OpenBucket creates a *blob.Bucket backed by the filesystem and rooted at // dir, which must exist. See the package documentation for an example. func OpenBucket(dir string, opts *Options) (*blob.Bucket, error) { drv, err := openBucket(dir, opts) if err != nil { return nil, err } return blob.NewBucket(drv), nil } func (b *bucket) Close() error { return nil } // escapeKey does all required escaping for UTF-8 strings to work the filesystem. func escapeKey(s string) string { s = escape.HexEscape(s, func(r []rune, i int) bool { c := r[i] switch { case c < 32: return true // We're going to replace '/' with os.PathSeparator below. In order for this // to be reversible, we need to escape raw os.PathSeparators. case os.PathSeparator != '/' && c == os.PathSeparator: return true // For "../", escape the trailing slash. case i > 1 && c == '/' && r[i-1] == '.' && r[i-2] == '.': return true // For "//", escape the trailing slash. case i > 0 && c == '/' && r[i-1] == '/': return true // Escape the trailing slash in a key. case c == '/' && i == len(r)-1: return true // https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file case os.PathSeparator == '\\' && (c == '>' || c == '<' || c == ':' || c == '"' || c == '|' || c == '?' || c == '*'): return true } return false }) // Replace "/" with os.PathSeparator if needed, so that the local filesystem // can use subdirectories. if os.PathSeparator != '/' { s = strings.Replace(s, "/", string(os.PathSeparator), -1) } return s } // unescapeKey reverses escapeKey. func unescapeKey(s string) string { if os.PathSeparator != '/' { s = strings.Replace(s, string(os.PathSeparator), "/", -1) } s = escape.HexUnescape(s) return s } func (b *bucket) ErrorCode(err error) gcerrors.ErrorCode { switch { case os.IsNotExist(err): return gcerrors.NotFound default: return gcerrors.Unknown } } // path returns the full path for a key func (b *bucket) path(key string) (string, error) { path := filepath.Join(b.dir, escapeKey(key)) // Ensure that the key hasn't escaped the bucket root. if !strings.HasPrefix( filepath.Clean(path)+string(os.PathSeparator), // Note: b.dir is already Cleaned via Abs in the constructor. b.dir+string(os.PathSeparator)) { return "", fmt.Errorf("fileblob: key %q escapes bucket root", key) } if strings.HasSuffix(path, attrsExt) { return "", errAttrsExt } return path, nil } // forKey returns the full path, os.FileInfo, and attributes for key. func (b *bucket) forKey(key string) (string, os.FileInfo, *xattrs, error) { path, err := b.path(key) if err != nil { return "", nil, nil, err } info, err := os.Stat(path) if err != nil { return "", nil, nil, err } if info.IsDir() { return "", nil, nil, os.ErrNotExist } xa, err := getAttrs(path) if err != nil { return "", nil, nil, err } return path, info, &xa, nil } // ListPaged implements driver.ListPaged. func (b *bucket) ListPaged(ctx context.Context, opts *driver.ListOptions) (*driver.ListPage, error) { var pageToken string if len(opts.PageToken) > 0 { pageToken = string(opts.PageToken) } pageSize := opts.PageSize if pageSize == 0 { pageSize = defaultPageSize } // If opts.Delimiter != "", lastPrefix contains the last "directory" key we // added. It is used to avoid adding it again; all files in this "directory" // are collapsed to the single directory entry. var lastPrefix string var lastKeyAdded string // If the Prefix contains a "/", we can set the root of the Walk // to the path specified by the Prefix as any files below the path will not // match the Prefix. // Note that we use "/" explicitly and not os.PathSeparator, as the opts.Prefix // is in the unescaped form. root := b.dir if i := strings.LastIndex(opts.Prefix, "/"); i > -1 { root = filepath.Join(root, opts.Prefix[:i]) } // Ensure that the Prefix hasn't escaped the bucket root. if b.dir != string(os.PathSeparator) && !strings.HasPrefix( filepath.Clean(root)+string(os.PathSeparator), // Note: b.dir is already Cleaned via Abs in the constructor. b.dir+string(os.PathSeparator)) { return nil, fmt.Errorf("fileblob: key %q escapes bucket root", opts.Prefix) } // Do a full recursive scan of the root directory. var result driver.ListPage err := filepath.WalkDir(root, func(path string, info fs.DirEntry, err error) error { if err != nil { // Couldn't read this file/directory for some reason; just skip it. return nil } // Skip the self-generated attribute files. if strings.HasSuffix(path, attrsExt) { return nil } // os.Walk returns the root directory; skip it. if path == b.dir { return nil } // Strip the prefix from path. prefixLen := len(b.dir) // Include the separator for non-root. if b.dir != "/" { prefixLen++ } path = path[prefixLen:] // Unescape the path to get the key. key := unescapeKey(path) // Skip all directories. If opts.Delimiter is set, we'll create // pseudo-directories later. // Note that returning nil means that we'll still recurse into it; // we're just not adding a result for the directory itself. if info.IsDir() { key += "/" // Avoid recursing into subdirectories if the directory name already // doesn't match the prefix; any files in it are guaranteed not to match. if len(key) > len(opts.Prefix) && !strings.HasPrefix(key, opts.Prefix) { return filepath.SkipDir } // Similarly, avoid recursing into subdirectories if we're making // "directories" and all of the files in this subdirectory are guaranteed // to collapse to a "directory" that we've already added. if lastPrefix != "" && strings.HasPrefix(key, lastPrefix) { return filepath.SkipDir } return nil } // Skip files/directories that don't match the Prefix. if !strings.HasPrefix(key, opts.Prefix) { return nil } var md5 []byte if xa, err := getAttrs(path); err == nil { // Note: we only have the MD5 hash for blobs that we wrote. // For other blobs, md5 will remain nil. md5 = xa.MD5 } fi, err := info.Info() if err != nil { return err } asFunc := func(i any) bool { p, ok := i.(*os.FileInfo) if !ok { return false } *p = fi return true } obj := &driver.ListObject{ Key: key, ModTime: fi.ModTime(), Size: fi.Size(), MD5: md5, AsFunc: asFunc, } // If using Delimiter, collapse "directories". if opts.Delimiter != "" { // Strip the prefix, which may contain Delimiter. keyWithoutPrefix := key[len(opts.Prefix):] // See if the key still contains Delimiter. // If no, it's a file and we just include it. // If yes, it's a file in a "sub-directory" and we want to collapse // all files in that "sub-directory" into a single "directory" result. if idx := strings.Index(keyWithoutPrefix, opts.Delimiter); idx != -1 { prefix := opts.Prefix + keyWithoutPrefix[0:idx+len(opts.Delimiter)] // We've already included this "directory"; don't add it. if prefix == lastPrefix { return nil } // Update the object to be a "directory". obj = &driver.ListObject{ Key: prefix, IsDir: true, AsFunc: asFunc, } lastPrefix = prefix } } // If there's a pageToken, skip anything before it. if pageToken != "" && obj.Key <= pageToken { return nil } // If we've already got a full page of results, set NextPageToken and stop. // Unless the current object is a directory, in which case there may // still be objects coming that are alphabetically before it (since // we appended the delimiter). In that case, keep going; we'll trim the // extra entries (if any) before returning. if len(result.Objects) == pageSize && !obj.IsDir { result.NextPageToken = []byte(result.Objects[pageSize-1].Key) return io.EOF } result.Objects = append(result.Objects, obj) // Normally, objects are added in the correct order (by Key). // However, sometimes adding the file delimiter messes that up (e.g., // if the file delimiter is later in the alphabet than the last character // of a key). // Detect if this happens and swap if needed. if len(result.Objects) > 1 && obj.Key < lastKeyAdded { i := len(result.Objects) - 1 result.Objects[i-1], result.Objects[i] = result.Objects[i], result.Objects[i-1] lastKeyAdded = result.Objects[i].Key } else { lastKeyAdded = obj.Key } return nil }) if err != nil && err != io.EOF { return nil, err } if len(result.Objects) > pageSize { result.Objects = result.Objects[0:pageSize] result.NextPageToken = []byte(result.Objects[pageSize-1].Key) } return &result, nil } // As implements driver.As. func (b *bucket) As(i any) bool { p, ok := i.(*os.FileInfo) if !ok { return false } fi, err := os.Stat(b.dir) if err != nil { return false } *p = fi return true } // As implements driver.ErrorAs. func (b *bucket) ErrorAs(err error, i any) bool { if perr, ok := err.(*os.PathError); ok { if p, ok := i.(**os.PathError); ok { *p = perr return true } } return false } // Attributes implements driver.Attributes. func (b *bucket) Attributes(ctx context.Context, key string) (*driver.Attributes, error) { _, info, xa, err := b.forKey(key) if err != nil { return nil, err } return &driver.Attributes{ CacheControl: xa.CacheControl, ContentDisposition: xa.ContentDisposition, ContentEncoding: xa.ContentEncoding, ContentLanguage: xa.ContentLanguage, ContentType: xa.ContentType, Metadata: xa.Metadata, // CreateTime left as the zero time. ModTime: info.ModTime(), Size: info.Size(), MD5: xa.MD5, ETag: fmt.Sprintf("\"%x-%x\"", info.ModTime().UnixNano(), info.Size()), AsFunc: func(i any) bool { p, ok := i.(*os.FileInfo) if !ok { return false } *p = info return true }, }, nil } // NewRangeReader implements driver.NewRangeReader. func (b *bucket) NewRangeReader(ctx context.Context, key string, offset, length int64, opts *driver.ReaderOptions) (driver.Reader, error) { path, info, xa, err := b.forKey(key) if err != nil { return nil, err } f, err := os.Open(path) if err != nil { return nil, err } if opts.BeforeRead != nil { if err := opts.BeforeRead(func(i any) bool { p, ok := i.(**os.File) if !ok { return false } *p = f return true }); err != nil { return nil, err } } if offset > 0 { if _, err := f.Seek(offset, io.SeekStart); err != nil { return nil, err } } r := io.Reader(f) if length >= 0 { r = io.LimitReader(r, length) } return &reader{ r: r, c: f, attrs: driver.ReaderAttributes{ ContentType: xa.ContentType, ModTime: info.ModTime(), Size: info.Size(), }, }, nil } type reader struct { r io.Reader c io.Closer attrs driver.ReaderAttributes } func (r *reader) Read(p []byte) (int, error) { if r.r == nil { return 0, io.EOF } return r.r.Read(p) } func (r *reader) Close() error { if r.c == nil { return nil } return r.c.Close() } func (r *reader) Attributes() *driver.ReaderAttributes { return &r.attrs } func (r *reader) As(i any) bool { p, ok := i.(*io.Reader) if !ok { return false } *p = r.r return true } func createTemp(path string, noTempDir bool) (*os.File, error) { // Use a custom createTemp function rather than os.CreateTemp() as // os.CreateTemp() sets the permissions of the tempfile to 0600, rather than // 0666, making it inconsistent with the directories and attribute files. try := 0 for { // Append the current time with nanosecond precision and .tmp to the // base path. If the file already exists try again. Nanosecond changes enough // between each iteration to make a conflict unlikely. Using the full // time lowers the chance of a collision with a file using a similar // pattern, but has undefined behavior after the year 2262. var name string if noTempDir { name = path } else { name = filepath.Join(os.TempDir(), filepath.Base(path)) } name += "." + strconv.FormatInt(time.Now().UnixNano(), 16) + ".tmp" f, err := os.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0o666) if os.IsExist(err) { if try++; try < 10000 { continue } return nil, &os.PathError{Op: "createtemp", Path: path + ".*.tmp", Err: os.ErrExist} } return f, err } } // NewTypedWriter implements driver.NewTypedWriter. func (b *bucket) NewTypedWriter(ctx context.Context, key, contentType string, opts *driver.WriterOptions) (driver.Writer, error) { path, err := b.path(key) if err != nil { return nil, err } if err := os.MkdirAll(filepath.Dir(path), b.opts.DirFileMode); err != nil { return nil, err } f, err := createTemp(path, b.opts.NoTempDir) if err != nil { return nil, err } if opts.BeforeWrite != nil { if err := opts.BeforeWrite(func(i any) bool { p, ok := i.(**os.File) if !ok { return false } *p = f return true }); err != nil { return nil, err } } if b.opts.Metadata == MetadataDontWrite { w := &writer{ ctx: ctx, File: f, path: path, ifNotExist: opts.IfNotExist, mu: &sync.Mutex{}, } return w, nil } var metadata map[string]string if len(opts.Metadata) > 0 { metadata = opts.Metadata } attrs := xattrs{ CacheControl: opts.CacheControl, ContentDisposition: opts.ContentDisposition, ContentEncoding: opts.ContentEncoding, ContentLanguage: opts.ContentLanguage, ContentType: contentType, Metadata: metadata, } w := &writerWithSidecar{ ctx: ctx, f: f, path: path, attrs: attrs, contentMD5: opts.ContentMD5, md5hash: md5.New(), ifNotExist: opts.IfNotExist, mu: &sync.Mutex{}, } return w, nil } // writerWithSidecar implements the strategy of storing metadata in a distinct file. type writerWithSidecar struct { ctx context.Context f *os.File path string attrs xattrs contentMD5 []byte // We compute the MD5 hash so that we can store it with the file attributes, // not for verification. md5hash hash.Hash ifNotExist bool mu *sync.Mutex } func (w *writerWithSidecar) Write(p []byte) (n int, err error) { n, err = w.f.Write(p) if err != nil { // Don't hash the unwritten tail twice when writing is resumed. w.md5hash.Write(p[:n]) return n, err } if _, err := w.md5hash.Write(p); err != nil { return n, err } return n, nil } func (w *writerWithSidecar) Close() error { err := w.f.Close() if err != nil { return err } // Always delete the temp file. On success, it will have been renamed so // the Remove will fail. defer func() { _ = os.Remove(w.f.Name()) }() // Check if the write was cancelled. if err := w.ctx.Err(); err != nil { return err } md5sum := w.md5hash.Sum(nil) w.attrs.MD5 = md5sum // Write the attributes file. if err := setAttrs(w.path, w.attrs); err != nil { return err } if w.ifNotExist { w.mu.Lock() defer w.mu.Unlock() _, err = os.Stat(w.path) if err == nil { return gcerr.New(gcerrors.FailedPrecondition, err, 1, "File already exist") } } // Rename the temp file to path. if err := os.Rename(w.f.Name(), w.path); err != nil { _ = os.Remove(w.path + attrsExt) return err } return nil } // writer is a file with a temporary name until closed. // // Embedding os.File allows the likes of io.Copy to use optimizations., // which is why it is not folded into writerWithSidecar. type writer struct { *os.File ctx context.Context path string ifNotExist bool mu *sync.Mutex } func (w *writer) Upload(r io.Reader) error { _, err := w.ReadFrom(r) return err } func (w *writer) Close() error { err := w.File.Close() if err != nil { return err } // Always delete the temp file. On success, it will have been renamed so // the Remove will fail. tempname := w.File.Name() defer os.Remove(tempname) // Check if the write was cancelled. if err := w.ctx.Err(); err != nil { return err } if w.ifNotExist { w.mu.Lock() defer w.mu.Unlock() _, err = os.Stat(w.path) if err == nil { return gcerr.New(gcerrors.FailedPrecondition, err, 1, "File already exist") } } // Rename the temp file to path. if err := os.Rename(tempname, w.path); err != nil { return err } return nil } // Copy implements driver.Copy. func (b *bucket) Copy(ctx context.Context, dstKey, srcKey string, opts *driver.CopyOptions) error { // Note: we could use NewRangeReader here, but since we need to copy all of // the metadata (from xa), it's more efficient to do it directly. srcPath, _, xa, err := b.forKey(srcKey) if err != nil { return err } f, err := os.Open(srcPath) if err != nil { return err } defer f.Close() // We'll write the copy using Writer, to avoid re-implementing making of a // temp file, cleaning up after partial failures, etc. wopts := driver.WriterOptions{ CacheControl: xa.CacheControl, ContentDisposition: xa.ContentDisposition, ContentEncoding: xa.ContentEncoding, ContentLanguage: xa.ContentLanguage, Metadata: xa.Metadata, BeforeWrite: opts.BeforeCopy, } // Create a cancelable context so we can cancel the write if there are // problems. writeCtx, cancel := context.WithCancel(ctx) defer cancel() w, err := b.NewTypedWriter(writeCtx, dstKey, xa.ContentType, &wopts) if err != nil { return err } _, err = io.Copy(w, f) if err != nil { cancel() // cancel before Close cancels the write w.Close() return err } return w.Close() } // Delete implements driver.Delete. func (b *bucket) Delete(ctx context.Context, key string) error { path, err := b.path(key) if err != nil { return err } err = os.Remove(path) if err != nil { return err } if err = os.Remove(path + attrsExt); err != nil && !os.IsNotExist(err) { return err } return nil } // SignedURL implements driver.SignedURL func (b *bucket) SignedURL(ctx context.Context, key string, opts *driver.SignedURLOptions) (string, error) { if b.opts.URLSigner == nil { return "", gcerr.New(gcerr.Unimplemented, nil, 1, "fileblob.SignedURL: bucket does not have an Options.URLSigner") } if opts.BeforeSign != nil { if err := opts.BeforeSign(func(any) bool { return false }); err != nil { return "", err } } surl, err := b.opts.URLSigner.URLFromKey(ctx, key, opts) if err != nil { return "", err } return surl.String(), nil } // URLSigner defines an interface for creating and verifying a signed URL for // objects in a fileblob bucket. Signed URLs are typically used for granting // access to an otherwise-protected resource without requiring further // authentication, and callers should take care to restrict the creation of // signed URLs as is appropriate for their application. type URLSigner interface { // URLFromKey defines how the bucket's object key will be turned // into a signed URL. URLFromKey must be safe to call from multiple goroutines. URLFromKey(ctx context.Context, key string, opts *driver.SignedURLOptions) (*url.URL, error) // KeyFromURL must be able to validate a URL returned from URLFromKey. // KeyFromURL must only return the object if if the URL is // both unexpired and authentic. KeyFromURL must be safe to call from // multiple goroutines. Implementations of KeyFromURL should not modify // the URL argument. KeyFromURL(ctx context.Context, surl *url.URL) (string, error) } // URLSignerHMAC signs URLs by adding the object key, expiration time, and a // hash-based message authentication code (HMAC) into the query parameters. // Values of URLSignerHMAC with the same secret key will accept URLs produced by // others as valid. type URLSignerHMAC struct { baseURL *url.URL secretKey []byte } // NewURLSignerHMAC creates a URLSignerHMAC. If the secret key is empty, // then NewURLSignerHMAC panics. func NewURLSignerHMAC(baseURL *url.URL, secretKey []byte) *URLSignerHMAC { if len(secretKey) == 0 { panic("creating URLSignerHMAC: secretKey is required") } uc := new(url.URL) *uc = *baseURL return &URLSignerHMAC{ baseURL: uc, secretKey: secretKey, } } // URLFromKey creates a signed URL by copying the baseURL and appending the // object key, expiry, and signature as a query params. func (h *URLSignerHMAC) URLFromKey(ctx context.Context, key string, opts *driver.SignedURLOptions) (*url.URL, error) { sURL := new(url.URL) *sURL = *h.baseURL q := sURL.Query() q.Set("obj", key) q.Set("expiry", strconv.FormatInt(time.Now().Add(opts.Expiry).Unix(), 10)) q.Set("method", opts.Method) if opts.ContentType != "" { q.Set("contentType", opts.ContentType) } q.Set("signature", h.getMAC(q)) sURL.RawQuery = q.Encode() return sURL, nil } func (h *URLSignerHMAC) getMAC(q url.Values) string { signedVals := url.Values{} signedVals.Set("obj", q.Get("obj")) signedVals.Set("expiry", q.Get("expiry")) signedVals.Set("method", q.Get("method")) if contentType := q.Get("contentType"); contentType != "" { signedVals.Set("contentType", contentType) } msg := signedVals.Encode() hsh := hmac.New(sha256.New, h.secretKey) hsh.Write([]byte(msg)) return base64.RawURLEncoding.EncodeToString(hsh.Sum(nil)) } // KeyFromURL checks expiry and signature, and returns the object key // only if the signed URL is both authentic and unexpired. func (h *URLSignerHMAC) KeyFromURL(ctx context.Context, sURL *url.URL) (string, error) { q := sURL.Query() exp, err := strconv.ParseInt(q.Get("expiry"), 10, 64) if err != nil || time.Now().Unix() > exp { return "", errors.New("retrieving blob key from URL: key cannot be retrieved") } if !h.checkMAC(q) { return "", errors.New("retrieving blob key from URL: key cannot be retrieved") } return q.Get("obj"), nil } func (h *URLSignerHMAC) checkMAC(q url.Values) bool { mac := q.Get("signature") expected := h.getMAC(q) // This compares the Base-64 encoded MACs return hmac.Equal([]byte(mac), []byte(expected)) } ================================================ FILE: blob/fileblob/fileblob_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package fileblob import ( "context" "errors" "fmt" "io" "net/http" "net/http/httptest" "net/url" "os" "path/filepath" "runtime" "strings" "testing" "gocloud.dev/blob" "gocloud.dev/blob/driver" "gocloud.dev/blob/drivertest" "gocloud.dev/gcerrors" ) type harness struct { dir string prefix string metadataHow metadataOption noTempDir bool server *httptest.Server urlSigner URLSigner closer func() } func newHarness(ctx context.Context, t *testing.T, prefix string, metadataHow metadataOption, noTempDir bool) (drivertest.Harness, error) { t.Helper() if metadataHow == MetadataDontWrite { // Skip tests for if no metadata gets written. // For these it is currently undefined whether any gets read (back). switch name := t.Name(); { case strings.Contains(name, "ContentType"), strings.HasSuffix(name, "TestAttributes"), strings.Contains(name, "TestMetadata/"): t.SkipNow() return nil, nil } } dir := filepath.Join(os.TempDir(), "go-cloud-fileblob") if err := os.MkdirAll(dir, os.ModePerm); err != nil { return nil, err } if prefix != "" { if err := os.MkdirAll(filepath.Join(dir, prefix), os.ModePerm); err != nil { return nil, err } } h := &harness{dir: dir, prefix: prefix, metadataHow: metadataHow, noTempDir: noTempDir} localServer := httptest.NewServer(http.HandlerFunc(h.serveSignedURL)) h.server = localServer u, err := url.Parse(h.server.URL) if err != nil { return nil, err } h.urlSigner = NewURLSignerHMAC(u, []byte("I'm a secret key")) h.closer = func() { _ = os.RemoveAll(dir); localServer.Close() } return h, nil } func (h *harness) serveSignedURL(w http.ResponseWriter, r *http.Request) { objKey, err := h.urlSigner.KeyFromURL(r.Context(), r.URL) if err != nil { w.WriteHeader(http.StatusForbidden) return } allowedMethod := r.URL.Query().Get("method") if allowedMethod == "" { allowedMethod = http.MethodGet } if allowedMethod != r.Method { w.WriteHeader(http.StatusForbidden) return } contentType := r.URL.Query().Get("contentType") if r.Header.Get("Content-Type") != contentType { w.WriteHeader(http.StatusForbidden) return } bucket, err := OpenBucket(h.dir, &Options{}) if err != nil { w.WriteHeader(http.StatusInternalServerError) return } defer bucket.Close() switch r.Method { case http.MethodGet: reader, err := bucket.NewReader(r.Context(), objKey, nil) if err != nil { w.WriteHeader(http.StatusNotFound) return } defer reader.Close() io.Copy(w, reader) case http.MethodPut: writer, err := bucket.NewWriter(r.Context(), objKey, &blob.WriterOptions{ ContentType: contentType, }) if err != nil { w.WriteHeader(http.StatusInternalServerError) return } io.Copy(writer, r.Body) if err := writer.Close(); err != nil { w.WriteHeader(http.StatusInternalServerError) return } case http.MethodDelete: if err := bucket.Delete(r.Context(), objKey); err != nil { w.WriteHeader(http.StatusNotFound) return } default: w.WriteHeader(http.StatusForbidden) } } func (h *harness) HTTPClient() *http.Client { return &http.Client{} } func (h *harness) MakeDriver(ctx context.Context) (driver.Bucket, error) { opts := &Options{ URLSigner: h.urlSigner, Metadata: h.metadataHow, NoTempDir: h.noTempDir, } drv, err := openBucket(h.dir, opts) if err != nil { return nil, err } if h.prefix == "" { return drv, nil } return driver.NewPrefixedBucket(drv, h.prefix), nil } func (h *harness) MakeDriverForNonexistentBucket(ctx context.Context) (driver.Bucket, error) { // Does not make sense for this driver, as it verifies // that the directory exists in OpenBucket. return nil, nil } func (h *harness) Close() { h.closer() } func TestConformance(t *testing.T) { newHarnessNoPrefix := func(ctx context.Context, t *testing.T) (drivertest.Harness, error) { t.Helper() return newHarness(ctx, t, "", MetadataInSidecar, false) } drivertest.RunConformanceTests(t, newHarnessNoPrefix, []drivertest.AsTest{verifyAs{}}) } func TestConformanceNoTempDir(t *testing.T) { newHarnessNoTmpDir := func(ctx context.Context, t *testing.T) (drivertest.Harness, error) { t.Helper() return newHarness(ctx, t, "", MetadataInSidecar, true) } drivertest.RunConformanceTests(t, newHarnessNoTmpDir, []drivertest.AsTest{verifyAs{}}) } func TestConformanceWithPrefix(t *testing.T) { const prefix = "some/prefix/dir/" newHarnessWithPrefix := func(ctx context.Context, t *testing.T) (drivertest.Harness, error) { t.Helper() return newHarness(ctx, t, prefix, MetadataInSidecar, false) } drivertest.RunConformanceTests(t, newHarnessWithPrefix, []drivertest.AsTest{verifyAs{prefix: prefix}}) } func TestConformanceSkipMetadata(t *testing.T) { newHarnessSkipMetadata := func(ctx context.Context, t *testing.T) (drivertest.Harness, error) { t.Helper() return newHarness(ctx, t, "", MetadataDontWrite, false) } drivertest.RunConformanceTests(t, newHarnessSkipMetadata, []drivertest.AsTest{verifyAs{}}) } func BenchmarkFileblob(b *testing.B) { dir := filepath.Join(os.TempDir(), "go-cloud-fileblob") if err := os.MkdirAll(dir, os.ModePerm); err != nil { b.Fatal(err) } bkt, err := OpenBucket(dir, nil) if err != nil { b.Fatal(err) } drivertest.RunBenchmarks(b, bkt) } // File-specific unit tests. func TestNewBucket(t *testing.T) { t.Run("BucketDirMissing", func(t *testing.T) { dir := t.TempDir() _, gotErr := OpenBucket(filepath.Join(dir, "notfound"), nil) if gotErr == nil { t.Errorf("got nil want error") } }) t.Run("BucketDirMissingWithCreateDir", func(t *testing.T) { dir := t.TempDir() b, gotErr := OpenBucket(filepath.Join(dir, "notfound"), &Options{CreateDir: true}) if gotErr != nil { t.Errorf("got error %v", gotErr) } defer b.Close() // Make sure the subdir has gotten permissions to be used. gotErr = b.WriteAll(context.Background(), "key", []byte("delme"), nil) if gotErr != nil { t.Errorf("got error writing to bucket from CreateDir %v", gotErr) } }) t.Run("BucketIsFile", func(t *testing.T) { dir := t.TempDir() f, err := os.CreateTemp(dir, "fileblob") if err != nil { t.Fatal(err) } _, gotErr := OpenBucket(f.Name(), nil) if gotErr == nil { t.Errorf("got nil want error") } }) } func TestSignedURLReturnsUnimplementedWithNoURLSigner(t *testing.T) { dir := t.TempDir() b, err := OpenBucket(dir, nil) if err != nil { t.Fatal(err) } defer b.Close() _, gotErr := b.SignedURL(context.Background(), "key", nil) if gcerrors.Code(gotErr) != gcerrors.Unimplemented { t.Errorf("want Unimplemented error, got %v", gotErr) } } type verifyAs struct { prefix string } func (verifyAs) Name() string { return "verify As types for fileblob" } func (verifyAs) BucketCheck(b *blob.Bucket) error { var fi os.FileInfo if !b.As(&fi) { return errors.New("Bucket.As failed") } return nil } func (verifyAs) BeforeRead(as func(any) bool) error { var f *os.File if !as(&f) { return errors.New("BeforeRead.As failed") } return nil } func (verifyAs) BeforeWrite(as func(any) bool) error { var f *os.File if !as(&f) { return errors.New("BeforeWrite.As failed") } return nil } func (verifyAs) BeforeCopy(as func(any) bool) error { var f *os.File if !as(&f) { return errors.New("BeforeCopy.As failed") } return nil } func (verifyAs) BeforeList(as func(any) bool) error { return nil } func (verifyAs) BeforeSign(as func(any) bool) error { return nil } func (verifyAs) AttributesCheck(attrs *blob.Attributes) error { var fi os.FileInfo if !attrs.As(&fi) { return errors.New("Attributes.As failed") } return nil } func (verifyAs) ReaderCheck(r *blob.Reader) error { var ior io.Reader if !r.As(&ior) { return errors.New("Reader.As failed") } return nil } func (verifyAs) ListObjectCheck(o *blob.ListObject) error { var fi os.FileInfo if !o.As(&fi) { return errors.New("ListObject.As failed") } return nil } func (v verifyAs) ErrorCheck(b *blob.Bucket, err error) error { var perr *os.PathError if !b.ErrorAs(err, &perr) { return errors.New("want ErrorAs to succeed for PathError") } wantSuffix := filepath.Join("go-cloud-fileblob", v.prefix, "key-does-not-exist") if got := perr.Path; !strings.HasSuffix(got, wantSuffix) { return fmt.Errorf("got path %q, want suffix %q", got, wantSuffix) } return nil } func TestOpenBucketFromURL(t *testing.T) { const subdir = "mysubdir" dir := filepath.Join(os.TempDir(), "fileblob") if err := os.MkdirAll(dir, os.ModePerm); err != nil { t.Fatal(err) } if err := os.MkdirAll(filepath.Join(dir, subdir), os.ModePerm); err != nil { t.Fatal(err) } if err := os.WriteFile(filepath.Join(dir, "myfile.txt"), []byte("hello world"), 0o666); err != nil { t.Fatal(err) } // To avoid making another temp dir, use the bucket directory to hold the secret key file. secretKeyPath := filepath.Join(dir, "secret.key") if err := os.WriteFile(secretKeyPath, []byte("secret key"), 0o666); err != nil { t.Fatal(err) } if err := os.WriteFile(filepath.Join(dir, subdir, "myfileinsubdir.txt"), []byte("hello world in subdir"), 0o666); err != nil { t.Fatal(err) } // Convert dir to a URL path, adding a leading "/" if needed on Windows. dirpath := filepath.ToSlash(dir) if os.PathSeparator != '/' && !strings.HasPrefix(dirpath, "/") { dirpath = "/" + dirpath } tests := []struct { URL string Key string WantErr bool WantReadErr bool Want string }{ // Bucket doesn't exist -> error at construction time. {"file:///bucket-not-found", "", true, false, ""}, // File doesn't exist -> error at read time. {"file://" + dirpath, "filenotfound.txt", false, true, ""}, // Relative path using host="."; bucket is created but error at read time. {"file://./../..", "filenotfound.txt", false, true, ""}, // OK. {"file://" + dirpath, "myfile.txt", false, false, "hello world"}, // OK, with no_tmp_dir. {"file://" + dirpath + "?no_tmp_dir", "myfile.txt", false, false, "hello world"}, // OK, host is ignored. {"file://localhost" + dirpath, "myfile.txt", false, false, "hello world"}, // OK, with prefix. {"file://" + dirpath + "?prefix=" + subdir + "/", "myfileinsubdir.txt", false, false, "hello world in subdir"}, // Subdir does not exist. {"file://" + dirpath + "subdir", "", true, false, ""}, // Subdir does not exist, but create_dir creates it. Error is at file read time. {"file://" + dirpath + "subdir2?create_dir=true", "filenotfound.txt", false, true, ""}, // Invalid dir_file_mode. {"file://" + dirpath + "subdir?dir_file_mode=x", "myfile.txt", true, false, ""}, // Another invalid dir_file_mode. {"file://" + dirpath + "subdir?dir_file_mode=-1", "myfile.txt", true, false, ""}, // Valid dir_file_mode. {"file://" + dirpath + "subdir3?dir_file_mode=666&create_dir=true", "filenotfound.txt", false, true, ""}, // Invalid query parameter. {"file://" + dirpath + "?param=value", "myfile.txt", true, false, ""}, // Unrecognized value for parameter "metadata". {"file://" + dirpath + "?metadata=nosuchstrategy", "myfile.txt", true, false, ""}, // OK, with params. { fmt.Sprintf("file://%s?base_url=/show&secret_key_path=%s", dirpath, secretKeyPath), "myfile.txt", false, false, "hello world", }, // Bad secret key filename. { fmt.Sprintf("file://%s?base_url=/show&secret_key_path=%s", dirpath, "bad"), "myfile.txt", true, false, "", }, // Missing base_url. { fmt.Sprintf("file://%s?secret_key_path=%s", dirpath, secretKeyPath), "myfile.txt", true, false, "", }, // Missing secret_key_path. {"file://" + dirpath + "?base_url=/show", "myfile.txt", true, false, ""}, } ctx := context.Background() for i, test := range tests { b, err := blob.OpenBucket(ctx, test.URL) if b != nil { defer b.Close() } if (err != nil) != test.WantErr { t.Errorf("#%d: %s: got error %v, want error %v", i, test.URL, err, test.WantErr) } if err != nil { continue } got, err := b.ReadAll(ctx, test.Key) if (err != nil) != test.WantReadErr { t.Errorf("%s: got read error %v, want error %v", test.URL, err, test.WantReadErr) } if err != nil { continue } if string(got) != test.Want { t.Errorf("%s: got %q want %q", test.URL, got, test.Want) } } } func TestEscapeBucketRoot(t *testing.T) { ctx := context.Background() tdir := t.TempDir() dir := filepath.Join(tdir, "go-cloud-fileblob") if err := os.MkdirAll(dir, os.ModePerm); err != nil { t.Fatal(err) } b, err := OpenBucket(dir, nil) if err != nil { t.Fatal(err) } defer b.Close() it := b.List(&blob.ListOptions{ Prefix: "../", }) _, err = it.Next(ctx) if err == nil || err == io.EOF || !strings.Contains(err.Error(), "escapes bucket root") { t.Fatalf("Got no error or unexpected error when trying to escape bucket root via List (got %v)", err) } err = b.Delete(ctx, "..") if err == nil || !strings.Contains(err.Error(), "escapes bucket root") { t.Fatalf("Got no error or unexpected error when trying to escape bucket root via Delete (got %v)", err) } } func TestListAtRoot(t *testing.T) { if runtime.GOOS == "windows" { t.Skip("/ as root is a unix concept") } ctx := context.Background() b, err := OpenBucket("/", nil) if err != nil { t.Fatalf("Got error creating bucket; %#v", err) } defer b.Close() dir := t.TempDir() f, err := os.Create(filepath.Join(dir, "file.txt")) if err != nil { t.Fatalf("Got error creating file: %#v", err) } defer f.Close() it := b.List(&blob.ListOptions{ Prefix: dir[1:], }) obj, err := it.Next(ctx) if err != nil { t.Fatalf("Got error reading next item from list: %#v", err) } if obj.Key != filepath.Join(dir, "file.txt")[1:] { t.Fatalf("Got unexpected filename in list: %q", obj.Key) } _, err = it.Next(ctx) if err != io.EOF { t.Fatalf("Expecting an EOF on next item in list, got: %#v", err) } } func TestSkipMetadata(t *testing.T) { dir := t.TempDir() dirpath := filepath.ToSlash(dir) if os.PathSeparator != '/' && !strings.HasPrefix(dirpath, "/") { dirpath = "/" + dirpath } tests := []struct { URL string wantSidecar bool }{ {"file://" + dirpath + "?metadata=skip", false}, {"file://" + dirpath, true}, // Implicitly sets the default strategy… {"file://" + dirpath + "?metadata=", true}, // … and explicitly. } ctx := t.Context() for _, test := range tests { b, err := blob.OpenBucket(ctx, test.URL) if b != nil { defer b.Close() } if err != nil { t.Fatal(err) } err = b.WriteAll(ctx, "key", []byte("hello world"), &blob.WriterOptions{ ContentType: "text/plain", }) if err != nil { t.Fatal(err) } _, err = os.Stat(filepath.Join(dir, "key"+attrsExt)) if gotSidecar := !errors.Is(err, os.ErrNotExist); test.wantSidecar != gotSidecar { t.Errorf("Metadata sidecar file (extension %s) exists: %v, did we want it: %v", attrsExt, gotSidecar, test.wantSidecar) } b.Delete(ctx, "key") } } ================================================ FILE: blob/gcsblob/example_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcsblob_test import ( "context" "log" "gocloud.dev/blob" "gocloud.dev/blob/gcsblob" "gocloud.dev/gcp" ) func ExampleOpenBucket() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // Your GCP credentials. // See https://cloud.google.com/docs/authentication/production // for more info on alternatives. creds, err := gcp.DefaultCredentials(ctx) if err != nil { log.Fatal(err) } // Create an HTTP client. // This example uses the default HTTP transport and the credentials // created above. client, err := gcp.NewHTTPClient( gcp.DefaultTransport(), gcp.CredentialsTokenSource(creds)) if err != nil { log.Fatal(err) } // Create a *blob.Bucket. bucket, err := gcsblob.OpenBucket(ctx, client, "my-bucket", nil) if err != nil { log.Fatal(err) } defer bucket.Close() } func Example_openBucketFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/blob/gcsblob" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // blob.OpenBucket creates a *blob.Bucket from a URL. // This URL will open the bucket "my-bucket" using default credentials. bucket, err := blob.OpenBucket(ctx, "gs://my-bucket") if err != nil { log.Fatal(err) } defer bucket.Close() } ================================================ FILE: blob/gcsblob/gcsblob.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package gcsblob provides a blob implementation that uses GCS. Use OpenBucket // to construct a *blob.Bucket. // // # URLs // // For blob.OpenBucket, gcsblob registers for the scheme "gs". // The default URL opener will set up a connection using default credentials // from the environment, as described in // https://cloud.google.com/docs/authentication/production. // You may force the use of an unauthenticated client by setting // GoogleAccessID to "-" (via Options or via the URL parameter "access_id"). // Some environments, such as GCE, come without a private key. In such cases // the IAM Credentials API will be configured for use in Options.MakeSignBytes, // which will introduce latency to any and all calls to bucket.SignedURL // that you can avoid by installing a service account credentials file or // obtaining and configuring a private key: // https://cloud.google.com/iam/docs/creating-managing-service-account-keys // // To customize the URL opener, or for more details on the URL format, // see URLOpener. // See https://gocloud.dev/concepts/urls/ for background information. // // # Escaping // // Go CDK supports all UTF-8 strings; to make this work with services lacking // full UTF-8 support, strings must be escaped (during writes) and unescaped // (during reads). The following escapes are performed for gcsblob: // - Blob keys: ASCII characters 10 and 13 are escaped to "__0x__". // Additionally, the "/" in "../" is escaped in the same way. // // # As // // gcsblob exposes the following types for As: // - Bucket: *storage.Client // - Error: *googleapi.Error // - ListObject: storage.ObjectAttrs // - ListOptions.BeforeList: *storage.Query // - Reader: *storage.Reader // - ReaderOptions.BeforeRead: **storage.ObjectHandle, *storage.Reader (if accessing both, must be in that order) // - Attributes: storage.ObjectAttrs // - CopyOptions.BeforeCopy: *CopyObjectHandles, *storage.Copier (if accessing both, must be in that order) // - WriterOptions.BeforeWrite: **storage.ObjectHandle, *storage.Writer (if accessing both, must be in that order) // - SignedURLOptions.BeforeSign: *storage.SignedURLOptions package gcsblob // import "gocloud.dev/blob/gcsblob" import ( "context" "encoding/json" "errors" "fmt" "io" "net/http" "net/url" "os" "sort" "strconv" "strings" "sync" "time" "cloud.google.com/go/compute/metadata" "cloud.google.com/go/storage" "github.com/google/wire" "golang.org/x/oauth2/google" "google.golang.org/api/googleapi" "google.golang.org/api/iterator" "google.golang.org/api/option" "gocloud.dev/blob" "gocloud.dev/blob/driver" "gocloud.dev/gcerrors" "gocloud.dev/gcp" "gocloud.dev/internal/escape" "gocloud.dev/internal/gcerr" "gocloud.dev/internal/useragent" ) const defaultPageSize = 1000 func init() { blob.DefaultURLMux().RegisterBucket(Scheme, new(lazyCredsOpener)) } // Set holds Wire providers for this package. var Set = wire.NewSet( wire.Struct(new(URLOpener), "Client"), ) // readDefaultCredentials gets the field values from the supplied JSON data. // For its possible formats please see // https://cloud.google.com/iam/docs/creating-managing-service-account-keys#iam-service-account-keys-create-go // // Use "golang.org/x/oauth2/google".DefaultCredentials.JSON to get // the contents of the preferred credential file. // // Returns null-values for fields that have not been obtained. func readDefaultCredentials(credFileAsJSON []byte) (AccessID string, PrivateKey []byte) { // For example, a credentials file as generated for service accounts through the web console. var contentVariantA struct { ClientEmail string `json:"client_email"` PrivateKey string `json:"private_key"` } if err := json.Unmarshal(credFileAsJSON, &contentVariantA); err == nil { AccessID = contentVariantA.ClientEmail PrivateKey = []byte(contentVariantA.PrivateKey) } if AccessID != "" { return } // If obtained through the REST API. var contentVariantB struct { Name string `json:"name"` PrivateKeyData string `json:"privateKeyData"` } if err := json.Unmarshal(credFileAsJSON, &contentVariantB); err == nil { nextFieldIsAccessID := false for s := range strings.SplitSeq(contentVariantB.Name, "/") { if nextFieldIsAccessID { AccessID = s break } nextFieldIsAccessID = s == "serviceAccounts" } PrivateKey = []byte(contentVariantB.PrivateKeyData) } return } // lazyCredsOpener obtains Application Default Credentials on the first call // to OpenBucketURL. type lazyCredsOpener struct { init sync.Once opener *URLOpener err error } func (o *lazyCredsOpener) OpenBucketURL(ctx context.Context, u *url.URL) (*blob.Bucket, error) { o.init.Do(func() { var opts Options var creds *google.Credentials if os.Getenv("STORAGE_EMULATOR_HOST") != "" { creds, _ = google.CredentialsFromJSON(ctx, []byte(`{"type": "service_account", "project_id": "my-project-id"}`)) } else { var err error // Check if universe_domain is specified in the URL query parameters universeDomain := u.Query().Get("universe_domain") if universeDomain != "" { creds, err = gcp.DefaultCredentialsWithParams(ctx, google.CredentialsParams{ UniverseDomain: universeDomain, }) } else { creds, err = gcp.DefaultCredentials(ctx) } if err != nil { fmt.Printf("Warning: unable to load GCP Default Credentials: %v", err) // Use empty credentials, in case the user isn't going to actually use // them; e.g., getting signed URLs with GoogleAccessID=-. creds, _ = google.CredentialsFromJSON(ctx, []byte(`{"type": "service_account"}`)) } // Populate default values from credentials files, where available. opts.GoogleAccessID, opts.PrivateKey = readDefaultCredentials(creds.JSON) ud, err := creds.GetUniverseDomain() if err != nil { fmt.Printf("Warning: unable to load GCP Universe Domain: %v", err) } else if ud != "" { opts.ClientOptions = append(opts.ClientOptions, option.WithUniverseDomain(ud)) } // ... else, on GCE, at least get the instance's main service account. if opts.GoogleAccessID == "" && metadata.OnGCE() { mc := metadata.NewClient(nil) opts.GoogleAccessID, _ = mc.Email("") } } // Provide a default factory for SignBytes for environments without a private key. if len(opts.PrivateKey) <= 0 && opts.GoogleAccessID != "" { iam := new(credentialsClient) // We cannot hold onto the first context: it might've been cancelled already. ctx := context.Background() opts.MakeSignBytes = iam.CreateMakeSignBytesWith(ctx, opts.GoogleAccessID) } client, err := gcp.NewHTTPClient(gcp.DefaultTransport(), creds.TokenSource) if err != nil { o.err = err return } o.opener = &URLOpener{Client: client, Options: opts} }) if o.err != nil { return nil, fmt.Errorf("open bucket %v: %v", u, o.err) } return o.opener.OpenBucketURL(ctx, u) } // Scheme is the URL scheme gcsblob registers its URLOpener under on // blob.DefaultMux. const Scheme = "gs" // URLOpener opens GCS URLs like "gs://mybucket". // // The URL host is used as the bucket name. // // The following query parameters are supported: // // - anonymous: A value of "true" forces the use of an unauthenticated client. // - access_id: Sets Options.GoogleAccessID; only used in SignedURL, except that // a value of "-" forces the use of an unauthenticated client. // - private_key_path: Path to read for Options.PrivateKey; only used in SignedURL. // - universe_domain: Sets the universe domain for the client. type URLOpener struct { // Client must be set to a non-nil HTTP client authenticated with // Cloud Storage scope or equivalent (unless anonymous=true). Client *gcp.HTTPClient // Options specifies the default options to pass to OpenBucket. Options Options } // OpenBucketURL opens the GCS bucket with the same name as the URL's host. func (o *URLOpener) OpenBucketURL(ctx context.Context, u *url.URL) (*blob.Bucket, error) { opts, client, err := o.forParams(ctx, u.Query()) if err != nil { return nil, fmt.Errorf("open bucket %v: %v", u, err) } return OpenBucket(ctx, client, u.Host, opts) } func (o *URLOpener) forParams(ctx context.Context, q url.Values) (*Options, *gcp.HTTPClient, error) { for k := range q { if k != "access_id" && k != "private_key_path" && k != "anonymous" && k != "universe_domain" { return nil, nil, fmt.Errorf("invalid query parameter %q", k) } } opts := new(Options) *opts = o.Options client := o.Client if anon := q.Get("anonymous"); anon != "" { isAnon, err := strconv.ParseBool(anon) if err != nil { return nil, nil, fmt.Errorf("invalid value %q for query parameter \"anonymous\": %w", anon, err) } if isAnon { opts.clear() client = gcp.NewAnonymousHTTPClient(gcp.DefaultTransport()) } } if accessID := q.Get("access_id"); accessID != "" && accessID != opts.GoogleAccessID { opts.clear() if accessID == "-" { client = gcp.NewAnonymousHTTPClient(gcp.DefaultTransport()) } else { opts.GoogleAccessID = accessID } } if keyPath := q.Get("private_key_path"); keyPath != "" { pk, err := os.ReadFile(keyPath) if err != nil { return nil, nil, err } opts.PrivateKey = pk } else if _, exists := q["private_key_path"]; exists { // A possible default value has been cleared by setting this to an empty value: // The private key might have expired, or falling back to SignBytes/MakeSignBytes // is intentional such as for tests or involving a key stored in a HSM/TPM. opts.PrivateKey = nil } return opts, client, nil } // Options sets options for constructing a *blob.Bucket backed by GCS. type Options struct { // GoogleAccessID represents the authorizer for SignedURL. // If set to "-", an unauthenticated client will be used. // Required to use SignedURL. // See https://godoc.org/cloud.google.com/go/storage#SignedURLOptions. GoogleAccessID string // PrivateKey is the Google service account private key. // Exactly one of PrivateKey or SignBytes must be non-nil to use SignedURL. // See https://godoc.org/cloud.google.com/go/storage#SignedURLOptions. // Deprecated: Use MakeSignBytes instead. PrivateKey []byte // SignBytes is a function for implementing custom signing. // Exactly one of PrivateKey, SignBytes, or MakeSignBytes must be non-nil to use SignedURL. // See https://godoc.org/cloud.google.com/go/storage#SignedURLOptions. // Deprecated: Use MakeSignBytes instead. SignBytes func([]byte) ([]byte, error) // MakeSignBytes is a factory for functions that are being used in place of an empty SignBytes. // If your implementation of 'SignBytes' needs a request context, set this instead. MakeSignBytes func(requestCtx context.Context) SignBytesFunc // Client provides a *storage.Client to use, instead of constructing one based on // the HTTPClient. When set, you must pass nil as the gcp.HTTPClient to OpenBucket. // // For example, this can be used to create a Bucket backed by a gRPC client. Client *storage.Client // ClientOptions are passed when constructing the storage.Client. // Ignored if Client is set. ClientOptions []option.ClientOption } // clear clears all the fields of o. func (o *Options) clear() { o.GoogleAccessID = "" o.PrivateKey = nil o.SignBytes = nil o.MakeSignBytes = nil } // SignBytesFunc is shorthand for the signature of Options.SignBytes. type SignBytesFunc func([]byte) ([]byte, error) // openBucket returns a GCS Bucket that communicates using the given HTTP client. func openBucket(ctx context.Context, client *gcp.HTTPClient, bucketName string, opts *Options) (*bucket, error) { if opts == nil { opts = &Options{} } if bucketName == "" { return nil, errors.New("gcsblob.OpenBucket: bucketName is required") } if opts.Client != nil { if client != nil { return nil, errors.New("gcsblob.OpenBucket: client must be nil when providing Options.Client") } return &bucket{name: bucketName, client: opts.Client, opts: opts}, nil } if client == nil { return nil, errors.New("gcsblob.OpenBucket: client is required") } // We wrap the provided http.Client to add a Go CDK User-Agent. clientOpts := []option.ClientOption{option.WithHTTPClient(useragent.HTTPClient(&client.Client, "blob"))} if host := os.Getenv("STORAGE_EMULATOR_HOST"); host != "" { clientOpts = []option.ClientOption{ option.WithoutAuthentication(), option.WithEndpoint("http://" + host + "/storage/v1/"), option.WithHTTPClient(http.DefaultClient), } } clientOpts = append(clientOpts, opts.ClientOptions...) c, err := storage.NewClient(ctx, clientOpts...) if err != nil { return nil, err } return &bucket{name: bucketName, client: c, opts: opts}, nil } // OpenBucket returns a *blob.Bucket backed by an existing GCS bucket. See the // package documentation for an example. func OpenBucket(ctx context.Context, client *gcp.HTTPClient, bucketName string, opts *Options) (*blob.Bucket, error) { drv, err := openBucket(ctx, client, bucketName, opts) if err != nil { return nil, err } return blob.NewBucket(drv), nil } // bucket represents a GCS bucket, which handles read, write and delete operations // on objects within it. type bucket struct { name string client *storage.Client opts *Options } var emptyBody = io.NopCloser(strings.NewReader("")) // reader reads a GCS object. It implements driver.Reader. type reader struct { body io.ReadCloser attrs driver.ReaderAttributes raw *storage.Reader } func (r *reader) Read(p []byte) (int, error) { return r.body.Read(p) } // Close closes the reader itself. It must be called when done reading. func (r *reader) Close() error { return r.body.Close() } func (r *reader) Attributes() *driver.ReaderAttributes { return &r.attrs } func (r *reader) As(i any) bool { p, ok := i.(**storage.Reader) if !ok { return false } *p = r.raw return true } func (b *bucket) ErrorCode(err error) gcerrors.ErrorCode { if errors.Is(err, storage.ErrObjectNotExist) || errors.Is(err, storage.ErrBucketNotExist) { return gcerrors.NotFound } if gerr, ok := err.(*googleapi.Error); ok { switch gerr.Code { case http.StatusForbidden: // 'Permission 'storage.objects.list' denied on resource (or it may not exist)' // So we have to pick one. return gcerrors.NotFound case http.StatusNotFound: return gcerrors.NotFound case http.StatusPreconditionFailed: return gcerrors.FailedPrecondition case http.StatusTooManyRequests: return gcerrors.ResourceExhausted } } return gcerrors.Unknown } func (b *bucket) Close() error { return nil } // ListPaged implements driver.ListPaged. func (b *bucket) ListPaged(ctx context.Context, opts *driver.ListOptions) (*driver.ListPage, error) { bkt := b.client.Bucket(b.name) query := &storage.Query{ Prefix: escapeKey(opts.Prefix), Delimiter: escapeKey(opts.Delimiter), } if opts.BeforeList != nil { asFunc := func(i any) bool { p, ok := i.(**storage.Query) if !ok { return false } *p = query return true } if err := opts.BeforeList(asFunc); err != nil { return nil, err } } pageSize := opts.PageSize if pageSize == 0 { pageSize = defaultPageSize } iter := bkt.Objects(ctx, query) pager := iterator.NewPager(iter, pageSize, string(opts.PageToken)) var objects []*storage.ObjectAttrs nextPageToken, err := pager.NextPage(&objects) if err != nil { return nil, err } page := driver.ListPage{NextPageToken: []byte(nextPageToken)} if len(objects) > 0 { page.Objects = make([]*driver.ListObject, len(objects)) for i, obj := range objects { toCopy := obj asFunc := func(val any) bool { p, ok := val.(*storage.ObjectAttrs) if !ok { return false } *p = *toCopy return true } if obj.Prefix == "" { // Regular blob. page.Objects[i] = &driver.ListObject{ Key: unescapeKey(obj.Name), ModTime: obj.Updated, Size: obj.Size, MD5: obj.MD5, AsFunc: asFunc, } } else { // "Directory". page.Objects[i] = &driver.ListObject{ Key: unescapeKey(obj.Prefix), IsDir: true, AsFunc: asFunc, } } } // GCS always returns "directories" at the end; sort them. sort.Slice(page.Objects, func(i, j int) bool { return page.Objects[i].Key < page.Objects[j].Key }) } return &page, nil } // As implements driver.As. func (b *bucket) As(i any) bool { p, ok := i.(**storage.Client) if !ok { return false } *p = b.client return true } // As implements driver.ErrorAs. func (b *bucket) ErrorAs(err error, i any) bool { switch v := err.(type) { case *googleapi.Error: if p, ok := i.(**googleapi.Error); ok { *p = v return true } } return false } // Attributes implements driver.Attributes. func (b *bucket) Attributes(ctx context.Context, key string) (*driver.Attributes, error) { key = escapeKey(key) bkt := b.client.Bucket(b.name) obj := bkt.Object(key) attrs, err := obj.Attrs(ctx) if err != nil { return nil, err } // GCS seems to unquote the ETag; restore them. // It should be of the form "xxxx" or W/"xxxx". eTag := attrs.Etag if !strings.HasPrefix(eTag, "W/\"") && !strings.HasPrefix(eTag, "\"") && !strings.HasSuffix(eTag, "\"") { eTag = fmt.Sprintf("%q", eTag) } return &driver.Attributes{ CacheControl: attrs.CacheControl, ContentDisposition: attrs.ContentDisposition, ContentEncoding: attrs.ContentEncoding, ContentLanguage: attrs.ContentLanguage, ContentType: attrs.ContentType, Metadata: attrs.Metadata, CreateTime: attrs.Created, ModTime: attrs.Updated, Size: attrs.Size, MD5: attrs.MD5, ETag: eTag, AsFunc: func(i any) bool { p, ok := i.(*storage.ObjectAttrs) if !ok { return false } *p = *attrs return true }, }, nil } // NewRangeReader implements driver.NewRangeReader. func (b *bucket) NewRangeReader(ctx context.Context, key string, offset, length int64, opts *driver.ReaderOptions) (driver.Reader, error) { key = escapeKey(key) bkt := b.client.Bucket(b.name) obj := bkt.Object(key) // Add an extra level of indirection so that BeforeRead can replace obj // if needed. For example, ObjectHandle.If returns a new ObjectHandle. // Also, make the Reader lazily in case this replacement happens. objp := &obj makeReader := func() (*storage.Reader, error) { return (*objp).NewRangeReader(ctx, offset, length) } var r *storage.Reader var rerr error madeReader := false if opts.BeforeRead != nil { asFunc := func(i any) bool { if p, ok := i.(***storage.ObjectHandle); ok && !madeReader { *p = objp return true } if p, ok := i.(**storage.Reader); ok { if !madeReader { r, rerr = makeReader() madeReader = true if r == nil { return false } } *p = r return true } return false } if err := opts.BeforeRead(asFunc); err != nil { return nil, err } } if !madeReader { r, rerr = makeReader() } if rerr != nil { return nil, rerr } return &reader{ body: r, attrs: driver.ReaderAttributes{ ContentType: r.Attrs.ContentType, ModTime: r.Attrs.LastModified, Size: r.Attrs.Size, }, raw: r, }, nil } // escapeKey does all required escaping for UTF-8 strings to work with GCS. func escapeKey(key string) string { return escape.HexEscape(key, func(r []rune, i int) bool { switch { // GCS doesn't handle these characters (determined via experimentation). case r[i] == 10 || r[i] == 13: return true // For "../", escape the trailing slash. case i > 1 && r[i] == '/' && r[i-1] == '.' && r[i-2] == '.': return true } return false }) } // unescapeKey reverses escapeKey. func unescapeKey(key string) string { return escape.HexUnescape(key) } // NewTypedWriter implements driver.NewTypedWriter. func (b *bucket) NewTypedWriter(ctx context.Context, key, contentType string, opts *driver.WriterOptions) (driver.Writer, error) { key = escapeKey(key) bkt := b.client.Bucket(b.name) obj := bkt.Object(key) if opts.IfNotExist { obj = obj.If(storage.Conditions{DoesNotExist: true}) } // Add an extra level of indirection so that BeforeWrite can replace obj // if needed. For example, ObjectHandle.If returns a new ObjectHandle. // Also, make the Writer lazily in case this replacement happens. objp := &obj makeWriter := func() *storage.Writer { w := (*objp).NewWriter(ctx) w.CacheControl = opts.CacheControl w.ContentDisposition = opts.ContentDisposition w.ContentEncoding = opts.ContentEncoding w.ContentLanguage = opts.ContentLanguage w.ContentType = contentType w.ChunkSize = bufferSize(opts.BufferSize) w.Metadata = opts.Metadata w.MD5 = opts.ContentMD5 w.ForceEmptyContentType = opts.DisableContentTypeDetection return w } var w *storage.Writer if opts.BeforeWrite != nil { asFunc := func(i any) bool { if p, ok := i.(***storage.ObjectHandle); ok && w == nil { *p = objp return true } if p, ok := i.(**storage.Writer); ok { if w == nil { w = makeWriter() } *p = w return true } return false } if err := opts.BeforeWrite(asFunc); err != nil { return nil, err } } if w == nil { w = makeWriter() } return w, nil } // CopyObjectHandles holds the ObjectHandles for the destination and source // of a Copy. It is used by the BeforeCopy As hook. type CopyObjectHandles struct { Dst, Src *storage.ObjectHandle } // Copy implements driver.Copy. func (b *bucket) Copy(ctx context.Context, dstKey, srcKey string, opts *driver.CopyOptions) error { dstKey = escapeKey(dstKey) srcKey = escapeKey(srcKey) bkt := b.client.Bucket(b.name) // Add an extra level of indirection so that BeforeCopy can replace the // dst or src ObjectHandles if needed. // Also, make the Copier lazily in case this replacement happens. handles := CopyObjectHandles{ Dst: bkt.Object(dstKey), Src: bkt.Object(srcKey), } makeCopier := func() *storage.Copier { return handles.Dst.CopierFrom(handles.Src) } var copier *storage.Copier if opts.BeforeCopy != nil { asFunc := func(i any) bool { if p, ok := i.(**CopyObjectHandles); ok && copier == nil { *p = &handles return true } if p, ok := i.(**storage.Copier); ok { if copier == nil { copier = makeCopier() } *p = copier return true } return false } if err := opts.BeforeCopy(asFunc); err != nil { return err } } if copier == nil { copier = makeCopier() } _, err := copier.Run(ctx) return err } // Delete implements driver.Delete. func (b *bucket) Delete(ctx context.Context, key string) error { key = escapeKey(key) bkt := b.client.Bucket(b.name) obj := bkt.Object(key) return obj.Delete(ctx) } func (b *bucket) SignedURL(ctx context.Context, key string, dopts *driver.SignedURLOptions) (string, error) { numSigners := 0 if b.opts.PrivateKey != nil { numSigners++ } if b.opts.SignBytes != nil { numSigners++ } if b.opts.MakeSignBytes != nil { numSigners++ } if b.opts.GoogleAccessID == "" || numSigners != 1 { return "", gcerr.New(gcerr.Unimplemented, nil, 1, "gcsblob: to use SignedURL, you must call OpenBucket with a valid Options.GoogleAccessID and exactly one of Options.PrivateKey, Options.SignBytes, or Options.MakeSignBytes") } key = escapeKey(key) opts := &storage.SignedURLOptions{ Expires: time.Now().Add(dopts.Expiry), Method: dopts.Method, ContentType: dopts.ContentType, GoogleAccessID: b.opts.GoogleAccessID, PrivateKey: b.opts.PrivateKey, SignBytes: b.opts.SignBytes, } if b.opts.MakeSignBytes != nil { opts.SignBytes = b.opts.MakeSignBytes(ctx) } if dopts.BeforeSign != nil { asFunc := func(i any) bool { v, ok := i.(**storage.SignedURLOptions) if ok { *v = opts } return ok } if err := dopts.BeforeSign(asFunc); err != nil { return "", err } } return storage.SignedURL(b.name, key, opts) } func bufferSize(size int) int { if size == 0 { return googleapi.DefaultUploadChunkSize } else if size > 0 { return size } return 0 // disable buffering } ================================================ FILE: blob/gcsblob/gcsblob_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcsblob import ( "context" "errors" "flag" "fmt" "io" "net/http" "net/url" "os" "os/user" "path/filepath" "testing" "time" "cloud.google.com/go/storage" "github.com/google/go-cmp/cmp" "gocloud.dev/blob" "gocloud.dev/blob/driver" "gocloud.dev/blob/drivertest" "gocloud.dev/gcerrors" "gocloud.dev/gcp" "gocloud.dev/internal/testing/setup" "google.golang.org/api/googleapi" ) const ( // These constants capture values that were used during the last -record. // // If you want to use --record mode, // 1. Create a bucket in your GCP project: // https://console.cloud.google.com/storage/browser, then "Create Bucket". // 2. Update the bucketName constant to your bucket name. // 3. Create a service account in your GCP project and update the // serviceAccountID constant to it. // 4. Download a private key to a .pem file as described here: // https://godoc.org/cloud.google.com/go/storage#SignedURLOptions // and pass a path to it via the --privatekey flag. // TODO(issue #300): Use Terraform to provision a bucket, and get the bucket // name from the Terraform output instead (saving a copy of it for replay). bucketName = "go-cloud-blob-test-bucket" serviceAccountID = "storage-updater@go-cloud-test-216917.iam.gserviceaccount.com" ) var pathToPrivateKey = flag.String("privatekey", "", "path to .pem file containing private key (required for --record); defaults to ~/Downloads/gcs-private-key.pem") type harness struct { client *gcp.HTTPClient opts *Options rt http.RoundTripper closer func() } func newHarness(ctx context.Context, t *testing.T) (drivertest.Harness, error) { t.Helper() opts := &Options{GoogleAccessID: serviceAccountID} if *setup.Record { if *pathToPrivateKey == "" { usr, _ := user.Current() *pathToPrivateKey = filepath.Join(usr.HomeDir, "Downloads", "gcs-private-key.pem") } // Use a real private key for signing URLs during -record. pk, err := os.ReadFile(*pathToPrivateKey) if err != nil { t.Fatalf("Couldn't find private key at %v: %v", *pathToPrivateKey, err) } opts.PrivateKey = pk } else { // Use a dummy signer in replay mode. opts.SignBytes = func(b []byte) ([]byte, error) { return []byte("signed!"), nil } } client, rt, done := setup.NewGCPClient(ctx, t) return &harness{client: client, opts: opts, rt: rt, closer: done}, nil } func (h *harness) HTTPClient() *http.Client { return &http.Client{Transport: h.rt} } func (h *harness) MakeDriver(ctx context.Context) (driver.Bucket, error) { return openBucket(ctx, h.client, bucketName, h.opts) } func (h *harness) MakeDriverForNonexistentBucket(ctx context.Context) (driver.Bucket, error) { return openBucket(ctx, h.client, "bucket-does-not-exist", h.opts) } func (h *harness) Close() { h.closer() } func TestConformance(t *testing.T) { drivertest.RunConformanceTests(t, newHarness, []drivertest.AsTest{verifyContentLanguage{}}) } func BenchmarkGcsblob(b *testing.B) { ctx := context.Background() creds, err := gcp.DefaultCredentials(ctx) if err != nil { b.Fatal(err) } client, err := gcp.NewHTTPClient(gcp.DefaultTransport(), gcp.CredentialsTokenSource(creds)) if err != nil { b.Fatal(err) } bkt, err := OpenBucket(context.Background(), client, bucketName, nil) if err != nil { b.Fatal(err) } drivertest.RunBenchmarks(b, bkt) } const language = "nl" // verifyContentLanguage uses As to access the underlying GCS types and // read/write the ContentLanguage field. type verifyContentLanguage struct{} func (verifyContentLanguage) Name() string { return "verify ContentLanguage can be written and read through As" } func (verifyContentLanguage) BucketCheck(b *blob.Bucket) error { var client *storage.Client if !b.As(&client) { return errors.New("Bucket.As failed") } return nil } func (verifyContentLanguage) ErrorCheck(b *blob.Bucket, err error) error { // Can't really verify this one because the storage library returns // a sentinel error, storage.ErrObjectNotExist, for "not exists" // instead of the supported As type googleapi.Error. // Call ErrorAs anyway, and expect it to fail. var to *googleapi.Error if b.ErrorAs(err, &to) { return errors.New("expected ErrorAs to fail") } return nil } func (verifyContentLanguage) BeforeRead(as func(any) bool) error { var objp **storage.ObjectHandle if !as(&objp) { return errors.New("BeforeRead.As failed to get ObjectHandle") } var sr *storage.Reader if !as(&sr) { return errors.New("BeforeRead.As failed to get Reader") } return nil } func (verifyContentLanguage) BeforeWrite(as func(any) bool) error { var objp **storage.ObjectHandle if !as(&objp) { return errors.New("Writer.As failed to get ObjectHandle") } var sw *storage.Writer if !as(&sw) { return errors.New("Writer.As failed to get Writer") } sw.ContentLanguage = language return nil } func (verifyContentLanguage) BeforeCopy(as func(any) bool) error { var coh *CopyObjectHandles if !as(&coh) { return errors.New("BeforeCopy.As failed to get CopyObjectHandles") } var copier *storage.Copier if !as(&copier) { return errors.New("BeforeCopy.As failed") } return nil } func (verifyContentLanguage) BeforeList(as func(any) bool) error { var q *storage.Query if !as(&q) { return errors.New("List.As failed") } // Nothing to do. return nil } func (verifyContentLanguage) BeforeSign(as func(any) bool) error { var opts *storage.SignedURLOptions if !as(&opts) { return errors.New("BeforeSign.As failed") } // Nothing to do. return nil } func (verifyContentLanguage) AttributesCheck(attrs *blob.Attributes) error { var oa storage.ObjectAttrs if !attrs.As(&oa) { return errors.New("Attributes.As returned false") } if got := oa.ContentLanguage; got != language { return fmt.Errorf("got %q want %q", got, language) } return nil } func (verifyContentLanguage) ReaderCheck(r *blob.Reader) error { var rr *storage.Reader if !r.As(&rr) { return errors.New("Reader.As returned false") } // GCS doesn't return Content-Language via storage.Reader. return nil } func (verifyContentLanguage) ListObjectCheck(o *blob.ListObject) error { var oa storage.ObjectAttrs if !o.As(&oa) { return errors.New("ListObject.As returned false") } if o.IsDir { return nil } if got := oa.ContentLanguage; got != language { return fmt.Errorf("got %q want %q", got, language) } return nil } // GCS-specific unit tests. func TestBufferSize(t *testing.T) { tests := []struct { size int want int }{ { size: 5 * 1024 * 1024, want: 5 * 1024 * 1024, }, { size: 0, want: googleapi.DefaultUploadChunkSize, }, { size: -1024, want: 0, }, } for i, test := range tests { got := bufferSize(test.size) if got != test.want { t.Errorf("%d) got buffer size %d, want %d", i, got, test.want) } } } func TestOpenBucket(t *testing.T) { tests := []struct { description string bucketName string nilClient bool want string wantErr bool }{ { description: "empty bucket name results in error", wantErr: true, }, { description: "nil client results in error", bucketName: "foo", nilClient: true, wantErr: true, }, { description: "success", bucketName: "foo", want: "foo", }, } ctx := context.Background() for _, test := range tests { t.Run(test.description, func(t *testing.T) { var client *gcp.HTTPClient if !test.nilClient { var done func() client, _, done = setup.NewGCPClient(ctx, t) defer done() } // Create driver impl. drv, err := openBucket(ctx, client, test.bucketName, nil) if (err != nil) != test.wantErr { t.Errorf("got err %v want error %v", err, test.wantErr) } if err == nil && drv != nil && drv.name != test.want { t.Errorf("got %q want %q", drv.name, test.want) } // Create portable type. b, err := OpenBucket(ctx, client, test.bucketName, nil) if b != nil { defer b.Close() } if (err != nil) != test.wantErr { t.Errorf("got err %v want error %v", err, test.wantErr) } }) } } // TestBeforeReadNonExistentKey tests using BeforeRead on a nonexistent key. func TestBeforeReadNonExistentKey(t *testing.T) { ctx := context.Background() h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() drv, err := h.MakeDriver(ctx) if err != nil { t.Fatal(err) } bucket := blob.NewBucket(drv) defer bucket.Close() // Try reading a nonexistent key. _, err = bucket.NewReader(ctx, "nonexistent-key", &blob.ReaderOptions{ BeforeRead: func(asFunc func(any) bool) error { var objp **storage.ObjectHandle if !asFunc(&objp) { return errors.New("Reader.As failed to get ObjectHandle") } var rp *storage.Reader if asFunc(&rp) { return errors.New("Reader.As unexpectedly got storage.Reader") } return nil }, }) if err == nil || gcerrors.Code(err) != gcerrors.NotFound { t.Errorf("got error %v, wanted NotFound for Read", err) } } // TestPreconditions tests setting of ObjectHandle preconditions via As. func TestPreconditions(t *testing.T) { const ( key = "precondition-key" key2 = "precondition-key2" content = "hello world" ) ctx := context.Background() h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() drv, err := h.MakeDriver(ctx) if err != nil { t.Fatal(err) } bucket := blob.NewBucket(drv) defer bucket.Close() // Try writing with a failing precondition. if err := bucket.WriteAll(ctx, key, []byte(content), &blob.WriterOptions{ BeforeWrite: func(asFunc func(any) bool) error { var objp **storage.ObjectHandle if !asFunc(&objp) { return errors.New("Writer.As failed to get ObjectHandle") } // Replace the ObjectHandle with a new one that adds Conditions. *objp = (*objp).If(storage.Conditions{GenerationMatch: -999}) return nil }, }); err == nil || gcerrors.Code(err) != gcerrors.FailedPrecondition { t.Errorf("got error %v, wanted FailedPrecondition for Write", err) } // Repeat with a precondition that will pass. if err := bucket.WriteAll(ctx, key, []byte(content), &blob.WriterOptions{ BeforeWrite: func(asFunc func(any) bool) error { var objp **storage.ObjectHandle if !asFunc(&objp) { return errors.New("Writer.As failed to get ObjectHandle") } // Replace the ObjectHandle with a new one that adds Conditions. *objp = (*objp).If(storage.Conditions{DoesNotExist: true}) return nil }, }); err != nil { t.Errorf("got error %v, wanted nil", err) } defer bucket.Delete(ctx, key) // Try reading with a failing precondition. _, err = bucket.NewReader(ctx, key, &blob.ReaderOptions{ BeforeRead: func(asFunc func(any) bool) error { var objp **storage.ObjectHandle if !asFunc(&objp) { return errors.New("Reader.As failed to get ObjectHandle") } // Replace the ObjectHandle with a new one. *objp = (*objp).Generation(999999) return nil }, }) if err == nil || gcerrors.Code(err) != gcerrors.NotFound { t.Errorf("got error %v, wanted NotFound for Read", err) } attrs, err := bucket.Attributes(ctx, key) if err != nil { t.Fatal(err) } var oa storage.ObjectAttrs if !attrs.As(&oa) { t.Fatal("Attributes.As failed") } generation := oa.Generation // Repeat with a precondition that will pass. reader, err := bucket.NewReader(ctx, key, &blob.ReaderOptions{ BeforeRead: func(asFunc func(any) bool) error { var objp **storage.ObjectHandle if !asFunc(&objp) { return errors.New("Reader.As failed to get ObjectHandle") } // Replace the ObjectHandle with a new one. *objp = (*objp).Generation(generation) return nil }, }) if err != nil { t.Fatal(err) } defer reader.Close() gotBytes, err := io.ReadAll(reader) if err != nil { t.Fatal(err) } if got := string(gotBytes); got != content { t.Errorf("got %q want %q", got, content) } // Try copying with a failing precondition on Dst. err = bucket.Copy(ctx, key2, key, &blob.CopyOptions{ BeforeCopy: func(asFunc func(any) bool) error { var coh *CopyObjectHandles if !asFunc(&coh) { return errors.New("Copy.As failed to get CopyObjectHandles") } // Replace the dst ObjectHandle with a new one. coh.Dst = coh.Dst.If(storage.Conditions{GenerationMatch: -999}) return nil }, }) if err == nil || gcerrors.Code(err) != gcerrors.FailedPrecondition { t.Errorf("got error %v, wanted FailedPrecondition for Copy", err) } // Try copying with a failing precondition on Src. err = bucket.Copy(ctx, key2, key, &blob.CopyOptions{ BeforeCopy: func(asFunc func(any) bool) error { var coh *CopyObjectHandles if !asFunc(&coh) { return errors.New("Copy.As failed to get CopyObjectHandles") } // Replace the src ObjectHandle with a new one. coh.Src = coh.Src.Generation(9999999) return nil }, }) if err == nil || gcerrors.Code(err) != gcerrors.NotFound { t.Errorf("got error %v, wanted NotFound for Copy", err) } // Repeat with preconditions on Dst and Src that will succeed. err = bucket.Copy(ctx, key2, key, &blob.CopyOptions{ BeforeCopy: func(asFunc func(any) bool) error { var coh *CopyObjectHandles if !asFunc(&coh) { return errors.New("Reader.As failed to get CopyObjectHandles") } coh.Dst = coh.Dst.If(storage.Conditions{DoesNotExist: true}) coh.Src = coh.Src.Generation(generation) return nil }, }) if err != nil { t.Error(err) } defer bucket.Delete(ctx, key2) } func TestURLOpenerForParams(t *testing.T) { ctx := context.Background() // Create a file for use as a dummy private key file. privateKey := []byte("some content") pkFile, err := os.CreateTemp("", "my-private-key") if err != nil { t.Fatal(err) } defer os.Remove(pkFile.Name()) if _, err := pkFile.Write(privateKey); err != nil { t.Fatal(err) } if err := pkFile.Close(); err != nil { t.Fatal(err) } tests := []struct { name string currOpts Options query url.Values wantOpts Options wantClient bool wantErr bool }{ { name: "InvalidParam", query: url.Values{ "foo": {"bar"}, }, wantErr: true, }, { name: "AccessID", query: url.Values{ "access_id": {"bar"}, }, wantOpts: Options{GoogleAccessID: "bar"}, }, { name: "AccessID override", currOpts: Options{GoogleAccessID: "foo"}, query: url.Values{ "access_id": {"bar"}, }, wantOpts: Options{GoogleAccessID: "bar"}, }, { name: "AccessID override to - makes new client", currOpts: Options{GoogleAccessID: "foo"}, query: url.Values{ "access_id": {"-"}, }, wantOpts: Options{}, // cleared wantClient: true, }, { name: "AccessID not overridden", currOpts: Options{GoogleAccessID: "bar"}, wantOpts: Options{GoogleAccessID: "bar"}, }, { name: "Invalid value for anonymous", query: url.Values{ "anonymous": {"bad"}, }, wantErr: true, }, { name: "Anonymous", currOpts: Options{GoogleAccessID: "foo"}, query: url.Values{ "anonymous": {"true"}, }, wantOpts: Options{}, // cleared wantClient: true, }, { name: "BadPrivateKeyPath", query: url.Values{ "private_key_path": {"/path/does/not/exist"}, }, wantErr: true, }, { name: "PrivateKeyPath", query: url.Values{ "private_key_path": {pkFile.Name()}, }, wantOpts: Options{PrivateKey: privateKey}, }, { name: "PrivateKey cleared", currOpts: Options{PrivateKey: privateKey}, query: url.Values{ "private_key_path": {""}, }, wantOpts: Options{}, }, { name: "AccessID change clears PrivateKey and MakeSignBytes", currOpts: Options{ GoogleAccessID: "foo", PrivateKey: privateKey, MakeSignBytes: func(context.Context) SignBytesFunc { return func([]byte) ([]byte, error) { return nil, context.DeadlineExceeded } }, }, query: url.Values{ "access_id": {"bar"}, }, wantOpts: Options{GoogleAccessID: "bar"}, }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { o := &URLOpener{Options: test.currOpts} got, gotClient, err := o.forParams(ctx, test.query) if (err != nil) != test.wantErr { t.Errorf("got err %v want error %v", err, test.wantErr) } if err != nil { return } if diff := cmp.Diff(got, &test.wantOpts); diff != "" { t.Errorf("opener.forParams(...) diff (-want +got):\n%s", diff) } if test.wantClient != (gotClient != nil) { t.Errorf("opener.forParams client return value was unexpected, got %v want %v", gotClient != nil, test.wantClient) } }) } } func TestOpenBucketFromURL(t *testing.T) { cleanup := setup.FakeGCPDefaultCredentials(t) defer cleanup() pkFile, err := os.CreateTemp("", "my-private-key") if err != nil { t.Fatal(err) } defer os.Remove(pkFile.Name()) if err := os.WriteFile(pkFile.Name(), []byte("key"), 0o666); err != nil { t.Fatal(err) } tests := []struct { URL string WantErr bool }{ // OK. {"gs://mybucket", false}, // OK, setting access_id. {"gs://mybucket?access_id=foo", false}, // OK, setting private_key_path. {"gs://mybucket?private_key_path=" + pkFile.Name(), false}, // OK, clearing any pre-existing private key. {"gs://mybucket?private_key_path=", false}, // OK, setting universe_domain. {"gs://mybucket?universe_domain=example.com", false}, // OK, universe_domain with empty value. {"gs://mybucket?universe_domain=", false}, // Invalid private_key_path. {"gs://mybucket?private_key_path=invalid-path", true}, // Invalid parameter. {"gs://mybucket?param=value", true}, } ctx := context.Background() for _, test := range tests { b, err := blob.OpenBucket(ctx, test.URL) if b != nil { defer b.Close() } if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } } } func TestReadDefaultCredentials(t *testing.T) { tests := []struct { givenJSON string WantAccessID string WantPrivateKey []byte }{ // Variant A: service account file { `{ "type": "service_account", "project_id": "project-id", "private_key_id": "key-id", "private_key": "-----BEGIN PRIVATE KEY-----\nprivate-key\n-----END PRIVATE KEY-----\n", "client_email": "service-account-email", "client_id": "client-id", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://accounts.google.com/o/oauth2/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/service-account-email" }`, "service-account-email", []byte("-----BEGIN PRIVATE KEY-----\nprivate-key\n-----END PRIVATE KEY-----\n"), }, // Variant A: credentials file absent a private key (stripped) { `{ "google": {}, "client_email": "service-account-email", "client_id": "client-id" }`, "service-account-email", []byte(""), }, // Variant B: obtained through the REST API { `{ "name": "projects/project-id/serviceAccounts/service-account-email/keys/key-id", "privateKeyType": "TYPE_GOOGLE_CREDENTIALS_FILE", "privateKeyData": "private-key", "validAfterTime": "date", "validBeforeTime": "date", "keyAlgorithm": "KEY_ALG_RSA_2048" }`, "service-account-email", []byte("private-key"), }, // An empty input shall not throw an exception {"", "", nil}, } for i, test := range tests { inJSON := []byte(test.givenJSON) if len(test.givenJSON) == 0 { inJSON = nil } gotAccessID, gotPrivateKey := readDefaultCredentials(inJSON) if gotAccessID != test.WantAccessID || string(gotPrivateKey) != string(test.WantPrivateKey) { t.Errorf("Mismatched field values in case %d:\n -- got: %v, %v\n -- want: %v, %v", i, gotAccessID, gotPrivateKey, test.WantAccessID, test.WantPrivateKey, ) } } } func TestRemainingSignedURLSchemes(t *testing.T) { tests := []struct { name string currOpts Options wantSignedURL string // Not the actual URL, which is subject to change, but a mimickry. wantErr bool }{ { name: "no scheme available, error", wantErr: true, }, { name: "too many schemes configured", currOpts: Options{ GoogleAccessID: "foo", PrivateKey: []byte("private-key"), SignBytes: func([]byte) ([]byte, error) { return []byte("signed"), nil }, }, wantErr: true, }, { name: "SignBytes", currOpts: Options{ GoogleAccessID: "foo", SignBytes: func([]byte) ([]byte, error) { return []byte("signed"), nil }, }, wantSignedURL: "https://host/go-cloud-blob-test-bucket/some-key?GoogleAccessId=foo&Signature=c2lnbmVk", }, { name: "MakeSignBytes is being used", currOpts: Options{ GoogleAccessID: "foo", MakeSignBytes: func(context.Context) SignBytesFunc { return func([]byte) ([]byte, error) { return []byte("signed"), nil } }, }, wantSignedURL: "https://host/go-cloud-blob-test-bucket/some-key?GoogleAccessId=foo&Signature=c2lnbmVk", }, } ctx := context.Background() signOpts := &driver.SignedURLOptions{ Expiry: 30 * time.Second, Method: http.MethodGet, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { bucket := bucket{name: bucketName, opts: &test.currOpts} // SignedURL doesn't check whether a key exists. gotURL, gotErr := bucket.SignedURL(ctx, "some-key", signOpts) if (gotErr != nil) != test.wantErr { t.Errorf("Got unexpected error %v", gotErr) } if test.wantSignedURL == "" { return } got, _ := url.Parse(gotURL) want, _ := url.Parse(test.wantSignedURL) gotParams, wantParams := got.Query(), want.Query() for _, param := range []string{"GoogleAccessId", "Signature"} { if gotParams.Get(param) != wantParams.Get(param) { // Print the full URL because the parameter might've not been set at all. t.Errorf("Query parameter in SignedURL differs: %v\n -- got URL: %v\n -- want URL: %v", param, got, want) } } }) } } ================================================ FILE: blob/gcsblob/iam.go ================================================ // Copyright 2020 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // This is an implementation for Options.MakeSignBytes // that serves as example for how to keep a private key in a separate // process, service, or HSM/TPM, yet use it as signer for blob.Bucket. package gcsblob import ( "context" "sync" credentials "cloud.google.com/go/iam/credentials/apiv1" "cloud.google.com/go/iam/credentials/apiv1/credentialspb" gax "github.com/googleapis/gax-go/v2" ) // credentialsClient wraps the IAM Credentials API client for a lazy initialization // and expresses it in the reduced format expected by SignBytes. // See https://cloud.google.com/iam/docs/reference/credentials/rest type credentialsClient struct { init sync.Once err error // client as reduced surface of credentials.IamCredentialsClient // enables us to use a mock in tests. client interface { SignBlob(context.Context, *credentialspb.SignBlobRequest, ...gax.CallOption) (*credentialspb.SignBlobResponse, error) } } // CreateMakeSignBytesWith produces a MakeSignBytes variant from an expanded parameter set. // It essentially adapts a remote call to the IAM Credentials API // to the function signature expected by storage.SignedURLOptions.SignBytes. func (c *credentialsClient) CreateMakeSignBytesWith(lifetimeCtx context.Context, googleAccessID string) func(context.Context) SignBytesFunc { return func(requestCtx context.Context) SignBytesFunc { c.init.Do(func() { if c.client != nil { // Set previously, likely to a mock implementation for tests. return } c.client, c.err = credentials.NewIamCredentialsClient(lifetimeCtx) }) return func(p []byte) ([]byte, error) { if c.err != nil { return nil, c.err } resp, err := c.client.SignBlob( requestCtx, &credentialspb.SignBlobRequest{ Name: googleAccessID, Payload: p, }) if err != nil { return nil, err } return resp.GetSignedBlob(), nil } } } ================================================ FILE: blob/gcsblob/iam_test.go ================================================ // Copyright 2020 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcsblob import ( "context" "errors" "testing" "cloud.google.com/go/iam/credentials/apiv1/credentialspb" gax "github.com/googleapis/gax-go/v2" ) const ( mockKey = "key0000" mockSignature = "signature" ) type mockIAMClient struct { requestErr error } func (m mockIAMClient) SignBlob(context.Context, *credentialspb.SignBlobRequest, ...gax.CallOption) (*credentialspb.SignBlobResponse, error) { if m.requestErr != nil { return nil, m.requestErr } return &credentialspb.SignBlobResponse{KeyId: mockKey, SignedBlob: []byte(mockSignature)}, nil } func TestIAMCredentialsClient(t *testing.T) { tests := []struct { name string connectErr error mockClient interface { SignBlob(context.Context, *credentialspb.SignBlobRequest, ...gax.CallOption) (*credentialspb.SignBlobResponse, error) } // These are for the produced SignBytesFunc input []byte wantOutput []byte requestErr error }{ { "happy path: signing", nil, mockIAMClient{}, []byte("payload"), []byte(mockSignature), nil, }, { "won't connect", errors.New("Missing role: serviceAccountTokenCreator"), mockIAMClient{}, []byte("payload"), nil, nil, }, { "request fails", nil, mockIAMClient{requestErr: context.Canceled}, []byte("payload"), nil, context.Canceled, }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { c := credentialsClient{err: test.connectErr, client: test.mockClient} makeSignBytesFn := c.CreateMakeSignBytesWith(context.TODO(), serviceAccountID) signBytesFn := makeSignBytesFn(nil) // Our mocks don't read any context. haveOutput, haveErr := signBytesFn(test.input) if len(test.wantOutput) > 0 && string(haveOutput) != string(test.wantOutput) { t.Errorf("Unexpected output:\n -- have: %v\n -- want: %v", string(haveOutput), string(test.wantOutput)) return } if test.connectErr == nil && test.requestErr == nil { return } if test.connectErr != nil && haveErr != test.connectErr { t.Error("The connection error, a permanent error, has not been returned but should.") } if test.requestErr != nil && haveErr != test.requestErr { t.Error("The per-request error has not been returned but should.") } }) } } ================================================ FILE: blob/gcsblob/testdata/TestBeforeReadNonExistentKey.replay ================================================ { "Initial": "AQAAAA7hTghqKSvfJgAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "dafa84fc99aee5d2", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/nonexistent-key", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "203" ], "Content-Type": [ "application/xml; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:26 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "X-Guploader-Uploadid": [ "AGQBYWz4tST3iwIC596G22tVvLtk1PwYub5fONsrTAqDDJ-tAg-q7SOqTMgSK7WQWJpuimtF" ] }, "Body": "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+Tm9TdWNoS2V5PC9Db2RlPjxNZXNzYWdlPlRoZSBzcGVjaWZpZWQga2V5IGRvZXMgbm90IGV4aXN0LjwvTWVzc2FnZT48RGV0YWlscz5ObyBzdWNoIG9iamVjdDogZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ub25leGlzdGVudC1rZXk8L0RldGFpbHM+PC9FcnJvcj4=" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestAs/verify_As_returns_false_when_passed_nil.replay ================================================ { "Initial": "AQAAAA7hTghpMUu+lAAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "595db2a5be2b89f2", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=mydir%2Fas-test\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoieVpSbHFnPT0iLCJtZDVIYXNoIjoiWHJZN3UrQWU3dENUeXlLN2oxck53dz09IiwibmFtZSI6Im15ZGlyL2FzLXRlc3QifQo=", "aGVsbG8gd29ybGQ=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "785" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:25 GMT" ], "Etag": [ "CK+e3IWfrJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzP7w32aP3prEecJaqJiruL1z6s7xvzL_VGBMitfGntx2Zl817D35w9IA-w-xC8p62f" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvbXlkaXIvYXMtdGVzdC8xNzczOTMyOTA1OTU5MjE1Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL215ZGlyJTJGYXMtdGVzdCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL215ZGlyJTJGYXMtdGVzdD9nZW5lcmF0aW9uPTE3NzM5MzI5MDU5NTkyMTUmYWx0PW1lZGlhIiwibmFtZSI6Im15ZGlyL2FzLXRlc3QiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzI5MDU5NTkyMTUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiIxMSIsIm1kNUhhc2giOiJYclk3dStBZTd0Q1R5eUs3ajFyTnd3PT0iLCJjcmMzMmMiOiJ5WlJscWc9PSIsImV0YWciOiJDSytlM0lXZnJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjI1Ljk2MVoiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODoyNS45NjFaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjI1Ljk2MVoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNTowODoyNS45NjFaIn0=" } }, { "ID": "194f62e4bc44299f", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/mydir%2Fas-test?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "785" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:26 GMT" ], "Etag": [ "CK+e3IWfrJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwm3ybso1SJSsoDIkRKOPFnytR5Y8zi-E2bFXco8ZZ8EBr_TGR8ketpxd4VvzmeI4pD" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvbXlkaXIvYXMtdGVzdC8xNzczOTMyOTA1OTU5MjE1Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL215ZGlyJTJGYXMtdGVzdCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL215ZGlyJTJGYXMtdGVzdD9nZW5lcmF0aW9uPTE3NzM5MzI5MDU5NTkyMTUmYWx0PW1lZGlhIiwibmFtZSI6Im15ZGlyL2FzLXRlc3QiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzI5MDU5NTkyMTUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiIxMSIsIm1kNUhhc2giOiJYclk3dStBZTd0Q1R5eUs3ajFyTnd3PT0iLCJjcmMzMmMiOiJ5WlJscWc9PSIsImV0YWciOiJDSytlM0lXZnJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjI1Ljk2MVoiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODoyNS45NjFaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjI1Ljk2MVoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNTowODoyNS45NjFaIn0=" } }, { "ID": "65bba91b960f97dc", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/mydir%2Fas-test", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:26 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:08:25 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932905959215" ], "X-Goog-Hash": [ "crc32c=yZRlqg==", "md5=XrY7u+Ae7tCTyyK7j1rNww==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "11" ], "X-Guploader-Uploadid": [ "AGQBYWwgxRmm7WRwplaJSBR5wvCqzPhTioaKDx8b3HDPnpUhPijy-YPY-M8c4uo-WZgCbeTw" ] }, "Body": "aGVsbG8gd29ybGQ=" } }, { "ID": "30fa519ae67bc879", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%2F\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=mydir\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "48" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:26 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxO6H0kG6fabSf7Vf_XSZGs3K6OH1I73wTXKoni1GBVF2w_uQhlrem_Rmp2daj6b4m_" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwicHJlZml4ZXMiOlsibXlkaXIvIl19" } }, { "ID": "a6686db0f68dc9dd", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=mydir%2Fas-test\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "822" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:26 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWze-4B_nxK7uII3_VO28difBHJZECE7ASyYIB-LjxiInMFbYLeH_3sTqy_-wsW4bolJ" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9teWRpci9hcy10ZXN0LzE3NzM5MzI5MDU5NTkyMTUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vbXlkaXIlMkZhcy10ZXN0IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vbXlkaXIlMkZhcy10ZXN0P2dlbmVyYXRpb249MTc3MzkzMjkwNTk1OTIxNSZhbHQ9bWVkaWEiLCJuYW1lIjoibXlkaXIvYXMtdGVzdCIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjkwNTk1OTIxNSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjExIiwibWQ1SGFzaCI6IlhyWTd1K0FlN3RDVHl5SzdqMXJOd3c9PSIsImNyYzMyYyI6InlaUmxxZz09IiwiZXRhZyI6IkNLK2UzSVdmckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MjUuOTYxWiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjI1Ljk2MVoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MjUuOTYxWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjI1Ljk2MVoifV19" } }, { "ID": "96737126763082c9", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/key-does-not-exist", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "206" ], "Content-Type": [ "application/xml; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:26 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "X-Guploader-Uploadid": [ "AGQBYWykYxAzWCAnIz92q2pZ5k5ydMGYYVVZ_5OAffJ3aNrHBWwj6bBXoOWje36UjDvdIuzZ" ] }, "Body": "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+Tm9TdWNoS2V5PC9Db2RlPjxNZXNzYWdlPlRoZSBzcGVjaWZpZWQga2V5IGRvZXMgbm90IGV4aXN0LjwvTWVzc2FnZT48RGV0YWlscz5ObyBzdWNoIG9iamVjdDogZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9rZXktZG9lcy1ub3QtZXhpc3Q8L0RldGFpbHM+PC9FcnJvcj4=" } }, { "ID": "7006f479c0518b18", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/mydir%2Fas-test/rewriteTo/b/go-cloud-blob-test-bucket/o/mydir%2Fas-test-copy?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "908" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:26 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzS9MgFagmemaHiKFguWR84M9aLRQeTd9DUbnPxPVyoZpyilPf5-YIl9JB8nw6C5gfa" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiMTEiLCJvYmplY3RTaXplIjoiMTEiLCJkb25lIjp0cnVlLCJyZXNvdXJjZSI6eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvbXlkaXIvYXMtdGVzdC1jb3B5LzE3NzM5MzI5MDY0NjkwMTciLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vbXlkaXIlMkZhcy10ZXN0LWNvcHkiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9teWRpciUyRmFzLXRlc3QtY29weT9nZW5lcmF0aW9uPTE3NzM5MzI5MDY0NjkwMTcmYWx0PW1lZGlhIiwibmFtZSI6Im15ZGlyL2FzLXRlc3QtY29weSIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjkwNjQ2OTAxNyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjExIiwibWQ1SGFzaCI6IlhyWTd1K0FlN3RDVHl5SzdqMXJOd3c9PSIsImNyYzMyYyI6InlaUmxxZz09IiwiZXRhZyI6IkNKbXQrNFdmckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MjYuNDcyWiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjI2LjQ3MloiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MjYuNDcyWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjI2LjQ3MloifX0=" } }, { "ID": "07714f11fd522a67", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/mydir%2Fas-test-copy?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:26 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyM3pYXx2l9F2Im23LCMR5w9p4cGyhBaPSwwrqvS--0lIQ12efcuYalhB41G5Kmr1qp" ] }, "Body": "" } }, { "ID": "4ee5832579e3b60f", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/mydir%2Fas-test?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:26 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzNOSTdff9rdBBhD9S7qpSqC8Ck9-6O5ayal2DDxjDFIxCwReH7khCJkVW_SsQz4NXO" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestAs/verify_ContentLanguage_can_be_written_and_read_through_As.replay ================================================ { "Initial": "AQAAAA7hTghoOHWaZgAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "bab2271ba8883d82", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=mydir%2Fas-test\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudExhbmd1YWdlIjoibmwiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJjcmMzMmMiOiJ5WlJscWc9PSIsIm1kNUhhc2giOiJYclk3dStBZTd0Q1R5eUs3ajFyTnd3PT0iLCJuYW1lIjoibXlkaXIvYXMtdGVzdCJ9Cg==", "aGVsbG8gd29ybGQ=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "808" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:25 GMT" ], "Etag": [ "CL+mp4WfrJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxHmi2KezZ4zkRLL52MHy09gSnTg8z03YU1HNsp-rjFm2mnVosY1S8dNfouoJFyRynb" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvbXlkaXIvYXMtdGVzdC8xNzczOTMyOTA1MDkxOTAzIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL215ZGlyJTJGYXMtdGVzdCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL215ZGlyJTJGYXMtdGVzdD9nZW5lcmF0aW9uPTE3NzM5MzI5MDUwOTE5MDMmYWx0PW1lZGlhIiwibmFtZSI6Im15ZGlyL2FzLXRlc3QiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzI5MDUwOTE5MDMiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiIxMSIsIm1kNUhhc2giOiJYclk3dStBZTd0Q1R5eUs3ajFyTnd3PT0iLCJjb250ZW50TGFuZ3VhZ2UiOiJubCIsImNyYzMyYyI6InlaUmxxZz09IiwiZXRhZyI6IkNMK21wNFdmckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MjUuMDk1WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjI1LjA5NVoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MjUuMDk1WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjI1LjA5NVoifQ==" } }, { "ID": "bec1474859d33a8f", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/mydir%2Fas-test?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "808" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:25 GMT" ], "Etag": [ "CL+mp4WfrJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyJfukcDXNztgLrwOkmDGeKiMBhEduPVirdqHHYRwrYL09gjwkZout29NOlNLyK-8yk" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvbXlkaXIvYXMtdGVzdC8xNzczOTMyOTA1MDkxOTAzIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL215ZGlyJTJGYXMtdGVzdCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL215ZGlyJTJGYXMtdGVzdD9nZW5lcmF0aW9uPTE3NzM5MzI5MDUwOTE5MDMmYWx0PW1lZGlhIiwibmFtZSI6Im15ZGlyL2FzLXRlc3QiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzI5MDUwOTE5MDMiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiIxMSIsIm1kNUhhc2giOiJYclk3dStBZTd0Q1R5eUs3ajFyTnd3PT0iLCJjb250ZW50TGFuZ3VhZ2UiOiJubCIsImNyYzMyYyI6InlaUmxxZz09IiwiZXRhZyI6IkNMK21wNFdmckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MjUuMDk1WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjI1LjA5NVoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MjUuMDk1WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjI1LjA5NVoifQ==" } }, { "ID": "a69fb3a02811b9fd", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/mydir%2Fas-test", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Language": [ "nl" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:25 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:08:25 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932905091903" ], "X-Goog-Hash": [ "crc32c=yZRlqg==", "md5=XrY7u+Ae7tCTyyK7j1rNww==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "11" ], "X-Guploader-Uploadid": [ "AGQBYWz4cWYu0SUJ5YaMv20tetrhjxegN-shah0xfhkU_3jogLJ6mB_ebCJIUm9w8_rUdpwA" ] }, "Body": "aGVsbG8gd29ybGQ=" } }, { "ID": "16f0252af1f6ddf6", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%2F\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=mydir\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "48" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:25 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxnEhFYlebGCWLST4lHl0TtzGjhhV7aj_9WTB6q9KmV7XOUR8B1RYhnr8v6_BabFBSD" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwicHJlZml4ZXMiOlsibXlkaXIvIl19" } }, { "ID": "7c45e77a35ff4750", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=mydir%2Fas-test\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "845" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:25 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyLStjoW6HRFx0WliLwggFb6x2kPA8JijBd5X5W3N9MiFrFmHDhObg-v_nsTjuNxryN" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9teWRpci9hcy10ZXN0LzE3NzM5MzI5MDUwOTE5MDMiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vbXlkaXIlMkZhcy10ZXN0IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vbXlkaXIlMkZhcy10ZXN0P2dlbmVyYXRpb249MTc3MzkzMjkwNTA5MTkwMyZhbHQ9bWVkaWEiLCJuYW1lIjoibXlkaXIvYXMtdGVzdCIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjkwNTA5MTkwMyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjExIiwibWQ1SGFzaCI6IlhyWTd1K0FlN3RDVHl5SzdqMXJOd3c9PSIsImNvbnRlbnRMYW5ndWFnZSI6Im5sIiwiY3JjMzJjIjoieVpSbHFnPT0iLCJldGFnIjoiQ0wrbXA0V2ZySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNTowODoyNS4wOTVaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MjUuMDk1WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODoyNS4wOTVaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MDg6MjUuMDk1WiJ9XX0=" } }, { "ID": "c7ee2120779536a6", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/key-does-not-exist", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "206" ], "Content-Type": [ "application/xml; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:25 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "X-Guploader-Uploadid": [ "AGQBYWyFCm0Vqd41Al9p72Bfb6Ybw9Vmpqt7emzRcS9k7pCeYL_hO2nofZKOeiW043JbmnsF" ] }, "Body": "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+Tm9TdWNoS2V5PC9Db2RlPjxNZXNzYWdlPlRoZSBzcGVjaWZpZWQga2V5IGRvZXMgbm90IGV4aXN0LjwvTWVzc2FnZT48RGV0YWlscz5ObyBzdWNoIG9iamVjdDogZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9rZXktZG9lcy1ub3QtZXhpc3Q8L0RldGFpbHM+PC9FcnJvcj4=" } }, { "ID": "6bada84855d52852", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/mydir%2Fas-test/rewriteTo/b/go-cloud-blob-test-bucket/o/mydir%2Fas-test-copy?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "931" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:25 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWx3iirnr39EMovcXhJnQlj-uipimY3dKna9H0ILBaBcGbEksQ99B4hImQ8FKuGfU5Xu" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiMTEiLCJvYmplY3RTaXplIjoiMTEiLCJkb25lIjp0cnVlLCJyZXNvdXJjZSI6eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvbXlkaXIvYXMtdGVzdC1jb3B5LzE3NzM5MzI5MDU2MzI1NjciLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vbXlkaXIlMkZhcy10ZXN0LWNvcHkiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9teWRpciUyRmFzLXRlc3QtY29weT9nZW5lcmF0aW9uPTE3NzM5MzI5MDU2MzI1NjcmYWx0PW1lZGlhIiwibmFtZSI6Im15ZGlyL2FzLXRlc3QtY29weSIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjkwNTYzMjU2NyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjExIiwibWQ1SGFzaCI6IlhyWTd1K0FlN3RDVHl5SzdqMXJOd3c9PSIsImNvbnRlbnRMYW5ndWFnZSI6Im5sIiwiY3JjMzJjIjoieVpSbHFnPT0iLCJldGFnIjoiQ0xlbXlJV2ZySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNTowODoyNS42MzVaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MjUuNjM1WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODoyNS42MzVaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MDg6MjUuNjM1WiJ9fQ==" } }, { "ID": "5ba434a732d66860", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/mydir%2Fas-test-copy?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:25 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwGzXjkAjliVQX5-9qWcZC9mkUFBSlqzl40S9LMXF8zBFUFtJf8X1j9P1bXM_K45tyx" ] }, "Body": "" } }, { "ID": "11a8dd5177a89ee6", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/mydir%2Fas-test?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:25 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzG2LvXH8xpb2MtWgLH5NTlhwxAjiopnwcPXyotEICvo1rAWQalrkkBXTPePkBcrv7j" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestAttributes.replay ================================================ { "Initial": "AQAAAA7hTghOFJqIEAAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "3dcc6c2eeb3076db", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=someDir%2Fblob-for-attributes\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY2FjaGVDb250cm9sIjoibm8tY2FjaGUiLCJjb250ZW50RGlzcG9zaXRpb24iOiJpbmxpbmUiLCJjb250ZW50RW5jb2RpbmciOiJpZGVudGl0eSIsImNvbnRlbnRMYW5ndWFnZSI6ImVuIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluIiwiY3JjMzJjIjoiL216eDNBPT0iLCJtZDVIYXNoIjoiN1FkaWgxTXVoalplaEI2U3Y4VU5qQT09IiwibmFtZSI6InNvbWVEaXIvYmxvYi1mb3ItYXR0cmlidXRlcyJ9Cg==", "SGVsbG8gV29ybGQh" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "934" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:58 GMT" ], "Etag": [ "CIyPz/ierJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwtnKm-cBEi_k51yfPlu8Kz06cj3UFDTDeIh7Xcp4BRFHf2mVVlZxO45XYNvFFDy9FL" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvc29tZURpci9ibG9iLWZvci1hdHRyaWJ1dGVzLzE3NzM5MzI4Nzg0ODEyOTIiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vc29tZURpciUyRmJsb2ItZm9yLWF0dHJpYnV0ZXMiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9zb21lRGlyJTJGYmxvYi1mb3ItYXR0cmlidXRlcz9nZW5lcmF0aW9uPTE3NzM5MzI4Nzg0ODEyOTImYWx0PW1lZGlhIiwibmFtZSI6InNvbWVEaXIvYmxvYi1mb3ItYXR0cmlidXRlcyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjg3ODQ4MTI5MiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjEyIiwibWQ1SGFzaCI6IjdRZGloMU11aGpaZWhCNlN2OFVOakE9PSIsImNvbnRlbnRFbmNvZGluZyI6ImlkZW50aXR5IiwiY29udGVudERpc3Bvc2l0aW9uIjoiaW5saW5lIiwiY29udGVudExhbmd1YWdlIjoiZW4iLCJjYWNoZUNvbnRyb2wiOiJuby1jYWNoZSIsImNyYzMyYyI6Ii9tengzQT09IiwiZXRhZyI6IkNJeVB6L2llckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDc6NTguNDg0WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA3OjU4LjQ4NFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDc6NTguNDg0WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA3OjU4LjQ4NFoifQ==" } }, { "ID": "a4a1f883b3b8bc20", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/not-found?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "201" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:58 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzr-STXhqg1WLbCoqvjJGSqOLArNvXID5W87F-qzQfCVzPEisq3IRzmWFr2ByLHZHTi" ] }, "Body": "eyJlcnJvciI6eyJjb2RlIjo0MDQsIm1lc3NhZ2UiOiJObyBzdWNoIG9iamVjdDogZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ub3QtZm91bmQiLCJlcnJvcnMiOlt7Im1lc3NhZ2UiOiJObyBzdWNoIG9iamVjdDogZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ub3QtZm91bmQiLCJkb21haW4iOiJnbG9iYWwiLCJyZWFzb24iOiJub3RGb3VuZCJ9XX19" } }, { "ID": "bc86ad46e539d869", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/someDir?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "197" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:58 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxp0f8BphQ-TcqcQ6L9B2Hv19OHkF4iXQCEH6s32EQQP8dqFoc-DjXA-aWg7-uGwFN7" ] }, "Body": "eyJlcnJvciI6eyJjb2RlIjo0MDQsIm1lc3NhZ2UiOiJObyBzdWNoIG9iamVjdDogZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9zb21lRGlyIiwiZXJyb3JzIjpbeyJtZXNzYWdlIjoiTm8gc3VjaCBvYmplY3Q6IGdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvc29tZURpciIsImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6Im5vdEZvdW5kIn1dfX0=" } }, { "ID": "367c9408767277a2", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/someDir%2F?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "199" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:58 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyvwFNqeh8S8aN8JOqYTPqNhJ3sugY1Amx_oq29sb26ZzvyXTZIKWLORnOwFveWH0_m" ] }, "Body": "eyJlcnJvciI6eyJjb2RlIjo0MDQsIm1lc3NhZ2UiOiJObyBzdWNoIG9iamVjdDogZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9zb21lRGlyLyIsImVycm9ycyI6W3sibWVzc2FnZSI6Ik5vIHN1Y2ggb2JqZWN0OiBnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L3NvbWVEaXIvIiwiZG9tYWluIjoiZ2xvYmFsIiwicmVhc29uIjoibm90Rm91bmQifV19fQ==" } }, { "ID": "aec39d7718054c4f", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/someDir%2Fblob-for-attributes?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "934" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:58 GMT" ], "Etag": [ "CIyPz/ierJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWy7WVPyVO5w38aWX1bAUXfTz_lHMJ3uz38QxA-3eM93nEtcRFmrAiOny6dvdYBFPMMK" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvc29tZURpci9ibG9iLWZvci1hdHRyaWJ1dGVzLzE3NzM5MzI4Nzg0ODEyOTIiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vc29tZURpciUyRmJsb2ItZm9yLWF0dHJpYnV0ZXMiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9zb21lRGlyJTJGYmxvYi1mb3ItYXR0cmlidXRlcz9nZW5lcmF0aW9uPTE3NzM5MzI4Nzg0ODEyOTImYWx0PW1lZGlhIiwibmFtZSI6InNvbWVEaXIvYmxvYi1mb3ItYXR0cmlidXRlcyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjg3ODQ4MTI5MiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjEyIiwibWQ1SGFzaCI6IjdRZGloMU11aGpaZWhCNlN2OFVOakE9PSIsImNvbnRlbnRFbmNvZGluZyI6ImlkZW50aXR5IiwiY29udGVudERpc3Bvc2l0aW9uIjoiaW5saW5lIiwiY29udGVudExhbmd1YWdlIjoiZW4iLCJjYWNoZUNvbnRyb2wiOiJuby1jYWNoZSIsImNyYzMyYyI6Ii9tengzQT09IiwiZXRhZyI6IkNJeVB6L2llckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDc6NTguNDg0WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA3OjU4LjQ4NFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDc6NTguNDg0WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA3OjU4LjQ4NFoifQ==" } }, { "ID": "6ec7200525a1af03", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/someDir%2Fblob-for-attributes", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "no-cache" ], "Content-Disposition": [ "inline" ], "Content-Language": [ "en" ], "Content-Length": [ "12" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 19 Mar 2026 15:07:58 GMT" ], "Etag": [ "\"ed076287532e86365e841e92bfc50d8c\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:07:58 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932878481292" ], "X-Goog-Hash": [ "crc32c=/mzx3A==", "md5=7Qdih1MuhjZehB6Sv8UNjA==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "12" ], "X-Guploader-Uploadid": [ "AGQBYWwe34ZDfDjRiMudNsNo9IOkgVoeOJwPVcab_KFx2k0F3Y8CfT5Um8W9B24OfH7SB0Pl" ] }, "Body": "SGVsbG8gV29ybGQh" } }, { "ID": "bd92cf3c18b8063e", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=someDir%2Fblob-for-attributes\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoiL216eDNBPT0iLCJtZDVIYXNoIjoiN1FkaWgxTXVoalplaEI2U3Y4VU5qQT09IiwibmFtZSI6InNvbWVEaXIvYmxvYi1mb3ItYXR0cmlidXRlcyJ9Cg==", "SGVsbG8gV29ybGQh" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "841" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:58 GMT" ], "Etag": [ "CMuh7PierJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxml1MVYjYXvuilbaaY1WcFrKnpJzybhUl9da0bnLvhhlH2lbHatQuJUrpxKseSu1EM" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvc29tZURpci9ibG9iLWZvci1hdHRyaWJ1dGVzLzE3NzM5MzI4Nzg5NTg3OTUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vc29tZURpciUyRmJsb2ItZm9yLWF0dHJpYnV0ZXMiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9zb21lRGlyJTJGYmxvYi1mb3ItYXR0cmlidXRlcz9nZW5lcmF0aW9uPTE3NzM5MzI4Nzg5NTg3OTUmYWx0PW1lZGlhIiwibmFtZSI6InNvbWVEaXIvYmxvYi1mb3ItYXR0cmlidXRlcyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjg3ODk1ODc5NSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjEyIiwibWQ1SGFzaCI6IjdRZGloMU11aGpaZWhCNlN2OFVOakE9PSIsImNyYzMyYyI6Ii9tengzQT09IiwiZXRhZyI6IkNNdWg3UGllckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDc6NTguOTY4WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA3OjU4Ljk2OFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDc6NTguOTY4WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA3OjU4Ljk2OFoifQ==" } }, { "ID": "ae32a53737a438d3", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/someDir%2Fblob-for-attributes?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "841" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:59 GMT" ], "Etag": [ "CMuh7PierJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzJPIqs1QtilzgAglhnY9-yuIs5nHiTdmErk-DW92b6mhkfFC0BKXjjacsI5ptKgphw" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvc29tZURpci9ibG9iLWZvci1hdHRyaWJ1dGVzLzE3NzM5MzI4Nzg5NTg3OTUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vc29tZURpciUyRmJsb2ItZm9yLWF0dHJpYnV0ZXMiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9zb21lRGlyJTJGYmxvYi1mb3ItYXR0cmlidXRlcz9nZW5lcmF0aW9uPTE3NzM5MzI4Nzg5NTg3OTUmYWx0PW1lZGlhIiwibmFtZSI6InNvbWVEaXIvYmxvYi1mb3ItYXR0cmlidXRlcyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjg3ODk1ODc5NSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjEyIiwibWQ1SGFzaCI6IjdRZGloMU11aGpaZWhCNlN2OFVOakE9PSIsImNyYzMyYyI6Ii9tengzQT09IiwiZXRhZyI6IkNNdWg3UGllckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDc6NTguOTY4WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA3OjU4Ljk2OFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDc6NTguOTY4WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA3OjU4Ljk2OFoifQ==" } }, { "ID": "90db9c013831cac9", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/someDir%2Fblob-for-attributes?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:07:59 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWw40leX8xZKH8S8IN1S9gYpgutHPJ1EX0StqKiBMvqzmyc_udRyGD2Gvjg9NReEa1oj" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestCanceledWrite/BlobExists.replay ================================================ { "Initial": "AQAAAA7hTghTBPw1KAAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "54f47696a0ed7b1e", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-canceled-write\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoieVpSbHFnPT0iLCJtZDVIYXNoIjoiWHJZN3UrQWU3dENUeXlLN2oxck53dz09IiwibmFtZSI6ImJsb2ItZm9yLWNhbmNlbGVkLXdyaXRlIn0K", "aGVsbG8gd29ybGQ=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "821" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "CNmF9/qerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWw6BRImktTDQNfsfRFxQzWXG5fEEYcZudOvZ66K4yPcvsGJFsob0DQP85k1OzHtBMMa" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItY2FuY2VsZWQtd3JpdGUvMTc3MzkzMjg4MzMyOTc1MyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1jYW5jZWxlZC13cml0ZSIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWNhbmNlbGVkLXdyaXRlP2dlbmVyYXRpb249MTc3MzkzMjg4MzMyOTc1MyZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItY2FuY2VsZWQtd3JpdGUiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzI4ODMzMjk3NTMiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiIxMSIsIm1kNUhhc2giOiJYclk3dStBZTd0Q1R5eUs3ajFyTnd3PT0iLCJjcmMzMmMiOiJ5WlJscWc9PSIsImV0YWciOiJDTm1GOS9xZXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjAzLjMzMloiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowMy4zMzJaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjAzLjMzMloiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNTowODowMy4zMzJaIn0=" } }, { "ID": "e3e19a3ce8449201", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-canceled-write", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932883329753" ], "X-Goog-Hash": [ "crc32c=yZRlqg==", "md5=XrY7u+Ae7tCTyyK7j1rNww==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "11" ], "X-Guploader-Uploadid": [ "AGQBYWyU1H8xZmrM61iXVRh68VBxyW_fw-G5E0o1gZWZEVc3UbpeZ4pDM4my3lSYwN93s3jB" ] }, "Body": "aGVsbG8gd29ybGQ=" } }, { "ID": "2492df6d27d9a7b5", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-canceled-write", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932883329753" ], "X-Goog-Hash": [ "crc32c=yZRlqg==", "md5=XrY7u+Ae7tCTyyK7j1rNww==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "11" ], "X-Guploader-Uploadid": [ "AGQBYWygZTZbsSiQ86sH8TEgKTf_7BXr9P9NzZ17f-5bXrU6Xfd0p0HXd3WrCQZ-F2gXQ0qz" ] }, "Body": "aGVsbG8gd29ybGQ=" } }, { "ID": "ecf96e462c391a5d", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-canceled-write?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWygQgtnz5TRQo87h5i9qJiD0tMh5NjpL26t-FtgHVMdH4f0iR-rutmeTBtJm4_c_FA2" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestCanceledWrite/EmptyContentType.replay ================================================ { "Initial": "AQAAAA7hTghSIyUnkAAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "e8d4220a6b01d684", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-canceled-write", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "211" ], "Content-Type": [ "application/xml; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:02 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "X-Guploader-Uploadid": [ "AGQBYWw-KRlRmTt5tmLrgDgNSDWixulIxtanDw1ZS6Fj_GQmYNPFtxrWge7VzEVI-9sra09s" ] }, "Body": "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+Tm9TdWNoS2V5PC9Db2RlPjxNZXNzYWdlPlRoZSBzcGVjaWZpZWQga2V5IGRvZXMgbm90IGV4aXN0LjwvTWVzc2FnZT48RGV0YWlscz5ObyBzdWNoIG9iamVjdDogZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1jYW5jZWxlZC13cml0ZTwvRGV0YWlscz48L0Vycm9yPg==" } }, { "ID": "80b009f9fa4b8029", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-canceled-write", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "211" ], "Content-Type": [ "application/xml; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:02 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "X-Guploader-Uploadid": [ "AGQBYWwBp4tJntDKUIlSxAdDOaIJM-KlsiB9huDk6svMbc8RhmaTQNS6CXpxz_-WDl1hd0mF" ] }, "Body": "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+Tm9TdWNoS2V5PC9Db2RlPjxNZXNzYWdlPlRoZSBzcGVjaWZpZWQga2V5IGRvZXMgbm90IGV4aXN0LjwvTWVzc2FnZT48RGV0YWlscz5ObyBzdWNoIG9iamVjdDogZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1jYW5jZWxlZC13cml0ZTwvRGV0YWlscz48L0Vycm9yPg==" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestCanceledWrite/NonEmptyContentType.replay ================================================ { "Initial": "AQAAAA7hTghSMlZIWgAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "6c43fbbcaec7a1b6", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-canceled-write", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "211" ], "Content-Type": [ "application/xml; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:02 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "X-Guploader-Uploadid": [ "AGQBYWxiGJfzpY-7ba1gq7iL58vj9zO1d-mBz0aLOel55u9h375Dxd9P2j5vs8qrbvQ6PFXB" ] }, "Body": "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+Tm9TdWNoS2V5PC9Db2RlPjxNZXNzYWdlPlRoZSBzcGVjaWZpZWQga2V5IGRvZXMgbm90IGV4aXN0LjwvTWVzc2FnZT48RGV0YWlscz5ObyBzdWNoIG9iamVjdDogZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1jYW5jZWxlZC13cml0ZTwvRGV0YWlscz48L0Vycm9yPg==" } }, { "ID": "052619c50b56af09", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-canceled-write", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "211" ], "Content-Type": [ "application/xml; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "X-Guploader-Uploadid": [ "AGQBYWxQFjuiu0mRx0CYf8djqmg0Y2nVFNjCkLtvutx4NgEgy4Awx_L-KRMgUXiu1bzPWm5_" ] }, "Body": "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+Tm9TdWNoS2V5PC9Db2RlPjxNZXNzYWdlPlRoZSBzcGVjaWZpZWQga2V5IGRvZXMgbm90IGV4aXN0LjwvTWVzc2FnZT48RGV0YWlscz5ObyBzdWNoIG9iamVjdDogZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1jYW5jZWxlZC13cml0ZTwvRGV0YWlscz48L0Vycm9yPg==" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestConcurrentWriteAndRead.replay ================================================ { "Initial": "AQAAAA7hTghTJJwHGQAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "a4121ce8729d59dc", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=key0\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCJjcmMzMmMiOiJtUGxCaVE9PSIsIm1kNUhhc2giOiJZZzhMWjZrZmYzUVZHOFcrZEZ0eEVBPT0iLCJuYW1lIjoia2V5MCJ9Cg==", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "746" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "CNSakfuerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxsGQupkqMf5D6P0bj0Ku6CVFnsKxkh75C0yaAzSqyu9m7uCZLyNYRQCFU6ajjO8VjC" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQva2V5MC8xNzczOTMyODgzNzU4NDIwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2tleTAiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9rZXkwP2dlbmVyYXRpb249MTc3MzkzMjg4Mzc1ODQyMCZhbHQ9bWVkaWEiLCJuYW1lIjoia2V5MCIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjg4Mzc1ODQyMCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNDA5NiIsIm1kNUhhc2giOiJZZzhMWjZrZmYzUVZHOFcrZEZ0eEVBPT0iLCJjcmMzMmMiOiJtUGxCaVE9PSIsImV0YWciOiJDTlNha2Z1ZXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjAzLjc2MVoiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowMy43NjFaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjAzLjc2MVoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNTowODowMy43NjFaIn0=" } }, { "ID": "9063cd79fa83243b", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=key6\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCJjcmMzMmMiOiJUV2RTWHc9PSIsIm1kNUhhc2giOiJsa28ydURxb0pyZ0V5WU5udmNKNnZ3PT0iLCJuYW1lIjoia2V5NiJ9Cg==", "BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "746" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "CObwkfuerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwHsO47tQlEOMQNzXsiasDLsovg9gOT9bUd4XiKqmVI89mVXzmw9Ods_7AOKhKgHkCD" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQva2V5Ni8xNzczOTMyODgzNzY5NDQ2Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2tleTYiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9rZXk2P2dlbmVyYXRpb249MTc3MzkzMjg4Mzc2OTQ0NiZhbHQ9bWVkaWEiLCJuYW1lIjoia2V5NiIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjg4Mzc2OTQ0NiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNDA5NiIsIm1kNUhhc2giOiJsa28ydURxb0pyZ0V5WU5udmNKNnZ3PT0iLCJjcmMzMmMiOiJUV2RTWHc9PSIsImV0YWciOiJDT2J3a2Z1ZXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjAzLjc3MloiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowMy43NzJaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjAzLjc3MloiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNTowODowMy43NzJaIn0=" } }, { "ID": "5dfd07d2d3c5c7ed", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=key14\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCJjcmMzMmMiOiJoZ2N6eVE9PSIsIm1kNUhhc2giOiJObEZEVUZNMFRwRjFTK01YRTFQeERnPT0iLCJuYW1lIjoia2V5MTQifQo=", "Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "750" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "CL+wk/uerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyGuE570N_mC6sVFVdLpR2TImDvxjNVgQDsqwgPtBPzs6Yjggdq7r_yUVKRQesyRfkR" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQva2V5MTQvMTc3MzkzMjg4Mzc5Mzk4MyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9rZXkxNCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2tleTE0P2dlbmVyYXRpb249MTc3MzkzMjg4Mzc5Mzk4MyZhbHQ9bWVkaWEiLCJuYW1lIjoia2V5MTQiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzI4ODM3OTM5ODMiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6ImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjQwOTYiLCJtZDVIYXNoIjoiTmxGRFVGTTBUcEYxUytNWEUxUHhEZz09IiwiY3JjMzJjIjoiaGdjenlRPT0iLCJldGFnIjoiQ0wrd2svdWVySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowMy43OTZaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDMuNzk2WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowMy43OTZaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDMuNzk2WiJ9" } }, { "ID": "fc7628b2c641ad67", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=key15\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCJjcmMzMmMiOiJYT1laUHc9PSIsIm1kNUhhc2giOiJxSHF5M1RPQ1BMV0FCWi9ZVEVlaUFnPT0iLCJuYW1lIjoia2V5MTUifQo=", "Dw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "750" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "CLOzkvuerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWy6Kzg8RX8klri1datRpk8ojdrSRSl6sVDxVE9FSmq7hj5NVMMgd6k7RICTFrfbBmsD" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQva2V5MTUvMTc3MzkzMjg4Mzc3Nzk3MSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9rZXkxNSIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2tleTE1P2dlbmVyYXRpb249MTc3MzkzMjg4Mzc3Nzk3MSZhbHQ9bWVkaWEiLCJuYW1lIjoia2V5MTUiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzI4ODM3Nzc5NzEiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6ImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjQwOTYiLCJtZDVIYXNoIjoicUhxeTNUT0NQTFdBQlovWVRFZWlBZz09IiwiY3JjMzJjIjoiWE9ZWlB3PT0iLCJldGFnIjoiQ0xPemt2dWVySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowMy43ODFaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDMuNzgxWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowMy43ODFaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDMuNzgxWiJ9" } }, { "ID": "73ddccce7624eaf4", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=key12\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoiTmlrUTFBPT0iLCJtZDVIYXNoIjoiVmtHUSszTEpzZUhBRm9wYmIrQll2Zz09IiwibmFtZSI6ImtleTEyIn0K", "DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "751" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "CPuPk/uerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWx8f0bMFK4paptDCSzARjFBEo5Q2bY4OoBOEmNNl6JNi5fX6_eeXdslO7zKfWWeyCZ0" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQva2V5MTIvMTc3MzkzMjg4Mzc4OTgxOSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9rZXkxMiIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2tleTEyP2dlbmVyYXRpb249MTc3MzkzMjg4Mzc4OTgxOSZhbHQ9bWVkaWEiLCJuYW1lIjoia2V5MTIiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzI4ODM3ODk4MTkiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI0MDk2IiwibWQ1SGFzaCI6IlZrR1ErM0xKc2VIQUZvcGJiK0JZdmc9PSIsImNyYzMyYyI6Ik5pa1ExQT09IiwiZXRhZyI6IkNQdVBrL3VlckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDMuNzkzWiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjAzLjc5M1oiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDMuNzkzWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjAzLjc5M1oifQ==" } }, { "ID": "713aaa50c6a8ef2e", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=key11\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCJjcmMzMmMiOiJPVllwOUE9PSIsIm1kNUhhc2giOiJBYkRtV1I5NmYxVklGblc0SlE1L1NBPT0iLCJuYW1lIjoia2V5MTEifQo=", "CwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCw==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "750" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "CK6zkvuerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzxiL-dxeuWSdoU11hv-v6FCWsjP33ADFyTA5Ncl1O_VTpP4oTF4hRCXFq-nmPqnC0i" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQva2V5MTEvMTc3MzkzMjg4Mzc3Nzk2NiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9rZXkxMSIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2tleTExP2dlbmVyYXRpb249MTc3MzkzMjg4Mzc3Nzk2NiZhbHQ9bWVkaWEiLCJuYW1lIjoia2V5MTEiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzI4ODM3Nzc5NjYiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6ImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjQwOTYiLCJtZDVIYXNoIjoiQWJEbVdSOTZmMVZJRm5XNEpRNS9TQT09IiwiY3JjMzJjIjoiT1ZZcDlBPT0iLCJldGFnIjoiQ0s2emt2dWVySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowMy43ODBaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDMuNzgwWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowMy43ODBaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDMuNzgwWiJ9" } }, { "ID": "29bc712904071b0a", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=key13\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoiN01nNklnPT0iLCJtZDVIYXNoIjoiU3NUekZaM203UjFOckljNDJVS1crUT09IiwibmFtZSI6ImtleTEzIn0K", "DQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "751" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "CN3lkfuerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwq6vCYO20Gza2IcZV6YZdGReW4zE-MrqkZWCOf_Y303kgXf9N5KYQiYR4nAnWK703m" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQva2V5MTMvMTc3MzkzMjg4Mzc2ODAyOSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9rZXkxMyIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2tleTEzP2dlbmVyYXRpb249MTc3MzkzMjg4Mzc2ODAyOSZhbHQ9bWVkaWEiLCJuYW1lIjoia2V5MTMiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzI4ODM3NjgwMjkiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI0MDk2IiwibWQ1SGFzaCI6IlNzVHpGWjNtN1IxTnJJYzQyVUtXK1E9PSIsImNyYzMyYyI6IjdNZzZJZz09IiwiZXRhZyI6IkNOM2xrZnVlckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDMuNzcyWiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjAzLjc3MloiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDMuNzcyWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjAzLjc3MloifQ==" } }, { "ID": "8ccadeebbfb00fff", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=key1\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCJjcmMzMmMiOiJRaGhyZnc9PSIsIm1kNUhhc2giOiJxbzg1bG4zclJCcHVkSVNXT1VXcFlBPT0iLCJuYW1lIjoia2V5MSJ9Cg==", "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "746" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "CLfwkfuerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWx6RU-GQcVO8kGLQHuoaI1YO5xPeFD71-2GhEp0DlVFTNPfM3YMGgRZHMGr8__5fuYZ" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQva2V5MS8xNzczOTMyODgzNzY5Mzk5Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2tleTEiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9rZXkxP2dlbmVyYXRpb249MTc3MzkzMjg4Mzc2OTM5OSZhbHQ9bWVkaWEiLCJuYW1lIjoia2V5MSIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjg4Mzc2OTM5OSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNDA5NiIsIm1kNUhhc2giOiJxbzg1bG4zclJCcHVkSVNXT1VXcFlBPT0iLCJjcmMzMmMiOiJRaGhyZnc9PSIsImV0YWciOiJDTGZ3a2Z1ZXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjAzLjc3MloiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowMy43NzJaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjAzLjc3MloiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNTowODowMy43NzJaIn0=" } }, { "ID": "51ec89b3adf860ff", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=key10\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoiNDdjREFnPT0iLCJtZDVIYXNoIjoiQVhLSzFKVmNaNzkxS3hjaElYWU5OZz09IiwibmFtZSI6ImtleTEwIn0K", "CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "751" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "CJe6lfuerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzC3zQQ2Bb4kGJsaiCSigvOZn7MGPHcgaWsgIc-_lZGgjLJhg7LYKFWu8arCM6Oaj5Q" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQva2V5MTAvMTc3MzkzMjg4MzgyNzk5MSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9rZXkxMCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2tleTEwP2dlbmVyYXRpb249MTc3MzkzMjg4MzgyNzk5MSZhbHQ9bWVkaWEiLCJuYW1lIjoia2V5MTAiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzI4ODM4Mjc5OTEiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI0MDk2IiwibWQ1SGFzaCI6IkFYS0sxSlZjWjc5MUt4Y2hJWFlOTmc9PSIsImNyYzMyYyI6IjQ3Y0RBZz09IiwiZXRhZyI6IkNKZTZsZnVlckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDMuODMxWiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjAzLjgzMVoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDMuODMxWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjAzLjgzMVoifQ==" } }, { "ID": "e6e9acef56ce63e2", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=key17\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCJjcmMzMmMiOiIwVFRlb2c9PSIsIm1kNUhhc2giOiIzMmVlWHNqN1p5aENsMG8yMHdQUS93PT0iLCJuYW1lIjoia2V5MTcifQo=", "EREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "750" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "CIuplPuerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzCktsC2ZcUYbFDRV2iVGzF3kIKOa3VafWbJrp7DYfgjvy0E8zKeuwTnfCBO5MUWkv-" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQva2V5MTcvMTc3MzkzMjg4MzgwOTQxOSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9rZXkxNyIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2tleTE3P2dlbmVyYXRpb249MTc3MzkzMjg4MzgwOTQxOSZhbHQ9bWVkaWEiLCJuYW1lIjoia2V5MTciLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzI4ODM4MDk0MTkiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6ImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjQwOTYiLCJtZDVIYXNoIjoiMzJlZVhzajdaeWhDbDBvMjB3UFEvdz09IiwiY3JjMzJjIjoiMFRUZW9nPT0iLCJldGFnIjoiQ0l1cGxQdWVySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowMy44MTJaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDMuODEyWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowMy44MTJaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDMuODEyWiJ9" } }, { "ID": "1ff5a65c71d40b0c", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=key5\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCJjcmMzMmMiOiJKNmhidEE9PSIsIm1kNUhhc2giOiJZZlJhS1FrRzBXdjFVZWVNc0QxZitRPT0iLCJuYW1lIjoia2V5NSJ9Cg==", "BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "746" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "CIf/kvuerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxF7XCAqsLdKDsvmqT90gqPW34WEpK4U9uUDF7WPA2ZGHA-iy-b-jl-XPVSA5dHk7mw" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQva2V5NS8xNzczOTMyODgzNzg3NjU1Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2tleTUiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9rZXk1P2dlbmVyYXRpb249MTc3MzkzMjg4Mzc4NzY1NSZhbHQ9bWVkaWEiLCJuYW1lIjoia2V5NSIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjg4Mzc4NzY1NSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNDA5NiIsIm1kNUhhc2giOiJZZlJhS1FrRzBXdjFVZWVNc0QxZitRPT0iLCJjcmMzMmMiOiJKNmhidEE9PSIsImV0YWciOiJDSWYva3Z1ZXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjAzLjc5MFoiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowMy43OTBaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjAzLjc5MFoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNTowODowMy43OTBaIn0=" } }, { "ID": "7ce6a3cc63e97a62", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=key19\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCJjcmMzMmMiOiJZUnI5dnc9PSIsIm1kNUhhc2giOiIydzlTNGFScUtBQkhvZUFoeWlBSk1BPT0iLCJuYW1lIjoia2V5MTkifQo=", "ExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEw==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "750" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "CJu2k/uerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWw1ivdUky9Vf6YP1IvAVn9cjlfdZ6anpkdj7kcwbe9fG2MFrlaIW4QBJPDaG0r6Q3ra" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQva2V5MTkvMTc3MzkzMjg4Mzc5NDcxNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9rZXkxOSIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2tleTE5P2dlbmVyYXRpb249MTc3MzkzMjg4Mzc5NDcxNSZhbHQ9bWVkaWEiLCJuYW1lIjoia2V5MTkiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzI4ODM3OTQ3MTUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6ImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjQwOTYiLCJtZDVIYXNoIjoiMnc5UzRhUnFLQUJIb2VBaHlpQUpNQT09IiwiY3JjMzJjIjoiWVJyOXZ3PT0iLCJldGFnIjoiQ0p1MmsvdWVySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowMy43OTdaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDMuNzk3WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowMy43OTdaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDMuNzk3WiJ9" } }, { "ID": "8c4e5b6c1020a69f", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=key16\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCJjcmMzMmMiOiJDOVgwVkE9PSIsIm1kNUhhc2giOiI2NW45Q2pkckprTlFFYUc0ZkZXTWdRPT0iLCJuYW1lIjoia2V5MTYifQo=", "EBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "750" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "CMDDlPuerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzn8Q-cUnG2Kti0KbA88dhMEwNQ_MTFE9JTLGn2__4Ua6OZjpacCtMEx6BD5-IsONge" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQva2V5MTYvMTc3MzkzMjg4MzgxMjgwMCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9rZXkxNiIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2tleTE2P2dlbmVyYXRpb249MTc3MzkzMjg4MzgxMjgwMCZhbHQ9bWVkaWEiLCJuYW1lIjoia2V5MTYiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzI4ODM4MTI4MDAiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6ImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjQwOTYiLCJtZDVIYXNoIjoiNjVuOUNqZHJKa05RRWFHNGZGV01nUT09IiwiY3JjMzJjIjoiQzlYMFZBPT0iLCJldGFnIjoiQ01ERGxQdWVySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowMy44MTVaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDMuODE1WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowMy44MTVaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDMuODE1WiJ9" } }, { "ID": "dc25b8de7d6b6fe8", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=key9\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoiaVhnSzZRPT0iLCJtZDVIYXNoIjoia2ZzaXVLUlo3M0Q3Q3phdUtvZEFoZz09IiwibmFtZSI6ImtleTkifQo=", "CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "747" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "CMeBk/uerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWz_jW4OicPy17TDrI9iGWnZGoPrVUjniQIm5wvO2GP1MQ6oBxt-ed8_PD5pwbV-95uF" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQva2V5OS8xNzczOTMyODgzNzg3OTc1Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2tleTkiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9rZXk5P2dlbmVyYXRpb249MTc3MzkzMjg4Mzc4Nzk3NSZhbHQ9bWVkaWEiLCJuYW1lIjoia2V5OSIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjg4Mzc4Nzk3NSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjQwOTYiLCJtZDVIYXNoIjoia2ZzaXVLUlo3M0Q3Q3phdUtvZEFoZz09IiwiY3JjMzJjIjoiaVhnSzZRPT0iLCJldGFnIjoiQ01lQmsvdWVySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowMy43OTJaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDMuNzkyWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowMy43OTJaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDMuNzkyWiJ9" } }, { "ID": "fabaa6461d9068cd", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=key4\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCJjcmMzMmMiOiIvVWx4UWc9PSIsIm1kNUhhc2giOiJIMDZqeUYzWnNKRE9jd3lCNWdnK3p3PT0iLCJuYW1lIjoia2V5NCJ9Cg==", "BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "746" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "COC7kvuerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyKenA9pcOt1eWQ0QsNtQn1fUx5C_XpZxHRi5LgfCPCAwtXjAPQC8elzL5g1m9LCjzw" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQva2V5NC8xNzczOTMyODgzNzc5MDQwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2tleTQiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9rZXk0P2dlbmVyYXRpb249MTc3MzkzMjg4Mzc3OTA0MCZhbHQ9bWVkaWEiLCJuYW1lIjoia2V5NCIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjg4Mzc3OTA0MCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNDA5NiIsIm1kNUhhc2giOiJIMDZqeUYzWnNKRE9jd3lCNWdnK3p3PT0iLCJjcmMzMmMiOiIvVWx4UWc9PSIsImV0YWciOiJDT0M3a3Z1ZXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjAzLjc4MVoiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowMy43ODFaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjAzLjc4MVoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNTowODowMy43ODFaIn0=" } }, { "ID": "4d8b8d47485b3b4d", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=key2\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCJjcmMzMmMiOiJLTmRpbEE9PSIsIm1kNUhhc2giOiJaVUhuL1Vob0M1dGc3QVZldjZNY0FnPT0iLCJuYW1lIjoia2V5MiJ9Cg==", "AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "746" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "COzik/uerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyo1TQJTlAT5WvolYd3DF8kGgT7iAOJNXlvsisaVS-roHYjjB-Mt1BiOtFSqUh1mfJx" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQva2V5Mi8xNzczOTMyODgzODAwNDI4Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2tleTIiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9rZXkyP2dlbmVyYXRpb249MTc3MzkzMjg4MzgwMDQyOCZhbHQ9bWVkaWEiLCJuYW1lIjoia2V5MiIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjg4MzgwMDQyOCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNDA5NiIsIm1kNUhhc2giOiJaVUhuL1Vob0M1dGc3QVZldjZNY0FnPT0iLCJjcmMzMmMiOiJLTmRpbEE9PSIsImV0YWciOiJDT3ppay91ZXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjAzLjgwM1oiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowMy44MDNaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjAzLjgwM1oiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNTowODowMy44MDNaIn0=" } }, { "ID": "e3f4ba6109e6455e", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=key3\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCJjcmMzMmMiOiI4alpJWWc9PSIsIm1kNUhhc2giOiI3dEJQT3lLSW8wb21ZT21iTjNIdDd3PT0iLCJuYW1lIjoia2V5MyJ9Cg==", "AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "746" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "CLaok/uerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWw1dP57UMvMt48YXgt5VJ_wOD1JQgkloI95pTnUUpuxLyWf0A5VQ1UE2bhK84MbQm4l" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQva2V5My8xNzczOTMyODgzNzkyOTUwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2tleTMiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9rZXkzP2dlbmVyYXRpb249MTc3MzkzMjg4Mzc5Mjk1MCZhbHQ9bWVkaWEiLCJuYW1lIjoia2V5MyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjg4Mzc5Mjk1MCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNDA5NiIsIm1kNUhhc2giOiI3dEJQT3lLSW8wb21ZT21iTjNIdDd3PT0iLCJjcmMzMmMiOiI4alpJWWc9PSIsImV0YWciOiJDTGFvay91ZXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjAzLjc5NloiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowMy43OTZaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjAzLjc5NloiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNTowODowMy43OTZaIn0=" } }, { "ID": "146bbb4836499276", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=key18\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCJjcmMzMmMiOiJ1L3ZYU1E9PSIsIm1kNUhhc2giOiJ3WnZJMU10T2dBTkdRRDBnelo0TlVnPT0iLCJuYW1lIjoia2V5MTgifQo=", "EhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "750" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "CMa/kvuerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWz_IJIyBe_yVkfiQKnwfxTLgWQD_oBtdQkHlgahVvr3EOXbnAktLZJdXCu2q278KFNe" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQva2V5MTgvMTc3MzkzMjg4Mzc3OTUyNiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9rZXkxOCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2tleTE4P2dlbmVyYXRpb249MTc3MzkzMjg4Mzc3OTUyNiZhbHQ9bWVkaWEiLCJuYW1lIjoia2V5MTgiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzI4ODM3Nzk1MjYiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6ImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjQwOTYiLCJtZDVIYXNoIjoid1p2STFNdE9nQU5HUUQwZ3paNE5VZz09IiwiY3JjMzJjIjoidS92WFNRPT0iLCJldGFnIjoiQ01hL2t2dWVySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowMy43ODNaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDMuNzgzWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowMy43ODNaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDMuNzgzWiJ9" } }, { "ID": "bcd68f79aec322b0", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=key7\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCJjcmMzMmMiOiJsNFo0cVE9PSIsIm1kNUhhc2giOiJrYnVpVHA1SkV1Z2p3QWtnenRQb1hBPT0iLCJuYW1lIjoia2V5NyJ9Cg==", "BwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBw==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "746" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "CPeOk/uerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWw5mszVWYKuO0I1Mi3fjDWXcLxNlG4SRt9kG5NdQQAleVBnu8ycOkWIJc59xYPkpUKR" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQva2V5Ny8xNzczOTMyODgzNzg5Njg3Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2tleTciLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9rZXk3P2dlbmVyYXRpb249MTc3MzkzMjg4Mzc4OTY4NyZhbHQ9bWVkaWEiLCJuYW1lIjoia2V5NyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjg4Mzc4OTY4NyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNDA5NiIsIm1kNUhhc2giOiJrYnVpVHA1SkV1Z2p3QWtnenRQb1hBPT0iLCJjcmMzMmMiOiJsNFo0cVE9PSIsImV0YWciOiJDUGVPay91ZXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjAzLjc5M1oiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowMy43OTNaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjAzLjc5M1oiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNTowODowMy43OTNaIn0=" } }, { "ID": "99d3ad85ee165a1c", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=key8\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCJjcmMzMmMiOiJVNWtnSHc9PSIsIm1kNUhhc2giOiJxUFpQRTB1QUdCTktFNkxoRVFUQThRPT0iLCJuYW1lIjoia2V5OCJ9Cg==", "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "746" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "CIaEkvuerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzoKojnnmOWyHBGW06KX8ouoMxjaCQAL6xqFrpwOO50wywmzKT0NoTu9pCehj0qkAem" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQva2V5OC8xNzczOTMyODgzNzcxOTEwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2tleTgiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9rZXk4P2dlbmVyYXRpb249MTc3MzkzMjg4Mzc3MTkxMCZhbHQ9bWVkaWEiLCJuYW1lIjoia2V5OCIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjg4Mzc3MTkxMCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNDA5NiIsIm1kNUhhc2giOiJxUFpQRTB1QUdCTktFNkxoRVFUQThRPT0iLCJjcmMzMmMiOiJVNWtnSHc9PSIsImV0YWciOiJDSWFFa3Z1ZXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjAzLjc3NFoiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowMy43NzRaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjAzLjc3NFoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNTowODowMy43NzRaIn0=" } }, { "ID": "67adaf3240d4cd01", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/key4", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "\"1f4ea3c85dd9b090ce730c81e6083ecf\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932883779040" ], "X-Goog-Hash": [ "crc32c=/UlxQg==", "md5=H06jyF3ZsJDOcwyB5gg+zw==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "4096" ], "X-Guploader-Uploadid": [ "AGQBYWyT2dNpwgVokyGk2eTB0B6IhzJjC4o7TJkhmVX4yDq-ohUDNXPHimi-TOdJ9vdim_Qa" ] }, "Body": "BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA==" } }, { "ID": "ccc1ed5f065ea883", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/key19", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "\"db0f52e1a46a280047a1e021ca200930\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932883794715" ], "X-Goog-Hash": [ "crc32c=YRr9vw==", "md5=2w9S4aRqKABHoeAhyiAJMA==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "4096" ], "X-Guploader-Uploadid": [ "AGQBYWyK2gGBWbv8WRa0haqndD4skdfdqLCKDYWuEuLN2-Om0Xh-sxornCC7731fxlMKP6QV" ] }, "Body": "ExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEw==" } }, { "ID": "4f50909c204535a1", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/key6", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:08:04 GMT" ], "Etag": [ "\"964a36b83aa826b804c98367bdc27abf\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932883769446" ], "X-Goog-Hash": [ "crc32c=TWdSXw==", "md5=lko2uDqoJrgEyYNnvcJ6vw==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "4096" ], "X-Guploader-Uploadid": [ "AGQBYWwUZE-suc_gOjygpKkuhOfX0cLrjFHT7qBeBdXS9qm7rvsq_cg7IJluduZNjXbff3FV" ] }, "Body": "BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBg==" } }, { "ID": "ae798d3f1248078f", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/key11", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "\"01b0e6591f7a7f55481675b8250e7f48\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932883777966" ], "X-Goog-Hash": [ "crc32c=OVYp9A==", "md5=AbDmWR96f1VIFnW4JQ5/SA==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "4096" ], "X-Guploader-Uploadid": [ "AGQBYWxgxe_Css7uvwM6Pu8VAnDcNibil4lW3YSgpiebrC-yt56_u9JgCRSS9aYUHfeuJjQg" ] }, "Body": "CwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCw==" } }, { "ID": "47afa7da0a3ffbc4", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/key5", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:08:04 GMT" ], "Etag": [ "\"61f45a290906d16bf551e78cb03d5ff9\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932883787655" ], "X-Goog-Hash": [ "crc32c=J6hbtA==", "md5=YfRaKQkG0Wv1UeeMsD1f+Q==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "4096" ], "X-Guploader-Uploadid": [ "AGQBYWx2G_uAsXtqUWlmYDsgtg8Hf_mHdkglXCHSOQxjfrxqHSUGOmhsALSIVvqubkKQPdKk" ] }, "Body": "BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ==" } }, { "ID": "51788c4b596987bf", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/key3", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "\"eed04f3b2288a34a2660e99b3771edef\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932883792950" ], "X-Goog-Hash": [ "crc32c=8jZIYg==", "md5=7tBPOyKIo0omYOmbN3Ht7w==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "4096" ], "X-Guploader-Uploadid": [ "AGQBYWxeADFxZBBZpKbYQeFpPVXmgZ9LWnBI0GJidGUb3G7i_Qzai0cy47osPJvlGGVSNGHC" ] }, "Body": "AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw==" } }, { "ID": "6a27773b873d8c9e", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/key15", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "\"a87ab2dd33823cb580059fd84c47a202\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932883777971" ], "X-Goog-Hash": [ "crc32c=XOYZPw==", "md5=qHqy3TOCPLWABZ/YTEeiAg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "4096" ], "X-Guploader-Uploadid": [ "AGQBYWyrNWpxuj0fM6C5O3tXpj8csW0ra9q23ArQW8GAQsSSwV9ftGCZgWW7ldLYjpzEEHTU" ] }, "Body": "Dw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw==" } }, { "ID": "0f900655dd6bdffe", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/key9", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "4096" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "\"91fb22b8a459ef70fb0b36ae2a874086\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932883787975" ], "X-Goog-Hash": [ "crc32c=iXgK6Q==", "md5=kfsiuKRZ73D7CzauKodAhg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "4096" ], "X-Guploader-Uploadid": [ "AGQBYWwsVh_O4WqDVhJw-YIOr2nkMDmBruIS-oArsqI4aWY0QGZmOD8-ElHxams-KcyJ2M2w" ] }, "Body": "CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQ==" } }, { "ID": "4f66a165620f0461", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/key7", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "\"91bba24e9e4912e823c00920ced3e85c\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932883789687" ], "X-Goog-Hash": [ "crc32c=l4Z4qQ==", "md5=kbuiTp5JEugjwAkgztPoXA==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "4096" ], "X-Guploader-Uploadid": [ "AGQBYWzfgKQwJolhjP_59FBLw0aCjBM9nN1XlhKdpm0kWFhyrEDywpSdEmlYeQtERiSZhWE6" ] }, "Body": "BwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBw==" } }, { "ID": "3a1a66904144a4b5", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/key1", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "\"aa8f39967deb441a6e7484963945a960\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932883769399" ], "X-Goog-Hash": [ "crc32c=Qhhrfw==", "md5=qo85ln3rRBpudISWOUWpYA==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "4096" ], "X-Guploader-Uploadid": [ "AGQBYWwly1fXgneaGMCR3C_mRTyIgrXUWuawymI2YU2PcTHUE9vgWu73BoQPW9561hHX_DUZ" ] }, "Body": "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ==" } }, { "ID": "18a4fd065af1d006", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/key8", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "\"a8f64f134b8018134a13a2e11104c0f1\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932883771910" ], "X-Goog-Hash": [ "crc32c=U5kgHw==", "md5=qPZPE0uAGBNKE6LhEQTA8Q==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "4096" ], "X-Guploader-Uploadid": [ "AGQBYWxRwjiTDho48SWNjmoZ6JDfwLmGPpoI1FnDhF9OvMkMWzgNh4BZxnWjhk6hFoPbkHDQ" ] }, "Body": "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA==" } }, { "ID": "614017dcf5835297", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/key14", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "\"3651435053344e91754be3171353f10e\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932883793983" ], "X-Goog-Hash": [ "crc32c=hgczyQ==", "md5=NlFDUFM0TpF1S+MXE1PxDg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "4096" ], "X-Guploader-Uploadid": [ "AGQBYWwzMAoxgX_j_jxZKsZ4huA-9lbWoRSEuHAN9q3ExWVEK_MV2RAiNJ0WohJNRbAVTvzz" ] }, "Body": "Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg==" } }, { "ID": "a0dbb857f4018ee9", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/key10", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "4096" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "\"01728ad4955c67bf752b172121760d36\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932883827991" ], "X-Goog-Hash": [ "crc32c=47cDAg==", "md5=AXKK1JVcZ791KxchIXYNNg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "4096" ], "X-Guploader-Uploadid": [ "AGQBYWw436-o8shR6NfZ7j6m1pTppgxFRxO3P1GTQqGuYb9t6N_huOR3k0mo2-adsaNNg35y" ] }, "Body": "CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg==" } }, { "ID": "24b947eed6773756", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/key0", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "\"620f0b67a91f7f74151bc5be745b7110\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932883758420" ], "X-Goog-Hash": [ "crc32c=mPlBiQ==", "md5=Yg8LZ6kff3QVG8W+dFtxEA==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "4096" ], "X-Guploader-Uploadid": [ "AGQBYWyv3eHblyY6lbpidhp0ad1TX911b26o7vBbzCz5TkBWxz9k8l1JKD-Qh8NxcgHvR9DB" ] }, "Body": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" } }, { "ID": "498ee12cd4bad229", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/key16", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "\"eb99fd0a376b26435011a1b87c558c81\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932883812800" ], "X-Goog-Hash": [ "crc32c=C9X0VA==", "md5=65n9CjdrJkNQEaG4fFWMgQ==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "4096" ], "X-Guploader-Uploadid": [ "AGQBYWwNB7fqWQyjtlutmyNN77OmNo-IZ0Dl2vKvt6Jq5oOajYV2817wjOjPTVlPkcvos51-" ] }, "Body": "EBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEA==" } }, { "ID": "9aeacb80c7845331", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/key17", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "\"df679e5ec8fb672842974a36d303d0ff\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932883809419" ], "X-Goog-Hash": [ "crc32c=0TTeog==", "md5=32eeXsj7ZyhCl0o20wPQ/w==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "4096" ], "X-Guploader-Uploadid": [ "AGQBYWwMPoFAZVc9_rDSmML6jvhObrMM7kR08-okbNA5VKLgs_8Cpg5mE2CA4vPHcqUFj4HG" ] }, "Body": "EREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREQ==" } }, { "ID": "56281d40ac181422", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/key2", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "\"6541e7fd48680b9b60ec055ebfa31c02\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932883800428" ], "X-Goog-Hash": [ "crc32c=KNdilA==", "md5=ZUHn/UhoC5tg7AVev6McAg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "4096" ], "X-Guploader-Uploadid": [ "AGQBYWzQn20_AVeHcHG6UKtYUbh1tqML3jCGCxfKm2vO_82ZNEF7Tl9bV09vaBFtNENEjf7M" ] }, "Body": "AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg==" } }, { "ID": "8858901ecf929041", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/key13", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "4096" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "\"4ac4f3159de6ed1d4dac8738d94296f9\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932883768029" ], "X-Goog-Hash": [ "crc32c=7Mg6Ig==", "md5=SsTzFZ3m7R1NrIc42UKW+Q==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "4096" ], "X-Guploader-Uploadid": [ "AGQBYWzHiWXaBTWOZWHYFKa6VSQSRbz1i471et3iDcn71EQrz-BjuhYAeEuk7gVBsvG-pRxa" ] }, "Body": "DQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ==" } }, { "ID": "f1cb23faa916a594", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/key12", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "4096" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "\"564190fb72c9b1e1c0168a5b6fe058be\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932883789819" ], "X-Goog-Hash": [ "crc32c=NikQ1A==", "md5=VkGQ+3LJseHAFopbb+BYvg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "4096" ], "X-Guploader-Uploadid": [ "AGQBYWxdaulkGjd1OMFm5JZuJgIdNw1hxO2uf1RWKaDE2L7DGSMNSoH1ADqJjlixfGgQp1aw" ] }, "Body": "DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA==" } }, { "ID": "3dccda366a829393", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/key18", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Etag": [ "\"c19bc8d4cb4e800346403d20cd9e0d52\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:08:03 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932883779526" ], "X-Goog-Hash": [ "crc32c=u/vXSQ==", "md5=wZvI1MtOgANGQD0gzZ4NUg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "4096" ], "X-Guploader-Uploadid": [ "AGQBYWyvEDybhiuiW6Dyl2sAZ6XLqIDEWlM12KE9ukKnrXUXlXwzBOR4zpAy6cHkweu-de6e" ] }, "Body": "EhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEg==" } }, { "ID": "d6a2cc5e6670750b", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/key19?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:04 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxTZIDjaASrpGmsG1m6z5yEf32f4cB0dxQ65N1cRIZrmDDx2QpvrbCS0R1isXeGyLSz" ] }, "Body": "" } }, { "ID": "0542b8f4b446b5ac", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/key18?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:04 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyyd6O2qItM7_6t8vyW8d6GfLpO1cFcnPZeDG7y_y3BC0bBKOAT0fNO3Kx5Lp7PPRl3" ] }, "Body": "" } }, { "ID": "bc0fd9bfce16afac", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/key17?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:04 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwQpOf8DTYp4qjhLc6wPFuWjQgrA5Kz5dUa9wruBBVnqhDJhwYsKIbzVWKMD9_NPFO2" ] }, "Body": "" } }, { "ID": "72cfc478164e410e", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/key16?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:04 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWw7vNSpXeXEBtIu2eK7C1HbB1AFDcOmD4HyNuF0ux018HWtw9kX9oaNn-yuK7OSO05f" ] }, "Body": "" } }, { "ID": "1c60ad7f54a134a6", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/key15?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:04 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwFDZpY7QRauNK7ZVmp7tF34FVroO9OMkTKTMWAWIMYkHpwK3DS0RAzvjUpCEWEUnFP" ] }, "Body": "" } }, { "ID": "2ebb1b7fd19de497", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/key14?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:04 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWx1np-K0af9b-nLp2B8sO312kp83S1pOUhze58MY6HHba8KgGcue8CW4wAghTLHTL0P" ] }, "Body": "" } }, { "ID": "60237f7dc7f9eaeb", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/key13?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:04 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwtDzD153UNCe43JntMcT86qVdjByD34Mlas-zz5ETpSgRIAYZBN1Hi3scGXZBytNsq" ] }, "Body": "" } }, { "ID": "da1a8526944e55c0", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/key12?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:04 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWx_KcA10k3Ay7GXUJ8Fhm12fn7v-vyppgBwQDk6WUczuIscb06px4R4FygXnrXTK2MC" ] }, "Body": "" } }, { "ID": "6bbb34a92f500a56", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/key11?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:04 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzrXqql6LUNRMnQj88uWoM-5azG-MyNgM79E1NXm_tE9hzplWkCAMWX4wJNlBGl2nFk" ] }, "Body": "" } }, { "ID": "5f370356f6a5dde7", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/key10?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:04 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWy6eTZfLWJcCTjfPWN1ri2uWY3DweiES-FbFTuePTJnew9O-LwStaiOeM8D4h2n1Bj5" ] }, "Body": "" } }, { "ID": "fff57081013c8ce1", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/key9?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:05 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxX-XzyZlSwkC8TOjQACHYsGT74jj9pGTPK4Qmr4XlduDZY0At0X52_W0kS8t8AreWr" ] }, "Body": "" } }, { "ID": "2d74d88abc903afc", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/key8?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:05 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWw9jzdQS_Q05ned7coHOjz0POkyVUFY3q9eSlbigzLwtEwpgkjetIyxWcL0lrewLTgk" ] }, "Body": "" } }, { "ID": "b85dba38eee9824b", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/key7?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:05 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwIxDsEP5VnzYaEe5E7DRuKRAYI_7wAKtPnSWezbFq6GOMZg88l6HpYmMTeqyAUiYUw" ] }, "Body": "" } }, { "ID": "4f87c371c579e2ae", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/key6?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:05 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwqfFuMshH6TZmVHNGKQSOoxx1MPtqKVIxViVrVQEsRr4bYAHuD3RE9zxXGqn4LGVfy" ] }, "Body": "" } }, { "ID": "afc6f4eae605e1cd", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/key5?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:05 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzbfOalPYWb93XCjcRfzi2gRZZYMqL2tpa2iZowgc3uIjRg4c206gfpLTjHo6RZPzQw" ] }, "Body": "" } }, { "ID": "b1f8906ec96aa33f", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/key4?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:05 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWw4SEU1yxNky6VGJxQ0AgWxbioZRVvC2EqBupcepxb7N3_md8-CWYiBoadvNwxcLXMO" ] }, "Body": "" } }, { "ID": "570445d41be10686", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/key3?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:05 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxxfxpckQFCvbwH5JK08vFkfhir5roCkKeQruv_ljgQS-bZMtE-UXpm91pGEaazAIi_" ] }, "Body": "" } }, { "ID": "bdae596b0613d90b", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/key2?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:05 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWz3Hc3pDRco3tz9jyGKQJNpUgS9VaIBjtzsWmnCY0jUgA1twqYLMVp_84RNEjphtFRM" ] }, "Body": "" } }, { "ID": "d354d182bc21a121", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/key1?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:05 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzDSGNGlyfHCexLTEQZPf9dHoWqbwX1rU29PF0-CwkSVzvaX899jOf9NRvxqvt-REZo" ] }, "Body": "" } }, { "ID": "6ddde0d1dc0c165d", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/key0?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:05 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwbzUhju2xtliEl7cZKEjK8eQd0pb3nZ69cwhZch82_JGqgSxK9j6sFBmoHXJ7yiju1" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestCopy/NonExistentSourceFails.replay ================================================ { "Initial": "AQAAAA7hTghYLo0cawAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "ad9a5ec97c69faab", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/does-not-exist/rewriteTo/b/go-cloud-blob-test-bucket/o/blob-for-copying-dest?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "211" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:08 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwEqY7tyaAykzYS3ERXto23NMvWBKJQXDrD130VImb9-uuBkq2clLyTu8O7v1FhYhIj" ] }, "Body": "eyJlcnJvciI6eyJjb2RlIjo0MDQsIm1lc3NhZ2UiOiJObyBzdWNoIG9iamVjdDogZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9kb2VzLW5vdC1leGlzdCIsImVycm9ycyI6W3sibWVzc2FnZSI6Ik5vIHN1Y2ggb2JqZWN0OiBnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2RvZXMtbm90LWV4aXN0IiwiZG9tYWluIjoiZ2xvYmFsIiwicmVhc29uIjoibm90Rm91bmQifV19fQ==" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestCopy/Works.replay ================================================ { "Initial": "AQAAAA7hTghYNgZ+lgAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "a3e026f9ee99270c", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-copying-src\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY2FjaGVDb250cm9sIjoibm8tY2FjaGUiLCJjb250ZW50RGlzcG9zaXRpb24iOiJpbmxpbmUiLCJjb250ZW50RW5jb2RpbmciOiJpZGVudGl0eSIsImNvbnRlbnRMYW5ndWFnZSI6ImVuIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluIiwiY3JjMzJjIjoiYVIycUx3PT0iLCJtZDVIYXNoIjoic1FxTnNXVGdkVUVGdDZtYjV5NC81UT09IiwibWV0YWRhdGEiOnsiZm9vIjoiYmFyIn0sIm5hbWUiOiJibG9iLWZvci1jb3B5aW5nLXNyYyJ9Cg==", "SGVsbG8gV29ybGQ=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "927" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:09 GMT" ], "Etag": [ "CO7r0/2erJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWw0DtlfAuFWlScPZBjfE1yY8yGwpAukSB49qDhf5CMYeSW25ZCdDMVK8xwkmpOEi2PH" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItY29weWluZy1zcmMvMTc3MzkzMjg4OTA0NDQ2MiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1jb3B5aW5nLXNyYyIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWNvcHlpbmctc3JjP2dlbmVyYXRpb249MTc3MzkzMjg4OTA0NDQ2MiZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItY29weWluZy1zcmMiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzI4ODkwNDQ0NjIiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiIxMSIsIm1kNUhhc2giOiJzUXFOc1dUZ2RVRUZ0Nm1iNXk0LzVRPT0iLCJjb250ZW50RW5jb2RpbmciOiJpZGVudGl0eSIsImNvbnRlbnREaXNwb3NpdGlvbiI6ImlubGluZSIsImNvbnRlbnRMYW5ndWFnZSI6ImVuIiwiY2FjaGVDb250cm9sIjoibm8tY2FjaGUiLCJjcmMzMmMiOiJhUjJxTHc9PSIsImV0YWciOiJDTzdyMC8yZXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjA5LjA1M1oiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowOS4wNTNaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjA5LjA1M1oiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNTowODowOS4wNTNaIiwibWV0YWRhdGEiOnsiZm9vIjoiYmFyIn19" } }, { "ID": "5c9933565ef261a4", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-copying-src?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "927" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:09 GMT" ], "Etag": [ "CO7r0/2erJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxYgvlgtHLMrNTfe8eso3YgJO4VjOAZlHc0oEVypcFS7iq6tAzw8Qk5AXclytmvkQVH" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItY29weWluZy1zcmMvMTc3MzkzMjg4OTA0NDQ2MiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1jb3B5aW5nLXNyYyIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWNvcHlpbmctc3JjP2dlbmVyYXRpb249MTc3MzkzMjg4OTA0NDQ2MiZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItY29weWluZy1zcmMiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzI4ODkwNDQ0NjIiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiIxMSIsIm1kNUhhc2giOiJzUXFOc1dUZ2RVRUZ0Nm1iNXk0LzVRPT0iLCJjb250ZW50RW5jb2RpbmciOiJpZGVudGl0eSIsImNvbnRlbnREaXNwb3NpdGlvbiI6ImlubGluZSIsImNvbnRlbnRMYW5ndWFnZSI6ImVuIiwiY2FjaGVDb250cm9sIjoibm8tY2FjaGUiLCJjcmMzMmMiOiJhUjJxTHc9PSIsImV0YWciOiJDTzdyMC8yZXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjA5LjA1M1oiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowOS4wNTNaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjA5LjA1M1oiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNTowODowOS4wNTNaIiwibWV0YWRhdGEiOnsiZm9vIjoiYmFyIn19" } }, { "ID": "cbe9e3558f6d090a", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-copying-dest-exists\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoiaGlCZ2RBPT0iLCJtZDVIYXNoIjoib1BxYWZYSkExY1h1dlhDSmxEREZsdz09IiwibmFtZSI6ImJsb2ItZm9yLWNvcHlpbmctZGVzdC1leGlzdHMifQo=", "Y2xvYmJlciBtZQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "841" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:09 GMT" ], "Etag": [ "CJ/a3v2erJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxpQkLwpZ1_od-oDRXdkbUJy6vL4UfcH2WpndCKDEvV1MFipOjoEWClzPDXWjkmeFQH" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItY29weWluZy1kZXN0LWV4aXN0cy8xNzczOTMyODg5MjIyNDMxIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWNvcHlpbmctZGVzdC1leGlzdHMiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1jb3B5aW5nLWRlc3QtZXhpc3RzP2dlbmVyYXRpb249MTc3MzkzMjg4OTIyMjQzMSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItY29weWluZy1kZXN0LWV4aXN0cyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjg4OTIyMjQzMSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjEwIiwibWQ1SGFzaCI6Im9QcWFmWEpBMWNYdXZYQ0psRERGbHc9PSIsImNyYzMyYyI6ImhpQmdkQT09IiwiZXRhZyI6IkNKL2EzdjJlckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDkuMjMwWiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjA5LjIzMFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDkuMjMwWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjA5LjIzMFoifQ==" } }, { "ID": "a2940c741c603947", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-copying-src/rewriteTo/b/go-cloud-blob-test-bucket/o/blob-for-copying-dest?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "1034" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:09 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyRHMu8Nc0deHuTu9-9CyOUhUhGx5szLyrk0xYZ1MtSXatCrE79vf2IC0XsxTk9NPek" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiMTEiLCJvYmplY3RTaXplIjoiMTEiLCJkb25lIjp0cnVlLCJyZXNvdXJjZSI6eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItY29weWluZy1kZXN0LzE3NzM5MzI4ODkzMzA0MDIiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItY29weWluZy1kZXN0IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItY29weWluZy1kZXN0P2dlbmVyYXRpb249MTc3MzkzMjg4OTMzMDQwMiZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItY29weWluZy1kZXN0IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMyODg5MzMwNDAyIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluIiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiMTEiLCJtZDVIYXNoIjoic1FxTnNXVGdkVUVGdDZtYjV5NC81UT09IiwiY29udGVudEVuY29kaW5nIjoiaWRlbnRpdHkiLCJjb250ZW50RGlzcG9zaXRpb24iOiJpbmxpbmUiLCJjb250ZW50TGFuZ3VhZ2UiOiJlbiIsImNhY2hlQ29udHJvbCI6Im5vLWNhY2hlIiwiY3JjMzJjIjoiYVIycUx3PT0iLCJldGFnIjoiQ09LbDVmMmVySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowOS4zMzlaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDkuMzM5WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowOS4zMzlaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDkuMzM5WiIsIm1ldGFkYXRhIjp7ImZvbyI6ImJhciJ9fX0=" } }, { "ID": "056857218e757b00", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-copying-dest", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "no-cache" ], "Content-Disposition": [ "inline" ], "Content-Language": [ "en" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 19 Mar 2026 15:08:09 GMT" ], "Etag": [ "\"b10a8db164e0754105b7a99be72e3fe5\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:08:09 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932889330402" ], "X-Goog-Hash": [ "crc32c=aR2qLw==", "md5=sQqNsWTgdUEFt6mb5y4/5Q==" ], "X-Goog-Meta-Foo": [ "bar" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "11" ], "X-Guploader-Uploadid": [ "AGQBYWwfC3XsBTAipydowJMwAhpEUPOPSNweZOJFQKJLnoPiVSiqTo5nHgNxjQPTHQ8Gg1vk" ] }, "Body": "SGVsbG8gV29ybGQ=" } }, { "ID": "d0cc4b261d9bd5bb", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-copying-dest?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "931" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:09 GMT" ], "Etag": [ "COKl5f2erJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWz4mR6OeMWzS5QtxXxCFOf_Q76VBey1aSU40k1106QNIldrTSG_3V7pC8TXNhT0jGpJ" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItY29weWluZy1kZXN0LzE3NzM5MzI4ODkzMzA0MDIiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItY29weWluZy1kZXN0IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItY29weWluZy1kZXN0P2dlbmVyYXRpb249MTc3MzkzMjg4OTMzMDQwMiZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItY29weWluZy1kZXN0IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMyODg5MzMwNDAyIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluIiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiMTEiLCJtZDVIYXNoIjoic1FxTnNXVGdkVUVGdDZtYjV5NC81UT09IiwiY29udGVudEVuY29kaW5nIjoiaWRlbnRpdHkiLCJjb250ZW50RGlzcG9zaXRpb24iOiJpbmxpbmUiLCJjb250ZW50TGFuZ3VhZ2UiOiJlbiIsImNhY2hlQ29udHJvbCI6Im5vLWNhY2hlIiwiY3JjMzJjIjoiYVIycUx3PT0iLCJldGFnIjoiQ09LbDVmMmVySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowOS4zMzlaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDkuMzM5WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowOS4zMzlaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDkuMzM5WiIsIm1ldGFkYXRhIjp7ImZvbyI6ImJhciJ9fQ==" } }, { "ID": "ad1a978bffbf728a", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-copying-src/rewriteTo/b/go-cloud-blob-test-bucket/o/blob-for-copying-dest-exists?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "1062" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:09 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzlBvOyKQvTWWKZznvMLbLpjmTttJMk5pT_BVpPgwcOkVdoa9xBoyOX2YgfSFlJ9fdy" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiMTEiLCJvYmplY3RTaXplIjoiMTEiLCJkb25lIjp0cnVlLCJyZXNvdXJjZSI6eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItY29weWluZy1kZXN0LWV4aXN0cy8xNzczOTMyODg5NTk0ODk1Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWNvcHlpbmctZGVzdC1leGlzdHMiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1jb3B5aW5nLWRlc3QtZXhpc3RzP2dlbmVyYXRpb249MTc3MzkzMjg4OTU5NDg5NSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItY29weWluZy1kZXN0LWV4aXN0cyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjg4OTU5NDg5NSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjExIiwibWQ1SGFzaCI6InNRcU5zV1RnZFVFRnQ2bWI1eTQvNVE9PSIsImNvbnRlbnRFbmNvZGluZyI6ImlkZW50aXR5IiwiY29udGVudERpc3Bvc2l0aW9uIjoiaW5saW5lIiwiY29udGVudExhbmd1YWdlIjoiZW4iLCJjYWNoZUNvbnRyb2wiOiJuby1jYWNoZSIsImNyYzMyYyI6ImFSMnFMdz09IiwiZXRhZyI6IkNJKzQ5ZjJlckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDkuNjA0WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjA5LjYwNFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDkuNjA0WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjA5LjYwNFoiLCJtZXRhZGF0YSI6eyJmb28iOiJiYXIifX19" } }, { "ID": "4154eea4e419eaf0", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-copying-dest-exists", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "no-cache" ], "Content-Disposition": [ "inline" ], "Content-Language": [ "en" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 19 Mar 2026 15:08:09 GMT" ], "Etag": [ "\"b10a8db164e0754105b7a99be72e3fe5\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:08:09 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932889594895" ], "X-Goog-Hash": [ "crc32c=aR2qLw==", "md5=sQqNsWTgdUEFt6mb5y4/5Q==" ], "X-Goog-Meta-Foo": [ "bar" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "11" ], "X-Guploader-Uploadid": [ "AGQBYWwKsLdj-rhTSTYJgtF_KjbQpASCj1wJGoh_MpF8hNVNcYYIWdDauwsAJKhOVSfAy8fm" ] }, "Body": "SGVsbG8gV29ybGQ=" } }, { "ID": "3221bf749fc96ed2", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-copying-dest-exists?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "959" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:09 GMT" ], "Etag": [ "CI+49f2erJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwk4NQ7aV3Z1DYf_U-tlvvYyeylgqCp9XAIggTcmMRHcks9dkoQRhXdl48gc9QwGE0c" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItY29weWluZy1kZXN0LWV4aXN0cy8xNzczOTMyODg5NTk0ODk1Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWNvcHlpbmctZGVzdC1leGlzdHMiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1jb3B5aW5nLWRlc3QtZXhpc3RzP2dlbmVyYXRpb249MTc3MzkzMjg4OTU5NDg5NSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItY29weWluZy1kZXN0LWV4aXN0cyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjg4OTU5NDg5NSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjExIiwibWQ1SGFzaCI6InNRcU5zV1RnZFVFRnQ2bWI1eTQvNVE9PSIsImNvbnRlbnRFbmNvZGluZyI6ImlkZW50aXR5IiwiY29udGVudERpc3Bvc2l0aW9uIjoiaW5saW5lIiwiY29udGVudExhbmd1YWdlIjoiZW4iLCJjYWNoZUNvbnRyb2wiOiJuby1jYWNoZSIsImNyYzMyYyI6ImFSMnFMdz09IiwiZXRhZyI6IkNJKzQ5ZjJlckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDkuNjA0WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjA5LjYwNFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDkuNjA0WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjA5LjYwNFoiLCJtZXRhZGF0YSI6eyJmb28iOiJiYXIifX0=" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestDelete/NonExistentFails.replay ================================================ { "Initial": "AQAAAA7hTghZLfCE1AAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "b2942e7ed04903eb", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/does-not-exist?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "211" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:09 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwCNNghd2XlchQObM7QzKDAcpaB1C6DlhnlLIl3euF-kxZiLTwMqTEircU4aKGllBZ5" ] }, "Body": "eyJlcnJvciI6eyJjb2RlIjo0MDQsIm1lc3NhZ2UiOiJObyBzdWNoIG9iamVjdDogZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9kb2VzLW5vdC1leGlzdCIsImVycm9ycyI6W3sibWVzc2FnZSI6Ik5vIHN1Y2ggb2JqZWN0OiBnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2RvZXMtbm90LWV4aXN0IiwiZG9tYWluIjoiZ2xvYmFsIiwicmVhc29uIjoibm90Rm91bmQifV19fQ==" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestDelete/Works.replay ================================================ { "Initial": "AQAAAA7hTghZNal7twAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "221b690e596b560c", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-deleting\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoiY3JVZmVBPT0iLCJtZDVIYXNoIjoiUGlXV0NubmJ4cHRuVE5Uc1o2Y3NZZz09IiwibmFtZSI6ImJsb2ItZm9yLWRlbGV0aW5nIn0K", "SGVsbG8gd29ybGQ=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "797" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:10 GMT" ], "Etag": [ "CNS3kP6erJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzh3PJkgZ_QxriGnidUHimh3IbPlsai2EFV6kr_DaoKK0P5ry0phoI40zpCnQaVt9f6" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGVsZXRpbmcvMTc3MzkzMjg5MDAzNzIwNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxldGluZyIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGV0aW5nP2dlbmVyYXRpb249MTc3MzkzMjg5MDAzNzIwNCZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGVsZXRpbmciLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzI4OTAwMzcyMDQiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiIxMSIsIm1kNUhhc2giOiJQaVdXQ25uYnhwdG5UTlRzWjZjc1lnPT0iLCJjcmMzMmMiOiJjclVmZUE9PSIsImV0YWciOiJDTlMza1A2ZXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjEwLjAzOVoiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODoxMC4wMzlaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjEwLjAzOVoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNTowODoxMC4wMzlaIn0=" } }, { "ID": "f16ac9d12738d583", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-deleting?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:10 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzYLM3k66fVrTzln9XV3hnga9V0sN37n-Y9CHO6PvIk8DfhEBQl3In6bWdoet3gHbF4" ] }, "Body": "" } }, { "ID": "66ed32fd1ce5ad04", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-deleting", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "205" ], "Content-Type": [ "application/xml; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:10 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "X-Guploader-Uploadid": [ "AGQBYWwWJdsbCIvHfuFzCiTxveX4967B88S0LMUcqRKw-oyEy29f9SrZGMDkEqOIPm0NNeHF" ] }, "Body": "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+Tm9TdWNoS2V5PC9Db2RlPjxNZXNzYWdlPlRoZSBzcGVjaWZpZWQga2V5IGRvZXMgbm90IGV4aXN0LjwvTWVzc2FnZT48RGV0YWlscz5ObyBzdWNoIG9iamVjdDogZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kZWxldGluZzwvRGV0YWlscz48L0Vycm9yPg==" } }, { "ID": "78fab5e939924c8b", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-deleting?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "217" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:10 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyve9mkdNZadWUzhvRyhES7F5VqS2Ndc71KTgDvZxkEwx7wUE32p5vpI7MvZSN0m9oH" ] }, "Body": "eyJlcnJvciI6eyJjb2RlIjo0MDQsIm1lc3NhZ2UiOiJObyBzdWNoIG9iamVjdDogZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kZWxldGluZyIsImVycm9ycyI6W3sibWVzc2FnZSI6Ik5vIHN1Y2ggb2JqZWN0OiBnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2Jsb2ItZm9yLWRlbGV0aW5nIiwiZG9tYWluIjoiZ2xvYmFsIiwicmVhc29uIjoibm90Rm91bmQifV19fQ==" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestDirsWithCharactersBeforeDelimiter.replay ================================================ { "Initial": "AQAAAA7hTghJH31MvQAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "65b7ffc9099fb1ca", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "5686" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:53 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWw_MMZJxPXVWv1u5g7E2G-zREknBu9EJahWETD7ZdOQJ27hwctWO1KJIk_cy51SudMS" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kLzE2NDQzNjc0MDYzMjA5OTYiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIlMkZkIiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIlMkZkP2dlbmVyYXRpb249MTY0NDM2NzQwNjMyMDk5NiZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZCIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTY0NDM2NzQwNjMyMDk5NiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ09TYWlmbXg4ZlVDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNi4zMjNaIiwidXBkYXRlZCI6IjIwMjItMDItMDlUMDA6NDM6MjYuMzIzWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNi4zMjNaIiwidGltZUZpbmFsaXplZCI6IjIwMjItMDItMDlUMDA6NDM6MjYuMzIzWiJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2Jsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL2RpcjEvdGVzdEZpbGUxZGlyMS8xNjQ0MzY3NDA2MDY0MTE1Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyJTJGZGlyMSUyRnRlc3RGaWxlMWRpcjEiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlciUyRmRpcjElMkZ0ZXN0RmlsZTFkaXIxP2dlbmVyYXRpb249MTY0NDM2NzQwNjA2NDExNSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMS90ZXN0RmlsZTFkaXIxIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNjQ0MzY3NDA2MDY0MTE1IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDUFBEK2ZpeDhmVUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI2LjA2NVoiLCJ1cGRhdGVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNi4wNjVaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI2LjA2NVoiLCJ0aW1lRmluYWxpemVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNi4wNjVaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMi90ZXN0RmlsZTFkaXIyLzE2NDQzNjc0MDYxNDU5MTgiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIlMkZkaXIyJTJGdGVzdEZpbGUxZGlyMiIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyJTJGZGlyMiUyRnRlc3RGaWxlMWRpcjI/Z2VuZXJhdGlvbj0xNjQ0MzY3NDA2MTQ1OTE4JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIyL3Rlc3RGaWxlMWRpcjIiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE2NDQzNjc0MDYxNDU5MTgiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNQN0Mvdml4OGZVQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjItMDItMDlUMDA6NDM6MjYuMTQ3WiIsInVwZGF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI2LjE0N1oiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjItMDItMDlUMDA6NDM6MjYuMTQ3WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI2LjE0N1oifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90LS90Li8xNjQ0MzY3NDA1OTcxMzMyIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyJTJGdC0lMkZ0LiIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyJTJGdC0lMkZ0Lj9nZW5lcmF0aW9uPTE2NDQzNjc0MDU5NzEzMzImYWx0PW1lZGlhIiwibmFtZSI6ImJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QtL3QuIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNjQ0MzY3NDA1OTcxMzMyIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDSVR2OC9peDhmVUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI1Ljk3NFoiLCJ1cGRhdGVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNS45NzRaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI1Ljk3NFoiLCJ0aW1lRmluYWxpemVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNS45NzRaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdC90L3QvMTY0NDM2NzQwNTg1NjU2MSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlciUyRnQlMkZ0JTJGdCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyJTJGdCUyRnQlMkZ0P2dlbmVyYXRpb249MTY0NDM2NzQwNTg1NjU2MSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdC90L3QiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE2NDQzNjc0MDU4NTY1NjEiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNMSHU3UGl4OGZVQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjItMDItMDlUMDA6NDM6MjUuODU4WiIsInVwZGF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI1Ljg1OFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjItMDItMDlUMDA6NDM6MjUuODU4WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI1Ljg1OFoifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90ZXN0RmlsZTEvMTY0NDM2NzQwNTcxOTEzNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlciUyRnRlc3RGaWxlMSIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyJTJGdGVzdEZpbGUxP2dlbmVyYXRpb249MTY0NDM2NzQwNTcxOTEzNSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdGVzdEZpbGUxIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNjQ0MzY3NDA1NzE5MTM1IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTis4NVBpeDhmVUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI1LjcyMFoiLCJ1cGRhdGVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNS43MjBaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI1LjcyMFoiLCJ0aW1lRmluYWxpemVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNS43MjBaIn1dfQ==" } }, { "ID": "d8abb8ca7ff1fd80", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%2F\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=10\u0026pageToken=\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2086" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:53 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyaOERn6JbTN-oxEarMCArtNif-ia0QAXDdiyVxIDGeMBT3MrS8p_Fv-F8hJtUC_CSd" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwicHJlZml4ZXMiOlsiYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMS8iLCJibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIyLyIsImJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QtLyIsImJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QvIl0sIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZC8xNjQ0MzY3NDA2MzIwOTk2Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyJTJGZCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyJTJGZD9nZW5lcmF0aW9uPTE2NDQzNjc0MDYzMjA5OTYmYWx0PW1lZGlhIiwibmFtZSI6ImJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL2QiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE2NDQzNjc0MDYzMjA5OTYiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNPU2FpZm14OGZVQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjItMDItMDlUMDA6NDM6MjYuMzIzWiIsInVwZGF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI2LjMyM1oiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjItMDItMDlUMDA6NDM6MjYuMzIzWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI2LjMyM1oifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90ZXN0RmlsZTEvMTY0NDM2NzQwNTcxOTEzNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlciUyRnRlc3RGaWxlMSIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyJTJGdGVzdEZpbGUxP2dlbmVyYXRpb249MTY0NDM2NzQwNTcxOTEzNSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdGVzdEZpbGUxIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNjQ0MzY3NDA1NzE5MTM1IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTis4NVBpeDhmVUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI1LjcyMFoiLCJ1cGRhdGVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNS43MjBaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI1LjcyMFoiLCJ0aW1lRmluYWxpemVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNS43MjBaIn1dfQ==" } }, { "ID": "84ee6c20eb281cfa", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%2F\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=9\u0026pageToken=\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2086" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:53 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyfM6L3OgZilx1KSN8jg0qxUK3K59-XseAhWh5vrLgR3SS63nswT_obQA0fb7fViIE3" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwicHJlZml4ZXMiOlsiYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMS8iLCJibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIyLyIsImJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QtLyIsImJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QvIl0sIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZC8xNjQ0MzY3NDA2MzIwOTk2Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyJTJGZCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyJTJGZD9nZW5lcmF0aW9uPTE2NDQzNjc0MDYzMjA5OTYmYWx0PW1lZGlhIiwibmFtZSI6ImJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL2QiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE2NDQzNjc0MDYzMjA5OTYiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNPU2FpZm14OGZVQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjItMDItMDlUMDA6NDM6MjYuMzIzWiIsInVwZGF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI2LjMyM1oiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjItMDItMDlUMDA6NDM6MjYuMzIzWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI2LjMyM1oifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90ZXN0RmlsZTEvMTY0NDM2NzQwNTcxOTEzNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlciUyRnRlc3RGaWxlMSIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyJTJGdGVzdEZpbGUxP2dlbmVyYXRpb249MTY0NDM2NzQwNTcxOTEzNSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdGVzdEZpbGUxIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNjQ0MzY3NDA1NzE5MTM1IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTis4NVBpeDhmVUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI1LjcyMFoiLCJ1cGRhdGVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNS43MjBaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI1LjcyMFoiLCJ0aW1lRmluYWxpemVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNS43MjBaIn1dfQ==" } }, { "ID": "b01b4571eadccfbc", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%2F\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=8\u0026pageToken=\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2086" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:53 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWy63yljuEbCQtRDUN66viM1GoXbUSfvhUhOCL0m_-XEhGqb7Q-r-qwxZNorAJvSdcx5" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwicHJlZml4ZXMiOlsiYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMS8iLCJibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIyLyIsImJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QtLyIsImJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QvIl0sIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZC8xNjQ0MzY3NDA2MzIwOTk2Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyJTJGZCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyJTJGZD9nZW5lcmF0aW9uPTE2NDQzNjc0MDYzMjA5OTYmYWx0PW1lZGlhIiwibmFtZSI6ImJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL2QiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE2NDQzNjc0MDYzMjA5OTYiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNPU2FpZm14OGZVQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjItMDItMDlUMDA6NDM6MjYuMzIzWiIsInVwZGF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI2LjMyM1oiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjItMDItMDlUMDA6NDM6MjYuMzIzWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI2LjMyM1oifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90ZXN0RmlsZTEvMTY0NDM2NzQwNTcxOTEzNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlciUyRnRlc3RGaWxlMSIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyJTJGdGVzdEZpbGUxP2dlbmVyYXRpb249MTY0NDM2NzQwNTcxOTEzNSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdGVzdEZpbGUxIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNjQ0MzY3NDA1NzE5MTM1IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTis4NVBpeDhmVUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI1LjcyMFoiLCJ1cGRhdGVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNS43MjBaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI1LjcyMFoiLCJ0aW1lRmluYWxpemVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNS43MjBaIn1dfQ==" } }, { "ID": "4352dcd168745b05", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%2F\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=7\u0026pageToken=\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2086" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:54 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWz0JND7aVfRiX49xvVivwqcbxC3YXlR1qibqK6ZaNbv5C0mCs0glPYsDu4dRk7Dyts_" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwicHJlZml4ZXMiOlsiYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMS8iLCJibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIyLyIsImJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QtLyIsImJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QvIl0sIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZC8xNjQ0MzY3NDA2MzIwOTk2Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyJTJGZCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyJTJGZD9nZW5lcmF0aW9uPTE2NDQzNjc0MDYzMjA5OTYmYWx0PW1lZGlhIiwibmFtZSI6ImJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL2QiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE2NDQzNjc0MDYzMjA5OTYiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNPU2FpZm14OGZVQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjItMDItMDlUMDA6NDM6MjYuMzIzWiIsInVwZGF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI2LjMyM1oiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjItMDItMDlUMDA6NDM6MjYuMzIzWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI2LjMyM1oifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90ZXN0RmlsZTEvMTY0NDM2NzQwNTcxOTEzNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlciUyRnRlc3RGaWxlMSIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyJTJGdGVzdEZpbGUxP2dlbmVyYXRpb249MTY0NDM2NzQwNTcxOTEzNSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdGVzdEZpbGUxIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNjQ0MzY3NDA1NzE5MTM1IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTis4NVBpeDhmVUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI1LjcyMFoiLCJ1cGRhdGVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNS43MjBaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI1LjcyMFoiLCJ0aW1lRmluYWxpemVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNS43MjBaIn1dfQ==" } }, { "ID": "3c616a07c14b6e2c", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%2F\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=6\u0026pageToken=\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2086" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:54 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxOZFaZO7n1-EZksCYJsMMJLfS93NSsQcyp99s1sTiEUGLMxoYAc94PvOUJSsY_q_zt" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwicHJlZml4ZXMiOlsiYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMS8iLCJibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIyLyIsImJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QtLyIsImJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QvIl0sIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZC8xNjQ0MzY3NDA2MzIwOTk2Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyJTJGZCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyJTJGZD9nZW5lcmF0aW9uPTE2NDQzNjc0MDYzMjA5OTYmYWx0PW1lZGlhIiwibmFtZSI6ImJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL2QiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE2NDQzNjc0MDYzMjA5OTYiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNPU2FpZm14OGZVQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjItMDItMDlUMDA6NDM6MjYuMzIzWiIsInVwZGF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI2LjMyM1oiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjItMDItMDlUMDA6NDM6MjYuMzIzWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI2LjMyM1oifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90ZXN0RmlsZTEvMTY0NDM2NzQwNTcxOTEzNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlciUyRnRlc3RGaWxlMSIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyJTJGdGVzdEZpbGUxP2dlbmVyYXRpb249MTY0NDM2NzQwNTcxOTEzNSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdGVzdEZpbGUxIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNjQ0MzY3NDA1NzE5MTM1IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTis4NVBpeDhmVUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI1LjcyMFoiLCJ1cGRhdGVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNS43MjBaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI1LjcyMFoiLCJ0aW1lRmluYWxpemVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNS43MjBaIn1dfQ==" } }, { "ID": "3522412fd07f97c1", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%2F\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=5\u0026pageToken=\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "1232" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:54 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwX1Igm-YUFbIBWKPPLR6L2K9x6y4XyEXxkPIVYbZKcYMtz743jGUqebiRiBEIHDuzm" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNpeGliRzlpTFdadmNpMWthWEp6TFhkcGRHZ3RZMmhoY25NdFltVm1iM0psTFdSbGJHbHRhWFJsY2k5MEx3PT0iLCJwcmVmaXhlcyI6WyJibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIxLyIsImJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL2RpcjIvIiwiYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdC0vIiwiYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdC8iXSwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kLzE2NDQzNjc0MDYzMjA5OTYiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIlMkZkIiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIlMkZkP2dlbmVyYXRpb249MTY0NDM2NzQwNjMyMDk5NiZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZCIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTY0NDM2NzQwNjMyMDk5NiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ09TYWlmbXg4ZlVDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNi4zMjNaIiwidXBkYXRlZCI6IjIwMjItMDItMDlUMDA6NDM6MjYuMzIzWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNi4zMjNaIiwidGltZUZpbmFsaXplZCI6IjIwMjItMDItMDlUMDA6NDM6MjYuMzIzWiJ9XX0=" } }, { "ID": "3fdf3fbcee625810", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%2F\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=5\u0026pageToken=CixibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90Lw%3D%3D\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "973" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:54 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwHAd1jbxApC_Ly5Gq8zFh4qAdyUYi0KLPxIKY2svGzliEQRAT-Y6fZGaZ5i7gb1bvY" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90ZXN0RmlsZTEvMTY0NDM2NzQwNTcxOTEzNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlciUyRnRlc3RGaWxlMSIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyJTJGdGVzdEZpbGUxP2dlbmVyYXRpb249MTY0NDM2NzQwNTcxOTEzNSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdGVzdEZpbGUxIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNjQ0MzY3NDA1NzE5MTM1IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTis4NVBpeDhmVUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI1LjcyMFoiLCJ1cGRhdGVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNS43MjBaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI1LjcyMFoiLCJ0aW1lRmluYWxpemVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNS43MjBaIn1dfQ==" } }, { "ID": "0343d9e2450dac5b", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%2F\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=4\u0026pageToken=\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "1185" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:54 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzbvrdN2q1-5HGsiW3KTFypoVa77rDFrTvhc_KAkjkXtG68FU3tr-txYcOz5BpHDI4y" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNpMWliRzlpTFdadmNpMWthWEp6TFhkcGRHZ3RZMmhoY25NdFltVm1iM0psTFdSbGJHbHRhWFJsY2k5MExTOD0iLCJwcmVmaXhlcyI6WyJibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIxLyIsImJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL2RpcjIvIiwiYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdC0vIl0sIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZC8xNjQ0MzY3NDA2MzIwOTk2Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyJTJGZCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyJTJGZD9nZW5lcmF0aW9uPTE2NDQzNjc0MDYzMjA5OTYmYWx0PW1lZGlhIiwibmFtZSI6ImJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL2QiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE2NDQzNjc0MDYzMjA5OTYiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNPU2FpZm14OGZVQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjItMDItMDlUMDA6NDM6MjYuMzIzWiIsInVwZGF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI2LjMyM1oiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjItMDItMDlUMDA6NDM6MjYuMzIzWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI2LjMyM1oifV19" } }, { "ID": "bfa05eec1960e42c", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%2F\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=4\u0026pageToken=Ci1ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90LS8%3D\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "1033" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:54 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxQGLjYg7zSxhAtAhk5HsXOGfhJ3H0jTrAQYJI4fKc1zzc4Wh2thDdren8N2400wvE3" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwicHJlZml4ZXMiOlsiYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdC8iXSwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90ZXN0RmlsZTEvMTY0NDM2NzQwNTcxOTEzNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlciUyRnRlc3RGaWxlMSIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyJTJGdGVzdEZpbGUxP2dlbmVyYXRpb249MTY0NDM2NzQwNTcxOTEzNSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdGVzdEZpbGUxIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNjQ0MzY3NDA1NzE5MTM1IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTis4NVBpeDhmVUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI1LjcyMFoiLCJ1cGRhdGVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNS43MjBaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI1LjcyMFoiLCJ0aW1lRmluYWxpemVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNS43MjBaIn1dfQ==" } }, { "ID": "5595c2bd06756dd9", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%2F\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=3\u0026pageToken=\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "1141" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:54 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxpbwdLFzS9iRRoIHgB5lYOrPP70M76HLU88HTjID8cypW60XMy9VqX9p84SeLpqJR7" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNpOWliRzlpTFdadmNpMWthWEp6TFhkcGRHZ3RZMmhoY25NdFltVm1iM0psTFdSbGJHbHRhWFJsY2k5a2FYSXlMdz09IiwicHJlZml4ZXMiOlsiYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMS8iLCJibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIyLyJdLCJpdGVtcyI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2Jsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL2QvMTY0NDM2NzQwNjMyMDk5NiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlciUyRmQiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlciUyRmQ/Z2VuZXJhdGlvbj0xNjQ0MzY3NDA2MzIwOTk2JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNjQ0MzY3NDA2MzIwOTk2IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDT1NhaWZteDhmVUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI2LjMyM1oiLCJ1cGRhdGVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNi4zMjNaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI2LjMyM1oiLCJ0aW1lRmluYWxpemVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNi4zMjNaIn1dfQ==" } }, { "ID": "3662ea3f97c57126", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%2F\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=3\u0026pageToken=Ci9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIyLw%3D%3D\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "1081" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:54 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxIKpATyg41Md2aWgWdoxUoa5ARX9Bll8OF54TTCqFQrJJb8fQhr9KuhaBPDsL1CS0t" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwicHJlZml4ZXMiOlsiYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdC0vIiwiYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdC8iXSwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90ZXN0RmlsZTEvMTY0NDM2NzQwNTcxOTEzNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlciUyRnRlc3RGaWxlMSIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyJTJGdGVzdEZpbGUxP2dlbmVyYXRpb249MTY0NDM2NzQwNTcxOTEzNSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdGVzdEZpbGUxIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNjQ0MzY3NDA1NzE5MTM1IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTis4NVBpeDhmVUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI1LjcyMFoiLCJ1cGRhdGVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNS43MjBaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI1LjcyMFoiLCJ0aW1lRmluYWxpemVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNS43MjBaIn1dfQ==" } }, { "ID": "380d1be881683de9", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%2F\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=2\u0026pageToken=\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "1091" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:54 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxKMxClldqlbJex7rYS-zbbyoMP16vSs8apYXcfGfb_o6gYLEfflZ8A0Urp8tvPlERp" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNpOWliRzlpTFdadmNpMWthWEp6TFhkcGRHZ3RZMmhoY25NdFltVm1iM0psTFdSbGJHbHRhWFJsY2k5a2FYSXhMdz09IiwicHJlZml4ZXMiOlsiYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMS8iXSwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kLzE2NDQzNjc0MDYzMjA5OTYiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIlMkZkIiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIlMkZkP2dlbmVyYXRpb249MTY0NDM2NzQwNjMyMDk5NiZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZCIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTY0NDM2NzQwNjMyMDk5NiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ09TYWlmbXg4ZlVDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNi4zMjNaIiwidXBkYXRlZCI6IjIwMjItMDItMDlUMDA6NDM6MjYuMzIzWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNi4zMjNaIiwidGltZUZpbmFsaXplZCI6IjIwMjItMDItMDlUMDA6NDM6MjYuMzIzWiJ9XX0=" } }, { "ID": "a492b49c962633db", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%2F\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=2\u0026pageToken=Ci9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIxLw%3D%3D\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "220" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:54 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwhLDlkrYdli_gnmaU_YzXovvz-86tKPlv-PSaOzugwHvF27G0SjzfygCWO44bDc3ar" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNpMWliRzlpTFdadmNpMWthWEp6TFhkcGRHZ3RZMmhoY25NdFltVm1iM0psTFdSbGJHbHRhWFJsY2k5MExTOD0iLCJwcmVmaXhlcyI6WyJibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIyLyIsImJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QtLyJdfQ==" } }, { "ID": "e6d9c684a5a585ef", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%2F\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=2\u0026pageToken=Ci1ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90LS8%3D\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "1033" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:54 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWz4Kor7U1N-1lfFi66babo6VzubpnCK4N7QRcqHcJ0bho8jideWTz-l0PaORVpHJbli" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwicHJlZml4ZXMiOlsiYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdC8iXSwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90ZXN0RmlsZTEvMTY0NDM2NzQwNTcxOTEzNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlciUyRnRlc3RGaWxlMSIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyJTJGdGVzdEZpbGUxP2dlbmVyYXRpb249MTY0NDM2NzQwNTcxOTEzNSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdGVzdEZpbGUxIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNjQ0MzY3NDA1NzE5MTM1IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTis4NVBpeDhmVUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI1LjcyMFoiLCJ1cGRhdGVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNS43MjBaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI1LjcyMFoiLCJ0aW1lRmluYWxpemVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNS43MjBaIn1dfQ==" } }, { "ID": "0f64afe86273a291", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%2F\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1\u0026pageToken=\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "1020" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:54 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwEGCUZ2Td22jTgVtCbKn0aJ21GGcHia0oz51o97n9Z_cjqQb4xYHpxfk8K1saydhlP" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNpdGliRzlpTFdadmNpMWthWEp6TFhkcGRHZ3RZMmhoY25NdFltVm1iM0psTFdSbGJHbHRhWFJsY2k5ayIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZC8xNjQ0MzY3NDA2MzIwOTk2Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyJTJGZCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyJTJGZD9nZW5lcmF0aW9uPTE2NDQzNjc0MDYzMjA5OTYmYWx0PW1lZGlhIiwibmFtZSI6ImJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL2QiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE2NDQzNjc0MDYzMjA5OTYiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNPU2FpZm14OGZVQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjItMDItMDlUMDA6NDM6MjYuMzIzWiIsInVwZGF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI2LjMyM1oiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjItMDItMDlUMDA6NDM6MjYuMzIzWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI2LjMyM1oifV19" } }, { "ID": "e4f5b8e9158d5917", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%2F\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1\u0026pageToken=CitibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9k\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "176" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:54 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxcdF6ZGWdi8Evlbq5qv5O6F4UvPXHNnSR_XAI8rfXcj8F1xIbEqhpVHzWXZgPKwbsj" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNpOWliRzlpTFdadmNpMWthWEp6TFhkcGRHZ3RZMmhoY25NdFltVm1iM0psTFdSbGJHbHRhWFJsY2k5a2FYSXhMdz09IiwicHJlZml4ZXMiOlsiYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMS8iXX0=" } }, { "ID": "a2505c5f0e0d8bce", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%2F\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1\u0026pageToken=Ci9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIxLw%3D%3D\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "176" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:55 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzDUMkFwO_v7EJBUKZNBwA2cbo861GSJ6zjjsHn-BHpqq3UCumt-UyhqAAj3k5PLobd" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNpOWliRzlpTFdadmNpMWthWEp6TFhkcGRHZ3RZMmhoY25NdFltVm1iM0psTFdSbGJHbHRhWFJsY2k5a2FYSXlMdz09IiwicHJlZml4ZXMiOlsiYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMi8iXX0=" } }, { "ID": "7d12200e1586c6e3", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%2F\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1\u0026pageToken=Ci9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIyLw%3D%3D\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "170" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:55 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwFeBYKbfc4Vz17nRq116osyTaoMFdsh0Gi6er0e4IAnN7MNxdMeYq186fitVG8X7VK" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNpMWliRzlpTFdadmNpMWthWEp6TFhkcGRHZ3RZMmhoY25NdFltVm1iM0psTFdSbGJHbHRhWFJsY2k5MExTOD0iLCJwcmVmaXhlcyI6WyJibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90LS8iXX0=" } }, { "ID": "6d1f1a9ddbd65de3", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%2F\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1\u0026pageToken=Ci1ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90LS8%3D\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "169" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:55 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwb-ggm-0c8fgQYd8TKAPMdJIBk1TXO6EJxSYkwX3MGUNEZsZ0y_OYdHuokwORG0ui9" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNpeGliRzlpTFdadmNpMWthWEp6TFhkcGRHZ3RZMmhoY25NdFltVm1iM0psTFdSbGJHbHRhWFJsY2k5MEx3PT0iLCJwcmVmaXhlcyI6WyJibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90LyJdfQ==" } }, { "ID": "0200f230d5b4af30", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%2F\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1\u0026pageToken=CixibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90Lw%3D%3D\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "973" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:55 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzkJlyiCktfN9LipsnMMdYEebP65HlE0B_C5HXyyEfPjJuHnct0d0Zm3_vpzOVtOpaZ" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90ZXN0RmlsZTEvMTY0NDM2NzQwNTcxOTEzNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlciUyRnRlc3RGaWxlMSIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyJTJGdGVzdEZpbGUxP2dlbmVyYXRpb249MTY0NDM2NzQwNTcxOTEzNSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdGVzdEZpbGUxIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNjQ0MzY3NDA1NzE5MTM1IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTis4NVBpeDhmVUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI1LjcyMFoiLCJ1cGRhdGVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNS43MjBaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDIyLTAyLTA5VDAwOjQzOjI1LjcyMFoiLCJ0aW1lRmluYWxpemVkIjoiMjAyMi0wMi0wOVQwMDo0MzoyNS43MjBaIn1dfQ==" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestIfNotExist.replay ================================================ { "Initial": "AQAAAA7hTghoJE6RkwAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "a5aa7cddac104cf6", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026ifGenerationMatch=0\u0026name=blob-for-if-not-exist\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0IiwiY3JjMzJjIjoiMzVjNnJnPT0iLCJuYW1lIjoiYmxvYi1mb3ItaWYtbm90LWV4aXN0In0K", "dXAgYW5kIGRvd24=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "792" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:24 GMT" ], "Etag": [ "CP7xkYWfrJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWx97k6LHbzg_i9o9VZD_D3Uxy4WLj8vDy2-4BiXz5k2pJegcGqj9ZuVc4uIxTxN4Cs1" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItaWYtbm90LWV4aXN0LzE3NzM5MzI5MDQ3NDExMTgiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItaWYtbm90LWV4aXN0IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItaWYtbm90LWV4aXN0P2dlbmVyYXRpb249MTc3MzkzMjkwNDc0MTExOCZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItaWYtbm90LWV4aXN0IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMyOTA0NzQxMTE4IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiMTEiLCJtZDVIYXNoIjoiRzNWVFB0V29hZjl2T3VBemJRd3pJQT09IiwiY3JjMzJjIjoiMzVjNnJnPT0iLCJldGFnIjoiQ1A3eGtZV2ZySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNTowODoyNC43NDNaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MjQuNzQzWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODoyNC43NDNaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MDg6MjQuNzQzWiJ9" } }, { "ID": "a044834327ee2a22", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026ifGenerationMatch=0\u0026name=blob-for-if-not-exist\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0IiwiY3JjMzJjIjoiMzVjNnJnPT0iLCJuYW1lIjoiYmxvYi1mb3ItaWYtbm90LWV4aXN0In0K", "dXAgYW5kIGRvd24=" ] }, "Response": { "StatusCode": 412, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "276" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:24 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyao5oOu_reBnkH2h5UBrL3YOvM26VHjUdWdeFr5fw4rZyU-ZiLT6XZkjh4xToeTAtU" ] }, "Body": "eyJlcnJvciI6eyJjb2RlIjo0MTIsIm1lc3NhZ2UiOiJBdCBsZWFzdCBvbmUgb2YgdGhlIHByZS1jb25kaXRpb25zIHlvdSBzcGVjaWZpZWQgZGlkIG5vdCBob2xkLiIsImVycm9ycyI6W3sibWVzc2FnZSI6IkF0IGxlYXN0IG9uZSBvZiB0aGUgcHJlLWNvbmRpdGlvbnMgeW91IHNwZWNpZmllZCBkaWQgbm90IGhvbGQuIiwiZG9tYWluIjoiZ2xvYmFsIiwicmVhc29uIjoiY29uZGl0aW9uTm90TWV0IiwibG9jYXRpb25UeXBlIjoiaGVhZGVyIiwibG9jYXRpb24iOiJJZi1NYXRjaCJ9XX19" } }, { "ID": "a19491cc167e3e4e", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-if-not-exist?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:24 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxYbhnupAmGzkEgPlbSalkNO-i27eOVqBiL-4a7fgiLRxRHHn1dEEA2lNdZYdgz8lzq" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestKeys/ascii-1.replay ================================================ { "Initial": "AQAAAA7hTgxhDFoUVAAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "380a1e4afa07cb8e", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=weird-keys%00%01%02%03%04%05%06%07%08%09__0xa__%0B%0C__0xd__%0E%0F\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibmFtZSI6IndlaXJkLWtleXNcdTAwMDBcdTAwMDFcdTAwMDJcdTAwMDNcdTAwMDRcdTAwMDVcdTAwMDZcdTAwMDdcYlx0X18weGFfX1x1MDAwYlxmX18weGRfX1x1MDAwZVx1MDAwZiJ9Cg==", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "1052" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:21 GMT" ], "Etag": [ "CNPS9OmirJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxXw7sqgtvQuG77wtx-2CV1CQu_j4OdF7oNwGMGe3vfDwWC3fNo1IzVOXJdc1DSi5zt" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5c1x1MDAwMFx1MDAwMVx1MDAwMlx1MDAwM1x1MDAwNFx1MDAwNVx1MDAwNlx1MDAwN1xiXHRfXzB4YV9fXHUwMDBiXGZfXzB4ZF9fXHUwMDBlXHUwMDBmLzE3NzM5MzM5MjEzODA2OTEiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5cyUwMCUwMSUwMiUwMyUwNCUwNSUwNiUwNyUwOCUwOV9fMHhhX18lMEIlMENfXzB4ZF9fJTBFJTBGIiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5cyUwMCUwMSUwMiUwMyUwNCUwNSUwNiUwNyUwOCUwOV9fMHhhX18lMEIlMENfXzB4ZF9fJTBFJTBGP2dlbmVyYXRpb249MTc3MzkzMzkyMTM4MDY5MSZhbHQ9bWVkaWEiLCJuYW1lIjoid2VpcmQta2V5c1x1MDAwMFx1MDAwMVx1MDAwMlx1MDAwM1x1MDAwNFx1MDAwNVx1MDAwNlx1MDAwN1xiXHRfXzB4YV9fXHUwMDBiXGZfXzB4ZF9fXHUwMDBlXHUwMDBmIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMzOTIxMzgwNjkxIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTlBTOU9taXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjIxLjM4OVoiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToyMS4zODlaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjIxLjM4OVoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNToyNToyMS4zODlaIn0=" } }, { "ID": "78769a1d068cc77b", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys%00%01%02%03%04%05%06%07%08%09__0xa__%0B%0C__0xd__%0E%0F", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:21 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:21 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933921380691" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWzfGaYPDEUmLDyZXxsC0OpdfDOdJ_Pq30QZ_N72bpo9oSVzkniEp6LiDOId4YP1-Afk" ] }, "Body": "aGVsbG8=" } }, { "ID": "b29c00b6fb2b413a", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%00%01%02%03%04%05%06%07%08%09__0xa__%0B%0C__0xd__%0E%0F?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "1052" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:21 GMT" ], "Etag": [ "CNPS9OmirJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzoheB_nH7CdtCEoghSTz9fearML-TRmhePK1Q1FDyVn45ObybGFJ6GWVfZXLm0TPNF" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5c1x1MDAwMFx1MDAwMVx1MDAwMlx1MDAwM1x1MDAwNFx1MDAwNVx1MDAwNlx1MDAwN1xiXHRfXzB4YV9fXHUwMDBiXGZfXzB4ZF9fXHUwMDBlXHUwMDBmLzE3NzM5MzM5MjEzODA2OTEiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5cyUwMCUwMSUwMiUwMyUwNCUwNSUwNiUwNyUwOCUwOV9fMHhhX18lMEIlMENfXzB4ZF9fJTBFJTBGIiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5cyUwMCUwMSUwMiUwMyUwNCUwNSUwNiUwNyUwOCUwOV9fMHhhX18lMEIlMENfXzB4ZF9fJTBFJTBGP2dlbmVyYXRpb249MTc3MzkzMzkyMTM4MDY5MSZhbHQ9bWVkaWEiLCJuYW1lIjoid2VpcmQta2V5c1x1MDAwMFx1MDAwMVx1MDAwMlx1MDAwM1x1MDAwNFx1MDAwNVx1MDAwNlx1MDAwN1xiXHRfXzB4YV9fXHUwMDBiXGZfXzB4ZF9fXHUwMDBlXHUwMDBmIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMzOTIxMzgwNjkxIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTlBTOU9taXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjIxLjM4OVoiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToyMS4zODlaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjIxLjM4OVoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNToyNToyMS4zODlaIn0=" } }, { "ID": "914acd3cb142f60d", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys%00%01%02%03%04%05%06%07%08%09__0xa__%0B%0C__0xd__%0E%0F?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:21 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:21 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933921380691" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWyK3uSsy7o_ROBm1PWj2TBocGf-hYMtvkLVc76T4IQI-e8cY4w1ih7LaZL5lxC3Hxho" ] }, "Body": "aGVsbG8=" } }, { "ID": "40aeb0d19bce04ad", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%00%01%02%03%04%05%06%07%08%09__0xa__%0B%0C__0xd__%0E%0F/rewriteTo/b/go-cloud-blob-test-bucket/o/weird-keys%00%01%02%03%04%05%06%07%08%09__0xa__%0B%0C__0xd__%0E%0F-copy?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "1173" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:21 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwuAWRuQmS8Bu2xdW6TfFrl7fiw0eC0kHkZg8q-xyyuN1MGx0pk2Eh9wLYxVEEVDRij" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiNSIsIm9iamVjdFNpemUiOiI1IiwiZG9uZSI6dHJ1ZSwicmVzb3VyY2UiOnsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L3dlaXJkLWtleXNcdTAwMDBcdTAwMDFcdTAwMDJcdTAwMDNcdTAwMDRcdTAwMDVcdTAwMDZcdTAwMDdcYlx0X18weGFfX1x1MDAwYlxmX18weGRfX1x1MDAwZVx1MDAwZi1jb3B5LzE3NzM5MzM5MjE3MTY1OTIiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5cyUwMCUwMSUwMiUwMyUwNCUwNSUwNiUwNyUwOCUwOV9fMHhhX18lMEIlMENfXzB4ZF9fJTBFJTBGLWNvcHkiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzJTAwJTAxJTAyJTAzJTA0JTA1JTA2JTA3JTA4JTA5X18weGFfXyUwQiUwQ19fMHhkX18lMEUlMEYtY29weT9nZW5lcmF0aW9uPTE3NzM5MzM5MjE3MTY1OTImYWx0PW1lZGlhIiwibmFtZSI6IndlaXJkLWtleXNcdTAwMDBcdTAwMDFcdTAwMDJcdTAwMDNcdTAwMDRcdTAwMDVcdTAwMDZcdTAwMDdcYlx0X18weGFfX1x1MDAwYlxmX18weGRfX1x1MDAwZVx1MDAwZi1jb3B5IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMzOTIxNzE2NTkyIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDUENTaWVxaXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjIxLjcxOVoiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToyMS43MTlaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjIxLjcxOVoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNToyNToyMS43MTlaIn19" } }, { "ID": "8821ebca853c36f7", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys%00%01%02%03%04%05%06%07%08%09__0xa__%0B%0C__0xd__%0E%0F-copy", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:21 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:21 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933921716592" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWz-1qcYGPGzrc-oAKnHGXnopfMAdv26LFj5ACPQax8ZqpKwZfCbnl_3uuLr0VOZlBy9" ] }, "Body": "aGVsbG8=" } }, { "ID": "456ae5af37182460", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%00%01%02%03%04%05%06%07%08%09__0xa__%0B%0C__0xd__%0E%0F-copy?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:21 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWz184c8Z_Mja6DNPBxoP-Iw3LN307UPTbwB7bXQB_1Uv8ndE1HBE71gJ8cyYIFWqEvz" ] }, "Body": "" } }, { "ID": "737f5fd2e15f8c4a", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%00%01%02%03%04%05%06%07%08%09__0xa__%0B%0C__0xd__%0E%0F?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:21 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzyOxl3xPlc16Ims8Dk5UWJLyt4fWNmGOha3Q1GVR4Hs2edwWKv7dSHmpIxyuieGsEZ" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestKeys/ascii-2.replay ================================================ { "Initial": "AQAAAA7hTgxbBKKKagAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "4eb0c87ccb78cb1d", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=weird-keys%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibmFtZSI6IndlaXJkLWtleXNcdTAwMTBcdTAwMTFcdTAwMTJcdTAwMTNcdTAwMTRcdTAwMTVcdTAwMTZcdTAwMTdcdTAwMThcdTAwMTlcdTAwMWFcdTAwMWJcdTAwMWNcdTAwMWRcdTAwMWVcdTAwMWYifQo=", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "1056" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:15 GMT" ], "Etag": [ "CPvm/eairJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyxbLHG3FhmsFCNViL-I19VXiWInKgzrHoBjaL5M2Tl5R0ExVpv9FJ4iVZWo1djyqkj" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5c1x1MDAxMFx1MDAxMVx1MDAxMlx1MDAxM1x1MDAxNFx1MDAxNVx1MDAxNlx1MDAxN1x1MDAxOFx1MDAxOVx1MDAxYVx1MDAxYlx1MDAxY1x1MDAxZFx1MDAxZVx1MDAxZi8xNzczOTMzOTE1MjM5MjkxIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL3dlaXJkLWtleXMlMTAlMTElMTIlMTMlMTQlMTUlMTYlMTclMTglMTklMUElMUIlMUMlMUQlMUUlMUYiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzJTEwJTExJTEyJTEzJTE0JTE1JTE2JTE3JTE4JTE5JTFBJTFCJTFDJTFEJTFFJTFGP2dlbmVyYXRpb249MTc3MzkzMzkxNTIzOTI5MSZhbHQ9bWVkaWEiLCJuYW1lIjoid2VpcmQta2V5c1x1MDAxMFx1MDAxMVx1MDAxMlx1MDAxM1x1MDAxNFx1MDAxNVx1MDAxNlx1MDAxN1x1MDAxOFx1MDAxOVx1MDAxYVx1MDAxYlx1MDAxY1x1MDAxZFx1MDAxZVx1MDAxZiIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMzkxNTIzOTI5MSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ1B2bS9lYWlySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxNS4yNDJaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTUuMjQyWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxNS4yNDJaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTUuMjQyWiJ9" } }, { "ID": "650ffcd631e69635", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:15 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:15 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933915239291" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWwh0cYb8IfGn3zNgCRiAWPcWF5J_GamIAzRAeqxRq_upSZHRw1EOnGfobntxrQ6HkDb" ] }, "Body": "aGVsbG8=" } }, { "ID": "31ba3af5309709cc", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "1056" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:15 GMT" ], "Etag": [ "CPvm/eairJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWz5lZGNgqJUqIOdPe8JjNJyXJjmZbZX3DEGwR_xNBWl1rQCb6zPX1xgr3xMfeBn986J" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5c1x1MDAxMFx1MDAxMVx1MDAxMlx1MDAxM1x1MDAxNFx1MDAxNVx1MDAxNlx1MDAxN1x1MDAxOFx1MDAxOVx1MDAxYVx1MDAxYlx1MDAxY1x1MDAxZFx1MDAxZVx1MDAxZi8xNzczOTMzOTE1MjM5MjkxIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL3dlaXJkLWtleXMlMTAlMTElMTIlMTMlMTQlMTUlMTYlMTclMTglMTklMUElMUIlMUMlMUQlMUUlMUYiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzJTEwJTExJTEyJTEzJTE0JTE1JTE2JTE3JTE4JTE5JTFBJTFCJTFDJTFEJTFFJTFGP2dlbmVyYXRpb249MTc3MzkzMzkxNTIzOTI5MSZhbHQ9bWVkaWEiLCJuYW1lIjoid2VpcmQta2V5c1x1MDAxMFx1MDAxMVx1MDAxMlx1MDAxM1x1MDAxNFx1MDAxNVx1MDAxNlx1MDAxN1x1MDAxOFx1MDAxOVx1MDAxYVx1MDAxYlx1MDAxY1x1MDAxZFx1MDAxZVx1MDAxZiIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMzkxNTIzOTI5MSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ1B2bS9lYWlySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxNS4yNDJaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTUuMjQyWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxNS4yNDJaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTUuMjQyWiJ9" } }, { "ID": "d4e7c9b1831f614a", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:15 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:15 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933915239291" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWw0RQ5nOgoh7mpS5OIJkHm6GnntNgvaBmSAM5VADL4wfRietJe4gGZwxtZvyfdZKuq_" ] }, "Body": "aGVsbG8=" } }, { "ID": "85ca2e7dbb8c86c3", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F/rewriteTo/b/go-cloud-blob-test-bucket/o/weird-keys%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F-copy?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "1177" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:15 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWz4RsMG19MbXtOwDhSbKVKn22wl8cEGC7IAe99yPU_rEjeoH9p8l16xXsUc7zyUb-kG" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiNSIsIm9iamVjdFNpemUiOiI1IiwiZG9uZSI6dHJ1ZSwicmVzb3VyY2UiOnsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L3dlaXJkLWtleXNcdTAwMTBcdTAwMTFcdTAwMTJcdTAwMTNcdTAwMTRcdTAwMTVcdTAwMTZcdTAwMTdcdTAwMThcdTAwMTlcdTAwMWFcdTAwMWJcdTAwMWNcdTAwMWRcdTAwMWVcdTAwMWYtY29weS8xNzczOTMzOTE1NTcwMjUwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL3dlaXJkLWtleXMlMTAlMTElMTIlMTMlMTQlMTUlMTYlMTclMTglMTklMUElMUIlMUMlMUQlMUUlMUYtY29weSIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL3dlaXJkLWtleXMlMTAlMTElMTIlMTMlMTQlMTUlMTYlMTclMTglMTklMUElMUIlMUMlMUQlMUUlMUYtY29weT9nZW5lcmF0aW9uPTE3NzM5MzM5MTU1NzAyNTAmYWx0PW1lZGlhIiwibmFtZSI6IndlaXJkLWtleXNcdTAwMTBcdTAwMTFcdTAwMTJcdTAwMTNcdTAwMTRcdTAwMTVcdTAwMTZcdTAwMTdcdTAwMThcdTAwMTlcdTAwMWFcdTAwMWJcdTAwMWNcdTAwMWRcdTAwMWVcdTAwMWYtY29weSIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMzkxNTU3MDI1MCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ01xQWt1ZWlySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxNS41NzJaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTUuNTcyWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxNS41NzJaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTUuNTcyWiJ9fQ==" } }, { "ID": "2770006631fe2b2d", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F-copy", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:15 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:15 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933915570250" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWywTlDI2k8cFPME3VEWpxZzJRWWeiJSJwAiuYQJUwJ6gkmAvIHDCD9eVIELAPm5D298" ] }, "Body": "aGVsbG8=" } }, { "ID": "5b0d2939ce402a7b", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F-copy?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:15 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwuPslEiVe978VwPLyJNrL9DhqYd4KNi_xOGzjmYypG8_WnbEIafyfTImq5ivXdsrYM" ] }, "Body": "" } }, { "ID": "07fec27d723e0e9a", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:15 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzHcGPjg5_6lYeRUpFb-lbZ-dZZxLQRHgAetqA9spYNeVN-r6Py0Kbkh2Ft49_FezKw" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestKeys/ascii-3.replay ================================================ { "Initial": "AQAAAA7hTgxhOVwHqgAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "a3955f0328f3fdbe", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=weird-keys+%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibmFtZSI6IndlaXJkLWtleXMgIVwiIyQlXHUwMDI2JygpKissLS4vIn0K", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "858" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:22 GMT" ], "Etag": [ "CPC1oeqirJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzdxxjqzQUw58UgSuyc9Dr7fwTj7saStFClqNxMCiNM048KTJ-czpzijU9V4tiKtVeK" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5cyAhXCIjJCUmJygpKissLS4vLzE3NzM5MzM5MjIxMTQyODgiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5cyUyMCElMjIlMjMkJTI1JicoKSolMkIsLS4lMkYiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzJTIwISUyMiUyMyQlMjUmJygpKiUyQiwtLiUyRj9nZW5lcmF0aW9uPTE3NzM5MzM5MjIxMTQyODgmYWx0PW1lZGlhIiwibmFtZSI6IndlaXJkLWtleXMgIVwiIyQlJicoKSorLC0uLyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMzkyMjExNDI4OCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ1BDMW9lcWlySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToyMi4xMTdaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MjIuMTE3WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToyMi4xMTdaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MjU6MjIuMTE3WiJ9" } }, { "ID": "3e0b87e21175e7f4", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys%20%21%22%23$%25\u0026%27%28%29%2A+%2C-.%2F", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:22 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:22 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933922114288" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWyHmilA2xGkaC5FQafBCYFNXnZo0gaP8EaM0_olH0EEy7KtQi7wNN1t49Bcul7nwWoZ" ] }, "Body": "aGVsbG8=" } }, { "ID": "9c7a8ee72b57df66", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "858" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:22 GMT" ], "Etag": [ "CPC1oeqirJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzfq7azcHUL_QQeISgEiM7AT17-YxeszI3l0PCLvEyuXNi3e-xQGjCJSdTcO9mimycb" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5cyAhXCIjJCUmJygpKissLS4vLzE3NzM5MzM5MjIxMTQyODgiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5cyUyMCElMjIlMjMkJTI1JicoKSolMkIsLS4lMkYiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzJTIwISUyMiUyMyQlMjUmJygpKiUyQiwtLiUyRj9nZW5lcmF0aW9uPTE3NzM5MzM5MjIxMTQyODgmYWx0PW1lZGlhIiwibmFtZSI6IndlaXJkLWtleXMgIVwiIyQlJicoKSorLC0uLyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMzkyMjExNDI4OCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ1BDMW9lcWlySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToyMi4xMTdaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MjIuMTE3WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToyMi4xMTdaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MjU6MjIuMTE3WiJ9" } }, { "ID": "f43290b3b91e86ca", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys%20%21%22%23$%25\u0026%27%28%29%2A+,-./?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:22 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:22 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933922114288" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWx4tuKqls4MQZJiu03MrH_kIFlLlG3eNa86OmVCRGJMROsZWCSUMk2pkSzQHzxyNpod" ] }, "Body": "aGVsbG8=" } }, { "ID": "3727f745bc1cd667", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F/rewriteTo/b/go-cloud-blob-test-bucket/o/weird-keys%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F-copy?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "979" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:22 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyrZs9B2o6KGqjs7We_AbrFGcq-wCPRstny4z1_zdZWOqrmMjVb9uDKcrj3Dt1VtbH0" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiNSIsIm9iamVjdFNpemUiOiI1IiwiZG9uZSI6dHJ1ZSwicmVzb3VyY2UiOnsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L3dlaXJkLWtleXMgIVwiIyQlJicoKSorLC0uLy1jb3B5LzE3NzM5MzM5MjI0Njk1MTgiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5cyUyMCElMjIlMjMkJTI1JicoKSolMkIsLS4lMkYtY29weSIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL3dlaXJkLWtleXMlMjAhJTIyJTIzJCUyNSYnKCkqJTJCLC0uJTJGLWNvcHk/Z2VuZXJhdGlvbj0xNzczOTMzOTIyNDY5NTE4JmFsdD1tZWRpYSIsIm5hbWUiOiJ3ZWlyZC1rZXlzICFcIiMkJSYnKCkqKywtLi8tY29weSIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMzkyMjQ2OTUxOCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ0k2TnQrcWlySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToyMi40NzFaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MjIuNDcxWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToyMi40NzFaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MjU6MjIuNDcxWiJ9fQ==" } }, { "ID": "855e6b3a96f1ccc4", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys%20%21%22%23$%25\u0026%27%28%29%2A+%2C-.%2F-copy", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:22 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:22 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933922469518" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWw-Zyl1jgfTwxUn7wRrQiMkuP5PUtVat1u0N5K4VPRjieoW37xqP4LisiyffdvbU7dq" ] }, "Body": "aGVsbG8=" } }, { "ID": "915fb3a0ffdaef1b", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F-copy?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:22 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzax0YBE8V-EUiKNngAVkxNVGS3TzwYGnjXmhE1FiHnh83_GENDyA1BcNXOoyUwBpVo" ] }, "Body": "" } }, { "ID": "fb78d40611baa18b", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:22 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxNg4qqQg0HZ2UTKhS15TcUMbyoTIl5pkaW8nOpvLFZdLplcMVjIUPRln8Fqb9RuAj0" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestKeys/ascii-4.replay ================================================ { "Initial": "AQAAAA7hTgxiLbOM6gAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "5998d7ed2d222694", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=weird-keys%3A%3B%3C%3D%3E%3F\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibmFtZSI6IndlaXJkLWtleXM6O1x1MDAzYz1cdTAwM2U/In0K", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "824" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:22 GMT" ], "Etag": [ "COCX0eqirJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWy_UhGs1GJ0BXlkQdatCAWMQsJD3Un5CWO-9JjTWe2TvWbHyM68GvacpJR71_-AoYZB" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5czo7XHUwMDNjPVx1MDAzZT8vMTc3MzkzMzkyMjg5Njg2NCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzOjslM0M9JTNFJTNGIiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5czo7JTNDPSUzRSUzRj9nZW5lcmF0aW9uPTE3NzM5MzM5MjI4OTY4NjQmYWx0PW1lZGlhIiwibmFtZSI6IndlaXJkLWtleXM6O1x1MDAzYz1cdTAwM2U/IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMzOTIyODk2ODY0IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDT0NYMGVxaXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjIyLjkwMFoiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToyMi45MDBaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjIyLjkwMFoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNToyNToyMi45MDBaIn0=" } }, { "ID": "a8f32e49343e5123", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys:%3B%3C=%3E%3F", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:22 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:22 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933922896864" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWwHLbvdWV09YW-CmMnwl9ZU9xGNugiRHWulUjBMwOqTZdvF_JDVwNHaG0taUm_LMyBL" ] }, "Body": "aGVsbG8=" } }, { "ID": "59e875f74135774a", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%3A%3B%3C%3D%3E%3F?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "824" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:23 GMT" ], "Etag": [ "COCX0eqirJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzHB__7YWHZHwxN2GqFZmpuzqbHaT5PGtQF62aVjYhS0l816NuHso9Vm5z8u0yXrPjy" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5czo7XHUwMDNjPVx1MDAzZT8vMTc3MzkzMzkyMjg5Njg2NCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzOjslM0M9JTNFJTNGIiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5czo7JTNDPSUzRSUzRj9nZW5lcmF0aW9uPTE3NzM5MzM5MjI4OTY4NjQmYWx0PW1lZGlhIiwibmFtZSI6IndlaXJkLWtleXM6O1x1MDAzYz1cdTAwM2U/IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMzOTIyODk2ODY0IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDT0NYMGVxaXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjIyLjkwMFoiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToyMi45MDBaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjIyLjkwMFoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNToyNToyMi45MDBaIn0=" } }, { "ID": "fc4c368ba92ac8ad", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys:;%3C=%3E%3F?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:23 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:22 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933922896864" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWwx96TOPv16-fqOhzr1B-yPAxaPKDJVhgHjMfvWXkWtvlgTDuZgcPkRjIsJs6rupXdT" ] }, "Body": "aGVsbG8=" } }, { "ID": "6c8bcb1066aedf06", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%3A%3B%3C%3D%3E%3F/rewriteTo/b/go-cloud-blob-test-bucket/o/weird-keys%3A%3B%3C%3D%3E%3F-copy?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "945" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:23 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWw4L5y8Gat95caNjn5YN_DKzV-tYZswIdL8lQ81BPYjjvr4GJD-AD9s5IVvxp8poYIM" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiNSIsIm9iamVjdFNpemUiOiI1IiwiZG9uZSI6dHJ1ZSwicmVzb3VyY2UiOnsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L3dlaXJkLWtleXM6O1x1MDAzYz1cdTAwM2U/LWNvcHkvMTc3MzkzMzkyMzI1MDgyMyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzOjslM0M9JTNFJTNGLWNvcHkiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzOjslM0M9JTNFJTNGLWNvcHk/Z2VuZXJhdGlvbj0xNzczOTMzOTIzMjUwODIzJmFsdD1tZWRpYSIsIm5hbWUiOiJ3ZWlyZC1rZXlzOjtcdTAwM2M9XHUwMDNlPy1jb3B5IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMzOTIzMjUwODIzIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDSWZsNXVxaXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjIzLjI1MloiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToyMy4yNTJaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjIzLjI1MloiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNToyNToyMy4yNTJaIn19" } }, { "ID": "7f535ec0679744dc", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys:%3B%3C=%3E%3F-copy", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:23 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:23 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933923250823" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWy_XO7_aqYnR6ONprDrp3X-AxBjzA5SzUYjt4lV4HWDLzbniHciEJIIFj0nXYpAmbq8" ] }, "Body": "aGVsbG8=" } }, { "ID": "0afdc1dfa486b130", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%3A%3B%3C%3D%3E%3F-copy?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:23 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyUx6YV-_W22TjUuzkCrmSH3fLrbijr_uu05VQGJAosL3BfrzPJuakA5Ik7kTL1zWzn" ] }, "Body": "" } }, { "ID": "8f8a3560caa5bd73", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%3A%3B%3C%3D%3E%3F?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:23 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxwBWYG-n--tyosoa6w3l0P4XVTEoRxMUz8rtIQc2qVW7gW0iewh7k-RJlZRlLbhDfP" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestKeys/ascii-5.replay ================================================ { "Initial": "AQAAAA7hTgxbNBYNbgAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "e0adb4a8d7625b4d", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=weird-keys%40\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibmFtZSI6IndlaXJkLWtleXNAIn0K", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "772" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:16 GMT" ], "Etag": [ "CMuWt+eirJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzb-uj_Hd_r9rXkMFQMacDNGq5D1L-qQDCaiXYZZomWMVngmxidPjDId5g4NSWJX9EP" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5c0AvMTc3MzkzMzkxNjE3OTI3NSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzQCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL3dlaXJkLWtleXNAP2dlbmVyYXRpb249MTc3MzkzMzkxNjE3OTI3NSZhbHQ9bWVkaWEiLCJuYW1lIjoid2VpcmQta2V5c0AiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzM5MTYxNzkyNzUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNNdVd0K2VpckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTYuMTgxWiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE2LjE4MVoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTYuMTgxWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE2LjE4MVoifQ==" } }, { "ID": "e8dcc5dff9e4a8b8", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys@", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:16 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:16 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933916179275" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWw1thUS7OT66XaMBb-WtBysFUJu1KviUHrP9vzio_iIDgrg8_LziIFAcjKHxBkFL4cA" ] }, "Body": "aGVsbG8=" } }, { "ID": "d2d65383d32e5428", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%40?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "772" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:16 GMT" ], "Etag": [ "CMuWt+eirJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxPhDdn7kSX5hFoGe9ACK5Lo6aRFRG99YjqrX0anO3oculgCoeM_u95LqUIOlJWhQM8" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5c0AvMTc3MzkzMzkxNjE3OTI3NSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzQCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL3dlaXJkLWtleXNAP2dlbmVyYXRpb249MTc3MzkzMzkxNjE3OTI3NSZhbHQ9bWVkaWEiLCJuYW1lIjoid2VpcmQta2V5c0AiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzM5MTYxNzkyNzUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNNdVd0K2VpckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTYuMTgxWiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE2LjE4MVoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTYuMTgxWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE2LjE4MVoifQ==" } }, { "ID": "ada2dd130b330d78", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys@?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:16 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:16 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933916179275" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWzpRshCO1gMQ52iraI62sfC1k404yVa3f7s17Ay2dgoxRbK5253NYwp6AS4UnIF21Lx" ] }, "Body": "aGVsbG8=" } }, { "ID": "fd37cd1fcd6042fa", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%40/rewriteTo/b/go-cloud-blob-test-bucket/o/weird-keys%40-copy?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "893" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:16 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWykF9ITgYj46qL3ZoBezWS93scb5Nt7gOFw8QUv_VZAjtte-uDseCSBEc-e78wEhnE5" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiNSIsIm9iamVjdFNpemUiOiI1IiwiZG9uZSI6dHJ1ZSwicmVzb3VyY2UiOnsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L3dlaXJkLWtleXNALWNvcHkvMTc3MzkzMzkxNjUyOTA2NSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzQC1jb3B5IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5c0AtY29weT9nZW5lcmF0aW9uPTE3NzM5MzM5MTY1MjkwNjUmYWx0PW1lZGlhIiwibmFtZSI6IndlaXJkLWtleXNALWNvcHkiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzM5MTY1MjkwNjUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNLbkR6T2VpckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTYuNTMxWiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE2LjUzMVoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTYuNTMxWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE2LjUzMVoifX0=" } }, { "ID": "7486bfe7f117b356", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys@-copy", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:16 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:16 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933916529065" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWx03PPP8F83TKF2x7_KKa5qUovlA0K4seaLIuwITc4YVOEFw6dResRtP-src_JBB8xj" ] }, "Body": "aGVsbG8=" } }, { "ID": "20e277c3aebdaf47", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%40-copy?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:16 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzxyXUy1YoVqhi_BbOCtZ8andAHkT0zNlG_bhXLxRRIw3jTH6t_wh-2CI0wp76GFQmn" ] }, "Body": "" } }, { "ID": "248be0881569a683", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%40?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:16 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzEiOyVClgxQd9drCbHf7qSkKRxM65QH7zAgdr6M64AqrgrAIGkZNrzzrHCfeTpmsWs" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestKeys/ascii-6.replay ================================================ { "Initial": "AQAAAA7hTgxVNwcghgAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "30979442f50a2747", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=weird-keys%5B%5C%5D%5E_\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibmFtZSI6IndlaXJkLWtleXNbXFxdXl8ifQo=", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "806" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:10 GMT" ], "Etag": [ "CNSQxOSirJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwnUESa11pGTmLXGlA0fC6S4VLd_YJR6KSkA_w75pNcZGFvcjZCXCQg69qh_kj0yTe2" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5c1tcXF1eXy8xNzczOTMzOTEwMTAwMDUyIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL3dlaXJkLWtleXMlNUIlNUMlNUQlNUVfIiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5cyU1QiU1QyU1RCU1RV8/Z2VuZXJhdGlvbj0xNzczOTMzOTEwMTAwMDUyJmFsdD1tZWRpYSIsIm5hbWUiOiJ3ZWlyZC1rZXlzW1xcXV5fIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMzOTEwMTAwMDUyIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTlNReE9TaXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjEwLjEwMloiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxMC4xMDJaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjEwLjEwMloiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNToyNToxMC4xMDJaIn0=" } }, { "ID": "35161d11cf2a2465", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys%5B%5C%5D%5E_", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:10 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:10 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933910100052" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWyJ5UEkFgLbZNM-gnk282I0ekdk_XTwiEbDk4QwF-H1n8FPcXLstBchFw6ilFGR4UiC" ] }, "Body": "aGVsbG8=" } }, { "ID": "757878610baeb5f1", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%5B%5C%5D%5E_?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "806" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:10 GMT" ], "Etag": [ "CNSQxOSirJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyVZUjBZ6AbgkuufutRBR3BPZidnmEB3VVVRQJcu0tKQFIIZK0Uo7Ro0hJ05rELZR7a" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5c1tcXF1eXy8xNzczOTMzOTEwMTAwMDUyIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL3dlaXJkLWtleXMlNUIlNUMlNUQlNUVfIiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5cyU1QiU1QyU1RCU1RV8/Z2VuZXJhdGlvbj0xNzczOTMzOTEwMTAwMDUyJmFsdD1tZWRpYSIsIm5hbWUiOiJ3ZWlyZC1rZXlzW1xcXV5fIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMzOTEwMTAwMDUyIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTlNReE9TaXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjEwLjEwMloiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxMC4xMDJaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjEwLjEwMloiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNToyNToxMC4xMDJaIn0=" } }, { "ID": "29ee9fd3bb4644a7", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys%5B%5C%5D%5E_?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:10 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:10 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933910100052" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWzqv-MClvF4EhfA075p5W0WHzcbkAkuMUeH-BExPsOaoKgAvA5pb8uGurE7aLo5ISze" ] }, "Body": "aGVsbG8=" } }, { "ID": "0e60ce0bd9fe5ace", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%5B%5C%5D%5E_/rewriteTo/b/go-cloud-blob-test-bucket/o/weird-keys%5B%5C%5D%5E_-copy?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "927" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:10 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzwl9aDWHUDxj_QzSAoz-I4B56wsfnXvmrB6AErwmKzGfmIDuntdZTWSyqbwKByxWhe" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiNSIsIm9iamVjdFNpemUiOiI1IiwiZG9uZSI6dHJ1ZSwicmVzb3VyY2UiOnsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L3dlaXJkLWtleXNbXFxdXl8tY29weS8xNzczOTMzOTEwNDkxNDc1Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL3dlaXJkLWtleXMlNUIlNUMlNUQlNUVfLWNvcHkiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzJTVCJTVDJTVEJTVFXy1jb3B5P2dlbmVyYXRpb249MTc3MzkzMzkxMDQ5MTQ3NSZhbHQ9bWVkaWEiLCJuYW1lIjoid2VpcmQta2V5c1tcXF1eXy1jb3B5IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMzOTEwNDkxNDc1IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTk9DM09TaXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjEwLjQ5NFoiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxMC40OTRaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjEwLjQ5NFoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNToyNToxMC40OTRaIn19" } }, { "ID": "4681825959c1533f", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys%5B%5C%5D%5E_-copy", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:10 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:10 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933910491475" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWx0mQDtxSwShWEBhnu3z51tsWs2msZplkQfWw2U3TXGK7vSUCRgmMruLXICOl_Bs0ot" ] }, "Body": "aGVsbG8=" } }, { "ID": "558a866523ad2eec", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%5B%5C%5D%5E_-copy?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:10 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxVnXl-dG4Cz3mQ2RBJzxfByISxatA3HOe2Hb1rY0GdJLRojHPyGiXQMEQcx5kccobj" ] }, "Body": "" } }, { "ID": "aac5ed3e805e7c54", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%5B%5C%5D%5E_?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:10 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWy7QLF1Y_g-fG1yFvEck2_Uy5U6QT003n14P3PFJikkbYl9QM0tjnve_5DABO_xkraH" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestKeys/ascii-7.replay ================================================ { "Initial": "AQAAAA7hTgxcKvYtswAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "e6154bb385fa98ae", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=weird-keys%60\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibmFtZSI6IndlaXJkLWtleXNgIn0K", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "776" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:16 GMT" ], "Etag": [ "CKig4eeirJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyM4HEds-0Qse35ELCxrqnYp175jb47f24yOuVMVnpNNB-31ZWIAju3HBoSnGkOtT07" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5c2AvMTc3MzkzMzkxNjg2ODY0OCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzJTYwIiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5cyU2MD9nZW5lcmF0aW9uPTE3NzM5MzM5MTY4Njg2NDgmYWx0PW1lZGlhIiwibmFtZSI6IndlaXJkLWtleXNgIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMzOTE2ODY4NjQ4IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDS2lnNGVlaXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE2Ljg3MVoiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxNi44NzFaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE2Ljg3MVoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNToyNToxNi44NzFaIn0=" } }, { "ID": "a4b532395f1783bb", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys%60", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:16 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:16 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933916868648" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWwfSU8ag50TOJdciNF5s0hWDqfLP9md85s-RqQWdOxzZFVJoEnaKvzBxFLwvARUTgDm" ] }, "Body": "aGVsbG8=" } }, { "ID": "e073537017ad29ea", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%60?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "776" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:17 GMT" ], "Etag": [ "CKig4eeirJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyuWdCcIm2HuK5Wqs4ptMsHx6exkftYSbmArRTxUMqUcwJ4M_O0F5MdU15Alf3pTbTC" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5c2AvMTc3MzkzMzkxNjg2ODY0OCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzJTYwIiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5cyU2MD9nZW5lcmF0aW9uPTE3NzM5MzM5MTY4Njg2NDgmYWx0PW1lZGlhIiwibmFtZSI6IndlaXJkLWtleXNgIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMzOTE2ODY4NjQ4IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDS2lnNGVlaXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE2Ljg3MVoiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxNi44NzFaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE2Ljg3MVoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNToyNToxNi44NzFaIn0=" } }, { "ID": "e2560b0369f09786", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys%60?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:17 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:16 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933916868648" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWzZKfBW98ReC5PpeIuEFAuAIKeRcmhTkiG91be1jN6dS2yybga7bPymDb9oWQi4B1Qp" ] }, "Body": "aGVsbG8=" } }, { "ID": "17bf6fc5c0fcdb58", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%60/rewriteTo/b/go-cloud-blob-test-bucket/o/weird-keys%60-copy?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "897" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:17 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzLGXd1HzxperDtzE2cX9LZWRxDToGWP3NPT-_Sz3j6uUHAmC1e5BBu6PCX7LvstaMq" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiNSIsIm9iamVjdFNpemUiOiI1IiwiZG9uZSI6dHJ1ZSwicmVzb3VyY2UiOnsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L3dlaXJkLWtleXNgLWNvcHkvMTc3MzkzMzkxNzI0OTQ1MyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzJTYwLWNvcHkiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzJTYwLWNvcHk/Z2VuZXJhdGlvbj0xNzczOTMzOTE3MjQ5NDUzJmFsdD1tZWRpYSIsIm5hbWUiOiJ3ZWlyZC1rZXlzYC1jb3B5IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMzOTE3MjQ5NDUzIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDSzIvK09laXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE3LjI1MVoiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxNy4yNTFaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE3LjI1MVoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNToyNToxNy4yNTFaIn19" } }, { "ID": "02f151b442d95051", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys%60-copy", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:17 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:17 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933917249453" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWzClrIKPJ-p8xOJ8PNkhzp6afbLI9Jqsd1IG15lGmOcdvTFKbd9dqiY3jHI1SSwwsHQ" ] }, "Body": "aGVsbG8=" } }, { "ID": "8859451ab721826d", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%60-copy?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:17 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWz4wFDwZBsK6GUU0VxHgesrvCZOouXZ8k7JG7rXeAIpFZSSa2dnGuIXZJuxYmq2VW8k" ] }, "Body": "" } }, { "ID": "59507cf0c1a0555a", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%60?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:17 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwE1lGffCL8xelkro5_g7UINXJ6ldPJZ_CGMaYgghF50w0N0P2cdGMVMbi1N88nQSqm" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestKeys/ascii-8.replay ================================================ { "Initial": "AQAAAA7hTgxdG7hGoQAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "eef380bc609c594f", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=weird-keys%7B%7C%7D~%7F\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibmFtZSI6IndlaXJkLWtleXN7fH1+fyJ9Cg==", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "814" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:17 GMT" ], "Etag": [ "CP7VjuiirJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwuWQ1KolXGLj-9XjDoUHETLmYAywYtc8rhl3z0jZvBJFRJbfH8Lqz9ceTd9MTbXNOJ" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5c3t8fX5cdTAwN2YvMTc3MzkzMzkxNzYxMjc5OCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzJTdCJTdDJTdEfiU3RiIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL3dlaXJkLWtleXMlN0IlN0MlN0R+JTdGP2dlbmVyYXRpb249MTc3MzkzMzkxNzYxMjc5OCZhbHQ9bWVkaWEiLCJuYW1lIjoid2VpcmQta2V5c3t8fX5cdTAwN2YiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzM5MTc2MTI3OTgiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNQN1ZqdWlpckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTcuNjE1WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE3LjYxNVoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTcuNjE1WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE3LjYxNVoifQ==" } }, { "ID": "ff7d564c49676e19", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys%7B%7C%7D~%7F", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:17 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:17 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933917612798" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWylmA8IUw1gdeezWm-rxhitriQeDlfcRA022UWgAKS4lda5aCAzB1vGhQNGmmeRyKlf" ] }, "Body": "aGVsbG8=" } }, { "ID": "53ec51e469a39ca1", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%7B%7C%7D~%7F?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "814" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:17 GMT" ], "Etag": [ "CP7VjuiirJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyv5g-PtM7L8JBmOXdhhCY5mVm4mVZ57P0tUtxxHFS6WvmgjSt2RzP9huOdxXTDGyEA" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5c3t8fX5cdTAwN2YvMTc3MzkzMzkxNzYxMjc5OCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzJTdCJTdDJTdEfiU3RiIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL3dlaXJkLWtleXMlN0IlN0MlN0R+JTdGP2dlbmVyYXRpb249MTc3MzkzMzkxNzYxMjc5OCZhbHQ9bWVkaWEiLCJuYW1lIjoid2VpcmQta2V5c3t8fX5cdTAwN2YiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzM5MTc2MTI3OTgiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNQN1ZqdWlpckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTcuNjE1WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE3LjYxNVoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTcuNjE1WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE3LjYxNVoifQ==" } }, { "ID": "7f1f2ec9aa4052cc", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys%7B%7C%7D~%7F?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:17 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:17 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933917612798" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWzX1wy0ClZ9ycKxfVh4gzdNx97e3tAQAhAU7jDmHuthxKdwQvZ3uAMqXRiNKQysp3Vc" ] }, "Body": "aGVsbG8=" } }, { "ID": "7e316b8887ed49bd", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%7B%7C%7D~%7F/rewriteTo/b/go-cloud-blob-test-bucket/o/weird-keys%7B%7C%7D~%7F-copy?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "935" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:17 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyDfYp0Y8uRCkBCO67898RVV3Jxf3Bh1P1saEr9gl_BpfV-F2xZj2uO9yQG1djTqFHr" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiNSIsIm9iamVjdFNpemUiOiI1IiwiZG9uZSI6dHJ1ZSwicmVzb3VyY2UiOnsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L3dlaXJkLWtleXN7fH1+XHUwMDdmLWNvcHkvMTc3MzkzMzkxNzk3MjI0MyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzJTdCJTdDJTdEfiU3Ri1jb3B5IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5cyU3QiU3QyU3RH4lN0YtY29weT9nZW5lcmF0aW9uPTE3NzM5MzM5MTc5NzIyNDMmYWx0PW1lZGlhIiwibmFtZSI6IndlaXJkLWtleXN7fH1+XHUwMDdmLWNvcHkiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzM5MTc5NzIyNDMiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNKUE9wT2lpckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTcuOTc2WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE3Ljk3NloiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTcuOTc2WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE3Ljk3NloifX0=" } }, { "ID": "7ffc7e4f87d5e158", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys%7B%7C%7D~%7F-copy", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:18 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:17 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933917972243" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWxuXPn-JKU7pgFBEzlufdHwYzhRG0-E-dOj1OPOiofRJjp4cCH4-iEpLhgQIvT9zxEm" ] }, "Body": "aGVsbG8=" } }, { "ID": "937ae1173ca426cd", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%7B%7C%7D~%7F-copy?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:18 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWz6pY0y2CU0lqEPMOr1Ya38jCoDfU_fVn7yObD3sty4DQwXDewZd6GFGy2pjXdIKp9a" ] }, "Body": "" } }, { "ID": "50ee831072ce9d60", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%7B%7C%7D~%7F?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:18 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxuPtZOD3BDBgqe_PSNeV_G6_HMUdnC9QfxS0PsighN1l1Sd9r3Xybmq9hMvyw3c9Tp" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestKeys/backslashes.replay ================================================ { "Initial": "AQAAAA7hTgxeCWh1ZwAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "7ceaaf46b68b4973", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=weird-keysfoo%5Cbar%5Cbaz\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibmFtZSI6IndlaXJkLWtleXNmb29cXGJhclxcYmF6In0K", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "824" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:18 GMT" ], "Etag": [ "CJWvueiirJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwiiikik9K7YKkYfe3advQb9JgVs1etaDzYwmux9rsZNgZh2eeh56g6i-8c1R4WIFcg" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5c2Zvb1xcYmFyXFxiYXovMTc3MzkzMzkxODMxMjM0MSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzZm9vJTVDYmFyJTVDYmF6IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5c2ZvbyU1Q2JhciU1Q2Jhej9nZW5lcmF0aW9uPTE3NzM5MzM5MTgzMTIzNDEmYWx0PW1lZGlhIiwibmFtZSI6IndlaXJkLWtleXNmb29cXGJhclxcYmF6IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMzOTE4MzEyMzQxIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDSld2dWVpaXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE4LjMxNVoiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxOC4zMTVaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE4LjMxNVoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNToyNToxOC4zMTVaIn0=" } }, { "ID": "af15022740beee3c", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keysfoo%5Cbar%5Cbaz", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:18 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:18 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933918312341" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWyEPAK4ndt6xp4z8ZnZafHB3Ruu2T-qw3AAWSUSoLv-Pp1IirLc0lIDisqbRnvUAGgd" ] }, "Body": "aGVsbG8=" } }, { "ID": "457b0601960539c0", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keysfoo%5Cbar%5Cbaz?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "824" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:18 GMT" ], "Etag": [ "CJWvueiirJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzBeyAfWEI_ODNFLmQUc7kMgSsJ7zvBGR8sI2OxGcdR0U2Ch35ewZLlgSWMjS9o5yX1" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5c2Zvb1xcYmFyXFxiYXovMTc3MzkzMzkxODMxMjM0MSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzZm9vJTVDYmFyJTVDYmF6IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5c2ZvbyU1Q2JhciU1Q2Jhej9nZW5lcmF0aW9uPTE3NzM5MzM5MTgzMTIzNDEmYWx0PW1lZGlhIiwibmFtZSI6IndlaXJkLWtleXNmb29cXGJhclxcYmF6IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMzOTE4MzEyMzQxIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDSld2dWVpaXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE4LjMxNVoiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxOC4zMTVaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE4LjMxNVoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNToyNToxOC4zMTVaIn0=" } }, { "ID": "c560f4d35c8dc513", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keysfoo%5Cbar%5Cbaz?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:18 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:18 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933918312341" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWztbiAzu-KrIun9QCo-uqh8PTADWeVT7wTXKLXx3R55g2fKm68qMYZRE9u81PXH6UG_" ] }, "Body": "aGVsbG8=" } }, { "ID": "13b739045fdbcec8", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keysfoo%5Cbar%5Cbaz/rewriteTo/b/go-cloud-blob-test-bucket/o/weird-keysfoo%5Cbar%5Cbaz-copy?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "945" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:18 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxvoJu4RGW0PLRZwrWlUCU5rZf9N8pv2sgw-29G9TCEeugBCVFbnKxTr7rmSPknQkkG" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiNSIsIm9iamVjdFNpemUiOiI1IiwiZG9uZSI6dHJ1ZSwicmVzb3VyY2UiOnsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L3dlaXJkLWtleXNmb29cXGJhclxcYmF6LWNvcHkvMTc3MzkzMzkxODYwNjE1NyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzZm9vJTVDYmFyJTVDYmF6LWNvcHkiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzZm9vJTVDYmFyJTVDYmF6LWNvcHk/Z2VuZXJhdGlvbj0xNzczOTMzOTE4NjA2MTU3JmFsdD1tZWRpYSIsIm5hbWUiOiJ3ZWlyZC1rZXlzZm9vXFxiYXJcXGJhei1jb3B5IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMzOTE4NjA2MTU3IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTTJteStpaXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE4LjYwOFoiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxOC42MDhaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE4LjYwOFoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNToyNToxOC42MDhaIn19" } }, { "ID": "878e159e3cd987b7", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keysfoo%5Cbar%5Cbaz-copy", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:18 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:18 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933918606157" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWwuNzxnB-fGTMk7eSVCIK2iR3oA0yBoCXh_wPypRbJPB-iC33BkqKei1lBtzljLOEwH" ] }, "Body": "aGVsbG8=" } }, { "ID": "924ac93436c4c6e2", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keysfoo%5Cbar%5Cbaz-copy?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:18 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwFD592PSShGunwO7xQBDhN_BSqhjnhEbn--vqOu9TyI5El8J7JOZ6NqBHaiZJwuHG-" ] }, "Body": "" } }, { "ID": "d22eaf0daedd474b", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keysfoo%5Cbar%5Cbaz?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:18 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwJTqNLTtzjrdNzI4Li-ykgBVE6UBS7SS2Bd81nycNThQMp-9ojBzn1WkTR2i3Ma3Hc" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestKeys/dotdotbackslash.replay ================================================ { "Initial": "AQAAAA7hTgxeLnemqgAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "3ef383d24487029c", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=weird-keys..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibmFtZSI6IndlaXJkLWtleXMuLlxcZm9vXFwuLlxcYmFyXFwuLlxcLi5cXGJhei4uXFwifQo=", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "914" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:18 GMT" ], "Etag": [ "CI+t3uiirJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWw4faetIFK51-3hUEUw1J2FEF-MxO0VAaNKkPdoDRxx6LrHiNBrRtkbK_3ntGplnhK4" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5cy4uXFxmb29cXC4uXFxiYXJcXC4uXFwuLlxcYmF6Li5cXC8xNzczOTMzOTE4OTE4Mjg3Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL3dlaXJkLWtleXMuLiU1Q2ZvbyU1Qy4uJTVDYmFyJTVDLi4lNUMuLiU1Q2Jhei4uJTVDIiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5cy4uJTVDZm9vJTVDLi4lNUNiYXIlNUMuLiU1Qy4uJTVDYmF6Li4lNUM/Z2VuZXJhdGlvbj0xNzczOTMzOTE4OTE4Mjg3JmFsdD1tZWRpYSIsIm5hbWUiOiJ3ZWlyZC1rZXlzLi5cXGZvb1xcLi5cXGJhclxcLi5cXC4uXFxiYXouLlxcIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMzOTE4OTE4Mjg3IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDSSt0M3VpaXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE4LjkyMVoiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxOC45MjFaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE4LjkyMVoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNToyNToxOC45MjFaIn0=" } }, { "ID": "ecc7a6644107fe8f", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:19 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:18 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933918918287" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWw_BgccNPQ1KfrNs9f9qB6NhMb6cfVQcGMnlIWtSR4wlvaMol-VXdlWGZXR6gkhbfFT" ] }, "Body": "aGVsbG8=" } }, { "ID": "1a02e1f2e68ac9f8", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "914" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:19 GMT" ], "Etag": [ "CI+t3uiirJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzfysioKO3fR7tG_w4aoUb-54hkQqj6Fj3g_rV-xoFAevzWpt5XJEZhqgo0nRNIpV3W" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5cy4uXFxmb29cXC4uXFxiYXJcXC4uXFwuLlxcYmF6Li5cXC8xNzczOTMzOTE4OTE4Mjg3Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL3dlaXJkLWtleXMuLiU1Q2ZvbyU1Qy4uJTVDYmFyJTVDLi4lNUMuLiU1Q2Jhei4uJTVDIiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5cy4uJTVDZm9vJTVDLi4lNUNiYXIlNUMuLiU1Qy4uJTVDYmF6Li4lNUM/Z2VuZXJhdGlvbj0xNzczOTMzOTE4OTE4Mjg3JmFsdD1tZWRpYSIsIm5hbWUiOiJ3ZWlyZC1rZXlzLi5cXGZvb1xcLi5cXGJhclxcLi5cXC4uXFxiYXouLlxcIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMzOTE4OTE4Mjg3IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDSSt0M3VpaXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE4LjkyMVoiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxOC45MjFaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE4LjkyMVoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNToyNToxOC45MjFaIn0=" } }, { "ID": "1946cd15e20a2b0b", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:19 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:18 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933918918287" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWz9PYGYM7tn1Lr0GpgT_CYUnBNIb8x1ly7YUzGi0jlIUFhn-20AoNoWy4HdgYSPYm-C" ] }, "Body": "aGVsbG8=" } }, { "ID": "2ec0c1644bb3abd5", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C/rewriteTo/b/go-cloud-blob-test-bucket/o/weird-keys..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C-copy?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "1035" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:19 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWy92QwbNhGj6iJTCrVAgMdDSD31AmK0rE_Q4NjCkVzzktiiOSkmSDTjMSb2GKXKUpxa" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiNSIsIm9iamVjdFNpemUiOiI1IiwiZG9uZSI6dHJ1ZSwicmVzb3VyY2UiOnsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L3dlaXJkLWtleXMuLlxcZm9vXFwuLlxcYmFyXFwuLlxcLi5cXGJhei4uXFwtY29weS8xNzczOTMzOTE5Mjg4MTY1Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL3dlaXJkLWtleXMuLiU1Q2ZvbyU1Qy4uJTVDYmFyJTVDLi4lNUMuLiU1Q2Jhei4uJTVDLWNvcHkiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzLi4lNUNmb28lNUMuLiU1Q2JhciU1Qy4uJTVDLi4lNUNiYXouLiU1Qy1jb3B5P2dlbmVyYXRpb249MTc3MzkzMzkxOTI4ODE2NSZhbHQ9bWVkaWEiLCJuYW1lIjoid2VpcmQta2V5cy4uXFxmb29cXC4uXFxiYXJcXC4uXFwuLlxcYmF6Li5cXC1jb3B5IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMzOTE5Mjg4MTY1IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDT1gyOU9paXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE5LjI5MFoiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxOS4yOTBaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE5LjI5MFoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNToyNToxOS4yOTBaIn19" } }, { "ID": "9743d8dfbb19a5e9", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C-copy", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:19 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:19 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933919288165" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWzyledHe3rgc1mdAievV3nWIki3Ch9rTIu6_0nTBxHXASMwVoEPPgP2oofZh7_ll3mP" ] }, "Body": "aGVsbG8=" } }, { "ID": "876b3e729d7e53da", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C-copy?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:19 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxUe0Pe6FHffMjO_FMBEUeSYcode3Z0NB_FYlkOUtsD4wXP0eoQNCCLmoiQkzvtPDVL" ] }, "Body": "" } }, { "ID": "e24fb2f78d1982ed", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:19 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxH1ph90jMxGFTCLmF---0DewcMeGv3wouNAV3rkNmDgJBsdr0-kUd9pdH7a8lEzwkj" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestKeys/dotdotslash.replay ================================================ { "Initial": "AQAAAA7hTgxXFFauKwAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "2f9cc632ae504aed", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=weird-keys..__0x2f__foo%2F..__0x2f__bar%2F..__0x2f__..__0x2f__baz..__0x2f__\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibmFtZSI6IndlaXJkLWtleXMuLl9fMHgyZl9fZm9vLy4uX18weDJmX19iYXIvLi5fXzB4MmZfXy4uX18weDJmX19iYXouLl9fMHgyZl9fIn0K", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "1020" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:11 GMT" ], "Etag": [ "CM3AmeWirJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxKLTuLEgGjpbCcX4h829-9P6CGi2VrulDt3uHseo44tibj5zrfS7st1GUVXlr4oIpC" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5cy4uX18weDJmX19mb28vLi5fXzB4MmZfX2Jhci8uLl9fMHgyZl9fLi5fXzB4MmZfX2Jhei4uX18weDJmX18vMTc3MzkzMzkxMTQ5ODgyOSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzLi5fXzB4MmZfX2ZvbyUyRi4uX18weDJmX19iYXIlMkYuLl9fMHgyZl9fLi5fXzB4MmZfX2Jhei4uX18weDJmX18iLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzLi5fXzB4MmZfX2ZvbyUyRi4uX18weDJmX19iYXIlMkYuLl9fMHgyZl9fLi5fXzB4MmZfX2Jhei4uX18weDJmX18/Z2VuZXJhdGlvbj0xNzczOTMzOTExNDk4ODI5JmFsdD1tZWRpYSIsIm5hbWUiOiJ3ZWlyZC1rZXlzLi5fXzB4MmZfX2Zvby8uLl9fMHgyZl9fYmFyLy4uX18weDJmX18uLl9fMHgyZl9fYmF6Li5fXzB4MmZfXyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMzkxMTQ5ODgyOSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ00zQW1lV2lySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxMS41MDJaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTEuNTAyWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxMS41MDJaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTEuNTAyWiJ9" } }, { "ID": "45cad40cfeb04e5e", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys..__0x2f__foo%2F..__0x2f__bar%2F..__0x2f__..__0x2f__baz..__0x2f__", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:11 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:11 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933911498829" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWzkwlPqXJDsiCJwX8py1VsxzjeyhZOFZTOK_vy_4g1AShy-i16PSfFr9qv5yYWfVuYt" ] }, "Body": "aGVsbG8=" } }, { "ID": "a3764964f4feff12", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys..__0x2f__foo%2F..__0x2f__bar%2F..__0x2f__..__0x2f__baz..__0x2f__?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "1020" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:11 GMT" ], "Etag": [ "CM3AmeWirJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwN6zyomhdItRQ_qlkqB2o9x9kOcr4DcqhtwNlO2jR1nk7ZHTOVZSXQ68LZ3YZ11bKG" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5cy4uX18weDJmX19mb28vLi5fXzB4MmZfX2Jhci8uLl9fMHgyZl9fLi5fXzB4MmZfX2Jhei4uX18weDJmX18vMTc3MzkzMzkxMTQ5ODgyOSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzLi5fXzB4MmZfX2ZvbyUyRi4uX18weDJmX19iYXIlMkYuLl9fMHgyZl9fLi5fXzB4MmZfX2Jhei4uX18weDJmX18iLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzLi5fXzB4MmZfX2ZvbyUyRi4uX18weDJmX19iYXIlMkYuLl9fMHgyZl9fLi5fXzB4MmZfX2Jhei4uX18weDJmX18/Z2VuZXJhdGlvbj0xNzczOTMzOTExNDk4ODI5JmFsdD1tZWRpYSIsIm5hbWUiOiJ3ZWlyZC1rZXlzLi5fXzB4MmZfX2Zvby8uLl9fMHgyZl9fYmFyLy4uX18weDJmX18uLl9fMHgyZl9fYmF6Li5fXzB4MmZfXyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMzkxMTQ5ODgyOSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ00zQW1lV2lySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxMS41MDJaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTEuNTAyWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxMS41MDJaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTEuNTAyWiJ9" } }, { "ID": "f61f55c4f00ffa8c", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys..__0x2f__foo/..__0x2f__bar/..__0x2f__..__0x2f__baz..__0x2f__?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:11 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:11 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933911498829" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWyfOeTXxX1EaeP9-CHk4DneYZcaYxNK2a-U67Jbvyq2djuFxmJppgVGv6Lu2J1_-fi6" ] }, "Body": "aGVsbG8=" } }, { "ID": "bad227b834dd2696", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys..__0x2f__foo%2F..__0x2f__bar%2F..__0x2f__..__0x2f__baz..__0x2f__/rewriteTo/b/go-cloud-blob-test-bucket/o/weird-keys..__0x2f__foo%2F..__0x2f__bar%2F..__0x2f__..__0x2f__baz..__0x2f__-copy?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "1141" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:11 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWydekgRiGi01dP0-UvKs2eA5aE1hXFvTJlQWFnUXJ0mfDtGJLrx_qBSOeW5dTv2Z1zW" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiNSIsIm9iamVjdFNpemUiOiI1IiwiZG9uZSI6dHJ1ZSwicmVzb3VyY2UiOnsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L3dlaXJkLWtleXMuLl9fMHgyZl9fZm9vLy4uX18weDJmX19iYXIvLi5fXzB4MmZfXy4uX18weDJmX19iYXouLl9fMHgyZl9fLWNvcHkvMTc3MzkzMzkxMTg0NzIzMyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzLi5fXzB4MmZfX2ZvbyUyRi4uX18weDJmX19iYXIlMkYuLl9fMHgyZl9fLi5fXzB4MmZfX2Jhei4uX18weDJmX18tY29weSIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL3dlaXJkLWtleXMuLl9fMHgyZl9fZm9vJTJGLi5fXzB4MmZfX2JhciUyRi4uX18weDJmX18uLl9fMHgyZl9fYmF6Li5fXzB4MmZfXy1jb3B5P2dlbmVyYXRpb249MTc3MzkzMzkxMTg0NzIzMyZhbHQ9bWVkaWEiLCJuYW1lIjoid2VpcmQta2V5cy4uX18weDJmX19mb28vLi5fXzB4MmZfX2Jhci8uLl9fMHgyZl9fLi5fXzB4MmZfX2Jhei4uX18weDJmX18tY29weSIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMzkxMTg0NzIzMyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ01IaXJ1V2lySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxMS44NDlaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTEuODQ5WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxMS44NDlaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTEuODQ5WiJ9fQ==" } }, { "ID": "4b701f2905cf4c18", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys..__0x2f__foo%2F..__0x2f__bar%2F..__0x2f__..__0x2f__baz..__0x2f__-copy", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:11 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:11 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933911847233" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWyeqI2cd6urL2ezijPZ56quwmoZzAv-t3NXoG2_Q8OlWSWbdxl1APaZ83-xMU3WD1Ds" ] }, "Body": "aGVsbG8=" } }, { "ID": "5f2650164c0d21d6", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys..__0x2f__foo%2F..__0x2f__bar%2F..__0x2f__..__0x2f__baz..__0x2f__-copy?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:12 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWx9I_Ll2mEkIYoMzsec5IfoKXuKtkl7QKZZiClcERCupdG07tFXT_INEAW9ExEJrfLl" ] }, "Body": "" } }, { "ID": "23d6fece22d8e9c2", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys..__0x2f__foo%2F..__0x2f__bar%2F..__0x2f__..__0x2f__baz..__0x2f__?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:12 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzLL7pFALDEZAyd0zHnDtfZLU2rM7HFn3GYsBskF4rhMT_lMFhVYps3GQPotxXMZVSW" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestKeys/fwdslashes.replay ================================================ { "Initial": "AQAAAA7hTgxYCbnzuAAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "62226a2ec960541f", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=weird-keysfoo%2Fbar%2Fbaz\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibmFtZSI6IndlaXJkLWtleXNmb28vYmFyL2JheiJ9Cg==", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "820" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:12 GMT" ], "Etag": [ "COChyuWirJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyfbfuUpIgIxJ7AC10uW3bB18JBvPb0RspYRO6W_9MTPp-V3iJ5Yg-b34GrmJAOok7p" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5c2Zvby9iYXIvYmF6LzE3NzM5MzM5MTIyOTc2OTYiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5c2ZvbyUyRmJhciUyRmJheiIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL3dlaXJkLWtleXNmb28lMkZiYXIlMkZiYXo/Z2VuZXJhdGlvbj0xNzczOTMzOTEyMjk3Njk2JmFsdD1tZWRpYSIsIm5hbWUiOiJ3ZWlyZC1rZXlzZm9vL2Jhci9iYXoiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzM5MTIyOTc2OTYiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNPQ2h5dVdpckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTIuMzAwWiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjEyLjMwMFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTIuMzAwWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjEyLjMwMFoifQ==" } }, { "ID": "c5a4186b81507d28", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keysfoo%2Fbar%2Fbaz", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:12 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:12 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933912297696" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWyF7nmhkzU9aHraN2CkmTD1rKSNtOK7SrxGYTuuES2xUZgcwdrg4ZPNEMHPrGSc15Ta" ] }, "Body": "aGVsbG8=" } }, { "ID": "38847de6e01de39e", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keysfoo%2Fbar%2Fbaz?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "820" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:12 GMT" ], "Etag": [ "COChyuWirJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWx0BoWbk3nCMgjp0o0WNbgGLgygaxZgWV8b1WSOVENK2E_tUOvnsXkIsK1_-kml2vGn" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5c2Zvby9iYXIvYmF6LzE3NzM5MzM5MTIyOTc2OTYiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5c2ZvbyUyRmJhciUyRmJheiIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL3dlaXJkLWtleXNmb28lMkZiYXIlMkZiYXo/Z2VuZXJhdGlvbj0xNzczOTMzOTEyMjk3Njk2JmFsdD1tZWRpYSIsIm5hbWUiOiJ3ZWlyZC1rZXlzZm9vL2Jhci9iYXoiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzM5MTIyOTc2OTYiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNPQ2h5dVdpckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTIuMzAwWiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjEyLjMwMFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTIuMzAwWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjEyLjMwMFoifQ==" } }, { "ID": "10fc2e3d111a66b7", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keysfoo/bar/baz?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:12 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:12 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933912297696" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWznic2E-hZNGkicnPQK-L8eAux01FKQnJCj8pN4enzfX_SX5_fg9oone0RVJu0b86ft" ] }, "Body": "aGVsbG8=" } }, { "ID": "881182b30b1737df", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keysfoo%2Fbar%2Fbaz/rewriteTo/b/go-cloud-blob-test-bucket/o/weird-keysfoo%2Fbar%2Fbaz-copy?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "941" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:12 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwmZev4CV0_UiqL-H6I1nLvIlydpVp99q_tLf0CQK7XciJHbXmihgthQrSkLbXriYmE" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiNSIsIm9iamVjdFNpemUiOiI1IiwiZG9uZSI6dHJ1ZSwicmVzb3VyY2UiOnsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L3dlaXJkLWtleXNmb28vYmFyL2Jhei1jb3B5LzE3NzM5MzM5MTI2MzkzNTciLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5c2ZvbyUyRmJhciUyRmJhei1jb3B5IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5c2ZvbyUyRmJhciUyRmJhei1jb3B5P2dlbmVyYXRpb249MTc3MzkzMzkxMjYzOTM1NyZhbHQ9bWVkaWEiLCJuYW1lIjoid2VpcmQta2V5c2Zvby9iYXIvYmF6LWNvcHkiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzM5MTI2MzkzNTciLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNQMk8zK1dpckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTIuNjQyWiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjEyLjY0MloiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTIuNjQyWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjEyLjY0MloifX0=" } }, { "ID": "d673a27dc0920d57", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keysfoo%2Fbar%2Fbaz-copy", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:12 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:12 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933912639357" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWyS2Bb_TAPPRcWt4w5FcjEaacqOU70bbDry5jU3gzV_Xp2XagKyOIJlzC6PCQWJLjYw" ] }, "Body": "aGVsbG8=" } }, { "ID": "7b74eddb6fec624c", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keysfoo%2Fbar%2Fbaz-copy?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:12 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyW4cjyCQQnsFzCE5IdpUrvpfJRyj9E1gRDmpPs6codj6VGYWFrd1IjmVaz361Y0XEp" ] }, "Body": "" } }, { "ID": "bf85cab088268e14", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keysfoo%2Fbar%2Fbaz?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:12 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzQqI2zlnuT64lpMtKy4_xi2VnBsv4E5oKJeD70qCGLk0HHzqD9jwgcfeDAGO4keHSg" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestKeys/non-UTF8_fails.replay ================================================ { "Initial": "AQAAAA7hTgxVL6elsQAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": null } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestKeys/quote.replay ================================================ { "Initial": "AQAAAA7hTgxfIPTJ6wAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "9dd3413ef95f4911", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=weird-keysfoo%22bar%22baz\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibmFtZSI6IndlaXJkLWtleXNmb29cImJhclwiYmF6In0K", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "824" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:19 GMT" ], "Etag": [ "CJndjumirJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWydvIFXZPlHPrZbnTIo1csLnqQ6jRBrXtvIl0mTJ0hGrmIzbQhLqtXKbrs-tLllyZ8o" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5c2Zvb1wiYmFyXCJiYXovMTc3MzkzMzkxOTcxMDg3MyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzZm9vJTIyYmFyJTIyYmF6IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5c2ZvbyUyMmJhciUyMmJhej9nZW5lcmF0aW9uPTE3NzM5MzM5MTk3MTA4NzMmYWx0PW1lZGlhIiwibmFtZSI6IndlaXJkLWtleXNmb29cImJhclwiYmF6IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMzOTE5NzEwODczIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDSm5kanVtaXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE5LjcxNFoiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxOS43MTRaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE5LjcxNFoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNToyNToxOS43MTRaIn0=" } }, { "ID": "1cc7faacbf1b2e69", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keysfoo%22bar%22baz", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:19 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:19 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933919710873" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWxnNdVBexjIEDg2vFVoK9ARKWLuZx37-9RPXyE3xuePvh9q0GEAr3nAcjDR7Fw9pmV4" ] }, "Body": "aGVsbG8=" } }, { "ID": "ad66973b0fb064fd", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keysfoo%22bar%22baz?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "824" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:19 GMT" ], "Etag": [ "CJndjumirJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWz-pnumAPydl5aexjE5i9PUswiNCARaoAMjwfF_Ue3hsMammtCAQCs6zEG-HbgexuTG" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5c2Zvb1wiYmFyXCJiYXovMTc3MzkzMzkxOTcxMDg3MyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzZm9vJTIyYmFyJTIyYmF6IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5c2ZvbyUyMmJhciUyMmJhej9nZW5lcmF0aW9uPTE3NzM5MzM5MTk3MTA4NzMmYWx0PW1lZGlhIiwibmFtZSI6IndlaXJkLWtleXNmb29cImJhclwiYmF6IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMzOTE5NzEwODczIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDSm5kanVtaXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE5LjcxNFoiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxOS43MTRaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE5LjcxNFoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNToyNToxOS43MTRaIn0=" } }, { "ID": "3ee52949cea56704", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keysfoo%22bar%22baz?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:19 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:19 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933919710873" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWxmsir8C-z_IbmUm4IEfg8ZXUDQAwOyRxO-qKg8z1F8xBC9OcZtz9T96b3znQDtEARo" ] }, "Body": "aGVsbG8=" } }, { "ID": "be000614bca5e51b", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keysfoo%22bar%22baz/rewriteTo/b/go-cloud-blob-test-bucket/o/weird-keysfoo%22bar%22baz-copy?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "945" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:20 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxRiix1p0WRXnG21aZYHo1WYr3xhwRF1iAD_iEUnloR48qkRTQhO7xLRUuyy38m0EYr" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiNSIsIm9iamVjdFNpemUiOiI1IiwiZG9uZSI6dHJ1ZSwicmVzb3VyY2UiOnsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L3dlaXJkLWtleXNmb29cImJhclwiYmF6LWNvcHkvMTc3MzkzMzkyMDA0MTM5NCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzZm9vJTIyYmFyJTIyYmF6LWNvcHkiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzZm9vJTIyYmFyJTIyYmF6LWNvcHk/Z2VuZXJhdGlvbj0xNzczOTMzOTIwMDQxMzk0JmFsdD1tZWRpYSIsIm5hbWUiOiJ3ZWlyZC1rZXlzZm9vXCJiYXJcImJhei1jb3B5IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMzOTIwMDQxMzk0IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTEx6b3VtaXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjIwLjA0M1oiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToyMC4wNDNaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjIwLjA0M1oiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNToyNToyMC4wNDNaIn19" } }, { "ID": "f63c96226d6467f4", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keysfoo%22bar%22baz-copy", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:20 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:20 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933920041394" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWxZpp77q8ZZB3R6eyfHY1QgeAgcE7BQZ9z-EfO66EVq_yzgmcy0c3XzY0Vemc0r9QkF" ] }, "Body": "aGVsbG8=" } }, { "ID": "3bbeac1af97c7d78", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keysfoo%22bar%22baz-copy?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:20 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzTPUDBdp9XgdyOudX94U0HCQPZUqtsCmA4kMijS3R1qn3kLtquo7qSt4bnB6gVgwAf" ] }, "Body": "" } }, { "ID": "5e04d6ca39dd5a58", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keysfoo%22bar%22baz?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:20 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxHmiLjddWOGpNsCSGvDL6CrH7faUyDBujaf-3PBQmo2Xq4IJoQKUcyIK_dVQgV9HEY" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestKeys/repeatedbackslashes.replay ================================================ { "Initial": "AQAAAA7hTgxYNlt9agAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "005275642b9982c4", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=weird-keys..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibmFtZSI6IndlaXJkLWtleXMuLlxcZm9vXFxcXGJhclxcXFxcXGJheiJ9Cg==", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "872" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:13 GMT" ], "Etag": [ "CMDA+eWirJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWy7w0tytzNo1NMr3UWI4lfiWU9nbxTprQ54Vcxor3gewEJOxs642kt_Ra6PotBHqKxX" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5cy4uXFxmb29cXFxcYmFyXFxcXFxcYmF6LzE3NzM5MzM5MTMwNzE2ODAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5cy4uJTVDZm9vJTVDJTVDYmFyJTVDJTVDJTVDYmF6IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5cy4uJTVDZm9vJTVDJTVDYmFyJTVDJTVDJTVDYmF6P2dlbmVyYXRpb249MTc3MzkzMzkxMzA3MTY4MCZhbHQ9bWVkaWEiLCJuYW1lIjoid2VpcmQta2V5cy4uXFxmb29cXFxcYmFyXFxcXFxcYmF6IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMzOTEzMDcxNjgwIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTURBK2VXaXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjEzLjA3NFoiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxMy4wNzRaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjEzLjA3NFoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNToyNToxMy4wNzRaIn0=" } }, { "ID": "fa57c439c38f1456", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:13 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:13 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933913071680" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWwF8maNzZKJXGxw-QJW7BtRIq8BMeauHWAqAqa7RaPCy7w6nWiJNuesM7o1eSNQFMvz" ] }, "Body": "aGVsbG8=" } }, { "ID": "5b999ffb79156b68", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "872" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:13 GMT" ], "Etag": [ "CMDA+eWirJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwfaTc_l-PPmn0YWCWaUBVWdgI8fNZZobUG1DTH5JW0cFLrXAmgCEVWyyZw5M89b84N" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5cy4uXFxmb29cXFxcYmFyXFxcXFxcYmF6LzE3NzM5MzM5MTMwNzE2ODAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5cy4uJTVDZm9vJTVDJTVDYmFyJTVDJTVDJTVDYmF6IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5cy4uJTVDZm9vJTVDJTVDYmFyJTVDJTVDJTVDYmF6P2dlbmVyYXRpb249MTc3MzkzMzkxMzA3MTY4MCZhbHQ9bWVkaWEiLCJuYW1lIjoid2VpcmQta2V5cy4uXFxmb29cXFxcYmFyXFxcXFxcYmF6IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMzOTEzMDcxNjgwIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTURBK2VXaXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjEzLjA3NFoiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxMy4wNzRaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjEzLjA3NFoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNToyNToxMy4wNzRaIn0=" } }, { "ID": "4db60cd391b1f810", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:13 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:13 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933913071680" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWxGSo_o436WqvZU-0gNK_QT5mVgg4fa3JzzXa71hA8CzWkFzLq-VCWUKmcTi08xhQ-i" ] }, "Body": "aGVsbG8=" } }, { "ID": "fe145fd49bf715f9", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz/rewriteTo/b/go-cloud-blob-test-bucket/o/weird-keys..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz-copy?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "993" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:13 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxZtxNgVdCKvwEjzdbWGmssfIrrh0-slB5QgxywzJWtFXhiDlm_u77SBoiWKJSibe5z" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiNSIsIm9iamVjdFNpemUiOiI1IiwiZG9uZSI6dHJ1ZSwicmVzb3VyY2UiOnsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L3dlaXJkLWtleXMuLlxcZm9vXFxcXGJhclxcXFxcXGJhei1jb3B5LzE3NzM5MzM5MTMyODMxOTIiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5cy4uJTVDZm9vJTVDJTVDYmFyJTVDJTVDJTVDYmF6LWNvcHkiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzLi4lNUNmb28lNUMlNUNiYXIlNUMlNUMlNUNiYXotY29weT9nZW5lcmF0aW9uPTE3NzM5MzM5MTMyODMxOTImYWx0PW1lZGlhIiwibmFtZSI6IndlaXJkLWtleXMuLlxcZm9vXFxcXGJhclxcXFxcXGJhei1jb3B5IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMzOTEzMjgzMTkyIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDUGkwaHVhaXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjEzLjI4NVoiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxMy4yODVaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjEzLjI4NVoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNToyNToxMy4yODVaIn19" } }, { "ID": "d45f535c25b72dc6", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz-copy", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:13 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:13 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933913283192" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWwHhVnqBFNkGdPhQHwfdf1kpo0i-X7_itcR6l8J3G5BYN3cYLW_WlFKsspRvJakaAMQ" ] }, "Body": "aGVsbG8=" } }, { "ID": "52d4043a658db29b", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz-copy?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:13 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzew6FesI_qEumdCi1gIN29F8H0KpBz9vRH5MWjhzY4vBKYNiTJgwvKXDEgMx6LaB8z" ] }, "Body": "" } }, { "ID": "5d0a075b01fe5d7e", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:13 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwv335_LKpCzlm8ahqxmLKHHXhxOY55pq6WkAUBrM9sT0fwgKIasIvJsc3i9A_SyYQR" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestKeys/repeatedfwdslashes.replay ================================================ { "Initial": "AQAAAA7hTgyVI6JD0AAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "f46d6376b982845d", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=weird-keysfoo%2F%2Fbar%2F%2F%2Fbaz\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibmFtZSI6IndlaXJkLWtleXNmb28vL2Jhci8vL2JheiJ9Cg==", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "844" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:26:14 GMT" ], "Etag": [ "CKKmgIOjrJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwN_pYbzCVSRqkYdzXI3HjnbYZZNcbeeU9vwjZ9QA2SRG4GXCVRxueY1njzcZmgcj8z" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5c2Zvby8vYmFyLy8vYmF6LzE3NzM5MzM5NzQwMDA0MTgiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5c2ZvbyUyRiUyRmJhciUyRiUyRiUyRmJheiIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL3dlaXJkLWtleXNmb28lMkYlMkZiYXIlMkYlMkYlMkZiYXo/Z2VuZXJhdGlvbj0xNzczOTMzOTc0MDAwNDE4JmFsdD1tZWRpYSIsIm5hbWUiOiJ3ZWlyZC1rZXlzZm9vLy9iYXIvLy9iYXoiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzM5NzQwMDA0MTgiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNLS21nSU9qckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjY6MTQuMDAzWiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI2OjE0LjAwM1oiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjY6MTQuMDAzWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjI2OjE0LjAwM1oifQ==" } }, { "ID": "e1f78859e24a4c2e", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keysfoo%2F%2Fbar%2F%2F%2Fbaz", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:26:14 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:26:14 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933974000418" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWxtHpl_Lt917dU56Gh2nxVvQKR0uLL-h7UA67b9kFsXImMKo5rUzaYnu6mgRuZ8lQBY" ] }, "Body": "aGVsbG8=" } }, { "ID": "114c1c212dd18298", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keysfoo%2F%2Fbar%2F%2F%2Fbaz?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "844" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:26:14 GMT" ], "Etag": [ "CKKmgIOjrJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwAXF2NN1U9Cy9YFixCTEgywBrSOHPSFZzQkK5Xf42OY7lceVRBTX9UxnNokzQFrjuj" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5c2Zvby8vYmFyLy8vYmF6LzE3NzM5MzM5NzQwMDA0MTgiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5c2ZvbyUyRiUyRmJhciUyRiUyRiUyRmJheiIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL3dlaXJkLWtleXNmb28lMkYlMkZiYXIlMkYlMkYlMkZiYXo/Z2VuZXJhdGlvbj0xNzczOTMzOTc0MDAwNDE4JmFsdD1tZWRpYSIsIm5hbWUiOiJ3ZWlyZC1rZXlzZm9vLy9iYXIvLy9iYXoiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzM5NzQwMDA0MTgiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNLS21nSU9qckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjY6MTQuMDAzWiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI2OjE0LjAwM1oiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjY6MTQuMDAzWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjI2OjE0LjAwM1oifQ==" } }, { "ID": "8505748f6c8fb1e7", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keysfoo//bar///baz?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:26:14 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:26:14 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933974000418" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWzm_0k6jkD93kM-LYK2cuyqqutHdM0cbp6BkUuCNU4tv5H7Eo9lgjcLvkjGKU16C06e" ] }, "Body": "aGVsbG8=" } }, { "ID": "7a7f4aa112501a70", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keysfoo%2F%2Fbar%2F%2F%2Fbaz/rewriteTo/b/go-cloud-blob-test-bucket/o/weird-keysfoo%2F%2Fbar%2F%2F%2Fbaz-copy?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "965" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:26:14 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwHrk5J3E-oHLO8YC8cvlLanWuxANvgSd-ap7tmR2Ra6DPuPfafyqIB8k6NuvTX3HFQ" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiNSIsIm9iamVjdFNpemUiOiI1IiwiZG9uZSI6dHJ1ZSwicmVzb3VyY2UiOnsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L3dlaXJkLWtleXNmb28vL2Jhci8vL2Jhei1jb3B5LzE3NzM5MzM5NzQzNzk5ODkiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5c2ZvbyUyRiUyRmJhciUyRiUyRiUyRmJhei1jb3B5IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5c2ZvbyUyRiUyRmJhciUyRiUyRiUyRmJhei1jb3B5P2dlbmVyYXRpb249MTc3MzkzMzk3NDM3OTk4OSZhbHQ9bWVkaWEiLCJuYW1lIjoid2VpcmQta2V5c2Zvby8vYmFyLy8vYmF6LWNvcHkiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzM5NzQzNzk5ODkiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNOVzdsNE9qckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjY6MTQuMzgyWiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI2OjE0LjM4MloiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjY6MTQuMzgyWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjI2OjE0LjM4MloifX0=" } }, { "ID": "74d7d3bea94eb51f", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keysfoo%2F%2Fbar%2F%2F%2Fbaz-copy", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:26:14 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:26:14 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933974379989" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWxXUCGSSQJra7peGkwKaUnyE6qAkv4v8V5pa-Z-f3I6vu4VwKeSGiwBgNqQWVzde8Io" ] }, "Body": "aGVsbG8=" } }, { "ID": "2731c2bd6cf23c7f", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keysfoo%2F%2Fbar%2F%2F%2Fbaz-copy?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:26:14 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxbI_jZTdzMZ3x_MhlLIk3Xv6j-J2xblW5njnAfpfRL4WkFAoN7adTPI5_K5syQYWcc" ] }, "Body": "" } }, { "ID": "cf515bcc246a648b", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keysfoo%2F%2Fbar%2F%2F%2Fbaz?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:26:14 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzDfyQAXyzGZjfabeuBDhXb-KemJsrMc5JiiddTnLVvljY-Bg98d_d7qYytT1AuW8bD" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestKeys/spaces.replay ================================================ { "Initial": "AQAAAA7hTgxZG6hySAAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "5e7cc8ea5e03afaf", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=weird-keysfoo+bar+baz\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibmFtZSI6IndlaXJkLWtleXNmb28gYmFyIGJheiJ9Cg==", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "820" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:13 GMT" ], "Etag": [ "CKDQo+airJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWweYG9TJUGDZPg1L9VHDrZG6e2VSIwCHBS4Z9ZHjKAYRqHZi-PSlTuvGBqWaEpcZYzJ" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5c2ZvbyBiYXIgYmF6LzE3NzM5MzM5MTM3NjE4MjQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5c2ZvbyUyMGJhciUyMGJheiIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL3dlaXJkLWtleXNmb28lMjBiYXIlMjBiYXo/Z2VuZXJhdGlvbj0xNzczOTMzOTEzNzYxODI0JmFsdD1tZWRpYSIsIm5hbWUiOiJ3ZWlyZC1rZXlzZm9vIGJhciBiYXoiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzM5MTM3NjE4MjQiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNLRFFvK2FpckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTMuNzY0WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjEzLjc2NFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTMuNzY0WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjEzLjc2NFoifQ==" } }, { "ID": "8b7bff2a3fa8bf63", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keysfoo%20bar%20baz", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:13 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:13 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933913761824" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWwsQ0oI8u1fjouZJdo_IMX87yVPDRIPvsC4TbtkOy53PH5Pd6JNfVWXnola3ParyCut" ] }, "Body": "aGVsbG8=" } }, { "ID": "5220559a77e86369", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keysfoo%20bar%20baz?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "820" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:13 GMT" ], "Etag": [ "CKDQo+airJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWw4ygHFk-ANn9P50lz1CIaywXCXDvhuzcnlM0tA1LuCPFZEhVYG13H4aF88DQa4t-D1" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5c2ZvbyBiYXIgYmF6LzE3NzM5MzM5MTM3NjE4MjQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5c2ZvbyUyMGJhciUyMGJheiIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL3dlaXJkLWtleXNmb28lMjBiYXIlMjBiYXo/Z2VuZXJhdGlvbj0xNzczOTMzOTEzNzYxODI0JmFsdD1tZWRpYSIsIm5hbWUiOiJ3ZWlyZC1rZXlzZm9vIGJhciBiYXoiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzM5MTM3NjE4MjQiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNLRFFvK2FpckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTMuNzY0WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjEzLjc2NFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTMuNzY0WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjEzLjc2NFoifQ==" } }, { "ID": "f73b8cb8294cbbd7", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keysfoo%20bar%20baz?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:13 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:13 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933913761824" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWwb4N-P8Il32AA0HgKh8A7-VcULS_KNfwUvJhwZwOCtNcSQoqJrYHzfbc8E7fDMn1r_" ] }, "Body": "aGVsbG8=" } }, { "ID": "24bec0118a3eb3a8", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keysfoo%20bar%20baz/rewriteTo/b/go-cloud-blob-test-bucket/o/weird-keysfoo%20bar%20baz-copy?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "941" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:14 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWx0F_cRVkOJ3Wj96lMClfiYJlAUcthCCm5NDj3hF-Afs4qHjMwd61WtRvhsQnilThxg" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiNSIsIm9iamVjdFNpemUiOiI1IiwiZG9uZSI6dHJ1ZSwicmVzb3VyY2UiOnsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L3dlaXJkLWtleXNmb28gYmFyIGJhei1jb3B5LzE3NzM5MzM5MTQwNTM1ODAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5c2ZvbyUyMGJhciUyMGJhei1jb3B5IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5c2ZvbyUyMGJhciUyMGJhei1jb3B5P2dlbmVyYXRpb249MTc3MzkzMzkxNDA1MzU4MCZhbHQ9bWVkaWEiLCJuYW1lIjoid2VpcmQta2V5c2ZvbyBiYXIgYmF6LWNvcHkiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzM5MTQwNTM1ODAiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNNeTN0ZWFpckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTQuMDU2WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE0LjA1NloiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTQuMDU2WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjE0LjA1NloifX0=" } }, { "ID": "a94340800c20bea0", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keysfoo%20bar%20baz-copy", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:14 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:14 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933914053580" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWzMEg9K0sxcb1e_HXYUjJweswQKY4qkG1cwBGY4xPE0XoOIZiiJtl1RhlTpKa907qTQ" ] }, "Body": "aGVsbG8=" } }, { "ID": "8077133a15219701", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keysfoo%20bar%20baz-copy?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:14 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWy0gHmUw3MxgrbQfOdGr7IjoffEgOqnFAcN8GKYQGGls0Y_aH6oGF0f18iZIhnVcOm0" ] }, "Body": "" } }, { "ID": "c6ce503a97808aa3", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keysfoo%20bar%20baz?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:14 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyl78jW0C5FVMzGODmXeiplhpnqG_fhom-oI1Xjp22SQXDoZpfjt-P9djyFjZ3bWrhp" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestKeys/startwithdigit.replay ================================================ { "Initial": "AQAAAA7hTgxgFAQh9wAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "bb20b21ecb2cae91", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=weird-keys12345\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibmFtZSI6IndlaXJkLWtleXMxMjM0NSJ9Cg==", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "788" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:20 GMT" ], "Etag": [ "CLGKxemirJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwMjAJqgA3e1gLX57FyG50Ah-fkMolN6ZSfMEiJc5ULoPoBH6fGw9mT65Pj-sHDlttJ" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5czEyMzQ1LzE3NzM5MzM5MjA2MDEzOTMiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5czEyMzQ1IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5czEyMzQ1P2dlbmVyYXRpb249MTc3MzkzMzkyMDYwMTM5MyZhbHQ9bWVkaWEiLCJuYW1lIjoid2VpcmQta2V5czEyMzQ1IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMzOTIwNjAxMzkzIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTEdLeGVtaXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjIwLjYwNFoiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToyMC42MDRaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjIwLjYwNFoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNToyNToyMC42MDRaIn0=" } }, { "ID": "ed6abb6e5e13db19", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys12345", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:20 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:20 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933920601393" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWx8mlbdmzyOer_gxXANxwKv9CA4EExzyuoQ-D9VNUkTNkb5Zjp2_-YlodxcIjnqRvNZ" ] }, "Body": "aGVsbG8=" } }, { "ID": "6219f784a5a8d6cf", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys12345?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "788" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:20 GMT" ], "Etag": [ "CLGKxemirJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWy2AaXRwOzMLMowzIlwj8sEkhkV2FnDhWjTixbZpl5jmx2a75qt-Z8c_y_SUTw6MO3X" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5czEyMzQ1LzE3NzM5MzM5MjA2MDEzOTMiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5czEyMzQ1IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5czEyMzQ1P2dlbmVyYXRpb249MTc3MzkzMzkyMDYwMTM5MyZhbHQ9bWVkaWEiLCJuYW1lIjoid2VpcmQta2V5czEyMzQ1IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMzOTIwNjAxMzkzIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTEdLeGVtaXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjIwLjYwNFoiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToyMC42MDRaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjIwLjYwNFoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNToyNToyMC42MDRaIn0=" } }, { "ID": "f6e5f1eb3157f121", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys12345?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:20 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:20 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933920601393" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWyzsNW1eiRjaO4hcpc4WzOTeXBiWoz7THh505h8E215IHaRqyMbY3dBXfs67elFAzth" ] }, "Body": "aGVsbG8=" } }, { "ID": "b385dcc09e7d3fe7", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys12345/rewriteTo/b/go-cloud-blob-test-bucket/o/weird-keys12345-copy?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "909" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:20 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwJB7wLGFgL0kpclKcvdI7zYY8dqcE1xbC-seqUtqvbwjSuhRJV4GoYkuRD9y1uRxgW" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiNSIsIm9iamVjdFNpemUiOiI1IiwiZG9uZSI6dHJ1ZSwicmVzb3VyY2UiOnsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L3dlaXJkLWtleXMxMjM0NS1jb3B5LzE3NzM5MzM5MjA5NDE4MzQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vd2VpcmQta2V5czEyMzQ1LWNvcHkiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzMTIzNDUtY29weT9nZW5lcmF0aW9uPTE3NzM5MzM5MjA5NDE4MzQmYWx0PW1lZGlhIiwibmFtZSI6IndlaXJkLWtleXMxMjM0NS1jb3B5IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMzOTIwOTQxODM0IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDSXJ1MmVtaXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjIwLjk0NFoiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToyMC45NDRaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjI1OjIwLjk0NFoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNToyNToyMC45NDRaIn19" } }, { "ID": "0aa2793ac6528748", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys12345-copy", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:21 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:20 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933920941834" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWzl922AFol7KslIz0kKVpX2XrYmB4GZsM3OSKeZnpJgwAaMFBqkrkd1Mvh02nJNo7dV" ] }, "Body": "aGVsbG8=" } }, { "ID": "8b8a1b3177426a49", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys12345-copy?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:21 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyWLcTtOuU-OxEhhftFEWZhNay8qNY90PXSwyd7onnxcqYHnZ8htYkizac2jySEPMp0" ] }, "Body": "" } }, { "ID": "00549812e8151c89", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys12345?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:21 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwyctZYmh3jCa6w6n8kuwXFY5oD0-p_Sxz_szhNx8aZa_h1jLOAwT6if8HsY8UpxEUR" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestKeys/unicode.replay ================================================ { "Initial": "AQAAAA7hTgxaEiN1HgAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "c94c7678758aac00", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=weird-keys%E2%98%BA%E2%98%BA%E2%98%BA\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibmFtZSI6IndlaXJkLWtleXPimLrimLrimLoifQo=", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "840" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:14 GMT" ], "Etag": [ "CPynzuairJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWz017MTZ7e3RjSUqDVt6hHZrIURRRCASIuckPWU9-sliQhBz_ifId3fFDXiOVORrs-L" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5c+KYuuKYuuKYui8xNzczOTMzOTE0NDYxMTgwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL3dlaXJkLWtleXMlRTIlOTglQkElRTIlOTglQkElRTIlOTglQkEiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzJUUyJTk4JUJBJUUyJTk4JUJBJUUyJTk4JUJBP2dlbmVyYXRpb249MTc3MzkzMzkxNDQ2MTE4MCZhbHQ9bWVkaWEiLCJuYW1lIjoid2VpcmQta2V5c+KYuuKYuuKYuiIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMzkxNDQ2MTE4MCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ1B5bnp1YWlySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxNC40NjNaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTQuNDYzWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxNC40NjNaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTQuNDYzWiJ9" } }, { "ID": "fe8cf92adf2822b8", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:14 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:14 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933914461180" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWx4dSsAQRiIJ4tUvjhN1WChs3M8naO-9MGc1Mgh74uNqzMFnfu8zfch0sScNIAAQHNf" ] }, "Body": "aGVsbG8=" } }, { "ID": "d78a413b1640a9ef", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "840" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:14 GMT" ], "Etag": [ "CPynzuairJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWy5fZM9aQoMwF4LbQJxedW5_k7TCSbJtTlq4AjR7Idg0qA8iQWtXVcdcdKyB8KpwiA4" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvd2VpcmQta2V5c+KYuuKYuuKYui8xNzczOTMzOTE0NDYxMTgwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL3dlaXJkLWtleXMlRTIlOTglQkElRTIlOTglQkElRTIlOTglQkEiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby93ZWlyZC1rZXlzJUUyJTk4JUJBJUUyJTk4JUJBJUUyJTk4JUJBP2dlbmVyYXRpb249MTc3MzkzMzkxNDQ2MTE4MCZhbHQ9bWVkaWEiLCJuYW1lIjoid2VpcmQta2V5c+KYuuKYuuKYuiIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMzkxNDQ2MTE4MCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ1B5bnp1YWlySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxNC40NjNaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTQuNDYzWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxNC40NjNaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTQuNDYzWiJ9" } }, { "ID": "a3a01eda6787901d", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:14 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:14 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933914461180" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWwupbwB-ULQjNGBHg1r0v2h-ZziLYfgYwaIWKcE3QHXyyPFDI7D22EA8wISSYhnf3hF" ] }, "Body": "aGVsbG8=" } }, { "ID": "fd273df388cd6db9", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA/rewriteTo/b/go-cloud-blob-test-bucket/o/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA-copy?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "961" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:14 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWw7b_je1ss1RlW03Wo788EQRo9hvgSEXwHx5dqOIKDLJWk84LP2Ud9Msg_yS_SUcKKU" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiNSIsIm9iamVjdFNpemUiOiI1IiwiZG9uZSI6dHJ1ZSwicmVzb3VyY2UiOnsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L3dlaXJkLWtleXPimLrimLrimLotY29weS8xNzczOTMzOTE0ODEwMTczIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL3dlaXJkLWtleXMlRTIlOTglQkElRTIlOTglQkElRTIlOTglQkEtY29weSIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL3dlaXJkLWtleXMlRTIlOTglQkElRTIlOTglQkElRTIlOTglQkEtY29weT9nZW5lcmF0aW9uPTE3NzM5MzM5MTQ4MTAxNzMmYWx0PW1lZGlhIiwibmFtZSI6IndlaXJkLWtleXPimLrimLrimLotY29weSIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMzkxNDgxMDE3MyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ0wzTzQrYWlySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxNC44MTJaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTQuODEyWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNToyNToxNC44MTJaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MjU6MTQuODEyWiJ9fQ==" } }, { "ID": "bed97d654a94ad84", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA-copy", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:14 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:14 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933914810173" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Uploadid": [ "AGQBYWzeRoEquuTG3_q7fq83WnmzuFnGnbmCnvjJmtaoVPQj2QBATTGfqpDOylVtrtGtE488" ] }, "Body": "aGVsbG8=" } }, { "ID": "d45f1b366efbb6de", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA-copy?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:14 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWy0Ok9--OozczDSbYYWJTDSfsm4DShjVkNhBkw_uwHcUl5V8ai7kvM2IeG6r8WAJYVk" ] }, "Body": "" } }, { "ID": "2d917587b1b44e24", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:25:15 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxqJN6CvuNU7z8yyt1tpxhiy4Yswwbqr23vQN9-50Y3MBDhZgCp1ZFNAJ6eRwo0XuWL" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestList/PaginationConsistencyAfterDelete.replay ================================================ { "Initial": "AQAAAA7hTghFHJ+LWgAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "1170d69d5803e492", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-list\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2403" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:49 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxjvF8jk2UCycRMQX1tsD4jwQNyGqbOmdy9d8SvohoQb_8le27Frj3VuYcrw1VxjXJi" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTAvMTU0OTY2MDkyMTY5OTM2MyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTAiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTA/Z2VuZXJhdGlvbj0xNTQ5NjYwOTIxNjk5MzYzJmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTAiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5MjE2OTkzNjMiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNLTzRpdWFJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDEuNjk4WiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAxLjY5OFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDEuNjk4WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAxLjY5OFoifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTEvMTc2NDYxODA0NTk2MDEzNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTEiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTE/Z2VuZXJhdGlvbj0xNzY0NjE4MDQ1OTYwMTM1JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTEiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NjQ2MTgwNDU5NjAxMzUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNNZmZyTDZTblpFREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjUtMTItMDFUMTk6NDA6NDUuOTYyWiIsInVwZGF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ1Ljk2MloiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjUtMTItMDFUMTk6NDA6NDUuOTYyWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ1Ljk2MloifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTIvMTU0OTY2MDkyMjg1ODY1OSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTIiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTI/Z2VuZXJhdGlvbj0xNTQ5NjYwOTIyODU4NjU5JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTIiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5MjI4NTg2NTkiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNLT1owZWFJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDIuODU4WiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAyLjg1OFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDIuODU4WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAyLjg1OFoifV19" } }, { "ID": "2dc21eb643a12b58", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=2\u0026pageToken=\u0026prefix=blob-for-list\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "1657" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:49 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWy8NyFgbPaKAAVylsW6NZ0wajwfzZd7njqFBsOomK_lzbAs3FCo9JnAOZ0DCfgT7SR7" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNnOWliRzlpTFdadmNpMXNhWE4wTFRFPSIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItbGlzdC0wLzE1NDk2NjA5MjE2OTkzNjMiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItbGlzdC0wIiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItbGlzdC0wP2dlbmVyYXRpb249MTU0OTY2MDkyMTY5OTM2MyZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItbGlzdC0wIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTQ5NjYwOTIxNjk5MzYzIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDS080aXVhSXJlQUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAxLjY5OFoiLCJ1cGRhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjowMS42OThaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAxLjY5OFoiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMi0wOFQyMToyMjowMS42OThaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItbGlzdC0xLzE3NjQ2MTgwNDU5NjAxMzUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItbGlzdC0xIiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItbGlzdC0xP2dlbmVyYXRpb249MTc2NDYxODA0NTk2MDEzNSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItbGlzdC0xIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzY0NjE4MDQ1OTYwMTM1IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTWZmckw2U25aRURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ1Ljk2MloiLCJ1cGRhdGVkIjoiMjAyNS0xMi0wMVQxOTo0MDo0NS45NjJaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ1Ljk2MloiLCJ0aW1lRmluYWxpemVkIjoiMjAyNS0xMi0wMVQxOTo0MDo0NS45NjJaIn1dfQ==" } }, { "ID": "1f8fce9645ea7937", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-list-1?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:07:49 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwXBLTQa3U0-qqj4HOlzz8ipLgUlEdc_u0q5B-QbNnseqjVh0j6kiR6AIvV9CAJa9bi" ] }, "Body": "" } }, { "ID": "1c321aefbcb64c9d", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=Cg9ibG9iLWZvci1saXN0LTE%3D\u0026prefix=blob-for-list\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "825" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:49 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzafrXoabMXvEn53LBHsEe92QvCCgNVW3OO9lw0wXYhaDy32o2YOjzkFxHVE5Ja55rm" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTIvMTU0OTY2MDkyMjg1ODY1OSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTIiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTI/Z2VuZXJhdGlvbj0xNTQ5NjYwOTIyODU4NjU5JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTIiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5MjI4NTg2NTkiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNLT1owZWFJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDIuODU4WiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAyLjg1OFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDIuODU4WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAyLjg1OFoifV19" } }, { "ID": "a12a6305a4a8d518", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-list-1\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibmFtZSI6ImJsb2ItZm9yLWxpc3QtMSJ9Cg==", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "788" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:50 GMT" ], "Etag": [ "COWny/SerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWw2Gt-2fjr0GzCIyjU6SXNB5G2gw09_Vjc7f_orR_Od_TrMvFocCuMWDZDB4tiVad0l" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItbGlzdC0xLzE3NzM5MzI4NzAwMzAzMDkiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItbGlzdC0xIiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItbGlzdC0xP2dlbmVyYXRpb249MTc3MzkzMjg3MDAzMDMwOSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItbGlzdC0xIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMyODcwMDMwMzA5IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDT1dueS9TZXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA3OjUwLjAzM1oiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowNzo1MC4wMzNaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA3OjUwLjAzM1oiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNTowNzo1MC4wMzNaIn0=" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestList/PaginationConsistencyAfterInsert.replay ================================================ { "Initial": "AQAAAA7hTghEOcoBcAAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "27afb171559dd67c", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-list\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2403" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:49 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxLCoP92KpjoEE_o5UqoPFp4aHN_BEnRm5mS-LFsuQiC4nOLkapVZnJ_hZqiiytA1iQ" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTAvMTU0OTY2MDkyMTY5OTM2MyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTAiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTA/Z2VuZXJhdGlvbj0xNTQ5NjYwOTIxNjk5MzYzJmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTAiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5MjE2OTkzNjMiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNLTzRpdWFJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDEuNjk4WiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAxLjY5OFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDEuNjk4WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAxLjY5OFoifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTEvMTc2NDYxODA0NTk2MDEzNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTEiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTE/Z2VuZXJhdGlvbj0xNzY0NjE4MDQ1OTYwMTM1JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTEiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NjQ2MTgwNDU5NjAxMzUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNNZmZyTDZTblpFREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjUtMTItMDFUMTk6NDA6NDUuOTYyWiIsInVwZGF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ1Ljk2MloiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjUtMTItMDFUMTk6NDA6NDUuOTYyWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ1Ljk2MloifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTIvMTU0OTY2MDkyMjg1ODY1OSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTIiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTI/Z2VuZXJhdGlvbj0xNTQ5NjYwOTIyODU4NjU5JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTIiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5MjI4NTg2NTkiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNLT1owZWFJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDIuODU4WiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAyLjg1OFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDIuODU4WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAyLjg1OFoifV19" } }, { "ID": "d0f6e288fe7b6feb", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=2\u0026pageToken=\u0026prefix=blob-for-list\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "1657" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:49 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzGMqu0XqAno3EV6Lh01-gDbV878kNQxaifd804X8hEF2nOTk1oLXl35yywv_ert3sr" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNnOWliRzlpTFdadmNpMXNhWE4wTFRFPSIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItbGlzdC0wLzE1NDk2NjA5MjE2OTkzNjMiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItbGlzdC0wIiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItbGlzdC0wP2dlbmVyYXRpb249MTU0OTY2MDkyMTY5OTM2MyZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItbGlzdC0wIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTQ5NjYwOTIxNjk5MzYzIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDS080aXVhSXJlQUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAxLjY5OFoiLCJ1cGRhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjowMS42OThaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAxLjY5OFoiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMi0wOFQyMToyMjowMS42OThaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItbGlzdC0xLzE3NjQ2MTgwNDU5NjAxMzUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItbGlzdC0xIiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItbGlzdC0xP2dlbmVyYXRpb249MTc2NDYxODA0NTk2MDEzNSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItbGlzdC0xIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzY0NjE4MDQ1OTYwMTM1IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTWZmckw2U25aRURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ1Ljk2MloiLCJ1cGRhdGVkIjoiMjAyNS0xMi0wMVQxOTo0MDo0NS45NjJaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ1Ljk2MloiLCJ0aW1lRmluYWxpemVkIjoiMjAyNS0xMi0wMVQxOTo0MDo0NS45NjJaIn1dfQ==" } }, { "ID": "57da119da21be3a7", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-list-0a\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibmFtZSI6ImJsb2ItZm9yLWxpc3QtMGEifQo=", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "792" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:49 GMT" ], "Etag": [ "CICKn/SerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWy11EKcar6I_NAB_i5Sa9Tdp-ir0LSkNWb7oOelklfukZXkLfkDSwsvrx3Vh9LwM0Qf" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItbGlzdC0wYS8xNzczOTMyODY5MzA1NjAwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWxpc3QtMGEiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTBhP2dlbmVyYXRpb249MTc3MzkzMjg2OTMwNTYwMCZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItbGlzdC0wYSIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjg2OTMwNTYwMCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ0lDS24vU2VySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNTowNzo0OS4zMTBaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDc6NDkuMzEwWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowNzo0OS4zMTBaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MDc6NDkuMzEwWiJ9" } }, { "ID": "e3973d312e29752e", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=Cg9ibG9iLWZvci1saXN0LTE%3D\u0026prefix=blob-for-list\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "825" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:49 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwt-H0z3gddKp1wJthazRQBCCtgwJLUdIawA0FyH-zqSc7PYSaCL5UN68kU4IKWBIK5" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTIvMTU0OTY2MDkyMjg1ODY1OSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTIiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTI/Z2VuZXJhdGlvbj0xNTQ5NjYwOTIyODU4NjU5JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTIiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5MjI4NTg2NTkiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNLT1owZWFJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDIuODU4WiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAyLjg1OFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDIuODU4WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAyLjg1OFoifV19" } }, { "ID": "0867fad9548a8f95", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-list-0a?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:07:49 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWz9a1HSpyPtCfpOmoVxgKCQMjqWCFdJDfX2ApyuNJD5f65T8TPPcB4ixkykZa17WSUD" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestList/by_1.replay ================================================ { "Initial": "AQAAAA7hTghDOw3KHwAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "a02424b9ba18ab4f", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-list\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2403" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:48 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxWdNKiZpKUhrS_OJfLVSO_K45tvJxPUHNYyBX21x27uStzz1rY6xQaZxK2AOCsSm-E" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTAvMTU0OTY2MDkyMTY5OTM2MyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTAiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTA/Z2VuZXJhdGlvbj0xNTQ5NjYwOTIxNjk5MzYzJmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTAiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5MjE2OTkzNjMiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNLTzRpdWFJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDEuNjk4WiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAxLjY5OFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDEuNjk4WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAxLjY5OFoifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTEvMTc2NDYxODA0NTk2MDEzNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTEiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTE/Z2VuZXJhdGlvbj0xNzY0NjE4MDQ1OTYwMTM1JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTEiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NjQ2MTgwNDU5NjAxMzUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNNZmZyTDZTblpFREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjUtMTItMDFUMTk6NDA6NDUuOTYyWiIsInVwZGF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ1Ljk2MloiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjUtMTItMDFUMTk6NDA6NDUuOTYyWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ1Ljk2MloifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTIvMTU0OTY2MDkyMjg1ODY1OSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTIiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTI/Z2VuZXJhdGlvbj0xNTQ5NjYwOTIyODU4NjU5JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTIiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5MjI4NTg2NTkiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNLT1owZWFJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDIuODU4WiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAyLjg1OFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDIuODU4WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAyLjg1OFoifV19" } }, { "ID": "54a6fc0ca0f66f31", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1\u0026pageToken=\u0026prefix=blob-for-list\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "868" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:48 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwJMczB41jIXPnj_KBbYXrn_I6UxARnmSCAlsYBWzCGLPjbbx3uEaUNmj4YEo0TnYQY" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNnOWliRzlpTFdadmNpMXNhWE4wTFRBPSIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItbGlzdC0wLzE1NDk2NjA5MjE2OTkzNjMiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItbGlzdC0wIiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItbGlzdC0wP2dlbmVyYXRpb249MTU0OTY2MDkyMTY5OTM2MyZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItbGlzdC0wIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTQ5NjYwOTIxNjk5MzYzIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDS080aXVhSXJlQUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAxLjY5OFoiLCJ1cGRhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjowMS42OThaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAxLjY5OFoiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMi0wOFQyMToyMjowMS42OThaIn1dfQ==" } }, { "ID": "8e5e23bf0ca96149", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1\u0026pageToken=Cg9ibG9iLWZvci1saXN0LTA%3D\u0026prefix=blob-for-list\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "868" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:48 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWy9i1X04shO650SyKP7GcqlJCpeTwpj4vAJclfNUeXqLkKdwJyv36lXpPOfdctVgtur" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNnOWliRzlpTFdadmNpMXNhWE4wTFRFPSIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItbGlzdC0xLzE3NjQ2MTgwNDU5NjAxMzUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItbGlzdC0xIiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItbGlzdC0xP2dlbmVyYXRpb249MTc2NDYxODA0NTk2MDEzNSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItbGlzdC0xIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzY0NjE4MDQ1OTYwMTM1IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTWZmckw2U25aRURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ1Ljk2MloiLCJ1cGRhdGVkIjoiMjAyNS0xMi0wMVQxOTo0MDo0NS45NjJaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ1Ljk2MloiLCJ0aW1lRmluYWxpemVkIjoiMjAyNS0xMi0wMVQxOTo0MDo0NS45NjJaIn1dfQ==" } }, { "ID": "cf97521399745c23", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1\u0026pageToken=Cg9ibG9iLWZvci1saXN0LTE%3D\u0026prefix=blob-for-list\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "825" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:48 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzgt48DgosJZaAabeysJxiOeNber-iVi25qGdR08QJeB6S-GfbEYvIC5KGEnz1zSnBJ" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTIvMTU0OTY2MDkyMjg1ODY1OSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTIiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTI/Z2VuZXJhdGlvbj0xNTQ5NjYwOTIyODU4NjU5JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTIiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5MjI4NTg2NTkiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNLT1owZWFJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDIuODU4WiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAyLjg1OFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDIuODU4WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAyLjg1OFoifV19" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestList/by_2.replay ================================================ { "Initial": "AQAAAA7hTghEGtFxMAAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "10b50de11f8a95db", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-list\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2403" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:48 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxmv18q2wy8GNJU16KQh2TFh7zFNvFSXEDXcvx8uxw-cChu-knQH1IpH2y5Qpcm7ljD" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTAvMTU0OTY2MDkyMTY5OTM2MyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTAiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTA/Z2VuZXJhdGlvbj0xNTQ5NjYwOTIxNjk5MzYzJmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTAiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5MjE2OTkzNjMiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNLTzRpdWFJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDEuNjk4WiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAxLjY5OFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDEuNjk4WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAxLjY5OFoifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTEvMTc2NDYxODA0NTk2MDEzNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTEiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTE/Z2VuZXJhdGlvbj0xNzY0NjE4MDQ1OTYwMTM1JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTEiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NjQ2MTgwNDU5NjAxMzUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNNZmZyTDZTblpFREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjUtMTItMDFUMTk6NDA6NDUuOTYyWiIsInVwZGF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ1Ljk2MloiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjUtMTItMDFUMTk6NDA6NDUuOTYyWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ1Ljk2MloifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTIvMTU0OTY2MDkyMjg1ODY1OSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTIiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTI/Z2VuZXJhdGlvbj0xNTQ5NjYwOTIyODU4NjU5JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTIiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5MjI4NTg2NTkiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNLT1owZWFJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDIuODU4WiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAyLjg1OFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDIuODU4WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAyLjg1OFoifV19" } }, { "ID": "d000011309b8b9b9", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=2\u0026pageToken=\u0026prefix=blob-for-list\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "1657" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:48 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxJTL4gtBvTwp86Gni3rICs9YbvWYdr2PcPueuNWb8X_8RwnkLxdebxCozmrizIC_Pg" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNnOWliRzlpTFdadmNpMXNhWE4wTFRFPSIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItbGlzdC0wLzE1NDk2NjA5MjE2OTkzNjMiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItbGlzdC0wIiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItbGlzdC0wP2dlbmVyYXRpb249MTU0OTY2MDkyMTY5OTM2MyZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItbGlzdC0wIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTQ5NjYwOTIxNjk5MzYzIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDS080aXVhSXJlQUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAxLjY5OFoiLCJ1cGRhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjowMS42OThaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAxLjY5OFoiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMi0wOFQyMToyMjowMS42OThaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItbGlzdC0xLzE3NjQ2MTgwNDU5NjAxMzUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItbGlzdC0xIiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItbGlzdC0xP2dlbmVyYXRpb249MTc2NDYxODA0NTk2MDEzNSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItbGlzdC0xIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzY0NjE4MDQ1OTYwMTM1IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTWZmckw2U25aRURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ1Ljk2MloiLCJ1cGRhdGVkIjoiMjAyNS0xMi0wMVQxOTo0MDo0NS45NjJaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ1Ljk2MloiLCJ0aW1lRmluYWxpemVkIjoiMjAyNS0xMi0wMVQxOTo0MDo0NS45NjJaIn1dfQ==" } }, { "ID": "0f24ce21d1ffb31d", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=2\u0026pageToken=Cg9ibG9iLWZvci1saXN0LTE%3D\u0026prefix=blob-for-list\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "825" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:48 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyd23C7ajS5DyCm_WYNWT_mHHPeCgeymEyNhTv9ELdT7Ms7dxmlaNawibZLkqXAmMdt" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTIvMTU0OTY2MDkyMjg1ODY1OSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTIiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTI/Z2VuZXJhdGlvbj0xNTQ5NjYwOTIyODU4NjU5JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTIiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5MjI4NTg2NTkiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNLT1owZWFJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDIuODU4WiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAyLjg1OFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDIuODU4WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAyLjg1OFoifV19" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestList/by_3.replay ================================================ { "Initial": "AQAAAA7hTghEK3GZygAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "797d0e30fadf52c4", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-list\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2403" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:48 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxGv_p3qMAAXvmQfxzK36uOdZRAC7wCGWijhk_GtS24_YYrS4Cri28v-EdlY3mOIie_" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTAvMTU0OTY2MDkyMTY5OTM2MyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTAiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTA/Z2VuZXJhdGlvbj0xNTQ5NjYwOTIxNjk5MzYzJmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTAiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5MjE2OTkzNjMiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNLTzRpdWFJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDEuNjk4WiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAxLjY5OFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDEuNjk4WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAxLjY5OFoifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTEvMTc2NDYxODA0NTk2MDEzNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTEiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTE/Z2VuZXJhdGlvbj0xNzY0NjE4MDQ1OTYwMTM1JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTEiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NjQ2MTgwNDU5NjAxMzUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNNZmZyTDZTblpFREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjUtMTItMDFUMTk6NDA6NDUuOTYyWiIsInVwZGF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ1Ljk2MloiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjUtMTItMDFUMTk6NDA6NDUuOTYyWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ1Ljk2MloifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTIvMTU0OTY2MDkyMjg1ODY1OSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTIiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTI/Z2VuZXJhdGlvbj0xNTQ5NjYwOTIyODU4NjU5JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTIiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5MjI4NTg2NTkiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNLT1owZWFJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDIuODU4WiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAyLjg1OFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDIuODU4WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAyLjg1OFoifV19" } }, { "ID": "c17dff0f51d64679", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=3\u0026pageToken=\u0026prefix=blob-for-list\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2403" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:48 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWw2fk3LawqF8nAsBYvSC2804uJ9Sx7tRRVtAkkG7OhFXLSArvaofTKI6QtGhjsfF3Sf" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTAvMTU0OTY2MDkyMTY5OTM2MyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTAiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTA/Z2VuZXJhdGlvbj0xNTQ5NjYwOTIxNjk5MzYzJmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTAiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5MjE2OTkzNjMiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNLTzRpdWFJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDEuNjk4WiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAxLjY5OFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDEuNjk4WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAxLjY5OFoifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTEvMTc2NDYxODA0NTk2MDEzNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTEiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTE/Z2VuZXJhdGlvbj0xNzY0NjE4MDQ1OTYwMTM1JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTEiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NjQ2MTgwNDU5NjAxMzUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNNZmZyTDZTblpFREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjUtMTItMDFUMTk6NDA6NDUuOTYyWiIsInVwZGF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ1Ljk2MloiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjUtMTItMDFUMTk6NDA6NDUuOTYyWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ1Ljk2MloifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTIvMTU0OTY2MDkyMjg1ODY1OSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTIiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTI/Z2VuZXJhdGlvbj0xNTQ5NjYwOTIyODU4NjU5JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTIiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5MjI4NTg2NTkiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNLT1owZWFJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDIuODU4WiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAyLjg1OFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDIuODU4WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAyLjg1OFoifV19" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestList/exactly_1_object_due_to_prefix.replay ================================================ { "Initial": "AQAAAA7hTghDG6UvLQAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "56cb3c548fdca778", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-list\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2403" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:47 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzL1cCuDpGFSD6uAi_d39R6sNRYim7KB1prnzodGIhtDz4ggH66MDnns4xofeB4tEyk" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTAvMTU0OTY2MDkyMTY5OTM2MyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTAiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTA/Z2VuZXJhdGlvbj0xNTQ5NjYwOTIxNjk5MzYzJmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTAiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5MjE2OTkzNjMiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNLTzRpdWFJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDEuNjk4WiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAxLjY5OFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDEuNjk4WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAxLjY5OFoifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTEvMTc2NDYxODA0NTk2MDEzNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTEiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTE/Z2VuZXJhdGlvbj0xNzY0NjE4MDQ1OTYwMTM1JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTEiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NjQ2MTgwNDU5NjAxMzUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNNZmZyTDZTblpFREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjUtMTItMDFUMTk6NDA6NDUuOTYyWiIsInVwZGF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ1Ljk2MloiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjUtMTItMDFUMTk6NDA6NDUuOTYyWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ1Ljk2MloifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTIvMTU0OTY2MDkyMjg1ODY1OSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTIiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTI/Z2VuZXJhdGlvbj0xNTQ5NjYwOTIyODU4NjU5JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTIiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5MjI4NTg2NTkiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNLT1owZWFJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDIuODU4WiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAyLjg1OFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDIuODU4WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAyLjg1OFoifV19" } }, { "ID": "c2cb3c880866b362", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-list-1\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "825" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:47 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWw5B7vY9gV-YoxCfDIuAQn2e999n9eoF1CeSHLly0qVxY0qKFGKij8FJAs73cefLCHY" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTEvMTc2NDYxODA0NTk2MDEzNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTEiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTE/Z2VuZXJhdGlvbj0xNzY0NjE4MDQ1OTYwMTM1JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTEiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NjQ2MTgwNDU5NjAxMzUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNNZmZyTDZTblpFREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjUtMTItMDFUMTk6NDA6NDUuOTYyWiIsInVwZGF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ1Ljk2MloiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjUtMTItMDFUMTk6NDA6NDUuOTYyWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ1Ljk2MloifV19" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestList/no_objects.replay ================================================ { "Initial": "AQAAAA7hTghDCxD6YgAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "7944bd3188c4746e", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-list\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2403" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:47 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwgbN0-AY8Xkd-UnW9sBGhFIM7jbzNbUfyehO64nJB13YGcRS6KXKi8tqsgHte8ep7f" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTAvMTU0OTY2MDkyMTY5OTM2MyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTAiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTA/Z2VuZXJhdGlvbj0xNTQ5NjYwOTIxNjk5MzYzJmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTAiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5MjE2OTkzNjMiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNLTzRpdWFJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDEuNjk4WiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAxLjY5OFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDEuNjk4WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAxLjY5OFoifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTEvMTc2NDYxODA0NTk2MDEzNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTEiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTE/Z2VuZXJhdGlvbj0xNzY0NjE4MDQ1OTYwMTM1JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTEiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NjQ2MTgwNDU5NjAxMzUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNNZmZyTDZTblpFREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjUtMTItMDFUMTk6NDA6NDUuOTYyWiIsInVwZGF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ1Ljk2MloiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjUtMTItMDFUMTk6NDA6NDUuOTYyWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ1Ljk2MloifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTIvMTU0OTY2MDkyMjg1ODY1OSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTIiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTI/Z2VuZXJhdGlvbj0xNTQ5NjYwOTIyODU4NjU5JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTIiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5MjI4NTg2NTkiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNLT1owZWFJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDIuODU4WiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAyLjg1OFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDIuODU4WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAyLjg1OFoifV19" } }, { "ID": "4c729dfd46ed2ebd", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=no-objects-with-this-prefix\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "26" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:47 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwV2aAj_-VIi2obyZjl9zJBXlHccZsq0vRP1sgUloPrmI_GM5zdi6A62q1A1TMkprJZ" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIn0=" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestList/no_pagination.replay ================================================ { "Initial": "AQAAAA7hTghDKkRCeAAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "3a0cb426c65c4861", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-list\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2403" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:47 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyAvUqrKdGPs7fzvOtNACqx18WJcqS36rxHlXCX4Zn2xmv8VLGTZBkNUoO98xuNa9Ox" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTAvMTU0OTY2MDkyMTY5OTM2MyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTAiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTA/Z2VuZXJhdGlvbj0xNTQ5NjYwOTIxNjk5MzYzJmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTAiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5MjE2OTkzNjMiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNLTzRpdWFJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDEuNjk4WiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAxLjY5OFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDEuNjk4WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAxLjY5OFoifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTEvMTc2NDYxODA0NTk2MDEzNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTEiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTE/Z2VuZXJhdGlvbj0xNzY0NjE4MDQ1OTYwMTM1JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTEiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NjQ2MTgwNDU5NjAxMzUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNNZmZyTDZTblpFREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjUtMTItMDFUMTk6NDA6NDUuOTYyWiIsInVwZGF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ1Ljk2MloiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjUtMTItMDFUMTk6NDA6NDUuOTYyWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ1Ljk2MloifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTIvMTU0OTY2MDkyMjg1ODY1OSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTIiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTI/Z2VuZXJhdGlvbj0xNTQ5NjYwOTIyODU4NjU5JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTIiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5MjI4NTg2NTkiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNLT1owZWFJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDIuODU4WiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAyLjg1OFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDIuODU4WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAyLjg1OFoifV19" } }, { "ID": "68fb37afc886117c", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-list\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2403" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:47 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWx9xB91RY0xHsv8KMLBRTW2CznF4cYVmeVmeaUhGigOYKijgPpqP0Q0NXthb0X1PZX4" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTAvMTU0OTY2MDkyMTY5OTM2MyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTAiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTA/Z2VuZXJhdGlvbj0xNTQ5NjYwOTIxNjk5MzYzJmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTAiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5MjE2OTkzNjMiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNLTzRpdWFJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDEuNjk4WiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAxLjY5OFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDEuNjk4WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAxLjY5OFoifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTEvMTc2NDYxODA0NTk2MDEzNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTEiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTE/Z2VuZXJhdGlvbj0xNzY0NjE4MDQ1OTYwMTM1JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTEiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NjQ2MTgwNDU5NjAxMzUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNNZmZyTDZTblpFREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjUtMTItMDFUMTk6NDA6NDUuOTYyWiIsInVwZGF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ1Ljk2MloiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjUtMTItMDFUMTk6NDA6NDUuOTYyWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ1Ljk2MloifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1saXN0LTIvMTU0OTY2MDkyMjg1ODY1OSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTIiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1saXN0LTI/Z2VuZXJhdGlvbj0xNTQ5NjYwOTIyODU4NjU5JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1saXN0LTIiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5MjI4NTg2NTkiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNLT1owZWFJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDIuODU4WiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAyLjg1OFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MDIuODU4WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjAyLjg1OFoifV19" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestListDelimiters/abc.replay ================================================ { "Initial": "AQAAAA7hTghIG+IdYAAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "9023c960c9da2eac", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-delimiters-abc\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "5294" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:52 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzJuEqy1DspOe0i56-9uHCLZeKN5L_8CjoLcSNjAvoUdJZzjOKjErU2nSHDkvNv9GXX" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmNhLnR4dC8xNTQ5NjYwOTUyMDY3MzU0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY2EudHh0IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjYS50eHQ/Z2VuZXJhdGlvbj0xNTQ5NjYwOTUyMDY3MzU0JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmNhLnR4dCIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU0OTY2MDk1MjA2NzM1NCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ0pyNngvU0lyZUFDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjozMi4wNjZaIiwidXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MzIuMDY2WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjozMi4wNjZaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDItMDhUMjE6MjI6MzIuMDY2WiJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2Jsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY2IudHh0LzE1NDk2NjA5NTI1OTc0MTEiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjYi50eHQiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmNiLnR4dD9nZW5lcmF0aW9uPTE1NDk2NjA5NTI1OTc0MTEmYWx0PW1lZGlhIiwibmFtZSI6ImJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY2IudHh0IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTQ5NjYwOTUyNTk3NDExIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDS09uNlBTSXJlQUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjMyLjU5N1oiLCJ1cGRhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjozMi41OTdaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjMyLjU5N1oiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMi0wOFQyMToyMjozMi41OTdaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjc3ViZGlyYWJjYy50eHQvMTU0OTY2MDk1MzA2NDI2NSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmNzdWJkaXJhYmNjLnR4dCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY3N1YmRpcmFiY2MudHh0P2dlbmVyYXRpb249MTU0OTY2MDk1MzA2NDI2NSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjc3ViZGlyYWJjYy50eHQiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5NTMwNjQyNjUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNNbm1oUFdJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MzMuMDYzWiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjMzLjA2M1oiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MzMuMDYzWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjMzLjA2M1oifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmNzdWJkaXJhYmNkLnR4dC8xNTQ5NjYwOTUzNTg0MzcyIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY3N1YmRpcmFiY2QudHh0IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjc3ViZGlyYWJjZC50eHQ/Z2VuZXJhdGlvbj0xNTQ5NjYwOTUzNTg0MzcyJmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmNzdWJkaXJhYmNkLnR4dCIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU0OTY2MDk1MzU4NDM3MiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ1BURnBQV0lyZUFDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjozMy41ODJaIiwidXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MzMuNTgyWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjozMy41ODJaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDItMDhUMjE6MjI6MzMuNTgyWiJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2Jsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMmFiY2UudHh0LzE3NjQ2MTgwNDk2MDI3ODMiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIyYWJjZS50eHQiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjJhYmNlLnR4dD9nZW5lcmF0aW9uPTE3NjQ2MTgwNDk2MDI3ODMmYWx0PW1lZGlhIiwibmFtZSI6ImJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMmFiY2UudHh0IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzY0NjE4MDQ5NjAyNzgzIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTitKaThDU25aRURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ5LjYwNVoiLCJ1cGRhdGVkIjoiMjAyNS0xMi0wMVQxOTo0MDo0OS42MDVaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ5LjYwNVoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNS0xMi0wMVQxOTo0MDo0OS42MDVaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNmLnR4dC8xNTQ5NjYwOTU0NTk5OTAyIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtYWJjZi50eHQiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2YudHh0P2dlbmVyYXRpb249MTU0OTY2MDk1NDU5OTkwMiZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNmLnR4dCIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU0OTY2MDk1NDU5OTkwMiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ043RDR2V0lyZUFDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjozNC41OTlaIiwidXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MzQuNTk5WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjozNC41OTlaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDItMDhUMjE6MjI6MzQuNTk5WiJ9XX0=" } }, { "ID": "f8c914af9fa75cfa", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-delimiters-abc\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "5294" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:52 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzrON9O-P3rE8BRJfWOFr5fJdh1y7Hs4VbVwAd7Vq7yz-LbUvN3p5c6c3hMEEatY4fS" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmNhLnR4dC8xNTQ5NjYwOTUyMDY3MzU0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY2EudHh0IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjYS50eHQ/Z2VuZXJhdGlvbj0xNTQ5NjYwOTUyMDY3MzU0JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmNhLnR4dCIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU0OTY2MDk1MjA2NzM1NCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ0pyNngvU0lyZUFDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjozMi4wNjZaIiwidXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MzIuMDY2WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjozMi4wNjZaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDItMDhUMjE6MjI6MzIuMDY2WiJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2Jsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY2IudHh0LzE1NDk2NjA5NTI1OTc0MTEiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjYi50eHQiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmNiLnR4dD9nZW5lcmF0aW9uPTE1NDk2NjA5NTI1OTc0MTEmYWx0PW1lZGlhIiwibmFtZSI6ImJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY2IudHh0IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTQ5NjYwOTUyNTk3NDExIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDS09uNlBTSXJlQUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjMyLjU5N1oiLCJ1cGRhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjozMi41OTdaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjMyLjU5N1oiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMi0wOFQyMToyMjozMi41OTdaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjc3ViZGlyYWJjYy50eHQvMTU0OTY2MDk1MzA2NDI2NSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmNzdWJkaXJhYmNjLnR4dCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY3N1YmRpcmFiY2MudHh0P2dlbmVyYXRpb249MTU0OTY2MDk1MzA2NDI2NSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjc3ViZGlyYWJjYy50eHQiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5NTMwNjQyNjUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNNbm1oUFdJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MzMuMDYzWiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjMzLjA2M1oiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MzMuMDYzWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjMzLjA2M1oifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmNzdWJkaXJhYmNkLnR4dC8xNTQ5NjYwOTUzNTg0MzcyIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY3N1YmRpcmFiY2QudHh0IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjc3ViZGlyYWJjZC50eHQ/Z2VuZXJhdGlvbj0xNTQ5NjYwOTUzNTg0MzcyJmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmNzdWJkaXJhYmNkLnR4dCIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU0OTY2MDk1MzU4NDM3MiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ1BURnBQV0lyZUFDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjozMy41ODJaIiwidXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MzMuNTgyWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjozMy41ODJaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDItMDhUMjE6MjI6MzMuNTgyWiJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2Jsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMmFiY2UudHh0LzE3NjQ2MTgwNDk2MDI3ODMiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIyYWJjZS50eHQiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjJhYmNlLnR4dD9nZW5lcmF0aW9uPTE3NjQ2MTgwNDk2MDI3ODMmYWx0PW1lZGlhIiwibmFtZSI6ImJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMmFiY2UudHh0IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzY0NjE4MDQ5NjAyNzgzIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTitKaThDU25aRURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ5LjYwNVoiLCJ1cGRhdGVkIjoiMjAyNS0xMi0wMVQxOTo0MDo0OS42MDVaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ5LjYwNVoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNS0xMi0wMVQxOTo0MDo0OS42MDVaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNmLnR4dC8xNTQ5NjYwOTU0NTk5OTAyIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtYWJjZi50eHQiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2YudHh0P2dlbmVyYXRpb249MTU0OTY2MDk1NDU5OTkwMiZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNmLnR4dCIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU0OTY2MDk1NDU5OTkwMiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ043RDR2V0lyZUFDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjozNC41OTlaIiwidXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MzQuNTk5WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjozNC41OTlaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDItMDhUMjE6MjI6MzQuNTk5WiJ9XX0=" } }, { "ID": "85dc6d277342ed66", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=abc\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-delimiters-abc\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "956" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:52 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWygcmgttlU7wbzS22u6C2hXe-N2R3aa5KzUz-H5soczFlcDMP7-pC2hcjCChKouGHOj" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwicHJlZml4ZXMiOlsiYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjIiwiYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIyYWJjIl0sIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNmLnR4dC8xNTQ5NjYwOTU0NTk5OTAyIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtYWJjZi50eHQiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2YudHh0P2dlbmVyYXRpb249MTU0OTY2MDk1NDU5OTkwMiZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNmLnR4dCIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU0OTY2MDk1NDU5OTkwMiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ043RDR2V0lyZUFDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjozNC41OTlaIiwidXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MzQuNTk5WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjozNC41OTlaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDItMDhUMjE6MjI6MzQuNTk5WiJ9XX0=" } }, { "ID": "d305946cf94e82af", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=abc\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-delimiters-abcdir1abc\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "1829" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:52 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxDHeXOl5IkSIegh4YAojg3JYhn5q713j31iIIhYYpIAp7k32gB7jeUtmhjE2WYVfxC" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwicHJlZml4ZXMiOlsiYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjc3ViZGlyYWJjIl0sIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjYS50eHQvMTU0OTY2MDk1MjA2NzM1NCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmNhLnR4dCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY2EudHh0P2dlbmVyYXRpb249MTU0OTY2MDk1MjA2NzM1NCZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjYS50eHQiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5NTIwNjczNTQiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNKcjZ4L1NJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MzIuMDY2WiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjMyLjA2NloiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MzIuMDY2WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjMyLjA2NloifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmNiLnR4dC8xNTQ5NjYwOTUyNTk3NDExIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY2IudHh0IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjYi50eHQ/Z2VuZXJhdGlvbj0xNTQ5NjYwOTUyNTk3NDExJmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmNiLnR4dCIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU0OTY2MDk1MjU5NzQxMSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ0tPbjZQU0lyZUFDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjozMi41OTdaIiwidXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MzIuNTk3WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjozMi41OTdaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDItMDhUMjE6MjI6MzIuNTk3WiJ9XX0=" } }, { "ID": "074615e8d84c1634", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=abc\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-delimiters-abcdir1abcsubdirabc\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "1846" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:52 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxByjYvBSYCRgatWf4k7xWVnh4auMsajYX7TmYRDYLxJ-FhDuyUfKL-w1b6QDgTqJd4" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmNzdWJkaXJhYmNjLnR4dC8xNTQ5NjYwOTUzMDY0MjY1Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY3N1YmRpcmFiY2MudHh0IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjc3ViZGlyYWJjYy50eHQ/Z2VuZXJhdGlvbj0xNTQ5NjYwOTUzMDY0MjY1JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmNzdWJkaXJhYmNjLnR4dCIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU0OTY2MDk1MzA2NDI2NSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ01ubWhQV0lyZUFDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjozMy4wNjNaIiwidXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MzMuMDYzWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjozMy4wNjNaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDItMDhUMjE6MjI6MzMuMDYzWiJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2Jsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY3N1YmRpcmFiY2QudHh0LzE1NDk2NjA5NTM1ODQzNzIiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjc3ViZGlyYWJjZC50eHQiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmNzdWJkaXJhYmNkLnR4dD9nZW5lcmF0aW9uPTE1NDk2NjA5NTM1ODQzNzImYWx0PW1lZGlhIiwibmFtZSI6ImJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY3N1YmRpcmFiY2QudHh0IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTQ5NjYwOTUzNTg0MzcyIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDUFRGcFBXSXJlQUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjMzLjU4MloiLCJ1cGRhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjozMy41ODJaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjMzLjU4MloiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMi0wOFQyMToyMjozMy41ODJaIn1dfQ==" } }, { "ID": "f0c99f974f90f5a2", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=abc\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-delimiters-abcdir2abc\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "905" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:52 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWw8bgTeyt5q3WM4TXNU8d_alDm0faSqlfCfloUYNXEeX8wgrcmzb111zXpj-XgQOWBo" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjJhYmNlLnR4dC8xNzY0NjE4MDQ5NjAyNzgzIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMmFiY2UudHh0IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIyYWJjZS50eHQ/Z2VuZXJhdGlvbj0xNzY0NjE4MDQ5NjAyNzgzJmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjJhYmNlLnR4dCIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc2NDYxODA0OTYwMjc4MyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ04rSmk4Q1NuWkVERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNS0xMi0wMVQxOTo0MDo0OS42MDVaIiwidXBkYXRlZCI6IjIwMjUtMTItMDFUMTk6NDA6NDkuNjA1WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNS0xMi0wMVQxOTo0MDo0OS42MDVaIiwidGltZUZpbmFsaXplZCI6IjIwMjUtMTItMDFUMTk6NDA6NDkuNjA1WiJ9XX0=" } }, { "ID": "a75b89598476f515", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=abc\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1\u0026pageToken=\u0026prefix=blob-for-delimiters-abc\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "135" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:53 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxtysdMzyDFsWkFd-WoSkyaH7hjyTM7lzciBSZ3_oFzJWOUA4PMxJWo6oCiNGl252Ny" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNoNWliRzlpTFdadmNpMWtaV3hwYldsMFpYSnpMV0ZpWTJScGNqRmhZbU09IiwicHJlZml4ZXMiOlsiYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjIl19" } }, { "ID": "54ad5f19a961f285", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=abc\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1\u0026pageToken=Ch5ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmM%3D\u0026prefix=blob-for-delimiters-abc\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "135" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:53 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyHyXCgK014oFqbez6mkhmLdxu8IWqdch-QLY-HeMJybiWSxq19kVvLK050ILUoahW_" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNoNWliRzlpTFdadmNpMWtaV3hwYldsMFpYSnpMV0ZpWTJScGNqSmhZbU09IiwicHJlZml4ZXMiOlsiYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIyYWJjIl19" } }, { "ID": "97f1eb812372e41d", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=abc\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1\u0026pageToken=Ch5ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjJhYmM%3D\u0026prefix=blob-for-delimiters-abc\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "877" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:53 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxNUeeRdUGdFLeHWRHoDjd7GzidYlIjjPIijKLFOazTw5nrSQKkk_G3Riv64aYusxwZ" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2YudHh0LzE1NDk2NjA5NTQ1OTk5MDIiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNmLnR4dCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtYWJjZi50eHQ/Z2VuZXJhdGlvbj0xNTQ5NjYwOTU0NTk5OTAyJmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2YudHh0IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTQ5NjYwOTU0NTk5OTAyIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTjdENHZXSXJlQUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjM0LjU5OVoiLCJ1cGRhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjozNC41OTlaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjM0LjU5OVoiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMi0wOFQyMToyMjozNC41OTlaIn1dfQ==" } }, { "ID": "ff2578d69c96cc7d", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-delimiters-abcdir2abce.txt?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:07:53 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwZyHVnhVlLL_oJF15Ibbl8mjMr41JJS1FXZmSGkjC9h1zzS5ZSjTTclE5Kz2SbNP5i" ] }, "Body": "" } }, { "ID": "07b2a03c04054152", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=abc\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-delimiters-abc\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "923" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:53 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxegY2Dq_zCq_XSRhOS8PKefu15seC-MiJRP74XTWf7jQ0Gv2lz9x4bjFtZOzU5awvn" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwicHJlZml4ZXMiOlsiYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjIl0sIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNmLnR4dC8xNTQ5NjYwOTU0NTk5OTAyIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtYWJjZi50eHQiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2YudHh0P2dlbmVyYXRpb249MTU0OTY2MDk1NDU5OTkwMiZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNmLnR4dCIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU0OTY2MDk1NDU5OTkwMiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ043RDR2V0lyZUFDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjozNC41OTlaIiwidXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MzQuNTk5WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjozNC41OTlaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDItMDhUMjE6MjI6MzQuNTk5WiJ9XX0=" } }, { "ID": "d1cad94135ce19f7", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-delimiters-abcdir2abce.txt\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibmFtZSI6ImJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMmFiY2UudHh0In0K", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "868" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:53 GMT" ], "Etag": [ "CIu/n/aerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzkDLp9uGCiHECn1-Nqz7G5JWbZt-9QaijwAxQNqCNK6T5a0a7QloqOz5Xpjt1KQnNA" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIyYWJjZS50eHQvMTc3MzkzMjg3MzUwNjY5OSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjJhYmNlLnR4dCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMmFiY2UudHh0P2dlbmVyYXRpb249MTc3MzkzMjg3MzUwNjY5OSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIyYWJjZS50eHQiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzI4NzM1MDY2OTkiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNJdS9uL2FlckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDc6NTMuNTExWiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA3OjUzLjUxMVoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDc6NTMuNTExWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA3OjUzLjUxMVoifQ==" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestListDelimiters/backslash.replay ================================================ { "Initial": "AQAAAA7hTghHGCu0OAAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "aa61df369b487d0a", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-delimiters-%5C\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "5268" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:51 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWx1hVziAGbquymfY53FxJlntgAEbCrAXDI5KjRBvDz5RSD1DytMbj4QNXi9AsdwwncA" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kZWxpbWl0ZXJzLVxcZGlyMVxcYS50eHQvMTU1MjU4MTUwNTAxMjM1MSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLSU1Q2RpcjElNUNhLnR4dCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtJTVDZGlyMSU1Q2EudHh0P2dlbmVyYXRpb249MTU1MjU4MTUwNTAxMjM1MSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGVsaW1pdGVycy1cXGRpcjFcXGEudHh0IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTUyNTgxNTA1MDEyMzUxIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDUCtrM2VpSWd1RUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAzLTE0VDE2OjM4OjI1LjAxMloiLCJ1cGRhdGVkIjoiMjAxOS0wMy0xNFQxNjozODoyNS4wMTJaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAzLTE0VDE2OjM4OjI1LjAxMloiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMy0xNFQxNjozODoyNS4wMTJaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGVsaW1pdGVycy1cXGRpcjFcXGIudHh0LzE1NTI1ODE1MDUxNDk0MzEiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy0lNUNkaXIxJTVDYi50eHQiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLSU1Q2RpcjElNUNiLnR4dD9nZW5lcmF0aW9uPTE1NTI1ODE1MDUxNDk0MzEmYWx0PW1lZGlhIiwibmFtZSI6ImJsb2ItZm9yLWRlbGltaXRlcnMtXFxkaXIxXFxiLnR4dCIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU1MjU4MTUwNTE0OTQzMSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ1BmVDVlaUlndUVDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMy0xNFQxNjozODoyNS4xNDlaIiwidXBkYXRlZCI6IjIwMTktMDMtMTRUMTY6Mzg6MjUuMTQ5WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMy0xNFQxNjozODoyNS4xNDlaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDMtMTRUMTY6Mzg6MjUuMTQ5WiJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2Jsb2ItZm9yLWRlbGltaXRlcnMtXFxkaXIxXFxzdWJkaXJcXGMudHh0LzE1NTI1ODE1MDUyNTc3ODYiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy0lNUNkaXIxJTVDc3ViZGlyJTVDYy50eHQiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLSU1Q2RpcjElNUNzdWJkaXIlNUNjLnR4dD9nZW5lcmF0aW9uPTE1NTI1ODE1MDUyNTc3ODYmYWx0PW1lZGlhIiwibmFtZSI6ImJsb2ItZm9yLWRlbGltaXRlcnMtXFxkaXIxXFxzdWJkaXJcXGMudHh0IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTUyNTgxNTA1MjU3Nzg2IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTHFpN09pSWd1RUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAzLTE0VDE2OjM4OjI1LjI1N1oiLCJ1cGRhdGVkIjoiMjAxOS0wMy0xNFQxNjozODoyNS4yNTdaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAzLTE0VDE2OjM4OjI1LjI1N1oiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMy0xNFQxNjozODoyNS4yNTdaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGVsaW1pdGVycy1cXGRpcjFcXHN1YmRpclxcZC50eHQvMTU1MjU4MTUwNTM4MTY0MiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLSU1Q2RpcjElNUNzdWJkaXIlNUNkLnR4dCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtJTVDZGlyMSU1Q3N1YmRpciU1Q2QudHh0P2dlbmVyYXRpb249MTU1MjU4MTUwNTM4MTY0MiZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGVsaW1pdGVycy1cXGRpcjFcXHN1YmRpclxcZC50eHQiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NTI1ODE1MDUzODE2NDIiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNJcnE4K2lJZ3VFQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDMtMTRUMTY6Mzg6MjUuMzgxWiIsInVwZGF0ZWQiOiIyMDE5LTAzLTE0VDE2OjM4OjI1LjM4MVoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDMtMTRUMTY6Mzg6MjUuMzgxWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAzLTE0VDE2OjM4OjI1LjM4MVoifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kZWxpbWl0ZXJzLVxcZGlyMlxcZS50eHQvMTc2NDYxODA0ODY0MjE1NCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLSU1Q2RpcjIlNUNlLnR4dCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtJTVDZGlyMiU1Q2UudHh0P2dlbmVyYXRpb249MTc2NDYxODA0ODY0MjE1NCZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGVsaW1pdGVycy1cXGRpcjJcXGUudHh0IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzY0NjE4MDQ4NjQyMTU0IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDT3E0MEwrU25aRURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ4LjY0NFoiLCJ1cGRhdGVkIjoiMjAyNS0xMi0wMVQxOTo0MDo0OC42NDRaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ4LjY0NFoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNS0xMi0wMVQxOTo0MDo0OC42NDRaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGVsaW1pdGVycy1cXGYudHh0LzE1NTI1ODE1MDU2NzY5MjEiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy0lNUNmLnR4dCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtJTVDZi50eHQ/Z2VuZXJhdGlvbj0xNTUyNTgxNTA1Njc2OTIxJmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1kZWxpbWl0ZXJzLVxcZi50eHQiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NTI1ODE1MDU2NzY5MjEiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNQbnNoZW1JZ3VFQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDMtMTRUMTY6Mzg6MjUuNjc2WiIsInVwZGF0ZWQiOiIyMDE5LTAzLTE0VDE2OjM4OjI1LjY3NloiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDMtMTRUMTY6Mzg6MjUuNjc2WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAzLTE0VDE2OjM4OjI1LjY3NloifV19" } }, { "ID": "382e53c0b7e55dc1", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-delimiters-%5C\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "5268" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:51 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWz5sLi2IEOxf4xbTPYuaSSGbY2K7KMotLt6pQunxLq1Q1ia7GA2YCcylT59WEux9jUY" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kZWxpbWl0ZXJzLVxcZGlyMVxcYS50eHQvMTU1MjU4MTUwNTAxMjM1MSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLSU1Q2RpcjElNUNhLnR4dCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtJTVDZGlyMSU1Q2EudHh0P2dlbmVyYXRpb249MTU1MjU4MTUwNTAxMjM1MSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGVsaW1pdGVycy1cXGRpcjFcXGEudHh0IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTUyNTgxNTA1MDEyMzUxIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDUCtrM2VpSWd1RUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAzLTE0VDE2OjM4OjI1LjAxMloiLCJ1cGRhdGVkIjoiMjAxOS0wMy0xNFQxNjozODoyNS4wMTJaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAzLTE0VDE2OjM4OjI1LjAxMloiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMy0xNFQxNjozODoyNS4wMTJaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGVsaW1pdGVycy1cXGRpcjFcXGIudHh0LzE1NTI1ODE1MDUxNDk0MzEiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy0lNUNkaXIxJTVDYi50eHQiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLSU1Q2RpcjElNUNiLnR4dD9nZW5lcmF0aW9uPTE1NTI1ODE1MDUxNDk0MzEmYWx0PW1lZGlhIiwibmFtZSI6ImJsb2ItZm9yLWRlbGltaXRlcnMtXFxkaXIxXFxiLnR4dCIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU1MjU4MTUwNTE0OTQzMSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ1BmVDVlaUlndUVDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMy0xNFQxNjozODoyNS4xNDlaIiwidXBkYXRlZCI6IjIwMTktMDMtMTRUMTY6Mzg6MjUuMTQ5WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMy0xNFQxNjozODoyNS4xNDlaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDMtMTRUMTY6Mzg6MjUuMTQ5WiJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2Jsb2ItZm9yLWRlbGltaXRlcnMtXFxkaXIxXFxzdWJkaXJcXGMudHh0LzE1NTI1ODE1MDUyNTc3ODYiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy0lNUNkaXIxJTVDc3ViZGlyJTVDYy50eHQiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLSU1Q2RpcjElNUNzdWJkaXIlNUNjLnR4dD9nZW5lcmF0aW9uPTE1NTI1ODE1MDUyNTc3ODYmYWx0PW1lZGlhIiwibmFtZSI6ImJsb2ItZm9yLWRlbGltaXRlcnMtXFxkaXIxXFxzdWJkaXJcXGMudHh0IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTUyNTgxNTA1MjU3Nzg2IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTHFpN09pSWd1RUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAzLTE0VDE2OjM4OjI1LjI1N1oiLCJ1cGRhdGVkIjoiMjAxOS0wMy0xNFQxNjozODoyNS4yNTdaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAzLTE0VDE2OjM4OjI1LjI1N1oiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMy0xNFQxNjozODoyNS4yNTdaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGVsaW1pdGVycy1cXGRpcjFcXHN1YmRpclxcZC50eHQvMTU1MjU4MTUwNTM4MTY0MiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLSU1Q2RpcjElNUNzdWJkaXIlNUNkLnR4dCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtJTVDZGlyMSU1Q3N1YmRpciU1Q2QudHh0P2dlbmVyYXRpb249MTU1MjU4MTUwNTM4MTY0MiZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGVsaW1pdGVycy1cXGRpcjFcXHN1YmRpclxcZC50eHQiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NTI1ODE1MDUzODE2NDIiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNJcnE4K2lJZ3VFQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDMtMTRUMTY6Mzg6MjUuMzgxWiIsInVwZGF0ZWQiOiIyMDE5LTAzLTE0VDE2OjM4OjI1LjM4MVoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDMtMTRUMTY6Mzg6MjUuMzgxWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAzLTE0VDE2OjM4OjI1LjM4MVoifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kZWxpbWl0ZXJzLVxcZGlyMlxcZS50eHQvMTc2NDYxODA0ODY0MjE1NCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLSU1Q2RpcjIlNUNlLnR4dCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtJTVDZGlyMiU1Q2UudHh0P2dlbmVyYXRpb249MTc2NDYxODA0ODY0MjE1NCZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGVsaW1pdGVycy1cXGRpcjJcXGUudHh0IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzY0NjE4MDQ4NjQyMTU0IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDT3E0MEwrU25aRURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ4LjY0NFoiLCJ1cGRhdGVkIjoiMjAyNS0xMi0wMVQxOTo0MDo0OC42NDRaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ4LjY0NFoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNS0xMi0wMVQxOTo0MDo0OC42NDRaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGVsaW1pdGVycy1cXGYudHh0LzE1NTI1ODE1MDU2NzY5MjEiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy0lNUNmLnR4dCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtJTVDZi50eHQ/Z2VuZXJhdGlvbj0xNTUyNTgxNTA1Njc2OTIxJmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1kZWxpbWl0ZXJzLVxcZi50eHQiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NTI1ODE1MDU2NzY5MjEiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNQbnNoZW1JZ3VFQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDMtMTRUMTY6Mzg6MjUuNjc2WiIsInVwZGF0ZWQiOiIyMDE5LTAzLTE0VDE2OjM4OjI1LjY3NloiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDMtMTRUMTY6Mzg6MjUuNjc2WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAzLTE0VDE2OjM4OjI1LjY3NloifV19" } }, { "ID": "7f92035633da1c06", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%5C\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-delimiters-%5C\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "950" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:51 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWylzFQQYf4Kr8WlYef1r-QPaEbmWL6ocICuSsIpHH-yFwm6-oJx_C4TRiKnfbJUTX7C" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwicHJlZml4ZXMiOlsiYmxvYi1mb3ItZGVsaW1pdGVycy1cXGRpcjFcXCIsImJsb2ItZm9yLWRlbGltaXRlcnMtXFxkaXIyXFwiXSwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kZWxpbWl0ZXJzLVxcZi50eHQvMTU1MjU4MTUwNTY3NjkyMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLSU1Q2YudHh0IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy0lNUNmLnR4dD9nZW5lcmF0aW9uPTE1NTI1ODE1MDU2NzY5MjEmYWx0PW1lZGlhIiwibmFtZSI6ImJsb2ItZm9yLWRlbGltaXRlcnMtXFxmLnR4dCIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU1MjU4MTUwNTY3NjkyMSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ1Buc2hlbUlndUVDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMy0xNFQxNjozODoyNS42NzZaIiwidXBkYXRlZCI6IjIwMTktMDMtMTRUMTY6Mzg6MjUuNjc2WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMy0xNFQxNjozODoyNS42NzZaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDMtMTRUMTY6Mzg6MjUuNjc2WiJ9XX0=" } }, { "ID": "47346918e0c1ea81", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%5C\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-delimiters-%5Cdir1%5C\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "1818" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:51 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzsHe90bjjXDxDHJB-oizWpgr23Fvf0zR9L-hPxaMUABpHtEVmYrZuPFLS3n3Z9XA08" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwicHJlZml4ZXMiOlsiYmxvYi1mb3ItZGVsaW1pdGVycy1cXGRpcjFcXHN1YmRpclxcIl0sIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGVsaW1pdGVycy1cXGRpcjFcXGEudHh0LzE1NTI1ODE1MDUwMTIzNTEiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy0lNUNkaXIxJTVDYS50eHQiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLSU1Q2RpcjElNUNhLnR4dD9nZW5lcmF0aW9uPTE1NTI1ODE1MDUwMTIzNTEmYWx0PW1lZGlhIiwibmFtZSI6ImJsb2ItZm9yLWRlbGltaXRlcnMtXFxkaXIxXFxhLnR4dCIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU1MjU4MTUwNTAxMjM1MSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ1ArazNlaUlndUVDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMy0xNFQxNjozODoyNS4wMTJaIiwidXBkYXRlZCI6IjIwMTktMDMtMTRUMTY6Mzg6MjUuMDEyWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMy0xNFQxNjozODoyNS4wMTJaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDMtMTRUMTY6Mzg6MjUuMDEyWiJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2Jsb2ItZm9yLWRlbGltaXRlcnMtXFxkaXIxXFxiLnR4dC8xNTUyNTgxNTA1MTQ5NDMxIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtJTVDZGlyMSU1Q2IudHh0IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy0lNUNkaXIxJTVDYi50eHQ/Z2VuZXJhdGlvbj0xNTUyNTgxNTA1MTQ5NDMxJmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1kZWxpbWl0ZXJzLVxcZGlyMVxcYi50eHQiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NTI1ODE1MDUxNDk0MzEiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNQZlQ1ZWlJZ3VFQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDMtMTRUMTY6Mzg6MjUuMTQ5WiIsInVwZGF0ZWQiOiIyMDE5LTAzLTE0VDE2OjM4OjI1LjE0OVoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDMtMTRUMTY6Mzg6MjUuMTQ5WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAzLTE0VDE2OjM4OjI1LjE0OVoifV19" } }, { "ID": "5a9969d4bedbd315", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%5C\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-delimiters-%5Cdir1%5Csubdir%5C\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "1834" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:51 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWx7IW2rw7nwMZGb52LXOCBvd56rOXojjVnS4tHmyafXkw0x1CDNIDgLZU0gbLHzycOW" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kZWxpbWl0ZXJzLVxcZGlyMVxcc3ViZGlyXFxjLnR4dC8xNTUyNTgxNTA1MjU3Nzg2Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtJTVDZGlyMSU1Q3N1YmRpciU1Q2MudHh0IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy0lNUNkaXIxJTVDc3ViZGlyJTVDYy50eHQ/Z2VuZXJhdGlvbj0xNTUyNTgxNTA1MjU3Nzg2JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1kZWxpbWl0ZXJzLVxcZGlyMVxcc3ViZGlyXFxjLnR4dCIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU1MjU4MTUwNTI1Nzc4NiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ0xxaTdPaUlndUVDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMy0xNFQxNjozODoyNS4yNTdaIiwidXBkYXRlZCI6IjIwMTktMDMtMTRUMTY6Mzg6MjUuMjU3WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMy0xNFQxNjozODoyNS4yNTdaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDMtMTRUMTY6Mzg6MjUuMjU3WiJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2Jsb2ItZm9yLWRlbGltaXRlcnMtXFxkaXIxXFxzdWJkaXJcXGQudHh0LzE1NTI1ODE1MDUzODE2NDIiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy0lNUNkaXIxJTVDc3ViZGlyJTVDZC50eHQiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLSU1Q2RpcjElNUNzdWJkaXIlNUNkLnR4dD9nZW5lcmF0aW9uPTE1NTI1ODE1MDUzODE2NDImYWx0PW1lZGlhIiwibmFtZSI6ImJsb2ItZm9yLWRlbGltaXRlcnMtXFxkaXIxXFxzdWJkaXJcXGQudHh0IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTUyNTgxNTA1MzgxNjQyIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDSXJxOCtpSWd1RUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAzLTE0VDE2OjM4OjI1LjM4MVoiLCJ1cGRhdGVkIjoiMjAxOS0wMy0xNFQxNjozODoyNS4zODFaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAzLTE0VDE2OjM4OjI1LjM4MVoiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMy0xNFQxNjozODoyNS4zODFaIn1dfQ==" } }, { "ID": "6af887a4539413aa", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%5C\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-delimiters-%5Cdir2%5C\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "901" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:51 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWy2SMgwuc48a40Rg-hdJTMGqO7gS39HZIeIK6P4F86r86ePioU1xkOH9D9iPHek-7IQ" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kZWxpbWl0ZXJzLVxcZGlyMlxcZS50eHQvMTc2NDYxODA0ODY0MjE1NCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLSU1Q2RpcjIlNUNlLnR4dCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtJTVDZGlyMiU1Q2UudHh0P2dlbmVyYXRpb249MTc2NDYxODA0ODY0MjE1NCZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGVsaW1pdGVycy1cXGRpcjJcXGUudHh0IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzY0NjE4MDQ4NjQyMTU0IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDT3E0MEwrU25aRURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ4LjY0NFoiLCJ1cGRhdGVkIjoiMjAyNS0xMi0wMVQxOTo0MDo0OC42NDRaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ4LjY0NFoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNS0xMi0wMVQxOTo0MDo0OC42NDRaIn1dfQ==" } }, { "ID": "7d5b0a7569c03b54", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%5C\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1\u0026pageToken=\u0026prefix=blob-for-delimiters-%5C\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "129" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:52 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzF_prWLgK-j_w8NCN0GuUjYvouOVSmsY6zMTiABHaD_KZQjE8GafCIw8pjBRCiQNAE" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNocGliRzlpTFdadmNpMWtaV3hwYldsMFpYSnpMVnhrYVhJeFhBPT0iLCJwcmVmaXhlcyI6WyJibG9iLWZvci1kZWxpbWl0ZXJzLVxcZGlyMVxcIl19" } }, { "ID": "bae7f8f609bf9ef2", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%5C\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1\u0026pageToken=ChpibG9iLWZvci1kZWxpbWl0ZXJzLVxkaXIxXA%3D%3D\u0026prefix=blob-for-delimiters-%5C\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "129" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:52 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyAGbTjcrFye2NG-kf51RTwBLdDyiKDU7_QAwT1e5APHGUQlXUOCEWN1b5KxgZ49xRy" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNocGliRzlpTFdadmNpMWtaV3hwYldsMFpYSnpMVnhrYVhJeVhBPT0iLCJwcmVmaXhlcyI6WyJibG9iLWZvci1kZWxpbWl0ZXJzLVxcZGlyMlxcIl19" } }, { "ID": "8f3828b25ec1c297", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%5C\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1\u0026pageToken=ChpibG9iLWZvci1kZWxpbWl0ZXJzLVxkaXIyXA%3D%3D\u0026prefix=blob-for-delimiters-%5C\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "875" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:52 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwI7EmHXKhi_zEcVyi3M-gl0bScDQCcVKj23zRb-VFgF9hXgz21jiayT9gPpchGG9iS" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kZWxpbWl0ZXJzLVxcZi50eHQvMTU1MjU4MTUwNTY3NjkyMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLSU1Q2YudHh0IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy0lNUNmLnR4dD9nZW5lcmF0aW9uPTE1NTI1ODE1MDU2NzY5MjEmYWx0PW1lZGlhIiwibmFtZSI6ImJsb2ItZm9yLWRlbGltaXRlcnMtXFxmLnR4dCIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU1MjU4MTUwNTY3NjkyMSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ1Buc2hlbUlndUVDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMy0xNFQxNjozODoyNS42NzZaIiwidXBkYXRlZCI6IjIwMTktMDMtMTRUMTY6Mzg6MjUuNjc2WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMy0xNFQxNjozODoyNS42NzZaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDMtMTRUMTY6Mzg6MjUuNjc2WiJ9XX0=" } }, { "ID": "bf51635f3dca7de2", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-delimiters-%5Cdir2%5Ce.txt?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:07:52 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxv0sxvbU9tm2OAxoerO6J3Lbw61Ie6KDOVd-QhEITNsAsGCQV-eXzU25RwzILZUi1-" ] }, "Body": "" } }, { "ID": "17cae151d454d89f", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%5C\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-delimiters-%5C\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "919" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:52 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyUhi2oneAtMiveGyypWbzs_8bkesK-prpS0R8cEK6NRpfgBRvP4Vlof4fgTFRWEuVm" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwicHJlZml4ZXMiOlsiYmxvYi1mb3ItZGVsaW1pdGVycy1cXGRpcjFcXCJdLCJpdGVtcyI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2Jsb2ItZm9yLWRlbGltaXRlcnMtXFxmLnR4dC8xNTUyNTgxNTA1Njc2OTIxIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtJTVDZi50eHQiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLSU1Q2YudHh0P2dlbmVyYXRpb249MTU1MjU4MTUwNTY3NjkyMSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGVsaW1pdGVycy1cXGYudHh0IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTUyNTgxNTA1Njc2OTIxIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDUG5zaGVtSWd1RUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAzLTE0VDE2OjM4OjI1LjY3NloiLCJ1cGRhdGVkIjoiMjAxOS0wMy0xNFQxNjozODoyNS42NzZaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAzLTE0VDE2OjM4OjI1LjY3NloiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMy0xNFQxNjozODoyNS42NzZaIn1dfQ==" } }, { "ID": "4f79853b04a1d55f", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-delimiters-%5Cdir2%5Ce.txt\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibmFtZSI6ImJsb2ItZm9yLWRlbGltaXRlcnMtXFxkaXIyXFxlLnR4dCJ9Cg==", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "864" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:52 GMT" ], "Etag": [ "CIDm3vWerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxsB3vz-Ffmz04X68EhDfUlPwHMSbl6k16oAkehIrgdh9W__Bz18K2JRlF3QEqUcfl2" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGVsaW1pdGVycy1cXGRpcjJcXGUudHh0LzE3NzM5MzI4NzI0NDY3MjAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy0lNUNkaXIyJTVDZS50eHQiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLSU1Q2RpcjIlNUNlLnR4dD9nZW5lcmF0aW9uPTE3NzM5MzI4NzI0NDY3MjAmYWx0PW1lZGlhIiwibmFtZSI6ImJsb2ItZm9yLWRlbGltaXRlcnMtXFxkaXIyXFxlLnR4dCIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjg3MjQ0NjcyMCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ0lEbTN2V2VySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNTowNzo1Mi40NTBaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDc6NTIuNDUwWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowNzo1Mi40NTBaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MDc6NTIuNDUwWiJ9" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestListDelimiters/fwdslash.replay ================================================ { "Initial": "AQAAAA7hTghGEsfdXwAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "d28959b72b613ac5", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-delimiters-%2F\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "5242" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:50 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzh7mPpx7HCrjszFn3AK9RtiyKKSs74HJgGOP2NFToaHMwtVO-WNUulHTpb3xVmkBxw" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxL2EudHh0LzE1NDk2NjA5NDA1NTQ4MTgiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy0lMkZkaXIxJTJGYS50eHQiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLSUyRmRpcjElMkZhLnR4dD9nZW5lcmF0aW9uPTE1NDk2NjA5NDA1NTQ4MTgmYWx0PW1lZGlhIiwibmFtZSI6ImJsb2ItZm9yLWRlbGltaXRlcnMtL2RpcjEvYS50eHQiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5NDA1NTQ4MTgiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNNS2tpZStJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MjAuNTU0WiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjIwLjU1NFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MjAuNTU0WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjIwLjU1NFoifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxL2IudHh0LzE1NDk2NjA5NDEwOTk5NjIiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy0lMkZkaXIxJTJGYi50eHQiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLSUyRmRpcjElMkZiLnR4dD9nZW5lcmF0aW9uPTE1NDk2NjA5NDEwOTk5NjImYWx0PW1lZGlhIiwibmFtZSI6ImJsb2ItZm9yLWRlbGltaXRlcnMtL2RpcjEvYi50eHQiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5NDEwOTk5NjIiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNMckhxdStJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MjEuMDk5WiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjIxLjA5OVoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MjEuMDk5WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjIxLjA5OVoifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxL3N1YmRpci9jLnR4dC8xNTQ5NjYwOTQxNTYwNDE3Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtJTJGZGlyMSUyRnN1YmRpciUyRmMudHh0IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy0lMkZkaXIxJTJGc3ViZGlyJTJGYy50eHQ/Z2VuZXJhdGlvbj0xNTQ5NjYwOTQxNTYwNDE3JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxL3N1YmRpci9jLnR4dCIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU0OTY2MDk0MTU2MDQxNyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ09IVXh1K0lyZUFDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjoyMS41NTlaIiwidXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MjEuNTU5WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjoyMS41NTlaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDItMDhUMjE6MjI6MjEuNTU5WiJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2Jsb2ItZm9yLWRlbGltaXRlcnMtL2RpcjEvc3ViZGlyL2QudHh0LzE1NDk2NjA5NDIyMjE2NTgiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy0lMkZkaXIxJTJGc3ViZGlyJTJGZC50eHQiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLSUyRmRpcjElMkZzdWJkaXIlMkZkLnR4dD9nZW5lcmF0aW9uPTE1NDk2NjA5NDIyMjE2NTgmYWx0PW1lZGlhIiwibmFtZSI6ImJsb2ItZm9yLWRlbGltaXRlcnMtL2RpcjEvc3ViZGlyL2QudHh0IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTQ5NjYwOTQyMjIxNjU4IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTnFDNysrSXJlQUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjIyLjIyMVoiLCJ1cGRhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjoyMi4yMjFaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjIyLjIyMVoiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMi0wOFQyMToyMjoyMi4yMjFaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMi9lLnR4dC8xNzY0NjE4MDQ3MzE5OTUwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtJTJGZGlyMiUyRmUudHh0IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy0lMkZkaXIyJTJGZS50eHQ/Z2VuZXJhdGlvbj0xNzY0NjE4MDQ3MzE5OTUwJmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIyL2UudHh0IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzY0NjE4MDQ3MzE5OTUwIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDSTdmLzc2U25aRURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ3LjMyMloiLCJ1cGRhdGVkIjoiMjAyNS0xMi0wMVQxOTo0MDo0Ny4zMjJaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ3LjMyMloiLCJ0aW1lRmluYWxpemVkIjoiMjAyNS0xMi0wMVQxOTo0MDo0Ny4zMjJaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGVsaW1pdGVycy0vZi50eHQvMTU0OTY2MDk0MzQwNTIwOCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLSUyRmYudHh0IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy0lMkZmLnR4dD9nZW5lcmF0aW9uPTE1NDk2NjA5NDM0MDUyMDgmYWx0PW1lZGlhIiwibmFtZSI6ImJsb2ItZm9yLWRlbGltaXRlcnMtL2YudHh0IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTQ5NjYwOTQzNDA1MjA4IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDSmlodC9DSXJlQUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjIzLjQwM1oiLCJ1cGRhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjoyMy40MDNaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjIzLjQwM1oiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMi0wOFQyMToyMjoyMy40MDNaIn1dfQ==" } }, { "ID": "3ae55538123dcb27", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-delimiters-%2F\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "5242" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:50 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwnJeb7rzfeYqTqap99PZTLZpWVorRvrD-Kfi8sJZHOSbnnxgp0jPWr-8IlpvzMfDSa" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxL2EudHh0LzE1NDk2NjA5NDA1NTQ4MTgiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy0lMkZkaXIxJTJGYS50eHQiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLSUyRmRpcjElMkZhLnR4dD9nZW5lcmF0aW9uPTE1NDk2NjA5NDA1NTQ4MTgmYWx0PW1lZGlhIiwibmFtZSI6ImJsb2ItZm9yLWRlbGltaXRlcnMtL2RpcjEvYS50eHQiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5NDA1NTQ4MTgiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNNS2tpZStJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MjAuNTU0WiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjIwLjU1NFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MjAuNTU0WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjIwLjU1NFoifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxL2IudHh0LzE1NDk2NjA5NDEwOTk5NjIiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy0lMkZkaXIxJTJGYi50eHQiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLSUyRmRpcjElMkZiLnR4dD9nZW5lcmF0aW9uPTE1NDk2NjA5NDEwOTk5NjImYWx0PW1lZGlhIiwibmFtZSI6ImJsb2ItZm9yLWRlbGltaXRlcnMtL2RpcjEvYi50eHQiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5NDEwOTk5NjIiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNMckhxdStJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MjEuMDk5WiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjIxLjA5OVoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MjEuMDk5WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjIxLjA5OVoifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxL3N1YmRpci9jLnR4dC8xNTQ5NjYwOTQxNTYwNDE3Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtJTJGZGlyMSUyRnN1YmRpciUyRmMudHh0IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy0lMkZkaXIxJTJGc3ViZGlyJTJGYy50eHQ/Z2VuZXJhdGlvbj0xNTQ5NjYwOTQxNTYwNDE3JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxL3N1YmRpci9jLnR4dCIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU0OTY2MDk0MTU2MDQxNyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ09IVXh1K0lyZUFDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjoyMS41NTlaIiwidXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MjEuNTU5WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjoyMS41NTlaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDItMDhUMjE6MjI6MjEuNTU5WiJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2Jsb2ItZm9yLWRlbGltaXRlcnMtL2RpcjEvc3ViZGlyL2QudHh0LzE1NDk2NjA5NDIyMjE2NTgiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy0lMkZkaXIxJTJGc3ViZGlyJTJGZC50eHQiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLSUyRmRpcjElMkZzdWJkaXIlMkZkLnR4dD9nZW5lcmF0aW9uPTE1NDk2NjA5NDIyMjE2NTgmYWx0PW1lZGlhIiwibmFtZSI6ImJsb2ItZm9yLWRlbGltaXRlcnMtL2RpcjEvc3ViZGlyL2QudHh0IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTQ5NjYwOTQyMjIxNjU4IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTnFDNysrSXJlQUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjIyLjIyMVoiLCJ1cGRhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjoyMi4yMjFaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjIyLjIyMVoiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMi0wOFQyMToyMjoyMi4yMjFaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMi9lLnR4dC8xNzY0NjE4MDQ3MzE5OTUwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtJTJGZGlyMiUyRmUudHh0IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy0lMkZkaXIyJTJGZS50eHQ/Z2VuZXJhdGlvbj0xNzY0NjE4MDQ3MzE5OTUwJmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIyL2UudHh0IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzY0NjE4MDQ3MzE5OTUwIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDSTdmLzc2U25aRURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ3LjMyMloiLCJ1cGRhdGVkIjoiMjAyNS0xMi0wMVQxOTo0MDo0Ny4zMjJaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ3LjMyMloiLCJ0aW1lRmluYWxpemVkIjoiMjAyNS0xMi0wMVQxOTo0MDo0Ny4zMjJaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGVsaW1pdGVycy0vZi50eHQvMTU0OTY2MDk0MzQwNTIwOCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLSUyRmYudHh0IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy0lMkZmLnR4dD9nZW5lcmF0aW9uPTE1NDk2NjA5NDM0MDUyMDgmYWx0PW1lZGlhIiwibmFtZSI6ImJsb2ItZm9yLWRlbGltaXRlcnMtL2YudHh0IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTQ5NjYwOTQzNDA1MjA4IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDSmlodC9DSXJlQUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjIzLjQwM1oiLCJ1cGRhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjoyMy40MDNaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjIzLjQwM1oiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMi0wOFQyMToyMjoyMy40MDNaIn1dfQ==" } }, { "ID": "e4bda4a9c8a71cba", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%2F\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-delimiters-%2F\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "944" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:50 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzX6Th4T6u8CcS7DL7CLCPTXKb3pdtVAC-Y33rJ2En_lnZNGDkhxjUs-FlTfPtvOLGD" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwicHJlZml4ZXMiOlsiYmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMS8iLCJibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIyLyJdLCJpdGVtcyI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2Jsb2ItZm9yLWRlbGltaXRlcnMtL2YudHh0LzE1NDk2NjA5NDM0MDUyMDgiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy0lMkZmLnR4dCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtJTJGZi50eHQ/Z2VuZXJhdGlvbj0xNTQ5NjYwOTQzNDA1MjA4JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1kZWxpbWl0ZXJzLS9mLnR4dCIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU0OTY2MDk0MzQwNTIwOCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ0ppaHQvQ0lyZUFDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjoyMy40MDNaIiwidXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MjMuNDAzWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjoyMy40MDNaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDItMDhUMjE6MjI6MjMuNDAzWiJ9XX0=" } }, { "ID": "d43a3c509f80e93f", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%2F\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-delimiters-%2Fdir1%2F\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "1807" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:50 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzk_0Co62G369iehBBZrq8irHdHhVjVugZosm_IXulE0tL4LQ9sF0SkpmLgKA2gXzgL" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwicHJlZml4ZXMiOlsiYmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMS9zdWJkaXIvIl0sIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMS9hLnR4dC8xNTQ5NjYwOTQwNTU0ODE4Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtJTJGZGlyMSUyRmEudHh0IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy0lMkZkaXIxJTJGYS50eHQ/Z2VuZXJhdGlvbj0xNTQ5NjYwOTQwNTU0ODE4JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxL2EudHh0IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTQ5NjYwOTQwNTU0ODE4IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTUtraWUrSXJlQUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjIwLjU1NFoiLCJ1cGRhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjoyMC41NTRaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjIwLjU1NFoiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMi0wOFQyMToyMjoyMC41NTRaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMS9iLnR4dC8xNTQ5NjYwOTQxMDk5OTYyIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtJTJGZGlyMSUyRmIudHh0IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy0lMkZkaXIxJTJGYi50eHQ/Z2VuZXJhdGlvbj0xNTQ5NjYwOTQxMDk5OTYyJmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxL2IudHh0IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTQ5NjYwOTQxMDk5OTYyIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTHJIcXUrSXJlQUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjIxLjA5OVoiLCJ1cGRhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjoyMS4wOTlaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjIxLjA5OVoiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMi0wOFQyMToyMjoyMS4wOTlaIn1dfQ==" } }, { "ID": "a0e2a27f0b9e7423", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%2F\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-delimiters-%2Fdir1%2Fsubdir%2F\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "1822" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:50 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxaYSpjIFi9Wh0OQOtK-4FtI9guvHkRIVfJvV_ox_F2SXKtdOR3Ky_nZ1MnIWLmipTD" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxL3N1YmRpci9jLnR4dC8xNTQ5NjYwOTQxNTYwNDE3Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtJTJGZGlyMSUyRnN1YmRpciUyRmMudHh0IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy0lMkZkaXIxJTJGc3ViZGlyJTJGYy50eHQ/Z2VuZXJhdGlvbj0xNTQ5NjYwOTQxNTYwNDE3JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxL3N1YmRpci9jLnR4dCIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU0OTY2MDk0MTU2MDQxNyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ09IVXh1K0lyZUFDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjoyMS41NTlaIiwidXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MjEuNTU5WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjoyMS41NTlaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDItMDhUMjE6MjI6MjEuNTU5WiJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2Jsb2ItZm9yLWRlbGltaXRlcnMtL2RpcjEvc3ViZGlyL2QudHh0LzE1NDk2NjA5NDIyMjE2NTgiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy0lMkZkaXIxJTJGc3ViZGlyJTJGZC50eHQiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLSUyRmRpcjElMkZzdWJkaXIlMkZkLnR4dD9nZW5lcmF0aW9uPTE1NDk2NjA5NDIyMjE2NTgmYWx0PW1lZGlhIiwibmFtZSI6ImJsb2ItZm9yLWRlbGltaXRlcnMtL2RpcjEvc3ViZGlyL2QudHh0IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTQ5NjYwOTQyMjIxNjU4IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTnFDNysrSXJlQUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjIyLjIyMVoiLCJ1cGRhdGVkIjoiMjAxOS0wMi0wOFQyMToyMjoyMi4yMjFaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjIyLjIyMVoiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMi0wOFQyMToyMjoyMi4yMjFaIn1dfQ==" } }, { "ID": "7c29491eb442fff9", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%2F\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-delimiters-%2Fdir2%2F\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "897" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:50 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxkWNcROY-a8MuvCM6apzNPY5j8c1R-vi-pz_6N1F_omO9nz2azQ2Ywj1j_Cw4-VQYb" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIyL2UudHh0LzE3NjQ2MTgwNDczMTk5NTAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy0lMkZkaXIyJTJGZS50eHQiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLSUyRmRpcjIlMkZlLnR4dD9nZW5lcmF0aW9uPTE3NjQ2MTgwNDczMTk5NTAmYWx0PW1lZGlhIiwibmFtZSI6ImJsb2ItZm9yLWRlbGltaXRlcnMtL2RpcjIvZS50eHQiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NjQ2MTgwNDczMTk5NTAiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNJN2YvNzZTblpFREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjUtMTItMDFUMTk6NDA6NDcuMzIyWiIsInVwZGF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ3LjMyMloiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjUtMTItMDFUMTk6NDA6NDcuMzIyWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI1LTEyLTAxVDE5OjQwOjQ3LjMyMloifV19" } }, { "ID": "3891916837132c41", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%2F\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1\u0026pageToken=\u0026prefix=blob-for-delimiters-%2F\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "127" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:50 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxlQZegb3Qqs_gBzG5i5REL4IFdnEHFt_zjLx43ohugZUWAAjWIrY5QQ1Q4vzM6cFKE" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNocGliRzlpTFdadmNpMWtaV3hwYldsMFpYSnpMUzlrYVhJeEx3PT0iLCJwcmVmaXhlcyI6WyJibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxLyJdfQ==" } }, { "ID": "c976e6b13c50ef26", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%2F\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1\u0026pageToken=ChpibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxLw%3D%3D\u0026prefix=blob-for-delimiters-%2F\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "127" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:51 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxRYTOKsVFW-Xx6-irLgkivSh2NSSAYItOAhrIYXVh9CqzI8ze_OyEf60oraaOnb0ie" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNocGliRzlpTFdadmNpMWtaV3hwYldsMFpYSnpMUzlrYVhJeUx3PT0iLCJwcmVmaXhlcyI6WyJibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIyLyJdfQ==" } }, { "ID": "8162876ed299cfe9", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%2F\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1\u0026pageToken=ChpibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIyLw%3D%3D\u0026prefix=blob-for-delimiters-%2F\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "873" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:51 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwzewOizx2Znzmd1H3BlsnPmeP274B0DrlDNdYmUZ24vNkOd_6lMyF5hXUDuleKo1j1" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kZWxpbWl0ZXJzLS9mLnR4dC8xNTQ5NjYwOTQzNDA1MjA4Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtJTJGZi50eHQiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLSUyRmYudHh0P2dlbmVyYXRpb249MTU0OTY2MDk0MzQwNTIwOCZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGVsaW1pdGVycy0vZi50eHQiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5NDM0MDUyMDgiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNKaWh0L0NJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MjMuNDAzWiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjIzLjQwM1oiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MjMuNDAzWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjIzLjQwM1oifV19" } }, { "ID": "3baca33734bf1972", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-delimiters-%2Fdir2%2Fe.txt?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:07:51 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxvf4GNxsa2XwWmxU2v6vrxuF2rxZETV-kRx6FAfhcOLI2oJRaD33oSkrl4vlb1hvL-" ] }, "Body": "" } }, { "ID": "c4f0b302771d73e9", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=%2F\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-delimiters-%2F\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "915" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:51 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyxWPqRTS8e0xXG3b-374TDRdKmmSJ9ywqdJfoPEYc1NR8zddmK5k4rFJvnSurCJ9mj" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwicHJlZml4ZXMiOlsiYmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMS8iXSwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1kZWxpbWl0ZXJzLS9mLnR4dC8xNTQ5NjYwOTQzNDA1MjA4Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtJTJGZi50eHQiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1kZWxpbWl0ZXJzLSUyRmYudHh0P2dlbmVyYXRpb249MTU0OTY2MDk0MzQwNTIwOCZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItZGVsaW1pdGVycy0vZi50eHQiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NjA5NDM0MDUyMDgiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNKaWh0L0NJcmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MjMuNDAzWiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjIzLjQwM1oiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDhUMjE6MjI6MjMuNDAzWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA4VDIxOjIyOjIzLjQwM1oifV19" } }, { "ID": "8210cc87a1582494", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-delimiters-%2Fdir2%2Fe.txt\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibmFtZSI6ImJsb2ItZm9yLWRlbGltaXRlcnMtL2RpcjIvZS50eHQifQo=", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "860" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:51 GMT" ], "Etag": [ "COyEnvWerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWy66AgurmcH0NfOyaE2hqQyRTh9uYZQL7nGyfCajRp6zSw1Tsfs0KrdglVcR7_CuOtP" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMi9lLnR4dC8xNzczOTMyODcxMzg1NzA4Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLWRlbGltaXRlcnMtJTJGZGlyMiUyRmUudHh0IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItZGVsaW1pdGVycy0lMkZkaXIyJTJGZS50eHQ/Z2VuZXJhdGlvbj0xNzczOTMyODcxMzg1NzA4JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIyL2UudHh0IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMyODcxMzg1NzA4IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDT3lFbnZXZXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA3OjUxLjM4N1oiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowNzo1MS4zODdaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA3OjUxLjM4N1oiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNTowNzo1MS4zODdaIn0=" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestListWeirdKeys.replay ================================================ { "Initial": "AQAAAA7hTghGAy8FYAAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "ba8aa1e5365d76df", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=list-weirdkeys-\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "15938" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:50 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyn0wjhSI8NU6IXgG1_KsWvuK2BnPjTkL8Szj91Tna_JcVqt201dNoUx_J8Bwdfzrzv" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9saXN0LXdlaXJka2V5cy1cdTAwMDBcdTAwMDFcdTAwMDJcdTAwMDNcdTAwMDRcdTAwMDVcdTAwMDZcdTAwMDdcYlx0X18weGFfX1x1MDAwYlxmX18weGRfX1x1MDAwZVx1MDAwZi8xNTQ5NjcxMDA2NzcxOTI1Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLSUwMCUwMSUwMiUwMyUwNCUwNSUwNiUwNyUwOCUwOV9fMHhhX18lMEIlMENfXzB4ZF9fJTBFJTBGIiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vbGlzdC13ZWlyZGtleXMtJTAwJTAxJTAyJTAzJTA0JTA1JTA2JTA3JTA4JTA5X18weGFfXyUwQiUwQ19fMHhkX18lMEUlMEY/Z2VuZXJhdGlvbj0xNTQ5NjcxMDA2NzcxOTI1JmFsdD1tZWRpYSIsIm5hbWUiOiJsaXN0LXdlaXJka2V5cy1cdTAwMDBcdTAwMDFcdTAwMDJcdTAwMDNcdTAwMDRcdTAwMDVcdTAwMDZcdTAwMDdcYlx0X18weGFfX1x1MDAwYlxmX18weGRfX1x1MDAwZVx1MDAwZiIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU0OTY3MTAwNjc3MTkyNSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ05XMWdxK3VyZUFDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNi43NzFaIiwidXBkYXRlZCI6IjIwMTktMDItMDlUMDA6MTA6MDYuNzcxWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNi43NzFaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDItMDlUMDA6MTA6MDYuNzcxWiJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2xpc3Qtd2VpcmRrZXlzLVx1MDAxMFx1MDAxMVx1MDAxMlx1MDAxM1x1MDAxNFx1MDAxNVx1MDAxNlx1MDAxN1x1MDAxOFx1MDAxOVx1MDAxYVx1MDAxYlx1MDAxY1x1MDAxZFx1MDAxZVx1MDAxZi8xNTQ5NjcxMDA3OTQ1NTExIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLSUxMCUxMSUxMiUxMyUxNCUxNSUxNiUxNyUxOCUxOSUxQSUxQiUxQyUxRCUxRSUxRiIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLSUxMCUxMSUxMiUxMyUxNCUxNSUxNiUxNyUxOCUxOSUxQSUxQiUxQyUxRCUxRSUxRj9nZW5lcmF0aW9uPTE1NDk2NzEwMDc5NDU1MTEmYWx0PW1lZGlhIiwibmFtZSI6Imxpc3Qtd2VpcmRrZXlzLVx1MDAxMFx1MDAxMVx1MDAxMlx1MDAxM1x1MDAxNFx1MDAxNVx1MDAxNlx1MDAxN1x1MDAxOFx1MDAxOVx1MDAxYVx1MDAxYlx1MDAxY1x1MDAxZFx1MDAxZVx1MDAxZiIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU0OTY3MTAwNzk0NTUxMSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ0tlR3lxK3VyZUFDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNy45NDVaIiwidXBkYXRlZCI6IjIwMTktMDItMDlUMDA6MTA6MDcuOTQ1WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNy45NDVaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDItMDlUMDA6MTA6MDcuOTQ1WiJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2xpc3Qtd2VpcmRrZXlzLSAhXCIjJCUmJygpKissLS4vLzE1NDk2NzEwMDczOTIxMTYiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vbGlzdC13ZWlyZGtleXMtJTIwISUyMiUyMyQlMjUmJygpKiUyQiwtLiUyRiIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLSUyMCElMjIlMjMkJTI1JicoKSolMkIsLS4lMkY/Z2VuZXJhdGlvbj0xNTQ5NjcxMDA3MzkyMTE2JmFsdD1tZWRpYSIsIm5hbWUiOiJsaXN0LXdlaXJka2V5cy0gIVwiIyQlJicoKSorLC0uLyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU0OTY3MTAwNzM5MjExNiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ1BTaXFLK3VyZUFDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNy4zOTFaIiwidXBkYXRlZCI6IjIwMTktMDItMDlUMDA6MTA6MDcuMzkxWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNy4zOTFaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDItMDlUMDA6MTA6MDcuMzkxWiJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2xpc3Qtd2VpcmRrZXlzLS4uXFxmb29cXC4uXFxiYXJcXC4uXFwuLlxcYmF6Li5cXC8xNTQ5NjcxMDA3NzQwMjI0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLS4uJTVDZm9vJTVDLi4lNUNiYXIlNUMuLiU1Qy4uJTVDYmF6Li4lNUMiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9saXN0LXdlaXJka2V5cy0uLiU1Q2ZvbyU1Qy4uJTVDYmFyJTVDLi4lNUMuLiU1Q2Jhei4uJTVDP2dlbmVyYXRpb249MTU0OTY3MTAwNzc0MDIyNCZhbHQ9bWVkaWEiLCJuYW1lIjoibGlzdC13ZWlyZGtleXMtLi5cXGZvb1xcLi5cXGJhclxcLi5cXC4uXFxiYXouLlxcIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTQ5NjcxMDA3NzQwMjI0IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTURDdmErdXJlQUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA3LjczOVoiLCJ1cGRhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNy43MzlaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA3LjczOVoiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNy43MzlaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvbGlzdC13ZWlyZGtleXMtLi5cXGZvb1xcXFxiYXJcXFxcXFxiYXovMTU0OTY3MTAwNjQyNzYyMyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9saXN0LXdlaXJka2V5cy0uLiU1Q2ZvbyU1QyU1Q2JhciU1QyU1QyU1Q2JheiIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLS4uJTVDZm9vJTVDJTVDYmFyJTVDJTVDJTVDYmF6P2dlbmVyYXRpb249MTU0OTY3MTAwNjQyNzYyMyZhbHQ9bWVkaWEiLCJuYW1lIjoibGlzdC13ZWlyZGtleXMtLi5cXGZvb1xcXFxiYXJcXFxcXFxiYXoiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NzEwMDY0Mjc2MjMiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNPZXo3YTZ1cmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDlUMDA6MTA6MDYuNDI3WiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA2LjQyN1oiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDlUMDA6MTA6MDYuNDI3WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA2LjQyN1oifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9saXN0LXdlaXJka2V5cy0uLl9fMHgyZl9fZm9vLy4uX18weDJmX19iYXIvLi5fXzB4MmZfXy4uX18weDJmX19iYXouLl9fMHgyZl9fLzE1NDk2NzEwMDcwOTQzNjgiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vbGlzdC13ZWlyZGtleXMtLi5fXzB4MmZfX2ZvbyUyRi4uX18weDJmX19iYXIlMkYuLl9fMHgyZl9fLi5fXzB4MmZfX2Jhei4uX18weDJmX18iLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9saXN0LXdlaXJka2V5cy0uLl9fMHgyZl9fZm9vJTJGLi5fXzB4MmZfX2JhciUyRi4uX18weDJmX18uLl9fMHgyZl9fYmF6Li5fXzB4MmZfXz9nZW5lcmF0aW9uPTE1NDk2NzEwMDcwOTQzNjgmYWx0PW1lZGlhIiwibmFtZSI6Imxpc3Qtd2VpcmRrZXlzLS4uX18weDJmX19mb28vLi5fXzB4MmZfX2Jhci8uLl9fMHgyZl9fLi5fXzB4MmZfX2Jhei4uX18weDJmX18iLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NzEwMDcwOTQzNjgiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNPQ01scSt1cmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDlUMDA6MTA6MDcuMDkzWiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA3LjA5M1oiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDlUMDA6MTA6MDcuMDkzWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA3LjA5M1oifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9saXN0LXdlaXJka2V5cy0xMjM0NS8xNTQ5NjcxMDA3MzEyNjgxIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLTEyMzQ1IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vbGlzdC13ZWlyZGtleXMtMTIzNDU/Z2VuZXJhdGlvbj0xNTQ5NjcxMDA3MzEyNjgxJmFsdD1tZWRpYSIsIm5hbWUiOiJsaXN0LXdlaXJka2V5cy0xMjM0NSIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU0OTY3MTAwNzMxMjY4MSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ0ttMm82K3VyZUFDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNy4zMTJaIiwidXBkYXRlZCI6IjIwMTktMDItMDlUMDA6MTA6MDcuMzEyWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNy4zMTJaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDItMDlUMDA6MTA6MDcuMzEyWiJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2xpc3Qtd2VpcmRrZXlzLTo7XHUwMDNjPVx1MDAzZT8vMTU0OTY3MTAwODA2NjMxNyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9saXN0LXdlaXJka2V5cy06OyUzQz0lM0UlM0YiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9saXN0LXdlaXJka2V5cy06OyUzQz0lM0UlM0Y/Z2VuZXJhdGlvbj0xNTQ5NjcxMDA4MDY2MzE3JmFsdD1tZWRpYSIsIm5hbWUiOiJsaXN0LXdlaXJka2V5cy06O1x1MDAzYz1cdTAwM2U/IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTQ5NjcxMDA4MDY2MzE3IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDSTIyMGErdXJlQUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA4LjA2NVoiLCJ1cGRhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowOC4wNjVaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA4LjA2NVoiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMi0wOVQwMDoxMDowOC4wNjVaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvbGlzdC13ZWlyZGtleXMtQC8xNTQ5NjcxMDA3NTAyMTQxIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLUAiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9saXN0LXdlaXJka2V5cy1AP2dlbmVyYXRpb249MTU0OTY3MTAwNzUwMjE0MSZhbHQ9bWVkaWEiLCJuYW1lIjoibGlzdC13ZWlyZGtleXMtQCIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU0OTY3MTAwNzUwMjE0MSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ0wzK3JxK3VyZUFDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNy41MDFaIiwidXBkYXRlZCI6IjIwMTktMDItMDlUMDA6MTA6MDcuNTAxWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNy41MDFaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDItMDlUMDA6MTA6MDcuNTAxWiJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2xpc3Qtd2VpcmRrZXlzLVtcXF1eXy8xNTQ5NjcxMDA2MTEzMzA0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLSU1QiU1QyU1RCU1RV8iLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9saXN0LXdlaXJka2V5cy0lNUIlNUMlNUQlNUVfP2dlbmVyYXRpb249MTU0OTY3MTAwNjExMzMwNCZhbHQ9bWVkaWEiLCJuYW1lIjoibGlzdC13ZWlyZGtleXMtW1xcXV5fIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTQ5NjcxMDA2MTEzMzA0IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDSmljMnE2dXJlQUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA2LjExMloiLCJ1cGRhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNi4xMTJaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA2LjExMloiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNi4xMTJaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvbGlzdC13ZWlyZGtleXMtYC8xNTQ5NjcxMDA4MTYzMTY1Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLSU2MCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLSU2MD9nZW5lcmF0aW9uPTE1NDk2NzEwMDgxNjMxNjUmYWx0PW1lZGlhIiwibmFtZSI6Imxpc3Qtd2VpcmRrZXlzLWAiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NzEwMDgxNjMxNjUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNOMnExNit1cmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDlUMDA6MTA6MDguMTYyWiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA4LjE2MloiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDlUMDA6MTA6MDguMTYyWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA4LjE2MloifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9saXN0LXdlaXJka2V5cy1mb28gYmFyIGJhei8xNTQ5NjcxMDA3MjAzNjAwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLWZvbyUyMGJhciUyMGJheiIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLWZvbyUyMGJhciUyMGJhej9nZW5lcmF0aW9uPTE1NDk2NzEwMDcyMDM2MDAmYWx0PW1lZGlhIiwibmFtZSI6Imxpc3Qtd2VpcmRrZXlzLWZvbyBiYXIgYmF6IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTQ5NjcxMDA3MjAzNjAwIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDSkRpbksrdXJlQUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA3LjIwM1oiLCJ1cGRhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNy4yMDNaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA3LjIwM1oiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNy4yMDNaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvbGlzdC13ZWlyZGtleXMtZm9vXCJiYXJcImJhei8xNTQ5NjcxMDA2NTUyMjg4Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLWZvbyUyMmJhciUyMmJheiIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLWZvbyUyMmJhciUyMmJhej9nZW5lcmF0aW9uPTE1NDk2NzEwMDY1NTIyODgmYWx0PW1lZGlhIiwibmFtZSI6Imxpc3Qtd2VpcmRrZXlzLWZvb1wiYmFyXCJiYXoiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NzEwMDY1NTIyODgiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNPQ0I5YTZ1cmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDlUMDA6MTA6MDYuNTUxWiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA2LjU1MVoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDlUMDA6MTA6MDYuNTUxWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA2LjU1MVoifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9saXN0LXdlaXJka2V5cy1mb28vL2Jhci8vL2Jhei8xNTQ5NjcxMDA3NjMzMTg2Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLWZvbyUyRiUyRmJhciUyRiUyRiUyRmJheiIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLWZvbyUyRiUyRmJhciUyRiUyRiUyRmJhej9nZW5lcmF0aW9uPTE1NDk2NzEwMDc2MzMxODYmYWx0PW1lZGlhIiwibmFtZSI6Imxpc3Qtd2VpcmRrZXlzLWZvby8vYmFyLy8vYmF6IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTQ5NjcxMDA3NjMzMTg2IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDS0wrdHErdXJlQUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA3LjYzMloiLCJ1cGRhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNy42MzJaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA3LjYzMloiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNy42MzJaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvbGlzdC13ZWlyZGtleXMtZm9vL2Jhci9iYXovMTU0OTY3MTAwNTk5MjY3MSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9saXN0LXdlaXJka2V5cy1mb28lMkZiYXIlMkZiYXoiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9saXN0LXdlaXJka2V5cy1mb28lMkZiYXIlMkZiYXo/Z2VuZXJhdGlvbj0xNTQ5NjcxMDA1OTkyNjcxJmFsdD1tZWRpYSIsIm5hbWUiOiJsaXN0LXdlaXJka2V5cy1mb28vYmFyL2JheiIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU0OTY3MTAwNTk5MjY3MSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ04vdDBxNnVyZUFDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNS45OTJaIiwidXBkYXRlZCI6IjIwMTktMDItMDlUMDA6MTA6MDUuOTkyWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNS45OTJaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDItMDlUMDA6MTA6MDUuOTkyWiJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2xpc3Qtd2VpcmRrZXlzLWZvb1xcYmFyXFxiYXovMTU0OTY3MTAwNjMyMjM2MSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9saXN0LXdlaXJka2V5cy1mb28lNUNiYXIlNUNiYXoiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9saXN0LXdlaXJka2V5cy1mb28lNUNiYXIlNUNiYXo/Z2VuZXJhdGlvbj0xNTQ5NjcxMDA2MzIyMzYxJmFsdD1tZWRpYSIsIm5hbWUiOiJsaXN0LXdlaXJka2V5cy1mb29cXGJhclxcYmF6IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTQ5NjcxMDA2MzIyMzYxIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTG45NXE2dXJlQUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA2LjMyMVoiLCJ1cGRhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNi4zMjFaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA2LjMyMVoiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNi4zMjFaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvbGlzdC13ZWlyZGtleXMte3x9flx1MDA3Zi8xNTQ5NjcxMDA2ODc3MTE3Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLSU3QiU3QyU3RH4lN0YiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9saXN0LXdlaXJka2V5cy0lN0IlN0MlN0R+JTdGP2dlbmVyYXRpb249MTU0OTY3MTAwNjg3NzExNyZhbHQ9bWVkaWEiLCJuYW1lIjoibGlzdC13ZWlyZGtleXMte3x9flx1MDA3ZiIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU0OTY3MTAwNjg3NzExNyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ0wzcmlLK3VyZUFDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNi44NzZaIiwidXBkYXRlZCI6IjIwMTktMDItMDlUMDA6MTA6MDYuODc2WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNi44NzZaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDItMDlUMDA6MTA6MDYuODc2WiJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2xpc3Qtd2VpcmRrZXlzLeKYuuKYuuKYui8xNTQ5NjcxMDA2NjY3NzE2Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLSVFMiU5OCVCQSVFMiU5OCVCQSVFMiU5OCVCQSIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLSVFMiU5OCVCQSVFMiU5OCVCQSVFMiU5OCVCQT9nZW5lcmF0aW9uPTE1NDk2NzEwMDY2Njc3MTYmYWx0PW1lZGlhIiwibmFtZSI6Imxpc3Qtd2VpcmRrZXlzLeKYuuKYuuKYuiIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU0OTY3MTAwNjY2NzcxNiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ01TSC9LNnVyZUFDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNi42NjdaIiwidXBkYXRlZCI6IjIwMTktMDItMDlUMDA6MTA6MDYuNjY3WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNi42NjdaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDItMDlUMDA6MTA6MDYuNjY3WiJ9XX0=" } }, { "ID": "821fdecc0884b01b", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=list-weirdkeys-\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "15938" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:50 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxw_sD_CZbyPpxUzRXsOOzH0c3Hl5EJH8c-PKr7jcIcrVoz_I2-xRTdmSW317OpU0a5" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9saXN0LXdlaXJka2V5cy1cdTAwMDBcdTAwMDFcdTAwMDJcdTAwMDNcdTAwMDRcdTAwMDVcdTAwMDZcdTAwMDdcYlx0X18weGFfX1x1MDAwYlxmX18weGRfX1x1MDAwZVx1MDAwZi8xNTQ5NjcxMDA2NzcxOTI1Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLSUwMCUwMSUwMiUwMyUwNCUwNSUwNiUwNyUwOCUwOV9fMHhhX18lMEIlMENfXzB4ZF9fJTBFJTBGIiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vbGlzdC13ZWlyZGtleXMtJTAwJTAxJTAyJTAzJTA0JTA1JTA2JTA3JTA4JTA5X18weGFfXyUwQiUwQ19fMHhkX18lMEUlMEY/Z2VuZXJhdGlvbj0xNTQ5NjcxMDA2NzcxOTI1JmFsdD1tZWRpYSIsIm5hbWUiOiJsaXN0LXdlaXJka2V5cy1cdTAwMDBcdTAwMDFcdTAwMDJcdTAwMDNcdTAwMDRcdTAwMDVcdTAwMDZcdTAwMDdcYlx0X18weGFfX1x1MDAwYlxmX18weGRfX1x1MDAwZVx1MDAwZiIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU0OTY3MTAwNjc3MTkyNSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ05XMWdxK3VyZUFDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNi43NzFaIiwidXBkYXRlZCI6IjIwMTktMDItMDlUMDA6MTA6MDYuNzcxWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNi43NzFaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDItMDlUMDA6MTA6MDYuNzcxWiJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2xpc3Qtd2VpcmRrZXlzLVx1MDAxMFx1MDAxMVx1MDAxMlx1MDAxM1x1MDAxNFx1MDAxNVx1MDAxNlx1MDAxN1x1MDAxOFx1MDAxOVx1MDAxYVx1MDAxYlx1MDAxY1x1MDAxZFx1MDAxZVx1MDAxZi8xNTQ5NjcxMDA3OTQ1NTExIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLSUxMCUxMSUxMiUxMyUxNCUxNSUxNiUxNyUxOCUxOSUxQSUxQiUxQyUxRCUxRSUxRiIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLSUxMCUxMSUxMiUxMyUxNCUxNSUxNiUxNyUxOCUxOSUxQSUxQiUxQyUxRCUxRSUxRj9nZW5lcmF0aW9uPTE1NDk2NzEwMDc5NDU1MTEmYWx0PW1lZGlhIiwibmFtZSI6Imxpc3Qtd2VpcmRrZXlzLVx1MDAxMFx1MDAxMVx1MDAxMlx1MDAxM1x1MDAxNFx1MDAxNVx1MDAxNlx1MDAxN1x1MDAxOFx1MDAxOVx1MDAxYVx1MDAxYlx1MDAxY1x1MDAxZFx1MDAxZVx1MDAxZiIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU0OTY3MTAwNzk0NTUxMSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ0tlR3lxK3VyZUFDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNy45NDVaIiwidXBkYXRlZCI6IjIwMTktMDItMDlUMDA6MTA6MDcuOTQ1WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNy45NDVaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDItMDlUMDA6MTA6MDcuOTQ1WiJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2xpc3Qtd2VpcmRrZXlzLSAhXCIjJCUmJygpKissLS4vLzE1NDk2NzEwMDczOTIxMTYiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vbGlzdC13ZWlyZGtleXMtJTIwISUyMiUyMyQlMjUmJygpKiUyQiwtLiUyRiIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLSUyMCElMjIlMjMkJTI1JicoKSolMkIsLS4lMkY/Z2VuZXJhdGlvbj0xNTQ5NjcxMDA3MzkyMTE2JmFsdD1tZWRpYSIsIm5hbWUiOiJsaXN0LXdlaXJka2V5cy0gIVwiIyQlJicoKSorLC0uLyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU0OTY3MTAwNzM5MjExNiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ1BTaXFLK3VyZUFDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNy4zOTFaIiwidXBkYXRlZCI6IjIwMTktMDItMDlUMDA6MTA6MDcuMzkxWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNy4zOTFaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDItMDlUMDA6MTA6MDcuMzkxWiJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2xpc3Qtd2VpcmRrZXlzLS4uXFxmb29cXC4uXFxiYXJcXC4uXFwuLlxcYmF6Li5cXC8xNTQ5NjcxMDA3NzQwMjI0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLS4uJTVDZm9vJTVDLi4lNUNiYXIlNUMuLiU1Qy4uJTVDYmF6Li4lNUMiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9saXN0LXdlaXJka2V5cy0uLiU1Q2ZvbyU1Qy4uJTVDYmFyJTVDLi4lNUMuLiU1Q2Jhei4uJTVDP2dlbmVyYXRpb249MTU0OTY3MTAwNzc0MDIyNCZhbHQ9bWVkaWEiLCJuYW1lIjoibGlzdC13ZWlyZGtleXMtLi5cXGZvb1xcLi5cXGJhclxcLi5cXC4uXFxiYXouLlxcIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTQ5NjcxMDA3NzQwMjI0IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTURDdmErdXJlQUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA3LjczOVoiLCJ1cGRhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNy43MzlaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA3LjczOVoiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNy43MzlaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvbGlzdC13ZWlyZGtleXMtLi5cXGZvb1xcXFxiYXJcXFxcXFxiYXovMTU0OTY3MTAwNjQyNzYyMyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9saXN0LXdlaXJka2V5cy0uLiU1Q2ZvbyU1QyU1Q2JhciU1QyU1QyU1Q2JheiIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLS4uJTVDZm9vJTVDJTVDYmFyJTVDJTVDJTVDYmF6P2dlbmVyYXRpb249MTU0OTY3MTAwNjQyNzYyMyZhbHQ9bWVkaWEiLCJuYW1lIjoibGlzdC13ZWlyZGtleXMtLi5cXGZvb1xcXFxiYXJcXFxcXFxiYXoiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NzEwMDY0Mjc2MjMiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNPZXo3YTZ1cmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDlUMDA6MTA6MDYuNDI3WiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA2LjQyN1oiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDlUMDA6MTA6MDYuNDI3WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA2LjQyN1oifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9saXN0LXdlaXJka2V5cy0uLl9fMHgyZl9fZm9vLy4uX18weDJmX19iYXIvLi5fXzB4MmZfXy4uX18weDJmX19iYXouLl9fMHgyZl9fLzE1NDk2NzEwMDcwOTQzNjgiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vbGlzdC13ZWlyZGtleXMtLi5fXzB4MmZfX2ZvbyUyRi4uX18weDJmX19iYXIlMkYuLl9fMHgyZl9fLi5fXzB4MmZfX2Jhei4uX18weDJmX18iLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9saXN0LXdlaXJka2V5cy0uLl9fMHgyZl9fZm9vJTJGLi5fXzB4MmZfX2JhciUyRi4uX18weDJmX18uLl9fMHgyZl9fYmF6Li5fXzB4MmZfXz9nZW5lcmF0aW9uPTE1NDk2NzEwMDcwOTQzNjgmYWx0PW1lZGlhIiwibmFtZSI6Imxpc3Qtd2VpcmRrZXlzLS4uX18weDJmX19mb28vLi5fXzB4MmZfX2Jhci8uLl9fMHgyZl9fLi5fXzB4MmZfX2Jhei4uX18weDJmX18iLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NzEwMDcwOTQzNjgiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNPQ01scSt1cmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDlUMDA6MTA6MDcuMDkzWiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA3LjA5M1oiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDlUMDA6MTA6MDcuMDkzWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA3LjA5M1oifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9saXN0LXdlaXJka2V5cy0xMjM0NS8xNTQ5NjcxMDA3MzEyNjgxIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLTEyMzQ1IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vbGlzdC13ZWlyZGtleXMtMTIzNDU/Z2VuZXJhdGlvbj0xNTQ5NjcxMDA3MzEyNjgxJmFsdD1tZWRpYSIsIm5hbWUiOiJsaXN0LXdlaXJka2V5cy0xMjM0NSIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU0OTY3MTAwNzMxMjY4MSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ0ttMm82K3VyZUFDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNy4zMTJaIiwidXBkYXRlZCI6IjIwMTktMDItMDlUMDA6MTA6MDcuMzEyWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNy4zMTJaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDItMDlUMDA6MTA6MDcuMzEyWiJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2xpc3Qtd2VpcmRrZXlzLTo7XHUwMDNjPVx1MDAzZT8vMTU0OTY3MTAwODA2NjMxNyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9saXN0LXdlaXJka2V5cy06OyUzQz0lM0UlM0YiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9saXN0LXdlaXJka2V5cy06OyUzQz0lM0UlM0Y/Z2VuZXJhdGlvbj0xNTQ5NjcxMDA4MDY2MzE3JmFsdD1tZWRpYSIsIm5hbWUiOiJsaXN0LXdlaXJka2V5cy06O1x1MDAzYz1cdTAwM2U/IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTQ5NjcxMDA4MDY2MzE3IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDSTIyMGErdXJlQUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA4LjA2NVoiLCJ1cGRhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowOC4wNjVaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA4LjA2NVoiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMi0wOVQwMDoxMDowOC4wNjVaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvbGlzdC13ZWlyZGtleXMtQC8xNTQ5NjcxMDA3NTAyMTQxIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLUAiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9saXN0LXdlaXJka2V5cy1AP2dlbmVyYXRpb249MTU0OTY3MTAwNzUwMjE0MSZhbHQ9bWVkaWEiLCJuYW1lIjoibGlzdC13ZWlyZGtleXMtQCIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU0OTY3MTAwNzUwMjE0MSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ0wzK3JxK3VyZUFDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNy41MDFaIiwidXBkYXRlZCI6IjIwMTktMDItMDlUMDA6MTA6MDcuNTAxWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNy41MDFaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDItMDlUMDA6MTA6MDcuNTAxWiJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2xpc3Qtd2VpcmRrZXlzLVtcXF1eXy8xNTQ5NjcxMDA2MTEzMzA0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLSU1QiU1QyU1RCU1RV8iLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9saXN0LXdlaXJka2V5cy0lNUIlNUMlNUQlNUVfP2dlbmVyYXRpb249MTU0OTY3MTAwNjExMzMwNCZhbHQ9bWVkaWEiLCJuYW1lIjoibGlzdC13ZWlyZGtleXMtW1xcXV5fIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTQ5NjcxMDA2MTEzMzA0IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDSmljMnE2dXJlQUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA2LjExMloiLCJ1cGRhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNi4xMTJaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA2LjExMloiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNi4xMTJaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvbGlzdC13ZWlyZGtleXMtYC8xNTQ5NjcxMDA4MTYzMTY1Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLSU2MCIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLSU2MD9nZW5lcmF0aW9uPTE1NDk2NzEwMDgxNjMxNjUmYWx0PW1lZGlhIiwibmFtZSI6Imxpc3Qtd2VpcmRrZXlzLWAiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NzEwMDgxNjMxNjUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNOMnExNit1cmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDlUMDA6MTA6MDguMTYyWiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA4LjE2MloiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDlUMDA6MTA6MDguMTYyWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA4LjE2MloifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9saXN0LXdlaXJka2V5cy1mb28gYmFyIGJhei8xNTQ5NjcxMDA3MjAzNjAwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLWZvbyUyMGJhciUyMGJheiIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLWZvbyUyMGJhciUyMGJhej9nZW5lcmF0aW9uPTE1NDk2NzEwMDcyMDM2MDAmYWx0PW1lZGlhIiwibmFtZSI6Imxpc3Qtd2VpcmRrZXlzLWZvbyBiYXIgYmF6IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTQ5NjcxMDA3MjAzNjAwIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDSkRpbksrdXJlQUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA3LjIwM1oiLCJ1cGRhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNy4yMDNaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA3LjIwM1oiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNy4yMDNaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvbGlzdC13ZWlyZGtleXMtZm9vXCJiYXJcImJhei8xNTQ5NjcxMDA2NTUyMjg4Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLWZvbyUyMmJhciUyMmJheiIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLWZvbyUyMmJhciUyMmJhej9nZW5lcmF0aW9uPTE1NDk2NzEwMDY1NTIyODgmYWx0PW1lZGlhIiwibmFtZSI6Imxpc3Qtd2VpcmRrZXlzLWZvb1wiYmFyXCJiYXoiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE1NDk2NzEwMDY1NTIyODgiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNPQ0I5YTZ1cmVBQ0VBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDItMDlUMDA6MTA6MDYuNTUxWiIsInVwZGF0ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA2LjU1MVoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDItMDlUMDA6MTA6MDYuNTUxWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA2LjU1MVoifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9saXN0LXdlaXJka2V5cy1mb28vL2Jhci8vL2Jhei8xNTQ5NjcxMDA3NjMzMTg2Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLWZvbyUyRiUyRmJhciUyRiUyRiUyRmJheiIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLWZvbyUyRiUyRmJhciUyRiUyRiUyRmJhej9nZW5lcmF0aW9uPTE1NDk2NzEwMDc2MzMxODYmYWx0PW1lZGlhIiwibmFtZSI6Imxpc3Qtd2VpcmRrZXlzLWZvby8vYmFyLy8vYmF6IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTQ5NjcxMDA3NjMzMTg2IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDS0wrdHErdXJlQUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA3LjYzMloiLCJ1cGRhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNy42MzJaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA3LjYzMloiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNy42MzJaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvbGlzdC13ZWlyZGtleXMtZm9vL2Jhci9iYXovMTU0OTY3MTAwNTk5MjY3MSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9saXN0LXdlaXJka2V5cy1mb28lMkZiYXIlMkZiYXoiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9saXN0LXdlaXJka2V5cy1mb28lMkZiYXIlMkZiYXo/Z2VuZXJhdGlvbj0xNTQ5NjcxMDA1OTkyNjcxJmFsdD1tZWRpYSIsIm5hbWUiOiJsaXN0LXdlaXJka2V5cy1mb28vYmFyL2JheiIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU0OTY3MTAwNTk5MjY3MSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ04vdDBxNnVyZUFDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNS45OTJaIiwidXBkYXRlZCI6IjIwMTktMDItMDlUMDA6MTA6MDUuOTkyWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNS45OTJaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDItMDlUMDA6MTA6MDUuOTkyWiJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2xpc3Qtd2VpcmRrZXlzLWZvb1xcYmFyXFxiYXovMTU0OTY3MTAwNjMyMjM2MSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9saXN0LXdlaXJka2V5cy1mb28lNUNiYXIlNUNiYXoiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9saXN0LXdlaXJka2V5cy1mb28lNUNiYXIlNUNiYXo/Z2VuZXJhdGlvbj0xNTQ5NjcxMDA2MzIyMzYxJmFsdD1tZWRpYSIsIm5hbWUiOiJsaXN0LXdlaXJka2V5cy1mb29cXGJhclxcYmF6IiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNTQ5NjcxMDA2MzIyMzYxIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTG45NXE2dXJlQUNFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA2LjMyMVoiLCJ1cGRhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNi4zMjFaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTAyLTA5VDAwOjEwOjA2LjMyMVoiLCJ0aW1lRmluYWxpemVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNi4zMjFaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvbGlzdC13ZWlyZGtleXMte3x9flx1MDA3Zi8xNTQ5NjcxMDA2ODc3MTE3Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLSU3QiU3QyU3RH4lN0YiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9saXN0LXdlaXJka2V5cy0lN0IlN0MlN0R+JTdGP2dlbmVyYXRpb249MTU0OTY3MTAwNjg3NzExNyZhbHQ9bWVkaWEiLCJuYW1lIjoibGlzdC13ZWlyZGtleXMte3x9flx1MDA3ZiIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU0OTY3MTAwNjg3NzExNyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ0wzcmlLK3VyZUFDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNi44NzZaIiwidXBkYXRlZCI6IjIwMTktMDItMDlUMDA6MTA6MDYuODc2WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNi44NzZaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDItMDlUMDA6MTA6MDYuODc2WiJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2xpc3Qtd2VpcmRrZXlzLeKYuuKYuuKYui8xNTQ5NjcxMDA2NjY3NzE2Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLSVFMiU5OCVCQSVFMiU5OCVCQSVFMiU5OCVCQSIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2xpc3Qtd2VpcmRrZXlzLSVFMiU5OCVCQSVFMiU5OCVCQSVFMiU5OCVCQT9nZW5lcmF0aW9uPTE1NDk2NzEwMDY2Njc3MTYmYWx0PW1lZGlhIiwibmFtZSI6Imxpc3Qtd2VpcmRrZXlzLeKYuuKYuuKYuiIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTU0OTY3MTAwNjY2NzcxNiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ01TSC9LNnVyZUFDRUFFPSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNi42NjdaIiwidXBkYXRlZCI6IjIwMTktMDItMDlUMDA6MTA6MDYuNjY3WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wMi0wOVQwMDoxMDowNi42NjdaIiwidGltZUZpbmFsaXplZCI6IjIwMTktMDItMDlUMDA6MTA6MDYuNjY3WiJ9XX0=" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestMD5.replay ================================================ { "Initial": "AQAAAA7hTghYBz0Y8QAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "9262cdd1d6d6f2e7", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-md5-aaa\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibmFtZSI6ImJsb2ItZm9yLW1kNS1hYWEifQo=", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "792" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:08 GMT" ], "Etag": [ "CLWipP2erJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWySbHlinEdJiKr85uv2zqXOBY945NUzxcmKVPizME_tHb6K8xv3iH7mfSLUeHp5P7G4" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItbWQ1LWFhYS8xNzczOTMyODg4MjY1MDEzIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLW1kNS1hYWEiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1tZDUtYWFhP2dlbmVyYXRpb249MTc3MzkzMjg4ODI2NTAxMyZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItbWQ1LWFhYSIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjg4ODI2NTAxMyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ0xXaXBQMmVySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowOC4yNjhaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDguMjY4WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowOC4yNjhaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDguMjY4WiJ9" } }, { "ID": "fcac1bbe1a013889", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-md5-bbb\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoieGxkMnNnPT0iLCJtZDVIYXNoIjoiYWZxclltZzFBcFZWRGVmVmg3d3lQUT09IiwibmFtZSI6ImJsb2ItZm9yLW1kNS1iYmIifQo=", "Z29vZGJ5ZQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "792" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:08 GMT" ], "Etag": [ "CO+gqv2erJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyQVPfoQdpOp5MeNtT3ir4S-wwda19cpEujy0B39oe5t-C-25-1wQngwgF63cz5Qgwc" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItbWQ1LWJiYi8xNzczOTMyODg4MzYzMTE5Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLW1kNS1iYmIiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1tZDUtYmJiP2dlbmVyYXRpb249MTc3MzkzMjg4ODM2MzExOSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItbWQ1LWJiYiIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjg4ODM2MzExOSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjciLCJtZDVIYXNoIjoiYWZxclltZzFBcFZWRGVmVmg3d3lQUT09IiwiY3JjMzJjIjoieGxkMnNnPT0iLCJldGFnIjoiQ08rZ3F2MmVySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowOC4zNjZaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDguMzY2WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowOC4zNjZaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDguMzY2WiJ9" } }, { "ID": "8de327ecd34d57e2", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-md5-aaa?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "792" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:08 GMT" ], "Etag": [ "CLWipP2erJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyRV1UrNHHZxeP92ySKvrflD0IehR6Q3n3R-vNsYuuJ4HSBdbzqFr5XOTPTrejCaQYf" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItbWQ1LWFhYS8xNzczOTMyODg4MjY1MDEzIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLW1kNS1hYWEiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1tZDUtYWFhP2dlbmVyYXRpb249MTc3MzkzMjg4ODI2NTAxMyZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItbWQ1LWFhYSIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjg4ODI2NTAxMyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ0xXaXBQMmVySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowOC4yNjhaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDguMjY4WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowOC4yNjhaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDguMjY4WiJ9" } }, { "ID": "b4ff39b425f38e7c", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-md5-bbb?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "792" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:08 GMT" ], "Etag": [ "CO+gqv2erJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwYAO9NlQkmUreToBFnDnG5uRxhWXUht-uJvflC5NLuMhB6kOVGX2p-BoZfwgD_Z6YM" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItbWQ1LWJiYi8xNzczOTMyODg4MzYzMTE5Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLW1kNS1iYmIiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1tZDUtYmJiP2dlbmVyYXRpb249MTc3MzkzMjg4ODM2MzExOSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItbWQ1LWJiYiIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjg4ODM2MzExOSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjciLCJtZDVIYXNoIjoiYWZxclltZzFBcFZWRGVmVmg3d3lQUT09IiwiY3JjMzJjIjoieGxkMnNnPT0iLCJldGFnIjoiQ08rZ3F2MmVySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowOC4zNjZaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDguMzY2WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowOC4zNjZaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDguMzY2WiJ9" } }, { "ID": "ec35c57bcbb2020b", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1000\u0026pageToken=\u0026prefix=blob-for-md5-\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "1622" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:08 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwmXWlAuYHAiLvdSmxFnwreeddNjw354BCJdwiEnfuuzNKU8GwwW0miGlW0PvWC_UHG" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1tZDUtYWFhLzE3NzM5MzI4ODgyNjUwMTMiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItbWQ1LWFhYSIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLW1kNS1hYWE/Z2VuZXJhdGlvbj0xNzczOTMyODg4MjY1MDEzJmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1tZDUtYWFhIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMyODg4MjY1MDEzIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTFdpcFAyZXJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjA4LjI2OFoiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowOC4yNjhaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjA4LjI2OFoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNTowODowOC4yNjhaIn0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItbWQ1LWJiYi8xNzczOTMyODg4MzYzMTE5Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLW1kNS1iYmIiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1tZDUtYmJiP2dlbmVyYXRpb249MTc3MzkzMjg4ODM2MzExOSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItbWQ1LWJiYiIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjg4ODM2MzExOSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjciLCJtZDVIYXNoIjoiYWZxclltZzFBcFZWRGVmVmg3d3lQUT09IiwiY3JjMzJjIjoieGxkMnNnPT0iLCJldGFnIjoiQ08rZ3F2MmVySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowOC4zNjZaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDguMzY2WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowOC4zNjZaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDguMzY2WiJ9XX0=" } }, { "ID": "3ab85c6bba29860c", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-md5-bbb?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:08 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxVAOK_i0n6QV5fs_b0JZvh-AEPtI_1K1PeO9t1DK_f4CT2Uj7LRSt5rLB8uvt1KhJ6" ] }, "Body": "" } }, { "ID": "1bdfd198e7745840", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-md5-aaa?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:08 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwGlhQjlQylvSKvsfVg6SCIcFuCxgl7l6fsz9_AJnieEXNq4re84t65bAxJi_1yLZTu" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestMetadata/duplicate_case-insensitive_key_fails.replay ================================================ { "Initial": "AQAAAA7hTghWJcpb1gAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": null } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestMetadata/empty.replay ================================================ { "Initial": "AQAAAA7hTghWEdlkVwAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "9ebd1415088baa01", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-metadata\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibmFtZSI6ImJsb2ItZm9yLW1ldGFkYXRhIn0K", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "796" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:06 GMT" ], "Etag": [ "COSwtPyerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwHU9P3P1wPu4lXP4_6cYIWrp-xkf4uFIujHjc5iCizG1bDtSybxWzRmMNqQRnrrNBx" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItbWV0YWRhdGEvMTc3MzkzMjg4NjQzMTg0NCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1tZXRhZGF0YSIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLW1ldGFkYXRhP2dlbmVyYXRpb249MTc3MzkzMjg4NjQzMTg0NCZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItbWV0YWRhdGEiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzI4ODY0MzE4NDQiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNPU3d0UHllckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDYuNDM0WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjA2LjQzNFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDYuNDM0WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjA2LjQzNFoifQ==" } }, { "ID": "7f9b5230a25f654a", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-metadata?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "796" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:06 GMT" ], "Etag": [ "COSwtPyerJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWztSdmipon8n0jJCFeH5s6IN9zk07WDs0AkUjft1-0PMUHTdAEMWJ98Pz8BGTB5fgDQ" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItbWV0YWRhdGEvMTc3MzkzMjg4NjQzMTg0NCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1tZXRhZGF0YSIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLW1ldGFkYXRhP2dlbmVyYXRpb249MTc3MzkzMjg4NjQzMTg0NCZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItbWV0YWRhdGEiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzI4ODY0MzE4NDQiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNPU3d0UHllckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDYuNDM0WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjA2LjQzNFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDYuNDM0WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjA2LjQzNFoifQ==" } }, { "ID": "28f1608a8b6a99ba", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-metadata?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:06 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzo3VAqP68ScNtXllwJZvgdMWADAW95IEBc6R0kNLlul7i8027vLS_AaSBzr8OJuC75" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestMetadata/empty_key_fails.replay ================================================ { "Initial": "AQAAAA7hTghWJbsargAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": null } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestMetadata/non-utf8_metadata_key.replay ================================================ { "Initial": "AQAAAA7hTghYBx7x6gAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": null } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestMetadata/non-utf8_metadata_value.replay ================================================ { "Initial": "AQAAAA7hTghYBy/rxwAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": null } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestMetadata/valid_metadata.replay ================================================ { "Initial": "AQAAAA7hTghWJdbAzgAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "e05eb6961b1b1afe", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-metadata\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibWV0YWRhdGEiOnsia2V5X2EiOiJ2YWx1ZS1hIiwia2V5X2IiOiJ2YWx1ZS1iIiwia2V5X2MiOiJ2QWxVZS1jIn0sIm5hbWUiOiJibG9iLWZvci1tZXRhZGF0YSJ9Cg==", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "863" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:06 GMT" ], "Etag": [ "CMqsz/yerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwimxM53HdKMAFEprUthiOLkTU-UfDd0Fl-b54VEzXOBWuR1dmgkm6HJAoWdHhhiIXW" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItbWV0YWRhdGEvMTc3MzkzMjg4Njg3MzY3NCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1tZXRhZGF0YSIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLW1ldGFkYXRhP2dlbmVyYXRpb249MTc3MzkzMjg4Njg3MzY3NCZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItbWV0YWRhdGEiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzI4ODY4NzM2NzQiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNNcXN6L3llckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDYuODc2WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjA2Ljg3NloiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDYuODc2WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjA2Ljg3NloiLCJtZXRhZGF0YSI6eyJrZXlfYSI6InZhbHVlLWEiLCJrZXlfYiI6InZhbHVlLWIiLCJrZXlfYyI6InZBbFVlLWMifX0=" } }, { "ID": "01f7c922e422045c", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-metadata?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "863" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:06 GMT" ], "Etag": [ "CMqsz/yerJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwiTvqVegudek8KYOSGa5YEFkIIOXrYIXnLaUSmfHZNNnW7H24kSBXnMjy0LzLJFjoP" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItbWV0YWRhdGEvMTc3MzkzMjg4Njg3MzY3NCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1tZXRhZGF0YSIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLW1ldGFkYXRhP2dlbmVyYXRpb249MTc3MzkzMjg4Njg3MzY3NCZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItbWV0YWRhdGEiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzI4ODY4NzM2NzQiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNNcXN6L3llckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDYuODc2WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjA2Ljg3NloiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDYuODc2WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjA2Ljg3NloiLCJtZXRhZGF0YSI6eyJrZXlfYSI6InZhbHVlLWEiLCJrZXlfYiI6InZhbHVlLWIiLCJrZXlfYyI6InZBbFVlLWMifX0=" } }, { "ID": "b99f93b8d49bffdf", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-metadata?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:07 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwd5qE9k49xB_lc2PG0qZqlRfiMBtmMgPUwbdrZUReRsQTvnxjUfrtA4Xh3Qvzdd3IH" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestMetadata/valid_metadata_with_content_type.replay ================================================ { "Initial": "AQAAAA7hTghXGlDr8QAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "fd8647764f243501", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-metadata\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluIiwiY3JjMzJjIjoibW5HN1RBPT0iLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibWV0YWRhdGEiOnsiZm9vIjoiYmFyIn0sIm5hbWUiOiJibG9iLWZvci1tZXRhZGF0YSJ9Cg==", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "806" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:07 GMT" ], "Etag": [ "CK7h+fyerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxGqX0-fU9eT4jTiEVNBjxShVZ6afRxA6IYDSRH_GtmjrqSjGMkxTM46BajZ_I8U1E-" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItbWV0YWRhdGEvMTc3MzkzMjg4NzU2ODU1OCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1tZXRhZGF0YSIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLW1ldGFkYXRhP2dlbmVyYXRpb249MTc3MzkzMjg4NzU2ODU1OCZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItbWV0YWRhdGEiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzI4ODc1Njg1NTgiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNLN2grZnllckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDcuNTcwWiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjA3LjU3MFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDcuNTcwWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjA3LjU3MFoiLCJtZXRhZGF0YSI6eyJmb28iOiJiYXIifX0=" } }, { "ID": "b212f38f74f07600", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-metadata?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "806" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:07 GMT" ], "Etag": [ "CK7h+fyerJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxBRFdTLKcZ_UPKc_5q-RiIDP6BstASamk4I-EE1oP-OG7JIrq-UH2VsGw_MEmEzTYY" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItbWV0YWRhdGEvMTc3MzkzMjg4NzU2ODU1OCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1tZXRhZGF0YSIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLW1ldGFkYXRhP2dlbmVyYXRpb249MTc3MzkzMjg4NzU2ODU1OCZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItbWV0YWRhdGEiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzI4ODc1Njg1NTgiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNLN2grZnllckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDcuNTcwWiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjA3LjU3MFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDcuNTcwWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjA3LjU3MFoiLCJtZXRhZGF0YSI6eyJmb28iOiJiYXIifX0=" } }, { "ID": "c749019fc2970c9c", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-metadata?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:07 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyIAEOSmUANoFvdvrOhQSC6AKx2uHA_4JUigsxCvDO0UmtY6OhR0p_ilx-OzzVvpa0M" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestMetadata/valid_metadata_with_empty_body.replay ================================================ { "Initial": "AQAAAA7hTghXBSEr5AAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "900db741adbba762", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-metadata\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibWV0YWRhdGEiOnsiZm9vIjoiYmFyIn0sIm5hbWUiOiJibG9iLWZvci1tZXRhZGF0YSJ9Cg==", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "821" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:07 GMT" ], "Etag": [ "CNeZ5fyerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyHieRR1GjzPl99ZeeY82-BYazaBh_Cyat2Sp2n6kOjB5Fkn8l6xjkBOzxESakX0jcP" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItbWV0YWRhdGEvMTc3MzkzMjg4NzIzMTcwMyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1tZXRhZGF0YSIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLW1ldGFkYXRhP2dlbmVyYXRpb249MTc3MzkzMjg4NzIzMTcwMyZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItbWV0YWRhdGEiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzI4ODcyMzE3MDMiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNOZVo1ZnllckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDcuMjM2WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjA3LjIzNloiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDcuMjM2WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjA3LjIzNloiLCJtZXRhZGF0YSI6eyJmb28iOiJiYXIifX0=" } }, { "ID": "7cf8af48e341ca65", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-metadata?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "821" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:07 GMT" ], "Etag": [ "CNeZ5fyerJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWz29kcTJyFfgPopO-sR_SJ1kBN4-B861PxskZKuUvSjMAmwri5tynL-QBavwD_hb4T1" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItbWV0YWRhdGEvMTc3MzkzMjg4NzIzMTcwMyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1tZXRhZGF0YSIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLW1ldGFkYXRhP2dlbmVyYXRpb249MTc3MzkzMjg4NzIzMTcwMyZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItbWV0YWRhdGEiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzI4ODcyMzE3MDMiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNOZVo1ZnllckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDcuMjM2WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjA3LjIzNloiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDcuMjM2WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjA3LjIzNloiLCJtZXRhZGF0YSI6eyJmb28iOiJiYXIifX0=" } }, { "ID": "76a039cee1c31e5f", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-metadata?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:07 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzEXmL6bAME338eQN-Iu7NCfGTw99SIPGRt2DSWcD3dN9Dh_39G0wlMP7smRB5j82PP" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestMetadata/weird_metadata_keys.replay ================================================ { "Initial": "AQAAAA7hTghXLs0K1gAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "36167a094f4c0103", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-metadata\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoibW5HN1RBPT0iLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibWV0YWRhdGEiOnsiXHUwMDAwXHUwMDAxXHUwMDAyXHUwMDAzXHUwMDA0XHUwMDA1XHUwMDA2XHUwMDA3XGJcdFxuXHUwMDBiXGZcclx1MDAwZVx1MDAwZiI6Ilx1MDAwMFx1MDAwMVx1MDAwMlx1MDAwM1x1MDAwNFx1MDAwNVx1MDAwNlx1MDAwN1xiXHRcblx1MDAwYlxmXHJcdTAwMGVcdTAwMGYiLCJcdTAwMTBcdTAwMTFcdTAwMTJcdTAwMTNcdTAwMTRcdTAwMTVcdTAwMTZcdTAwMTdcdTAwMThcdTAwMTlcdTAwMWFcdTAwMWJcdTAwMWNcdTAwMWRcdTAwMWVcdTAwMWYiOiJcdTAwMTBcdTAwMTFcdTAwMTJcdTAwMTNcdTAwMTRcdTAwMTVcdTAwMTZcdTAwMTdcdTAwMThcdTAwMTlcdTAwMWFcdTAwMWJcdTAwMWNcdTAwMWRcdTAwMWVcdTAwMWYiLCIgIVwiIyQlXHUwMDI2JygpKissLS4vIjoiICFcIiMkJVx1MDAyNicoKSorLC0uLyIsIi4uL2Zvby8uLi9iYXIvLi4vLi4vYmF6Li4vIjoiLi4vZm9vLy4uL2Jhci8uLi8uLi9iYXouLi8iLCIuLlxcZm9vXFwuLlxcYmFyXFwuLlxcLi5cXGJhei4uXFwiOiIuLlxcZm9vXFwuLlxcYmFyXFwuLlxcLi5cXGJhei4uXFwiLCIuLlxcZm9vXFxcXGJhclxcXFxcXGJheiI6Ii4uXFxmb29cXFxcYmFyXFxcXFxcYmF6IiwiMTIzNDUiOiIxMjM0NSIsIjo7XHUwMDNjPVx1MDAzZT8iOiI6O1x1MDAzYz1cdTAwM2U/IiwiQCI6IkAiLCJbXFxdXl8iOiJbXFxdXl8iLCJgIjoiYCIsImZvbyBiYXIgYmF6IjoiZm9vIGJhciBiYXoiLCJmb29cImJhclwiYmF6IjoiZm9vXCJiYXJcImJheiIsImZvby8vYmFyLy8vYmF6IjoiZm9vLy9iYXIvLy9iYXoiLCJmb28vYmFyL2JheiI6ImZvby9iYXIvYmF6IiwiZm9vXFxiYXJcXGJheiI6ImZvb1xcYmFyXFxiYXoiLCJ7fH1+fyI6Int8fX5/Iiwi4pi64pi64pi6Ijoi4pi64pi64pi6In0sIm5hbWUiOiJibG9iLWZvci1tZXRhZGF0YSJ9Cg==", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "1679" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:07 GMT" ], "Etag": [ "CP/Dj/2erJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxKr81cW_g4-K_7lBOz5VyYKBL5KG_cWFc5Gbqt1JOvZp_nI-LtS8X7erEGgKc0bFbZ" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItbWV0YWRhdGEvMTc3MzkzMjg4NzkyNTI0NyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1tZXRhZGF0YSIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLW1ldGFkYXRhP2dlbmVyYXRpb249MTc3MzkzMjg4NzkyNTI0NyZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItbWV0YWRhdGEiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzI4ODc5MjUyNDciLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNQL0RqLzJlckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDcuOTI3WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjA3LjkyN1oiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDcuOTI3WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjA3LjkyN1oiLCJtZXRhZGF0YSI6eyIuLi9mb28vLi4vYmFyLy4uLy4uL2Jhei4uLyI6Ii4uL2Zvby8uLi9iYXIvLi4vLi4vYmF6Li4vIiwiICFcIiMkJSYnKCkqKywtLi8iOiIgIVwiIyQlJicoKSorLC0uLyIsInt8fX5cdTAwN2YiOiJ7fH1+XHUwMDdmIiwi4pi64pi64pi6Ijoi4pi64pi64pi6IiwiLi5cXGZvb1xcXFxiYXJcXFxcXFxiYXoiOiIuLlxcZm9vXFxcXGJhclxcXFxcXGJheiIsIjEyMzQ1IjoiMTIzNDUiLCJAIjoiQCIsImZvbyBiYXIgYmF6IjoiZm9vIGJhciBiYXoiLCJbXFxdXl8iOiJbXFxdXl8iLCI6O1x1MDAzYz1cdTAwM2U/IjoiOjtcdTAwM2M9XHUwMDNlPyIsIlx1MDAwMFx1MDAwMVx1MDAwMlx1MDAwM1x1MDAwNFx1MDAwNVx1MDAwNlx1MDAwN1xiXHRcblx1MDAwYlxmXHJcdTAwMGVcdTAwMGYiOiJcdTAwMDBcdTAwMDFcdTAwMDJcdTAwMDNcdTAwMDRcdTAwMDVcdTAwMDZcdTAwMDdcYlx0XG5cdTAwMGJcZlxyXHUwMDBlXHUwMDBmIiwiXHUwMDEwXHUwMDExXHUwMDEyXHUwMDEzXHUwMDE0XHUwMDE1XHUwMDE2XHUwMDE3XHUwMDE4XHUwMDE5XHUwMDFhXHUwMDFiXHUwMDFjXHUwMDFkXHUwMDFlXHUwMDFmIjoiXHUwMDEwXHUwMDExXHUwMDEyXHUwMDEzXHUwMDE0XHUwMDE1XHUwMDE2XHUwMDE3XHUwMDE4XHUwMDE5XHUwMDFhXHUwMDFiXHUwMDFjXHUwMDFkXHUwMDFlXHUwMDFmIiwiLi5cXGZvb1xcLi5cXGJhclxcLi5cXC4uXFxiYXouLlxcIjoiLi5cXGZvb1xcLi5cXGJhclxcLi5cXC4uXFxiYXouLlxcIiwiZm9vXFxiYXJcXGJheiI6ImZvb1xcYmFyXFxiYXoiLCJgIjoiYCIsImZvby9iYXIvYmF6IjoiZm9vL2Jhci9iYXoiLCJmb29cImJhclwiYmF6IjoiZm9vXCJiYXJcImJheiIsImZvby8vYmFyLy8vYmF6IjoiZm9vLy9iYXIvLy9iYXoifX0=" } }, { "ID": "10c268f29aa1f605", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-metadata?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "1679" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:07 GMT" ], "Etag": [ "CP/Dj/2erJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWy8DmASVC1Frf2eOyNk-tFUOCGkikYdcU26qDNy_sMCbvg4NLcQqkiWlnaiW8PicuLx" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItbWV0YWRhdGEvMTc3MzkzMjg4NzkyNTI0NyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1tZXRhZGF0YSIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLW1ldGFkYXRhP2dlbmVyYXRpb249MTc3MzkzMjg4NzkyNTI0NyZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItbWV0YWRhdGEiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzI4ODc5MjUyNDciLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiI1IiwibWQ1SGFzaCI6IlhVRkFLcnhMS25hNWNaMlJFQmZGa2c9PSIsImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNQL0RqLzJlckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDcuOTI3WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjA3LjkyN1oiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDcuOTI3WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjA3LjkyN1oiLCJtZXRhZGF0YSI6eyIuLi9mb28vLi4vYmFyLy4uLy4uL2Jhei4uLyI6Ii4uL2Zvby8uLi9iYXIvLi4vLi4vYmF6Li4vIiwiICFcIiMkJSYnKCkqKywtLi8iOiIgIVwiIyQlJicoKSorLC0uLyIsInt8fX5cdTAwN2YiOiJ7fH1+XHUwMDdmIiwi4pi64pi64pi6Ijoi4pi64pi64pi6IiwiLi5cXGZvb1xcXFxiYXJcXFxcXFxiYXoiOiIuLlxcZm9vXFxcXGJhclxcXFxcXGJheiIsIjEyMzQ1IjoiMTIzNDUiLCJAIjoiQCIsImZvbyBiYXIgYmF6IjoiZm9vIGJhciBiYXoiLCJbXFxdXl8iOiJbXFxdXl8iLCI6O1x1MDAzYz1cdTAwM2U/IjoiOjtcdTAwM2M9XHUwMDNlPyIsIlx1MDAwMFx1MDAwMVx1MDAwMlx1MDAwM1x1MDAwNFx1MDAwNVx1MDAwNlx1MDAwN1xiXHRcblx1MDAwYlxmXHJcdTAwMGVcdTAwMGYiOiJcdTAwMDBcdTAwMDFcdTAwMDJcdTAwMDNcdTAwMDRcdTAwMDVcdTAwMDZcdTAwMDdcYlx0XG5cdTAwMGJcZlxyXHUwMDBlXHUwMDBmIiwiXHUwMDEwXHUwMDExXHUwMDEyXHUwMDEzXHUwMDE0XHUwMDE1XHUwMDE2XHUwMDE3XHUwMDE4XHUwMDE5XHUwMDFhXHUwMDFiXHUwMDFjXHUwMDFkXHUwMDFlXHUwMDFmIjoiXHUwMDEwXHUwMDExXHUwMDEyXHUwMDEzXHUwMDE0XHUwMDE1XHUwMDE2XHUwMDE3XHUwMDE4XHUwMDE5XHUwMDFhXHUwMDFiXHUwMDFjXHUwMDFkXHUwMDFlXHUwMDFmIiwiLi5cXGZvb1xcLi5cXGJhclxcLi5cXC4uXFxiYXouLlxcIjoiLi5cXGZvb1xcLi5cXGJhclxcLi5cXC4uXFxiYXouLlxcIiwiZm9vXFxiYXJcXGJheiI6ImZvb1xcYmFyXFxiYXoiLCJgIjoiYCIsImZvby9iYXIvYmF6IjoiZm9vL2Jhci9iYXoiLCJmb29cImJhclwiYmF6IjoiZm9vXCJiYXJcImJheiIsImZvby8vYmFyLy8vYmF6IjoiZm9vLy9iYXIvLy9iYXoifX0=" } }, { "ID": "27fba5e39c47cd4b", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-metadata?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:08 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWweQL9h1tPvAagldtq4KNlTqN2D3HmpuEZjaayyTBCwxNU2gn3sLmYtZo_I4LgSl-GM" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestNonexistentBucket.replay ================================================ { "Initial": "AQAAAA7hTghCHqCu0wAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "5c9154fa47c0c00e", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/bucket-does-not-exist/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1\u0026pageToken=\u0026prefix=\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "446" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:47 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxEAFEYqQ2LNgbmzgzk_vlunc7g4e2tewAKg9-GvZR60B9E7yn2i6A6Hs_7xzDwHa21" ] }, "Body": "eyJlcnJvciI6eyJjb2RlIjo0MDMsIm1lc3NhZ2UiOiJydmFuZ2VudEBnb29nbGUuY29tIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmxpc3QgYWNjZXNzIHRvIHRoZSBHb29nbGUgQ2xvdWQgU3RvcmFnZSBidWNrZXQuIFBlcm1pc3Npb24gJ3N0b3JhZ2Uub2JqZWN0cy5saXN0JyBkZW5pZWQgb24gcmVzb3VyY2UgKG9yIGl0IG1heSBub3QgZXhpc3QpLiIsImVycm9ycyI6W3sibWVzc2FnZSI6InJ2YW5nZW50QGdvb2dsZS5jb20gZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMubGlzdCBhY2Nlc3MgdG8gdGhlIEdvb2dsZSBDbG91ZCBTdG9yYWdlIGJ1Y2tldC4gUGVybWlzc2lvbiAnc3RvcmFnZS5vYmplY3RzLmxpc3QnIGRlbmllZCBvbiByZXNvdXJjZSAob3IgaXQgbWF5IG5vdCBleGlzdCkuIiwiZG9tYWluIjoiZ2xvYmFsIiwicmVhc29uIjoiZm9yYmlkZGVuIn1dfX0=" } }, { "ID": "937f8d1018cac416", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026delimiter=\u0026endOffset=\u0026includeFoldersAsPrefixes=false\u0026includeTrailingDelimiter=false\u0026matchGlob=\u0026maxResults=1\u0026pageToken=\u0026prefix=\u0026prettyPrint=false\u0026projection=full\u0026startOffset=\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "1019" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:47 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxoTo-n93Jj6_ZeEuLaNRtBq6L5NqmeAxH1vVuPATT3qRZGj5R52rpC-8JOE6baztrh" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNoVmliRzlpTFdadmNpMWpiM0I1YVc1bkxXUmxjM1E9IiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1jb3B5aW5nLWRlc3QvMTc2NDYxODA2ODkxMjIzNiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1jb3B5aW5nLWRlc3QiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1jb3B5aW5nLWRlc3Q/Z2VuZXJhdGlvbj0xNzY0NjE4MDY4OTEyMjM2JmFsdD1tZWRpYSIsIm5hbWUiOiJibG9iLWZvci1jb3B5aW5nLWRlc3QiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NjQ2MTgwNjg5MTIyMzYiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiIxMSIsIm1kNUhhc2giOiJzUXFOc1dUZ2RVRUZ0Nm1iNXk0LzVRPT0iLCJjb250ZW50RW5jb2RpbmciOiJpZGVudGl0eSIsImNvbnRlbnREaXNwb3NpdGlvbiI6ImlubGluZSIsImNvbnRlbnRMYW5ndWFnZSI6ImVuIiwiY2FjaGVDb250cm9sIjoibm8tY2FjaGUiLCJjcmMzMmMiOiJhUjJxTHc9PSIsImV0YWciOiJDT3pRcGNtU25aRURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQxOjA4LjkxOVoiLCJ1cGRhdGVkIjoiMjAyNS0xMi0wMVQxOTo0MTowOC45MTlaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI1LTEyLTAxVDE5OjQxOjA4LjkxOVoiLCJ0aW1lRmluYWxpemVkIjoiMjAyNS0xMi0wMVQxOTo0MTowOC45MTlaIiwibWV0YWRhdGEiOnsiZm9vIjoiYmFyIn19XX0=" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestRead/length_0_read.replay ================================================ { "Initial": "AQAAAA7hTghLKCIm8wAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "2606b2d7efccfe75", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-reading\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoiTW9WbTZRPT0iLCJtZDVIYXNoIjoiUGZsc1dyNlg4cFo5T0FFSWNBTUtYdz09IiwibmFtZSI6ImJsb2ItZm9yLXJlYWRpbmcifQo=", "YWJjZGVmZ2hpamtsbW5vcHF1cnN0dXZ3eHl6" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "793" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:55 GMT" ], "Etag": [ "CISprPeerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwk2HpRMTHsiU-6JhZw4lOXpTvZxAHzp7C2X-scVxemRoPJoJ5G0dVZfq0z3176sRRM" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItcmVhZGluZy8xNzczOTMyODc1ODE0MDIwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLXJlYWRpbmciLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1yZWFkaW5nP2dlbmVyYXRpb249MTc3MzkzMjg3NTgxNDAyMCZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItcmVhZGluZyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjg3NTgxNDAyMCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjI3IiwibWQ1SGFzaCI6IlBmbHNXcjZYOHBaOU9BRUljQU1LWHc9PSIsImNyYzMyYyI6Ik1vVm02UT09IiwiZXRhZyI6IkNJU3ByUGVlckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDc6NTUuODE2WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA3OjU1LjgxNloiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDc6NTUuODE2WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA3OjU1LjgxNloifQ==" } }, { "ID": "c6201f652faac5d7", "Request": { "Method": "HEAD", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:55 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:07:55 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932875814020" ], "X-Goog-Hash": [ "crc32c=MoVm6Q==", "md5=PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "27" ], "X-Guploader-Uploadid": [ "AGQBYWwi06akhH3XzYX49bZ-GsuaMqaiM4c_h95vjnweirgQ_ljz1-tTRyjXfgLTqFcj84pk" ] }, "Body": "" } }, { "ID": "be298a6e5862aff3", "Request": { "Method": "HEAD", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:55 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:07:55 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932875814020" ], "X-Goog-Hash": [ "crc32c=MoVm6Q==", "md5=PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "27" ], "X-Guploader-Uploadid": [ "AGQBYWw4xM1J8hG6j_G3P2qpmes64paqrbVXTedKAaDkvcA8G-7JNNkeIlb_FGWmkFyoW8Ly" ] }, "Body": "" } }, { "ID": "fe3b548e010b079e", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-reading?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:07:56 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxJrY06bJOGMQ2T1oTN-ATG1hEi7IMHmfjhqZlilZj1xP34HLPSDJV75zko2mezFKdE" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestRead/negative_offset_fails.replay ================================================ { "Initial": "AQAAAA7hTghLKBMCswAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": null } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestRead/read_a_part_in_middle.replay ================================================ { "Initial": "AQAAAA7hTghML9IPRQAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "39558c493552dd0c", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-reading\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoiTW9WbTZRPT0iLCJtZDVIYXNoIjoiUGZsc1dyNlg4cFo5T0FFSWNBTUtYdz09IiwibmFtZSI6ImJsb2ItZm9yLXJlYWRpbmcifQo=", "YWJjZGVmZ2hpamtsbW5vcHF1cnN0dXZ3eHl6" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "793" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:56 GMT" ], "Etag": [ "CMOJ8feerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxj9_GunpMi5IaNmMSUssQ4-8FMUZr2D2qraP7f0-TAbwgNhUaiPOkpIbHtWfXVDuBj" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItcmVhZGluZy8xNzczOTMyODc2OTQwNDgzIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLXJlYWRpbmciLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1yZWFkaW5nP2dlbmVyYXRpb249MTc3MzkzMjg3Njk0MDQ4MyZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItcmVhZGluZyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjg3Njk0MDQ4MyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjI3IiwibWQ1SGFzaCI6IlBmbHNXcjZYOHBaOU9BRUljQU1LWHc9PSIsImNyYzMyYyI6Ik1vVm02UT09IiwiZXRhZyI6IkNNT0o4ZmVlckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDc6NTYuOTQzWiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA3OjU2Ljk0M1oiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDc6NTYuOTQzWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA3OjU2Ljk0M1oifQ==" } }, { "ID": "e57712205af716de", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "Range": [ "bytes=10-14" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Range": [ "bytes 10-14/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:57 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:07:56 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932876940483" ], "X-Goog-Hash": [ "crc32c=MoVm6Q==", "md5=PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "27" ], "X-Guploader-Uploadid": [ "AGQBYWyvDsAMLt3e-za5KLNkNNWav8OYGtI8CCS6gKP-O-e5w68GbWmbs2Skuv0o6kFC6V0R" ] }, "Body": "a2xtbm8=" } }, { "ID": "ffb7d8def959a036", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "Range": [ "bytes=10-14" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Range": [ "bytes 10-14/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:57 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:07:56 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932876940483" ], "X-Goog-Hash": [ "crc32c=MoVm6Q==", "md5=PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "27" ], "X-Guploader-Uploadid": [ "AGQBYWxhcAnVW7PaVFd7iUiQQcVVsev0Tu_tYoLe4D6U8Zy0yuzikzZItxpbETReSRvaX-P3" ] }, "Body": "a2xtbm8=" } }, { "ID": "9b8dcfd419cfa9c3", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "Range": [ "bytes=14-14" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "1" ], "Content-Range": [ "bytes 14-14/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:57 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:07:56 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932876940483" ], "X-Goog-Hash": [ "crc32c=MoVm6Q==", "md5=PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "27" ], "X-Guploader-Uploadid": [ "AGQBYWyF2hKlZVO2Re1Vhcfk23V6N5IXcCww7ZcMayPnTxFJgWuBJMZoKeaN9AwcBEj1ETf-" ] }, "Body": "bw==" } }, { "ID": "dd39aff7511a408f", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "Range": [ "bytes=14-14" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "1" ], "Content-Range": [ "bytes 14-14/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:57 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:07:56 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932876940483" ], "X-Goog-Hash": [ "crc32c=MoVm6Q==", "md5=PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "27" ], "X-Guploader-Uploadid": [ "AGQBYWx_6ZUfpX8Y2iIpBjLvCEIJ8Uk-fhtIEo84DmKr2BE-pFI0ebGUYAVuz-IE3gWx6e3R" ] }, "Body": "bw==" } }, { "ID": "b167acc21761ab4d", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "Range": [ "bytes=12-14" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "3" ], "Content-Range": [ "bytes 12-14/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:57 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:07:56 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932876940483" ], "X-Goog-Hash": [ "crc32c=MoVm6Q==", "md5=PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "27" ], "X-Guploader-Uploadid": [ "AGQBYWzvHkcDF6-3m2Gqvk01gJhfUrvbIICabQaCuodVHqRZysVtPqlnaTIyfaRyDVpnv6gd" ] }, "Body": "bW5v" } }, { "ID": "872045415c07f0de", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-reading?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:07:57 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwx9YxOlUWBSe7o3HQA_io6KGtpB2N_YPwu2Yq5fAW6ascjZCBou4rxmxvyZ3ViS-PI" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestRead/read_from_positive_offset_to_end.replay ================================================ { "Initial": "AQAAAA7hTghMBkIhXgAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "4ccf276c0d5829b0", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-reading\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoiTW9WbTZRPT0iLCJtZDVIYXNoIjoiUGZsc1dyNlg4cFo5T0FFSWNBTUtYdz09IiwibmFtZSI6ImJsb2ItZm9yLXJlYWRpbmcifQo=", "YWJjZGVmZ2hpamtsbW5vcHF1cnN0dXZ3eHl6" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "793" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:56 GMT" ], "Etag": [ "CKiqyPeerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwTK757EnhhJA4wrRRBPA-e-RfpoMYDbm1x50krhpo1StfRVtX9XRqiIy-w_9TBmszQ" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItcmVhZGluZy8xNzczOTMyODc2MjcyOTM2Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLXJlYWRpbmciLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1yZWFkaW5nP2dlbmVyYXRpb249MTc3MzkzMjg3NjI3MjkzNiZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItcmVhZGluZyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjg3NjI3MjkzNiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjI3IiwibWQ1SGFzaCI6IlBmbHNXcjZYOHBaOU9BRUljQU1LWHc9PSIsImNyYzMyYyI6Ik1vVm02UT09IiwiZXRhZyI6IkNLaXF5UGVlckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDc6NTYuMjc1WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA3OjU2LjI3NVoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDc6NTYuMjc1WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA3OjU2LjI3NVoifQ==" } }, { "ID": "44b6c8e2f16d8db1", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "Range": [ "bytes=10-" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "17" ], "Content-Range": [ "bytes 10-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:56 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:07:56 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932876272936" ], "X-Goog-Hash": [ "crc32c=MoVm6Q==", "md5=PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "27" ], "X-Guploader-Uploadid": [ "AGQBYWwnkaduEClf5uPJvA9_kpalU3ac1TBa2nrUK9OHC-2ui9Ajcl1zWwrMtm5kw8bmlAD0" ] }, "Body": "a2xtbm9wcXVyc3R1dnd4eXo=" } }, { "ID": "c63df22470e7e95f", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "Range": [ "bytes=10-" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "17" ], "Content-Range": [ "bytes 10-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:56 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:07:56 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932876272936" ], "X-Goog-Hash": [ "crc32c=MoVm6Q==", "md5=PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "27" ], "X-Guploader-Uploadid": [ "AGQBYWxmuZ4RqxFcPWIk-6ScmldpdoTi2I7krG9WGekZfQ7WnUFFp42hRsGkOkpfSCtvOZED" ] }, "Body": "a2xtbm9wcXVyc3R1dnd4eXo=" } }, { "ID": "54e0dbf7016db2b3", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "Range": [ "bytes=22-" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Range": [ "bytes 22-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:56 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:07:56 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932876272936" ], "X-Goog-Hash": [ "crc32c=MoVm6Q==", "md5=PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "27" ], "X-Guploader-Uploadid": [ "AGQBYWyb0OliUhdiR0X5cTQvmljh57FRdm33FN12DVDsT45uQ1wh-ikcGGkilEsdma47otbf" ] }, "Body": "dnd4eXo=" } }, { "ID": "3f0fbd675c9e860c", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "Range": [ "bytes=22-" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "5" ], "Content-Range": [ "bytes 22-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:56 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:07:56 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932876272936" ], "X-Goog-Hash": [ "crc32c=MoVm6Q==", "md5=PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "27" ], "X-Guploader-Uploadid": [ "AGQBYWwcgRvY_NT7PZU5-BHnTYE5C7dWwBFRMk1urV_NV_3rvifvwKILGphA3xBBRZlyQs8W" ] }, "Body": "dnd4eXo=" } }, { "ID": "f93785e168e59efb", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "Range": [ "bytes=16-" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "11" ], "Content-Range": [ "bytes 16-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:56 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:07:56 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932876272936" ], "X-Goog-Hash": [ "crc32c=MoVm6Q==", "md5=PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "27" ], "X-Guploader-Uploadid": [ "AGQBYWwckxfM8UI1SB_xPS47uoEfoiiF-jwVBqUlJZ7O-1wKGFcVbTpyS6GFQYLmzZVfgOU8" ] }, "Body": "cXVyc3R1dnd4eXo=" } }, { "ID": "944f7264fb48f351", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-reading?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:07:56 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzCbZaRkUMNmOA4Ew2YzAmDn5ktPqkVx6dK_GmwMW3EXwdo3VkbZP_T4GnSQ9bCZHo9" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestRead/read_in_full.replay ================================================ { "Initial": "AQAAAA7hTghNHoK5+QAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "325d9ca4d4a7ccba", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-reading\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoiTW9WbTZRPT0iLCJtZDVIYXNoIjoiUGZsc1dyNlg4cFo5T0FFSWNBTUtYdz09IiwibmFtZSI6ImJsb2ItZm9yLXJlYWRpbmcifQo=", "YWJjZGVmZ2hpamtsbW5vcHF1cnN0dXZ3eHl6" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "793" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:57 GMT" ], "Etag": [ "CJ2MnvierJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwU1VyXLMVkbx-3tstvJfdNRfUnR1LwLZ18HSoFVoUJD8jcH1AKb1TyisPPOAz3gh-q" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItcmVhZGluZy8xNzczOTMyODc3Njc4MTA5Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLXJlYWRpbmciLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1yZWFkaW5nP2dlbmVyYXRpb249MTc3MzkzMjg3NzY3ODEwOSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItcmVhZGluZyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjg3NzY3ODEwOSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjI3IiwibWQ1SGFzaCI6IlBmbHNXcjZYOHBaOU9BRUljQU1LWHc9PSIsImNyYzMyYyI6Ik1vVm02UT09IiwiZXRhZyI6IkNKMk1udmllckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDc6NTcuNjgwWiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA3OjU3LjY4MFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDc6NTcuNjgwWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA3OjU3LjY4MFoifQ==" } }, { "ID": "c962566e216ea452", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:57 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:07:57 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932877678109" ], "X-Goog-Hash": [ "crc32c=MoVm6Q==", "md5=PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "27" ], "X-Guploader-Uploadid": [ "AGQBYWxVv25F6howt4w3acoTw1zdGtoEtfgyAcSUqYJsBeYIcSa7xl-sox6BJpMEWefKV6MH" ] }, "Body": "YWJjZGVmZ2hpamtsbW5vcHF1cnN0dXZ3eHl6" } }, { "ID": "0a0d66b782754f2c", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:57 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:07:57 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932877678109" ], "X-Goog-Hash": [ "crc32c=MoVm6Q==", "md5=PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "27" ], "X-Guploader-Uploadid": [ "AGQBYWw07jE6axGr9cDuymp7iCGxM7JLhZbH6a6qUqv0jjC29edviLcg9XN_RXMrVcUgUd2j" ] }, "Body": "YWJjZGVmZ2hpamtsbW5vcHF1cnN0dXZ3eHl6" } }, { "ID": "d7203a1e678f37a5", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "Range": [ "bytes=18-" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "9" ], "Content-Range": [ "bytes 18-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:57 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:07:57 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932877678109" ], "X-Goog-Hash": [ "crc32c=MoVm6Q==", "md5=PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "27" ], "X-Guploader-Uploadid": [ "AGQBYWxhBkDv1Y5_JKrqZEqv5nHglZ31Z3SArbO9llyzZr2brRfVOm4lTccXGG6BAE0CtwOx" ] }, "Body": "cnN0dXZ3eHl6" } }, { "ID": "38de339facd07623", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "Range": [ "bytes=18-" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "9" ], "Content-Range": [ "bytes 18-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:57 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:07:57 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932877678109" ], "X-Goog-Hash": [ "crc32c=MoVm6Q==", "md5=PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "27" ], "X-Guploader-Uploadid": [ "AGQBYWyE-BEMRxglhQnZwTQixbVcFkV_b7lPnq9HbyjSmMaVTZa8YIHMs8IZ-Df3dQllhI0M" ] }, "Body": "cnN0dXZ3eHl6" } }, { "ID": "09ec9fddd830beb1", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "Range": [ "bytes=9-" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "18" ], "Content-Range": [ "bytes 9-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:58 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:07:57 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932877678109" ], "X-Goog-Hash": [ "crc32c=MoVm6Q==", "md5=PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "27" ], "X-Guploader-Uploadid": [ "AGQBYWzPI5g8670Ed4DnkSz4ouGn4innpQWX6npTWSEM08QZYLJztr96CI72dTmTTR-2x6pV" ] }, "Body": "amtsbW5vcHF1cnN0dXZ3eHl6" } }, { "ID": "a1cd38ad87404319", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-reading?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 429, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "555" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:58 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxjNnfgWPQK4gYkRN2lA2ONqy66lL3jWRO8pzNvlZs0CuwBqSpcqiZ-0fusLptWWtsU" ] }, "Body": "eyJlcnJvciI6eyJjb2RlIjo0MjksIm1lc3NhZ2UiOiJUaGUgb2JqZWN0IGdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItcmVhZGluZyBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3Igb2JqZWN0IG11dGF0aW9uIG9wZXJhdGlvbnMgKGNyZWF0ZSwgdXBkYXRlLCBhbmQgZGVsZXRlKS4gUGxlYXNlIHJlZHVjZSB5b3VyIHJlcXVlc3QgcmF0ZS4gU2VlIGh0dHBzOi8vY2xvdWQuZ29vZ2xlLmNvbS9zdG9yYWdlL2RvY3MvZ2NzNDI5LiIsImVycm9ycyI6W3sibWVzc2FnZSI6IlRoZSBvYmplY3QgZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1yZWFkaW5nIGV4Y2VlZGVkIHRoZSByYXRlIGxpbWl0IGZvciBvYmplY3QgbXV0YXRpb24gb3BlcmF0aW9ucyAoY3JlYXRlLCB1cGRhdGUsIGFuZCBkZWxldGUpLiBQbGVhc2UgcmVkdWNlIHlvdXIgcmVxdWVzdCByYXRlLiBTZWUgaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL3N0b3JhZ2UvZG9jcy9nY3M0MjkuIiwiZG9tYWluIjoidXNhZ2VMaW1pdHMiLCJyZWFzb24iOiJyYXRlTGltaXRFeGNlZWRlZCJ9XX19" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestRead/read_in_full_with_negative_length_not_-1.replay ================================================ { "Initial": "AQAAAA7hTgiZJ8TNWAAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "08f92e86f47a74f4", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-reading\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoiTW9WbTZRPT0iLCJtZDVIYXNoIjoiUGZsc1dyNlg4cFo5T0FFSWNBTUtYdz09IiwibmFtZSI6ImJsb2ItZm9yLXJlYWRpbmcifQo=", "YWJjZGVmZ2hpamtsbW5vcHF1cnN0dXZ3eHl6" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "793" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:09:14 GMT" ], "Etag": [ "CPGU25yfrJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyHfYf2EccaH7lKhoRMAxPku-5ky8U654lAnoALpUvI_YS7XNq_18X7gQbQ2Y034IPd" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItcmVhZGluZy8xNzczOTMyOTU0MTc2MTEzIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLXJlYWRpbmciLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1yZWFkaW5nP2dlbmVyYXRpb249MTc3MzkzMjk1NDE3NjExMyZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItcmVhZGluZyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjk1NDE3NjExMyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjI3IiwibWQ1SGFzaCI6IlBmbHNXcjZYOHBaOU9BRUljQU1LWHc9PSIsImNyYzMyYyI6Ik1vVm02UT09IiwiZXRhZyI6IkNQR1UyNXlmckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDk6MTQuMTg1WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA5OjE0LjE4NVoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDk6MTQuMTg1WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA5OjE0LjE4NVoifQ==" } }, { "ID": "34ec58f354cb10a6", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:09:14 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:09:14 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932954176113" ], "X-Goog-Hash": [ "crc32c=MoVm6Q==", "md5=PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "27" ], "X-Guploader-Uploadid": [ "AGQBYWxU236Dhagq6VFGtcqkYS5ZDWgv2p_Oj9NDkDXQEFj2QgApoNdBcqcZ8keWl4rkykAE" ] }, "Body": "YWJjZGVmZ2hpamtsbW5vcHF1cnN0dXZ3eHl6" } }, { "ID": "0f78c9353d86ee46", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:09:14 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:09:14 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932954176113" ], "X-Goog-Hash": [ "crc32c=MoVm6Q==", "md5=PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "27" ], "X-Guploader-Uploadid": [ "AGQBYWzumE9HR6WJ4OH1fn-Aa8PbEFKH65U7UFewEfUAUZlcbrxTsiIBfr9wc9RVWPhYWRcJ" ] }, "Body": "YWJjZGVmZ2hpamtsbW5vcHF1cnN0dXZ3eHl6" } }, { "ID": "eda1724c568f8c05", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "Range": [ "bytes=18-" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "9" ], "Content-Range": [ "bytes 18-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:09:14 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:09:14 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932954176113" ], "X-Goog-Hash": [ "crc32c=MoVm6Q==", "md5=PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "27" ], "X-Guploader-Uploadid": [ "AGQBYWy93y7oL5p0H5H1FTVyrhmksvvZeyKq4fjsu-D2ZpScjo_Uj4yxs1E012Yoyc6O2P_l" ] }, "Body": "cnN0dXZ3eHl6" } }, { "ID": "2c128ea90ba6b303", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "Range": [ "bytes=18-" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "9" ], "Content-Range": [ "bytes 18-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:09:14 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:09:14 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932954176113" ], "X-Goog-Hash": [ "crc32c=MoVm6Q==", "md5=PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "27" ], "X-Guploader-Uploadid": [ "AGQBYWxwFCVUMxAhFVRN3HY12IJIlHbYyIgW7uLPoeSGcDIfvcMkxYwW-UfRiZEXgaUqJrgg" ] }, "Body": "cnN0dXZ3eHl6" } }, { "ID": "fd96f0fe643414fb", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "Range": [ "bytes=9-" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "18" ], "Content-Range": [ "bytes 9-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:09:14 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:09:14 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932954176113" ], "X-Goog-Hash": [ "crc32c=MoVm6Q==", "md5=PflsWr6X8pZ9OAEIcAMKXw==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "27" ], "X-Guploader-Uploadid": [ "AGQBYWxB5W8cyRCKr2KbTPX-tDvLLHGEhAdvvlkjC8IfG9U3OsKNgybagedqvQnFmYHYJ7OH" ] }, "Body": "amtsbW5vcHF1cnN0dXZ3eHl6" } }, { "ID": "d488e3656d7ef9f5", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-reading?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:09:14 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWw4mDLJ10W64QsWiLPRHXdyktHcbH-19L5kLgmYTvkWAWSA0jLC25cG-xzUjZc0a3Nn" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestRead/read_of_nonexistent_key_fails.replay ================================================ { "Initial": "AQAAAA7hTghLEiQshAAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "dd83ffb74268feea", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-reading\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoiTW9WbTZRPT0iLCJtZDVIYXNoIjoiUGZsc1dyNlg4cFo5T0FFSWNBTUtYdz09IiwibmFtZSI6ImJsb2ItZm9yLXJlYWRpbmcifQo=", "YWJjZGVmZ2hpamtsbW5vcHF1cnN0dXZ3eHl6" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "793" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:55 GMT" ], "Etag": [ "CLajlveerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxdnPJMROugLcHhLynC60nKLbxpe5RUA9qTNha51uUNOSePNeqG5bqs0_3r_fyRwV0o" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItcmVhZGluZy8xNzczOTMyODc1NDUyODU0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLXJlYWRpbmciLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1yZWFkaW5nP2dlbmVyYXRpb249MTc3MzkzMjg3NTQ1Mjg1NCZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItcmVhZGluZyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjg3NTQ1Mjg1NCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjI3IiwibWQ1SGFzaCI6IlBmbHNXcjZYOHBaOU9BRUljQU1LWHc9PSIsImNyYzMyYyI6Ik1vVm02UT09IiwiZXRhZyI6IkNMYWpsdmVlckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDc6NTUuNDU2WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA3OjU1LjQ1NloiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDc6NTUuNDU2WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA3OjU1LjQ1NloifQ==" } }, { "ID": "7790e3042c50cefd", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/key-does-not-exist", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "206" ], "Content-Type": [ "application/xml; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:07:55 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "X-Guploader-Uploadid": [ "AGQBYWyZLT9t0ks4Aq-353gAk5kHvQYEwG-iibR67LTF6OvGtc_FJ1c1RJhf5-Nss9csg9Ut" ] }, "Body": "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+Tm9TdWNoS2V5PC9Db2RlPjxNZXNzYWdlPlRoZSBzcGVjaWZpZWQga2V5IGRvZXMgbm90IGV4aXN0LjwvTWVzc2FnZT48RGV0YWlscz5ObyBzdWNoIG9iamVjdDogZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9rZXktZG9lcy1ub3QtZXhpc3Q8L0RldGFpbHM+PC9FcnJvcj4=" } }, { "ID": "dc9ac7e4facea50b", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-reading?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:07:55 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxh1hS4u_8euIZOnnwGz0gZyb-X35zNFEemoETsArYksWbMaiUTkYy8I8yoy9PZfJQt" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestSignedURL.replay ================================================ { "Initial": "AQAAAA7hTgxuOM9ZiwAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "7f1f8510bce38399", "Request": { "Method": "PUT", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-signing?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "11" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "aGVsbG8gd29ybGQ=" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "355" ], "Content-Type": [ "application/xml; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:35 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzN7IBRMOXTc9LcbS5OkMYZoj8bVUzuJz_O6tKL8hFODOzBeIQXm1WG1ggnHNUUYg4j" ] }, "Body": "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+U2lnbmF0dXJlRG9lc05vdE1hdGNoPC9Db2RlPjxNZXNzYWdlPkFjY2VzcyBkZW5pZWQuPC9NZXNzYWdlPjxEZXRhaWxzPlRoZSByZXF1ZXN0IHNpZ25hdHVyZSB3ZSBjYWxjdWxhdGVkIGRvZXMgbm90IG1hdGNoIHRoZSBzaWduYXR1cmUgeW91IHByb3ZpZGVkLiBDaGVjayB5b3VyIEdvb2dsZSBzZWNyZXQga2V5IGFuZCBzaWduaW5nIG1ldGhvZC48L0RldGFpbHM+PFN0cmluZ1RvU2lnbj5QVVQKCgoxNzczOTM3NTM1Ci9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2Jsb2ItZm9yLXNpZ25pbmc8L1N0cmluZ1RvU2lnbj48L0Vycm9yPg==" } }, { "ID": "635242fad75364c9", "Request": { "Method": "PUT", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-signing?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "11" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "aGVsbG8gd29ybGQ=" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "355" ], "Content-Type": [ "application/xml; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:35 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxEYBGcY_1PRUqvSomg9_cImasI3zcxzdkgKGUubWwzSm52Gbzm0grfNz9oVEBCGXyd" ] }, "Body": "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+U2lnbmF0dXJlRG9lc05vdE1hdGNoPC9Db2RlPjxNZXNzYWdlPkFjY2VzcyBkZW5pZWQuPC9NZXNzYWdlPjxEZXRhaWxzPlRoZSByZXF1ZXN0IHNpZ25hdHVyZSB3ZSBjYWxjdWxhdGVkIGRvZXMgbm90IG1hdGNoIHRoZSBzaWduYXR1cmUgeW91IHByb3ZpZGVkLiBDaGVjayB5b3VyIEdvb2dsZSBzZWNyZXQga2V5IGFuZCBzaWduaW5nIG1ldGhvZC48L0RldGFpbHM+PFN0cmluZ1RvU2lnbj5QVVQKCgoxNzczOTM3NTM1Ci9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2Jsb2ItZm9yLXNpZ25pbmc8L1N0cmluZ1RvU2lnbj48L0Vycm9yPg==" } }, { "ID": "a1bc5dbabf94a28e", "Request": { "Method": "PUT", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-signing?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "11" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "text/plain", "BodyParts": [ "aGVsbG8gd29ybGQ=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "text/html; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:35 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Server": [ "UploadServer" ], "Vary": [ "Origin" ], "X-Goog-Generation": [ "1773933935453140" ], "X-Goog-Hash": [ "crc32c=yZRlqg==", "md5=XrY7u+Ae7tCTyyK7j1rNww==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "11" ], "X-Guploader-Uploadid": [ "AGQBYWyw9CwxoSIiEEyHIhFSXQkilPGcTSyKFP6F1GJVv98DP-6AzFin0YVWWBSk9tKBGfOc" ] }, "Body": "" } }, { "ID": "809654c243a1e54e", "Request": { "Method": "PUT", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-signing?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "11" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8gd29ybGQ=" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "379" ], "Content-Type": [ "application/xml; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:35 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin" ], "X-Guploader-Uploadid": [ "AGQBYWw0YP1XsdwZkblmdoBwTjjQlWCn1XdujbANKNgeKvsDNZ0QKXrID7brcWqQES2LxHFW" ] }, "Body": "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+U2lnbmF0dXJlRG9lc05vdE1hdGNoPC9Db2RlPjxNZXNzYWdlPkFjY2VzcyBkZW5pZWQuPC9NZXNzYWdlPjxEZXRhaWxzPlRoZSByZXF1ZXN0IHNpZ25hdHVyZSB3ZSBjYWxjdWxhdGVkIGRvZXMgbm90IG1hdGNoIHRoZSBzaWduYXR1cmUgeW91IHByb3ZpZGVkLiBDaGVjayB5b3VyIEdvb2dsZSBzZWNyZXQga2V5IGFuZCBzaWduaW5nIG1ldGhvZC48L0RldGFpbHM+PFN0cmluZ1RvU2lnbj5QVVQKCmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQoxNzczOTM3NTM1Ci9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2Jsb2ItZm9yLXNpZ25pbmc8L1N0cmluZ1RvU2lnbj48L0Vycm9yPg==" } }, { "ID": "997cf6b7c69d7b1b", "Request": { "Method": "PUT", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-signing?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "11" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "aGVsbG8gd29ybGQ=" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "355" ], "Content-Type": [ "application/xml; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:35 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin" ], "X-Guploader-Uploadid": [ "AGQBYWx5mbECb4uEgUlAf-uSd2I1QXiz4XL8qWgo5-MfWwNOJWJQjPgepSh9bGlrvsHFz3Qj" ] }, "Body": "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+U2lnbmF0dXJlRG9lc05vdE1hdGNoPC9Db2RlPjxNZXNzYWdlPkFjY2VzcyBkZW5pZWQuPC9NZXNzYWdlPjxEZXRhaWxzPlRoZSByZXF1ZXN0IHNpZ25hdHVyZSB3ZSBjYWxjdWxhdGVkIGRvZXMgbm90IG1hdGNoIHRoZSBzaWduYXR1cmUgeW91IHByb3ZpZGVkLiBDaGVjayB5b3VyIEdvb2dsZSBzZWNyZXQga2V5IGFuZCBzaWduaW5nIG1ldGhvZC48L0RldGFpbHM+PFN0cmluZ1RvU2lnbj5QVVQKCgoxNzczOTM3NTM1Ci9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2Jsb2ItZm9yLXNpZ25pbmc8L1N0cmluZ1RvU2lnbj48L0Vycm9yPg==" } }, { "ID": "04e7424a0358b931", "Request": { "Method": "PUT", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-signing?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "11" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "aGVsbG8gd29ybGQ=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "text/html; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:35 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Server": [ "UploadServer" ], "Vary": [ "Origin" ], "X-Goog-Generation": [ "1773933935705865" ], "X-Goog-Hash": [ "crc32c=yZRlqg==", "md5=XrY7u+Ae7tCTyyK7j1rNww==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "11" ], "X-Guploader-Uploadid": [ "AGQBYWz-mJm1YI400qn1jNTJ3reFX2TSB_djfqRmRiplXaXpiQWN3MB7-LokWhH_fNfBslmQ" ] }, "Body": "" } }, { "ID": "9b0e9d422b027dc5", "Request": { "Method": "PUT", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-signing?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "11" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "aGVsbG8gd29ybGQ=" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "379" ], "Content-Type": [ "application/xml; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:35 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyjCgyIvFkuqsCm-zh6PIp6w7x4PvtkFk7dfDLc2QsRQ1Li1nh2E9yCB-61bgFx3_K9" ] }, "Body": "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+U2lnbmF0dXJlRG9lc05vdE1hdGNoPC9Db2RlPjxNZXNzYWdlPkFjY2VzcyBkZW5pZWQuPC9NZXNzYWdlPjxEZXRhaWxzPlRoZSByZXF1ZXN0IHNpZ25hdHVyZSB3ZSBjYWxjdWxhdGVkIGRvZXMgbm90IG1hdGNoIHRoZSBzaWduYXR1cmUgeW91IHByb3ZpZGVkLiBDaGVjayB5b3VyIEdvb2dsZSBzZWNyZXQga2V5IGFuZCBzaWduaW5nIG1ldGhvZC48L0RldGFpbHM+PFN0cmluZ1RvU2lnbj5QVVQKCmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQoxNzczOTM3NTM1Ci9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2Jsb2ItZm9yLXNpZ25pbmc8L1N0cmluZ1RvU2lnbj48L0Vycm9yPg==" } }, { "ID": "ea3caa9c8c57eeec", "Request": { "Method": "PUT", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-signing?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "11" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "aGVsbG8gd29ybGQ=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "text/html; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:35 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Server": [ "UploadServer" ], "Vary": [ "Origin" ], "X-Goog-Generation": [ "1773933935903733" ], "X-Goog-Hash": [ "crc32c=yZRlqg==", "md5=XrY7u+Ae7tCTyyK7j1rNww==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "11" ], "X-Guploader-Uploadid": [ "AGQBYWxKu9DOTqHPur2IthJdb20zFXQ6DCecKy2Y0_gUmicDwSCkx6RN52qPdRn74yekyRgj" ] }, "Body": "" } }, { "ID": "fc0dbd4556d25d21", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-signing?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "355" ], "Content-Type": [ "application/xml; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:35 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "X-Guploader-Uploadid": [ "AGQBYWzwXTOSp3CbHTVGNKv3AFKz54bLADf_0secDH-S2p_iHWY68XVBEtEV_qhDNv7-x1Fx" ] }, "Body": "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+U2lnbmF0dXJlRG9lc05vdE1hdGNoPC9Db2RlPjxNZXNzYWdlPkFjY2VzcyBkZW5pZWQuPC9NZXNzYWdlPjxEZXRhaWxzPlRoZSByZXF1ZXN0IHNpZ25hdHVyZSB3ZSBjYWxjdWxhdGVkIGRvZXMgbm90IG1hdGNoIHRoZSBzaWduYXR1cmUgeW91IHByb3ZpZGVkLiBDaGVjayB5b3VyIEdvb2dsZSBzZWNyZXQga2V5IGFuZCBzaWduaW5nIG1ldGhvZC48L0RldGFpbHM+PFN0cmluZ1RvU2lnbj5HRVQKCgoxNzczOTM3NTM1Ci9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2Jsb2ItZm9yLXNpZ25pbmc8L1N0cmluZ1RvU2lnbj48L0Vycm9yPg==" } }, { "ID": "8db7e665eb37b1e5", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-signing?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "355" ], "Content-Type": [ "application/xml; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:36 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "X-Guploader-Uploadid": [ "AGQBYWyhINBT7sOPFfT1jk5YUy-aZ2paJYphAnAcO0hj1NcsyJDGfjDlgvi5imvJ3hhft2jQ" ] }, "Body": "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+U2lnbmF0dXJlRG9lc05vdE1hdGNoPC9Db2RlPjxNZXNzYWdlPkFjY2VzcyBkZW5pZWQuPC9NZXNzYWdlPjxEZXRhaWxzPlRoZSByZXF1ZXN0IHNpZ25hdHVyZSB3ZSBjYWxjdWxhdGVkIGRvZXMgbm90IG1hdGNoIHRoZSBzaWduYXR1cmUgeW91IHByb3ZpZGVkLiBDaGVjayB5b3VyIEdvb2dsZSBzZWNyZXQga2V5IGFuZCBzaWduaW5nIG1ldGhvZC48L0RldGFpbHM+PFN0cmluZ1RvU2lnbj5HRVQKCgoxNzczOTM3NTM1Ci9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2Jsb2ItZm9yLXNpZ25pbmc8L1N0cmluZ1RvU2lnbj48L0Vycm9yPg==" } }, { "ID": "902d23eff0e3b984", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-signing", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "298" ], "Content-Type": [ "application/xml; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:36 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "X-Guploader-Uploadid": [ "AGQBYWye-ufwepte9-GztpNQRzxx7e9SKBk8TzNpQrXrthsMNkXpLnK0qRZqUI4LXl143h3c" ] }, "Body": "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+QWNjZXNzRGVuaWVkPC9Db2RlPjxNZXNzYWdlPkFjY2VzcyBkZW5pZWQuPC9NZXNzYWdlPjxEZXRhaWxzPkFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuZ2V0IGFjY2VzcyB0byB0aGUgR29vZ2xlIENsb3VkIFN0b3JhZ2Ugb2JqZWN0LiBQZXJtaXNzaW9uICdzdG9yYWdlLm9iamVjdHMuZ2V0JyBkZW5pZWQgb24gcmVzb3VyY2UgKG9yIGl0IG1heSBub3QgZXhpc3QpLjwvRGV0YWlscz48L0Vycm9yPg==" } }, { "ID": "90eacaff37c8ae87", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-signing?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "11" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:25:36 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:25:35 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933935903733" ], "X-Goog-Hash": [ "crc32c=yZRlqg==", "md5=XrY7u+Ae7tCTyyK7j1rNww==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "11" ], "X-Guploader-Uploadid": [ "AGQBYWylvwoLspTKQ92N9Sta42bpRExJGLKthhYS1TMV_XYklYftZq4YSkRmPoJwgPOqTtPa" ] }, "Body": "aGVsbG8gd29ybGQ=" } }, { "ID": "cd382ed3517abd98", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-signing?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "358" ], "Content-Type": [ "application/xml; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:36 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxAQv65Z-A4qADxz_Jy8QxQODBZAebyE2FxRTLlimCl40s5pA4znS_tgoJA70mC7vAt" ] }, "Body": "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+U2lnbmF0dXJlRG9lc05vdE1hdGNoPC9Db2RlPjxNZXNzYWdlPkFjY2VzcyBkZW5pZWQuPC9NZXNzYWdlPjxEZXRhaWxzPlRoZSByZXF1ZXN0IHNpZ25hdHVyZSB3ZSBjYWxjdWxhdGVkIGRvZXMgbm90IG1hdGNoIHRoZSBzaWduYXR1cmUgeW91IHByb3ZpZGVkLiBDaGVjayB5b3VyIEdvb2dsZSBzZWNyZXQga2V5IGFuZCBzaWduaW5nIG1ldGhvZC48L0RldGFpbHM+PFN0cmluZ1RvU2lnbj5ERUxFVEUKCgoxNzczOTM3NTM1Ci9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2Jsb2ItZm9yLXNpZ25pbmc8L1N0cmluZ1RvU2lnbj48L0Vycm9yPg==" } }, { "ID": "5236d3a72d073277", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-signing?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "358" ], "Content-Type": [ "application/xml; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:36 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxCQ-Iv4YB_tPUFmSpJeqLfvNqCVmbTo6vignaRMf-Vkf5qvjGHJK7q5BiEHFgPDgkJ" ] }, "Body": "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+U2lnbmF0dXJlRG9lc05vdE1hdGNoPC9Db2RlPjxNZXNzYWdlPkFjY2VzcyBkZW5pZWQuPC9NZXNzYWdlPjxEZXRhaWxzPlRoZSByZXF1ZXN0IHNpZ25hdHVyZSB3ZSBjYWxjdWxhdGVkIGRvZXMgbm90IG1hdGNoIHRoZSBzaWduYXR1cmUgeW91IHByb3ZpZGVkLiBDaGVjayB5b3VyIEdvb2dsZSBzZWNyZXQga2V5IGFuZCBzaWduaW5nIG1ldGhvZC48L0RldGFpbHM+PFN0cmluZ1RvU2lnbj5ERUxFVEUKCgoxNzczOTM3NTM1Ci9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L2Jsb2ItZm9yLXNpZ25pbmc8L1N0cmluZ1RvU2lnbj48L0Vycm9yPg==" } }, { "ID": "4e83fb474ef739a7", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-signing?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:25:36 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin" ], "X-Guploader-Uploadid": [ "AGQBYWypwbTqDWdVlPEHxfMyQO-9zjiTzdsONJRt5XKBVoCd_4PawVMSadAD0cmz-TMUY_0W" ] }, "Body": "" } }, { "ID": "c17bc098c7ed942a", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-signing?Expires=CLEARED\u0026GoogleAccessId=storage-updater%40go-cloud-test-216917.iam.gserviceaccount.com\u0026Signature=CLEARED", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "204" ], "Content-Type": [ "application/xml; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:25:36 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "X-Guploader-Uploadid": [ "AGQBYWysEsLItPD2rtVmH7AMJsFogqMUudM5BCIu0ILlWE9CYtk0SvjVfPs4aFhbMOCPgnFD" ] }, "Body": "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+Tm9TdWNoS2V5PC9Db2RlPjxNZXNzYWdlPlRoZSBzcGVjaWZpZWQga2V5IGRvZXMgbm90IGV4aXN0LjwvTWVzc2FnZT48RGV0YWlscz5ObyBzdWNoIG9iamVjdDogZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1zaWduaW5nPC9EZXRhaWxzPjwvRXJyb3I+" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestUploadDownload.replay ================================================ { "Initial": "AQAAAA7hTghVMEB7WAAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "7b5262d6cf770e45", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-upload-download\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0IiwiY3JjMzJjIjoiMzVjNnJnPT0iLCJuYW1lIjoiYmxvYi1mb3ItdXBsb2FkLWRvd25sb2FkIn0K", "dXAgYW5kIGRvd24=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "804" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:05 GMT" ], "Etag": [ "CKu1lvyerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxFnnJKxQZ_NVCT13wduZS-olWsArojbepB9Q5mZpXV_ToY8PuUsKNbcXPH5w-DIGdJ" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItdXBsb2FkLWRvd25sb2FkLzE3NzM5MzI4ODU5NDA5MDciLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItdXBsb2FkLWRvd25sb2FkIiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItdXBsb2FkLWRvd25sb2FkP2dlbmVyYXRpb249MTc3MzkzMjg4NTk0MDkwNyZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItdXBsb2FkLWRvd25sb2FkIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMyODg1OTQwOTA3IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiMTEiLCJtZDVIYXNoIjoiRzNWVFB0V29hZjl2T3VBemJRd3pJQT09IiwiY3JjMzJjIjoiMzVjNnJnPT0iLCJldGFnIjoiQ0t1MWx2eWVySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowNS45NDNaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDUuOTQzWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowNS45NDNaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDUuOTQzWiJ9" } }, { "ID": "3ae182b87cf2e39f", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-upload-download", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "11" ], "Content-Type": [ "text" ], "Date": [ "Thu, 19 Mar 2026 15:08:06 GMT" ], "Etag": [ "\"1b75533ed5a869ff6f3ae0336d0c3320\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:08:05 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932885940907" ], "X-Goog-Hash": [ "crc32c=35c6rg==", "md5=G3VTPtWoaf9vOuAzbQwzIA==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "11" ], "X-Guploader-Uploadid": [ "AGQBYWy4oNFKDibnwf0WsnMHGKDEqpCjhBYcTSuFCb83RsCzm5ZpkQDIzTFxRVBIsTOnGSO7" ] }, "Body": "dXAgYW5kIGRvd24=" } }, { "ID": "679af4f1c7f5a90c", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-upload-download\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0IiwiY3JjMzJjIjoiMzVjNnJnPT0iLCJtZDVIYXNoIjoiRzNWVFB0V29hZjl2T3VBemJRd3pJQT09IiwibmFtZSI6ImJsb2ItZm9yLXVwbG9hZC1kb3dubG9hZCJ9Cg==", "dXAgYW5kIGRvd24=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "804" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:06 GMT" ], "Etag": [ "CKvSofyerJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxiNK2enFMWAdLx7RqvdHzhNrJ84siThDPdTGR-jJ_gbn1fZkpf3tPSo4NDbt4G2kkw" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItdXBsb2FkLWRvd25sb2FkLzE3NzM5MzI4ODYxMjQ4NDMiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItdXBsb2FkLWRvd25sb2FkIiwibWVkaWFMaW5rIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0L28vYmxvYi1mb3ItdXBsb2FkLWRvd25sb2FkP2dlbmVyYXRpb249MTc3MzkzMjg4NjEyNDg0MyZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItdXBsb2FkLWRvd25sb2FkIiwiYnVja2V0IjoiZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldCIsImdlbmVyYXRpb24iOiIxNzczOTMyODg2MTI0ODQzIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiMTEiLCJtZDVIYXNoIjoiRzNWVFB0V29hZjl2T3VBemJRd3pJQT09IiwiY3JjMzJjIjoiMzVjNnJnPT0iLCJldGFnIjoiQ0t2U29meWVySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowNi4xMzNaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDYuMTMzWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODowNi4xMzNaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MDg6MDYuMTMzWiJ9" } }, { "ID": "300c6ec7e338aeff", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-upload-download?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:06 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWySGJawYvbY_qWAhQ0mPN05Arq3r0RX6YwvVNQz_fqh_lqOZU1hlwxYqYAK-dRZj5-U" ] }, "Body": "" } }, { "ID": "953bc54a8d0e21c5", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-upload-download?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "231" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:06 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwj7aTm_DT3tUnZbiG2bNLGDDrkSko7iLVjx_G-W0uwbiPHwQsbhZ9pLzwaeYNkJZO7" ] }, "Body": "eyJlcnJvciI6eyJjb2RlIjo0MDQsIm1lc3NhZ2UiOiJObyBzdWNoIG9iamVjdDogZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci11cGxvYWQtZG93bmxvYWQiLCJlcnJvcnMiOlt7Im1lc3NhZ2UiOiJObyBzdWNoIG9iamVjdDogZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci11cGxvYWQtZG93bmxvYWQiLCJkb21haW4iOiJnbG9iYWwiLCJyZWFzb24iOiJub3RGb3VuZCJ9XX19" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestWrite/ContentType_is_discovered_if_not_provided.replay ================================================ { "Initial": "AQAAAA7hTgizCuh+cAAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "6ad105cc4a78ef00", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-reading\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiLCJjcmMzMmMiOiJ0ZHdyZ1E9PSIsIm5hbWUiOiJibG9iLWZvci1yZWFkaW5nIn0K", "PCFET0NUWVBFIGh0bWw+PGh0bWwgbGFuZz0iZW4iPgo8aGVhZCBwcm9maWxlPSJodHRwOi8vYTkuY29tLy0vc3BlYy9vcGVuc2VhcmNoLzEuMS8iPgogIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgPGxpbmsgaHJlZj0iLy0vYm9vdHN0cmFwLm1pbi5jc3M/dj04YmVjMWJiYTNlMjNlY2JhMjJjZmZiMTk3YTJkNDQwYWY0MTBiMTVkIiByZWw9InN0eWxlc2hlZXQiPgogIDxsaW5rIGhyZWY9Ii8tL3NpdGUuY3NzP3Y9N2Q4MWY0MTA0Yzg5ZGJlMzc2MzQ1ZjZiZmUzZTYyYjRlNDBkM2QwNiIgcmVsPSJzdHlsZXNoZWV0Ij4KICA8dGl0bGU+R29Eb2M8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5Pgo8bmF2IGNsYXNzPSJuYXZiYXIgbmF2YmFyLWRlZmF1bHQiIHJvbGU9Im5hdmlnYXRpb24iPgogIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgPGRpdiBjbGFzcz0ibmF2YmFyLWhlYWRlciI+CiAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Im5hdmJhci10b2dnbGUiIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSIgZGF0YS10YXJnZXQ9Ii5uYXZiYXItY29sbGFwc2UiPgogICAgICA8c3BhbiBjbGFzcz0ic3Itb25seSI+VG9nZ2xlIG5hdmlnYXRpb248L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iaWNvbi1iYXIiPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9Imljb24tYmFyIj48L3NwYW4+CiAgICA8L2J1dHRvbj4KICAgIDxhIGNsYXNzPSJuYXZiYXItYnJhbmQiIGhyZWY9Ii8iPjxzdHJvbmc+R29Eb2M8L3N0cm9uZz48L2E+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlIj4KICAgIDx1bCBjbGFzcz0ibmF2IG5hdmJhci1uYXYiPgogICAgICAgIDxsaSBjbGFzcz0iYWN0aXZlIj48YSBocmVmPSIvIj5Ib21lPC9hPjwvbGk+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dDwvYT48L2xpPgogICAgPC91bD4KICAgIDxmb3JtIGNsYXNzPSJuYXZiYXItbmF2IG5hdmJhci1mb3JtIG5hdmJhci1yaWdodCIgaWQ9Ingtc2VhcmNoIiBhY3Rpb249Ii8iIHJvbGU9InNlYXJjaCI+PGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJ4LXNlYXJjaC1xdWVyeSIgdHlwZT0idGV4dCIgbmFtZT0icSIgcGxhY2Vob2xkZXI9IlNlYXJjaCI+PC9mb3JtPgogIDwvZGl2Pgo8L2Rpdj4KPC9uYXY+CjxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgCjxkaXYgY2xhc3M9Imp1bWJvdHJvbiI+CiAgICA8aDI+U2VhcmNoIGZvciBHbyBQYWNrYWdlczwvaDI+CiAgICAKICA8Zm9ybT4KICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5hbWU9InEiIGF1dG9mb2N1cz0iYXV0b2ZvY3VzIiB2YWx1ZT0iIiBwbGFjZWhvbGRlcj0iU2VhcmNoIGZvciBwYWNrYWdlIGJ5IGltcG9ydCBwYXRoIG9yIGtleXdvcmQuIiB0eXBlPSJ0ZXh0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImlucHV0LWdyb3VwLWJ0biI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IiB0eXBlPSJzdWJtaXQiPkdvITwvYnV0dG9uPgogICAgICA8L3NwYW4+CiAgICA8L2Rpdj4KICA8L2Zvcm0+Cgo8L2Rpdj4KCjxwPkdvRG9jIGhvc3RzIGRvY3VtZW50YXRpb24gZm9yIDxhIGhyZWY9Imh0dHA6Ly9nb2xhbmcub3JnLyI+R288L2E+IHBhY2thZ2VzCm9uIEJpdGJ1Y2tldCwgR2l0SHViLCBHb29nbGUgUHJvamVjdCBIb3N0aW5nIGFuZCBMYXVuY2hwYWQuICBSZWFkIHRoZSA8YQogIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dCBQYWdlPC9hPiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYWRkaW5nIHBhY2thZ2VzIHRvIEdvRG9jCmFuZCBtb3JlLgoKPGRpdiBjbGFzcz0icm93Ij4KICA8ZGl2IGNsYXNzPSJjb2wtc20tNiI+CiAgICAKICAgICAgPGg0PlBvcHVsYXIgUGFja2FnZXM8L2g0PgogICAgICA8dWwgY2xhc3M9Imxpc3QtdW5zdHlsZWQiPgogICAgICAgIDxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1nby9hd3MiPmdpdGh1Yi5jb20vYXdzL2F3cy1zZGstZ28vYXdzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9kZ3JpamFsdmEvand0LWdvIj5naXRodWIuY29tL2RncmlqYWx2YS9qd3QtZ288L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dpbi1nb25pYy9naW4iPmdpdGh1Yi5jb20vZ2luLWdvbmljL2dpbjwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXMiPmdpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dvLXNxbC1kcml2ZXIvbXlzcWwiPmdpdGh1Yi5jb20vZ28tc3FsLWRyaXZlci9teXNxbDwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29sYW5nL3Byb3RvYnVmL3Byb3RvIj5naXRodWIuY29tL2dvbGFuZy9wcm90b2J1Zi9wcm90bzwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29tb2R1bGUvcmVkaWdvL3JlZGlzIj5naXRodWIuY29tL2dvbW9kdWxlL3JlZGlnby9yZWRpczwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQiPmdpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQ8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltIj5naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9qaW56aHUvZ29ybSI+Z2l0aHViLmNvbS9qaW56aHUvZ29ybTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vbGliL3BxIj5naXRodWIuY29tL2xpYi9wcTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcGtnL2Vycm9ycyI+Z2l0aHViLmNvbS9wa2cvZXJyb3JzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1cyI+Z2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1czwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcm9iZmlnL2Nyb24iPmdpdGh1Yi5jb20vcm9iZmlnL2Nyb248L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3NpcnVwc2VuL2xvZ3J1cyI+Z2l0aHViLmNvbS9zaXJ1cHNlbi9sb2dydXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0Ij5naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0PC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS91bml4cGlja2xlL2thaG9vdC1oYWNrIj5naXRodWIuY29tL3VuaXhwaWNrbGUva2Fob290LWhhY2s8L2E+PGxpPjxhIGhyZWY9Ii9nby51YmVyLm9yZy96YXAiPmdvLnViZXIub3JnL3phcDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9jcnlwdG8vc3NoIj5nb2xhbmcub3JnL3gvY3J5cHRvL3NzaDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9uZXQvY29udGV4dCI+Z29sYW5nLm9yZy94L25ldC9jb250ZXh0PC9hPjxsaT48YSBocmVmPSIvZ29sYW5nLm9yZy94L29hdXRoMiI+Z29sYW5nLm9yZy94L29hdXRoMjwvYT48bGk+PGEgaHJlZj0iL2dvb2dsZS5nb2xhbmcub3JnL2dycGMiPmdvb2dsZS5nb2xhbmcub3JnL2dycGM8L2E+PGxpPjxhIGhyZWY9Ii9nb3BrZy5pbi9tZ28udjIiPmdvcGtnLmluL21nby52MjwvYT48bGk+PGEgaHJlZj0iL2dvcGtnLmluL3lhbWwudjIiPmdvcGtnLmluL3lhbWwudjI8L2E+PGxpPjxhIGhyZWY9Ii9sYWJpeC5vcmcvdjIvbWdvIj5sYWJpeC5vcmcvdjIvbWdvPC9hPgogICAgICA8L3VsPgogICAgCiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sLXNtLTYiPgogICAgPGg0Pk1vcmUgUGFja2FnZXM8L2g0PgogICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIj4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL2dvIj5HbyBTdGFuZGFyZCBQYWNrYWdlczwvYT4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL3N1YnJlcG8iPkdvIFN1Yi1yZXBvc2l0b3J5IFBhY2thZ2VzPC9hPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9nb2xhbmcub3JnL3dpa2kvUHJvamVjdHMiPlByb2plY3RzIEAgZ28td2lraTwvYT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zZWFyY2g/bz1kZXNjJmFtcDtxPWxhbmd1YWdlJTNBZ28mYW1wO3M9c3RhcnMmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5Nb3N0IHN0YXJzPC9hPiwgCiAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NlYXJjaD9vPWRlc2MmYW1wO3E9bGFuZ3VhZ2UlM0FnbyZhbXA7cz1mb3JrcyZhbXA7dHlwZT1SZXBvc2l0b3JpZXMiPm1vc3QgZm9ya3M8L2E+LCAKICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2VhcmNoP289ZGVzYyZhbXA7cT1sYW5ndWFnZSUzQWdvJmFtcDtzPXVwZGF0ZWQmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5yZWNlbnRseSB1cGRhdGVkPC9hPiBvbiBHaXRIdWIKICAgIDwvdWw+CiAgPC9kaXY+CjwvZGl2PgoKCjwvZGl2Pgo8ZGl2IGlkPSJ4LWZvb3RlciIgY2xhc3M9ImNsZWFyZml4Ij4KICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2dvbGFuZy9nZGRvL2lzc3VlcyI+V2Vic2l0ZSBJc3N1ZXM8L2E+CiAgICA8c3BhbiBjbGFzcz0idGV4dC1tdXRlZCI+fDwvc3Bhbj4gPGEgaHJlZj0iaHR0cDovL2dvbGFuZy5vcmcvIj5HbyBMYW5ndWFnZTwvYT4KICAgIDxzcGFuIGNsYXNzPSJwdWxsLXJpZ2h0Ij48YSBocmVmPSIjIj5CYWNrIHRvIHRvcDwvYT48L3NwYW4+CiAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ieC1zaG9ydGN1dHMiIHRhYmluZGV4PSItMSIgY2xhc3M9Im1vZGFsIj4KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+CiAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvYnV0dG9uPgogICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+S2V5Ym9hcmQgc2hvcnRjdXRzPC9oND4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4/PC9iPjwvdGQ+PHRkPiA6IFRoaXMgbWVudTwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4vPC9iPjwvdGQ+PHRkPiA6IFNlYXJjaCBzaXRlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5mPC9iPjwvdGQ+PHRkPiA6IEp1bXAgdG8gaWRlbnRpZmllcjwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmc8L2I+PC90ZD48dGQ+IDogR28gdG8gdG9wIG9mIHBhZ2U8L3RkPjwvdHI+CiAgICAgICAgICA8dHI+PHRkIGFsaWduPSJyaWdodCI+PGI+ZzwvYj4gdGhlbiA8Yj5iPC9iPjwvdGQ+PHRkPiA6IEdvIHRvIGVuZCBvZiBwYWdlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmk8L2I+PC90ZD48dGQ+IDogR28gdG8gaW5kZXg8L3RkPjwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9InRleHQtbXV0ZWQiPjx0ZCBhbGlnbj0icmlnaHQiPjxiPmc8L2I+IHRoZW4gPGI+ZTwvYj48L3RkPjx0ZD4gOiBHbyB0byBleGFtcGxlczwvdGQ+PC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KPHNjcmlwdCBzcmM9Ii8tL2pxdWVyeS0yLjAuMy5taW4uanM/dj1mYmY5Yzc3ZDBjNGUzYzM0YTQ4NTk4MGMxZTUzMTZiNjIxMjE2MGM4Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL2Jvb3RzdHJhcC5taW4uanM/dj01YWRhN2MxMDNmYzFkZWFiYzkyNWNjMWZkYmJiNmU0NTFjMjFmYzcwIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL3NpdGUuanM/dj0zNzFkZTczMWMxOGQ5MWM0OTlkOTBiMWFiMGJmMzllY2Y2NmQ2Y2Y3Ij48L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "794" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:09:39 GMT" ], "Etag": [ "CMKP2qifrJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyv8v5ZJiWGOpF3HI-ptcx-iNP6yWI3bjjbVp4TGO8X3Fpa3q945TI-VtRGb-s2lcLj" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItcmVhZGluZy8xNzczOTMyOTc5MzI0ODY2Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLXJlYWRpbmciLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1yZWFkaW5nP2dlbmVyYXRpb249MTc3MzkzMjk3OTMyNDg2NiZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItcmVhZGluZyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjk3OTMyNDg2NiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNjM1NCIsIm1kNUhhc2giOiJEMnA4bi9QVDEzQzQ5L29ad3E0WjBBPT0iLCJjcmMzMmMiOiJ0ZHdyZ1E9PSIsImV0YWciOiJDTUtQMnFpZnJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA5OjM5LjMyN1oiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowOTozOS4zMjdaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA5OjM5LjMyN1oiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNTowOTozOS4zMjdaIn0=" } }, { "ID": "def36df6f2554b4e", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "6354" ], "Content-Type": [ "text/html; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:09:39 GMT" ], "Etag": [ "\"0f6a7c9ff3d3d770b8f7fa19c2ae19d0\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:09:39 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932979324866" ], "X-Goog-Hash": [ "crc32c=tdwrgQ==", "md5=D2p8n/PT13C49/oZwq4Z0A==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "6354" ], "X-Guploader-Uploadid": [ "AGQBYWzsUZ7Fn4QQZkmtS48juEC0Par7PBMPRGLPv3fys3mPJZpHMk5_YXVfaLHwoHjh_0ZM" ] }, "Body": "PCFET0NUWVBFIGh0bWw+PGh0bWwgbGFuZz0iZW4iPgo8aGVhZCBwcm9maWxlPSJodHRwOi8vYTkuY29tLy0vc3BlYy9vcGVuc2VhcmNoLzEuMS8iPgogIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgPGxpbmsgaHJlZj0iLy0vYm9vdHN0cmFwLm1pbi5jc3M/dj04YmVjMWJiYTNlMjNlY2JhMjJjZmZiMTk3YTJkNDQwYWY0MTBiMTVkIiByZWw9InN0eWxlc2hlZXQiPgogIDxsaW5rIGhyZWY9Ii8tL3NpdGUuY3NzP3Y9N2Q4MWY0MTA0Yzg5ZGJlMzc2MzQ1ZjZiZmUzZTYyYjRlNDBkM2QwNiIgcmVsPSJzdHlsZXNoZWV0Ij4KICA8dGl0bGU+R29Eb2M8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5Pgo8bmF2IGNsYXNzPSJuYXZiYXIgbmF2YmFyLWRlZmF1bHQiIHJvbGU9Im5hdmlnYXRpb24iPgogIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgPGRpdiBjbGFzcz0ibmF2YmFyLWhlYWRlciI+CiAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Im5hdmJhci10b2dnbGUiIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSIgZGF0YS10YXJnZXQ9Ii5uYXZiYXItY29sbGFwc2UiPgogICAgICA8c3BhbiBjbGFzcz0ic3Itb25seSI+VG9nZ2xlIG5hdmlnYXRpb248L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iaWNvbi1iYXIiPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9Imljb24tYmFyIj48L3NwYW4+CiAgICA8L2J1dHRvbj4KICAgIDxhIGNsYXNzPSJuYXZiYXItYnJhbmQiIGhyZWY9Ii8iPjxzdHJvbmc+R29Eb2M8L3N0cm9uZz48L2E+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlIj4KICAgIDx1bCBjbGFzcz0ibmF2IG5hdmJhci1uYXYiPgogICAgICAgIDxsaSBjbGFzcz0iYWN0aXZlIj48YSBocmVmPSIvIj5Ib21lPC9hPjwvbGk+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dDwvYT48L2xpPgogICAgPC91bD4KICAgIDxmb3JtIGNsYXNzPSJuYXZiYXItbmF2IG5hdmJhci1mb3JtIG5hdmJhci1yaWdodCIgaWQ9Ingtc2VhcmNoIiBhY3Rpb249Ii8iIHJvbGU9InNlYXJjaCI+PGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJ4LXNlYXJjaC1xdWVyeSIgdHlwZT0idGV4dCIgbmFtZT0icSIgcGxhY2Vob2xkZXI9IlNlYXJjaCI+PC9mb3JtPgogIDwvZGl2Pgo8L2Rpdj4KPC9uYXY+CjxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgCjxkaXYgY2xhc3M9Imp1bWJvdHJvbiI+CiAgICA8aDI+U2VhcmNoIGZvciBHbyBQYWNrYWdlczwvaDI+CiAgICAKICA8Zm9ybT4KICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5hbWU9InEiIGF1dG9mb2N1cz0iYXV0b2ZvY3VzIiB2YWx1ZT0iIiBwbGFjZWhvbGRlcj0iU2VhcmNoIGZvciBwYWNrYWdlIGJ5IGltcG9ydCBwYXRoIG9yIGtleXdvcmQuIiB0eXBlPSJ0ZXh0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImlucHV0LWdyb3VwLWJ0biI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IiB0eXBlPSJzdWJtaXQiPkdvITwvYnV0dG9uPgogICAgICA8L3NwYW4+CiAgICA8L2Rpdj4KICA8L2Zvcm0+Cgo8L2Rpdj4KCjxwPkdvRG9jIGhvc3RzIGRvY3VtZW50YXRpb24gZm9yIDxhIGhyZWY9Imh0dHA6Ly9nb2xhbmcub3JnLyI+R288L2E+IHBhY2thZ2VzCm9uIEJpdGJ1Y2tldCwgR2l0SHViLCBHb29nbGUgUHJvamVjdCBIb3N0aW5nIGFuZCBMYXVuY2hwYWQuICBSZWFkIHRoZSA8YQogIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dCBQYWdlPC9hPiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYWRkaW5nIHBhY2thZ2VzIHRvIEdvRG9jCmFuZCBtb3JlLgoKPGRpdiBjbGFzcz0icm93Ij4KICA8ZGl2IGNsYXNzPSJjb2wtc20tNiI+CiAgICAKICAgICAgPGg0PlBvcHVsYXIgUGFja2FnZXM8L2g0PgogICAgICA8dWwgY2xhc3M9Imxpc3QtdW5zdHlsZWQiPgogICAgICAgIDxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1nby9hd3MiPmdpdGh1Yi5jb20vYXdzL2F3cy1zZGstZ28vYXdzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9kZ3JpamFsdmEvand0LWdvIj5naXRodWIuY29tL2RncmlqYWx2YS9qd3QtZ288L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dpbi1nb25pYy9naW4iPmdpdGh1Yi5jb20vZ2luLWdvbmljL2dpbjwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXMiPmdpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dvLXNxbC1kcml2ZXIvbXlzcWwiPmdpdGh1Yi5jb20vZ28tc3FsLWRyaXZlci9teXNxbDwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29sYW5nL3Byb3RvYnVmL3Byb3RvIj5naXRodWIuY29tL2dvbGFuZy9wcm90b2J1Zi9wcm90bzwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29tb2R1bGUvcmVkaWdvL3JlZGlzIj5naXRodWIuY29tL2dvbW9kdWxlL3JlZGlnby9yZWRpczwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQiPmdpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQ8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltIj5naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9qaW56aHUvZ29ybSI+Z2l0aHViLmNvbS9qaW56aHUvZ29ybTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vbGliL3BxIj5naXRodWIuY29tL2xpYi9wcTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcGtnL2Vycm9ycyI+Z2l0aHViLmNvbS9wa2cvZXJyb3JzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1cyI+Z2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1czwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcm9iZmlnL2Nyb24iPmdpdGh1Yi5jb20vcm9iZmlnL2Nyb248L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3NpcnVwc2VuL2xvZ3J1cyI+Z2l0aHViLmNvbS9zaXJ1cHNlbi9sb2dydXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0Ij5naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0PC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS91bml4cGlja2xlL2thaG9vdC1oYWNrIj5naXRodWIuY29tL3VuaXhwaWNrbGUva2Fob290LWhhY2s8L2E+PGxpPjxhIGhyZWY9Ii9nby51YmVyLm9yZy96YXAiPmdvLnViZXIub3JnL3phcDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9jcnlwdG8vc3NoIj5nb2xhbmcub3JnL3gvY3J5cHRvL3NzaDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9uZXQvY29udGV4dCI+Z29sYW5nLm9yZy94L25ldC9jb250ZXh0PC9hPjxsaT48YSBocmVmPSIvZ29sYW5nLm9yZy94L29hdXRoMiI+Z29sYW5nLm9yZy94L29hdXRoMjwvYT48bGk+PGEgaHJlZj0iL2dvb2dsZS5nb2xhbmcub3JnL2dycGMiPmdvb2dsZS5nb2xhbmcub3JnL2dycGM8L2E+PGxpPjxhIGhyZWY9Ii9nb3BrZy5pbi9tZ28udjIiPmdvcGtnLmluL21nby52MjwvYT48bGk+PGEgaHJlZj0iL2dvcGtnLmluL3lhbWwudjIiPmdvcGtnLmluL3lhbWwudjI8L2E+PGxpPjxhIGhyZWY9Ii9sYWJpeC5vcmcvdjIvbWdvIj5sYWJpeC5vcmcvdjIvbWdvPC9hPgogICAgICA8L3VsPgogICAgCiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sLXNtLTYiPgogICAgPGg0Pk1vcmUgUGFja2FnZXM8L2g0PgogICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIj4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL2dvIj5HbyBTdGFuZGFyZCBQYWNrYWdlczwvYT4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL3N1YnJlcG8iPkdvIFN1Yi1yZXBvc2l0b3J5IFBhY2thZ2VzPC9hPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9nb2xhbmcub3JnL3dpa2kvUHJvamVjdHMiPlByb2plY3RzIEAgZ28td2lraTwvYT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zZWFyY2g/bz1kZXNjJmFtcDtxPWxhbmd1YWdlJTNBZ28mYW1wO3M9c3RhcnMmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5Nb3N0IHN0YXJzPC9hPiwgCiAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NlYXJjaD9vPWRlc2MmYW1wO3E9bGFuZ3VhZ2UlM0FnbyZhbXA7cz1mb3JrcyZhbXA7dHlwZT1SZXBvc2l0b3JpZXMiPm1vc3QgZm9ya3M8L2E+LCAKICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2VhcmNoP289ZGVzYyZhbXA7cT1sYW5ndWFnZSUzQWdvJmFtcDtzPXVwZGF0ZWQmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5yZWNlbnRseSB1cGRhdGVkPC9hPiBvbiBHaXRIdWIKICAgIDwvdWw+CiAgPC9kaXY+CjwvZGl2PgoKCjwvZGl2Pgo8ZGl2IGlkPSJ4LWZvb3RlciIgY2xhc3M9ImNsZWFyZml4Ij4KICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2dvbGFuZy9nZGRvL2lzc3VlcyI+V2Vic2l0ZSBJc3N1ZXM8L2E+CiAgICA8c3BhbiBjbGFzcz0idGV4dC1tdXRlZCI+fDwvc3Bhbj4gPGEgaHJlZj0iaHR0cDovL2dvbGFuZy5vcmcvIj5HbyBMYW5ndWFnZTwvYT4KICAgIDxzcGFuIGNsYXNzPSJwdWxsLXJpZ2h0Ij48YSBocmVmPSIjIj5CYWNrIHRvIHRvcDwvYT48L3NwYW4+CiAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ieC1zaG9ydGN1dHMiIHRhYmluZGV4PSItMSIgY2xhc3M9Im1vZGFsIj4KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+CiAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvYnV0dG9uPgogICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+S2V5Ym9hcmQgc2hvcnRjdXRzPC9oND4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4/PC9iPjwvdGQ+PHRkPiA6IFRoaXMgbWVudTwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4vPC9iPjwvdGQ+PHRkPiA6IFNlYXJjaCBzaXRlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5mPC9iPjwvdGQ+PHRkPiA6IEp1bXAgdG8gaWRlbnRpZmllcjwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmc8L2I+PC90ZD48dGQ+IDogR28gdG8gdG9wIG9mIHBhZ2U8L3RkPjwvdHI+CiAgICAgICAgICA8dHI+PHRkIGFsaWduPSJyaWdodCI+PGI+ZzwvYj4gdGhlbiA8Yj5iPC9iPjwvdGQ+PHRkPiA6IEdvIHRvIGVuZCBvZiBwYWdlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmk8L2I+PC90ZD48dGQ+IDogR28gdG8gaW5kZXg8L3RkPjwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9InRleHQtbXV0ZWQiPjx0ZCBhbGlnbj0icmlnaHQiPjxiPmc8L2I+IHRoZW4gPGI+ZTwvYj48L3RkPjx0ZD4gOiBHbyB0byBleGFtcGxlczwvdGQ+PC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KPHNjcmlwdCBzcmM9Ii8tL2pxdWVyeS0yLjAuMy5taW4uanM/dj1mYmY5Yzc3ZDBjNGUzYzM0YTQ4NTk4MGMxZTUzMTZiNjIxMjE2MGM4Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL2Jvb3RzdHJhcC5taW4uanM/dj01YWRhN2MxMDNmYzFkZWFiYzkyNWNjMWZkYmJiNmU0NTFjMjFmYzcwIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL3NpdGUuanM/dj0zNzFkZTczMWMxOGQ5MWM0OTlkOTBiMWFiMGJmMzllY2Y2NmQ2Y2Y3Ij48L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+" } }, { "ID": "5c524c8940fe6641", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-reading?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "794" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:09:39 GMT" ], "Etag": [ "CMKP2qifrJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWy5RI2_phD8klF9Tal9L2_LgZngff4gxy_NU7la551iU4JWy7XstQmAyOOHDWP8OVbO" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItcmVhZGluZy8xNzczOTMyOTc5MzI0ODY2Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLXJlYWRpbmciLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1yZWFkaW5nP2dlbmVyYXRpb249MTc3MzkzMjk3OTMyNDg2NiZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItcmVhZGluZyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjk3OTMyNDg2NiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Iiwic3RvcmFnZUNsYXNzIjoiUkVHSU9OQUwiLCJzaXplIjoiNjM1NCIsIm1kNUhhc2giOiJEMnA4bi9QVDEzQzQ5L29ad3E0WjBBPT0iLCJjcmMzMmMiOiJ0ZHdyZ1E9PSIsImV0YWciOiJDTUtQMnFpZnJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA5OjM5LjMyN1oiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowOTozOS4zMjdaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA5OjM5LjMyN1oiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNTowOTozOS4zMjdaIn0=" } }, { "ID": "fc4090634ba00790", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-reading?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:09:39 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwtyO_U0cNYwbmoO69Odw8VI1hKkrXJHa2oJpVZHKsWGFko3E708Z77uDiBj1E-IeoI" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestWrite/ContentType_is_left_empty_if_not_provided_and_DisableContentTypeDetection_is_true.replay ================================================ { "Initial": "AQAAAA7hTgizJKDzewAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "a541d7ab8109a284", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-reading\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY3JjMzJjIjoidGR3cmdRPT0iLCJuYW1lIjoiYmxvYi1mb3ItcmVhZGluZyJ9Cg==", "PCFET0NUWVBFIGh0bWw+PGh0bWwgbGFuZz0iZW4iPgo8aGVhZCBwcm9maWxlPSJodHRwOi8vYTkuY29tLy0vc3BlYy9vcGVuc2VhcmNoLzEuMS8iPgogIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgPGxpbmsgaHJlZj0iLy0vYm9vdHN0cmFwLm1pbi5jc3M/dj04YmVjMWJiYTNlMjNlY2JhMjJjZmZiMTk3YTJkNDQwYWY0MTBiMTVkIiByZWw9InN0eWxlc2hlZXQiPgogIDxsaW5rIGhyZWY9Ii8tL3NpdGUuY3NzP3Y9N2Q4MWY0MTA0Yzg5ZGJlMzc2MzQ1ZjZiZmUzZTYyYjRlNDBkM2QwNiIgcmVsPSJzdHlsZXNoZWV0Ij4KICA8dGl0bGU+R29Eb2M8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5Pgo8bmF2IGNsYXNzPSJuYXZiYXIgbmF2YmFyLWRlZmF1bHQiIHJvbGU9Im5hdmlnYXRpb24iPgogIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgPGRpdiBjbGFzcz0ibmF2YmFyLWhlYWRlciI+CiAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Im5hdmJhci10b2dnbGUiIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSIgZGF0YS10YXJnZXQ9Ii5uYXZiYXItY29sbGFwc2UiPgogICAgICA8c3BhbiBjbGFzcz0ic3Itb25seSI+VG9nZ2xlIG5hdmlnYXRpb248L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iaWNvbi1iYXIiPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9Imljb24tYmFyIj48L3NwYW4+CiAgICA8L2J1dHRvbj4KICAgIDxhIGNsYXNzPSJuYXZiYXItYnJhbmQiIGhyZWY9Ii8iPjxzdHJvbmc+R29Eb2M8L3N0cm9uZz48L2E+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlIj4KICAgIDx1bCBjbGFzcz0ibmF2IG5hdmJhci1uYXYiPgogICAgICAgIDxsaSBjbGFzcz0iYWN0aXZlIj48YSBocmVmPSIvIj5Ib21lPC9hPjwvbGk+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dDwvYT48L2xpPgogICAgPC91bD4KICAgIDxmb3JtIGNsYXNzPSJuYXZiYXItbmF2IG5hdmJhci1mb3JtIG5hdmJhci1yaWdodCIgaWQ9Ingtc2VhcmNoIiBhY3Rpb249Ii8iIHJvbGU9InNlYXJjaCI+PGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJ4LXNlYXJjaC1xdWVyeSIgdHlwZT0idGV4dCIgbmFtZT0icSIgcGxhY2Vob2xkZXI9IlNlYXJjaCI+PC9mb3JtPgogIDwvZGl2Pgo8L2Rpdj4KPC9uYXY+CjxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgCjxkaXYgY2xhc3M9Imp1bWJvdHJvbiI+CiAgICA8aDI+U2VhcmNoIGZvciBHbyBQYWNrYWdlczwvaDI+CiAgICAKICA8Zm9ybT4KICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5hbWU9InEiIGF1dG9mb2N1cz0iYXV0b2ZvY3VzIiB2YWx1ZT0iIiBwbGFjZWhvbGRlcj0iU2VhcmNoIGZvciBwYWNrYWdlIGJ5IGltcG9ydCBwYXRoIG9yIGtleXdvcmQuIiB0eXBlPSJ0ZXh0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImlucHV0LWdyb3VwLWJ0biI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IiB0eXBlPSJzdWJtaXQiPkdvITwvYnV0dG9uPgogICAgICA8L3NwYW4+CiAgICA8L2Rpdj4KICA8L2Zvcm0+Cgo8L2Rpdj4KCjxwPkdvRG9jIGhvc3RzIGRvY3VtZW50YXRpb24gZm9yIDxhIGhyZWY9Imh0dHA6Ly9nb2xhbmcub3JnLyI+R288L2E+IHBhY2thZ2VzCm9uIEJpdGJ1Y2tldCwgR2l0SHViLCBHb29nbGUgUHJvamVjdCBIb3N0aW5nIGFuZCBMYXVuY2hwYWQuICBSZWFkIHRoZSA8YQogIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dCBQYWdlPC9hPiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYWRkaW5nIHBhY2thZ2VzIHRvIEdvRG9jCmFuZCBtb3JlLgoKPGRpdiBjbGFzcz0icm93Ij4KICA8ZGl2IGNsYXNzPSJjb2wtc20tNiI+CiAgICAKICAgICAgPGg0PlBvcHVsYXIgUGFja2FnZXM8L2g0PgogICAgICA8dWwgY2xhc3M9Imxpc3QtdW5zdHlsZWQiPgogICAgICAgIDxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1nby9hd3MiPmdpdGh1Yi5jb20vYXdzL2F3cy1zZGstZ28vYXdzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9kZ3JpamFsdmEvand0LWdvIj5naXRodWIuY29tL2RncmlqYWx2YS9qd3QtZ288L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dpbi1nb25pYy9naW4iPmdpdGh1Yi5jb20vZ2luLWdvbmljL2dpbjwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXMiPmdpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dvLXNxbC1kcml2ZXIvbXlzcWwiPmdpdGh1Yi5jb20vZ28tc3FsLWRyaXZlci9teXNxbDwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29sYW5nL3Byb3RvYnVmL3Byb3RvIj5naXRodWIuY29tL2dvbGFuZy9wcm90b2J1Zi9wcm90bzwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29tb2R1bGUvcmVkaWdvL3JlZGlzIj5naXRodWIuY29tL2dvbW9kdWxlL3JlZGlnby9yZWRpczwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQiPmdpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQ8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltIj5naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9qaW56aHUvZ29ybSI+Z2l0aHViLmNvbS9qaW56aHUvZ29ybTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vbGliL3BxIj5naXRodWIuY29tL2xpYi9wcTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcGtnL2Vycm9ycyI+Z2l0aHViLmNvbS9wa2cvZXJyb3JzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1cyI+Z2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1czwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcm9iZmlnL2Nyb24iPmdpdGh1Yi5jb20vcm9iZmlnL2Nyb248L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3NpcnVwc2VuL2xvZ3J1cyI+Z2l0aHViLmNvbS9zaXJ1cHNlbi9sb2dydXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0Ij5naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0PC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS91bml4cGlja2xlL2thaG9vdC1oYWNrIj5naXRodWIuY29tL3VuaXhwaWNrbGUva2Fob290LWhhY2s8L2E+PGxpPjxhIGhyZWY9Ii9nby51YmVyLm9yZy96YXAiPmdvLnViZXIub3JnL3phcDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9jcnlwdG8vc3NoIj5nb2xhbmcub3JnL3gvY3J5cHRvL3NzaDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9uZXQvY29udGV4dCI+Z29sYW5nLm9yZy94L25ldC9jb250ZXh0PC9hPjxsaT48YSBocmVmPSIvZ29sYW5nLm9yZy94L29hdXRoMiI+Z29sYW5nLm9yZy94L29hdXRoMjwvYT48bGk+PGEgaHJlZj0iL2dvb2dsZS5nb2xhbmcub3JnL2dycGMiPmdvb2dsZS5nb2xhbmcub3JnL2dycGM8L2E+PGxpPjxhIGhyZWY9Ii9nb3BrZy5pbi9tZ28udjIiPmdvcGtnLmluL21nby52MjwvYT48bGk+PGEgaHJlZj0iL2dvcGtnLmluL3lhbWwudjIiPmdvcGtnLmluL3lhbWwudjI8L2E+PGxpPjxhIGhyZWY9Ii9sYWJpeC5vcmcvdjIvbWdvIj5sYWJpeC5vcmcvdjIvbWdvPC9hPgogICAgICA8L3VsPgogICAgCiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sLXNtLTYiPgogICAgPGg0Pk1vcmUgUGFja2FnZXM8L2g0PgogICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIj4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL2dvIj5HbyBTdGFuZGFyZCBQYWNrYWdlczwvYT4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL3N1YnJlcG8iPkdvIFN1Yi1yZXBvc2l0b3J5IFBhY2thZ2VzPC9hPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9nb2xhbmcub3JnL3dpa2kvUHJvamVjdHMiPlByb2plY3RzIEAgZ28td2lraTwvYT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zZWFyY2g/bz1kZXNjJmFtcDtxPWxhbmd1YWdlJTNBZ28mYW1wO3M9c3RhcnMmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5Nb3N0IHN0YXJzPC9hPiwgCiAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NlYXJjaD9vPWRlc2MmYW1wO3E9bGFuZ3VhZ2UlM0FnbyZhbXA7cz1mb3JrcyZhbXA7dHlwZT1SZXBvc2l0b3JpZXMiPm1vc3QgZm9ya3M8L2E+LCAKICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2VhcmNoP289ZGVzYyZhbXA7cT1sYW5ndWFnZSUzQWdvJmFtcDtzPXVwZGF0ZWQmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5yZWNlbnRseSB1cGRhdGVkPC9hPiBvbiBHaXRIdWIKICAgIDwvdWw+CiAgPC9kaXY+CjwvZGl2PgoKCjwvZGl2Pgo8ZGl2IGlkPSJ4LWZvb3RlciIgY2xhc3M9ImNsZWFyZml4Ij4KICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2dvbGFuZy9nZGRvL2lzc3VlcyI+V2Vic2l0ZSBJc3N1ZXM8L2E+CiAgICA8c3BhbiBjbGFzcz0idGV4dC1tdXRlZCI+fDwvc3Bhbj4gPGEgaHJlZj0iaHR0cDovL2dvbGFuZy5vcmcvIj5HbyBMYW5ndWFnZTwvYT4KICAgIDxzcGFuIGNsYXNzPSJwdWxsLXJpZ2h0Ij48YSBocmVmPSIjIj5CYWNrIHRvIHRvcDwvYT48L3NwYW4+CiAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ieC1zaG9ydGN1dHMiIHRhYmluZGV4PSItMSIgY2xhc3M9Im1vZGFsIj4KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+CiAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvYnV0dG9uPgogICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+S2V5Ym9hcmQgc2hvcnRjdXRzPC9oND4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4/PC9iPjwvdGQ+PHRkPiA6IFRoaXMgbWVudTwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4vPC9iPjwvdGQ+PHRkPiA6IFNlYXJjaCBzaXRlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5mPC9iPjwvdGQ+PHRkPiA6IEp1bXAgdG8gaWRlbnRpZmllcjwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmc8L2I+PC90ZD48dGQ+IDogR28gdG8gdG9wIG9mIHBhZ2U8L3RkPjwvdHI+CiAgICAgICAgICA8dHI+PHRkIGFsaWduPSJyaWdodCI+PGI+ZzwvYj4gdGhlbiA8Yj5iPC9iPjwvdGQ+PHRkPiA6IEdvIHRvIGVuZCBvZiBwYWdlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmk8L2I+PC90ZD48dGQ+IDogR28gdG8gaW5kZXg8L3RkPjwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9InRleHQtbXV0ZWQiPjx0ZCBhbGlnbj0icmlnaHQiPjxiPmc8L2I+IHRoZW4gPGI+ZTwvYj48L3RkPjx0ZD4gOiBHbyB0byBleGFtcGxlczwvdGQ+PC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KPHNjcmlwdCBzcmM9Ii8tL2pxdWVyeS0yLjAuMy5taW4uanM/dj1mYmY5Yzc3ZDBjNGUzYzM0YTQ4NTk4MGMxZTUzMTZiNjIxMjE2MGM4Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL2Jvb3RzdHJhcC5taW4uanM/dj01YWRhN2MxMDNmYzFkZWFiYzkyNWNjMWZkYmJiNmU0NTFjMjFmYzcwIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL3NpdGUuanM/dj0zNzFkZTczMWMxOGQ5MWM0OTlkOTBiMWFiMGJmMzllY2Y2NmQ2Y2Y3Ij48L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "753" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:09:39 GMT" ], "Etag": [ "CKOf9KifrJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzGZzk3CNIx8sEvPSv5aMt-08pm_KgDZWe8LZLc9JjPrsFEsZRyiteE_1wtqmPZahfG" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItcmVhZGluZy8xNzczOTMyOTc5NzUyODY3Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLXJlYWRpbmciLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1yZWFkaW5nP2dlbmVyYXRpb249MTc3MzkzMjk3OTc1Mjg2NyZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItcmVhZGluZyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjk3OTc1Mjg2NyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjYzNTQiLCJtZDVIYXNoIjoiRDJwOG4vUFQxM0M0OS9vWndxNFowQT09IiwiY3JjMzJjIjoidGR3cmdRPT0iLCJldGFnIjoiQ0tPZjlLaWZySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNTowOTozOS43NTVaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDk6MzkuNzU1WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowOTozOS43NTVaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MDk6MzkuNzU1WiJ9" } }, { "ID": "a34e186fff685697", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "6354" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:09:39 GMT" ], "Etag": [ "\"0f6a7c9ff3d3d770b8f7fa19c2ae19d0\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:09:39 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932979752867" ], "X-Goog-Hash": [ "crc32c=tdwrgQ==", "md5=D2p8n/PT13C49/oZwq4Z0A==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "6354" ], "X-Guploader-Uploadid": [ "AGQBYWxOt9_7H4haZQLzZ2dWvCeu-gdXofCPJhT_2Bw2ai03D1hZXKUfGgm7-oJF-SXVBMBV" ] }, "Body": "PCFET0NUWVBFIGh0bWw+PGh0bWwgbGFuZz0iZW4iPgo8aGVhZCBwcm9maWxlPSJodHRwOi8vYTkuY29tLy0vc3BlYy9vcGVuc2VhcmNoLzEuMS8iPgogIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgPGxpbmsgaHJlZj0iLy0vYm9vdHN0cmFwLm1pbi5jc3M/dj04YmVjMWJiYTNlMjNlY2JhMjJjZmZiMTk3YTJkNDQwYWY0MTBiMTVkIiByZWw9InN0eWxlc2hlZXQiPgogIDxsaW5rIGhyZWY9Ii8tL3NpdGUuY3NzP3Y9N2Q4MWY0MTA0Yzg5ZGJlMzc2MzQ1ZjZiZmUzZTYyYjRlNDBkM2QwNiIgcmVsPSJzdHlsZXNoZWV0Ij4KICA8dGl0bGU+R29Eb2M8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5Pgo8bmF2IGNsYXNzPSJuYXZiYXIgbmF2YmFyLWRlZmF1bHQiIHJvbGU9Im5hdmlnYXRpb24iPgogIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgPGRpdiBjbGFzcz0ibmF2YmFyLWhlYWRlciI+CiAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Im5hdmJhci10b2dnbGUiIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSIgZGF0YS10YXJnZXQ9Ii5uYXZiYXItY29sbGFwc2UiPgogICAgICA8c3BhbiBjbGFzcz0ic3Itb25seSI+VG9nZ2xlIG5hdmlnYXRpb248L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iaWNvbi1iYXIiPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9Imljb24tYmFyIj48L3NwYW4+CiAgICA8L2J1dHRvbj4KICAgIDxhIGNsYXNzPSJuYXZiYXItYnJhbmQiIGhyZWY9Ii8iPjxzdHJvbmc+R29Eb2M8L3N0cm9uZz48L2E+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlIj4KICAgIDx1bCBjbGFzcz0ibmF2IG5hdmJhci1uYXYiPgogICAgICAgIDxsaSBjbGFzcz0iYWN0aXZlIj48YSBocmVmPSIvIj5Ib21lPC9hPjwvbGk+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dDwvYT48L2xpPgogICAgPC91bD4KICAgIDxmb3JtIGNsYXNzPSJuYXZiYXItbmF2IG5hdmJhci1mb3JtIG5hdmJhci1yaWdodCIgaWQ9Ingtc2VhcmNoIiBhY3Rpb249Ii8iIHJvbGU9InNlYXJjaCI+PGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJ4LXNlYXJjaC1xdWVyeSIgdHlwZT0idGV4dCIgbmFtZT0icSIgcGxhY2Vob2xkZXI9IlNlYXJjaCI+PC9mb3JtPgogIDwvZGl2Pgo8L2Rpdj4KPC9uYXY+CjxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgCjxkaXYgY2xhc3M9Imp1bWJvdHJvbiI+CiAgICA8aDI+U2VhcmNoIGZvciBHbyBQYWNrYWdlczwvaDI+CiAgICAKICA8Zm9ybT4KICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5hbWU9InEiIGF1dG9mb2N1cz0iYXV0b2ZvY3VzIiB2YWx1ZT0iIiBwbGFjZWhvbGRlcj0iU2VhcmNoIGZvciBwYWNrYWdlIGJ5IGltcG9ydCBwYXRoIG9yIGtleXdvcmQuIiB0eXBlPSJ0ZXh0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImlucHV0LWdyb3VwLWJ0biI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IiB0eXBlPSJzdWJtaXQiPkdvITwvYnV0dG9uPgogICAgICA8L3NwYW4+CiAgICA8L2Rpdj4KICA8L2Zvcm0+Cgo8L2Rpdj4KCjxwPkdvRG9jIGhvc3RzIGRvY3VtZW50YXRpb24gZm9yIDxhIGhyZWY9Imh0dHA6Ly9nb2xhbmcub3JnLyI+R288L2E+IHBhY2thZ2VzCm9uIEJpdGJ1Y2tldCwgR2l0SHViLCBHb29nbGUgUHJvamVjdCBIb3N0aW5nIGFuZCBMYXVuY2hwYWQuICBSZWFkIHRoZSA8YQogIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dCBQYWdlPC9hPiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYWRkaW5nIHBhY2thZ2VzIHRvIEdvRG9jCmFuZCBtb3JlLgoKPGRpdiBjbGFzcz0icm93Ij4KICA8ZGl2IGNsYXNzPSJjb2wtc20tNiI+CiAgICAKICAgICAgPGg0PlBvcHVsYXIgUGFja2FnZXM8L2g0PgogICAgICA8dWwgY2xhc3M9Imxpc3QtdW5zdHlsZWQiPgogICAgICAgIDxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1nby9hd3MiPmdpdGh1Yi5jb20vYXdzL2F3cy1zZGstZ28vYXdzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9kZ3JpamFsdmEvand0LWdvIj5naXRodWIuY29tL2RncmlqYWx2YS9qd3QtZ288L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dpbi1nb25pYy9naW4iPmdpdGh1Yi5jb20vZ2luLWdvbmljL2dpbjwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXMiPmdpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dvLXNxbC1kcml2ZXIvbXlzcWwiPmdpdGh1Yi5jb20vZ28tc3FsLWRyaXZlci9teXNxbDwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29sYW5nL3Byb3RvYnVmL3Byb3RvIj5naXRodWIuY29tL2dvbGFuZy9wcm90b2J1Zi9wcm90bzwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29tb2R1bGUvcmVkaWdvL3JlZGlzIj5naXRodWIuY29tL2dvbW9kdWxlL3JlZGlnby9yZWRpczwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQiPmdpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQ8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltIj5naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9qaW56aHUvZ29ybSI+Z2l0aHViLmNvbS9qaW56aHUvZ29ybTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vbGliL3BxIj5naXRodWIuY29tL2xpYi9wcTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcGtnL2Vycm9ycyI+Z2l0aHViLmNvbS9wa2cvZXJyb3JzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1cyI+Z2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1czwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcm9iZmlnL2Nyb24iPmdpdGh1Yi5jb20vcm9iZmlnL2Nyb248L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3NpcnVwc2VuL2xvZ3J1cyI+Z2l0aHViLmNvbS9zaXJ1cHNlbi9sb2dydXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0Ij5naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0PC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS91bml4cGlja2xlL2thaG9vdC1oYWNrIj5naXRodWIuY29tL3VuaXhwaWNrbGUva2Fob290LWhhY2s8L2E+PGxpPjxhIGhyZWY9Ii9nby51YmVyLm9yZy96YXAiPmdvLnViZXIub3JnL3phcDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9jcnlwdG8vc3NoIj5nb2xhbmcub3JnL3gvY3J5cHRvL3NzaDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9uZXQvY29udGV4dCI+Z29sYW5nLm9yZy94L25ldC9jb250ZXh0PC9hPjxsaT48YSBocmVmPSIvZ29sYW5nLm9yZy94L29hdXRoMiI+Z29sYW5nLm9yZy94L29hdXRoMjwvYT48bGk+PGEgaHJlZj0iL2dvb2dsZS5nb2xhbmcub3JnL2dycGMiPmdvb2dsZS5nb2xhbmcub3JnL2dycGM8L2E+PGxpPjxhIGhyZWY9Ii9nb3BrZy5pbi9tZ28udjIiPmdvcGtnLmluL21nby52MjwvYT48bGk+PGEgaHJlZj0iL2dvcGtnLmluL3lhbWwudjIiPmdvcGtnLmluL3lhbWwudjI8L2E+PGxpPjxhIGhyZWY9Ii9sYWJpeC5vcmcvdjIvbWdvIj5sYWJpeC5vcmcvdjIvbWdvPC9hPgogICAgICA8L3VsPgogICAgCiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sLXNtLTYiPgogICAgPGg0Pk1vcmUgUGFja2FnZXM8L2g0PgogICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIj4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL2dvIj5HbyBTdGFuZGFyZCBQYWNrYWdlczwvYT4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL3N1YnJlcG8iPkdvIFN1Yi1yZXBvc2l0b3J5IFBhY2thZ2VzPC9hPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9nb2xhbmcub3JnL3dpa2kvUHJvamVjdHMiPlByb2plY3RzIEAgZ28td2lraTwvYT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zZWFyY2g/bz1kZXNjJmFtcDtxPWxhbmd1YWdlJTNBZ28mYW1wO3M9c3RhcnMmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5Nb3N0IHN0YXJzPC9hPiwgCiAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NlYXJjaD9vPWRlc2MmYW1wO3E9bGFuZ3VhZ2UlM0FnbyZhbXA7cz1mb3JrcyZhbXA7dHlwZT1SZXBvc2l0b3JpZXMiPm1vc3QgZm9ya3M8L2E+LCAKICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2VhcmNoP289ZGVzYyZhbXA7cT1sYW5ndWFnZSUzQWdvJmFtcDtzPXVwZGF0ZWQmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5yZWNlbnRseSB1cGRhdGVkPC9hPiBvbiBHaXRIdWIKICAgIDwvdWw+CiAgPC9kaXY+CjwvZGl2PgoKCjwvZGl2Pgo8ZGl2IGlkPSJ4LWZvb3RlciIgY2xhc3M9ImNsZWFyZml4Ij4KICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2dvbGFuZy9nZGRvL2lzc3VlcyI+V2Vic2l0ZSBJc3N1ZXM8L2E+CiAgICA8c3BhbiBjbGFzcz0idGV4dC1tdXRlZCI+fDwvc3Bhbj4gPGEgaHJlZj0iaHR0cDovL2dvbGFuZy5vcmcvIj5HbyBMYW5ndWFnZTwvYT4KICAgIDxzcGFuIGNsYXNzPSJwdWxsLXJpZ2h0Ij48YSBocmVmPSIjIj5CYWNrIHRvIHRvcDwvYT48L3NwYW4+CiAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ieC1zaG9ydGN1dHMiIHRhYmluZGV4PSItMSIgY2xhc3M9Im1vZGFsIj4KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+CiAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvYnV0dG9uPgogICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+S2V5Ym9hcmQgc2hvcnRjdXRzPC9oND4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4/PC9iPjwvdGQ+PHRkPiA6IFRoaXMgbWVudTwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4vPC9iPjwvdGQ+PHRkPiA6IFNlYXJjaCBzaXRlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5mPC9iPjwvdGQ+PHRkPiA6IEp1bXAgdG8gaWRlbnRpZmllcjwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmc8L2I+PC90ZD48dGQ+IDogR28gdG8gdG9wIG9mIHBhZ2U8L3RkPjwvdHI+CiAgICAgICAgICA8dHI+PHRkIGFsaWduPSJyaWdodCI+PGI+ZzwvYj4gdGhlbiA8Yj5iPC9iPjwvdGQ+PHRkPiA6IEdvIHRvIGVuZCBvZiBwYWdlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmk8L2I+PC90ZD48dGQ+IDogR28gdG8gaW5kZXg8L3RkPjwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9InRleHQtbXV0ZWQiPjx0ZCBhbGlnbj0icmlnaHQiPjxiPmc8L2I+IHRoZW4gPGI+ZTwvYj48L3RkPjx0ZD4gOiBHbyB0byBleGFtcGxlczwvdGQ+PC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KPHNjcmlwdCBzcmM9Ii8tL2pxdWVyeS0yLjAuMy5taW4uanM/dj1mYmY5Yzc3ZDBjNGUzYzM0YTQ4NTk4MGMxZTUzMTZiNjIxMjE2MGM4Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL2Jvb3RzdHJhcC5taW4uanM/dj01YWRhN2MxMDNmYzFkZWFiYzkyNWNjMWZkYmJiNmU0NTFjMjFmYzcwIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL3NpdGUuanM/dj0zNzFkZTczMWMxOGQ5MWM0OTlkOTBiMWFiMGJmMzllY2Y2NmQ2Y2Y3Ij48L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+" } }, { "ID": "d416360c0a1f3a6c", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-reading?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:09:39 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzJ7JKzik3kiKAsYhCmfNLhN8GaXPXjHmqF1QPpTDgZm874wq1SWvS5DIpIiH9NwqRZ" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestWrite/Content_md5_did_not_match,_blob_existed.replay ================================================ { "Initial": "AQAAAA7hTgjaDYYI8QAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "19710977355166a4", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-reading\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoidy9yL1hBPT0iLCJtZDVIYXNoIjoiZEg5Qi9TY1A3QnVDdmdNTXdjMUlBUT09IiwibmFtZSI6ImJsb2ItZm9yLXJlYWRpbmcifQo=", "ZXhpc3RpbmcgY29udGVudA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "793" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:10:18 GMT" ], "Etag": [ "COb0qbufrJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzDzxTrM-fpLdi9wQ6M3RumuGPBBdy_0tlUzSUREJS99FND2RIDI3-oJ7chyVxFt5hwWlZI5tk" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItcmVhZGluZy8xNzczOTMzMDE4MzgwOTAyIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLXJlYWRpbmciLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1yZWFkaW5nP2dlbmVyYXRpb249MTc3MzkzMzAxODM4MDkwMiZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItcmVhZGluZyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMzAxODM4MDkwMiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjE2IiwibWQ1SGFzaCI6ImRIOUIvU2NQN0J1Q3ZnTU13YzFJQVE9PSIsImNyYzMyYyI6Incvci9YQT09IiwiZXRhZyI6IkNPYjBxYnVmckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MTA6MTguMzgzWiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjEwOjE4LjM4M1oiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MTA6MTguMzgzWiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjEwOjE4LjM4M1oifQ==" } }, { "ID": "e15fc375bbc607d7", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "16" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:10:18 GMT" ], "Etag": [ "\"747f41fd270fec1b82be030cc1cd4801\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:10:18 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933018380902" ], "X-Goog-Hash": [ "crc32c=w/r/XA==", "md5=dH9B/ScP7BuCvgMMwc1IAQ==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "16" ], "X-Guploader-Uploadid": [ "AGQBYWwSzA0Fdd2tCY4hwHjzyZSpjPtlj0C6fBy7UTqjXZN0P6OVUa_U4puD7jDhxQI21YdtoCGd5jc" ] }, "Body": "ZXhpc3RpbmcgY29udGVudA==" } }, { "ID": "bd6e62728fbb9327", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-reading?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:10:18 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzHPKED3KXzAV08Lg8zYQGsq-32sGcag8pMKkw70WzRa3q74db-4QNcn3TCcB0oMJX9olaWCr8" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestWrite/Content_md5_did_not_match.replay ================================================ { "Initial": "AQAAAA7hTgjZIK5pKgAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "1e805c9cc65e2eef", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "204" ], "Content-Type": [ "application/xml; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:10:18 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "X-Guploader-Uploadid": [ "AGQBYWwlJpTxjMYS6TAed1YSmC8Ssk16T8eNfMb6jFF7ha_78DA_gyJEqQkhXupktiZzfv8q8KLC_qs" ] }, "Body": "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+Tm9TdWNoS2V5PC9Db2RlPjxNZXNzYWdlPlRoZSBzcGVjaWZpZWQga2V5IGRvZXMgbm90IGV4aXN0LjwvTWVzc2FnZT48RGV0YWlscz5ObyBzdWNoIG9iamVjdDogZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1yZWFkaW5nPC9EZXRhaWxzPjwvRXJyb3I+" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestWrite/Content_md5_match.replay ================================================ { "Initial": "AQAAAA7hTgi0GJ5A8gAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "3486145698d2d8a6", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-reading\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoieVpSbHFnPT0iLCJtZDVIYXNoIjoiWHJZN3UrQWU3dENUeXlLN2oxck53dz09IiwibmFtZSI6ImJsb2ItZm9yLXJlYWRpbmcifQo=", "aGVsbG8gd29ybGQ=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "793" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:09:40 GMT" ], "Etag": [ "CO7XpKmfrJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyeWVRAr2Ytx48GNHI7M7TzAsyePkj8_p2b-ZnAKKXQ8zOOJ_-9WXgZCQ65JjR4UnSk" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItcmVhZGluZy8xNzczOTMyOTgwNTQ2NTQyIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLXJlYWRpbmciLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1yZWFkaW5nP2dlbmVyYXRpb249MTc3MzkzMjk4MDU0NjU0MiZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItcmVhZGluZyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjk4MDU0NjU0MiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjExIiwibWQ1SGFzaCI6IlhyWTd1K0FlN3RDVHl5SzdqMXJOd3c9PSIsImNyYzMyYyI6InlaUmxxZz09IiwiZXRhZyI6IkNPN1hwS21mckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDk6NDAuNTQ5WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA5OjQwLjU0OVoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDk6NDAuNTQ5WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA5OjQwLjU0OVoifQ==" } }, { "ID": "b97677941fbbb9cd", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:09:40 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:09:40 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932980546542" ], "X-Goog-Hash": [ "crc32c=yZRlqg==", "md5=XrY7u+Ae7tCTyyK7j1rNww==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "11" ], "X-Guploader-Uploadid": [ "AGQBYWwQMAKukbPxEn3m5GsRjjk10a0b92AAgOKIaIZe8-uCefhszw3Eph_TD_De3DLlfW8E" ] }, "Body": "aGVsbG8gd29ybGQ=" } }, { "ID": "a67464dd7808a87b", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-reading?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:09:40 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWz1oDw02QTBJLmy_34TajL7PSJh8ceovBqdYot5pdNEKbRde-PmgwQrbicPsXAoGF0F" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestWrite/a_large_jpg_file_gets_a_ContentType.replay ================================================ { "Initial": "AQAAAA7hTgi1GeLAGwAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "b01fe49a1a2082e7", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-reading\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "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NQu4GCulv823Pv06iufTwprfjG5W58Q3MogJ3LaoNqICOAMEg/jXTaP8OdL0rGyEO3AJZF6D6D9a7K3sY4YgqggAYHtQBmaJ4fs9MiAgt40AGMquDW6IxwMUJGFGOcVJQA3aDTsUUUAFFFFABRRRQAUhGaWigBoQA5Ap1FFABRRRQAUCiigAooooAKKKKAAdKKKKACiiigAooooAKKKKACiiigAooooAKKKKACqOsI0mlXMaruLRsuMZ6j0q9TZF3IRQB5N8MtV8m1n06RGSWGZsfJtDDPXpivSJNSMcO5oyD7mvHPElmngbxu+pmCeSyuvmHlE4Ru4wBirt/wCNZvEMS6X4dtrl5Z12POQcRDHp60Ac5I7+Lvi7LeQITHbuqAhdwwvGa+h7ddsCA9QK4b4f+B/+Ecs/MnObmU7nAOQDXfAYFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAIRmloooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBpUHtVdrRCc4HtVqigCi+nwsclAe4JFQvpFs64aFDnrkVpkUY6UAYf/COaeIti2cIUnLARjBP/wCupl0S0QkLbxjPXCjmtbAoxzQBSWxiRQAg4wOlWBbopGB0qUCloAjVMAVJRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRSY96AFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCpf6baanavbXcKSwv95WHWqml+HNM0hStlaxxAnJ2jqa1qKAAADoKKKKACiiigAooooAKKKKACiiigAooooAKKTNLQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRQKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKO9FGOaACiiigAopAR0zzS0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFGc0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFIeKKKAFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKQnkCiigBaKKKACiiigAooooAKKKKACiiigAooooA//Z" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "781" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:09:41 GMT" ], "Etag": [ "CNLM46mfrJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWx5pfV-tG_fs_Bl-opMAf54EowvSvXJhtRVM8ZlnvGE4vSgSMroDGvpQmfOIT-HV2YX" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItcmVhZGluZy8xNzczOTMyOTgxNTc3Mjk4Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLXJlYWRpbmciLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1yZWFkaW5nP2dlbmVyYXRpb249MTc3MzkzMjk4MTU3NzI5OCZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItcmVhZGluZyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjk4MTU3NzI5OCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiaW1hZ2UvanBlZyIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjM4NDMwIiwibWQ1SGFzaCI6Ill0US9vZzV3djZIOXNpVVEwY0JnMGc9PSIsImNyYzMyYyI6IitEWE5MUT09IiwiZXRhZyI6IkNOTE00Nm1mckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDk6NDEuNTg2WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA5OjQxLjU4NloiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDk6NDEuNTg2WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA5OjQxLjU4NloifQ==" } }, { "ID": "5b16fe8a5550d994", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "38430" ], "Content-Type": [ "image/jpeg" ], "Date": [ "Thu, 19 Mar 2026 15:09:41 GMT" ], "Etag": [ "\"62d43fa20e70bfa1fdb22510d1c060d2\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:09:41 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932981577298" ], "X-Goog-Hash": [ "crc32c=+DXNLQ==", "md5=YtQ/og5wv6H9siUQ0cBg0g==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "38430" ], "X-Guploader-Uploadid": [ "AGQBYWyelGgxkBdmoBoOYQw-O-BLQdL2zgbDtiCo4PxByl9eBU3tJ9c4r84oqZNZy3U-EIYM" ] }, "Body": "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NQu4GCulv823Pv06iufTwprfjG5W58Q3MogJ3LaoNqICOAMEg/jXTaP8OdL0rGyEO3AJZF6D6D9a7K3sY4YgqggAYHtQBmaJ4fs9MiAgt40AGMquDW6IxwMUJGFGOcVJQA3aDTsUUUAFFFFABRRRQAUhGaWigBoQA5Ap1FFABRRRQAUCiigAooooAKKKKAAdKKKKACiiigAooooAKKKKACiiigAooooAKKKKACqOsI0mlXMaruLRsuMZ6j0q9TZF3IRQB5N8MtV8m1n06RGSWGZsfJtDDPXpivSJNSMcO5oyD7mvHPElmngbxu+pmCeSyuvmHlE4Ru4wBirt/wCNZvEMS6X4dtrl5Z12POQcRDHp60Ac5I7+Lvi7LeQITHbuqAhdwwvGa+h7ddsCA9QK4b4f+B/+Ecs/MnObmU7nAOQDXfAYFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAIRmloooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBpUHtVdrRCc4HtVqigCi+nwsclAe4JFQvpFs64aFDnrkVpkUY6UAYf/COaeIti2cIUnLARjBP/wCupl0S0QkLbxjPXCjmtbAoxzQBSWxiRQAg4wOlWBbopGB0qUCloAjVMAVJRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRSY96AFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCpf6baanavbXcKSwv95WHWqml+HNM0hStlaxxAnJ2jqa1qKAAADoKKKKACiiigAooooAKKKKACiiigAooooAKKTNLQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRQKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKO9FGOaACiiigAopAR0zzS0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFGc0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFIeKKKAFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKQnkCiigBaKKKACiiigAooooAKKKKACiiigAooooA//Z" } }, { "ID": "30a56fd3478f12a2", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-reading?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "781" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:09:41 GMT" ], "Etag": [ "CNLM46mfrJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwUcmTG-JXZKXnw_klOKlCjrk4JFXk1zeQT5FRMIOe-vVnraxh6be_g9krcwHpL4rM2" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItcmVhZGluZy8xNzczOTMyOTgxNTc3Mjk4Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLXJlYWRpbmciLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1yZWFkaW5nP2dlbmVyYXRpb249MTc3MzkzMjk4MTU3NzI5OCZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItcmVhZGluZyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjk4MTU3NzI5OCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiaW1hZ2UvanBlZyIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjM4NDMwIiwibWQ1SGFzaCI6Ill0US9vZzV3djZIOXNpVVEwY0JnMGc9PSIsImNyYzMyYyI6IitEWE5MUT09IiwiZXRhZyI6IkNOTE00Nm1mckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDk6NDEuNTg2WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA5OjQxLjU4NloiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDk6NDEuNTg2WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA5OjQxLjU4NloifQ==" } }, { "ID": "01f64fc2bdfde26a", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-reading?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:09:41 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyfWIEPSmBTL93926TnrASpVGD501elEkC4WB4MRIc4o2TBQFa9u4tqF7NW4B9YgNlg" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestWrite/a_large_jpg_file_written_in_two_chunks_gets_a_ContentType.replay ================================================ { "Initial": "AQAAAA7hTgjkOY5JngAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "3936c4e292454a5e", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-reading\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "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NQu4GCulv823Pv06iufTwprfjG5W58Q3MogJ3LaoNqICOAMEg/jXTaP8OdL0rGyEO3AJZF6D6D9a7K3sY4YgqggAYHtQBmaJ4fs9MiAgt40AGMquDW6IxwMUJGFGOcVJQA3aDTsUUUAFFFFABRRRQAUhGaWigBoQA5Ap1FFABRRRQAUCiigAooooAKKKKAAdKKKKACiiigAooooAKKKKACiiigAooooAKKKKACqOsI0mlXMaruLRsuMZ6j0q9TZF3IRQB5N8MtV8m1n06RGSWGZsfJtDDPXpivSJNSMcO5oyD7mvHPElmngbxu+pmCeSyuvmHlE4Ru4wBirt/wCNZvEMS6X4dtrl5Z12POQcRDHp60Ac5I7+Lvi7LeQITHbuqAhdwwvGa+h7ddsCA9QK4b4f+B/+Ecs/MnObmU7nAOQDXfAYFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAIRmloooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBpUHtVdrRCc4HtVqigCi+nwsclAe4JFQvpFs64aFDnrkVpkUY6UAYf/COaeIti2cIUnLARjBP/wCupl0S0QkLbxjPXCjmtbAoxzQBSWxiRQAg4wOlWBbopGB0qUCloAjVMAVJRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRSY96AFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCpf6baanavbXcKSwv95WHWqml+HNM0hStlaxxAnJ2jqa1qKAAADoKKKKACiiigAooooAKKKKACiiigAooooAKKTNLQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRQKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKO9FGOaACiiigAopAR0zzS0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFGc0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFIeKKKAFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKQnkCiigBaKKKACiiigAooooAKKKKACiiigAooooA//Z" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "781" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:10:29 GMT" ], "Etag": [ "CL76vcCfrJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzECxZQkq1dWkpyMXvu3kAFcGk8mb1990-3S6m81rbS9JidVDRdqiBCBkPDs-mjsQWulvOzL8Q" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItcmVhZGluZy8xNzczOTMzMDI5MTk1MDcwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLXJlYWRpbmciLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1yZWFkaW5nP2dlbmVyYXRpb249MTc3MzkzMzAyOTE5NTA3MCZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItcmVhZGluZyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMzAyOTE5NTA3MCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiaW1hZ2UvanBlZyIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjM4NDMwIiwibWQ1SGFzaCI6Ill0US9vZzV3djZIOXNpVVEwY0JnMGc9PSIsImNyYzMyYyI6IitEWE5MUT09IiwiZXRhZyI6IkNMNzZ2Y0NmckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MTA6MjkuMTk4WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjEwOjI5LjE5OFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MTA6MjkuMTk4WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjEwOjI5LjE5OFoifQ==" } }, { "ID": "d92d1df69603d77e", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "38430" ], "Content-Type": [ "image/jpeg" ], "Date": [ "Thu, 19 Mar 2026 15:10:29 GMT" ], "Etag": [ "\"62d43fa20e70bfa1fdb22510d1c060d2\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:10:29 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773933029195070" ], "X-Goog-Hash": [ "crc32c=+DXNLQ==", "md5=YtQ/og5wv6H9siUQ0cBg0g==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "38430" ], "X-Guploader-Uploadid": [ "AGQBYWyaOwA9XkDFGpU6UtC8Wotg2wb_StpI7ky2cN2jcnsI3GGF_ifRFELbJF1409VOzaE7" ] }, "Body": "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NQu4GCulv823Pv06iufTwprfjG5W58Q3MogJ3LaoNqICOAMEg/jXTaP8OdL0rGyEO3AJZF6D6D9a7K3sY4YgqggAYHtQBmaJ4fs9MiAgt40AGMquDW6IxwMUJGFGOcVJQA3aDTsUUUAFFFFABRRRQAUhGaWigBoQA5Ap1FFABRRRQAUCiigAooooAKKKKAAdKKKKACiiigAooooAKKKKACiiigAooooAKKKKACqOsI0mlXMaruLRsuMZ6j0q9TZF3IRQB5N8MtV8m1n06RGSWGZsfJtDDPXpivSJNSMcO5oyD7mvHPElmngbxu+pmCeSyuvmHlE4Ru4wBirt/wCNZvEMS6X4dtrl5Z12POQcRDHp60Ac5I7+Lvi7LeQITHbuqAhdwwvGa+h7ddsCA9QK4b4f+B/+Ecs/MnObmU7nAOQDXfAYFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAIRmloooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBpUHtVdrRCc4HtVqigCi+nwsclAe4JFQvpFs64aFDnrkVpkUY6UAYf/COaeIti2cIUnLARjBP/wCupl0S0QkLbxjPXCjmtbAoxzQBSWxiRQAg4wOlWBbopGB0qUCloAjVMAVJRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRSY96AFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCpf6baanavbXcKSwv95WHWqml+HNM0hStlaxxAnJ2jqa1qKAAADoKKKKACiiigAooooAKKKKACiiigAooooAKKTNLQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRQKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKO9FGOaACiiigAopAR0zzS0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFGc0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFIeKKKAFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKQnkCiigBaKKKACiiigAooooAKKKKACiiigAooooA//Z" } }, { "ID": "c9fd23fd81901678", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-reading?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "781" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:10:29 GMT" ], "Etag": [ "CL76vcCfrJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWz76yMrUJAzukeaO6QYxzfi9zm6lM9NzkjOl-IJN1DmwY0Qyl0yFxd00rPQiMAj-Qxy" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItcmVhZGluZy8xNzczOTMzMDI5MTk1MDcwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLXJlYWRpbmciLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1yZWFkaW5nP2dlbmVyYXRpb249MTc3MzkzMzAyOTE5NTA3MCZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItcmVhZGluZyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMzAyOTE5NTA3MCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiaW1hZ2UvanBlZyIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjM4NDMwIiwibWQ1SGFzaCI6Ill0US9vZzV3djZIOXNpVVEwY0JnMGc9PSIsImNyYzMyYyI6IitEWE5MUT09IiwiZXRhZyI6IkNMNzZ2Y0NmckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MTA6MjkuMTk4WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjEwOjI5LjE5OFoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MTA6MjkuMTk4WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjEwOjI5LjE5OFoifQ==" } }, { "ID": "4566531cfcf79d94", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-reading?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:10:29 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzzNfoK7igQN2JlWMzvMBfoGhehdiQ8n6FlUG76lTRij6GCz8IAF9RErT4qEr2Ydgdt" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestWrite/a_small_text_file_gets_a_ContentType.replay ================================================ { "Initial": "AQAAAA7hTgi1AJ9BNQAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "2413a57942ec0e7a", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-reading\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoibkhNR1V3PT0iLCJuYW1lIjoiYmxvYi1mb3ItcmVhZGluZyJ9Cg==", "VGhpcyBpcyBhIHRleHQgZmlsZS4=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "793" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:09:41 GMT" ], "Etag": [ "CKvzyamfrJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWw4MJtW-kyZ2VyyREXdraCvfQCHF77XUe9IS7Xduu_2fblDLSjnplqX5EOXeo12ecIj" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItcmVhZGluZy8xNzczOTMyOTgxMTU2MjY3Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLXJlYWRpbmciLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1yZWFkaW5nP2dlbmVyYXRpb249MTc3MzkzMjk4MTE1NjI2NyZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItcmVhZGluZyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjk4MTE1NjI2NyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjIwIiwibWQ1SGFzaCI6IlB6TUpNU3pESmtvVGliTFNZOTdPalE9PSIsImNyYzMyYyI6Im5ITUdVdz09IiwiZXRhZyI6IkNLdnp5YW1mckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDk6NDEuMTU5WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA5OjQxLjE1OVoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDk6NDEuMTU5WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA5OjQxLjE1OVoifQ==" } }, { "ID": "4eb160793d6b3729", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "20" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:09:41 GMT" ], "Etag": [ "\"3f3309312cc3264a1389b2d263dece8d\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:09:41 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932981156267" ], "X-Goog-Hash": [ "crc32c=nHMGUw==", "md5=PzMJMSzDJkoTibLSY97OjQ==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "20" ], "X-Guploader-Uploadid": [ "AGQBYWymWWyLAQN5YACnMebl6Cxp5sAxFDSLC1CRV-3_FmyGaWNSNHuWT5gbuC-j5skaxS16" ] }, "Body": "VGhpcyBpcyBhIHRleHQgZmlsZS4=" } }, { "ID": "14b0757dfdc2630f", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-reading?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "793" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:09:41 GMT" ], "Etag": [ "CKvzyamfrJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyM4h2Ew6X6x6pSvV_48fXZF3ULYs8kiQv3WiP_VE_Dhn43w6SjzA-QV9UaoTOIe-69" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItcmVhZGluZy8xNzczOTMyOTgxMTU2MjY3Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLXJlYWRpbmciLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1yZWFkaW5nP2dlbmVyYXRpb249MTc3MzkzMjk4MTE1NjI2NyZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItcmVhZGluZyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjk4MTE1NjI2NyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjIwIiwibWQ1SGFzaCI6IlB6TUpNU3pESmtvVGliTFNZOTdPalE9PSIsImNyYzMyYyI6Im5ITUdVdz09IiwiZXRhZyI6IkNLdnp5YW1mckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDk6NDEuMTU5WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA5OjQxLjE1OVoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDk6NDEuMTU5WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA5OjQxLjE1OVoifQ==" } }, { "ID": "f05de6d579201da2", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-reading?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 429, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "555" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:09:41 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxx2T4ZQjyHYKHqAYByq4V7ejRFfVuYnpL9MfryKshLmx5Tgk6ez0VIlkLJqmXDWtsC" ] }, "Body": "eyJlcnJvciI6eyJjb2RlIjo0MjksIm1lc3NhZ2UiOiJUaGUgb2JqZWN0IGdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItcmVhZGluZyBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3Igb2JqZWN0IG11dGF0aW9uIG9wZXJhdGlvbnMgKGNyZWF0ZSwgdXBkYXRlLCBhbmQgZGVsZXRlKS4gUGxlYXNlIHJlZHVjZSB5b3VyIHJlcXVlc3QgcmF0ZS4gU2VlIGh0dHBzOi8vY2xvdWQuZ29vZ2xlLmNvbS9zdG9yYWdlL2RvY3MvZ2NzNDI5LiIsImVycm9ycyI6W3sibWVzc2FnZSI6IlRoZSBvYmplY3QgZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1yZWFkaW5nIGV4Y2VlZGVkIHRoZSByYXRlIGxpbWl0IGZvciBvYmplY3QgbXV0YXRpb24gb3BlcmF0aW9ucyAoY3JlYXRlLCB1cGRhdGUsIGFuZCBkZWxldGUpLiBQbGVhc2UgcmVkdWNlIHlvdXIgcmVxdWVzdCByYXRlLiBTZWUgaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL3N0b3JhZ2UvZG9jcy9nY3M0MjkuIiwiZG9tYWluIjoidXNhZ2VMaW1pdHMiLCJyZWFzb24iOiJyYXRlTGltaXRFeGNlZWRlZCJ9XX19" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestWrite/invalid_ContentType_fails.replay ================================================ { "Initial": "AQAAAA7hTgizAiNHZgAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "4bd3a3594fb8afc4", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "204" ], "Content-Type": [ "application/xml; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:09:39 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "X-Guploader-Uploadid": [ "AGQBYWzcsvv-OugNvk3MOWzEkCsFlNSUOD5SSs3r72DRt67Fmr-TzbSq14MAw1ooNtjqzzr-" ] }, "Body": "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+Tm9TdWNoS2V5PC9Db2RlPjxNZXNzYWdlPlRoZSBzcGVjaWZpZWQga2V5IGRvZXMgbm90IGV4aXN0LjwvTWVzc2FnZT48RGV0YWlscz5ObyBzdWNoIG9iamVjdDogZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9ibG9iLWZvci1yZWFkaW5nPC9EZXRhaWxzPjwvRXJyb3I+" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestWrite/no_write_then_close_results_in_empty_blob,_blob_existed.replay ================================================ { "Initial": "AQAAAA7hTgiyKoGwOQAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "f6fcb4403d779a8a", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-reading\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoiQUFBQUFBPT0iLCJuYW1lIjoiYmxvYi1mb3ItcmVhZGluZyJ9Cg==", "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "792" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:09:38 GMT" ], "Etag": [ "CM3gvKifrJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWzo9u5y__x_rK2bbkSvibIuKqR30l93xOzkvf_SM018XdUffiieX1nhtUUfFraD4wVW" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItcmVhZGluZy8xNzczOTMyOTc4ODQzNzI1Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLXJlYWRpbmciLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1yZWFkaW5nP2dlbmVyYXRpb249MTc3MzkzMjk3ODg0MzcyNSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItcmVhZGluZyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjk3ODg0MzcyNSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjAiLCJtZDVIYXNoIjoiMUIyTTJZOEFzZ1RwZ0FtWTdQaENmZz09IiwiY3JjMzJjIjoiQUFBQUFBPT0iLCJldGFnIjoiQ00zZ3ZLaWZySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNTowOTozOC44NDZaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDk6MzguODQ2WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowOTozOC44NDZaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MDk6MzguODQ2WiJ9" } }, { "ID": "3d6d68cb7288806f", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "0" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:09:38 GMT" ], "Etag": [ "\"d41d8cd98f00b204e9800998ecf8427e\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:09:38 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932978843725" ], "X-Goog-Hash": [ "crc32c=AAAAAA==", "md5=1B2M2Y8AsgTpgAmY7PhCfg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "0" ], "X-Guploader-Uploadid": [ "AGQBYWxufJKSPdVTzpsWqToHShwz7UwlHob-IOufsfUC7L22mIGfbWCENs2URWtGqPpGS1fN" ] }, "Body": "" } }, { "ID": "3b70512cee8bea84", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-reading?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:09:39 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxrdmnE90xwMZB2rPxDmQ977hHrcYrn_BkwfVjiI-qtp9OKm82rMxqa9I468Pe9kCFj" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestWrite/no_write_then_close_results_in_empty_blob.replay ================================================ { "Initial": "AQAAAA7hTgiyFmX6HgAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "018582735f6ccaaf", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-reading\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoiQUFBQUFBPT0iLCJuYW1lIjoiYmxvYi1mb3ItcmVhZGluZyJ9Cg==", "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "792" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:09:38 GMT" ], "Etag": [ "CMi7qaifrJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxQaD1cf5KX8C8n7-yDvYB5fiujewnhAn9fems7ZZ6dAHSfnLRanHIsy45aVfu7E_GK" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItcmVhZGluZy8xNzczOTMyOTc4NTI3Njg4Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLXJlYWRpbmciLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1yZWFkaW5nP2dlbmVyYXRpb249MTc3MzkzMjk3ODUyNzY4OCZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItcmVhZGluZyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjk3ODUyNzY4OCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjAiLCJtZDVIYXNoIjoiMUIyTTJZOEFzZ1RwZ0FtWTdQaENmZz09IiwiY3JjMzJjIjoiQUFBQUFBPT0iLCJldGFnIjoiQ01pN3FhaWZySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNTowOTozOC41MzBaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDk6MzguNTMwWiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowOTozOC41MzBaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MDk6MzguNTMwWiJ9" } }, { "ID": "6356d33d1bb41a61", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "0" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:09:38 GMT" ], "Etag": [ "\"d41d8cd98f00b204e9800998ecf8427e\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:09:38 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932978527688" ], "X-Goog-Hash": [ "crc32c=AAAAAA==", "md5=1B2M2Y8AsgTpgAmY7PhCfg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "0" ], "X-Guploader-Uploadid": [ "AGQBYWzf2VSrwviEx_BmlHe-eS09sBmukLMUJgIq8Dvy7RTsHYMGBIkTzSmZ77KJigdzkwDa" ] }, "Body": "" } }, { "ID": "e158555de01bba5d", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-reading?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:09:38 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWx4DfepOlP1JWhxyKReBCPjsIHMDssPzdSgFGBpZOUhBiUvpZhvkDVpWM-WA6hrduz_" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestWrite/write_to_empty_key_fails.replay ================================================ { "Initial": "AQAAAA7hTgiyCvSrTAAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "0c95e5df352c730c", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoiQUFBQUFBPT0ifQo=", "" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "127" ], "Content-Type": [ "text/html; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:09:38 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxdIt4lYN2hoHpAi9lbUQBr6XsHZlNhTD63HeuZx2HKjqkUbO8SL8G4OhMurVE2_57o" ] }, "Body": "eyJlcnJvciI6eyJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJObyBvYmplY3QgbmFtZSIsImVycm9ycyI6W3sibWVzc2FnZSI6Ik5vIG9iamVjdCBuYW1lIiwiZG9tYWluIjoiZ2xvYmFsIiwicmVhc29uIjoicmVxdWlyZWQifV19fQ==" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestConformance/TestWrite/write_with_explicit_ContentType_overrides_discovery.replay ================================================ { "Initial": "AQAAAA7hTgizOLBA/QAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "4264ee6477f5c493", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026name=blob-for-reading\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIiwiY3JjMzJjIjoidGR3cmdRPT0iLCJuYW1lIjoiYmxvYi1mb3ItcmVhZGluZyJ9Cg==", "PCFET0NUWVBFIGh0bWw+PGh0bWwgbGFuZz0iZW4iPgo8aGVhZCBwcm9maWxlPSJodHRwOi8vYTkuY29tLy0vc3BlYy9vcGVuc2VhcmNoLzEuMS8iPgogIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgPGxpbmsgaHJlZj0iLy0vYm9vdHN0cmFwLm1pbi5jc3M/dj04YmVjMWJiYTNlMjNlY2JhMjJjZmZiMTk3YTJkNDQwYWY0MTBiMTVkIiByZWw9InN0eWxlc2hlZXQiPgogIDxsaW5rIGhyZWY9Ii8tL3NpdGUuY3NzP3Y9N2Q4MWY0MTA0Yzg5ZGJlMzc2MzQ1ZjZiZmUzZTYyYjRlNDBkM2QwNiIgcmVsPSJzdHlsZXNoZWV0Ij4KICA8dGl0bGU+R29Eb2M8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5Pgo8bmF2IGNsYXNzPSJuYXZiYXIgbmF2YmFyLWRlZmF1bHQiIHJvbGU9Im5hdmlnYXRpb24iPgogIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgPGRpdiBjbGFzcz0ibmF2YmFyLWhlYWRlciI+CiAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Im5hdmJhci10b2dnbGUiIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSIgZGF0YS10YXJnZXQ9Ii5uYXZiYXItY29sbGFwc2UiPgogICAgICA8c3BhbiBjbGFzcz0ic3Itb25seSI+VG9nZ2xlIG5hdmlnYXRpb248L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iaWNvbi1iYXIiPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9Imljb24tYmFyIj48L3NwYW4+CiAgICA8L2J1dHRvbj4KICAgIDxhIGNsYXNzPSJuYXZiYXItYnJhbmQiIGhyZWY9Ii8iPjxzdHJvbmc+R29Eb2M8L3N0cm9uZz48L2E+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlIj4KICAgIDx1bCBjbGFzcz0ibmF2IG5hdmJhci1uYXYiPgogICAgICAgIDxsaSBjbGFzcz0iYWN0aXZlIj48YSBocmVmPSIvIj5Ib21lPC9hPjwvbGk+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dDwvYT48L2xpPgogICAgPC91bD4KICAgIDxmb3JtIGNsYXNzPSJuYXZiYXItbmF2IG5hdmJhci1mb3JtIG5hdmJhci1yaWdodCIgaWQ9Ingtc2VhcmNoIiBhY3Rpb249Ii8iIHJvbGU9InNlYXJjaCI+PGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJ4LXNlYXJjaC1xdWVyeSIgdHlwZT0idGV4dCIgbmFtZT0icSIgcGxhY2Vob2xkZXI9IlNlYXJjaCI+PC9mb3JtPgogIDwvZGl2Pgo8L2Rpdj4KPC9uYXY+CjxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgCjxkaXYgY2xhc3M9Imp1bWJvdHJvbiI+CiAgICA8aDI+U2VhcmNoIGZvciBHbyBQYWNrYWdlczwvaDI+CiAgICAKICA8Zm9ybT4KICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5hbWU9InEiIGF1dG9mb2N1cz0iYXV0b2ZvY3VzIiB2YWx1ZT0iIiBwbGFjZWhvbGRlcj0iU2VhcmNoIGZvciBwYWNrYWdlIGJ5IGltcG9ydCBwYXRoIG9yIGtleXdvcmQuIiB0eXBlPSJ0ZXh0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImlucHV0LWdyb3VwLWJ0biI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IiB0eXBlPSJzdWJtaXQiPkdvITwvYnV0dG9uPgogICAgICA8L3NwYW4+CiAgICA8L2Rpdj4KICA8L2Zvcm0+Cgo8L2Rpdj4KCjxwPkdvRG9jIGhvc3RzIGRvY3VtZW50YXRpb24gZm9yIDxhIGhyZWY9Imh0dHA6Ly9nb2xhbmcub3JnLyI+R288L2E+IHBhY2thZ2VzCm9uIEJpdGJ1Y2tldCwgR2l0SHViLCBHb29nbGUgUHJvamVjdCBIb3N0aW5nIGFuZCBMYXVuY2hwYWQuICBSZWFkIHRoZSA8YQogIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dCBQYWdlPC9hPiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYWRkaW5nIHBhY2thZ2VzIHRvIEdvRG9jCmFuZCBtb3JlLgoKPGRpdiBjbGFzcz0icm93Ij4KICA8ZGl2IGNsYXNzPSJjb2wtc20tNiI+CiAgICAKICAgICAgPGg0PlBvcHVsYXIgUGFja2FnZXM8L2g0PgogICAgICA8dWwgY2xhc3M9Imxpc3QtdW5zdHlsZWQiPgogICAgICAgIDxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1nby9hd3MiPmdpdGh1Yi5jb20vYXdzL2F3cy1zZGstZ28vYXdzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9kZ3JpamFsdmEvand0LWdvIj5naXRodWIuY29tL2RncmlqYWx2YS9qd3QtZ288L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dpbi1nb25pYy9naW4iPmdpdGh1Yi5jb20vZ2luLWdvbmljL2dpbjwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXMiPmdpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dvLXNxbC1kcml2ZXIvbXlzcWwiPmdpdGh1Yi5jb20vZ28tc3FsLWRyaXZlci9teXNxbDwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29sYW5nL3Byb3RvYnVmL3Byb3RvIj5naXRodWIuY29tL2dvbGFuZy9wcm90b2J1Zi9wcm90bzwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29tb2R1bGUvcmVkaWdvL3JlZGlzIj5naXRodWIuY29tL2dvbW9kdWxlL3JlZGlnby9yZWRpczwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQiPmdpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQ8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltIj5naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9qaW56aHUvZ29ybSI+Z2l0aHViLmNvbS9qaW56aHUvZ29ybTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vbGliL3BxIj5naXRodWIuY29tL2xpYi9wcTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcGtnL2Vycm9ycyI+Z2l0aHViLmNvbS9wa2cvZXJyb3JzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1cyI+Z2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1czwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcm9iZmlnL2Nyb24iPmdpdGh1Yi5jb20vcm9iZmlnL2Nyb248L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3NpcnVwc2VuL2xvZ3J1cyI+Z2l0aHViLmNvbS9zaXJ1cHNlbi9sb2dydXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0Ij5naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0PC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS91bml4cGlja2xlL2thaG9vdC1oYWNrIj5naXRodWIuY29tL3VuaXhwaWNrbGUva2Fob290LWhhY2s8L2E+PGxpPjxhIGhyZWY9Ii9nby51YmVyLm9yZy96YXAiPmdvLnViZXIub3JnL3phcDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9jcnlwdG8vc3NoIj5nb2xhbmcub3JnL3gvY3J5cHRvL3NzaDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9uZXQvY29udGV4dCI+Z29sYW5nLm9yZy94L25ldC9jb250ZXh0PC9hPjxsaT48YSBocmVmPSIvZ29sYW5nLm9yZy94L29hdXRoMiI+Z29sYW5nLm9yZy94L29hdXRoMjwvYT48bGk+PGEgaHJlZj0iL2dvb2dsZS5nb2xhbmcub3JnL2dycGMiPmdvb2dsZS5nb2xhbmcub3JnL2dycGM8L2E+PGxpPjxhIGhyZWY9Ii9nb3BrZy5pbi9tZ28udjIiPmdvcGtnLmluL21nby52MjwvYT48bGk+PGEgaHJlZj0iL2dvcGtnLmluL3lhbWwudjIiPmdvcGtnLmluL3lhbWwudjI8L2E+PGxpPjxhIGhyZWY9Ii9sYWJpeC5vcmcvdjIvbWdvIj5sYWJpeC5vcmcvdjIvbWdvPC9hPgogICAgICA8L3VsPgogICAgCiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sLXNtLTYiPgogICAgPGg0Pk1vcmUgUGFja2FnZXM8L2g0PgogICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIj4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL2dvIj5HbyBTdGFuZGFyZCBQYWNrYWdlczwvYT4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL3N1YnJlcG8iPkdvIFN1Yi1yZXBvc2l0b3J5IFBhY2thZ2VzPC9hPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9nb2xhbmcub3JnL3dpa2kvUHJvamVjdHMiPlByb2plY3RzIEAgZ28td2lraTwvYT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zZWFyY2g/bz1kZXNjJmFtcDtxPWxhbmd1YWdlJTNBZ28mYW1wO3M9c3RhcnMmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5Nb3N0IHN0YXJzPC9hPiwgCiAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NlYXJjaD9vPWRlc2MmYW1wO3E9bGFuZ3VhZ2UlM0FnbyZhbXA7cz1mb3JrcyZhbXA7dHlwZT1SZXBvc2l0b3JpZXMiPm1vc3QgZm9ya3M8L2E+LCAKICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2VhcmNoP289ZGVzYyZhbXA7cT1sYW5ndWFnZSUzQWdvJmFtcDtzPXVwZGF0ZWQmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5yZWNlbnRseSB1cGRhdGVkPC9hPiBvbiBHaXRIdWIKICAgIDwvdWw+CiAgPC9kaXY+CjwvZGl2PgoKCjwvZGl2Pgo8ZGl2IGlkPSJ4LWZvb3RlciIgY2xhc3M9ImNsZWFyZml4Ij4KICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2dvbGFuZy9nZGRvL2lzc3VlcyI+V2Vic2l0ZSBJc3N1ZXM8L2E+CiAgICA8c3BhbiBjbGFzcz0idGV4dC1tdXRlZCI+fDwvc3Bhbj4gPGEgaHJlZj0iaHR0cDovL2dvbGFuZy5vcmcvIj5HbyBMYW5ndWFnZTwvYT4KICAgIDxzcGFuIGNsYXNzPSJwdWxsLXJpZ2h0Ij48YSBocmVmPSIjIj5CYWNrIHRvIHRvcDwvYT48L3NwYW4+CiAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ieC1zaG9ydGN1dHMiIHRhYmluZGV4PSItMSIgY2xhc3M9Im1vZGFsIj4KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+CiAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvYnV0dG9uPgogICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+S2V5Ym9hcmQgc2hvcnRjdXRzPC9oND4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4/PC9iPjwvdGQ+PHRkPiA6IFRoaXMgbWVudTwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4vPC9iPjwvdGQ+PHRkPiA6IFNlYXJjaCBzaXRlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5mPC9iPjwvdGQ+PHRkPiA6IEp1bXAgdG8gaWRlbnRpZmllcjwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmc8L2I+PC90ZD48dGQ+IDogR28gdG8gdG9wIG9mIHBhZ2U8L3RkPjwvdHI+CiAgICAgICAgICA8dHI+PHRkIGFsaWduPSJyaWdodCI+PGI+ZzwvYj4gdGhlbiA8Yj5iPC9iPjwvdGQ+PHRkPiA6IEdvIHRvIGVuZCBvZiBwYWdlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmk8L2I+PC90ZD48dGQ+IDogR28gdG8gaW5kZXg8L3RkPjwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9InRleHQtbXV0ZWQiPjx0ZCBhbGlnbj0icmlnaHQiPjxiPmc8L2I+IHRoZW4gPGI+ZTwvYj48L3RkPjx0ZD4gOiBHbyB0byBleGFtcGxlczwvdGQ+PC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KPHNjcmlwdCBzcmM9Ii8tL2pxdWVyeS0yLjAuMy5taW4uanM/dj1mYmY5Yzc3ZDBjNGUzYzM0YTQ4NTk4MGMxZTUzMTZiNjIxMjE2MGM4Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL2Jvb3RzdHJhcC5taW4uanM/dj01YWRhN2MxMDNmYzFkZWFiYzkyNWNjMWZkYmJiNmU0NTFjMjFmYzcwIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL3NpdGUuanM/dj0zNzFkZTczMWMxOGQ5MWM0OTlkOTBiMWFiMGJmMzllY2Y2NmQ2Y2Y3Ij48L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "786" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:09:40 GMT" ], "Etag": [ "CMWiiamfrJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyWmMFUv5EjqnKkX1RhxNsNzMYKw0CRlzzG_caUbWlGAyO7aqg20EKtYBrW9LftIOZU" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItcmVhZGluZy8xNzczOTMyOTgwMDk3MzQ5Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLXJlYWRpbmciLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1yZWFkaW5nP2dlbmVyYXRpb249MTc3MzkzMjk4MDA5NzM0OSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItcmVhZGluZyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjk4MDA5NzM0OSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiYXBwbGljYXRpb24vanNvbiIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjYzNTQiLCJtZDVIYXNoIjoiRDJwOG4vUFQxM0M0OS9vWndxNFowQT09IiwiY3JjMzJjIjoidGR3cmdRPT0iLCJldGFnIjoiQ01XaWlhbWZySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNTowOTo0MC4wOTlaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDk6NDAuMDk5WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowOTo0MC4wOTlaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MDk6NDAuMDk5WiJ9" } }, { "ID": "1a26b91f5d880175", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/blob-for-reading", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "6354" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:09:40 GMT" ], "Etag": [ "\"0f6a7c9ff3d3d770b8f7fa19c2ae19d0\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:09:40 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932980097349" ], "X-Goog-Hash": [ "crc32c=tdwrgQ==", "md5=D2p8n/PT13C49/oZwq4Z0A==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "6354" ], "X-Guploader-Uploadid": [ "AGQBYWx0Xh1YJAhsKX7XdaoDetbQtCOQz94UtKqza-nxYfDLE9RSyDJKQ3NRt1mHUttlPj7B" ] }, "Body": "PCFET0NUWVBFIGh0bWw+PGh0bWwgbGFuZz0iZW4iPgo8aGVhZCBwcm9maWxlPSJodHRwOi8vYTkuY29tLy0vc3BlYy9vcGVuc2VhcmNoLzEuMS8iPgogIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgPGxpbmsgaHJlZj0iLy0vYm9vdHN0cmFwLm1pbi5jc3M/dj04YmVjMWJiYTNlMjNlY2JhMjJjZmZiMTk3YTJkNDQwYWY0MTBiMTVkIiByZWw9InN0eWxlc2hlZXQiPgogIDxsaW5rIGhyZWY9Ii8tL3NpdGUuY3NzP3Y9N2Q4MWY0MTA0Yzg5ZGJlMzc2MzQ1ZjZiZmUzZTYyYjRlNDBkM2QwNiIgcmVsPSJzdHlsZXNoZWV0Ij4KICA8dGl0bGU+R29Eb2M8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5Pgo8bmF2IGNsYXNzPSJuYXZiYXIgbmF2YmFyLWRlZmF1bHQiIHJvbGU9Im5hdmlnYXRpb24iPgogIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgPGRpdiBjbGFzcz0ibmF2YmFyLWhlYWRlciI+CiAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Im5hdmJhci10b2dnbGUiIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSIgZGF0YS10YXJnZXQ9Ii5uYXZiYXItY29sbGFwc2UiPgogICAgICA8c3BhbiBjbGFzcz0ic3Itb25seSI+VG9nZ2xlIG5hdmlnYXRpb248L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iaWNvbi1iYXIiPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9Imljb24tYmFyIj48L3NwYW4+CiAgICA8L2J1dHRvbj4KICAgIDxhIGNsYXNzPSJuYXZiYXItYnJhbmQiIGhyZWY9Ii8iPjxzdHJvbmc+R29Eb2M8L3N0cm9uZz48L2E+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlIj4KICAgIDx1bCBjbGFzcz0ibmF2IG5hdmJhci1uYXYiPgogICAgICAgIDxsaSBjbGFzcz0iYWN0aXZlIj48YSBocmVmPSIvIj5Ib21lPC9hPjwvbGk+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dDwvYT48L2xpPgogICAgPC91bD4KICAgIDxmb3JtIGNsYXNzPSJuYXZiYXItbmF2IG5hdmJhci1mb3JtIG5hdmJhci1yaWdodCIgaWQ9Ingtc2VhcmNoIiBhY3Rpb249Ii8iIHJvbGU9InNlYXJjaCI+PGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJ4LXNlYXJjaC1xdWVyeSIgdHlwZT0idGV4dCIgbmFtZT0icSIgcGxhY2Vob2xkZXI9IlNlYXJjaCI+PC9mb3JtPgogIDwvZGl2Pgo8L2Rpdj4KPC9uYXY+CjxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgCjxkaXYgY2xhc3M9Imp1bWJvdHJvbiI+CiAgICA8aDI+U2VhcmNoIGZvciBHbyBQYWNrYWdlczwvaDI+CiAgICAKICA8Zm9ybT4KICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5hbWU9InEiIGF1dG9mb2N1cz0iYXV0b2ZvY3VzIiB2YWx1ZT0iIiBwbGFjZWhvbGRlcj0iU2VhcmNoIGZvciBwYWNrYWdlIGJ5IGltcG9ydCBwYXRoIG9yIGtleXdvcmQuIiB0eXBlPSJ0ZXh0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImlucHV0LWdyb3VwLWJ0biI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IiB0eXBlPSJzdWJtaXQiPkdvITwvYnV0dG9uPgogICAgICA8L3NwYW4+CiAgICA8L2Rpdj4KICA8L2Zvcm0+Cgo8L2Rpdj4KCjxwPkdvRG9jIGhvc3RzIGRvY3VtZW50YXRpb24gZm9yIDxhIGhyZWY9Imh0dHA6Ly9nb2xhbmcub3JnLyI+R288L2E+IHBhY2thZ2VzCm9uIEJpdGJ1Y2tldCwgR2l0SHViLCBHb29nbGUgUHJvamVjdCBIb3N0aW5nIGFuZCBMYXVuY2hwYWQuICBSZWFkIHRoZSA8YQogIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dCBQYWdlPC9hPiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYWRkaW5nIHBhY2thZ2VzIHRvIEdvRG9jCmFuZCBtb3JlLgoKPGRpdiBjbGFzcz0icm93Ij4KICA8ZGl2IGNsYXNzPSJjb2wtc20tNiI+CiAgICAKICAgICAgPGg0PlBvcHVsYXIgUGFja2FnZXM8L2g0PgogICAgICA8dWwgY2xhc3M9Imxpc3QtdW5zdHlsZWQiPgogICAgICAgIDxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1nby9hd3MiPmdpdGh1Yi5jb20vYXdzL2F3cy1zZGstZ28vYXdzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9kZ3JpamFsdmEvand0LWdvIj5naXRodWIuY29tL2RncmlqYWx2YS9qd3QtZ288L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dpbi1nb25pYy9naW4iPmdpdGh1Yi5jb20vZ2luLWdvbmljL2dpbjwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXMiPmdpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dvLXNxbC1kcml2ZXIvbXlzcWwiPmdpdGh1Yi5jb20vZ28tc3FsLWRyaXZlci9teXNxbDwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29sYW5nL3Byb3RvYnVmL3Byb3RvIj5naXRodWIuY29tL2dvbGFuZy9wcm90b2J1Zi9wcm90bzwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29tb2R1bGUvcmVkaWdvL3JlZGlzIj5naXRodWIuY29tL2dvbW9kdWxlL3JlZGlnby9yZWRpczwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQiPmdpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQ8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltIj5naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9qaW56aHUvZ29ybSI+Z2l0aHViLmNvbS9qaW56aHUvZ29ybTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vbGliL3BxIj5naXRodWIuY29tL2xpYi9wcTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcGtnL2Vycm9ycyI+Z2l0aHViLmNvbS9wa2cvZXJyb3JzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1cyI+Z2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1czwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcm9iZmlnL2Nyb24iPmdpdGh1Yi5jb20vcm9iZmlnL2Nyb248L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3NpcnVwc2VuL2xvZ3J1cyI+Z2l0aHViLmNvbS9zaXJ1cHNlbi9sb2dydXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0Ij5naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0PC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS91bml4cGlja2xlL2thaG9vdC1oYWNrIj5naXRodWIuY29tL3VuaXhwaWNrbGUva2Fob290LWhhY2s8L2E+PGxpPjxhIGhyZWY9Ii9nby51YmVyLm9yZy96YXAiPmdvLnViZXIub3JnL3phcDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9jcnlwdG8vc3NoIj5nb2xhbmcub3JnL3gvY3J5cHRvL3NzaDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9uZXQvY29udGV4dCI+Z29sYW5nLm9yZy94L25ldC9jb250ZXh0PC9hPjxsaT48YSBocmVmPSIvZ29sYW5nLm9yZy94L29hdXRoMiI+Z29sYW5nLm9yZy94L29hdXRoMjwvYT48bGk+PGEgaHJlZj0iL2dvb2dsZS5nb2xhbmcub3JnL2dycGMiPmdvb2dsZS5nb2xhbmcub3JnL2dycGM8L2E+PGxpPjxhIGhyZWY9Ii9nb3BrZy5pbi9tZ28udjIiPmdvcGtnLmluL21nby52MjwvYT48bGk+PGEgaHJlZj0iL2dvcGtnLmluL3lhbWwudjIiPmdvcGtnLmluL3lhbWwudjI8L2E+PGxpPjxhIGhyZWY9Ii9sYWJpeC5vcmcvdjIvbWdvIj5sYWJpeC5vcmcvdjIvbWdvPC9hPgogICAgICA8L3VsPgogICAgCiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sLXNtLTYiPgogICAgPGg0Pk1vcmUgUGFja2FnZXM8L2g0PgogICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIj4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL2dvIj5HbyBTdGFuZGFyZCBQYWNrYWdlczwvYT4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL3N1YnJlcG8iPkdvIFN1Yi1yZXBvc2l0b3J5IFBhY2thZ2VzPC9hPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9nb2xhbmcub3JnL3dpa2kvUHJvamVjdHMiPlByb2plY3RzIEAgZ28td2lraTwvYT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zZWFyY2g/bz1kZXNjJmFtcDtxPWxhbmd1YWdlJTNBZ28mYW1wO3M9c3RhcnMmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5Nb3N0IHN0YXJzPC9hPiwgCiAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NlYXJjaD9vPWRlc2MmYW1wO3E9bGFuZ3VhZ2UlM0FnbyZhbXA7cz1mb3JrcyZhbXA7dHlwZT1SZXBvc2l0b3JpZXMiPm1vc3QgZm9ya3M8L2E+LCAKICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2VhcmNoP289ZGVzYyZhbXA7cT1sYW5ndWFnZSUzQWdvJmFtcDtzPXVwZGF0ZWQmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5yZWNlbnRseSB1cGRhdGVkPC9hPiBvbiBHaXRIdWIKICAgIDwvdWw+CiAgPC9kaXY+CjwvZGl2PgoKCjwvZGl2Pgo8ZGl2IGlkPSJ4LWZvb3RlciIgY2xhc3M9ImNsZWFyZml4Ij4KICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2dvbGFuZy9nZGRvL2lzc3VlcyI+V2Vic2l0ZSBJc3N1ZXM8L2E+CiAgICA8c3BhbiBjbGFzcz0idGV4dC1tdXRlZCI+fDwvc3Bhbj4gPGEgaHJlZj0iaHR0cDovL2dvbGFuZy5vcmcvIj5HbyBMYW5ndWFnZTwvYT4KICAgIDxzcGFuIGNsYXNzPSJwdWxsLXJpZ2h0Ij48YSBocmVmPSIjIj5CYWNrIHRvIHRvcDwvYT48L3NwYW4+CiAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ieC1zaG9ydGN1dHMiIHRhYmluZGV4PSItMSIgY2xhc3M9Im1vZGFsIj4KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+CiAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvYnV0dG9uPgogICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+S2V5Ym9hcmQgc2hvcnRjdXRzPC9oND4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4/PC9iPjwvdGQ+PHRkPiA6IFRoaXMgbWVudTwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4vPC9iPjwvdGQ+PHRkPiA6IFNlYXJjaCBzaXRlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5mPC9iPjwvdGQ+PHRkPiA6IEp1bXAgdG8gaWRlbnRpZmllcjwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmc8L2I+PC90ZD48dGQ+IDogR28gdG8gdG9wIG9mIHBhZ2U8L3RkPjwvdHI+CiAgICAgICAgICA8dHI+PHRkIGFsaWduPSJyaWdodCI+PGI+ZzwvYj4gdGhlbiA8Yj5iPC9iPjwvdGQ+PHRkPiA6IEdvIHRvIGVuZCBvZiBwYWdlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmk8L2I+PC90ZD48dGQ+IDogR28gdG8gaW5kZXg8L3RkPjwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9InRleHQtbXV0ZWQiPjx0ZCBhbGlnbj0icmlnaHQiPjxiPmc8L2I+IHRoZW4gPGI+ZTwvYj48L3RkPjx0ZD4gOiBHbyB0byBleGFtcGxlczwvdGQ+PC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KPHNjcmlwdCBzcmM9Ii8tL2pxdWVyeS0yLjAuMy5taW4uanM/dj1mYmY5Yzc3ZDBjNGUzYzM0YTQ4NTk4MGMxZTUzMTZiNjIxMjE2MGM4Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL2Jvb3RzdHJhcC5taW4uanM/dj01YWRhN2MxMDNmYzFkZWFiYzkyNWNjMWZkYmJiNmU0NTFjMjFmYzcwIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL3NpdGUuanM/dj0zNzFkZTczMWMxOGQ5MWM0OTlkOTBiMWFiMGJmMzllY2Y2NmQ2Y2Y3Ij48L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+" } }, { "ID": "52132f37d87c333e", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-reading?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "786" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:09:40 GMT" ], "Etag": [ "CMWiiamfrJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWylfv_ux01if_niJKCloNbZFUp49nMDjdSZzbLFudMqRUolILmpzt8x--hhXh6UVt1M" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvYmxvYi1mb3ItcmVhZGluZy8xNzczOTMyOTgwMDk3MzQ5Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL2Jsb2ItZm9yLXJlYWRpbmciLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9ibG9iLWZvci1yZWFkaW5nP2dlbmVyYXRpb249MTc3MzkzMjk4MDA5NzM0OSZhbHQ9bWVkaWEiLCJuYW1lIjoiYmxvYi1mb3ItcmVhZGluZyIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjk4MDA5NzM0OSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiYXBwbGljYXRpb24vanNvbiIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjYzNTQiLCJtZDVIYXNoIjoiRDJwOG4vUFQxM0M0OS9vWndxNFowQT09IiwiY3JjMzJjIjoidGR3cmdRPT0iLCJldGFnIjoiQ01XaWlhbWZySk1ERUFFPSIsInRpbWVDcmVhdGVkIjoiMjAyNi0wMy0xOVQxNTowOTo0MC4wOTlaIiwidXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDk6NDAuMDk5WiIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowOTo0MC4wOTlaIiwidGltZUZpbmFsaXplZCI6IjIwMjYtMDMtMTlUMTU6MDk6NDAuMDk5WiJ9" } }, { "ID": "4aa22efa1e9aff00", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/blob-for-reading?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:09:40 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxODJkohEgExBJ1mBOIgXpx7eieNMKGrMgjGOSutTxuNkLnatnYpH4gSPxjN7RxhPTD" ] }, "Body": "" } } ] } ================================================ FILE: blob/gcsblob/testdata/TestOpenBucket/empty_bucket_name_results_in_error.replay ================================================ { "Initial": "AQAAAA7hTghqKRAU7gAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": null } ================================================ FILE: blob/gcsblob/testdata/TestOpenBucket/success.replay ================================================ { "Initial": "AQAAAA7hTghqKR11MAAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": null } ================================================ FILE: blob/gcsblob/testdata/TestPreconditions.replay ================================================ { "Initial": "AQAAAA7hTghqMdAI5gAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Expires$", "^Signature$", "^X-Goog-Gcs-Idempotency-Token$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^Expires$", "^Signature$" ], "RemoveParams": null }, "Entries": [ { "ID": "2fbe7bdf5b384759", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026ifGenerationMatch=-999\u0026name=precondition-key\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoieVpSbHFnPT0iLCJtZDVIYXNoIjoiWHJZN3UrQWU3dENUeXlLN2oxck53dz09IiwibmFtZSI6InByZWNvbmRpdGlvbi1rZXkifQo=", "aGVsbG8gd29ybGQ=" ] }, "Response": { "StatusCode": 412, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "276" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:26 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyrAnk4beVM0sntt1nwpz0EeEgmJMirS6w8IyC15Ly8P8T8su9W9Kx0tey7iD-FIXiS" ] }, "Body": "eyJlcnJvciI6eyJjb2RlIjo0MTIsIm1lc3NhZ2UiOiJBdCBsZWFzdCBvbmUgb2YgdGhlIHByZS1jb25kaXRpb25zIHlvdSBzcGVjaWZpZWQgZGlkIG5vdCBob2xkLiIsImVycm9ycyI6W3sibWVzc2FnZSI6IkF0IGxlYXN0IG9uZSBvZiB0aGUgcHJlLWNvbmRpdGlvbnMgeW91IHNwZWNpZmllZCBkaWQgbm90IGhvbGQuIiwiZG9tYWluIjoiZ2xvYmFsIiwicmVhc29uIjoiY29uZGl0aW9uTm90TWV0IiwibG9jYXRpb25UeXBlIjoiaGVhZGVyIiwibG9jYXRpb24iOiJJZi1NYXRjaCJ9XX19" } }, { "ID": "3e44aa5404e47cfa", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/upload/storage/v1/b/go-cloud-blob-test-bucket/o?alt=json\u0026ifGenerationMatch=0\u0026name=precondition-key\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwiY3JjMzJjIjoieVpSbHFnPT0iLCJtZDVIYXNoIjoiWHJZN3UrQWU3dENUeXlLN2oxck53dz09IiwibmFtZSI6InByZWNvbmRpdGlvbi1rZXkifQo=", "aGVsbG8gd29ybGQ=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "793" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:27 GMT" ], "Etag": [ "CJahooafrJMDEAE=" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxvUpjSU0dplAHcYBY33CWbRhCnYUAs_TGd1zpBYCdt-s3Kq3lnoYcn02ySTHHt8WEb" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvcHJlY29uZGl0aW9uLWtleS8xNzczOTMyOTA3MTA2NDU0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL3ByZWNvbmRpdGlvbi1rZXkiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9wcmVjb25kaXRpb24ta2V5P2dlbmVyYXRpb249MTc3MzkzMjkwNzEwNjQ1NCZhbHQ9bWVkaWEiLCJuYW1lIjoicHJlY29uZGl0aW9uLWtleSIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjkwNzEwNjQ1NCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjExIiwibWQ1SGFzaCI6IlhyWTd1K0FlN3RDVHl5SzdqMXJOd3c9PSIsImNyYzMyYyI6InlaUmxxZz09IiwiZXRhZyI6IkNKYWhvb2FmckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MjcuMTA5WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjI3LjEwOVoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MjcuMTA5WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjI3LjEwOVoifQ==" } }, { "ID": "8d5e3ddeb63011bd", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/precondition-key?generation=999999", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "204" ], "Content-Type": [ "application/xml; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:27 GMT" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "X-Guploader-Uploadid": [ "AGQBYWw1xkiGE8DE7MmvsW_t90OyyGIJKXslr0lhRyZCeryUXe_NaeHuOZObjbVTM0aUhEnr" ] }, "Body": "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+Tm9TdWNoS2V5PC9Db2RlPjxNZXNzYWdlPlRoZSBzcGVjaWZpZWQga2V5IGRvZXMgbm90IGV4aXN0LjwvTWVzc2FnZT48RGV0YWlscz5ObyBzdWNoIG9iamVjdDogZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9wcmVjb25kaXRpb24ta2V5PC9EZXRhaWxzPjwvRXJyb3I+" } }, { "ID": "af2e3a12a7c1dc13", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/precondition-key?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "793" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:27 GMT" ], "Etag": [ "CJahooafrJMDEAE=" ], "Expires": [ "CLEARED" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWylRvP748v4-XhKtTIFc_jyCd_vUV7uvXqyZaMjcsUGzqA93g1RW_j0baAhYLZY9by-" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvcHJlY29uZGl0aW9uLWtleS8xNzczOTMyOTA3MTA2NDU0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL3ByZWNvbmRpdGlvbi1rZXkiLCJtZWRpYUxpbmsiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9wcmVjb25kaXRpb24ta2V5P2dlbmVyYXRpb249MTc3MzkzMjkwNzEwNjQ1NCZhbHQ9bWVkaWEiLCJuYW1lIjoicHJlY29uZGl0aW9uLWtleSIsImJ1Y2tldCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQiLCJnZW5lcmF0aW9uIjoiMTc3MzkzMjkwNzEwNjQ1NCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInN0b3JhZ2VDbGFzcyI6IlJFR0lPTkFMIiwic2l6ZSI6IjExIiwibWQ1SGFzaCI6IlhyWTd1K0FlN3RDVHl5SzdqMXJOd3c9PSIsImNyYzMyYyI6InlaUmxxZz09IiwiZXRhZyI6IkNKYWhvb2FmckpNREVBRT0iLCJ0aW1lQ3JlYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MjcuMTA5WiIsInVwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjI3LjEwOVoiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMjYtMDMtMTlUMTU6MDg6MjcuMTA5WiIsInRpbWVGaW5hbGl6ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjI3LjEwOVoifQ==" } }, { "ID": "e85e1edd3bc5d0be", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-cloud-blob-test-bucket/precondition-key?generation=1773932907106454", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:27 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Expires": [ "CLEARED" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:08:27 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1773932907106454" ], "X-Goog-Hash": [ "crc32c=yZRlqg==", "md5=XrY7u+Ae7tCTyyK7j1rNww==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "11" ], "X-Guploader-Uploadid": [ "AGQBYWxXj6B-TTSZNbfvFATl6SRNdWacSiMHch4O1BYNkCJkAcgIdeZSPGVdpni4YorZfCGw" ] }, "Body": "aGVsbG8gd29ybGQ=" } }, { "ID": "e344dbc30be9edd9", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/precondition-key/rewriteTo/b/go-cloud-blob-test-bucket/o/precondition-key2?alt=json\u0026ifGenerationMatch=-999\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 412, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "276" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:27 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxShYa72hX1bcWl3FhlC_Jrs8Q0eypd4WMWBdXTyqdG7jYJ9gTFNq_rmGHZCN8FWxWh" ] }, "Body": "eyJlcnJvciI6eyJjb2RlIjo0MTIsIm1lc3NhZ2UiOiJBdCBsZWFzdCBvbmUgb2YgdGhlIHByZS1jb25kaXRpb25zIHlvdSBzcGVjaWZpZWQgZGlkIG5vdCBob2xkLiIsImVycm9ycyI6W3sibWVzc2FnZSI6IkF0IGxlYXN0IG9uZSBvZiB0aGUgcHJlLWNvbmRpdGlvbnMgeW91IHNwZWNpZmllZCBkaWQgbm90IGhvbGQuIiwiZG9tYWluIjoiZ2xvYmFsIiwicmVhc29uIjoiY29uZGl0aW9uTm90TWV0IiwibG9jYXRpb25UeXBlIjoiaGVhZGVyIiwibG9jYXRpb24iOiJJZi1NYXRjaCJ9XX19" } }, { "ID": "f1c49d67fa18672e", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/precondition-key/rewriteTo/b/go-cloud-blob-test-bucket/o/precondition-key2?alt=json\u0026prettyPrint=false\u0026projection=full\u0026sourceGeneration=9999999", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "215" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:27 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWz1H2muHohyQh_Fg-Q42I_LuxF6V6WMGBY-ai88ziXMghsHoh7xOvtZtWb7dAtEGpt2" ] }, "Body": "eyJlcnJvciI6eyJjb2RlIjo0MDQsIm1lc3NhZ2UiOiJObyBzdWNoIG9iamVjdDogZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9wcmVjb25kaXRpb24ta2V5IiwiZXJyb3JzIjpbeyJtZXNzYWdlIjoiTm8gc3VjaCBvYmplY3Q6IGdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvcHJlY29uZGl0aW9uLWtleSIsImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6Im5vdEZvdW5kIn1dfX0=" } }, { "ID": "ffdbb42313a26971", "Request": { "Method": "POST", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/precondition-key/rewriteTo/b/go-cloud-blob-test-bucket/o/precondition-key2?alt=json\u0026ifGenerationMatch=0\u0026prettyPrint=false\u0026projection=full\u0026sourceGeneration=1773932907106454", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "900" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 19 Mar 2026 15:08:27 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWyh0NO4egVXsH5bIqx9XaFh6EDxb4cS7cbsqoSF6q9vdbeN5dbHXYAeiExf6JepSa1e" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiMTEiLCJvYmplY3RTaXplIjoiMTEiLCJkb25lIjp0cnVlLCJyZXNvdXJjZSI6eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvcHJlY29uZGl0aW9uLWtleTIvMTc3MzkzMjkwNzU5MDI1MCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWNsb3VkLWJsb2ItdGVzdC1idWNrZXQvby9wcmVjb25kaXRpb24ta2V5MiIsIm1lZGlhTGluayI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28tY2xvdWQtYmxvYi10ZXN0LWJ1Y2tldC9vL3ByZWNvbmRpdGlvbi1rZXkyP2dlbmVyYXRpb249MTc3MzkzMjkwNzU5MDI1MCZhbHQ9bWVkaWEiLCJuYW1lIjoicHJlY29uZGl0aW9uLWtleTIiLCJidWNrZXQiOiJnby1jbG91ZC1ibG9iLXRlc3QtYnVja2V0IiwiZ2VuZXJhdGlvbiI6IjE3NzM5MzI5MDc1OTAyNTAiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJzdG9yYWdlQ2xhc3MiOiJSRUdJT05BTCIsInNpemUiOiIxMSIsIm1kNUhhc2giOiJYclk3dStBZTd0Q1R5eUs3ajFyTnd3PT0iLCJjcmMzMmMiOiJ5WlJscWc9PSIsImV0YWciOiJDT3JrdjRhZnJKTURFQUU9IiwidGltZUNyZWF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjI3LjU5M1oiLCJ1cGRhdGVkIjoiMjAyNi0wMy0xOVQxNTowODoyNy41OTNaIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDI2LTAzLTE5VDE1OjA4OjI3LjU5M1oiLCJ0aW1lRmluYWxpemVkIjoiMjAyNi0wMy0xOVQxNTowODoyNy41OTNaIn19" } }, { "ID": "1c49bcf27e4899ac", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/precondition-key2?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:27 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWxIK2zGj4-WZch5W_EYCckypgWSBsAyiTi86Kxhmqj1y_81gXHy7rzjIWMobK1Z79qo" ] }, "Body": "" } }, { "ID": "6c257af31f95751c", "Request": { "Method": "DELETE", "URL": "https://storage.googleapis.com/storage/v1/b/go-cloud-blob-test-bucket/o/precondition-key?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ], "X-Goog-Gcs-Idempotency-Token": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:08:27 GMT" ], "Expires": [ "CLEARED" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Uploadid": [ "AGQBYWwW7ou0Uo_65auCGGjfePuMnQzF5tiZDw14CLE581nu2cG4yGcGjDIrndvRpkd36A7n" ] }, "Body": "" } } ] } ================================================ FILE: blob/memblob/example_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package memblob_test import ( "context" "fmt" "log" "gocloud.dev/blob" "gocloud.dev/blob/memblob" ) func ExampleOpenBucket() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // Create an in-memory bucket. bucket := memblob.OpenBucket(nil) defer bucket.Close() // Now we can use bucket to read or write files to the bucket. err := bucket.WriteAll(ctx, "my-key", []byte("hello world"), nil) if err != nil { log.Fatal(err) } data, err := bucket.ReadAll(ctx, "my-key") if err != nil { log.Fatal(err) } fmt.Println(string(data)) // Output: // hello world } func Example_openBucketFromURL() { // blob.OpenBucket creates a *blob.Bucket from a URL. b, err := blob.OpenBucket(context.Background(), "mem://") if err != nil { log.Fatal(err) } defer b.Close() // Now we can use b to read or write files to the container. ctx := context.Background() err = b.WriteAll(ctx, "my-key", []byte("hello world"), nil) if err != nil { log.Fatal(err) } data, err := b.ReadAll(ctx, "my-key") if err != nil { log.Fatal(err) } fmt.Println(string(data)) // Output: // hello world } ================================================ FILE: blob/memblob/memblob.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package memblob provides an in-memory blob implementation. // Use OpenBucket to construct a *blob.Bucket. // // # URLs // // For blob.OpenBucket memblob registers for the scheme "mem". // To customize the URL opener, or for more details on the URL format, // see URLOpener. // See https://gocloud.dev/concepts/urls/ for background information. // // # As // // memblob does not support any types for As. package memblob // import "gocloud.dev/blob/memblob" import ( "bytes" "context" "crypto/md5" "errors" "fmt" "gocloud.dev/internal/gcerr" "hash" "io" "maps" "net/url" "sort" "strings" "sync" "time" "gocloud.dev/blob" "gocloud.dev/blob/driver" "gocloud.dev/gcerrors" ) const defaultPageSize = 1000 var ( errNotFound = errors.New("blob not found") errNotImplemented = errors.New("not implemented") ) func init() { blob.DefaultURLMux().RegisterBucket(Scheme, &URLOpener{}) } // Scheme is the URL scheme memblob registers its URLOpener under on // blob.DefaultMux. const Scheme = "mem" // URLOpener opens URLs like "mem://". // // The following query parameters are supported: // - nomd5: Sets Options.MD5 to true; no value expected (e.g., "memblob://?nomd5"). type URLOpener struct{} // OpenBucketURL opens a blob.Bucket based on u. func (*URLOpener) OpenBucketURL(ctx context.Context, u *url.URL) (*blob.Bucket, error) { opts := Options{} for param := range u.Query() { if param == "nomd5" { opts.NoMD5 = true continue } return nil, fmt.Errorf("open bucket %v: invalid query parameter %q", u, param) } return OpenBucket(&opts), nil } // Options sets options for constructing a *blob.Bucket backed by memory. type Options struct { // Set to true to disable MD5 hashing. The MD5 Attribute won't be available, // but improves write performance. NoMD5 bool } type blobEntry struct { Content []byte Attributes *driver.Attributes } type bucket struct { options Options mu sync.Mutex blobs map[string]*blobEntry } // openBucket creates a driver.Bucket backed by memory. func openBucket(opts *Options) driver.Bucket { if opts == nil { opts = &Options{} } return &bucket{ options: *opts, blobs: map[string]*blobEntry{}, } } // OpenBucket creates a *blob.Bucket backed by memory. func OpenBucket(opts *Options) *blob.Bucket { return blob.NewBucket(openBucket(opts)) } func (b *bucket) Close() error { return nil } func (b *bucket) ErrorCode(err error) gcerrors.ErrorCode { switch err { case errNotFound: return gcerrors.NotFound case errNotImplemented: return gcerrors.Unimplemented default: return gcerrors.Unknown } } // ListPaged implements driver.ListPaged. // The implementation largely mirrors the one in fileblob. func (b *bucket) ListPaged(ctx context.Context, opts *driver.ListOptions) (*driver.ListPage, error) { b.mu.Lock() defer b.mu.Unlock() // pageToken is a returned NextPageToken, set below; it's the last key of the // previous page. var pageToken string if len(opts.PageToken) > 0 { pageToken = string(opts.PageToken) } pageSize := opts.PageSize if pageSize == 0 { pageSize = defaultPageSize } var keys []string for key := range b.blobs { keys = append(keys, key) } sort.Strings(keys) // If opts.Delimiter != "", lastPrefix contains the last "directory" key we // added. It is used to avoid adding it again; all files in this "directory" // are collapsed to the single directory entry. var lastPrefix string var result driver.ListPage for _, key := range keys { // Skip keys that don't match the Prefix. if !strings.HasPrefix(key, opts.Prefix) { continue } entry := b.blobs[key] obj := &driver.ListObject{ Key: key, ModTime: entry.Attributes.ModTime, Size: entry.Attributes.Size, MD5: entry.Attributes.MD5, } // If using Delimiter, collapse "directories". if opts.Delimiter != "" { // Strip the prefix, which may contain Delimiter. keyWithoutPrefix := key[len(opts.Prefix):] // See if the key still contains Delimiter. // If no, it's a file and we just include it. // If yes, it's a file in a "sub-directory" and we want to collapse // all files in that "sub-directory" into a single "directory" result. if idx := strings.Index(keyWithoutPrefix, opts.Delimiter); idx != -1 { prefix := opts.Prefix + keyWithoutPrefix[0:idx+len(opts.Delimiter)] // We've already included this "directory"; don't add it. if prefix == lastPrefix { continue } // Update the object to be a "directory". obj = &driver.ListObject{ Key: prefix, IsDir: true, } lastPrefix = prefix } } // If there's a pageToken, skip anything before it. if pageToken != "" && obj.Key <= pageToken { continue } // If we've already got a full page of results, set NextPageToken and return. if len(result.Objects) == pageSize { result.NextPageToken = []byte(result.Objects[pageSize-1].Key) return &result, nil } result.Objects = append(result.Objects, obj) } return &result, nil } // As implements driver.As. func (b *bucket) As(i any) bool { return false } // As implements driver.ErrorAs. func (b *bucket) ErrorAs(err error, i any) bool { return false } // Attributes implements driver.Attributes. func (b *bucket) Attributes(ctx context.Context, key string) (*driver.Attributes, error) { b.mu.Lock() defer b.mu.Unlock() entry, found := b.blobs[key] if !found { return nil, errNotFound } return entry.Attributes, nil } // NewRangeReader implements driver.NewRangeReader. func (b *bucket) NewRangeReader(ctx context.Context, key string, offset, length int64, opts *driver.ReaderOptions) (driver.Reader, error) { b.mu.Lock() defer b.mu.Unlock() entry, found := b.blobs[key] if !found { return nil, errNotFound } if opts.BeforeRead != nil { if err := opts.BeforeRead(func(any) bool { return false }); err != nil { return nil, err } } r := bytes.NewReader(entry.Content) if offset > 0 { if _, err := r.Seek(offset, io.SeekStart); err != nil { return nil, err } } var ior io.Reader = r if length >= 0 { ior = io.LimitReader(r, length) } return &reader{ r: ior, attrs: driver.ReaderAttributes{ ContentType: entry.Attributes.ContentType, ModTime: entry.Attributes.ModTime, Size: entry.Attributes.Size, }, }, nil } type reader struct { r io.Reader attrs driver.ReaderAttributes } func (r *reader) Read(p []byte) (int, error) { return r.r.Read(p) } func (r *reader) Download(w io.Writer) error { // This should always work because r.r was created from a bytes.Reader. // It's only not a WriterTo when we wrap it with a LimitReader, // which is guaranteed not to happen by the driver interface. _, err := r.r.(io.WriterTo).WriteTo(w) return err } func (r *reader) Close() error { return nil } func (r *reader) Attributes() *driver.ReaderAttributes { return &r.attrs } func (r *reader) As(i any) bool { return false } // NewTypedWriter implements driver.NewTypedWriter. func (b *bucket) NewTypedWriter(ctx context.Context, key, contentType string, opts *driver.WriterOptions) (driver.Writer, error) { if key == "" { return nil, errors.New("invalid key (empty string)") } b.mu.Lock() defer b.mu.Unlock() if opts.BeforeWrite != nil { if err := opts.BeforeWrite(func(any) bool { return false }); err != nil { return nil, err } } md := map[string]string{} maps.Copy(md, opts.Metadata) var md5hash hash.Hash if !b.options.NoMD5 { md5hash = md5.New() } return &writer{ ctx: ctx, b: b, key: key, contentType: contentType, metadata: md, opts: opts, md5hash: md5hash, ifNotExist: opts.IfNotExist, }, nil } type writer struct { ctx context.Context b *bucket key string contentType string metadata map[string]string opts *driver.WriterOptions buf bytes.Buffer // We compute the MD5 hash so that we can store it with the file attributes, // not for verification. May be null if disabled via Options.NoMD5. md5hash hash.Hash ifNotExist bool } func (w *writer) Write(p []byte) (n int, err error) { if w.md5hash != nil { if _, err := w.md5hash.Write(p); err != nil { return 0, err } } return w.buf.Write(p) } func (w *writer) Upload(r io.Reader) error { _, err := w.buf.ReadFrom(r) return err } func (w *writer) Close() error { // Check if the write was cancelled. if err := w.ctx.Err(); err != nil { return err } var md5sum []byte if w.md5hash != nil { md5sum = w.md5hash.Sum(nil) } content := w.buf.Bytes() now := time.Now() entry := &blobEntry{ Content: content, Attributes: &driver.Attributes{ CacheControl: w.opts.CacheControl, ContentDisposition: w.opts.ContentDisposition, ContentEncoding: w.opts.ContentEncoding, ContentLanguage: w.opts.ContentLanguage, ContentType: w.contentType, Metadata: w.metadata, Size: int64(len(content)), CreateTime: now, ModTime: now, MD5: md5sum, ETag: fmt.Sprintf("\"%x-%x\"", now.UnixNano(), len(content)), }, } w.b.mu.Lock() defer w.b.mu.Unlock() if prev := w.b.blobs[w.key]; prev != nil { if w.ifNotExist { err := fmt.Errorf("a blob already exists for key %q", w.key) return gcerr.New(gcerrors.FailedPrecondition, err, 1, "IfNotExist precondition failed") } entry.Attributes.CreateTime = prev.Attributes.CreateTime } w.b.blobs[w.key] = entry return nil } // Copy implements driver.Copy. func (b *bucket) Copy(ctx context.Context, dstKey, srcKey string, opts *driver.CopyOptions) error { b.mu.Lock() defer b.mu.Unlock() if opts.BeforeCopy != nil { if err := opts.BeforeCopy(func(any) bool { return false }); err != nil { return err } } v := b.blobs[srcKey] if v == nil { return errNotFound } b.blobs[dstKey] = v return nil } // Delete implements driver.Delete. func (b *bucket) Delete(ctx context.Context, key string) error { b.mu.Lock() defer b.mu.Unlock() if b.blobs[key] == nil { return errNotFound } delete(b.blobs, key) return nil } func (b *bucket) SignedURL(ctx context.Context, key string, opts *driver.SignedURLOptions) (string, error) { return "", errNotImplemented } ================================================ FILE: blob/memblob/memblob_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package memblob import ( "context" "net/http" "testing" "gocloud.dev/blob" "gocloud.dev/blob/driver" "gocloud.dev/blob/drivertest" ) type harness struct { prefix string } func newHarness(ctx context.Context, t *testing.T, prefix string) (drivertest.Harness, error) { t.Helper() return &harness{prefix: prefix}, nil } func (h *harness) HTTPClient() *http.Client { return nil } func (h *harness) MakeDriver(ctx context.Context) (driver.Bucket, error) { drv := openBucket(nil) if h.prefix == "" { return drv, nil } return driver.NewPrefixedBucket(drv, h.prefix), nil } func (h *harness) MakeDriverForNonexistentBucket(ctx context.Context) (driver.Bucket, error) { // Does not make sense for this driver. return nil, nil } func (h *harness) Close() {} func TestConformance(t *testing.T) { newHarnessNoPrefix := func(ctx context.Context, t *testing.T) (drivertest.Harness, error) { t.Helper() return newHarness(ctx, t, "") } drivertest.RunConformanceTests(t, newHarnessNoPrefix, nil) } func TestConformanceWithPrefix(t *testing.T) { const prefix = "some/prefix/dir/" newHarnessWithPrefix := func(ctx context.Context, t *testing.T) (drivertest.Harness, error) { t.Helper() return newHarness(ctx, t, prefix) } drivertest.RunConformanceTests(t, newHarnessWithPrefix, nil) } func BenchmarkMemblob(b *testing.B) { drivertest.RunBenchmarks(b, OpenBucket(nil)) } func TestOpenBucketFromURL(t *testing.T) { tests := []struct { URL string WantErr bool }{ // OK. {"mem://", false}, // NoMD5. {"mem://?nomd5", false}, // With prefix. {"mem://?prefix=foo/bar", false}, // Invalid parameter. {"mem://?param=value", true}, } ctx := context.Background() for _, test := range tests { b, err := blob.OpenBucket(ctx, test.URL) if b != nil { defer b.Close() } if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } } } ================================================ FILE: blob/otel_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package blob_test import ( "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/sdk/metric/metricdata" "gocloud.dev/blob" "gocloud.dev/blob/memblob" "gocloud.dev/gcerrors" "gocloud.dev/internal/testing/oteltest" "testing" ) func TestOpenTelemetry(t *testing.T) { ctx := t.Context() te := oteltest.NewTestExporter(t, blob.OpenTelemetryViews) defer func() { _ = te.Shutdown(ctx) }() bytes := []byte("hello world") b := memblob.OpenBucket(nil) defer func() { _ = b.Close() }() if err := b.WriteAll(ctx, "key", bytes, nil); err != nil { t.Fatal(err) } if _, err := b.ReadAll(ctx, "key"); err != nil { t.Fatal(err) } if _, err := b.Attributes(ctx, "key"); err != nil { t.Fatal(err) } if _, _, err := b.ListPage(ctx, blob.FirstPageToken, 3, nil); err != nil { t.Fatal(err) } if err := b.Delete(ctx, "key"); err != nil { t.Fatal(err) } if _, err := b.ReadAll(ctx, "noSuchKey"); err == nil { t.Fatal("got nil, want error") } const driver = "gocloud.dev/blob/memblob" spans := te.GetSpans() metrics := te.GetMetrics(ctx) diff := oteltest.Diff(spans.Snapshots(), metrics, "gocloud.dev/blob", driver, []oteltest.Call{ {Method: "NewWriter", Code: gcerrors.OK}, {Method: "NewRangeReader", Code: gcerrors.OK}, {Method: "Attributes", Code: gcerrors.OK}, {Method: "ListPage", Code: gcerrors.OK}, {Method: "Delete", Code: gcerrors.OK}, {Method: "NewRangeReader", Code: gcerrors.NotFound}, }) if diff != "" { t.Error(diff) } // Find and verify the bytes read/written metrics. var sawRead, sawWritten bool providerAttr := attribute.Key("gocdk_provider") for _, sm := range metrics { for _, data := range sm.Metrics { switch data.Name { case "gocloud.dev/blob/bytes_read": if sawRead { continue } sawRead = true case "gocloud.dev/blob/bytes_written": if sawWritten { continue } sawWritten = true default: continue } providerVal, ok := sm.Scope.Attributes.Value(providerAttr) if !ok || providerVal.AsString() != driver { t.Errorf("provider tags for %s is : %s instead of :%s", data.Name, providerVal.AsString(), driver) continue } sd, ok := data.Data.(metricdata.Sum[int64]) if !ok { t.Errorf("%s: data is %T, want SumData", data.Name, data.Data) continue } if got := int(sd.DataPoints[0].Value); got < len(bytes) { t.Errorf("%s: got %d, want at least %d", data.Name, got, len(bytes)) } if sawRead && sawWritten { return } } } } ================================================ FILE: blob/s3blob/example_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package s3blob_test import ( "context" "log" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/s3" "gocloud.dev/blob" "gocloud.dev/blob/s3blob" ) func ExampleOpenBucket() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // Establish a AWS Config. // See https://aws.github.io/aws-sdk-go-v2/docs/configuring-sdk/ for more info. cfg, err := config.LoadDefaultConfig(ctx) if err != nil { log.Fatal(err) } // Create a *blob.Bucket. client := s3.NewFromConfig(cfg) bucket, err := s3blob.OpenBucket(ctx, client, "my-bucket", nil) if err != nil { log.Fatal(err) } defer bucket.Close() } func Example_openBucketFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/blob/s3blob" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // blob.OpenBucket creates a *blob.Bucket from a URL. bucket, err := blob.OpenBucket(ctx, "s3://my-bucket?region=us-west-1") if err != nil { log.Fatal(err) } defer bucket.Close() } ================================================ FILE: blob/s3blob/s3blob.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package s3blob provides a blob implementation that uses S3. Use OpenBucket // to construct a *blob.Bucket. // // # URLs // // For blob.OpenBucket, s3blob registers for the scheme "s3". // The default URL opener will use an AWS session with the default credentials // and configuration. // // To customize the URL opener, or for more details on the URL format, // see URLOpener. // See https://gocloud.dev/concepts/urls/ for background information. // // # Escaping // // Go CDK supports all UTF-8 strings; to make this work with services lacking // full UTF-8 support, strings must be escaped (during writes) and unescaped // (during reads). The following escapes are performed for s3blob: // - Blob keys: ASCII characters 0-31 are escaped to "__0x__". // Additionally, the "/" in "../" is escaped in the same way. // - Metadata keys: Escaped using URL encoding, then additionally "@:=" are // escaped using "__0x__". These characters were determined by // experimentation. // - Metadata values: Escaped using URL encoding. // // # As // // s3blob exposes the following types for As: // - Bucket: *s3.Client // - Error: any error type returned by the service, notably smithy.APIError // - ListObject: types.Object for objects, types.CommonPrefix for "directories" // - ListOptions.BeforeList: *s3.ListObjectsV2Input or *[]func(*s3.Options), or *s3.ListObjectsInput // when Options.UseLegacyList == true // - Reader: s3.GetObjectOutput // - ReaderOptions.BeforeRead: *s3.GetObjectInput or *[]func(*s3.Options) // - Attributes: s3.HeadObjectOutput // - CopyOptions.BeforeCopy: s3.CopyObjectInput // - WriterOptions.BeforeWrite: *s3.PutObjectInput, *s3manager.Uploader // - SignedURLOptions.BeforeSign: *s3.GetObjectInput, when Options.Method == http.MethodGet, or // *s3.PutObjectInput, when Options.Method == http.MethodPut package s3blob // import "gocloud.dev/blob/s3blob" import ( "context" "encoding/base64" "encoding/hex" "errors" "fmt" "io" "net/http" "net/url" "sort" "strconv" "strings" "github.com/aws/aws-sdk-go-v2/aws" s3manager "github.com/aws/aws-sdk-go-v2/feature/s3/manager" "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go" "github.com/google/wire" gcaws "gocloud.dev/aws" "gocloud.dev/blob" "gocloud.dev/blob/driver" "gocloud.dev/gcerrors" "gocloud.dev/internal/escape" "gocloud.dev/internal/gcerr" ) const defaultPageSize = 1000 func init() { blob.DefaultURLMux().RegisterBucket(Scheme, new(urlSessionOpener)) } // Set holds Wire providers for this package. var Set = wire.NewSet( Dial, ) // Dial gets an AWS S3 service client using the AWS SDK V2. func Dial(cfg aws.Config) *s3.Client { return s3.NewFromConfig(cfg) } type urlSessionOpener struct{} func (o *urlSessionOpener) OpenBucketURL(ctx context.Context, u *url.URL) (*blob.Bucket, error) { opener := &URLOpener{} return opener.OpenBucketURL(ctx, u) } // Scheme is the URL scheme s3blob registers its URLOpener under on // blob.DefaultMux. const Scheme = "s3" // URLOpener opens S3 URLs like "s3://mybucket". // // The URL host is used as the bucket name. // // See https://pkg.go.dev/gocloud.dev/aws#V2ConfigFromURLParams. // // The following S3-specific query options are also supported: // - ssetype: The type of server side encryption used (AES256, aws:kms, aws:kms:dsse) // - kmskeyid: The KMS key ID for server side encryption // - accelerate: A value of "true" uses the S3 Transfer Accleration endpoints // - use_path_style: A value of true sets the UsePathStyle option. // - s3ForcePathStyle: Same as use_path_style, for backwards compatibility with V1. // - disable_https: A value of true disables HTTPS in the Endpoint options. type URLOpener struct { // Options specifies the options to pass to OpenBucket. Options Options } const ( sseTypeParamKey = "ssetype" kmsKeyIdParamKey = "kmskeyid" accelerateParamKey = "accelerate" usePathStyleParamKey = "use_path_style" legacyUsePathStyleParamKey = "s3ForcePathStyle" // for backwards compatibility disableHTTPSParamKey = "disable_https" ) func toServerSideEncryptionType(value string) (types.ServerSideEncryption, error) { for _, sseType := range types.ServerSideEncryptionAes256.Values() { if strings.EqualFold(string(sseType), value) { return sseType, nil } } return "", fmt.Errorf("%q is not a valid value for %q", value, sseTypeParamKey) } // OpenBucketURL opens a blob.Bucket based on u. func (o *URLOpener) OpenBucketURL(ctx context.Context, u *url.URL) (*blob.Bucket, error) { q := u.Query() if sseTypeParam := q.Get(sseTypeParamKey); sseTypeParam != "" { q.Del(sseTypeParamKey) sseType, err := toServerSideEncryptionType(sseTypeParam) if err != nil { return nil, err } o.Options.EncryptionType = sseType } if kmsKeyID := q.Get(kmsKeyIdParamKey); kmsKeyID != "" { q.Del(kmsKeyIdParamKey) o.Options.KMSEncryptionID = kmsKeyID } accelerate := false if accelerateParam := q.Get(accelerateParamKey); accelerateParam != "" { q.Del(accelerateParamKey) var err error accelerate, err = strconv.ParseBool(accelerateParam) if err != nil { return nil, fmt.Errorf("invalid value for %q: %v", accelerateParamKey, err) } } opts := []func(*s3.Options){ func(o *s3.Options) { o.UseAccelerate = accelerate }, } if disableHTTPSParam := q.Get(disableHTTPSParamKey); disableHTTPSParam != "" { q.Del(disableHTTPSParamKey) value, err := strconv.ParseBool(disableHTTPSParam) if err != nil { return nil, fmt.Errorf("invalid value for %q: %v", disableHTTPSParamKey, err) } opts = append(opts, func(o *s3.Options) { o.EndpointOptions.DisableHTTPS = value }) } for _, key := range []string{usePathStyleParamKey, legacyUsePathStyleParamKey} { if usePathStyleParam := q.Get(key); usePathStyleParam != "" { q.Del(key) value, err := strconv.ParseBool(usePathStyleParam) if err != nil { return nil, fmt.Errorf("invalid value for %q: %v", key, err) } opts = append(opts, func(o *s3.Options) { o.UsePathStyle = value }) } } cfg, err := gcaws.V2ConfigFromURLParams(ctx, q) if err != nil { return nil, fmt.Errorf("open bucket %v: %v", u, err) } client := s3.NewFromConfig(cfg, opts...) // The S3 upload manager doesn't use the config or options to set the // request checksum calculation. We need to set it explicitly: // https://github.com/aws/aws-sdk-go-v2/pull/3151 o.Options.RequestChecksumCalculation = cfg.RequestChecksumCalculation return OpenBucket(ctx, client, u.Host, &o.Options) } // Options sets options for constructing a *blob.Bucket backed by S3. type Options struct { // UseLegacyList forces the use of ListObjects instead of ListObjectsV2. // Some S3-compatible services (like CEPH) do not currently support // ListObjectsV2. UseLegacyList bool // EncryptionType sets the encryption type headers when making write or // copy calls. This is required if the bucket has a restrictive bucket // policy that enforces a specific encryption type EncryptionType types.ServerSideEncryption // KMSEncryptionID sets the kms key id header for write or copy calls. // This is required when a bucket policy enforces the use of a specific // KMS key for uploads KMSEncryptionID string // RequestChecksumCalculation configures the default integrity protection for // requests. This may need to be set to when_required to preserve compatibility for // third-party S3 providers: https://github.com/aws/aws-sdk-go-v2/discussions/2960. RequestChecksumCalculation aws.RequestChecksumCalculation } // openBucket returns an S3 Bucket. func openBucket(ctx context.Context, client *s3.Client, bucketName string, opts *Options) (*bucket, error) { if bucketName == "" { return nil, errors.New("s3blob.OpenBucket: bucketName is required") } if opts == nil { opts = &Options{} } if client == nil { return nil, errors.New("s3blob.OpenBucket: client is required") } return &bucket{ name: bucketName, client: client, useLegacyList: opts.UseLegacyList, kmsKeyId: opts.KMSEncryptionID, encryptionType: opts.EncryptionType, requestChecksumCalculation: opts.RequestChecksumCalculation, }, nil } // OpenBucket returns a *blob.Bucket backed by S3, using AWS SDK v2. func OpenBucket(ctx context.Context, client *s3.Client, bucketName string, opts *Options) (*blob.Bucket, error) { drv, err := openBucket(ctx, client, bucketName, opts) if err != nil { return nil, err } return blob.NewBucket(drv), nil } var OpenBucketV2 = OpenBucket // reader reads an S3 object. It implements io.ReadCloser. type reader struct { body io.ReadCloser attrs driver.ReaderAttributes raw *s3.GetObjectOutput } func (r *reader) Read(p []byte) (int, error) { return r.body.Read(p) } // Close closes the reader itself. It must be called when done reading. func (r *reader) Close() error { return r.body.Close() } func (r *reader) As(i any) bool { p, ok := i.(*s3.GetObjectOutput) if !ok { return false } *p = *r.raw return true } func (r *reader) Attributes() *driver.ReaderAttributes { return &r.attrs } // writer writes an S3 object, it implements io.WriteCloser. type writer struct { // Ends of an io.Pipe, created when the first byte is written. pw *io.PipeWriter pr *io.PipeReader // Alternatively, upload is set to true when Upload was // used to upload data. upload bool ctx context.Context uploader *s3manager.Uploader req *s3.PutObjectInput donec chan struct{} // closed when done writing // The following fields will be written before donec closes: err error } // Write appends p to w.pw. User must call Close to close the w after done writing. func (w *writer) Write(p []byte) (int, error) { // Avoid opening the pipe for a zero-length write; // the concrete can do these for empty blobs. if len(p) == 0 { return 0, nil } if w.pw == nil { // We'll write into pw and use pr as an io.Reader for the // Upload call to S3. w.pr, w.pw = io.Pipe() w.open(w.pr, true) } return w.pw.Write(p) } // Upload reads from r. Per the driver, it is guaranteed to be the only // write call for this writer. func (w *writer) Upload(r io.Reader) error { w.upload = true w.open(r, false) return nil } // r may be nil if we're Closing and no data was written. // If closePipeOnError is true, w.pr will be closed if there's an // error uploading to S3. func (w *writer) open(r io.Reader, closePipeOnError bool) { // This goroutine will keep running until Close, unless there's an error. go func() { defer close(w.donec) if r == nil { // AWS doesn't like a nil Body. r = http.NoBody } var err error w.req.Body = r _, err = w.uploader.Upload(w.ctx, w.req) if err != nil { if closePipeOnError { w.pr.CloseWithError(err) } w.err = err } }() } // Close completes the writer and closes it. Any error occurring during write // will be returned. If a writer is closed before any Write is called, Close // will create an empty file at the given key. func (w *writer) Close() error { if !w.upload { if w.pr != nil { defer w.pr.Close() } if w.pw == nil { // We never got any bytes written. We'll write an http.NoBody. w.open(nil, false) } else if err := w.pw.Close(); err != nil { return err } } <-w.donec return w.err } // bucket represents an S3 bucket and handles read, write and delete operations. type bucket struct { name string client *s3.Client useLegacyList bool encryptionType types.ServerSideEncryption kmsKeyId string requestChecksumCalculation aws.RequestChecksumCalculation } func (b *bucket) Close() error { return nil } func (b *bucket) ErrorCode(err error) gcerrors.ErrorCode { var code string var ae smithy.APIError var oe *smithy.OperationError if errors.As(err, &oe) && strings.Contains(oe.Error(), "301") { // AWS returns an OperationError with a missing redirect for invalid buckets. code = "NoSuchBucket" } else if errors.As(err, &ae) { code = ae.ErrorCode() } else { return gcerrors.Unknown } switch { case code == "NoSuchBucket" || code == "NoSuchKey" || code == "NotFound" || code == "ObjectNotInActiveTierError": return gcerrors.NotFound case code == "PreconditionFailed": return gcerrors.FailedPrecondition case code == "AccessDenied" || code == "Forbidden": return gcerrors.PermissionDenied default: return gcerrors.Unknown } } // ListPaged implements driver.ListPaged. func (b *bucket) ListPaged(ctx context.Context, opts *driver.ListOptions) (*driver.ListPage, error) { pageSize := opts.PageSize if pageSize == 0 { pageSize = defaultPageSize } in := &s3.ListObjectsV2Input{ Bucket: aws.String(b.name), MaxKeys: aws.Int32(int32(pageSize)), } if len(opts.PageToken) > 0 { in.ContinuationToken = aws.String(string(opts.PageToken)) } if opts.Prefix != "" { in.Prefix = aws.String(escapeKey(opts.Prefix)) } if opts.Delimiter != "" { in.Delimiter = aws.String(escapeKey(opts.Delimiter)) } resp, err := b.listObjects(ctx, in, opts) if err != nil { return nil, err } page := driver.ListPage{} if resp.NextContinuationToken != nil { page.NextPageToken = []byte(*resp.NextContinuationToken) } if n := len(resp.Contents) + len(resp.CommonPrefixes); n > 0 { page.Objects = make([]*driver.ListObject, n) for i, obj := range resp.Contents { page.Objects[i] = &driver.ListObject{ Key: unescapeKey(aws.ToString(obj.Key)), ModTime: *obj.LastModified, Size: aws.ToInt64(obj.Size), MD5: eTagToMD5(obj.ETag), AsFunc: func(i any) bool { p, ok := i.(*types.Object) if !ok { return false } *p = obj return true }, } } for i, prefix := range resp.CommonPrefixes { page.Objects[i+len(resp.Contents)] = &driver.ListObject{ Key: unescapeKey(aws.ToString(prefix.Prefix)), IsDir: true, AsFunc: func(i any) bool { p, ok := i.(*types.CommonPrefix) if !ok { return false } *p = prefix return true }, } } if len(resp.Contents) > 0 && len(resp.CommonPrefixes) > 0 { // S3 gives us blobs and "directories" in separate lists; sort them. sort.Slice(page.Objects, func(i, j int) bool { return page.Objects[i].Key < page.Objects[j].Key }) } } return &page, nil } func (b *bucket) listObjects(ctx context.Context, in *s3.ListObjectsV2Input, opts *driver.ListOptions) (*s3.ListObjectsV2Output, error) { if !b.useLegacyList { var varopt []func(*s3.Options) if opts.BeforeList != nil { asFunc := func(i any) bool { if p, ok := i.(**s3.ListObjectsV2Input); ok { *p = in return true } if p, ok := i.(**[]func(*s3.Options)); ok { *p = &varopt return true } return false } if err := opts.BeforeList(asFunc); err != nil { return nil, err } } return b.client.ListObjectsV2(ctx, in, varopt...) } // Use the legacy ListObjects request. legacyIn := &s3.ListObjectsInput{ Bucket: in.Bucket, Delimiter: in.Delimiter, EncodingType: in.EncodingType, Marker: in.ContinuationToken, MaxKeys: in.MaxKeys, Prefix: in.Prefix, RequestPayer: in.RequestPayer, } if opts.BeforeList != nil { asFunc := func(i any) bool { p, ok := i.(**s3.ListObjectsInput) if !ok { return false } *p = legacyIn return true } if err := opts.BeforeList(asFunc); err != nil { return nil, err } } legacyResp, err := b.client.ListObjects(ctx, legacyIn) if err != nil { return nil, err } var nextContinuationToken *string if legacyResp.NextMarker != nil { nextContinuationToken = legacyResp.NextMarker } else if aws.ToBool(legacyResp.IsTruncated) { nextContinuationToken = aws.String(aws.ToString(legacyResp.Contents[len(legacyResp.Contents)-1].Key)) } return &s3.ListObjectsV2Output{ CommonPrefixes: legacyResp.CommonPrefixes, Contents: legacyResp.Contents, NextContinuationToken: nextContinuationToken, }, nil } // As implements driver.As. func (b *bucket) As(i any) bool { p, ok := i.(**s3.Client) if !ok { return false } *p = b.client return true } // As implements driver.ErrorAs. func (b *bucket) ErrorAs(err error, i any) bool { return errors.As(err, i) } // Attributes implements driver.Attributes. func (b *bucket) Attributes(ctx context.Context, key string) (*driver.Attributes, error) { key = escapeKey(key) in := &s3.HeadObjectInput{ Bucket: aws.String(b.name), Key: aws.String(key), } resp, err := b.client.HeadObject(ctx, in) if err != nil { return nil, err } md := make(map[string]string, len(resp.Metadata)) for k, v := range resp.Metadata { // See the package comments for more details on escaping of metadata // keys & values. md[escape.HexUnescape(escape.URLUnescape(k))] = escape.URLUnescape(v) } return &driver.Attributes{ CacheControl: aws.ToString(resp.CacheControl), ContentDisposition: aws.ToString(resp.ContentDisposition), ContentEncoding: aws.ToString(resp.ContentEncoding), ContentLanguage: aws.ToString(resp.ContentLanguage), ContentType: aws.ToString(resp.ContentType), Metadata: md, // CreateTime not supported; left as the zero time. ModTime: aws.ToTime(resp.LastModified), Size: aws.ToInt64(resp.ContentLength), MD5: eTagToMD5(resp.ETag), ETag: aws.ToString(resp.ETag), AsFunc: func(i any) bool { p, ok := i.(*s3.HeadObjectOutput) if !ok { return false } *p = *resp return true }, }, nil } // NewRangeReader implements driver.NewRangeReader. func (b *bucket) NewRangeReader(ctx context.Context, key string, offset, length int64, opts *driver.ReaderOptions) (driver.Reader, error) { key = escapeKey(key) var byteRange *string if offset > 0 && length < 0 { byteRange = aws.String(fmt.Sprintf("bytes=%d-", offset)) } else if length == 0 { // AWS doesn't support a zero-length read; we'll read 1 byte and then // ignore it in favor of http.NoBody below. byteRange = aws.String(fmt.Sprintf("bytes=%d-%d", offset, offset)) } else if length >= 0 { byteRange = aws.String(fmt.Sprintf("bytes=%d-%d", offset, offset+length-1)) } in := &s3.GetObjectInput{ Bucket: aws.String(b.name), Key: aws.String(key), Range: byteRange, } var varopt []func(*s3.Options) if opts.BeforeRead != nil { asFunc := func(i any) bool { if p, ok := i.(**s3.GetObjectInput); ok { *p = in return true } if p, ok := i.(**[]func(*s3.Options)); ok { *p = &varopt return true } return false } if err := opts.BeforeRead(asFunc); err != nil { return nil, err } } resp, err := b.client.GetObject(ctx, in, varopt...) if err != nil { return nil, err } body := resp.Body if length == 0 { body = http.NoBody } return &reader{ body: body, attrs: driver.ReaderAttributes{ ContentType: aws.ToString(resp.ContentType), ModTime: aws.ToTime(resp.LastModified), Size: getSize(aws.ToInt64(resp.ContentLength), aws.ToString(resp.ContentRange)), }, raw: resp, }, nil } // etagToMD5 processes an ETag header and returns an MD5 hash if possible. // S3's ETag header is sometimes a quoted hexstring of the MD5. Other times, // notably when the object was uploaded in multiple parts, it is not. // We do the best we can. // Some links about ETag: // https://docs.aws.amazon.com/AmazonS3/latest/API/RESTCommonResponseHeaders.html // https://github.com/aws/aws-sdk-net/issues/815 // https://teppen.io/2018/06/23/aws_s3_etags/ func eTagToMD5(etag *string) []byte { if etag == nil { // No header at all. return nil } // Strip the expected leading and trailing quotes. quoted := *etag if len(quoted) < 2 || quoted[0] != '"' || quoted[len(quoted)-1] != '"' { return nil } unquoted := quoted[1 : len(quoted)-1] // Un-hex; we return nil on error. In particular, we'll get an error here // for multi-part uploaded blobs, whose ETag will contain a "-" and so will // never be a legal hex encoding. md5, err := hex.DecodeString(unquoted) if err != nil { return nil } return md5 } func getSize(contentLength int64, contentRange string) int64 { // Default size to ContentLength, but that's incorrect for partial-length reads, // where ContentLength refers to the size of the returned Body, not the entire // size of the blob. ContentRange has the full size. size := contentLength if contentRange != "" { // Sample: bytes 10-14/27 (where 27 is the full size). parts := strings.Split(contentRange, "/") if len(parts) == 2 { if i, err := strconv.ParseInt(parts[1], 10, 64); err == nil { size = i } } } return size } // escapeKey does all required escaping for UTF-8 strings to work with S3. func escapeKey(key string) string { return escape.HexEscape(key, func(r []rune, i int) bool { c := r[i] switch { // S3 doesn't handle these characters (determined via experimentation). case c < 32: return true // For "../", escape the trailing slash. case i > 1 && c == '/' && r[i-1] == '.' && r[i-2] == '.': return true } return false }) } // unescapeKey reverses escapeKey. func unescapeKey(key string) string { return escape.HexUnescape(key) } // NewTypedWriter implements driver.NewTypedWriter. func (b *bucket) NewTypedWriter(ctx context.Context, key, contentType string, opts *driver.WriterOptions) (driver.Writer, error) { key = escapeKey(key) uploader := s3manager.NewUploader(b.client, func(u *s3manager.Uploader) { if opts.BufferSize != 0 { u.PartSize = int64(opts.BufferSize) } if opts.MaxConcurrency != 0 { u.Concurrency = opts.MaxConcurrency } u.RequestChecksumCalculation = b.requestChecksumCalculation }) md := make(map[string]string, len(opts.Metadata)) for k, v := range opts.Metadata { // See the package comments for more details on escaping of metadata // keys & values. k = escape.HexEscape(url.PathEscape(k), func(runes []rune, i int) bool { c := runes[i] return c == '@' || c == ':' || c == '=' }) md[k] = url.PathEscape(v) } req := &s3.PutObjectInput{ Bucket: aws.String(b.name), ContentType: aws.String(contentType), Key: aws.String(key), Metadata: md, } if opts.IfNotExist { // See https://docs.aws.amazon.com/AmazonS3/latest/userguide/conditional-writes.html req.IfNoneMatch = aws.String("*") } if opts.CacheControl != "" { req.CacheControl = aws.String(opts.CacheControl) } if opts.ContentDisposition != "" { req.ContentDisposition = aws.String(opts.ContentDisposition) } if opts.ContentEncoding != "" { req.ContentEncoding = aws.String(opts.ContentEncoding) } if opts.ContentLanguage != "" { req.ContentLanguage = aws.String(opts.ContentLanguage) } if len(opts.ContentMD5) > 0 { req.ContentMD5 = aws.String(base64.StdEncoding.EncodeToString(opts.ContentMD5)) } if b.encryptionType != "" { req.ServerSideEncryption = b.encryptionType } if b.kmsKeyId != "" { req.SSEKMSKeyId = aws.String(b.kmsKeyId) } if opts.BeforeWrite != nil { asFunc := func(i any) bool { // Note that since the Go CDK Blob // abstraction does not expose AWS's // Uploader concept, there does not // appear to be any utility in // exposing the options list to the v2 // Uploader's Upload() method. // Instead, applications can // manipulate the exposed *Uploader // directly, including by setting // ClientOptions if needed. if p, ok := i.(**s3manager.Uploader); ok { *p = uploader return true } if p, ok := i.(**s3.PutObjectInput); ok { *p = req return true } return false } if err := opts.BeforeWrite(asFunc); err != nil { return nil, err } } return &writer{ ctx: ctx, uploader: uploader, req: req, donec: make(chan struct{}), }, nil } // Copy implements driver.Copy. func (b *bucket) Copy(ctx context.Context, dstKey, srcKey string, opts *driver.CopyOptions) error { dstKey = escapeKey(dstKey) srcKey = escapeKey(srcKey) srcKeyWithBucketEscaped := url.QueryEscape(b.name + "/" + srcKey) input := &s3.CopyObjectInput{ Bucket: aws.String(b.name), CopySource: aws.String(srcKeyWithBucketEscaped), Key: aws.String(dstKey), } if b.encryptionType != "" { input.ServerSideEncryption = b.encryptionType } if b.kmsKeyId != "" { input.SSEKMSKeyId = aws.String(b.kmsKeyId) } if opts.BeforeCopy != nil { asFunc := func(i any) bool { switch v := i.(type) { case **s3.CopyObjectInput: *v = input return true } return false } if err := opts.BeforeCopy(asFunc); err != nil { return err } } _, err := b.client.CopyObject(ctx, input) return err } // Delete implements driver.Delete. func (b *bucket) Delete(ctx context.Context, key string) error { if _, err := b.Attributes(ctx, key); err != nil { return err } key = escapeKey(key) input := &s3.DeleteObjectInput{ Bucket: aws.String(b.name), Key: aws.String(key), } _, err := b.client.DeleteObject(ctx, input) return err } func (b *bucket) SignedURL(ctx context.Context, key string, opts *driver.SignedURLOptions) (string, error) { key = escapeKey(key) switch opts.Method { case http.MethodGet: in := &s3.GetObjectInput{ Bucket: aws.String(b.name), Key: aws.String(key), } if opts.BeforeSign != nil { asFunc := func(i any) bool { v, ok := i.(**s3.GetObjectInput) if ok { *v = in } return ok } if err := opts.BeforeSign(asFunc); err != nil { return "", err } } p, err := s3.NewPresignClient(b.client, s3.WithPresignExpires(opts.Expiry)).PresignGetObject(ctx, in) if err != nil { return "", err } return p.URL, nil case http.MethodPut: in := &s3.PutObjectInput{ Bucket: aws.String(b.name), Key: aws.String(key), } if opts.EnforceAbsentContentType || opts.ContentType != "" { // https://github.com/aws/aws-sdk-go-v2/issues/1475 return "", gcerr.New(gcerr.Unimplemented, nil, 1, "s3blob: AWS SDK v2 does not supported enforcing ContentType in SignedURLs for PUT") } if opts.BeforeSign != nil { asFunc := func(i any) bool { v, ok := i.(**s3.PutObjectInput) if ok { *v = in } return ok } if err := opts.BeforeSign(asFunc); err != nil { return "", err } } p, err := s3.NewPresignClient(b.client, s3.WithPresignExpires(opts.Expiry)).PresignPutObject(ctx, in) if err != nil { return "", err } return p.URL, nil case http.MethodDelete: // https://github.com/aws/aws-sdk-java-v2/issues/2520 return "", gcerr.New(gcerr.Unimplemented, nil, 1, "s3blob: AWS SDK v2 does not support SignedURL for DELETE") default: return "", fmt.Errorf("unsupported Method %q", opts.Method) } } ================================================ FILE: blob/s3blob/s3blob_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package s3blob import ( "context" "errors" "fmt" "net/http" "net/url" "testing" "github.com/aws/aws-sdk-go-v2/aws" awscfg "github.com/aws/aws-sdk-go-v2/config" s3manager "github.com/aws/aws-sdk-go-v2/feature/s3/manager" "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go" gcaws "gocloud.dev/aws" "gocloud.dev/blob" "gocloud.dev/blob/driver" "gocloud.dev/blob/drivertest" "gocloud.dev/internal/testing/setup" ) // These constants record the region & bucket used for the last --record. // If you want to use --record mode, // 1. Create a bucket in your AWS project from the S3 management console. // // https://s3.console.aws.amazon.com/s3/home. // // 2. Update this constant to your bucket name. // TODO(issue #300): Use Terraform to provision a bucket, and get the bucket // // name from the Terraform output instead (saving a copy of it for replay). const ( bucketName = "go-cloud-testing-2" region = "us-west-1" ) type harness struct { client *s3.Client opts *Options rt http.RoundTripper closer func() } func newHarness(ctx context.Context, t *testing.T) (drivertest.Harness, error) { t.Helper() cfg, rt, done, _ := setup.NewAWSv2Config(ctx, t, region, false) return &harness{client: s3.NewFromConfig(cfg), opts: nil, rt: rt, closer: done}, nil } func newHarnessUsingLegacyList(ctx context.Context, t *testing.T) (drivertest.Harness, error) { t.Helper() cfg, rt, done, _ := setup.NewAWSv2Config(ctx, t, region, false) return &harness{client: s3.NewFromConfig(cfg), opts: &Options{UseLegacyList: true}, rt: rt, closer: done}, nil } func (h *harness) HTTPClient() *http.Client { return &http.Client{Transport: h.rt} } func (h *harness) MakeDriver(ctx context.Context) (driver.Bucket, error) { return openBucket(ctx, h.client, bucketName, h.opts) } func (h *harness) MakeDriverForNonexistentBucket(ctx context.Context) (driver.Bucket, error) { return openBucket(ctx, h.client, "go-cdk-bucket-does-not-exist", h.opts) } func (h *harness) Close() { h.closer() } func TestConformance(t *testing.T) { drivertest.RunConformanceTests(t, newHarness, []drivertest.AsTest{verifyContentLanguage{usingLegacyList: false}}) } func TestConformanceUsingLegacyList(t *testing.T) { drivertest.RunConformanceTests(t, newHarnessUsingLegacyList, []drivertest.AsTest{verifyContentLanguage{usingLegacyList: true}}) } func BenchmarkS3blob(b *testing.B) { ctx := context.Background() cfg, err := awscfg.LoadDefaultConfig(ctx) if err != nil { b.Fatal(err) } client := s3.NewFromConfig(cfg) bkt, err := OpenBucket(ctx, client, bucketName, nil) if err != nil { b.Fatal(err) } drivertest.RunBenchmarks(b, bkt) } const language = "nl" // verifyContentLanguage uses As to access the underlying AWS types and // read/write the ContentLanguage field. type verifyContentLanguage struct { usingLegacyList bool } func (verifyContentLanguage) Name() string { return "verify ContentLanguage can be written and read through As" } func (v verifyContentLanguage) BucketCheck(b *blob.Bucket) error { var client *s3.Client if !b.As(&client) { return errors.New("Bucket.As failed") } return nil } func (v verifyContentLanguage) ErrorCheck(b *blob.Bucket, err error) error { var e smithy.APIError if !b.ErrorAs(err, &e) { return errors.New("blob.ErrorAs failed") } return nil } func (v verifyContentLanguage) BeforeRead(as func(any) bool) error { var ( req *s3.GetObjectInput opts *[]func(*s3.Options) ) if !as(&req) || !as(&opts) { return errors.New("BeforeRead As failed") } return nil } func (v verifyContentLanguage) BeforeWrite(as func(any) bool) error { var ( req *s3.PutObjectInput uploader *s3manager.Uploader ) if !as(&req) || !as(&uploader) { return errors.New("Writer.As failed for PutObjectInput") } req.ContentLanguage = aws.String(language) var u *s3manager.Uploader if !as(&u) { return errors.New("Writer.As failed for Uploader") } return nil } func (v verifyContentLanguage) BeforeCopy(as func(any) bool) error { var in *s3.CopyObjectInput if !as(&in) { return errors.New("BeforeCopy.As failed") } return nil } func (v verifyContentLanguage) BeforeList(as func(any) bool) error { if v.usingLegacyList { var req *s3.ListObjectsInput if !as(&req) { return errors.New("List.As failed") } } else { var ( list *s3.ListObjectsV2Input opts *[]func(*s3.Options) ) if !as(&list) || !as(&opts) { return errors.New("List.As failed") } return nil } return nil } func (v verifyContentLanguage) BeforeSign(as func(any) bool) error { var ( get *s3.GetObjectInput put *s3.PutObjectInput del *s3.DeleteObjectInput ) if as(&get) || as(&put) || as(&del) { return nil } return errors.New("BeforeSign.As failed") } func (v verifyContentLanguage) AttributesCheck(attrs *blob.Attributes) error { var hoo s3.HeadObjectOutput if !attrs.As(&hoo) { return errors.New("Attributes.As returned false") } if got := *hoo.ContentLanguage; got != language { return fmt.Errorf("got %q want %q", got, language) } return nil } func (v verifyContentLanguage) ReaderCheck(r *blob.Reader) error { var goo s3.GetObjectOutput if !r.As(&goo) { return errors.New("Reader.As returned false") } if got := *goo.ContentLanguage; got != language { return fmt.Errorf("got %q want %q", got, language) } return nil } func (v verifyContentLanguage) ListObjectCheck(o *blob.ListObject) error { if o.IsDir { var commonPrefix types.CommonPrefix if !o.As(&commonPrefix) { return errors.New("ListObject.As for directory returned false") } return nil } var obj types.Object if !o.As(&obj) { return errors.New("ListObject.As for object returned false") } if obj.Key == nil || o.Key != *obj.Key { return errors.New("ListObject.As for object returned a different item") } return nil } func TestOpenBucket(t *testing.T) { tests := []struct { description string bucketName string nilClient bool want string wantErr bool }{ { description: "empty bucket name results in error", wantErr: true, }, { description: "nil client results in error", bucketName: "foo", nilClient: true, wantErr: true, }, { description: "success", bucketName: "foo", want: "foo", }, } ctx := context.Background() for _, test := range tests { t.Run(test.description, func(t *testing.T) { var client *s3.Client if !test.nilClient { cfg, _, done, _ := setup.NewAWSv2Config(ctx, t, region, false) defer done() client = s3.NewFromConfig(cfg) } // Create driver impl. drv, err := openBucket(ctx, client, test.bucketName, nil) if (err != nil) != test.wantErr { t.Errorf("got err %v want error %v", err, test.wantErr) } if err == nil && drv != nil && drv.name != test.want { t.Errorf("got %q want %q", drv.name, test.want) } // Create portable type. b, err := OpenBucket(ctx, client, test.bucketName, nil) if b != nil { defer b.Close() } if (err != nil) != test.wantErr { t.Errorf("got err %v want error %v", err, test.wantErr) } }) } } func TestOpenBucketFromURL(t *testing.T) { tests := []struct { URL string WantErr bool }{ // OK. {"s3://mybucket", false}, // OK, setting region. {"s3://mybucket?region=us-west1", false}, // OK, use KMS Server Side Encryption {"s3://mybucket?ssetype=aws:kms&kmskeyid=arn:aws:us-east-1:12345:key/1-a-2-b", false}, // OK, use S3 Transfer acceleration and dual stack endpoints {"s3://mybucket?accelerate=true&dualstack=true", false}, // OK, use FIPS endpoints {"s3://mybucket?fips=true", false}, // OK, use S3 Transfer accleration and dual stack endpoints {"s3://mybucket?accelerate=true&dualstack=true", false}, // OK, use use_path_style {"s3://mybucket?use_path_style=true", false}, // OK, use s3ForcePathStyle {"s3://mybucket?s3ForcePathStyle=true", false}, // OK, use disable_https {"s3://mybucket?disable_https=true", false}, // OK, use FIPS endpoints {"s3://mybucket?fips=true", false}, // OK, use anonymous. {"s3://mybucket?anonymous=true", false}, // OK, use request checksum calculation when_supported {"s3://mybucket?request_checksum_calculation=when_supported", false}, // OK, use request checksum calculation when_required {"s3://mybucket?request_checksum_calculation=when_required", false}, // OK, use response checksum validation when_supported {"s3://mybucket?response_checksum_validation=when_supported", false}, // OK, use response checksum validation when_required {"s3://mybucket?response_checksum_validation=when_required", false}, // OK, use both checksum parameters {"s3://mybucket?request_checksum_calculation=when_required&response_checksum_validation=when_supported", false}, // OK, case insensitive checksum parameters {"s3://mybucket?request_checksum_calculation=WHEN_SUPPORTED&response_checksum_validation=When_Required", false}, // Invalid request checksum value {"s3://mybucket?request_checksum_calculation=invalid", true}, // Invalid response checksum value {"s3://mybucket?response_checksum_validation=invalid", true}, // Empty request checksum value {"s3://mybucket?request_checksum_calculation=", true}, // Empty response checksum value {"s3://mybucket?response_checksum_validation=", true}, // Invalid accelerate {"s3://mybucket?accelerate=bogus", true}, // Invalid FIPS {"s3://mybucket?fips=bogus", true}, // Invalid dualstack {"s3://mybucket?dualstack=bad", true}, // Invalid ssetype {"s3://mybucket?ssetype=aws:notkmsoraes&kmskeyid=arn:aws:us-east-1:12345:key/1-a-2-b", true}, // Invalid parameter together with a valid one. {"s3://mybucket?profile=main¶m=value", true}, // Invalid use_path_style {"s3://mybucket?usePathStyle=bad", true}, // Invalid disable_https {"s3://mybucket?usePathStyle=bad", true}, // Invalid parameter. {"s3://mybucket?param=value", true}, } ctx := context.Background() for _, test := range tests { b, err := blob.OpenBucket(ctx, test.URL) if b != nil { defer b.Close() } if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } } } func TestChecksumConfigurationPassthrough(t *testing.T) { // Test that checksum configuration from URL parameters is properly passed through // to the S3 bucket options tests := []struct { name string url string wantRequestChecksumCalculation aws.RequestChecksumCalculation wantErr bool }{ { name: "request checksum when_supported", url: "s3://mybucket?request_checksum_calculation=when_supported", wantRequestChecksumCalculation: aws.RequestChecksumCalculationWhenSupported, }, { name: "request checksum when_required", url: "s3://mybucket?request_checksum_calculation=when_required", wantRequestChecksumCalculation: aws.RequestChecksumCalculationWhenRequired, }, { name: "case insensitive", url: "s3://mybucket?request_checksum_calculation=WHEN_SUPPORTED", wantRequestChecksumCalculation: aws.RequestChecksumCalculationWhenSupported, }, { name: "invalid value", url: "s3://mybucket?request_checksum_calculation=invalid", wantErr: true, }, } ctx := context.Background() for _, test := range tests { t.Run(test.name, func(t *testing.T) { // Parse the URL to extract the bucket name and query parameters u, err := url.Parse(test.url) if err != nil { t.Fatalf("failed to parse URL: %v", err) } // Create a mock AWS config with the query parameters cfg, err := awscfg.LoadDefaultConfig(ctx) if err != nil { t.Fatalf("failed to load AWS config: %v", err) } // Apply URL parameters to the config cfg, err = gcaws.V2ConfigFromURLParams(ctx, u.Query()) if (err != nil) != test.wantErr { t.Errorf("got err %v want error %v", err, test.wantErr) return } if err != nil { return } // Create URLOpener to test the integration opener := &URLOpener{} bucket, err := opener.OpenBucketURL(ctx, u) if err != nil { t.Fatalf("failed to open bucket: %v", err) } defer bucket.Close() // Verify that the checksum configuration was applied // We can't directly access the internal bucket struct, but we can verify // that the configuration was applied to the AWS config if cfg.RequestChecksumCalculation != test.wantRequestChecksumCalculation { t.Errorf("got RequestChecksumCalculation %v, want %v", cfg.RequestChecksumCalculation, test.wantRequestChecksumCalculation) } }) } } func TestToServerSideEncryptionType(t *testing.T) { tests := []struct { value string sseType types.ServerSideEncryption expectedError error }{ // OK. {"AES256", types.ServerSideEncryptionAes256, nil}, // OK, KMS {"aws:kms", types.ServerSideEncryptionAwsKms, nil}, // OK, KMS {"aws:kms:dsse", types.ServerSideEncryptionAwsKmsDsse, nil}, // OK, AES256 mixed case {"Aes256", types.ServerSideEncryptionAes256, nil}, // Invalid SSE type {"invalid", "", fmt.Errorf("'invalid' is not a valid value for %q", sseTypeParamKey)}, } for _, test := range tests { sseType, err := toServerSideEncryptionType(test.value) if ((err != nil) != (test.expectedError != nil)) && err.Error() != test.expectedError.Error() { t.Errorf("%s: got error \"%v\", want error \"%v\"", test.value, err, test.expectedError) } if sseType != test.sseType { t.Errorf("%s: got type %v, want type %v", test.value, sseType, test.sseType) } } } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestAs/verify_As_returns_false_when_passed_nil.replay ================================================ { "Initial": "AQAAAA7hTg0VDAcLHgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "48a9a262ca4e6ccc", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/mydir/as-test?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "52" ], "Content-Md5": [ "XrY7u+Ae7tCTyyK7j1rNww==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "11" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "Yg0KaGVsbG8gd29ybGQNCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOkRVb1JoUT09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:22 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "DUoRhQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "VzwI4oJ6otE7n+E9wRNEhtODngo8Nf0RWXomO3OL2xS4Cq3LdMmEB0Hs5OBE4tgKXXov5ADisEI=" ], "X-Amz-Request-Id": [ "JEB0AHTQM2TP1DR8" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "9e30576fc1797f15", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/mydir/as-test", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:22 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:22 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "+ucuPWqKfoz0wPH5wcKZo/Pcq8czaO+7+3tZlex/4T/tq3a6xhhqtAuiSgG51IYgABFg+ikGEQQ=" ], "X-Amz-Request-Id": [ "JEB4QSHD0ETAKASM" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "330af95a754fcd73", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/mydir/as-test?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:22 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:22 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "DUoRhQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "cM3a0QQ9dfIi0TZQ2Z5ZkdVsN9PJDBLqolYDMsk0CFEyKR1MlvrsY76Oe4h7kHSDaSt2XFQgwAY=" ], "X-Amz-Request-Id": [ "JEB9W9G9D4CRN8RR" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8gd29ybGQ=" } }, { "ID": "48bcdc938064b850", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026list-type=2\u0026max-keys=1000\u0026prefix=mydir", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:22 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "6crv+XQpZOVwDORi5KxZcyE1wpbp+VvKIOGV03hjjy28UG7bXXB/S0rziSNDYHGnpf/PYtHqkUI=" ], "X-Amz-Request-Id": [ "JEBBQHSAR7Y89ZV3" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+bXlkaXI8L1ByZWZpeD48S2V5Q291bnQ+MTwvS2V5Q291bnQ+PE1heEtleXM+MTAwMDwvTWF4S2V5cz48RGVsaW1pdGVyPi88L0RlbGltaXRlcj48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb21tb25QcmVmaXhlcz48UHJlZml4Pm15ZGlyLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "9fa1840dea7754e3", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?list-type=2\u0026max-keys=1000\u0026prefix=mydir%2Fas-test", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:22 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "Ien065lps2PkLv7YHeimj3X5ZbvYE2G4xIMQNV7dHttNo60VATZDZY/di/fZl6Jo32ODQ/MTfkY=" ], "X-Amz-Request-Id": [ "JEBDYNW6K13816T0" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+bXlkaXIvYXMtdGVzdDwvUHJlZml4PjxLZXlDb3VudD4xPC9LZXlDb3VudD48TWF4S2V5cz4xMDAwPC9NYXhLZXlzPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+bXlkaXIvYXMtdGVzdDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNi0wMy0xOVQxNToyODoyMi4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWViNjNiYmJlMDFlZWVkMDkzY2IyMmJiOGY1YWNkYzMmcXVvdDs8L0VUYWc+PENoZWNrc3VtQWxnb3JpdGhtPkNSQzMyPC9DaGVja3N1bUFsZ29yaXRobT48Q2hlY2tzdW1UeXBlPkZVTExfT0JKRUNUPC9DaGVja3N1bVR5cGU+PFNpemU+MTE8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "6e7a082118653597", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key-does-not-exist?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "VStXwQWK2ZVe0iO+RHCZUK9aacEH4nsZjo6gXKhfhAYHzCo8wcKrVNlyEVKult95EXLLfFtdsoA=" ], "X-Amz-Request-Id": [ "JEB1A141HVBK8SVF" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPk5vU3VjaEtleTwvQ29kZT48TWVzc2FnZT5UaGUgc3BlY2lmaWVkIGtleSBkb2VzIG5vdCBleGlzdC48L01lc3NhZ2U+PEtleT5rZXktZG9lcy1ub3QtZXhpc3Q8L0tleT48UmVxdWVzdElkPkpFQjFBMTQxSFZCSzhTVkY8L1JlcXVlc3RJZD48SG9zdElkPlZTdFh3UVdLMlpWZTBpTytSSENaVUs5YWFjRUg0bnNaam82Z1hLaGZoQVlIekNvOHdjS3JWTmx5RVZLdWx0OTVFWExMZkZ0ZHNvQT08L0hvc3RJZD48L0Vycm9yPg==" } }, { "ID": "f9d049a8c7a450ba", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/mydir/as-test-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fmydir%2Fas-test" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:22 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "uhcH8VtJfJ7KUBT3hDWEhVB5YcJ+80S2N1EYsmRSpN5f+3y7t0gP7y3QOrGj8Mp+AxBPEhlEOZQ=" ], "X-Amz-Request-Id": [ "JEB9CCX8WRR2DMM3" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjIyLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWViNjNiYmJlMDFlZWVkMDkzY2IyMmJiOGY1YWNkYzMiPC9FVGFnPjxDaGVja3N1bUNSQzMyPkRVb1JoUT09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "719bb5de156667a0", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/mydir/as-test-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:22 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:22 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "AXCVmWQJCHGrxTVjb0eBT32ai30TxocxZqfrey8AK6hRB/Z/6ugZcacSKG6epYrU+5w7EiZjKWg=" ], "X-Amz-Request-Id": [ "JEBF17V26V14MZDZ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "944c8c8c090256c2", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/mydir/as-test-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:22 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "UNHFlYtBmQaIm5IvBRsHEbvyGIuzAqckuFq0cOeZsOxRJwrsUPhTOZYNn2ANSmMm0C/jb26PMwo=" ], "X-Amz-Request-Id": [ "JEB0TJNYKZX68ZVV" ] }, "Body": "" } }, { "ID": "caeb1d633102d299", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/mydir/as-test", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:22 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:22 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "/ccYTNzeXNX50+KMSx167DZU+RNIwplbxZPWZFlB2lwO1SW1kobPGHHGhiXTGYr9fhz9VZNnGp8=" ], "X-Amz-Request-Id": [ "JEB2J2A8D81XJSQE" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "6bb17d1999049ac7", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/mydir/as-test?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:22 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "D/O3pLXnDrca0tZVD+P8h1DgyOPZNlHnVImHoK9YP+FrkDhivrvvcc5Ugu0Ii/Ov4AH0U05YLxA=" ], "X-Amz-Request-Id": [ "JEBB0FF2CXBYYQA5" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestAs/verify_ContentLanguage_can_be_written_and_read_through_As.replay ================================================ { "Initial": "AQAAAA7hTg0UKNL5bQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "071b516330624a28", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/mydir/as-test?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Language": [ "nl" ], "Content-Length": [ "52" ], "Content-Md5": [ "XrY7u+Ae7tCTyyK7j1rNww==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "11" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "Yg0KaGVsbG8gd29ybGQNCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOkRVb1JoUT09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:21 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "DUoRhQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "2Ncxx6qtzOpAtRZB0Z1cSBqYjByxlvHKmObKSbEcSMQ/m+77vpUtuJwot7JCee1IS8tRgoiYFQOTTO4IKAYBWsHcCZRByG1j" ], "X-Amz-Request-Id": [ "M1V5FNESX7HQKCM8" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "c59fa740cb81b709", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/mydir/as-test", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Language": [ "nl" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:21 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:21 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "/DVv7HN21ATfLt1/YTYSCGYX9jiqL3H1ZBBw9PP2+3xtd6U+CjyiFP8AeuFipi2Esx+8vBA7sq8imyaEndloxClV7eNT+083" ], "X-Amz-Request-Id": [ "M1V4CA06MD883QDT" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "43e25455e4df3684", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/mydir/as-test?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Language": [ "nl" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:21 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:21 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "DUoRhQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "OYehWM0pRCIsDo4DIvshLpeYCItcTb9R2UJaFtHkzi78yW6er9w0zD7Jd7YpotZmGip66aR55iuqiZ8ZK/VmeppRxvXIKYmi" ], "X-Amz-Request-Id": [ "M1V2P1AK8K1TWRRY" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8gd29ybGQ=" } }, { "ID": "8e621f33f7699658", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026list-type=2\u0026max-keys=1000\u0026prefix=mydir", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:21 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "wuJVV6sbT3hU+D/guQus3vKG1eHF718WZdO4sYxOaisbjL8EVD4T8A9UvqcNkoKLvLlehHiJV6KZdWxk1Zz9HuxgnbhkFzig" ], "X-Amz-Request-Id": [ "M1V8S13Y6DAGXJ6X" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+bXlkaXI8L1ByZWZpeD48S2V5Q291bnQ+MTwvS2V5Q291bnQ+PE1heEtleXM+MTAwMDwvTWF4S2V5cz48RGVsaW1pdGVyPi88L0RlbGltaXRlcj48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb21tb25QcmVmaXhlcz48UHJlZml4Pm15ZGlyLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "b67848233bdfedf7", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?list-type=2\u0026max-keys=1000\u0026prefix=mydir%2Fas-test", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:21 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "vWGtElR4AIGSMhFJdDtFjWV90rXcsdYPm4u+/CmA3kFmioVPkN6Cyc8ciF6EvWfMXtyS5UYPdjeVrkNf/UwpDutIjM4g9HPW" ], "X-Amz-Request-Id": [ "M1VA1JP91M1HFRK1" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+bXlkaXIvYXMtdGVzdDwvUHJlZml4PjxLZXlDb3VudD4xPC9LZXlDb3VudD48TWF4S2V5cz4xMDAwPC9NYXhLZXlzPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+bXlkaXIvYXMtdGVzdDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNi0wMy0xOVQxNToyODoyMS4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWViNjNiYmJlMDFlZWVkMDkzY2IyMmJiOGY1YWNkYzMmcXVvdDs8L0VUYWc+PENoZWNrc3VtQWxnb3JpdGhtPkNSQzMyPC9DaGVja3N1bUFsZ29yaXRobT48Q2hlY2tzdW1UeXBlPkZVTExfT0JKRUNUPC9DaGVja3N1bVR5cGU+PFNpemU+MTE8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "db612f7485d204d4", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key-does-not-exist?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "ZbTue3NoICkrWX5RdDGTBQmTv8EeiLiCnNfo7ubpMp9g24eNqGg8qe7QLw3KVmHqUT4yseGz4+nNtd6w/0Ah1av4/djpU816" ], "X-Amz-Request-Id": [ "M1V9J74JNE8DHTE5" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPk5vU3VjaEtleTwvQ29kZT48TWVzc2FnZT5UaGUgc3BlY2lmaWVkIGtleSBkb2VzIG5vdCBleGlzdC48L01lc3NhZ2U+PEtleT5rZXktZG9lcy1ub3QtZXhpc3Q8L0tleT48UmVxdWVzdElkPk0xVjlKNzRKTkU4REhURTU8L1JlcXVlc3RJZD48SG9zdElkPlpiVHVlM05vSUNrcldYNVJkREdUQlFtVHY4RWVpTGlDbk5mbzd1YnBNcDlnMjRlTnFHZzhxZTdRTHczS1ZtSHFVVDR5c2VHejQrbk50ZDZ3LzBBaDFhdjQvZGpwVTgxNjwvSG9zdElkPjwvRXJyb3I+" } }, { "ID": "0f652f83b8989ccc", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/mydir/as-test-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fmydir%2Fas-test" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:21 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "X3jPuZcKWBTIKupWWvpff+ydwulRYsxiwxUEdAJ6cs3Abs+a4yNMz47HnKDfiLGhya4Sww+G6+kzAXqrnC8KUwBBtqQkl4S2" ], "X-Amz-Request-Id": [ "M1VE1P9RRN1K6M9H" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjIxLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWViNjNiYmJlMDFlZWVkMDkzY2IyMmJiOGY1YWNkYzMiPC9FVGFnPjxDaGVja3N1bUNSQzMyPkRVb1JoUT09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "013bfe6691e056aa", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/mydir/as-test-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Language": [ "nl" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:22 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:21 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "icFm495hT3jFPO2KESFH/vZVbFgE8TtbJMkRRkUYyHLd7rhhpwklDvAp8eVchKGIcn3KE3fxSmEXBePdx26QlapXLDSsoldr" ], "X-Amz-Request-Id": [ "JEB8NT2M7P9TWCPG" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "853dd16a4442c3c9", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/mydir/as-test-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:22 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "DNiL1rPLjypxvGJIPC9Ko3AqUVNBbsLHQoORym0sFlWjiRhm0Q6cnHdB1If/Mb6cTw/1e5H7RTWAIm4MlxsY/x5LlIoc/FV5" ], "X-Amz-Request-Id": [ "JEB5V6PY8SG0Q57Y" ] }, "Body": "" } }, { "ID": "bbbc22d598af86ce", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/mydir/as-test", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Language": [ "nl" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:22 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:21 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "qFswUPDvnUZLpl71qjApOBRCfnltaGNIgSfj952WhZ3dktoYnA9NuA/HdbrYLk9QsYq7kiYqTc9zxVhw0pC/rypqkeqMepqx" ], "X-Amz-Request-Id": [ "JEBF1QFVZZZRWXQR" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "59b4e18dadde0f8b", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/mydir/as-test?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:22 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "5JrVEh8xAL3y3zjUuy2BaSXEIuhDCWFGemG2n7cIwHTGClLXjw2J07zaaHnv2zr4gRq9jWzd8S26qpXKGS0LkBgKfXMehQQb" ], "X-Amz-Request-Id": [ "JEB7BB8H5JS57JQJ" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestAttributes.replay ================================================ { "Initial": "AQAAAA7hTg0CDuTtSgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "5a52e900a38d0e52", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/someDir/blob-for-attributes?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Cache-Control": [ "no-cache" ], "Content-Disposition": [ "inline" ], "Content-Encoding": [ "identity", "aws-chunked" ], "Content-Language": [ "en" ], "Content-Length": [ "53" ], "Content-Md5": [ "7Qdih1MuhjZehB6Sv8UNjA==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "12" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "Yw0KSGVsbG8gV29ybGQhDQowDQp4LWFtei1jaGVja3N1bS1jcmMzMjpIQ2tjb3c9PQ0KDQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:03 GMT" ], "Etag": [ "\"ed076287532e86365e841e92bfc50d8c\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "HCkcow==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "ZQ0ekbDroMOCGhhHY1J6+vLDgOyfHvhLJOzE11sc24aHxeN6p1Bqv9/WgYMx/FuJlqh8vuj41bOcjf+R5Kj4F4EKnpN+smfB" ], "X-Amz-Request-Id": [ "8D9BZBWPZ6Z8GMEK" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "8d1b2f7d1fab43cf", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/not-found", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "wy/qtB5evDZr6Q8uUNO6WCU9Sb/F1PpIh0cef7CnPsHbszQSV/cvDKQP3nAt8wvDDxIcpUe7zqqG/L20Xhvh3H4+lv1BxEiI" ], "X-Amz-Request-Id": [ "8D91K8PD9P583XAQ" ] }, "Body": "" } }, { "ID": "6ff266b3c5e1f741", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/someDir", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "NG9FfmVj9z4+/Y0o0RWGNkl3FK8unZ2RE0hGHTkV5brAasqyvoSDVdU5PxN36XWceQwCsKCOTaiJjeO5kbFX8NN9KhTx/XPH" ], "X-Amz-Request-Id": [ "8D91MYD02N0XDZA8" ] }, "Body": "" } }, { "ID": "0bdd924f79bf3b19", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/someDir/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "H+hqbPO5sKgiIeO2xeqax4HcbkD1BW3/9PYxdXQs2mQ63E2NPhjBe2b0Mwnd2rQIFgTst4GoN2iJvYJ7OcsJWbKLEinGG58o" ], "X-Amz-Request-Id": [ "8D9ESD7K38JPT2Z5" ] }, "Body": "" } }, { "ID": "730b8fd9c2947795", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/someDir/blob-for-attributes", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "no-cache" ], "Content-Disposition": [ "inline" ], "Content-Encoding": [ "identity" ], "Content-Language": [ "en" ], "Content-Length": [ "12" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 19 Mar 2026 15:28:03 GMT" ], "Etag": [ "\"ed076287532e86365e841e92bfc50d8c\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:03 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "nwboQIfIEoqG7KhafR1CY2O0t/nXvHbkOHrVsiabaxKducBCSSfn45TVVO+j7AWtdBGnLcDpwBiH8rqaNo6VhM33TTfhqdMS" ], "X-Amz-Request-Id": [ "8D9CGGW1GGXKETSG" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "9c5fcba6755e1601", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/someDir/blob-for-attributes?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "no-cache" ], "Content-Disposition": [ "inline" ], "Content-Encoding": [ "identity" ], "Content-Language": [ "en" ], "Content-Length": [ "12" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 19 Mar 2026 15:28:03 GMT" ], "Etag": [ "\"ed076287532e86365e841e92bfc50d8c\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:03 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "HCkcow==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "aDgz96uNNzi5WAN4zaQsvSW+cBDhQ3USatQQJ4HTwH8g6G8oY6NuRRGr5gG7Zc/tnz7RTBXucsK6OY40Aer82G7wI7PrhRdo" ], "X-Amz-Request-Id": [ "8D9A1RJ1F3SEWM1B" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "SGVsbG8gV29ybGQh" } }, { "ID": "a465d3086bb5f62e", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/someDir/blob-for-attributes?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "53" ], "Content-Md5": [ "7Qdih1MuhjZehB6Sv8UNjA==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "12" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "Yw0KSGVsbG8gV29ybGQhDQowDQp4LWFtei1jaGVja3N1bS1jcmMzMjpIQ2tjb3c9PQ0KDQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:03 GMT" ], "Etag": [ "\"ed076287532e86365e841e92bfc50d8c\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "HCkcow==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "Bv8m8jD25jK7UGJmx3ipWh/Kv4JARu+PKVKqJfZP+a/JZ9R+fGKbdEmlvmDWXKdpMKkYGpbdzb5x0Pp0CExvfo83JkaWynb9" ], "X-Amz-Request-Id": [ "8D9205DVRA9ZDF87" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "e6883090ab52cea7", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/someDir/blob-for-attributes", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "12" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:03 GMT" ], "Etag": [ "\"ed076287532e86365e841e92bfc50d8c\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:03 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "3VU6rV5xpj0A7dXMOw3Nod9lrcgfHEcSRbgIktBte6sw3ZrfwLA05TKjrGm1V2NKCzbqdpIH2ap14m+3JM25PK93p0UvYtuz" ], "X-Amz-Request-Id": [ "8D99BF8E3XSY80AF" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "d01c12ed0e6e4c49", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/someDir/blob-for-attributes", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "12" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:03 GMT" ], "Etag": [ "\"ed076287532e86365e841e92bfc50d8c\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:03 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "DMQ7sIVKyLOFNy6rsH0NshmPXqKcgEyUzDoWgZxXmRzbtwNwmkdqPQjqt3wu82iCavZM/ZF8laLKPwEVdoFiTFzRyFPF36Fb" ], "X-Amz-Request-Id": [ "8D9FZ5C2GP2MDXNF" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "1d17c8a94fa00ee3", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/someDir/blob-for-attributes?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:03 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "TEsLZmKYCFRw1iaZMIKeCfzKuFdkTjd+WdMLcxns8HTigXn6ym5lbyHZUHg7j9GT8YCwUEpUNXr7a43E4TdCyd7mk1UTtByK" ], "X-Amz-Request-Id": [ "8D99EJAJBBM9APA2" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestCanceledWrite/BlobExists.replay ================================================ { "Initial": "AQAAAA7hTg0FOV/lhwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "7f7f7211a098b2d3", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-canceled-write?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "52" ], "Content-Md5": [ "XrY7u+Ae7tCTyyK7j1rNww==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "11" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "Yg0KaGVsbG8gd29ybGQNCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOkRVb1JoUT09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "DUoRhQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "rB6iATIJOXbu/s3gPC6z1mZpS2RVjyUQW0zPJvn/gUi5+TEZeLnmm31o+KugfC+CG74nhNUoHdg=" ], "X-Amz-Request-Id": [ "9P1SPDNQW89X6K70" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "16538f0e2c63ad83", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-canceled-write?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "DUoRhQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "u7r9mPSlTqBQucOnzhtz2tEDwdUWwyo10LrqgWxrO1iAroriLUv6daXY2ILkq4PTBzvhtrocoT4=" ], "X-Amz-Request-Id": [ "9P1KQQJD19R58CH3" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8gd29ybGQ=" } }, { "ID": "6bd54cfc1fd2fe16", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-canceled-write?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "DUoRhQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "xtaej0PTp41Cqh1lUanEF7ai05yTNLXClWoBPw3XLLSS3jiqKDqLgpTtDzTfLled+c22wshAGkw=" ], "X-Amz-Request-Id": [ "9P1VC1HEPBZ0V0D5" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8gd29ybGQ=" } }, { "ID": "bd1707d4277b40db", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-canceled-write", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "FtVnDtDaSfgkjYj5q4R5ntxCSKqpJRhWqW8jZYR+H5T5vlmeQdsiXJA3erdo4A4fiQzIA6dxzoM=" ], "X-Amz-Request-Id": [ "9P1RCKQ80R1DM4FN" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "942fcc53815d678f", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-canceled-write?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "hz9n9HqfjaOSfgM9jAo5ofSgBwjOAXsthJoD805LvIf9hmqI+bDLDQzo0ufYbFdQm2e6Z2PEYBA=" ], "X-Amz-Request-Id": [ "9P1YEDJ0GCTVEF17" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestCanceledWrite/EmptyContentType.replay ================================================ { "Initial": "AQAAAA7hTg0FKbKieQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "a56b2eb147cb8976", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-canceled-write?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:05 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "0oJvCxg13e2rtyz0Dr/GA5r3kbJ87TJkEsHT5UOwhi5RdAE6KO8SfInDf7ywrOAVp5otyTPUcTO7Xa0VqOmvZvFrZNItWSpR" ], "X-Amz-Request-Id": [ "P48QTECA4EYEWNRR" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPk5vU3VjaEtleTwvQ29kZT48TWVzc2FnZT5UaGUgc3BlY2lmaWVkIGtleSBkb2VzIG5vdCBleGlzdC48L01lc3NhZ2U+PEtleT5ibG9iLWZvci1jYW5jZWxlZC13cml0ZTwvS2V5PjxSZXF1ZXN0SWQ+UDQ4UVRFQ0E0RVlFV05SUjwvUmVxdWVzdElkPjxIb3N0SWQ+MG9KdkN4ZzEzZTJydHl6MERyL0dBNXIza2JKODdUSmtFc0hUNVVPd2hpNVJkQUU2S084U2ZJbkRmN3l3ck9BVnA1b3R5VFBVY1RPN1hhMFZxT212WnZGclpOSXRXU3BSPC9Ib3N0SWQ+PC9FcnJvcj4=" } }, { "ID": "d87aa9ed7d1a5daf", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-canceled-write?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:05 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "nSKTJ3VmGhUgy/FRS/Swfo35anY0WaaxzuVmU4AJAnywduaMzfUUttZRTq5rACkdG2dh5MTNm/w3MkM9f6+X2uIKxRUEvwQ+" ], "X-Amz-Request-Id": [ "P48SE6ERZ7DJN650" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPk5vU3VjaEtleTwvQ29kZT48TWVzc2FnZT5UaGUgc3BlY2lmaWVkIGtleSBkb2VzIG5vdCBleGlzdC48L01lc3NhZ2U+PEtleT5ibG9iLWZvci1jYW5jZWxlZC13cml0ZTwvS2V5PjxSZXF1ZXN0SWQ+UDQ4U0U2RVJaN0RKTjY1MDwvUmVxdWVzdElkPjxIb3N0SWQ+blNLVEozVm1HaFVneS9GUlMvU3dmbzM1YW5ZMFdhYXh6dVZtVTRBSkFueXdkdWFNemZVVXR0WlJUcTVyQUNrZEcyZGg1TVRObS93M01rTTlmNitYMnVJS3hSVUV2d1ErPC9Ib3N0SWQ+PC9FcnJvcj4=" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestCanceledWrite/NonEmptyContentType.replay ================================================ { "Initial": "AQAAAA7hTg0FMcVn3AAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "434654c3f04c9649", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-canceled-write?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:05 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "LCYN1AFU+luW39ytezCZ37reXc6YsiqASLL/5NPReIDzHSuqDtbqOyEbrDbdAG+O92dqPANfa0pCDvUHF4OkGguQ/5VY3QEi" ], "X-Amz-Request-Id": [ "P48ZVA2B2HQQN2HC" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPk5vU3VjaEtleTwvQ29kZT48TWVzc2FnZT5UaGUgc3BlY2lmaWVkIGtleSBkb2VzIG5vdCBleGlzdC48L01lc3NhZ2U+PEtleT5ibG9iLWZvci1jYW5jZWxlZC13cml0ZTwvS2V5PjxSZXF1ZXN0SWQ+UDQ4WlZBMkIySFFRTjJIQzwvUmVxdWVzdElkPjxIb3N0SWQ+TENZTjFBRlUrbHVXMzl5dGV6Q1ozN3JlWGM2WXNpcUFTTEwvNU5QUmVJRHpIU3VxRHRicU95RWJyRGJkQUcrTzkyZHFQQU5mYTBwQ0R2VUhGNE9rR2d1US81VlkzUUVpPC9Ib3N0SWQ+PC9FcnJvcj4=" } }, { "ID": "287e05574b930356", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-canceled-write?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:05 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "ywOUrqPYi1k35AqPGXeLfgQ6e4IrTdyJuryGezpJmMJ+HWlhTFg3533n+sNCQ7VGwLwSZ9uwGFWJDu5sFDOThNHEh78SciZB" ], "X-Amz-Request-Id": [ "P48QBQM48W62XR24" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPk5vU3VjaEtleTwvQ29kZT48TWVzc2FnZT5UaGUgc3BlY2lmaWVkIGtleSBkb2VzIG5vdCBleGlzdC48L01lc3NhZ2U+PEtleT5ibG9iLWZvci1jYW5jZWxlZC13cml0ZTwvS2V5PjxSZXF1ZXN0SWQ+UDQ4UUJRTTQ4VzYyWFIyNDwvUmVxdWVzdElkPjxIb3N0SWQ+eXdPVXJxUFlpMWszNUFxUEdYZUxmZ1E2ZTRJclRkeUp1cnlHZXpwSm1NSitIV2xoVEZnMzUzM24rc05DUTdWR3dMd1NaOXV3R0ZXSkR1NXNGRE9UaE5IRWg3OFNjaVpCPC9Ib3N0SWQ+PC9FcnJvcj4=" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestConcurrentWriteAndRead.replay ================================================ { "Initial": "AQAAAA7hTg0GDc8yrwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "ae3b45018c676cc3", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key19?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "2w9S4aRqKABHoeAhyiAJMA==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "MTAwMA0KExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEw0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6eG9SZE1BPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"db0f52e1a46a280047a1e021ca200930\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "xoRdMA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "jQr/6JatdjZZWORmrFfqM416h83Ytp6h16jl2vHZqc1+S0hYNq+RyeCEwpLWqB+t0B2QeNC3Xx1J53YTTwvxWYhByzxcT2vT" ], "X-Amz-Request-Id": [ "9P1MN1YQPX1B6TEK" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "4bea1c4d98377416", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key8?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "qPZPE0uAGBNKE6LhEQTA8Q==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "MTAwMA0KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6UlBjNHJRPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"a8f64f134b8018134a13a2e11104c0f1\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "RPc4rQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "LWNKYyLbnSyjK0jLq/36uqvRyk7Jdt/j9l1Bo1LL6ODsRGWdRE1DAcyhf9k3NJYhjJ77OYs8sAqFsLCV7VeBGSibqntVLSRO" ], "X-Amz-Request-Id": [ "9P1JRAT6XYK32A9P" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "99ae374b89111d56", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key12?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "VkGQ+3LJseHAFopbb+BYvg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "MTAwMA0KDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6QlFLazh3PT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"564190fb72c9b1e1c0168a5b6fe058be\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "BQKk8w==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "0EZdtgTxky8pnEahhv+B6U0xFevThBG0qZQ9X2jlyHYe4OTiWJkFkaBzIBCyQFlN4dPeCO/OaNQzYKoI84tMknJNxYmCT4Dj" ], "X-Amz-Request-Id": [ "9P1YHH4NJREAYSF0" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "24a2b4c77d1dcf4c", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key0?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "Yg8LZ6kff3QVG8W+dFtxEA==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "MTAwMA0KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6eHh3QUVRPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"620f0b67a91f7f74151bc5be745b7110\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "xxwAEQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "1Q3bMcqPS3VUBjypYf5mPvAr/8o6iGNhqOO0zitoDCfallPyL9TRTij1TCHaLuC81hz34L7XH4CM5Tlqp6nAbQxXVRHe0ZZF" ], "X-Amz-Request-Id": [ "9P1MM4WH813MRM81" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "760c1bb9c0597619", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key2?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "ZUHn/UhoC5tg7AVev6McAg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "MTAwMA0KAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6NStiT1BnPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"6541e7fd48680b9b60ec055ebfa31c02\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "5+bOPg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "xeh7LtOMKi4iYltcF51paBU9UMdrT3xAtSe+kc672EFnpTsFhDY1A7VMIrSp3Nii/JjL4Ye0uKybYtV7/EscIKHfl70JNsBA" ], "X-Amz-Request-Id": [ "9P1W1B1670TTZPQ8" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "16832c1cdc70c836", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key5?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "YfRaKQkG0Wv1UeeMsD1f+Q==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "MTAwMA0KBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6ZXl4NGVBPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"61f45a290906d16bf551e78cb03d5ff9\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "eyx4eA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "BT+SK63s2UmrRsCPICnz0Ip9g2ezl4iDvttECjwfOxDtwnGOKmeEx+RT77dOvvljJSN1LvTr+oO60ylWlpQRg2UGqjWEgz+v" ], "X-Amz-Request-Id": [ "9P1TS04QC0X2Q0ER" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "a8706b9e57291403", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key17?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "32eeXsj7ZyhCl0o20wPQ/w==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "MTAwMA0KEREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREQ0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6NW42VEh3PT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"df679e5ec8fb672842974a36d303d0ff\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "5n6THw==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "01WPpdfOgnPpZnPDtxPE5T9jgRR80JeYTrPWYRNe4NrJhuKjCuDk8lwM9jDAWAhz+Hpb1xsQQXS652tvIMcS05gj6DpLu2yO" ], "X-Amz-Request-Id": [ "9P1P3Y865FS14SYM" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "7540ff648f8298a1", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key16?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "65n9CjdrJkNQEaG4fFWMgQ==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "MTAwMA0KEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEA0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6Rzd0M0tBPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"eb99fd0a376b26435011a1b87c558c81\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "G7t3KA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "TUCiZEmfu84+Nb5bHh88Wf/yJ1ZySbvixHNZgaMzTppYVyNMja56DJ+5CvM97CG8DBnirZdUkXESP015n2AENhrr7kNUh011" ], "X-Amz-Request-Id": [ "9P1HH1NW8G9QT8J3" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "a7afa4096ff15d96", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key11?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "AbDmWR96f1VIFnW4JQ5/SA==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "MTAwMA0KCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCw0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6bWNnU3RRPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"01b0e6591f7a7f55481675b8250e7f48\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "mcgStQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "h8T5eNurJRVyp++7fGtyyL/JqDYvMmKeqEY9OvYSnXsVH+4vGizKkibfPSNql9Q1D8k00VpyeHl26sQX1T8X3MEt9ahzH137" ], "X-Amz-Request-Id": [ "9P1WZNTVCDN7FGF3" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "fa196f70241cd074", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key13?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "SsTzFZ3m7R1NrIc42UKW+Q==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "MTAwMA0KDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6K01kQXhBPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"4ac4f3159de6ed1d4dac8738d94296f9\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "+MdAxA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "j2o5d8l9gWIgXyFFdMDtawLrU0MeCoOgTEG9y+EkOT5wd2Zb1habM+qpZKQ3AYcE5M80OVyIA8fXIKJO4YhY5KsG2ZLCRu3H" ], "X-Amz-Request-Id": [ "9P1Q9S77EFE1KFFC" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "d1abe01518f2c28f", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key4?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "H06jyF3ZsJDOcwyB5gg+zw==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "MTAwMA0KBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6aHVtY1R3PT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"1f4ea3c85dd9b090ce730c81e6083ecf\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "humcTw==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "ymXzhGhpDsOQyq11x5s0fNYTqO94oCJCbmu6CMDvLitQz2pAZtOJFAZTM8cdN23ZEoxvk+0MdyuD1Sg4aujUdRH0KiDG7yF/" ], "X-Amz-Request-Id": [ "9P1WKRWNWDRX30EY" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "9f1307767876fd4e", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key14?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "NlFDUFM0TpF1S+MXE1PxDg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "MTAwMA0KDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6SmZocTNBPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"3651435053344e91754be3171353f10e\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "Jfhq3A==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "Di1Eg+DpQJeObs2xGEjkYzdDlKnXV5XszeeGPP04gmlZZIrJtrG6+kz+7/LjSj0lEe8tMWSWSUptbDVr0mSb3tTLRY2Hu8zr" ], "X-Amz-Request-Id": [ "9P1XGNG92G5F5ZK7" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "bcaaeba3f754d61e", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key9?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "kfsiuKRZ73D7CzauKodAhg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "MTAwMA0KCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQ0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6dVRMY21nPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"91fb22b8a459ef70fb0b36ae2a874086\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "uTLcmg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "7wL/yym2IRL839EbWrMRNB0x9Dz6Ydg2haxIfcaFWIlHzqwrCoBaj3Q3y/zb/5EUmPSCF1mu4IjZIgkbUV8GBlEjrqaJmAIR" ], "X-Amz-Request-Id": [ "9P1ZWPSW22AZX1HM" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "52e87d0e49b80f74", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key18?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "wZvI1MtOgANGQD0gzZ4NUg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "MTAwMA0KEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEg0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6TzBHNUJ3PT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"c19bc8d4cb4e800346403d20cd9e0d52\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "O0G5Bw==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "dYr8Qnzwc07wCNubAL47b7YuigGZSLL+dSGjC6Ca5OS7tG7pq/WkYdBVZE5s2gLg/Z5IsnLIg2OXkiWFlmSR9wImoTSI9Lxn" ], "X-Amz-Request-Id": [ "9P1S99SJCK9JXXTW" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "211606f0846fd4bd", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key6?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "lko2uDqoJrgEyYNnvcJ6vw==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "MTAwMA0KBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBg0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6cGhOU1lBPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"964a36b83aa826b804c98367bdc27abf\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "phNSYA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "n5wDaTdHMI8+R77kvsnm+1GrAvMXNlMqgsKN3XgrHX843w3Er8zcJn2MCnHqM+JdDysCnnV8YyqJZPJQeobsVUwihGiUyxBf" ], "X-Amz-Request-Id": [ "9P1QSFHFY88J3CWV" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "3e3bc46a17150677", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key10?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "AXKK1JVcZ791KxchIXYNNg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "MTAwMA0KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6WkEzMmdnPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"01728ad4955c67bf752b172121760d36\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "ZA32gg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "0fDlH+qP2SpDfLIZoOJdeWlZu1VtfYEKjv7Fdwnkcq+kM7dlj2XaW8mrbk7lDT1M7TZAzcm/B7/JdwAIzHf5JP35qmzQRS/6" ], "X-Amz-Request-Id": [ "9P1WX5WAM3P9Y1HR" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "c8147e185415e682", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key3?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "7tBPOyKIo0omYOmbN3Ht7w==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "MTAwMA0KAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6R2lNcUNRPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"eed04f3b2288a34a2660e99b3771edef\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "GiMqCQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "88DO+dBkW59KOsc1ubBD12qQLQwzo578+jZwDBheEAI/3wf/XBiv53/gkn5O6eQiVobCrAvctU4FWrSXJ2uGoy4MpjwpQpAt" ], "X-Amz-Request-Id": [ "9P1ZT357VC0B1EDB" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "8488f1474cb42d1a", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key7?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "kbuiTp5JEugjwAkgztPoXA==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "MTAwMA0KBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBw0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6VzlhMlZ3PT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"91bba24e9e4912e823c00920ced3e85c\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "W9a2Vw==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "c0rp5yLxoCuw5HCcvvFy/UvGFHx0F8hYmiHJYhomqSItnI2ncW4ycKdBSeUb+w4pGyFPGAfSehWmTjnk3Afsvg8215b30xVp" ], "X-Amz-Request-Id": [ "9P1R1Q9SV2ME9VQ8" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "bb6be050f74c02d3", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key1?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "qo85ln3rRBpudISWOUWpYA==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "MTAwMA0KAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6T3Rua0pnPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"aa8f39967deb441a6e7484963945a960\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "OtnkJg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "Qrog7QZI84RKi27FPdGYLnbOwBgC5XHmo04iO1fj2RQorCLzaXRFBUoHSTd3Atq3IO0zx7mx1h20S0U+IvI9PAicKoP5DUX6" ], "X-Amz-Request-Id": [ "9P1G6ERPZKMYFW08" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "ca8f1448e9607766", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key15?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "qHqy3TOCPLWABZ/YTEeiAg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "MTAwMA0KDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6MkQyTzZ3PT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"a87ab2dd33823cb580059fd84c47a202\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "2D2O6w==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "5o78skI02lXup/XIshdFnSODUbqc4tm1NVVUV/BpH5DXNKc6sgMvvKbZrHzkfcQZxIcgLIQH8VEveQ5mBP7FWonlSaXVPMqb" ], "X-Amz-Request-Id": [ "9P1KTC45S5BN8ECV" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "21f353e200ccc348", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key11?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"01b0e6591f7a7f55481675b8250e7f48\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "mcgStQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "8FdkhBE169h5wvlFLlj9VKKF2di3WsptyDJ0NZ3C4gqXQPqz5/+Jd1V1jsnrWnVoHO5QqNXrxOaTHz2kerCaXJJnwKSeds8O" ], "X-Amz-Request-Id": [ "9P1M8MXJRVSV4ZG5" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "CwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCw==" } }, { "ID": "79579d1fdfe0039e", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key19?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"db0f52e1a46a280047a1e021ca200930\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "xoRdMA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "qSts4v3Xoh08y5No7ZSlCFyKh3+tw53o99XPZ9ouLkor1xN8nJNnqb0YgWOwB87BaT5y4RGRTEF+B8wat04dWyOKgo9XTNUt" ], "X-Amz-Request-Id": [ "9P1R4VPHQKS0PB79" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "ExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEw==" } }, { "ID": "a49a92231009aab1", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key0?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"620f0b67a91f7f74151bc5be745b7110\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "xxwAEQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "ZQK31FRQx0HCJVD+slpjm3YvctOhfBdpQcfUSPnQsxm2quEfHeNRG4MjayR+4zOi78LW7qTiSiNiMcSkYL3UOJZXRccHHWbL" ], "X-Amz-Request-Id": [ "9P1X4SS3B7K6MRX6" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" } }, { "ID": "6b8b67318757a228", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key4?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"1f4ea3c85dd9b090ce730c81e6083ecf\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "humcTw==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "eQnpzCR92sSzwpoT251DO3vFcXk2eSY2BlPqiMe9c0f6PiVLtx19Qpx/RwRkd4cTUC44m+70zWZerzEXSrRH5LGPp8f9TzFi" ], "X-Amz-Request-Id": [ "9P1PJ8DNG59K14ZQ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA==" } }, { "ID": "cca0144f3b1a6e23", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key10?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"01728ad4955c67bf752b172121760d36\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "ZA32gg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "LP8yl8rOAUP8F+YB9U3JLw7PnUXNglnf6f2uXMBLNoFn1hro8RkuF9Yy3jPVHhrFGC4BAWo4PMs=" ], "X-Amz-Request-Id": [ "9P1ZY1N4FSGJYYWA" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg==" } }, { "ID": "e40085efd0eb5d36", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key16?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"eb99fd0a376b26435011a1b87c558c81\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "G7t3KA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "F+L/1wwUH/6t61uS/MpFbmDuBspLUmTQ0mtg/k/0MFqcf6+R0TLvJCRx2T3L6sAGAnLLx9aTTls=" ], "X-Amz-Request-Id": [ "9P1XJWCACF84F4W7" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "EBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEA==" } }, { "ID": "01f8a15751ee365a", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key14?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"3651435053344e91754be3171353f10e\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "Jfhq3A==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "M/eGeUIDwFBWZpF/g27XemH3ckWpCVPCBakjn2vlGH+ABijjhYnIuSgHG65HyFZx2EeRKbUrMH0=" ], "X-Amz-Request-Id": [ "9P1NGAVKTGMSFW07" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg==" } }, { "ID": "de59c4f80cd569b9", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key7?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"91bba24e9e4912e823c00920ced3e85c\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "W9a2Vw==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "lub4GhBfOLUTKG5lgpvMCb9fW2JY1XE1DWTDH/7jh5jzH5QuSSygU0Upl2t4SwH9EzI86NGHo1E=" ], "X-Amz-Request-Id": [ "9P1XHBY7ACS3SR55" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "BwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBw==" } }, { "ID": "98a4dfffc387ce6e", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key9?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"91fb22b8a459ef70fb0b36ae2a874086\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "uTLcmg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "6FI4eq01SClpHEYX5mWcMSC41mxG0ON6WDIhz7e593HECOLNu+1ZjD8p8nLyjKJ79nTxSFrxW4A=" ], "X-Amz-Request-Id": [ "9P1M6CSR6GKXVJ5C" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQ==" } }, { "ID": "8735027a9667e37b", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key17?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"df679e5ec8fb672842974a36d303d0ff\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "5n6THw==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "kqbMu1T9Ql2COL4eS14+s+6g4kvWjIokXoCPn6qP6mm8XMrmkhfqr+u6v6GUK+UcYVuy7swEQ2o=" ], "X-Amz-Request-Id": [ "9P1Z8EZB7KZ7X8X9" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "EREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREQ==" } }, { "ID": "77c854d2c14b124e", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key2?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"6541e7fd48680b9b60ec055ebfa31c02\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "5+bOPg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "LqcmrDPwA9TXxDqBVuj5XPZwu7Yy/RbuSLiNpuCeVhjoE7nGP/zM9Puntks2li6vHxcwETraKTA=" ], "X-Amz-Request-Id": [ "9P1HS188MM2RYVVC" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg==" } }, { "ID": "d48f433fcf781231", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key8?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"a8f64f134b8018134a13a2e11104c0f1\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "RPc4rQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "trpXP6dNZUzuhq63GEM2oBBh2DkK6obN6P2BjfFnwlcvVTySLo0WPl4NZ5/uMOsh1jRphsuUBKE=" ], "X-Amz-Request-Id": [ "9P1Q232DPJEP4FS8" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA==" } }, { "ID": "b2d57277522d6d84", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key13?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"4ac4f3159de6ed1d4dac8738d94296f9\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "+MdAxA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "LycbNPGS9XXH89IyO15ArBsUle0KojTS0vjXpyHKeZIctIxqmZ88SrZidGdoxo5AkRHkEFFLFpA=" ], "X-Amz-Request-Id": [ "9P1PSP4VNDN4E0PY" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "DQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ==" } }, { "ID": "a17865494f25b3ac", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key5?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"61f45a290906d16bf551e78cb03d5ff9\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "eyx4eA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "Z/4V2yrDs5L2njZxKaIwB2SDUUBW5qS9Z5Rc0Tvo7BeKPseKHnbKGSN1ZND+0IHGUEMcxTQePcQ=" ], "X-Amz-Request-Id": [ "9P1TK1A3XS29PH14" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ==" } }, { "ID": "55a86893ebbe04e7", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key6?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"964a36b83aa826b804c98367bdc27abf\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "phNSYA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "Swjfedcxf8sk//kFJtHbj51UetwDo1akgcoldyKcD0fPa2W+xQrBbC2f89yV21nv6pjIJVJOAqQ=" ], "X-Amz-Request-Id": [ "9P1JDXRW0ZNRC7HJ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBg==" } }, { "ID": "4eaa3d8d569904c2", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key12?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"564190fb72c9b1e1c0168a5b6fe058be\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "BQKk8w==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "wC6ZgjSmN0QFltcNdWjSE+WXMfDJDdD2gOw3ZBw5M6rE9CYsGAPV5IDcvRYbmvC95R360MDRYaM=" ], "X-Amz-Request-Id": [ "9P1PVV8YA08ZN21P" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA==" } }, { "ID": "a164c5920155c326", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key15?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"a87ab2dd33823cb580059fd84c47a202\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "2D2O6w==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "9XHwY2X5Hma+uh0UxcwOcmgAwy8LDjpCw583A2owkNr+eE0fJ5t0Mh0lfcc+TKX5LwE9NM4WBo0=" ], "X-Amz-Request-Id": [ "9P1GZPB9B07CCGZK" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "Dw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw==" } }, { "ID": "72b3c43f5d14d7cf", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key1?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"aa8f39967deb441a6e7484963945a960\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "OtnkJg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "LWyXLdVeOeuCXsYx7fJdJaATf8Iw4/gXFg+iY+H/pFfEPRG0m8O5oFs7Ost9lxecdIkcNEpSbHU=" ], "X-Amz-Request-Id": [ "9P1ZRHZM9AN1BF3T" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ==" } }, { "ID": "b1921baa46654ea9", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key3?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"eed04f3b2288a34a2660e99b3771edef\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "GiMqCQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "Yib4mIf3YdXZU7oRkZ+fXyMm8IIXIFuu9wBK5HOvj0YmTlEa5SSLobVlRy7FdjYtqRJEFKvuOdA=" ], "X-Amz-Request-Id": [ "9P1YF2607VH31AJW" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw==" } }, { "ID": "3220844614875179", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key18?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"c19bc8d4cb4e800346403d20cd9e0d52\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "O0G5Bw==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "543yoD1cynHiNEUoJUeJ2N/r3nBb7nVuJHov5jfIp6ocrcJr8+WLOjoaY25qPSHhdmJyEypEnvhCFS/pEj+rrZRKrc33JYA9" ], "X-Amz-Request-Id": [ "9P1KHXWV42RN5MFJ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "EhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEg==" } }, { "ID": "25da29944b18cb2b", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key19", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"db0f52e1a46a280047a1e021ca200930\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "dwQlI6nWc7R7ViExfApjY1CbGgRSaYoRz6ymYd8zEE/vO+2YsU/N5EZBkITw0jQJnGpYRTE4ou7bXieFEWccRMlTQsXo1xiK" ], "X-Amz-Request-Id": [ "9P1GHSTNAM8BC7JT" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "efa716518e01c0c6", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key19?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Key3Kn0wC47kkuSRhF3zxxXqI0h9KxVUaJRFvkIvi53MY5GGjC9ZRkghelyj0d4r1h7dwQErJk2xoE83raAFQ4bHHLEDTV1Q" ], "X-Amz-Request-Id": [ "9P1VWDP3JAF0ZWCC" ] }, "Body": "" } }, { "ID": "f74984f23db79569", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key18", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"c19bc8d4cb4e800346403d20cd9e0d52\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "p7AD/5uUAIxH5TIu+NjUItjCJyEQRUnd2tq8d2femKd4ziluSKhTDWH0tuCSZeVGRQRoObYNcV0U/Lb/bts9CCPe5hRbek7J" ], "X-Amz-Request-Id": [ "9P1ZGX7ZC0NA6260" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "8aab6b29384fe943", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key18?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "eseYS285JMJ8+211pfrN1U37DJpDrrhPbaw722ViRaPzTZAL9idT2CiuIGilUMj2fi5QVFqJUW15bMI8f/4Ze7c0XFz2DgPm" ], "X-Amz-Request-Id": [ "9P1XXYNGY9DK8VA8" ] }, "Body": "" } }, { "ID": "d764f9cede237926", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key17", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"df679e5ec8fb672842974a36d303d0ff\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "z8bXfXAPE1hrM09lhB3B8pR8AIi6lCh6R5ogrxybZsTwqYOvFm2w3Muk57LufbuaXZn4m+ymzF8Z6WvsebTbS1P8+1OnxbOB" ], "X-Amz-Request-Id": [ "9P1SYXPVZKHDX1YG" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "09df45b9ba499361", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key17?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "leu3ocNcFYJvQHwSXOUk+hwEeNNZ3pWMNQ0ZB9vR+HEQttYl7NyfD7GTdFNgt+di8wbtnrCyBAu0yvkMCAd6PMJ4GCXUeAtX" ], "X-Amz-Request-Id": [ "9P1X0T9CCFRYFM0J" ] }, "Body": "" } }, { "ID": "9fced115963a2c04", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key16", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"eb99fd0a376b26435011a1b87c558c81\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "aDGyB1+9bvl9WUunhZBMMEhnyQZZlGCGcLSETYI6+4gYTT1mxg8HWkU8y+7r0UlGufx8JRJvmjpFbAdukuk8rW6WM+/CC9/E" ], "X-Amz-Request-Id": [ "9P1WKVQK16P04P47" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "da5c9854e9e75a2a", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key16?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "+zyodankdIVXlclctBiHSIXdP7mIZ4LknpIT4+x7ZMkbiTyVjAqEEictxk8AaqWD5yT3ERC7fkg7Ce/TZGsTk8pP4JVzjZlZ" ], "X-Amz-Request-Id": [ "9P1K6R8AE9AQT39V" ] }, "Body": "" } }, { "ID": "46ee94c7bdbfa8c8", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key15", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"a87ab2dd33823cb580059fd84c47a202\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "geWflAUmfNGnG9cHaaTpBEjNaRlvJNkMLNqnY6swlTmyfTqYGFRPn+V4hr3SBOfYaNuXykRM5SSivovg0aHYkEaoeGmwNiKz" ], "X-Amz-Request-Id": [ "9P1MTXD729JF24J9" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "86d61b27e10b196b", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key15?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "3rzL+suKnYi5f0xFmuEa52CbfeIwJEApciC6EsDf1EWwtdJKuoCkEzIVtYntjECRN3Vm4f0ayY9vtsQGkW0DUCzFwdR8AomH" ], "X-Amz-Request-Id": [ "9P1QZXMK3XH3G8A9" ] }, "Body": "" } }, { "ID": "49e9ae45f2e6e992", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key14", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Etag": [ "\"3651435053344e91754be3171353f10e\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "tBMQZ44o4ZHH1vfyXD17WzIw2lenPRalkwVpMn3tZiFNA/uVTZjzIR80fXN9EbseTZM2smCc6GPGDQUBMO7rWtJ4+IhSNpWA" ], "X-Amz-Request-Id": [ "9P1NWC13G0J67SEZ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "5a454e4e3a0be3dc", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key14?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "xqIXccArSFzUegdk1OlsRY9fDSgAOfF4TI2HbTQseo6xS0MJp2k9KFFqzBJvQyPwaD65dG/ELWOvcV6Gfq8cBYE0TgKz2wKH" ], "X-Amz-Request-Id": [ "9P1S6R943W2NJYGN" ] }, "Body": "" } }, { "ID": "dd597078b28c2db3", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key13", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:08 GMT" ], "Etag": [ "\"4ac4f3159de6ed1d4dac8738d94296f9\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "7UK73IFGeqwX/qVo+cgC4krTZvX9RYZfnGfZJ58ptGCgP1ISWRpJzojJU7yNSQtsnHD4JuozflQcFFofFTVNgE3Tx01yQ7OB" ], "X-Amz-Request-Id": [ "PF353Y7VY422FDX7" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "7288eaa123692d45", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key13?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:08 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "vYolpByh+jkJRdNGtIyGnZbaL9RhGG4B+SObgZU64+F63JhiQhweJw8hw/LQF7Wst7IELBjEh8er9tXVMO87T78Qad0Tvwfz" ], "X-Amz-Request-Id": [ "PF31WB9Z72HTPVMA" ] }, "Body": "" } }, { "ID": "708975fe5daf3510", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key12", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:08 GMT" ], "Etag": [ "\"564190fb72c9b1e1c0168a5b6fe058be\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "wp+4Y1lev96l5SQVI9Nlanx0eRIihdozptP3mgHsaBIeGhbYgMBytDJ7w8oIp4h/NSmSKaflg5FkwcUxhou3DJ5mGeNijCJE" ], "X-Amz-Request-Id": [ "PF35EY3268DXXY58" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "8da21990fdc9889f", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key12?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:08 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "8PcKMAJHT0QCIzIfaDPYbHdFhgMhzvKw+xTQZttuRiyfE/CtRvYUDWXY09pAXjBTTF5DXD8u+qoXJXWMozuvluv5nKWe/Q7X" ], "X-Amz-Request-Id": [ "PF32KQKAB2JN2BDV" ] }, "Body": "" } }, { "ID": "e23b5e9b8940e4f7", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key11", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:08 GMT" ], "Etag": [ "\"01b0e6591f7a7f55481675b8250e7f48\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "9n3EFazGvt1pgDARtKsHsuhP7kHhU82pTFR/28VxFSKIavVFqHEJePqzj2e58UNcXmpQNPQajwNOS8neTgkaQhLrFu9hsNPr" ], "X-Amz-Request-Id": [ "PF36K4GH92064X0B" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "96fb2bcd85e3ec64", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key11?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:08 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "ysY5JE75vCaUQbDW/dDInjGnlMVfQR2zY4kUsq0ZXeETq4Yhj80yUEd2HXq/JB0ycTBPZA5X0F7kQoOhf2obKUuzGrW0r2s8" ], "X-Amz-Request-Id": [ "PF3DA8PWDSJ5WR71" ] }, "Body": "" } }, { "ID": "be444e673cbe21f9", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key10", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:08 GMT" ], "Etag": [ "\"01728ad4955c67bf752b172121760d36\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "XH414//PaeneIV9gLUB7Bm1Myj/eIIiSW6FkggZNpV9mywktrJG9454LlkJLOl+WpB/oiFu8IKKfWfgD0KOYOcGivoLPaz35" ], "X-Amz-Request-Id": [ "PF3012DA0C4JW252" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "987374981b5373cc", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key10?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:08 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "ElNmBCAjBfl0eeYZPiIsnKLkS530fqPxQkKXkYHS5vi25sjdTfSGUvM286nM2pW67dLj2dIoBw0siFZCFXBwCgUeYd0JpXkV" ], "X-Amz-Request-Id": [ "PF35B7RJ0TGSAY33" ] }, "Body": "" } }, { "ID": "06af4158b280f51f", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key9", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:08 GMT" ], "Etag": [ "\"91fb22b8a459ef70fb0b36ae2a874086\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "7j1K3CiFNlBf75niAAPLArKhLQ9FG2e8gCJn8pYWpX2jDqlbtP6PGokhfcAknHrWWStgnfY1YLDT+YfISE+3PuJDI8nqq8r5" ], "X-Amz-Request-Id": [ "PF321HKHE608PZMQ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "21c0a9f39170050f", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key9?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:08 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "2wJUFsYTVo22D5CcoVjNFRkWwRiViDbfCjunMgXz1wy7v29O6TY/9SYktdUHL19wd/npdv6+P9j3OFmVTRcOtQf95/5Tun5r" ], "X-Amz-Request-Id": [ "PF3ENPYBG8HH4A7E" ] }, "Body": "" } }, { "ID": "bb272d4b2e5f52c2", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key8", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:08 GMT" ], "Etag": [ "\"a8f64f134b8018134a13a2e11104c0f1\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "CTkAxC95TvVLZwD+Zd3Z1POW5ilwzzvO6GYOvYMJF6tfL4oX8zyNAPSMLvGc3vhiVjkP6JSw10LbjCKY5eOi/5gNaaQvwHWj" ], "X-Amz-Request-Id": [ "PF341K0V4M28NSKB" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "bd1cb4e18846c0d3", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key8?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:08 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "dZ/dQcyZ2U+Q8/l2+QitF499iZdBgad1WeCy3Ub23bFQ1sbCqt+EBkjQ+c5ZB5Kjh+dmkSJrVfvVZmD7CC3fzek9ZD+0YSdO" ], "X-Amz-Request-Id": [ "PF321YJGT3F1H4QD" ] }, "Body": "" } }, { "ID": "e4c246cb2cc6a688", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key7", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:08 GMT" ], "Etag": [ "\"91bba24e9e4912e823c00920ced3e85c\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "/bGn6ReFwN94LtHND1nM9dW30ul6oS3MoC4DxSFOxD5xSUfKbZjbIexX9x7EkWAI5ID7a7GVPa7yLETGFgJ0XKqb+KCYOoSk" ], "X-Amz-Request-Id": [ "PF3A9G2S4C5FWSH2" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "bab42d55fb74c0ab", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key7?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:08 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "XDwTRlc5yNkkhwKenaSgp7+skqa6pbIg1fUj9eg0jAuAS/7gsqu5g6C4I8kPvN52mKXCeI7fZjmBwfpTrVIc6Uw2UflnhRJI" ], "X-Amz-Request-Id": [ "PF399CK3ZHRP1QQN" ] }, "Body": "" } }, { "ID": "3281faf9c1a7d1bf", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key6", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:08 GMT" ], "Etag": [ "\"964a36b83aa826b804c98367bdc27abf\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "vH5MdizHqfQNtxks0iFD+dkhykyK1Wu6e8V7yxTCru+qzTUnA2Vd2zzL0hQVvz9paCakPxORZn3wGWi5f+q37consUiTbqkK" ], "X-Amz-Request-Id": [ "PF3EE2Q5GNKDSKB0" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "d60fe0783feb2195", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key6?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:08 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "1v+vKG6gHobqH3LxfxmSYYr62yxdNuInYtp9bSBN1Nhozjd65q/agVXE16mcMWilR54BQpDlMlvFgOGGFLwB3DYLaHfNdUZk" ], "X-Amz-Request-Id": [ "PF3CZV494XYXR423" ] }, "Body": "" } }, { "ID": "e0fca0aabcae667b", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key5", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:08 GMT" ], "Etag": [ "\"61f45a290906d16bf551e78cb03d5ff9\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "MtDBssav2EDie1P4ytgvmWum2tBIaoanD7A1WldyLg8I2F61crkw3SyrYyHdZoyZea+BWasUbqoc5ZtLH321+D93YDYYFBRs" ], "X-Amz-Request-Id": [ "PF338TDWJTVEJ0BA" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "3ac9e111c4b4361d", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key5?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:08 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "BKhx0bpfOL0ip3k72lFTV5F/6ETxajxlZMf8kr0sM03dghIp6q0/1EHMN2f5evMPSYkmJ0Dswd6eSMxzQXGyKHrMYQxrwd0D" ], "X-Amz-Request-Id": [ "PF30PRVXSK1TNJHP" ] }, "Body": "" } }, { "ID": "b3c0e74dfae0457f", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key4", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:08 GMT" ], "Etag": [ "\"1f4ea3c85dd9b090ce730c81e6083ecf\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "lf8SB4x0BoHLF+0f/6q8KRXwGvmLPh6jQ6YRcAQlVrEQvH3owrLX5iuOpS6jWsBBNXmFidmwnJ4Ncsj9Te03oFDWHre3GIdG" ], "X-Amz-Request-Id": [ "PF39JE24680493P5" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "ea6a72dffb56cefd", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key4?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:08 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "HpxL5H6ICF7SvrMR2tGTKODCQxM8arKaTKVXAoQLZSygSfwuvLVKTyYeRe5VcCnVPfm0PcZKMKJ5la9A1AKhvXiiTUkeVUCb" ], "X-Amz-Request-Id": [ "PF389K48J3YARGXT" ] }, "Body": "" } }, { "ID": "3c5c9702880a20ea", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key3", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:08 GMT" ], "Etag": [ "\"eed04f3b2288a34a2660e99b3771edef\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "TO6tKrgJxP+98u85i+wjbZKxwE/40LRAG/8iiLRZ4l0cGtH8cyTlKeNGQF+Dc192mF/DXo6NFMcMBbYEp+4pa5CynfougGF7" ], "X-Amz-Request-Id": [ "PF3DNXNWWE1Q0RDK" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "2197b633633c9245", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key3?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:08 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "ZFrcV/RAu6KdznrrskGjV+BeOmWZykd0LB1clyuRt2DmLMJUqAbo2NQsbcYHUzHBG71hrdgX5ee/LDVtwcbYM53OpDlVfxb9" ], "X-Amz-Request-Id": [ "PF343B2FSFVY9C84" ] }, "Body": "" } }, { "ID": "ae3460fb61f3526a", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key2", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:08 GMT" ], "Etag": [ "\"6541e7fd48680b9b60ec055ebfa31c02\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "uauFIWG5iKo2+IDx1XtlNmDB5KH9FasqMN4wcu8kR16Cv3a/qeOgDJflVHxAFEKLxg0SsQLKAGGAKKtw5Mn1Yl237Z1s2Deg" ], "X-Amz-Request-Id": [ "PF3A97G3YSNTGAM4" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "aaef209f97974ef7", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key2?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:08 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Opn1cwrGrBpDk4U05193/pz8V0dITZOVodNJIhqSuil/qCt1LlwY1NlYGaV+0SQNzlH3WaNNJCXy7eXNAVLtxAGdu7TS39df" ], "X-Amz-Request-Id": [ "PF3AMDPCFZB8HRF3" ] }, "Body": "" } }, { "ID": "239270fbce6a5413", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key1", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:08 GMT" ], "Etag": [ "\"aa8f39967deb441a6e7484963945a960\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "5wKRR8FAoqSwPWDqw4qbxQhcMmMLhzwJ3x3/CoHsDhylP0RLugtC+SpxIA+V+CjclLkJuVzw9CCcrtsmUAmeoI1f/GXdkJlu" ], "X-Amz-Request-Id": [ "PF37AWCQCV9NTHFZ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "c35dbf33228c468f", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key1?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:08 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "NExGwSCFY7quRKf2sdGQYRyfJ98fuksZtzhz4HgFreYxsTv0RTII48tL9l5QOoEs7X6jGKUwmwjw4ilCScmj0p2dG7Lnlnik" ], "X-Amz-Request-Id": [ "PF3F8XEQT9W32JXB" ] }, "Body": "" } }, { "ID": "0a8000e7a1968395", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key0", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:09 GMT" ], "Etag": [ "\"620f0b67a91f7f74151bc5be745b7110\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Ha17HBMtFdmrmyqjQhcStRbW+qFPwfr8+1Kb5rV969i+88DKEcKgDuYoERdXI+JfunTpCtEVpwLQ66pOBbYFM3VNGn8D3bOK" ], "X-Amz-Request-Id": [ "1M914Q2V3NHQZHJT" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "9b279c80f032108e", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key0?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:09 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "xU2D+POYssLK9AEmZhRB4to4GCn1zJMNYtpmH9yqFQMWeyctuFDWtPbrybCujmsiJ6VhupX2ykuHfEsty4MFVp9HVVU6HXWP" ], "X-Amz-Request-Id": [ "1M93HFT6GJJZQWPJ" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestCopy/NonExistentSourceFails.replay ================================================ { "Initial": "AQAAAA7hTg0KBVNTSAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "17ce5e0f8e46f03d", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-copying-dest?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fdoes-not-exist" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:09 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "/mRAh8tvKx1vceAgyKIswX2vv4yoqb8nj+VYON/EwHrP/RFXaHHtemMpZHNn8XCQVGtmaxGOH+4=" ], "X-Amz-Request-Id": [ "91V6CXB2QTGBHZ82" ] }, "Body": "PEVycm9yPjxDb2RlPk5vU3VjaEtleTwvQ29kZT48TWVzc2FnZT5UaGUgc3BlY2lmaWVkIGtleSBkb2VzIG5vdCBleGlzdC48L01lc3NhZ2U+PEtleT5kb2VzLW5vdC1leGlzdDwvS2V5PjxSZXF1ZXN0SWQ+OTFWNkNYQjJRVEdCSFo4MjwvUmVxdWVzdElkPjxIb3N0SWQ+L21SQWg4dHZLeDF2Y2VBZ3lLSXN3WDJ2djR5b3FiOG5qK1ZZT04vRXdIclAvUkZYYUhIdGVtTXBaSE5uOFhDUVZHdG1heEdPSCs0PTwvSG9zdElkPjwvRXJyb3I+" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestCopy/Works.replay ================================================ { "Initial": "AQAAAA7hTg0KC2YzswAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "1d51f3b1618073d0", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-copying-src?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Cache-Control": [ "no-cache" ], "Content-Disposition": [ "inline" ], "Content-Encoding": [ "identity", "aws-chunked" ], "Content-Language": [ "en" ], "Content-Length": [ "52" ], "Content-Md5": [ "sQqNsWTgdUEFt6mb5y4/5Q==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "11" ], "X-Amz-Meta-Foo": [ "bar" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "Yg0KSGVsbG8gV29ybGQNCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOlNoZXhWZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:11 GMT" ], "Etag": [ "\"b10a8db164e0754105b7a99be72e3fe5\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "ShexVg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "nLO9+1h0EzxOX+A3laWAF2y0B2i8NDms1tTQRtj80jKN8VnVaD2OD1FP5W5ouzo5oJqCsu5eXbA=" ], "X-Amz-Request-Id": [ "91VDPCBXG2YD7T42" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "431819ba674edce7", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-copying-src", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "no-cache" ], "Content-Disposition": [ "inline" ], "Content-Encoding": [ "identity" ], "Content-Language": [ "en" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 19 Mar 2026 15:28:11 GMT" ], "Etag": [ "\"b10a8db164e0754105b7a99be72e3fe5\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:11 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "ky+7nEbwiB+iIHumGZLG6JD0IETXbVLyXf4LNopnIiLSZFhBVvwIiPq3qwURPFhqoieyEmLfSAk=" ], "X-Amz-Meta-Foo": [ "bar" ], "X-Amz-Request-Id": [ "91VCPN09QGAY4D08" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "34ac8e0018e94408", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-copying-dest-exists?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "51" ], "Content-Md5": [ "oPqafXJA1cXuvXCJlDDFlw==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "10" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "YQ0KY2xvYmJlciBtZQ0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6ZHZHeXlBPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:11 GMT" ], "Etag": [ "\"a0fa9a7d7240d5c5eebd70899430c597\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "dvGyyA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "oFiN+WAHWbOBSQp20WU4IBHoIz0F2bq+87v8FcOzrcUETlZ+7uJPqlZuFGTcXtDCNxzjyRkD1VA=" ], "X-Amz-Request-Id": [ "91V5M4A6D9PGKWYX" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "a59091688edb4922", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-copying-dest?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fblob-for-copying-src" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:11 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "fdVojh+CEz6QYFKttjdyrRLG0n2jXaEJECWSI9aJGtjca01N5mguG0OqRfpQp9LsibI/Wh4oQ4M=" ], "X-Amz-Request-Id": [ "91V6JDKBX791HP4J" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjExLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iYjEwYThkYjE2NGUwNzU0MTA1YjdhOTliZTcyZTNmZTUiPC9FVGFnPjxDaGVja3N1bUNSQzMyPlNoZXhWZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "e1489ffa624c1b95", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-copying-dest?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "no-cache" ], "Content-Disposition": [ "inline" ], "Content-Encoding": [ "identity" ], "Content-Language": [ "en" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 19 Mar 2026 15:28:11 GMT" ], "Etag": [ "\"b10a8db164e0754105b7a99be72e3fe5\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:11 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "ShexVg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "QUwpvxic1hQQDT2KqEnOkIbi1mvsnAHe1JYKGFXUjo8Xg2vZ34zT7HGXrAb0+PpnZmsErNLxKIY=" ], "X-Amz-Meta-Foo": [ "bar" ], "X-Amz-Request-Id": [ "91V4MCV2A90AQ0JX" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "SGVsbG8gV29ybGQ=" } }, { "ID": "f2660fd6458883da", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-copying-dest", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "no-cache" ], "Content-Disposition": [ "inline" ], "Content-Encoding": [ "identity" ], "Content-Language": [ "en" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 19 Mar 2026 15:28:11 GMT" ], "Etag": [ "\"b10a8db164e0754105b7a99be72e3fe5\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:11 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "VqeRbD7f9HXIQrN95fpLq40SjA3b5SyOzSbbCaLpOpZlili8KmDmJ6MJy1GKfeDjBe4Qoc2SSYU=" ], "X-Amz-Meta-Foo": [ "bar" ], "X-Amz-Request-Id": [ "91V0F9JMZQ5E193V" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "cde021cfa64e5161", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-copying-dest-exists?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fblob-for-copying-src" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:11 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "xlIm4JbCMJUkXeBjYyq55vk2sCrXJn3KW3wLJQfLUGKD7O/Ntm8Wao8kshRfZJ23EGaEf4K5YYY=" ], "X-Amz-Request-Id": [ "91V602M9CAD23HQX" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjExLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iYjEwYThkYjE2NGUwNzU0MTA1YjdhOTliZTcyZTNmZTUiPC9FVGFnPjxDaGVja3N1bUNSQzMyPlNoZXhWZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "1683362a1b68fd62", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-copying-dest-exists?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "no-cache" ], "Content-Disposition": [ "inline" ], "Content-Encoding": [ "identity" ], "Content-Language": [ "en" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 19 Mar 2026 15:28:11 GMT" ], "Etag": [ "\"b10a8db164e0754105b7a99be72e3fe5\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:11 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "ShexVg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "OKe7g6kTGHA5iw8hTIEiy18CMAVfJ55PVWpOcZX1f6dn67zJBbyGjpHUC6UR0gUa14S2BYMZjw4=" ], "X-Amz-Meta-Foo": [ "bar" ], "X-Amz-Request-Id": [ "91V6W8TMDEAXKNM2" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "SGVsbG8gV29ybGQ=" } }, { "ID": "4140408fd4b2e1c3", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-copying-dest-exists", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "no-cache" ], "Content-Disposition": [ "inline" ], "Content-Encoding": [ "identity" ], "Content-Language": [ "en" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 19 Mar 2026 15:28:11 GMT" ], "Etag": [ "\"b10a8db164e0754105b7a99be72e3fe5\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:11 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "OWlyx0KLDv5WUtzzg6FI6nSfjC9Flybjn4SQwW4BvBs89SosdP1vE+oE+TCJ74llhtI5PkHwtDM=" ], "X-Amz-Meta-Foo": [ "bar" ], "X-Amz-Request-Id": [ "91V09JCGHSEEMPC1" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestDelete/NonExistentFails.replay ================================================ { "Initial": "AQAAAA7hTg0KKMconAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "00276d9cc3bf2636", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/does-not-exist", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:10 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "PYrfp6wn4E07NrperchmDSyD8bRPIujIvKaycKSIGCIwzdBNb/+0TsEzyGxwUrwQ/FFOACkhbRs=" ], "X-Amz-Request-Id": [ "91V08DHEZA9WKZV1" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestDelete/Works.replay ================================================ { "Initial": "AQAAAA7hTg0KLq+dxQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "e2ce623386255f92", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-deleting?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "52" ], "Content-Md5": [ "PiWWCnnbxptnTNTsZ6csYg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "11" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "Yg0KSGVsbG8gd29ybGQNCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOmk5YWVVZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:11 GMT" ], "Etag": [ "\"3e25960a79dbc69b674cd4ec67a72c62\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "i9aeUg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "7IJAj8N75BeUragAEbipkBgImQw6H30iwXLcot/KV2dKiCiwg0D6iDWA7AEbfW7x31gaddyi3ulyYdO/ZXn+WPLmXqtryfVs" ], "X-Amz-Request-Id": [ "91V0JRPJGZQV4WX1" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "e6830890b7242ad6", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-deleting", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:11 GMT" ], "Etag": [ "\"3e25960a79dbc69b674cd4ec67a72c62\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:11 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "+LA4z+y1+lbrIjBpa84NOzX9WaLuE5a2G+wf6ah6qFf/RPUzePd5iQ/E2YyxFAFYyGplwKO+dX44ERWW7Mt4MwN3LdFZlQKF" ], "X-Amz-Request-Id": [ "91V9TKJ86ND85NCZ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "9cd3c2b3a9737541", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-deleting?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:11 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "0PLqJvwcsPmqTRB9M2lLh/A3txxCfnhkk+A+SIlJLkwLJP5ghoGyUDYSX8K7O6jpCFLw2nbOZa/wqbLjlsIOUmY91BE7eya5" ], "X-Amz-Request-Id": [ "91V4DA8HH3FRYEZR" ] }, "Body": "" } }, { "ID": "0c0674fb3dadf395", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-deleting?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:10 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "sA0H+7Y7COaGfZCfkEhXCjBJt8zL92k0jDTNiNbBL08MARvRMsn/IMVuhs91QaPGdCFH7P4SSE26Y2hGhO74v/lwzVm/yRR3" ], "X-Amz-Request-Id": [ "91V4Q5EVYAKR3E5B" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPk5vU3VjaEtleTwvQ29kZT48TWVzc2FnZT5UaGUgc3BlY2lmaWVkIGtleSBkb2VzIG5vdCBleGlzdC48L01lc3NhZ2U+PEtleT5ibG9iLWZvci1kZWxldGluZzwvS2V5PjxSZXF1ZXN0SWQ+OTFWNFE1RVZZQUtSM0U1QjwvUmVxdWVzdElkPjxIb3N0SWQ+c0EwSCs3WTdDT2FHZlpDZmtFaFhDakJKdDh6TDkyazBqRFROaU5iQkwwOE1BUnZSTXNuL0lNVnVoczkxUWFQR2RDRkg3UDRTU0UyNlkyaEdoTzc0di9sd3pWbS95UlIzPC9Ib3N0SWQ+PC9FcnJvcj4=" } }, { "ID": "c1e078cd03407d00", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-deleting", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:10 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "241u70gSvL4WYGqGfFHJfO0LBC5YCEreHCHlQZwaJ0Exfoo4PnHjZUJqpQUh8iwaOidhOKKAFfa0L/Vb0C3RFVUukadntYvn" ], "X-Amz-Request-Id": [ "PFRP678J616H43BF" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestDirsWithCharactersBeforeDelimiter.replay ================================================ { "Initial": "AQAAAA7hTgz/A7gylQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "94b41537a89b771c", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?list-type=2\u0026max-keys=1000\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:00 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "oJEs6m+cKdaEgpNZUOe3pFfgxvBJX/9RIlUcDh3xdO7koyyi1RvNhLnVV+ssHik5fq7ga5Pit2k=" ], "X-Amz-Request-Id": [ "TA8NV5MP2HMAYJXA" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PEtleUNvdW50PjY8L0tleUNvdW50PjxNYXhLZXlzPjEwMDA8L01heEtleXM+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjIwLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL2RpcjEvdGVzdEZpbGUxZGlyMTwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoyMC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIyL3Rlc3RGaWxlMWRpcjI8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MjAuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdC0vdC48L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MjAuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdC90L3Q8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MjAuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdGVzdEZpbGUxPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjIwLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "ffd2b7a79a43677f", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026list-type=2\u0026max-keys=10\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:00 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "JaRhnlgccetIqT68PhGBJqZHAK+WN4BEbbE3LWsNpnV3R8oIRoCAmMWZuH+M/UkLkSw3v1e9J8o=" ], "X-Amz-Request-Id": [ "TA8XW0QAZVPJB730" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PEtleUNvdW50PjY8L0tleUNvdW50PjxNYXhLZXlzPjEwPC9NYXhLZXlzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoyMC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90ZXN0RmlsZTE8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MjAuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMS88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL2RpcjIvPC9QcmVmaXg+PC9Db21tb25QcmVmaXhlcz48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90LS88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QvPC9QcmVmaXg+PC9Db21tb25QcmVmaXhlcz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "d6f55f3318420c7b", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026list-type=2\u0026max-keys=9\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:00 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "1aEh66h96drKrZezUfAKarQrBm1GlzBR+1Ynl/CyiJ0YF7W112iIPieGdRkHcAjkUxASTkI0TnE=" ], "X-Amz-Request-Id": [ "TA8SC16PRGHFMGJG" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PEtleUNvdW50PjY8L0tleUNvdW50PjxNYXhLZXlzPjk8L01heEtleXM+PERlbGltaXRlcj4vPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjIwLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3Rlc3RGaWxlMTwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoyMC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIxLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMi88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QtLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdC88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "1b8f8a61a438a76e", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026list-type=2\u0026max-keys=8\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:00 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "kFZF1v0ws4n1gDbj0hQNbMWgqUA3kkBmhEmEOAgzAev2YjkJQi6I5ffI32ywtPvY3InXQoH2zvA=" ], "X-Amz-Request-Id": [ "TA8J0C2XGM5RKV2B" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PEtleUNvdW50PjY8L0tleUNvdW50PjxNYXhLZXlzPjg8L01heEtleXM+PERlbGltaXRlcj4vPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjIwLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3Rlc3RGaWxlMTwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoyMC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIxLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMi88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QtLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdC88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "579aeff18238b4c5", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026list-type=2\u0026max-keys=7\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:00 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "UXebL4BTvk/uC4F1T1TT96w4nG0W86hsuay9y6L/Py4249O8cvRhxFeMLddcD7TIxsA7X2HrTdk=" ], "X-Amz-Request-Id": [ "TA8KM3X5EGHDQEFJ" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PEtleUNvdW50PjY8L0tleUNvdW50PjxNYXhLZXlzPjc8L01heEtleXM+PERlbGltaXRlcj4vPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjIwLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3Rlc3RGaWxlMTwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoyMC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIxLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMi88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QtLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdC88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "58e8573772dc1550", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026list-type=2\u0026max-keys=6\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:00 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "hUK7xc9sMf6tr6P3rXfRSTkCg/unPA1FPOxNN503p4rxCc68s5aQWyJ3IAmEOGL+dUE7u5htGLY=" ], "X-Amz-Request-Id": [ "TA8K0CCTPA1R774H" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PEtleUNvdW50PjY8L0tleUNvdW50PjxNYXhLZXlzPjY8L01heEtleXM+PERlbGltaXRlcj4vPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjIwLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3Rlc3RGaWxlMTwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoyMC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIxLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMi88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QtLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdC88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "6917cd2725a64422", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026list-type=2\u0026max-keys=5\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:00 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "EsGnsE00Dsfw4JSQbdo9BXVydDF/qM34bsjpPrAHPSuj0/c0vbCWUTTwVMi1dKUbyiLu8rqwvyU=" ], "X-Amz-Request-Id": [ "TA8N4MTPG6NAPTKN" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PE5leHRDb250aW51YXRpb25Ub2tlbj4xSnJFQWVhYlpVSXJlTjROTWl0bldIcjN0b1ViUDJ4aWJTdW1mMXN1NmEwWFRUS0FLTk5VRzc0YVRHSlhURmVvczUxcXpwaGRTYXpqV1pjTGxrWnRvcllLK1YrMFREMlg3c205WkprbkxJdU09PC9OZXh0Q29udGludWF0aW9uVG9rZW4+PEtleUNvdW50PjU8L0tleUNvdW50PjxNYXhLZXlzPjU8L01heEtleXM+PERlbGltaXRlcj4vPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPnRydWU8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL2Q8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MjAuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMS88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL2RpcjIvPC9QcmVmaXg+PC9Db21tb25QcmVmaXhlcz48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90LS88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QvPC9QcmVmaXg+PC9Db21tb25QcmVmaXhlcz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "7ffced9b47b004ed", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?continuation-token=1JrEAeabZUIreN4NMitnWHr3toUbP2xibSumf1su6a0XTTKAKNNUG74aTGJXTFeos51qzphdSazjWZcLlkZtorYK%2BV%2B0TD2X7sm9ZJknLIuM%3D\u0026delimiter=%2F\u0026list-type=2\u0026max-keys=5\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:00 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "MflDCYqDFzmQJxEVbeDmdirPAAI00E381jxdb9c+QMg2aSs/AaTkZiX9hnV70qsM3e1ZUONubyQ=" ], "X-Amz-Request-Id": [ "TA8SQR9DQR4R85DS" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PENvbnRpbnVhdGlvblRva2VuPjFKckVBZWFiWlVJcmVONE5NaXRuV0hyM3RvVWJQMnhpYlN1bWYxc3U2YTBYVFRLQUtOTlVHNzRhVEdKWFRGZW9zNTFxenBoZFNhempXWmNMbGtadG9yWUsrViswVEQyWDdzbTlaSmtuTEl1TT08L0NvbnRpbnVhdGlvblRva2VuPjxLZXlDb3VudD4xPC9LZXlDb3VudD48TWF4S2V5cz41PC9NYXhLZXlzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdGVzdEZpbGUxPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjIwLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "e013eaa05f849f6e", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026list-type=2\u0026max-keys=4\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:00 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "vr1zKL1TyDbx4P3P8MgDCDnEQDmNoqKqKpsgLxyw4TyNCMVi9tKejUS/sixe5050dIWsT79ec7s=" ], "X-Amz-Request-Id": [ "TA8TM2HR27A7MQG5" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PE5leHRDb250aW51YXRpb25Ub2tlbj4xaU5hMlFJNGFVY3p4aC9yaUY5S3NudmpGUVJscU5iYng0aWlUaGlBeTFHYnEvU2xKdTRvajlEZDB3SzZoNWl2dGtnTTR1dFdwcGZUVmVFV2NOZFdMTSs2cjZvV3FlRW4wK2hWRjBudHdEdXM9PC9OZXh0Q29udGludWF0aW9uVG9rZW4+PEtleUNvdW50PjQ8L0tleUNvdW50PjxNYXhLZXlzPjQ8L01heEtleXM+PERlbGltaXRlcj4vPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPnRydWU8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL2Q8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MjAuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMS88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL2RpcjIvPC9QcmVmaXg+PC9Db21tb25QcmVmaXhlcz48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90LS88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "76a66dbb28e43f70", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?continuation-token=1iNa2QI4aUczxh%2FriF9KsnvjFQRlqNbbx4iiThiAy1Gbq%2FSlJu4oj9Dd0wK6h5ivtkgM4utWppfTVeEWcNdWLM%2B6r6oWqeEn0%2BhVF0ntwDus%3D\u0026delimiter=%2F\u0026list-type=2\u0026max-keys=4\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:00 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "dDEvSAm+2S/v03pbTKfRqKqciUOzfv+0eCjpUWbuoLE/zsbOPMWzu6jKEvDyRFW5TQIgJldzktY=" ], "X-Amz-Request-Id": [ "TA8S5AFE7ZGMVQJV" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PENvbnRpbnVhdGlvblRva2VuPjFpTmEyUUk0YVVjenhoL3JpRjlLc252akZRUmxxTmJieDRpaVRoaUF5MUdicS9TbEp1NG9qOURkMHdLNmg1aXZ0a2dNNHV0V3BwZlRWZUVXY05kV0xNKzZyNm9XcWVFbjAraFZGMG50d0R1cz08L0NvbnRpbnVhdGlvblRva2VuPjxLZXlDb3VudD4yPC9LZXlDb3VudD48TWF4S2V5cz40PC9NYXhLZXlzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdGVzdEZpbGUxPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjIwLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QvPC9QcmVmaXg+PC9Db21tb25QcmVmaXhlcz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "85ad6a32c4b32434", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026list-type=2\u0026max-keys=3\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:00 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "/uGiKFzOG9WODbfTUb4spSgkH9tA82EYbRdeTGT96zlSOWsCOUiS5ECaxw5DGkAuDeAE5TVKgZE=" ], "X-Amz-Request-Id": [ "TA8P2X7QSPBZA3CE" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PE5leHRDb250aW51YXRpb25Ub2tlbj4xNGhnbE9PQ1U0LzBjQ1cvOEt4UGJ1ZGRoR2pBMC85NnVxZkVKQmZ0UlJ6MEhBVlkxR3NvL3oxRmNwa2s2dEM3aTAwRkhkMjZRM0RBTStSYTFHQnY2MjdKZ0x4WkVPU2wrSkM4UWYrQkpwWlk9PC9OZXh0Q29udGludWF0aW9uVG9rZW4+PEtleUNvdW50PjM8L0tleUNvdW50PjxNYXhLZXlzPjM8L01heEtleXM+PERlbGltaXRlcj4vPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPnRydWU8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL2Q8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MjAuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMS88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL2RpcjIvPC9QcmVmaXg+PC9Db21tb25QcmVmaXhlcz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "0775be3d1ca8156f", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?continuation-token=14hglOOCU4%2F0cCW%2F8KxPbuddhGjA0%2F96uqfEJBftRRz0HAVY1Gso%2Fz1Fcpkk6tC7i00FHd26Q3DAM%2BRa1GBv627JgLxZEOSl%2BJC8Qf%2BBJpZY%3D\u0026delimiter=%2F\u0026list-type=2\u0026max-keys=3\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:00 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "rt74lGDTSQsIlRTjyxJM85obJLIQjsZ5sCqCrGQ9o96muOFgwHf5Rrcv4fi2yjKxSkJc7VFCL54=" ], "X-Amz-Request-Id": [ "TA8JCQ9XWF95NJ2C" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PENvbnRpbnVhdGlvblRva2VuPjE0aGdsT09DVTQvMGNDVy84S3hQYnVkZGhHakEwLzk2dXFmRUpCZnRSUnowSEFWWTFHc28vejFGY3BrazZ0QzdpMDBGSGQyNlEzREFNK1JhMUdCdjYyN0pnTHhaRU9TbCtKQzhRZitCSnBaWT08L0NvbnRpbnVhdGlvblRva2VuPjxLZXlDb3VudD4zPC9LZXlDb3VudD48TWF4S2V5cz4zPC9NYXhLZXlzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdGVzdEZpbGUxPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjIwLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QtLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdC88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "aa699075eec4db0b", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026list-type=2\u0026max-keys=2\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:00 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "652YH1H8S6OmQbTpGwcKfwufD5krz6l0KX+++IlbAFJ04k1nWRmgio724pOYv57C/yMvtZIf1RM=" ], "X-Amz-Request-Id": [ "TA8HQ8S7YKAKEM4D" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PE5leHRDb250aW51YXRpb25Ub2tlbj4xVzZtVlFkUlVBcUFwN1pOWHJkVStRRkcvdFFaSHRhT085M29pOGVySnJoSUJ0cXBpWFYxOUk4MHpUenJnK1MyUUxBZXV2VkRNYWtmaTVhcndFMjlpTGxGSlNybFU3RW9zZG5nUXBuWG9LL1E9PC9OZXh0Q29udGludWF0aW9uVG9rZW4+PEtleUNvdW50PjI8L0tleUNvdW50PjxNYXhLZXlzPjI8L01heEtleXM+PERlbGltaXRlcj4vPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPnRydWU8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL2Q8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MjAuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMS88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "59478f8c8d18f3c7", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?continuation-token=1W6mVQdRUAqAp7ZNXrdU%2BQFG%2FtQZHtaOO93oi8erJrhIBtqpiXV19I80zTzrg%2BS2QLAeuvVDMakfi5arwE29iLlFJSrlU7EosdngQpnXoK%2FQ%3D\u0026delimiter=%2F\u0026list-type=2\u0026max-keys=2\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:00 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "Cyc8iICglhjWYfgfmUoe4bvYd9U3V7winy2AZgiruEmqrnAy9o8yFGbMBgj7sfFJ929MQ+5mR00=" ], "X-Amz-Request-Id": [ "TA8GPBVEG3DS5PCJ" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PENvbnRpbnVhdGlvblRva2VuPjFXNm1WUWRSVUFxQXA3Wk5YcmRVK1FGRy90UVpIdGFPTzkzb2k4ZXJKcmhJQnRxcGlYVjE5STgwelR6cmcrUzJRTEFldXZWRE1ha2ZpNWFyd0UyOWlMbEZKU3JsVTdFb3NkbmdRcG5Yb0svUT08L0NvbnRpbnVhdGlvblRva2VuPjxOZXh0Q29udGludWF0aW9uVG9rZW4+MWFWRDI5dlIwM3MzbGR4emx2SUwrRkJIcVB6dHpKUjMxNGhLNjNIZGpOMWg5MVBab3NSVlFSenk2YjR0Wm5LMTlidDZvUTVJK0hyRmNicm55WnRFbVFxelA4MGtkTHZGMEx2RFU2RTVYYm5jPTwvTmV4dENvbnRpbnVhdGlvblRva2VuPjxLZXlDb3VudD4yPC9LZXlDb3VudD48TWF4S2V5cz4yPC9NYXhLZXlzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD50cnVlPC9Jc1RydW5jYXRlZD48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIyLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdC0vPC9QcmVmaXg+PC9Db21tb25QcmVmaXhlcz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "f0ecc4925a1e2564", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?continuation-token=1aVD29vR03s3ldxzlvIL%2BFBHqPztzJR314hK63HdjN1h91PZosRVQRzy6b4tZnK19bt6oQ5I%2BHrFcbrnyZtEmQqzP80kdLvF0LvDU6E5Xbnc%3D\u0026delimiter=%2F\u0026list-type=2\u0026max-keys=2\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:00 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "ncaBCI5kvmtLBIaWs9Bxa5VWpAxEekXBFKEw/l99I2sugrd6TnTeoC+jaAOIvkOGzUKV0+szQyo=" ], "X-Amz-Request-Id": [ "TA8P4CH2JJTD7CQS" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PENvbnRpbnVhdGlvblRva2VuPjFhVkQyOXZSMDNzM2xkeHpsdklMK0ZCSHFQenR6SlIzMTRoSzYzSGRqTjFoOTFQWm9zUlZRUnp5NmI0dFpuSzE5YnQ2b1E1SStIckZjYnJueVp0RW1RcXpQODBrZEx2RjBMdkRVNkU1WGJuYz08L0NvbnRpbnVhdGlvblRva2VuPjxLZXlDb3VudD4yPC9LZXlDb3VudD48TWF4S2V5cz4yPC9NYXhLZXlzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdGVzdEZpbGUxPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjIwLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QvPC9QcmVmaXg+PC9Db21tb25QcmVmaXhlcz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "c9daf38f17dfb56a", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026list-type=2\u0026max-keys=1\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:00 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "9omtmq3U9zGXxeapZqeyQjW/iIkhh8OcI0LGCKZSBUh/hoz1uJoZ+xEJZKVPYbhsXuM/DJHBgyo=" ], "X-Amz-Request-Id": [ "TA8XKHAN8GS7SABS" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PE5leHRDb250aW51YXRpb25Ub2tlbj4xY2lhM29FWXhJbTR5L3BxN1puMGxXVDlMOGpNMEZ5RG5INldrTU1yNmpEQXFHQWxwVnhIb2FqaENMK2RkZmV1aWR0WjZqMDUvRDJMOUFoclc1cS8yM0JGNzZEdWpUcUxXMDRhQlhJenU1Ums9PC9OZXh0Q29udGludWF0aW9uVG9rZW4+PEtleUNvdW50PjE8L0tleUNvdW50PjxNYXhLZXlzPjE8L01heEtleXM+PERlbGltaXRlcj4vPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPnRydWU8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL2Q8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MjAuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "d7a2115c37e0ec59", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?continuation-token=1cia3oEYxIm4y%2Fpq7Zn0lWT9L8jM0FyDnH6WkMMr6jDAqGAlpVxHoajhCL%2BddfeuidtZ6j05%2FD2L9AhrW5q%2F23BF76DujTqLW04aBXIzu5Rk%3D\u0026delimiter=%2F\u0026list-type=2\u0026max-keys=1\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:00 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "kBeTpqTBTepnVIwnXeGjQX/1ZHTks4dgTf+pZZxz94lDN6PLB0bYcUJGPUhjOpg7lQwxfh+wRu8=" ], "X-Amz-Request-Id": [ "TA8PEMQY7FVY2THH" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PENvbnRpbnVhdGlvblRva2VuPjFjaWEzb0VZeEltNHkvcHE3Wm4wbFdUOUw4ak0wRnlEbkg2V2tNTXI2akRBcUdBbHBWeEhvYWpoQ0wrZGRmZXVpZHRaNmowNS9EMkw5QWhyVzVxLzIzQkY3NkR1alRxTFcwNGFCWEl6dTVSaz08L0NvbnRpbnVhdGlvblRva2VuPjxOZXh0Q29udGludWF0aW9uVG9rZW4+MW5CdXVPZ2JqNXo4S29xYU9zU2MzUGw1U0lwY0hQZEh1VjJDWTkwUmFNOVRGS1kvN1hZZTJkOGNvNTV4TDdwOWcyVjBPRXFkc3oxRFFDOGZ2c1ZpRVZWeDdFWGs5RjB5VDNsM3hkbm8xSE1rPTwvTmV4dENvbnRpbnVhdGlvblRva2VuPjxLZXlDb3VudD4xPC9LZXlDb3VudD48TWF4S2V5cz4xPC9NYXhLZXlzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD50cnVlPC9Jc1RydW5jYXRlZD48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIxLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "f0da9983d353684b", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?continuation-token=1nBuuOgbj5z8KoqaOsSc3Pl5SIpcHPdHuV2CY90RaM9TFKY%2F7XYe2d8co55xL7p9g2V0OEqdsz1DQC8fvsViEVVx7EXk9F0yT3l3xdno1HMk%3D\u0026delimiter=%2F\u0026list-type=2\u0026max-keys=1\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:00 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "ryK4/V5v1xxVEGcxjEgSlYBdqMyPjpKho76qFsEFJZCtnijN2UeQuqrF9NPnm8g7inzy6NFceys=" ], "X-Amz-Request-Id": [ "TA8YQGPK0D78SZYQ" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PENvbnRpbnVhdGlvblRva2VuPjFuQnV1T2diajV6OEtvcWFPc1NjM1BsNVNJcGNIUGRIdVYyQ1k5MFJhTTlURktZLzdYWWUyZDhjbzU1eEw3cDlnMlYwT0VxZHN6MURRQzhmdnNWaUVWVng3RVhrOUYweVQzbDN4ZG5vMUhNaz08L0NvbnRpbnVhdGlvblRva2VuPjxOZXh0Q29udGludWF0aW9uVG9rZW4+MVJVenlwQ3huOE51U0JheHlZcWgzMGEzbzA1VlpjWkNNQ3VwZ1Z0S25sczM0cjdjamcwMW1BczZReDBiWVZMZ2dTTHgzb1V4QkJEQWFsRkJmMDBST1ZhSGRkS1NDQ29UQlRBbXJDbHlRWlJFPTwvTmV4dENvbnRpbnVhdGlvblRva2VuPjxLZXlDb3VudD4xPC9LZXlDb3VudD48TWF4S2V5cz4xPC9NYXhLZXlzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD50cnVlPC9Jc1RydW5jYXRlZD48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIyLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "3061b5248836c6fd", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?continuation-token=1RUzypCxn8NuSBaxyYqh30a3o05VZcZCMCupgVtKnls34r7cjg01mAs6Qx0bYVLggSLx3oUxBBDAalFBf00ROVaHddKSCCoTBTAmrClyQZRE%3D\u0026delimiter=%2F\u0026list-type=2\u0026max-keys=1\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:00 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "UsPdzAkVCriYu2wZyHconIp5/6jV8eD75a/js2peKwsRUt/rsG34wwt5VxLAs4HlGMu+o973qqs=" ], "X-Amz-Request-Id": [ "TA8K3R5PWBAYY1YF" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PENvbnRpbnVhdGlvblRva2VuPjFSVXp5cEN4bjhOdVNCYXh5WXFoMzBhM28wNVZaY1pDTUN1cGdWdEtubHMzNHI3Y2pnMDFtQXM2UXgwYllWTGdnU0x4M29VeEJCREFhbEZCZjAwUk9WYUhkZEtTQ0NvVEJUQW1yQ2x5UVpSRT08L0NvbnRpbnVhdGlvblRva2VuPjxOZXh0Q29udGludWF0aW9uVG9rZW4+MU53TXZEWjUvWURIREttVDNORk1kRzl2VjJoTTZzSktWRVhOVWhEUTRQWVdia2tmMGNwbjVDa1VWNzE3Z2VxRHZtZUZSVmM2ODFFb1hJQlBDaW1jWFhjdGxybUZiSFNYZm0raGFlRFZhYk80PTwvTmV4dENvbnRpbnVhdGlvblRva2VuPjxLZXlDb3VudD4xPC9LZXlDb3VudD48TWF4S2V5cz4xPC9NYXhLZXlzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD50cnVlPC9Jc1RydW5jYXRlZD48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90LS88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "17c664cf086dc834", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?continuation-token=1NwMvDZ5%2FYDHDKmT3NFMdG9vV2hM6sJKVEXNUhDQ4PYWbkkf0cpn5CkUV717geqDvmeFRVc681EoXIBPCimcXXctlrmFbHSXfm%2BhaeDVabO4%3D\u0026delimiter=%2F\u0026list-type=2\u0026max-keys=1\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:00 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "OA4mfi5hzmzW1gTkZWKjkvGnTBunSUtNUguXW3f0KdyrqA558Vvop2zM7Rf36Egyupo4UGeYUuE=" ], "X-Amz-Request-Id": [ "TA8QNPTBWYY5BZ55" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PENvbnRpbnVhdGlvblRva2VuPjFOd012RFo1L1lESERLbVQzTkZNZEc5dlYyaE02c0pLVkVYTlVoRFE0UFlXYmtrZjBjcG41Q2tVVjcxN2dlcUR2bWVGUlZjNjgxRW9YSUJQQ2ltY1hYY3Rscm1GYkhTWGZtK2hhZURWYWJPND08L0NvbnRpbnVhdGlvblRva2VuPjxOZXh0Q29udGludWF0aW9uVG9rZW4+MVdCL1pkZzk3aUJJcUxFZVh1d0c0YnJVcERMMlZiVTdSbWx3Sk1CZWJSbHkxcnp0RXJLa3dnU0xobHdzMVZ3U0hKc0RBemtsNEI4YXdyWlhVVDhRMjFhRGdWNzR3T1p3Sm5XblhyWDY2L20wPTwvTmV4dENvbnRpbnVhdGlvblRva2VuPjxLZXlDb3VudD4xPC9LZXlDb3VudD48TWF4S2V5cz4xPC9NYXhLZXlzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD50cnVlPC9Jc1RydW5jYXRlZD48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90LzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "3369e7fcd7e76353", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?continuation-token=1WB%2FZdg97iBIqLEeXuwG4brUpDL2VbU7RmlwJMBebRly1rztErKkwgSLhlws1VwSHJsDAzkl4B8awrZXUT8Q21aDgV74wOZwJnWnXrX66%2Fm0%3D\u0026delimiter=%2F\u0026list-type=2\u0026max-keys=1\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:01 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "nl1eR4rydgWoJYmDn5m9QgNO1+3XGpHFrZUXQptseerqiwJYFMJaqq6Hz8ADtrgSOxKYSSppqEs=" ], "X-Amz-Request-Id": [ "C7XVDXYE4SEQG48R" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PENvbnRpbnVhdGlvblRva2VuPjFXQi9aZGc5N2lCSXFMRWVYdXdHNGJyVXBETDJWYlU3Um1sd0pNQmViUmx5MXJ6dEVyS2t3Z1NMaGx3czFWd1NISnNEQXprbDRCOGF3clpYVVQ4UTIxYURnVjc0d09ad0puV25Yclg2Ni9tMD08L0NvbnRpbnVhdGlvblRva2VuPjxLZXlDb3VudD4xPC9LZXlDb3VudD48TWF4S2V5cz4xPC9NYXhLZXlzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdGVzdEZpbGUxPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjIwLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestIfNotExist.replay ================================================ { "Initial": "AQAAAA7hTg0UG4SRvAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "b5f0dc6017b56316", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-if-not-exist?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "52" ], "If-None-Match": [ "*" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "11" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text", "BodyParts": [ "Yg0KdXAgYW5kIGRvd24NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk9KM3lsQT09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:21 GMT" ], "Etag": [ "\"1b75533ed5a869ff6f3ae0336d0c3320\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "OJ3ylA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "04gq+2W3zE5qmFHj0fWWZXUAsdiFKXGUOwSHhuqWVX4wVUvLeyIZ+jAHb1P2+btrkUOGbZXh4V8=" ], "X-Amz-Request-Id": [ "M1VFEZ1E1ZR7R2JZ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "ad3534b2dbd9ebcb", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-if-not-exist?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "52" ], "If-None-Match": [ "*" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "11" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text", "BodyParts": [ "Yg0KdXAgYW5kIGRvd24NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk9KM3lsQT09DQoNCg==" ] }, "Response": { "StatusCode": 412, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "XIsHGMUwAwTi46DEixseUbTO/wgXiC+nFX+PubLLYiWlZt/tBgYFVIRC0QCJOGx2M0VvsuT97LM=" ], "X-Amz-Request-Id": [ "M1V69TW51K3WRRDX" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPlByZWNvbmRpdGlvbkZhaWxlZDwvQ29kZT48TWVzc2FnZT5BdCBsZWFzdCBvbmUgb2YgdGhlIHByZS1jb25kaXRpb25zIHlvdSBzcGVjaWZpZWQgZGlkIG5vdCBob2xkPC9NZXNzYWdlPjxDb25kaXRpb24+SWYtTm9uZS1NYXRjaDwvQ29uZGl0aW9uPjxSZXF1ZXN0SWQ+TTFWNjlUVzUxSzNXUlJEWDwvUmVxdWVzdElkPjxIb3N0SWQ+WElzSEdNVXdBd1RpNDZERWl4c2VVYlRPL3dnWGlDK25GWCtQdWJMTFlpV2xadC90QmdZRlZJUkMwUUNKT0d4Mk0wVnZzdVQ5N0xNPTwvSG9zdElkPjwvRXJyb3I+" } }, { "ID": "1e90d51f8df14c58", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-if-not-exist", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "11" ], "Content-Type": [ "text" ], "Date": [ "Thu, 19 Mar 2026 15:28:21 GMT" ], "Etag": [ "\"1b75533ed5a869ff6f3ae0336d0c3320\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:21 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "6C39QPkSUGPCkYm0cY9TbfJp1OjcvVMryoerN3rN7vTmjATXtshUETV27xELPh9ZkFymgOzPg9A=" ], "X-Amz-Request-Id": [ "M1V98YHT401NKVNZ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "96e95d49b8469f7d", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-if-not-exist?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:21 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Bns2naCTu0a7YFo0G25AHRw5ncu1S1AazTU8iEFAfNCaZzxcGNMTNZ19EiChIVXXCv7SvSCLvDo=" ], "X-Amz-Request-Id": [ "M1V9BGW8BJE9KE0K" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestKeys/ascii-1.replay ================================================ { "Initial": "AQAAAA7hTg0RHkpOmwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "c4cab406fa5202a2", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:18 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "k6VTnCaVeO+mQadsj0YmRZplwN/0KarkuMnkbLrKlHCD2uTXxkAr8irXayr01yQIhZInGFmgD25B8mBv8I8ghxKspK6STzqa" ], "X-Amz-Request-Id": [ "TE6DTFM3H2BRT9M6" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "ed2d73c72703d638", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:18 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:18 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "vd/IJczA3OcsZC7TsrERkz7Q2zjdFWCOaLLD5adZF8i6m9GCU3HTtRVEh7l8703MN57EZa4krdY7xWPTIFkVNhE0PrBOqkEu" ], "X-Amz-Request-Id": [ "TE651BT9QJ2BW455" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "505aa6a180fad8db", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:18 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:18 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "7gQH+N/nP38q6Wl01eIwN1a6FKK82RpLHeCgVNedEzT+VVyvjB4CZT+71qSw/LszDCi6bUTNtQ7y2BlxxFYpK6B2qWelFtiH" ], "X-Amz-Request-Id": [ "TE63NRMYVCDF46MR" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "76fe3ffac4459c1a", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:18 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:18 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Gk9/h0sjdnCUxZrkrqXet/qRHbsmf4Miv73S8HUXqhfISUuwPCvXsCHue+EelskpdmXVohunISrR/OavM3Sqr/OGYecRetIp" ], "X-Amz-Request-Id": [ "TE68DJHD93WCDW5B" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "5169a2a4745a1487", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keys__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:18 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "EJBt6v54XtZkkEGoQhhK33fCuF+zqGRsHrApwWxj33p8KkdZfzyT9djGQ8WT63NcG+mZy2k1Cbou64Cb5i8YMKfPgrFIGVl5" ], "X-Amz-Request-Id": [ "TE6ESF6YT6VHDSZA" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjE4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "796f90276782af51", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:18 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:18 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "0iwbXoc1aewjBBLp4k8OWc7vxqekHI6LDj/Ti1U5YG+i1JoL5dFwOAKLmB+bPFTX48u+1oISeN+qoSeNtcmA0PZeD35ZVAEB" ], "X-Amz-Request-Id": [ "TE65RZAGH7F60XJ3" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "d92e4f44aee578d0", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:18 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:18 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "8M0D8Ai2KlysNTbsNQrO6I2u91vo8uFiuUCmB0RgUbiS8waOB0PVxBcSlX8bWQbKK9IN6gUP/T5QWCCd/F8v49IdeFPTFdx0" ], "X-Amz-Request-Id": [ "TE6779N2SX0TQCGF" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "a8f5ac0a40197926", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:18 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "3DrJSmtHQjLdnWC9LSFH5O/TEcgOvYrq86Hp6nW0E029q/7kLEsWLrUn96xxkLmgwfU0gU7BgtuUkmxlCp1eZXvslDi0V8Mo" ], "X-Amz-Request-Id": [ "TE6FX53V20RNWCH8" ] }, "Body": "" } }, { "ID": "2fc9964725b12a43", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:18 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:18 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "rClLBN/6rZcpiiOEeYCHhHMh/kA/O5FKdKMApSwFANEVSa7KNK1bRjCTba+YOijzP7Si9ATZMehhTpiKHWh0OgXi/NBZESuY" ], "X-Amz-Request-Id": [ "TE6E2F7BA2P9P2TT" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "c7f436d6303070c3", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:18 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "OVrNnrmol0hsGkqpbHdIdqxJMEh6nN/61Gm7zVK+aj9kIJBqYH4ZpFoZNOeoMjf0FR0LfRBbUCMHBht/Kk3dZwBSEtQiAAsh" ], "X-Amz-Request-Id": [ "TE6B69FE9MQS807P" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestKeys/ascii-2.replay ================================================ { "Initial": "AQAAAA7hTg0NGheDrQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "d72c7909ec64706b", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "5d6bLKqExDXXvrgGvIi/eQQbX/YjUKS2ZC9Roeom5iUfCoidjtbpe0x7FBwCqsIm4fJ9BJuSuW0=" ], "X-Amz-Request-Id": [ "BFXGMSGN3BSGP9NX" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "634bb91e45cf6ba5", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "K+BVm1wDzt5gyUa4t69GAwmFZ/X6wAwzItGl8iSLfrbROFUlkCBOCgxLXfAKmvIwb7KbKfbOFlM=" ], "X-Amz-Request-Id": [ "BFXRJS3XMQD1AXGS" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "a2bb525049f8fe85", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "9csv4Q/R/iGYH2SYM579+VSadlftxl0c8TP7mXzYvMDiroVlabFAamZEwcFFUBmAhDMO26JfYu0=" ], "X-Amz-Request-Id": [ "BFXKAQWQKFJSZNGJ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "7617b6b53a0eb529", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "pOCL5mADMr5IZ8f9iTEkP9JruhqBCzrRYWPTGOBXVfN7YTVw42mfs1i7ssoPtOv0tGQqJo9cQC0=" ], "X-Amz-Request-Id": [ "BFXQDBEJTEGBM64A" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "bb4fa455f29e9bd1", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keys__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "fEKEYHWG6JVijvXsfGkR2IaJhx1BddJnZAAXLEdBLaAExkcAF/WrroyZBc3cz3HuV7/wCEUynns=" ], "X-Amz-Request-Id": [ "BFXS13Y44E61894Q" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjE0LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "42bceade2c48d5e3", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "IDU/KFbEAzN0m8lOWJPEfq7fAcErrOFvhzysDhe8YDVI0zBksCUXKNzb5c3W78TRaVNFK7k9U2E=" ], "X-Amz-Request-Id": [ "BFXY8N3Q11NFH0Z7" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "56365a923dc1cf4a", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "zi/N9UwDg21jpqDg5/EL2DSrUTz/Q195ldi0f47OPVIcovEFT7rttb+njwn9j/9pfTfsVozu7Rg=" ], "X-Amz-Request-Id": [ "BFXYV11MXPGW78M1" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "2890cf4804eb37df", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "1fd/qRaKtA5sQC7nq0nL3fudb+C69QHrSTkx6DAcCFlvDm69MYuufpThR2hvNgKDu/GZkzuUUIk=" ], "X-Amz-Request-Id": [ "BFXQP4P3TYM0VSYA" ] }, "Body": "" } }, { "ID": "97668677251f3c86", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "TNev68tl6+2+jYbyPBob/72s2v2OR+Ug0VVGmpcaU6K42TVfgHpHS333qBxravC94WWVRI5VXXk=" ], "X-Amz-Request-Id": [ "BFXHZP3B0B4ACWN7" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "005867d2fe347571", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "LXLjKP2Ka7ZWWMTSAjtc71V07tV0eG+qKTbzr3eM8w8ijv+uvpCflQz6gTB2IW4z6uJBAcm1oqQ=" ], "X-Amz-Request-Id": [ "BFXT1M3ZHFCR3W0D" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestKeys/ascii-3.replay ================================================ { "Initial": "AQAAAA7hTg0PHG3TtgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "6426be21a79cdea3", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-./?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:16 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "78SXAIcdZEk9Vmk8sigWgDY9dqj/69TlQpvlG5sZHLXorlcw3Un0fVE1f4Fm4wdm4SaXppHwAyYuwcmVgjJB3FGkwXCjiD3u" ], "X-Amz-Request-Id": [ "Y8S1VZWZH45BE7KV" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "8d36ed5aca5965fd", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-./?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:16 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:16 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "XaQyyDjM27YqD4PbA0xDeXjjnYpyy5gYOzNNZjMHnO6zShAMvrmqBqd116ORX90no+IrPKvd29nIfWEeo+Ke4A9L5Lt/Yog5" ], "X-Amz-Request-Id": [ "Y8S65DXJEDE4XQKS" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "b2c56d3e8ba18604", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-./", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:16 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:16 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Xf9wabzzMztD2hqlQfcOw4gyDevZRNpD/8f22XwZXI8fDwOcot/xAReYmfpdDgc1+0sH7mz9+bLMcvIwBmn0PWnzFnh0f5DT" ], "X-Amz-Request-Id": [ "Y8S0SHYH65CZNE2N" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "866b77dd237d4edd", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-./?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:16 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:16 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Zl1R40TyEkn8zcqluMoqhhIOA+/cNyAVqpCJeArW2rm9PA2HjwKSm2IEmngKUvBB8HQKjItnvx6vcQ72HJNOo56v23a+i64B" ], "X-Amz-Request-Id": [ "Y8SA176ECX9T07XS" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "3e4c8dd551892647", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-./-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keys+%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:16 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "qxfftfrHY7nN7QVTxFXLrYwmfPxJGweieK/edsKdLQM15bsx13iOOqKjtt1oWuOAvJeDH4v6ItB+qBLpKXU0XJhKkf2NHjkq" ], "X-Amz-Request-Id": [ "Y8SDEKTADMR174FM" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjE2LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "cf3eb0010f561d46", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-./-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:16 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:16 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "oEB8VUni+6SVNpdlv9m6ShewhZCJXU1WrwvIxPBUxLTejeL48gU47o43DLq+p4zTQdDiRrcz0Bn0VaF2/0kqET86TfT8qqUG" ], "X-Amz-Request-Id": [ "Y8S64R1BMM6WQT0F" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "4d8be4a256cac1d2", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-./-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:16 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:16 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Aqlmu3ZrOUQtGO50vwVUhs42ZbeqdmWVz9JVfN2tutp7zp+X9u3BRv4lh6Jt1fl6Ts0Wj+CqsofVAT4GiOOQ/NeEYlIob1J6" ], "X-Amz-Request-Id": [ "Y8S0TSH80QK44WJ5" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "62f00a62915347b6", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-./-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:16 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "YRfvMDL7Siac8q3FLl7OMKN9W7ZzzePmCY0SPa6Ba0QLmg7uFmN/jbrgu8FQnT4FyUmoBAR7SATOUltFxwzhmRFeAOO0rUEu" ], "X-Amz-Request-Id": [ "Y8S0S7C6V6VB531W" ] }, "Body": "" } }, { "ID": "93ced037362792ca", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-./", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:16 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:16 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "G0svPer/2go15W6bVuqEZ7naTmZJ2MDx1/oHdxhvbJSdL53ut1iVkIZfw0wj1moSO90+UW7g68EioQUTkONFkfBVR0udIDzh" ], "X-Amz-Request-Id": [ "Y8SBJMKQR6BFX33G" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "f7037cf0e3490bb1", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-./?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:16 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Jg4CfUPQCTXrSROcy0hgOUY1QHXkts3pkixMPumvTxD9M844V8D910VhUhQ4ByHmzt+sOxLkpl/T495Ongor9TmXMo34yo/D" ], "X-Amz-Request-Id": [ "Y8S2MX85134HBBEY" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestKeys/ascii-4.replay ================================================ { "Initial": "AQAAAA7hTg0POR59mQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "8c0037bbcfe3bbed", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%3A%3B%3C%3D%3E%3F?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:17 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "tGuuxZINFMBn3wB3uswILyZEK36E2/g+lzDmx8ZwhzZzvRRbAJp90muaH/U5X7z8rUsGBG86r2mLlUDAzVJF/Olhvk1HNzxG" ], "X-Amz-Request-Id": [ "9FS45VPRAAB4VR0N" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "f227aaeae831ec81", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%3A%3B%3C%3D%3E%3F?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:17 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:17 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "gPK9PKQMgmcDYI6ydDKNP+kRR501GvA7pM0bkhrrGs/xvgr4XkkzvtxyYVl6qtfhggmybGZ/TsyU4U1XYq+3TcM0fKrruTvq" ], "X-Amz-Request-Id": [ "9FS96PSQ8GJ2MWFK" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "1efaade3923ecec6", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%3A%3B%3C%3D%3E%3F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:17 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:17 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "gPiY1DSLFF1kV+Msow4gUal7loplp5vqgdGcvsS+catnqTC5nMZYMhwYByAxbu2d2u3EYkf6Ck8JglsHfw/e61RH/U52C2nd" ], "X-Amz-Request-Id": [ "9FSCWDJDM9PVMP5W" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "f9edd73a3d117d0c", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%3A%3B%3C%3D%3E%3F?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:17 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:17 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "9t9maGJpYkLdkwm+BEVJlnxNXHt4mkGKvt4PBdnDgAhR1gN8f/6/Jlec6ae1ZPsQQYsyDn6Sk/GAKTZkVfnd4lUbPfO7Odh0" ], "X-Amz-Request-Id": [ "9FS7E3TF4D9E2HCW" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "9600f84bbc33c189", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%3A%3B%3C%3D%3E%3F-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keys%3A%3B%3C%3D%3E%3F" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:17 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Qhy+8VQKOdGc4gBSLcmGuc7B7wE/juoqZnysK05XpvPc6Ie4j1M+ApQVedondyRFoYnmwJGWOGfEhta/b1uAubi/kwRmuq5X" ], "X-Amz-Request-Id": [ "9FS3M0G0X7QCWV4J" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjE3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "c41c31cf1f8aa56a", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%3A%3B%3C%3D%3E%3F-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:17 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:17 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "OkHYXWcT9wblyz6IpBWst7WdXCcsyVgrpNXa0Vioo9aHXZevX1p/HR5RLxZEWSbHtCLwbhMcWTjrv5rAN9mnB63pihJvDKTb" ], "X-Amz-Request-Id": [ "9FS3ZGYPZV6225Q5" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "54a3085db2f3bd70", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%3A%3B%3C%3D%3E%3F-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:17 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:17 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "vOQzZWUMARwd0BIaW9d3h8UDiWoB1hh40MwNFYSjluNVPSkolcH+EJqLCP3SbuIuQd6eK8ZLQsL9a4HVvy4SWSducBebp51N" ], "X-Amz-Request-Id": [ "9FS8R023WV53H7K1" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "5572651d4c9b30a4", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%3A%3B%3C%3D%3E%3F-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:17 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "fX0EGtPGDdHPYiMftmVk6Xx30sGPHn4poBQqf0dSsRanDLrj5/YeuHw7G54Uzi0PwjZEUq3v0M2wjUUfmu8XnENWnvREZs3e" ], "X-Amz-Request-Id": [ "9FSENYZHRVQHQ637" ] }, "Body": "" } }, { "ID": "a15f613f4edf6f5d", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%3A%3B%3C%3D%3E%3F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:17 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:17 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "AQSERWIjsoXPdmf6Ww1GAIiKuwyT/O8WD+Sai74tKQ7eZDAC+QYcANzMm7EYrpw04hIlSMSxstFH3o6DHmJgtT/Xy2lVVojn" ], "X-Amz-Request-Id": [ "9FS3XMHM7RB90K8A" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "bb8cdc8c6b9ae6cf", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%3A%3B%3C%3D%3E%3F?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:17 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "SezM7g5mSyJe+eBLD70ZmOX1QnF3rtjfg/gK/GrpTonLYlevDkuvi0EMBrY7LgDjSY5aYEAhpElN1AUISsvA9YJP6yN0KQKw" ], "X-Amz-Request-Id": [ "9FS8748HNXV7TJBR" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestKeys/ascii-5.replay ================================================ { "Initial": "AQAAAA7hTg0RO1iqMgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "4655a45319609097", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%40?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "A/pm4Qorq328zmcY0f43PZ+H/G3P1FGhqBwJlDnVq+xtHGmA0djQFmLkUURa1XMLwgYTCy38Qag=" ], "X-Amz-Request-Id": [ "KC0CZHNVZGYY76R1" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "adbbb67bdb7d5011", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%40?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "UzAy1XWOvWk0AsOYq8qxTMWKiUDR2ic7/O4AXtSCNZa+SQCeHycQv+3Otc2ffHvh3Nx5kx2ofog=" ], "X-Amz-Request-Id": [ "KC0F4AHSNWWF7FH1" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "b6bf815a19025227", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%40", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "FXcmXZVBJzWmNLO73b8t4Bgef5SdUa963eKnqRMlNPTZiwocG7GcuoMu4qWBSp3s4nk3i4LRkVQ=" ], "X-Amz-Request-Id": [ "KC02S2XV7RX9D25D" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "0ced42c1a7cea278", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%40?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "q/lzdAkcW9LYLgv2B+UPvzCmBUZfJ7gTwokwtG9tin+QdRz7m8YCJy4RCBY3eYb8VPGG4jjVFyU=" ], "X-Amz-Request-Id": [ "KC09R6136V2H9Y6T" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "3fa5b031d292835f", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%40-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keys%40" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Rrl7SyRtmu1h7hCY8dI/0KSNXI8+X/hBGM9e4gczHCtBWAOF3g1lMMLRAJg8y9pJQDHIgGND21s=" ], "X-Amz-Request-Id": [ "KC04YAQZRPY9EJXE" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjE5LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "07b7b908e1b7dd7f", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%40-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "9QC6xnWKCGUVb6Ej3Xuz2t0i7hV64IjNy1lNX+ErXOlWsFbkz67Reg4yFsiyRnySHb3wCemn9Ik=" ], "X-Amz-Request-Id": [ "KC0C2EPWR5M1226E" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "755299328987fac9", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%40-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "OBb7lIV4N0Af7x6bvfSI3+lWMVVPWh6Vngft97IhyUsi2h8c5oZCFHKkybmCEXZcbTqiVdHss0k=" ], "X-Amz-Request-Id": [ "KC09J92XNBFETTFS" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "c8715acab55635c9", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%40-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "J4zk2Y1QmBPEtP9r2UA5QFZTTD8yaA+6+IWQcZEbqmtWT27oVAMEW17Qw66OXzLd4/uAVpgdF8k=" ], "X-Amz-Request-Id": [ "KC02QDY15P1G1F8G" ] }, "Body": "" } }, { "ID": "e6d9bea814cb9b72", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%40", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "PxQoJu1qIvHoV5IrYvcMMZYoF1/dxkNg8ktFQMqSWztMyoZAAL4T6SiavqXx+bByAJmu7Rvkw9I=" ], "X-Amz-Request-Id": [ "KC094V5ESV2472MV" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "34beba328f9bd3aa", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%40?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "UDtRqe1Di0anEL7Z16sD3KB6VNfaPh0BqxHjBN9qhdEUoXpHs0fRnQCeTDO5fOLFW1s8bpty9MA=" ], "X-Amz-Request-Id": [ "KC093SH9V15EA15Z" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestKeys/ascii-6.replay ================================================ { "Initial": "AQAAAA7hTg0NNqyH1AAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "7c2fa45576dc9706", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%5B%5C%5D%5E_?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "dx4g9jNI71FI2Qm0hadAvWFrA3Hyq+BdiYuGq8iKvQjQAOlh0Z/cun0Hcho8vVG45jsB751IMczghkul+SrToFdGoQ0Ve9+s" ], "X-Amz-Request-Id": [ "BFXSYFZ8EZ74NCVP" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "250f48358a74d782", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%5B%5C%5D%5E_?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:15 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "nh0hUhwpV3M4ZGHIg/CLNLWi6LFBEq1mGwoXMkUjFAkSCeknbDOKE7lHLkGbPKixUecbTUamj/hpw7ojjnQo+sACPmr4nXMJ" ], "X-Amz-Request-Id": [ "M7JR780PQHHMT9V4" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "9286a95bddbe00fa", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%5B%5C%5D%5E_", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:15 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "aTM/wW0MoAN9y5VcB8yRC2tbZuFWOFIMmJuCZPlu0RM6Ro+xZOIxfWayeeqBDRROO8mAbZRhhjOPzYQroI3E0WGSezdW6Qi+" ], "X-Amz-Request-Id": [ "M7JHGEAQ9372GKJ9" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "b038de28c0bc696a", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%5B%5C%5D%5E_?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:15 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "hRAqvvTV6wcqfTpG8MBhA6GuGp1XW3LLrZFu+Nq6ekTu8zDsE3gnZilI8AzDWWcP6s03mgRt2lwTCBcehBSXxorhPC/S6EAw" ], "X-Amz-Request-Id": [ "M7JGABTWCK4QE3A3" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "9bf327840444ea49", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%5B%5C%5D%5E_-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keys%5B%5C%5D%5E_" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:15 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "PbTOz2urOpWbaMYdTT7r/xStSaH42O8qoEpBrpZ1Fh33qCtFVLJXMHGSFrWKu4BMpD64tsJctY57bBYcPuN6u8Jx2neEogUl" ], "X-Amz-Request-Id": [ "M7JHCXSBS2N9DCC3" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjE1LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "684ab49fd2e1b00a", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%5B%5C%5D%5E_-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:15 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:15 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "/1dMYCV8VUmNpuB0HuDqSFdnHi1aj+njHMRx5oMY4K97tdEZVIdYIMk8d0yz0AbemBHAlDhBy37daFKOvsfrgMxXZfQDJ5r3" ], "X-Amz-Request-Id": [ "M7JZG7EPS0X8S7MR" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "33b0694739d396ab", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%5B%5C%5D%5E_-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:15 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:15 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "YeekZ/RB5UbhuaSO378WfILJ+3sGSkz3h1Sm+A8RBsa+LN1ldDOtYs230o6/+A3C+8GvsIHmgmez4icmQHVGopD1XS+zzyLz" ], "X-Amz-Request-Id": [ "M7JHC88MERW0A1DS" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "f7341599284acc6e", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%5B%5C%5D%5E_-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:15 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "AIwOOlrC9exFue54Qouly3NNm+iOtWpMAp/Qt1bzVZxqMzMpgnCwDecL4iidgcfq2S+SvnkhUUn8vzHrSjktLl7FpYUIycty" ], "X-Amz-Request-Id": [ "M7JSKKGHA399GT02" ] }, "Body": "" } }, { "ID": "46e4591b81bd6d99", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%5B%5C%5D%5E_", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:15 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "aQ0s0dng3kxC7Hyxat0PnHL8PqI8BbfPkfbVKdCURqPVEt4mXgdKbziEGrYrcXLla9zmiPrnH3BrltQ+VChxxz/XKyxf+OVv" ], "X-Amz-Request-Id": [ "M7JGBRCQK9A9WDJS" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "0358f3756366969b", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%5B%5C%5D%5E_?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:15 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "bcScI7zj+30CIm3WxuOCpmqVeJFNO2EP0aVebkgGyqyz6ZCmtV995Fr+v2Co9ohHyq+pCunkxOpP/cisFzH3jJ8UrBDcFSH/" ], "X-Amz-Request-Id": [ "M7JY30J75N20XS74" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestKeys/ascii-7.replay ================================================ { "Initial": "AQAAAA7hTg0SHRbUtQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "e6c4b0e86e650e1e", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%60?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "aTv3QEKZ+m6e9Ic+1X3bD2Z5JjK4RPvQUopYHcHJNEfLOQII6yVlbmD+7z55LK6I+YxXJDHVCa0=" ], "X-Amz-Request-Id": [ "KC099E19G8JGWNBX" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "bfa4093b1212f494", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%60?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "UbautP526+q2x4HR56pr+4Omz/5kiSkuvTuQiWCSaSYecX40QMvw3bILa7INdiIhU2FVjRGQBsc=" ], "X-Amz-Request-Id": [ "KC0BNT1B2JZ1KQ2A" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "519522f1926851da", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%60", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "k4NOxQCLQTGh9A4kNtaxAIvJV/jRSeybaGcdJefUU1TeQbkh3Vfk0EOLlA4ponw8/WpY7ZvW8H0=" ], "X-Amz-Request-Id": [ "KC01NHCCHD40Y2PE" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "eafdc014de28cc3c", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%60?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "/Alp85853damldM+u1Spl98H4whQ1amxlnsSjp8srBv1A43PczH/ZAWj7nQ7ZbJkSCI3DE6m2n8=" ], "X-Amz-Request-Id": [ "KC05W5RNZCB9WNZP" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "0fcc20c8e86f46da", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%60-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keys%60" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "dFaFAqryP2UfzUoLHuGik/0QCRME39cvBkg58Dyxgc0/DdJMJeSEImzwbdsaWf9YuVc7kPDreZw=" ], "X-Amz-Request-Id": [ "KC067X1G56422CWW" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjE5LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "5c78688770bd09c4", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%60-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "iDzsSIao9bxWoVQookdfTGLC+oBIMqV4YdAJqAbJXOiUm0wVc1KpSYKyAwvsce+6OqDg4D/R+g8=" ], "X-Amz-Request-Id": [ "KC0CYBZ0ETW9Q4A2" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "813031b7c6b91f84", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%60-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "sdZ/1n28Abw0X3UjHmYQOILr+iRAH4sqTW+s4VKjEjCOZ6TbkoQuaatI9Xp0Vq/h8DqLNuI5F2A=" ], "X-Amz-Request-Id": [ "KC09ADJHZPVDMW0Q" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "936e819af4ce75a8", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%60-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "+ZbbOa4/lqZv78L3atLQDXMZg4Xxb/bRMJAo/kpRq2Mr0Lmz/83Dk9vmSRTlFk0rS6//dlvGgBY=" ], "X-Amz-Request-Id": [ "KC06R22Q728JABMS" ] }, "Body": "" } }, { "ID": "4b632b8f9c281d36", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%60", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "rhm0yCOD+qSlfx+2t8qHE3Klm+t85lcFVJxdD2ad+MYV6z9MsoqOJEoG4AD79ATapH7BqbBazdI=" ], "X-Amz-Request-Id": [ "KC0230S55QSMXQ23" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "19bef636abbdffbc", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%60?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "mdkUbJlQcbRUC1Ib/DFotqxuTgshZQe4T9fbB7dYY3s3XqptECjO8xlh1TGOcPNPj/IgHlGyu9E=" ], "X-Amz-Request-Id": [ "KC05MDP5DDTZ3EF3" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestKeys/ascii-8.replay ================================================ { "Initial": "AQAAAA7hTg0QH3KCNwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "b81f6fba36cafd12", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%7B%7C%7D~%7F?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:17 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "BcmtloAL/yr6tOkyPONVWnE6hXa1XBp6D3/LPlRKtF5TudUI6BTEdChPjhhS9MJpqjOTfp9xzD0HadIBhgIbSH7vxb3tdbXZ" ], "X-Amz-Request-Id": [ "9FS6YP43JNWP2EC4" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "1fd3bfd49ca50130", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%7B%7C%7D~%7F?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:17 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:17 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "tPbPWsk5A1RO7zK1j6dgIBwLZssqbXiqdmTbPfBiyWiaeVaH+i93+01jt1kldNAjjNXAwq/1O7wYmmlDEo5B1ORr4BAqmrdc" ], "X-Amz-Request-Id": [ "9FS475PCXPTJNTFG" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "7ca3beaaa11144ea", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%7B%7C%7D~%7F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:17 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:17 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "cyvycJH+XHXHkJDG7qqg57qCqvW9QfYJ8PsjB13mRUcpzq/u1BRHT7/QFAQFwDTp5QDs4OZiJ09WHg8fEW9Tn7XWQIOEUd49" ], "X-Amz-Request-Id": [ "9FSBCY9SMCM2AF4Y" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "05a4b21e71fe7256", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%7B%7C%7D~%7F?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:17 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:17 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "v4Kh8uiDmnsxZpiJv4HUKrnCCZQIWY6eJLgW5p88nL4nE6cqexON3hNXAcGdP/eofGSiAHq4NxITtJKfMVTJfOLX5qYr49Tf" ], "X-Amz-Request-Id": [ "9FSBVWGE3KAZTKCP" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "04a5130e64c7016b", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%7B%7C%7D~%7F-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keys%7B%7C%7D~%7F" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:17 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "fgCQ0aQGtIH5j1/aiuPJafft7jepcApwLaJFsTOpViGrVgPlgq9VylRDfU+Hlxa8qPLVyQWVi91AZcFez1f5Z+FEQBGBoo0A" ], "X-Amz-Request-Id": [ "9FS5EWGG9MCD6A60" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjE3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "9f8131e92439bbce", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%7B%7C%7D~%7F-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:17 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:17 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "08AWZnOaonWF7onZza6nXKV7+FOyrG+za2UNAjHcD8SDJQK2+BpRjJyrUsfDg4SBctEEwvtPwD26JguNYLFditXVsXF5sZL1" ], "X-Amz-Request-Id": [ "9FSDF9CCEXY8EBZA" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "a74f6b5be568479b", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%7B%7C%7D~%7F-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:17 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:17 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "YzUhjdlRD10BYksstE2WUT35bduUXWieEumMyrpzj00XbeS8+v/HtKn2YK4IhDKtv90b3Q1r8SAMupuuoCztW5Zv97kOMNI1" ], "X-Amz-Request-Id": [ "9FSFX17C4EAGSGVS" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "8b237c4919a59663", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%7B%7C%7D~%7F-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:17 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "9mvLpH115GES3+Cri9/VGP6DIERYqJM2r3AZ2kqyRQWlQDPwTRxcHnR829Voxfg22BnEVHHdygiNkTVwkK1Leqc2bwmKlIoQ" ], "X-Amz-Request-Id": [ "9FS3NXR13396G6QP" ] }, "Body": "" } }, { "ID": "5678ee7b787e757d", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%7B%7C%7D~%7F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:17 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:17 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "mVdV6yLifnucvaToatIRZHPPCttEnBSB73q2qy0Zd5zxLxmi21Mo+nDVi62Br804RwdBRgpXqzR1S3o921vVZIQiaawpUnPF" ], "X-Amz-Request-Id": [ "9FSADK13VRB3F813" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "111e4ae6a53aacd2", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%7B%7C%7D~%7F?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:17 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "l7SFy+99hP3VPiRYpBE8AyEtCc2WKzA7kJNwWOondB3QePh6171eyd0yW5FsnNXrelUmdhj6gR0EYljfOv1x76E3eUGCBM1l" ], "X-Amz-Request-Id": [ "9FSFJGJA3147GW55" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestKeys/backslashes.replay ================================================ { "Initial": "AQAAAA7hTg0TG8nFjAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "fbb4aa905a8e7cb2", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%5Cbar%5Cbaz?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "5RqgqZq/b7WGY2qwB14IQ7wtpnnKiIdOWvfLcRrOvDwYgvqafo4DE8IsPANgxuaVBXbH8P0PycUdCvIdF2bbyAnwXGgBoBvj" ], "X-Amz-Request-Id": [ "1GQPAS05EDN2Q4PE" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "a32d91e6c69ba4e4", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%5Cbar%5Cbaz?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "SkR6m8U15l3LuVNUHlBQEKTAwPjCy0i6rrqbMMxbb93g2K7ysWjeHTCwwt+t/kPyHINUxCPaUk9gnl4HGm4QPVzqdVghPKO7" ], "X-Amz-Request-Id": [ "1GQY6K6QHCVSPAFP" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "5d368e2f3f417ff3", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%5Cbar%5Cbaz", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "7ZgMamtyl1yRKPG+eUvRtkhD1faV0DwsSmqQXyvgOuEo3mTCQ0850tDlS32bhIAHyzPf9IjrmdZcPCqiqXGJrmaYpG0IjzTL" ], "X-Amz-Request-Id": [ "1GQRXT2RVCJSZWJX" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "5c2d780100453180", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%5Cbar%5Cbaz?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "nd9unGikmoj/luKz5uBHWZQwomairCr4jhVmqgFlKAEMMAoIn/HhalMh0eRlgMZqz2PTalwnXiBMg5/I0mrF7tg7ePidZRB5" ], "X-Amz-Request-Id": [ "1GQYR6DG8YAH9PYF" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "feaf209bab4155e5", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%5Cbar%5Cbaz-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keysfoo%5Cbar%5Cbaz" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Qaq4O1emQ6Z2Td+9l1JVS7edtQaEydmb5VnFVErGKGMQqNRYQUpHtiiRx9FhDROD5V/hTG2pHbMegdC2VGP9Sda6qrmZxCfb" ], "X-Amz-Request-Id": [ "1GQX2H2W1MJQ8D18" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjIwLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "b5c30e113cb86b3e", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%5Cbar%5Cbaz-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "xy6NSSERBMh/WnbWXrQ4M57qRXei8Ad1eFw2Bl3i2yM/3LihOB0dItJSy6Y0lHcFPKesF7r5vDFxLzojRoPHhZu5m83ByKlz" ], "X-Amz-Request-Id": [ "1GQGH5Z3HS7QB4NK" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "d3870fa6cc0fc564", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%5Cbar%5Cbaz-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Hty6X+QU9vkTfAzAT0gKiqnSTmfT0yJUjH9qEnA/tWi0rudDLyK+hRta2+b0UMg6eyyHpYvDJdMrSUz7/Eo48N46rWObxmDr" ], "X-Amz-Request-Id": [ "1GQSMF6K0RE0WGTX" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "a6a507c3f5a2920c", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%5Cbar%5Cbaz-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "CHBuzIOGQSMJDlcS5VFtBORnnFBVY6GOlpA0WaRHUpN5r8EkAulr6i7hv0UchxnJXryNgyh0fFeZ9LUe2iW2rxT5kBv3FYDA" ], "X-Amz-Request-Id": [ "1GQSP8706DDN1AR1" ] }, "Body": "" } }, { "ID": "d73342cfc063f6d0", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%5Cbar%5Cbaz", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:21 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "lEXJEKLf6hN4yGzUh0mFmA6sXbLmg2zb9///TyXHhDPWnTeHDnWS/BKdn1dVXqzSpeXaEHcig9e6HnXh28brI4F2kXkHeWVk" ], "X-Amz-Request-Id": [ "M1VFC21F43VH0Z4Y" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "5f837c33ca137296", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%5Cbar%5Cbaz?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:21 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "JLNNBAU28V8IHqB1h2QmOcsbuYshlBzO5rzYgLzaB3jF8BrPzU5STYmd6IglZ3WS6QSPZHI7SuNLzFW/MFJ+Oxx09Q7iw1sl" ], "X-Amz-Request-Id": [ "M1V8QX9ED5KYHY8D" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestKeys/dotdotbackslash.replay ================================================ { "Initial": "AQAAAA7hTg0OOjb/tQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "cc27be5920b7ca0a", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:16 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "qQrzvGo+d67jy3u7hPaBYHw7d2aa3zJZ5OnjSY8sfmPkosK/oLNjFmD3QlFtNQlQgSZsMb5SraY=" ], "X-Amz-Request-Id": [ "Y8S3Z5SDAMXT9QKR" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "57569d830ba5fd2c", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:16 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:16 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "DCTLqXj0Bw2DLGw4D7Dotl9z33zT6lU/N9MfdqYqGsxYzqVr/4yfpv1YQsBDyPLIrHxTfw6bn7A=" ], "X-Amz-Request-Id": [ "Y8S9ADZ1ZKGJ4QFD" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "ac8870e7cd2aac33", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:16 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:16 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "ObZyLbdo1L+vhpPV9/3j9BFP5oWysCatWYkBlR6iFAe1ZGmYpgVtRqXY91U0XTDn9FWz6FjiJ44=" ], "X-Amz-Request-Id": [ "Y8SARRHCEWJGWYZC" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "29140be152a6c51b", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:16 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:16 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Eev2V/ZfqeJnv9I7Daw3/W+/L+n28aVGvcAcjtUr1nLa7AeL9zlMXRinqrefGZbjzTaXRgBQMp0=" ], "X-Amz-Request-Id": [ "Y8SBP5WN1NYAT8JB" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "d3bf9d091f9051dc", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keys..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:16 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "YevlWZPzxsGl/W0/TMcLKuQhAcqUL0p3K5HWOMrQGd1njOKaDEjj5UCuomGcEVD/mf/nyKCZZCI=" ], "X-Amz-Request-Id": [ "Y8SBHJVBQY74GD36" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjE2LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "827416d9b254e389", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:16 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:16 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "depZxHd6X77CVXCJbQea/uhNanLRIN5QqEWLC86hgUNKWTzOiD3TyvDmINz8qf+DCTz1+s8WaXo=" ], "X-Amz-Request-Id": [ "Y8S3VTM1C9BSY7FJ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "85ecd5273daea166", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:16 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:16 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "woBubi4TlBvqV5KDTnHLL/giBpFWXtIahMR3EZIVPMotAaZdXod0VeBPK3cDN94szetRW/KfU9s=" ], "X-Amz-Request-Id": [ "Y8S6KFD2RRKNJHK9" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "bb1dbbc58e225a72", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:16 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "aHQXSofTkjKuvqkWvuMOzn54N8HYGnNr++WbnbZvOJKQ8oDJP+iptpXmr0CZyVbB4XVk4ZfZO+Q=" ], "X-Amz-Request-Id": [ "Y8SBHTCHPD03TQYN" ] }, "Body": "" } }, { "ID": "b157bea5ab025f66", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:16 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:16 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "SFhEd7aIoBliMMhQK6lKVkU1a85WFPv3c65febyYtKFpMRAqUVcuWspy5e4Y5Jt5elmWHETaP6A=" ], "X-Amz-Request-Id": [ "Y8S9DCXD7PTP8J06" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "f83632e826f6901f", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:16 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "1Fb6JP6Dkh+LC9hUsNMblOG7IQSVKysdFbfmnLbKIprrixHvjFMon5blcrSxkHgONYaI4kip0dI=" ], "X-Amz-Request-Id": [ "Y8S7RJZ8RHECJNSW" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestKeys/dotdotslash.replay ================================================ { "Initial": "AQAAAA7hTg0SOXey2wAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "a284973e97933159", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..__0x2f__foo/..__0x2f__bar/..__0x2f__..__0x2f__baz..__0x2f__?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "Pj0Ofs+vwcVmTp0RGuEuYtoqOZYYlS0RrXjjt4vSZtavQv7DQygiLSrVOAe1C/D4/ZbeB2WGasJzVXwvwwBxAnCLDQpSl2Fm" ], "X-Amz-Request-Id": [ "1GQGQKSFQ037G2BA" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "2d572cad063d625c", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..__0x2f__foo/..__0x2f__bar/..__0x2f__..__0x2f__baz..__0x2f__?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "H7EdS/tyGMnEL6eT/5kbcr0kDYTcE1g/dy7uBzqgHTntIAQRowtkUj3gZgy0YfIX9Q0f6xWEMhTrOPJ4TQrTkyrxYqtKvlp3" ], "X-Amz-Request-Id": [ "1GQS22B5G9GN00QA" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "fec1adf49476e46a", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..__0x2f__foo/..__0x2f__bar/..__0x2f__..__0x2f__baz..__0x2f__", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "4Cw0+yK+BZBZuiVmOE26GeEppfngJ/OTrgepMQoIV00+723NghI86SJO5WgJQcz2JK11mN0GzfRbsPeKceHeZa5AYx8R1Z1u" ], "X-Amz-Request-Id": [ "1GQRMFG7RWT87NFR" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "e3355cea83f30126", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..__0x2f__foo/..__0x2f__bar/..__0x2f__..__0x2f__baz..__0x2f__?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "8WpPDv578xboII5WVpb8dXFrkDvyuPIy7C7dZuwX01Tb2odmmtNM/tpzlCDjhPBJmGNHU+PvjzXXzsa+wq/UGeWHZOl6P152" ], "X-Amz-Request-Id": [ "1GQP03MC21ANJFKB" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "dd0bc256dd31eede", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..__0x2f__foo/..__0x2f__bar/..__0x2f__..__0x2f__baz..__0x2f__-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keys..__0x2f__foo%2F..__0x2f__bar%2F..__0x2f__..__0x2f__baz..__0x2f__" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "19LJ+JaDFJnOcGlrlHiJP+jf860wgbcM8mLTXi7fpXiYJNFNRE7hu/PduNDX2dccU7RzLR42WWAt2zHrGxLXls3mCVJabTwa" ], "X-Amz-Request-Id": [ "1GQQNKYSCKKM8H0M" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjIwLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "c4d5008323bd97d8", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..__0x2f__foo/..__0x2f__bar/..__0x2f__..__0x2f__baz..__0x2f__-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "82i3QYj1KwEtPFQSckJLoC6p4iIevhhTuAUR4TNFQLSlK4g8SaG4/Z1c6KKqKgoEjOS7geebpoyg1MLbJsqkDeaHKt0D6Ypx" ], "X-Amz-Request-Id": [ "1GQWQMXV4VK834JJ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "f430a59538d7be69", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..__0x2f__foo/..__0x2f__bar/..__0x2f__..__0x2f__baz..__0x2f__-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "25mpWL1NTUW6INItJ+ySAhJVDxIW9s1MXaygLxtAtg188kZuDdUo8a3PvFTgcoXtlld5kd84A9pFQFmJbtbHrZtxJ2Ylatmh" ], "X-Amz-Request-Id": [ "1GQP79MFQX0EZ9DW" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "2f0cc7fa5cf59c6e", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..__0x2f__foo/..__0x2f__bar/..__0x2f__..__0x2f__baz..__0x2f__-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "TSneMiYHsIBUIbb1Z0th4TwvJtd+VlaY/ObFBU9dnk6H4MiHsCFkskf7yKPS1xILZvdgZpNfwCBulBGAkzjFxMKjYNcEvasD" ], "X-Amz-Request-Id": [ "1GQQ0RPG16YTGDB4" ] }, "Body": "" } }, { "ID": "4a20090126001e7a", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..__0x2f__foo/..__0x2f__bar/..__0x2f__..__0x2f__baz..__0x2f__", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "i6QCTDwOl8yNdlQQsBmzXAtXvxijRuFK1b6ZLmLR3cDyKof+Tvl95f2liyjgoxSFINgt2v5WjL+oNfeoia5bJqMcbuVT8l+f" ], "X-Amz-Request-Id": [ "1GQS5YRM0EMV8ZM5" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "54bb8013132974c6", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..__0x2f__foo/..__0x2f__bar/..__0x2f__..__0x2f__baz..__0x2f__?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:20 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "vAQ04mcxaQKWbXxCx6ce4VFTRB5xKn4zlIM1K+vkREW/jnPQ5Hb45b/5QKF5EjmvXuLMk1tBdbfoAbP/yVUs3dr4FYLa+S4E" ], "X-Amz-Request-Id": [ "1GQJGKNZN4T1ZB6Z" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestKeys/fwdslashes.replay ================================================ { "Initial": "AQAAAA7hTg0OF4SXEQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "e53c029192b9f042", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo/bar/baz?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:15 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "e1/MN7MAypRuKSWt6X+Pfh0r/p8mprVGc8eMqaRXDOxn+o2t7idq+VWxVkec7iM8WRVM1F7CnR0=" ], "X-Amz-Request-Id": [ "M7JS2MQBM8N0FQ44" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "b11566ab1aee89de", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo/bar/baz?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:15 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:15 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "J5hcDO24MYcjlATIGiRXIPOBsI6ugE80uR5NaKuEntMRydjAFan7NiT/FKBq8qavs7g9H2W0U9U=" ], "X-Amz-Request-Id": [ "M7JJXAM9XX41ZSKQ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "b4ef55009fef4079", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo/bar/baz", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:15 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:15 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "jgzAWbEHWQ/i9QX5eng7kv+5tdLmSMJV/bbbIYUYyOH1c4xlS1Scx37fl6uJvS7OG8/nUidD/wk=" ], "X-Amz-Request-Id": [ "M7JW75QCMDHE92XB" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "d2e0fc403a439cac", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo/bar/baz?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:15 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:15 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "3ChaD7U2Y0DP/Zecl1OpNYnGLXGNEfq3y3hpjNPZIE3u2O/0MfrNg2xtNP3dIKB5c/cglBlb0e4=" ], "X-Amz-Request-Id": [ "M7JTNG77TGM8FGG0" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "8e4a614560e690a4", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo/bar/baz-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keysfoo%2Fbar%2Fbaz" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:15 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Ik+QIkEDpYZyCIoATInt97b/A6qykEhqepM4TtpbWBYGM4SUszEllJh2EisjM2H9ZgQF4yei3kE=" ], "X-Amz-Request-Id": [ "M7JMP5KCZKKQRFA9" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjE1LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "49082404fa260115", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo/bar/baz-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:15 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:15 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "dswuaZGynjQ/HtwlwVvTDdCNBKyn7c6fHD9xCIauEWEeN0tTmFFqS9zkP9Vc+NTdsUdy3U5iqeA=" ], "X-Amz-Request-Id": [ "M7JYV8JTTDKGYFG7" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "b62beffba84fa42f", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo/bar/baz-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:15 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:15 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "mG7splqL5p57cytHa2Aep+Fqod/qoPVKoQumGbVnkB/NC21/P1ImHLftCzdIk6FVWb+ylykzc34=" ], "X-Amz-Request-Id": [ "M7JKS3W91QC4A6RF" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "6c884ce79409e610", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo/bar/baz-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:15 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "0jv0IaERvNtKwlNF5pqiE9KdGoBE30lIm4C8w06P+j880sC+6oWHbjuMOTonQYxp82EluuXIQf0=" ], "X-Amz-Request-Id": [ "M7JHZKNDE4RGMMCS" ] }, "Body": "" } }, { "ID": "2f9198c6d15589b2", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo/bar/baz", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:15 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:15 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "HxNEsoQBWsBF8NbitLceifwS9UEz7UCHHVRx+rSUzevLPLnY1MiBV7ASH2zF5SVG5aeHml3u/+Q=" ], "X-Amz-Request-Id": [ "M7JQNQSKHYV8ZF63" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "565c03061d941081", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo/bar/baz?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:15 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "FNTg0uqlmJf5KW6dm0Jlwzc4J3HDIKd+vDGuYy6Ag3jM2yeiJY8vFXSrx/Ts4m1ryjl99JQK5HY=" ], "X-Amz-Request-Id": [ "M7JJPM1PWWYVMT47" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestKeys/non-UTF8_fails.replay ================================================ { "Initial": "AQAAAA7hTg0LAkr5gAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": null } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestKeys/quote.replay ================================================ { "Initial": "AQAAAA7hTg0LOsGqZQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "ce836bb9ac01b7de", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%22bar%22baz?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:13 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "fKtg0lHL+x7I8z0fp7pqOfq99JBvL96JXYf7TLep1/iRG5rdq2FkVmfR0GNoJbGVlHWhVUMjA5uy/pXPQLvzdSFeXOMkVo9W" ], "X-Amz-Request-Id": [ "WCETHKAEVRTZBG9S" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "f1547b44a50a9fa2", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%22bar%22baz?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:13 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:13 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "G7/9rOznfSEOwAsTiOjbQI/+LnlYltHHdMrdM9RB+diTZGdAJd71fpGu68KC4W4rKIV+fDpkutw5Jqn5q+9+OWui4lw8bXv+" ], "X-Amz-Request-Id": [ "WCENAP8M5WBWTTTP" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "33557e5e36f47300", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%22bar%22baz", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:13 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:13 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "mtUq/zm4lgLt8TW01Ps2XTxLQ46PqGxTJp03nDKooctYbSyjpIs9oRxOGkg0VN6sFJ6o+I+JNX+DRngn+sZMg0Q2yIAm2am6" ], "X-Amz-Request-Id": [ "WCEMME1YH9F0G14P" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "f9c1dc60925035ec", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%22bar%22baz?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:13 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:13 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "uhyZhi3BONXgJvEV51ef1VYk3YQZ6jh4EpR6liWghO1O9J/tJBRHIppAnVnGRzvE0+P426UajSpYhfw+UENAq8U7fxTWgVSg" ], "X-Amz-Request-Id": [ "WCEY8N2SM2VX4NT0" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "b1565883ee63299e", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%22bar%22baz-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keysfoo%22bar%22baz" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:13 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "mUCSua5DwJfeZ8zRCVRhW2JAgtUZ0XUshiQff6UH5gYtwKurqyGxZPKA+ZIazK8LEkl8vRpAFd4E8DEy6ZK/uzxnI3ZCZSc1" ], "X-Amz-Request-Id": [ "WCEPKYJBMH0GRJCW" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjEzLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "1257ba780431e401", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%22bar%22baz-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:13 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:13 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "oSaWgUsVIOyNV1YPV1PSpo+odVuXhqbgXBk6zdRWOyCl9cVtxAy21HyFoHzFdaj95j2wHonFPU1bEUz7wyJV+O8IEnHjZpf+" ], "X-Amz-Request-Id": [ "WCEZZGR34833NJH7" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "e35d392298f22c0f", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%22bar%22baz-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:13 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:13 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "JoPKxlS00y66rtx+9E2SgHO2GlfxlSziwpPOP2hJC3eUPj9pfFNeZJTNT9r8bf2xVr51GiYFRuf3tqi8whdHHNNrz4i44vBC" ], "X-Amz-Request-Id": [ "WCEYX7PCJX710E8V" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "aaa5c9f7c1b5c516", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%22bar%22baz-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:13 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "5j1f/GZyyhSUJ2SBCK7eY94Fhfc2fuBMJc3O2uXBrZ8F5P9B+sNlTeazvGtfeIsPEMxBECsCayiIk939M5rI1sIgIlCyKQPh" ], "X-Amz-Request-Id": [ "WCEWR598T80FG6FY" ] }, "Body": "" } }, { "ID": "292c70dc3e35839c", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%22bar%22baz", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:13 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:13 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "+RKwrrAdb/CvyZzVzerWcgsMicc2wvhncOXghvG5mRIt/1h0vRfqLyScu3JhEuI6qVf9BmdXU4Ya7NjDXPCYfboIKAULcKD3" ], "X-Amz-Request-Id": [ "WCEK6WVA1DHZT5A5" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "34ae9241fc568c0f", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%22bar%22baz?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:13 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "aBq87HcFGANwLvalxUupYL/ku/DGUSROVb/iRs+cccWNSdxSwf+MuPVCTy7xPDvKnFd93yFpsmRCqol5db7ScJhHVwbdXQSl" ], "X-Amz-Request-Id": [ "WCEV2759AJMZC0R4" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestKeys/repeatedbackslashes.replay ================================================ { "Initial": "AQAAAA7hTg0LHpCEsAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "502650c77efd2cf6", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:12 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "fVaPu9OWOdLmfrGK632TtFzYx9XRJk+FdQ8h60CDcb1j6rroqAUzKs8kmWSCGpFB1q4sjtMdgu8=" ], "X-Amz-Request-Id": [ "PFRMV8SAKJTHFGZ6" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "d2f8b6da49207aaa", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:12 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:12 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "7mxxOqaHXCLvxkDcizMx6OlqXOc3Eb1TXoZu4hsy6vhoLYyKC1MTjPqA+VokymTEOZ8ljU4XBok=" ], "X-Amz-Request-Id": [ "PFRPCWH57RVTM6Z6" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "72db8f2040d0231e", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:12 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:12 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "0Jpu7h4MWKY27I4uPuwIdP64ftxDdW8dmExNI/bnwYE+/AwIQ1t1+LXxv5Z4GVn5tnShBeiCS94=" ], "X-Amz-Request-Id": [ "PFRK0GWQ8KC1ZNX0" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "fc99dd409f1ec27b", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:12 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:12 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "zzb1cqUvmi0Ny2v00D/yqH/xVXykLd5OPch4u/geHdxTT8UXiHyPR9fx/nKCH/rkAJ+gD5jyUC8=" ], "X-Amz-Request-Id": [ "PFRS2XA74207S5WC" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "e3795658fb4be438", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keys..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:12 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "vH9FB2uLLw2fVCsXeM3fsxU7UCpGpl3mxK5E2cuR8dygRVK4zFQQiNb9CtApOkckhYfTEt4HKII=" ], "X-Amz-Request-Id": [ "PFRG5YZ0DK7CCWVE" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjEyLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "cf4f0b52f1507ab2", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:12 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:12 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "HCAnv3WJGs8gyiSJ/9NAhzzure5O/0kktchxcvM8GiNPxMGJQbt54avQCCoRjVHZEBlgA4Jly9U=" ], "X-Amz-Request-Id": [ "PFRWRMS10XEMSB0H" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "8feca1003488d622", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:12 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:12 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "jpvISb2dTDI0cJIfZR1p2OKy0JsZJNMmm9T5MxR3VN/V7d5ecEuEpYMPZJJCNTmBUQdskkNVQyA=" ], "X-Amz-Request-Id": [ "PFRGSWMMGYP88WHQ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "330506602a968a60", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:12 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "+MabqyJ4EK74nzmyqpCkDESBtGU/lvsmy68APhwNlm8QNGAjAxZo3WyAV7fc41AOSPKRSeY0Kiw=" ], "X-Amz-Request-Id": [ "PFRKYVBGTANFA1Q2" ] }, "Body": "" } }, { "ID": "81ac8f06bdd69de9", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:12 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:12 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Y+fAP6skRxBuo3FYPsiHGPdFMECpyCNbQqL9xYvwKEmqOjPlCZGu2Ut2cND00Y6TOTAOlX9tT0I=" ], "X-Amz-Request-Id": [ "PFRGRW5E6BPQSG3M" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "f3218577908f4a0c", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:12 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "tlRowjrMEq4RlvS0QoRGXlbXts4YZjlMgBRMU5RwOBbTe9FxNFBM66Xuw7KftZ/jh/MHWfSQV1M=" ], "X-Amz-Request-Id": [ "PFRS65TGX9YN4478" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestKeys/repeatedfwdslashes.replay ================================================ { "Initial": "AQAAAA7hTg0RAUvyuAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "9c07f069a585645f", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo//bar///baz?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:18 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "1PSjKSCXL458q9xnGp2lkhPeMm2Mwv1834+kgKbQgPnZD5UDox+MfKjYz3Ymq6NgB3dqmLdArPo=" ], "X-Amz-Request-Id": [ "TE60S5PGFANW3XK9" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "d0e97f8263ce6c26", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo//bar///baz?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:18 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:18 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "Wit6VhTF6hn0FocSzCy+OPfMj1wGL3vQgMfWfjLM+Pnn1xUtjoWjgGQInATwvh85lUsTi997sgA=" ], "X-Amz-Request-Id": [ "TE60JQQ1MPYSACKF" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "49fbb516cf4f5596", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo//bar///baz", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:18 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:18 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "I+0NW66HKHQTs3rnvF5aY/OZ847PjSfccw1cJbqHT0OxXjG1lXLk+3KwB0T1ENf1JoK94/ZmKQY=" ], "X-Amz-Request-Id": [ "TE66X01N0VXHYPDV" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "9aa211f3e6a244d9", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo//bar///baz?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:18 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:18 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "VfXEtB65iLx/kcB+9dev0eUUFx+F1FPNQv4wjH0Lew2KWwzNsSwCuRMfDio54Xng012e9jBc++8=" ], "X-Amz-Request-Id": [ "TE67A6ZNRZ5NK4AC" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "bbb5a78ea11c888a", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo//bar///baz-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keysfoo%2F%2Fbar%2F%2F%2Fbaz" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:18 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "iqKPTYN3095xlO97qQjjWoBhIMrBqnme6P/9a2I3X7qDgyDj9Q8r52OZfBBqYCKsvVXR2HOd4iY=" ], "X-Amz-Request-Id": [ "TE634ZWMDG13F1FH" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjE4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "1b3d17d9396acdf2", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo//bar///baz-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:18 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:18 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "KrTR6+EvYEOVU0+Gn1zuZhPzwI6Q3SAN6gyeDKNINJFD1pIj2KSqPmguqei7h8rYIRskU1RBtBI=" ], "X-Amz-Request-Id": [ "TE62KQ8835ZACXAN" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "e50a36062ae3c5c0", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo//bar///baz-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:18 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:18 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Qb5ye/+CihJvw+4rhJZE8UWjqZr63CHLNnTMlp/ZBiXxeuSn9bmTIZQibJwfSKbfRU2YjTjtJXk=" ], "X-Amz-Request-Id": [ "TE61DGMXB4Z2JEAW" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "aaa22dad266f45e1", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo//bar///baz-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:18 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "xcMy1bRkre+FOVgFxxDYy7UlrClLHK67uWP9aiOxtYvDA3+coie8+3ckQ/vl32kStT66SmKq1Io=" ], "X-Amz-Request-Id": [ "TE66DEBVJZZM5SA7" ] }, "Body": "" } }, { "ID": "f039685005816a19", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo//bar///baz", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:18 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:18 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "wa35PLU+DwPsbVTMCI0ESuWIBFjKNeS/H1qiE/ToZ8KB8Yb3Sz3uTG03IIVggDVp0Ta/N6R8E0o=" ], "X-Amz-Request-Id": [ "TE63GAWPWMP7KB2V" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "07f2ae23ae7b82ba", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo//bar///baz?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:18 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "63Ku+y9Ud4OTXjvhw7W6OR5y/wnyuDK3pVdbf/hQW+fGYF1C2crs90CoaCxR0ZV/5guE36PaMtk=" ], "X-Amz-Request-Id": [ "TE6EN3QMC4RHHNS2" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestKeys/spaces.replay ================================================ { "Initial": "AQAAAA7hTg0LAlfKIAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "dcfedc320ba23bbf", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%20bar%20baz?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:12 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "MV8EqHKVv/9r++qwPIJDs9ADDIP/rwFG4DvzUznPnXcaGo/YKUmC20irhkfBOq4n6Vf9iA8+E4s=" ], "X-Amz-Request-Id": [ "PFRM3HE7BPR8QS5V" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "98ec17def1b6b7f9", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%20bar%20baz?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:12 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:12 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "EbBcHd/bBcehHNkuHBUADlIhICRX/L81vnExxaBYchf5gyEakZXtcM/8pxM6py6KfOr+Ip4PenI=" ], "X-Amz-Request-Id": [ "PFRMYGXGDC7TCCDH" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "07a27b2fce715e78", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%20bar%20baz", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:12 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:12 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "XCYusKQXTkUn7tI+r3yYyIRh10K8gjFtAvF2rFBpNF1KEMsHvqZg3JMDQKaXpFymSRsap1mr4bo=" ], "X-Amz-Request-Id": [ "PFRY63YXRV2H959X" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "d32bbb4bc040ad78", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%20bar%20baz?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:12 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:12 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Cu1g7WaaCCEFqf15Q4XkTe/KGaVBxCHAhwSi0DGTYKtdFe7oFM/9uB4gJcrlY3LwxGijjGUZYKo=" ], "X-Amz-Request-Id": [ "PFRMCYDZK59PW6KJ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "44d5892b6671a218", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%20bar%20baz-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keysfoo+bar+baz" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:12 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "4LgPn5xw4azJokBmfQf9l1gReP4ij3dzKhJw9XbaRzUPZDrIj9UY+r4T0646aWU/WXaflwwoITo=" ], "X-Amz-Request-Id": [ "PFRM96WFJNKDVMYD" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjEyLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "10cdfa3ed4800276", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%20bar%20baz-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:12 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:12 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "23qPSAG5RUf2edwYLNsQjHm89uDO3OOmiJWMtz2Vco/UcnWAmBO3RPvm/rt1F7bGEShZ3CzWHxA=" ], "X-Amz-Request-Id": [ "PFRNSM6BNKRQASA6" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "a3b77eff2f9bf8ea", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%20bar%20baz-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:12 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:12 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "qpQFgOXu3jAAcmkKN8mZMnxVuzDoy8yLmxJ0y8KaVqt51eraU7wYMU8nDMZgVT/+PBIIo3/UoBg=" ], "X-Amz-Request-Id": [ "PFRWGP9XN4MPRXBP" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "ccf7ae3078ee5f0b", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%20bar%20baz-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:12 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Q+2i7AfVViiaodwMRsSpdLyiktWiyD2MTazC+o1R4z1M6vQKyVxlVVP3nnjG+qzVR6qhggyhmFo=" ], "X-Amz-Request-Id": [ "PFRYG0ZFQW762N96" ] }, "Body": "" } }, { "ID": "3a3566149f038dff", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%20bar%20baz", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:12 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:12 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "6Kz8aUwfWiN6o3EtDCjdxPbThevGQGE6BD4bnz+euOgvoIPMkT/mw3p2Zewyhn2u8cyN3meuGK8=" ], "X-Amz-Request-Id": [ "PFRPD0HVVXFRR42N" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "8fe2b52b5fcf4bde", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%20bar%20baz?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:12 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "rc5BTr+SOwGiuI+7rCv40K/iUsquiU7/sgc8lZDNhy3eahYZQ9D8I47hVVjoSFBHAK4MCspzSCs=" ], "X-Amz-Request-Id": [ "PFRY6PSZWFXT9N18" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestKeys/startwithdigit.replay ================================================ { "Initial": "AQAAAA7hTg0MHFrhkAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "1cf9929052940257", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys12345?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:13 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "ozDl540WJFlQXICKSYTB7eTwYttf8JDGu+YvBE5+gsdF2qthnN4xgYbynvinCzyOe1cHNCQqLgE=" ], "X-Amz-Request-Id": [ "WCEVVYF29HFK3Q16" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "4d4d5c4cf3818ae9", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys12345?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:13 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:13 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "yq2/MUxr1+EueUkRbVL2ER5/mmnJ9XUVpKRp4a1OEtZpfZ/L4qxb/JB6gDDYoniexHseHF6x/8U=" ], "X-Amz-Request-Id": [ "WCEP0TB4VX9K9K35" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "35903b40d4520949", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys12345", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:13 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:13 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "a8iMz5xAnM90+GUCF8Z9I0YIQlP+vNwUj7BJjLWp2oLIDLPQDoLV6SLR7rdbaRd9smoaKgVOTSo=" ], "X-Amz-Request-Id": [ "WCEN9B74TQCR2A3R" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "4b6815d115398ba4", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys12345?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:13 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:13 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "qIj+wFuABv/9ExulNeUJ4yDHhF/fOZDSOGf5dP5ipO+0hFwxr6yp/mqOT5v1EiRU/JPofhoTTxM=" ], "X-Amz-Request-Id": [ "WCEWMFA7JXDZTB79" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "981d7b01e4406643", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys12345-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keys12345" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:13 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Z+vf5egAC1GiEyeof/K22H293m9rpzQfG5YdoNptHwE+izqTBdeK+pd0O8AEZ0V/E34Qdhlxo14=" ], "X-Amz-Request-Id": [ "WCEY3V6SC5AVMY1F" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjEzLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "c07061d3f4ddf6dd", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys12345-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:13 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:13 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "vgnQ32Q+PL2NQjeGvwnfsCW3UOpXZM986EJWNyHxxv35CiEzEpB6tfxucGYgkfHOZe6RTvGqBCE=" ], "X-Amz-Request-Id": [ "WCEPXP1BMMPKBBEB" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "9a874f0f32b3a529", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys12345-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:13 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:13 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "8zl3iIuhK+ITnRPZ/VofS6uRqEImN08vHSMuQk6m5o1/ZYlv7b7ULTttcyJVPMemGr1CsnCiopU=" ], "X-Amz-Request-Id": [ "WCEH9HDESA4TZFGN" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "94f81d9da5883e87", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys12345-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:13 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "l6a1COmz/Z8B6AOoksSFd6/ktcXy2TBv0Htnxe8iCwdd+gVcyeSSopySQdQH7Bc+jLwTX8GcjP0=" ], "X-Amz-Request-Id": [ "WCEGR8Z7EZEEM9RW" ] }, "Body": "" } }, { "ID": "e01eaf6a72527e2d", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys12345", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:13 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:13 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "t42RH19YlfraOiEtIwdZ8rlCemnDbA4WI43+jDvB7dq9u5veNaJxF0OKwOGPWwXHudyarlNcZfg=" ], "X-Amz-Request-Id": [ "WCEHCMQH80GQPYDV" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "67aeba69ef76c137", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys12345?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:13 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "eLlXzUt+zMWwOkXU35a3oBNvbTwz2i/JVbwddejlwQKc/lBviE+Blr7skph/W6pD5ZqXKWl2aPQ=" ], "X-Amz-Request-Id": [ "WCETAR4JT85PBKB9" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestKeys/unicode.replay ================================================ { "Initial": "AQAAAA7hTg0MOesYFwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "23f04a17ae2e8b9a", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "kzZ9pt3kXmv/AAtombCk8/1x23+TMsgodwBeHg4ccB4H/n7Z7FlGRln7wsp0f97U32//0LmEJhI=" ], "X-Amz-Request-Id": [ "BFXNM3BW6EY0EFVD" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "95f6a8e565904846", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "4mKHOuSs+4aMfbAssn/Gzc7uuGKdHZQLsesVv/4V7FjF9NHhznu2przUpjYN7/bmbGWQY64ShkE=" ], "X-Amz-Request-Id": [ "BFXYBT9KJ1Y8NVYP" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "1b5effaf63998bcb", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "MAzR+Lui4TUiRlAX2hVvxP8dGTMcLumSuea7vKxXC/69gG2aw4YbjzZ97CKSncvwSQcjmhfQUfk=" ], "X-Amz-Request-Id": [ "BFXMSB3N5WMZMYS3" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "66ba2add1914901a", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "2lbUBVORcMFlokkGmGQgiNbjO0iTaweiFBYuertfQErHVYjhgBXO0mugXOsk2p3bTTkeEr5iq04=" ], "X-Amz-Request-Id": [ "BFXPS114JPJGDBYS" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "c8ceb241625ec434", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keys%E2%98%BA%E2%98%BA%E2%98%BA" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "ZYqbTMSe4cE5R/ftAiElZ1VYGNTLk0XkTQUOZO6+f5Ii8bu2eoFxkUuob8Il/ftWi4RS66XE66c=" ], "X-Amz-Request-Id": [ "BFXSPXG9SSMX5TGW" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjE0LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "d3fc1aaa583b355e", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "FhE3AvkTDuzK9rLc4bgaQx41T23rbIJ8SkOutzFOD6iiH6ROrcRwov/KsCPCBaOzAscQ3wS6vUE=" ], "X-Amz-Request-Id": [ "BFXJTFFFA7HYGQ4P" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "cf8d52880301f6e1", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "GVCdjnbcQRxsE4WV4RBd+DTLpePt14qK8ZS7sAPvk0xF13PojjTcPOCpG9DNZ0pPLiQ3wK9Hyx0=" ], "X-Amz-Request-Id": [ "BFXG2MHQXZ6QEGVE" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "d65e83189c286f80", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "a0WxXskG2tRpEpbK/tUqyapfQdSRZi+hkVXlkB+yxD1MfH6lv2tULONsWN8maFTmizPBoSSLGt0=" ], "X-Amz-Request-Id": [ "BFXJVYD2WG3GX344" ] }, "Body": "" } }, { "ID": "a8500e0996a9cc78", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "x3wOwxxF71q92qXsI5xB534KjVbvjQOAY3b5fbVaq13pPa4bJ7dYkoNJTQGo4Ji9uLmSXfAwn8Y=" ], "X-Amz-Request-Id": [ "BFXTTR4SMV0WJ83A" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "bc7cfec5b17b0d56", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:14 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "bjl8d3DB/Hr6JpEwRMmXgMmuT4p3Wu9MAVq19vE5+48ZRVJUQ9R+mH4uxX7JP5ZxgAJldfJCKIc=" ], "X-Amz-Request-Id": [ "BFXQFXCE6D2XN3JK" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestList/PaginationConsistencyAfterDelete.replay ================================================ { "Initial": "AQAAAA7hTgz8OcferwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "1c608fc7c787a5b0", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?list-type=2\u0026max-keys=1000\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:58 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "gk7Qt3EYvx/K+h9Rb1V2HeMOOFG55u+bFs/KY+8fI/mR3utzHaTbbm/Ej0VQ1qeSRfT1gKuuwEg=" ], "X-Amz-Request-Id": [ "J53F37XDZ7AKD176" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxLZXlDb3VudD4zPC9LZXlDb3VudD48TWF4S2V5cz4xMDAwPC9NYXhLZXlzPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItbGlzdC0wPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE1LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWxpc3QtMTwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNS0xMi0wMVQxOTowMDoxMy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PENoZWNrc3VtQWxnb3JpdGhtPkNSQzMyPC9DaGVja3N1bUFsZ29yaXRobT48Q2hlY2tzdW1UeXBlPkZVTExfT0JKRUNUPC9DaGVja3N1bVR5cGU+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1saXN0LTI8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTUuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "575c3b35db4cb3f2", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?list-type=2\u0026max-keys=2\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:58 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "h4yi5lBvYdFryowVT2eO3xoDCAPKpmZV1UGy512WCf1azaLZx50YF45gZCkfPWd53vn+34hKTm8=" ], "X-Amz-Request-Id": [ "J5311RWPWQH08PS7" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxOZXh0Q29udGludWF0aW9uVG9rZW4+MXU4MkRFSkZhei9kUmUzU3VUc0g3Z3ZuWFFhdnFoYVNPZnl0Nll3eS9uc2dsS24wQzZPWk53NFg0TjRjZFNuVXg8L05leHRDb250aW51YXRpb25Ub2tlbj48S2V5Q291bnQ+MjwvS2V5Q291bnQ+PE1heEtleXM+MjwvTWF4S2V5cz48SXNUcnVuY2F0ZWQ+dHJ1ZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItbGlzdC0wPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE1LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWxpc3QtMTwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNS0xMi0wMVQxOTowMDoxMy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PENoZWNrc3VtQWxnb3JpdGhtPkNSQzMyPC9DaGVja3N1bUFsZ29yaXRobT48Q2hlY2tzdW1UeXBlPkZVTExfT0JKRUNUPC9DaGVja3N1bVR5cGU+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "4e8ff13efa33d7c0", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-list-1", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:27:58 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Mon, 01 Dec 2025 19:00:13 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "TQucqkFtDff3THfb4dNP7+1RHGc4fsdLWhugzuaTumN2saJ+9FIu5PD3NmMdqJbBwG4ooN2honM=" ], "X-Amz-Request-Id": [ "J5385VBFX7X1QVG3" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "c35e0ed58b5e170a", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-list-1?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:27:58 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "nlhNjWRqvXNRGqUioZnXZ79Ig5AKjejSq5acHAb1fQxSlXcX3wFyFH4ZEsiLU3MNEWmKc5XRKZ0=" ], "X-Amz-Request-Id": [ "J53FD6C2NCVSVQ4C" ] }, "Body": "" } }, { "ID": "2c71390e21077612", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?continuation-token=1u82DEJFaz%2FdRe3SuTsH7gvnXQavqhaSOfyt6Ywy%2FnsglKn0C6OZNw4X4N4cdSnUx\u0026list-type=2\u0026max-keys=1000\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:58 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "R2ZJWkafvChIod0mBJTuCuzvGTR940heDrGtAJpOfkxPdPRxuX7OYFcdKD9KbwhdZgJierTnTvg=" ], "X-Amz-Request-Id": [ "J534ED7AKBA1667T" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxDb250aW51YXRpb25Ub2tlbj4xdTgyREVKRmF6L2RSZTNTdVRzSDdndm5YUWF2cWhhU09meXQ2WXd5L25zZ2xLbjBDNk9aTnc0WDRONGNkU25VeDwvQ29udGludWF0aW9uVG9rZW4+PEtleUNvdW50PjE8L0tleUNvdW50PjxNYXhLZXlzPjEwMDA8L01heEtleXM+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1saXN0LTI8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTUuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "b6924635ac80b99b", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-list-1?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:27:58 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "Vh31+oKOcWHrDDTaObNiawNjQbVbrGL4Mf1k8LAYl7BXngqcAJEM68NReKmLRO81PRs6p0ZhT0E=" ], "X-Amz-Request-Id": [ "J537TZJH6AW5AM16" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestList/PaginationConsistencyAfterInsert.replay ================================================ { "Initial": "AQAAAA7hTgz8J8D0YAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "85db9e1e3efb8bed", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?list-type=2\u0026max-keys=1000\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:57 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "6z3tYM6n6b0rrXFoAfDXqHqyvQthN6oggiHkx8JjLR+LPSYxdbCx8fOlEbZjmSDB7m7pL+g7y4c=" ], "X-Amz-Request-Id": [ "PB05S7M101YRZJH9" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxLZXlDb3VudD4zPC9LZXlDb3VudD48TWF4S2V5cz4xMDAwPC9NYXhLZXlzPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItbGlzdC0wPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE1LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWxpc3QtMTwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNS0xMi0wMVQxOTowMDoxMy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PENoZWNrc3VtQWxnb3JpdGhtPkNSQzMyPC9DaGVja3N1bUFsZ29yaXRobT48Q2hlY2tzdW1UeXBlPkZVTExfT0JKRUNUPC9DaGVja3N1bVR5cGU+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1saXN0LTI8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTUuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "a30360d3405d8342", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?list-type=2\u0026max-keys=2\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:57 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "yVqX46Rzbhzkr/uGekkt2b4cQi9DAna5z+sbfDu7Nwa+JZuMTd52RVESNsswLiYlH/6PT4ZF1IU=" ], "X-Amz-Request-Id": [ "PB01W075EPARBWW2" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxOZXh0Q29udGludWF0aW9uVG9rZW4+MVdNR0RENFl0K0laZ2duQkNnZ0dZWHNjSUdVZDRteGo0dVBiK3VnVTdBUFNmbEJBYWR6eW9yaXcwekZiNjhPMUE8L05leHRDb250aW51YXRpb25Ub2tlbj48S2V5Q291bnQ+MjwvS2V5Q291bnQ+PE1heEtleXM+MjwvTWF4S2V5cz48SXNUcnVuY2F0ZWQ+dHJ1ZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItbGlzdC0wPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE1LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWxpc3QtMTwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNS0xMi0wMVQxOTowMDoxMy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PENoZWNrc3VtQWxnb3JpdGhtPkNSQzMyPC9DaGVja3N1bUFsZ29yaXRobT48Q2hlY2tzdW1UeXBlPkZVTExfT0JKRUNUPC9DaGVja3N1bVR5cGU+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "243c3ac869da5c81", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-list-0a?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:27:57 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "ZyGbJuSkG4UdzCyv6/azeT6N92jD8wdiuk8BweGrVvRufSEeHnJi7IVK+6Oua3ix5/MbWYV1XgU=" ], "X-Amz-Request-Id": [ "PB0FJCGA0AFEZS5W" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "31992b8bd3ec831b", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?continuation-token=1WMGDD4Yt%2BIZggnBCggGYXscIGUd4mxj4uPb%2BugU7APSflBAadzyoriw0zFb68O1A\u0026list-type=2\u0026max-keys=1000\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:57 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "7emFh3GnDfI85XLXcD2/IAI4ZRck9SkRClHFhSOsqsVCF5PonUFu9cz9mjvgn/pbEjjwEYTxxVY=" ], "X-Amz-Request-Id": [ "PB0CX8MJN6FXM82W" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxDb250aW51YXRpb25Ub2tlbj4xV01HREQ0WXQrSVpnZ25CQ2dnR1lYc2NJR1VkNG14ajR1UGIrdWdVN0FQU2ZsQkFhZHp5b3JpdzB6RmI2OE8xQTwvQ29udGludWF0aW9uVG9rZW4+PEtleUNvdW50PjE8L0tleUNvdW50PjxNYXhLZXlzPjEwMDA8L01heEtleXM+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1saXN0LTI8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTUuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "aac31a10d2d1db37", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-list-0a", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:27:57 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:27:57 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "r4VUGEvq5l5/lvLOnkqsySgr+avyIF6bImsf8b25onyf1DB9fBkB4Agl7vepgxH1H+BlDA7kl1s=" ], "X-Amz-Request-Id": [ "PB02Z17KWJ3ED2JY" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "72e358faf3f91542", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-list-0a?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:27:57 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "pUTqLlvnx0TwZ6iG0/h2fapfihtUnghSYOrFoQZPWnxc4ik6p8b/cbf6/MFtXG/hJxFr2vX+ots=" ], "X-Amz-Request-Id": [ "PB0FJX3B2M6NR6RA" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestList/by_1.replay ================================================ { "Initial": "AQAAAA7hTgz8Bj2MfQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "be752cd02f34516a", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?list-type=2\u0026max-keys=1000\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:57 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "pY16rnJlPbfX5TPC+RNBGn+Penl7cJukPGIKKViSAJQsHhN8IoBLugNawpuq5waziVnIVmt8Y2UhsHv5gWUKWefyNBXAXf+h" ], "X-Amz-Request-Id": [ "PB0ANQ37HZA20K2M" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxLZXlDb3VudD4zPC9LZXlDb3VudD48TWF4S2V5cz4xMDAwPC9NYXhLZXlzPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItbGlzdC0wPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE1LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWxpc3QtMTwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNS0xMi0wMVQxOTowMDoxMy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PENoZWNrc3VtQWxnb3JpdGhtPkNSQzMyPC9DaGVja3N1bUFsZ29yaXRobT48Q2hlY2tzdW1UeXBlPkZVTExfT0JKRUNUPC9DaGVja3N1bVR5cGU+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1saXN0LTI8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTUuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "d09d83e5ecf6b232", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?list-type=2\u0026max-keys=1\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:57 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "kjrhgC444GBV5hhjFBNDAioHqQ/b2pG5ULFwkzKfm2mLR5t9pcds94qE0xvH8LkTiKtbBKpzQcF1q2nX+h3TIS5HC12pfFhm" ], "X-Amz-Request-Id": [ "PB031784M5EG1PZ1" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxOZXh0Q29udGludWF0aW9uVG9rZW4+MVVFNDdpSkhhTmJ6S0p0c2VQcDdVRWxMZFY3anhiYjJSTG5MWU1sbmVMQXJmOHM2VVYydGROMGJrOStEM25ONnc8L05leHRDb250aW51YXRpb25Ub2tlbj48S2V5Q291bnQ+MTwvS2V5Q291bnQ+PE1heEtleXM+MTwvTWF4S2V5cz48SXNUcnVuY2F0ZWQ+dHJ1ZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItbGlzdC0wPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE1LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "c1b9bd678275897e", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?continuation-token=1UE47iJHaNbzKJtsePp7UElLdV7jxbb2RLnLYMlneLArf8s6UV2tdN0bk9%2BD3nN6w\u0026list-type=2\u0026max-keys=1\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:57 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "KBzAHsSJmPOQ5RpXRfqIU4aZzXUXqfs4r6qcmx5bp3TU+BCft1aKzON3q4h/SRVDcJXyUtolfp/TTPhvHr3Mn6kGOlFDsDsK" ], "X-Amz-Request-Id": [ "PB0E4A338JR5JBSZ" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxDb250aW51YXRpb25Ub2tlbj4xVUU0N2lKSGFOYnpLSnRzZVBwN1VFbExkVjdqeGJiMlJMbkxZTWxuZUxBcmY4czZVVjJ0ZE4wYms5K0Qzbk42dzwvQ29udGludWF0aW9uVG9rZW4+PE5leHRDb250aW51YXRpb25Ub2tlbj4xUWxLTlkySEFac2V3SkMvOGsraWJnT2Vob2hHMzNNZDFiMS9oTHRqSUhUQmNKY1k0Rm5LNzVhaEJsQzE4bmlmTjwvTmV4dENvbnRpbnVhdGlvblRva2VuPjxLZXlDb3VudD4xPC9LZXlDb3VudD48TWF4S2V5cz4xPC9NYXhLZXlzPjxJc1RydW5jYXRlZD50cnVlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1saXN0LTE8L0tleT48TGFzdE1vZGlmaWVkPjIwMjUtMTItMDFUMTk6MDA6MTMuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxDaGVja3N1bUFsZ29yaXRobT5DUkMzMjwvQ2hlY2tzdW1BbGdvcml0aG0+PENoZWNrc3VtVHlwZT5GVUxMX09CSkVDVDwvQ2hlY2tzdW1UeXBlPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "097edc14753fdfb5", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?continuation-token=1QlKNY2HAZsewJC%2F8k%2BibgOehohG33Md1b1%2FhLtjIHTBcJcY4FnK75ahBlC18nifN\u0026list-type=2\u0026max-keys=1\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:57 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "U2dO7aiwQiLOWpcdhwcaVuQtbwoAtHrthOn4TZz3X+uFUcADXR6Q/sbGBks6ZUPPjDFkLurR+J0GWi1VUFQVVVS34k9ZxjR3" ], "X-Amz-Request-Id": [ "PB05JQWN9R42FZG9" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxDb250aW51YXRpb25Ub2tlbj4xUWxLTlkySEFac2V3SkMvOGsraWJnT2Vob2hHMzNNZDFiMS9oTHRqSUhUQmNKY1k0Rm5LNzVhaEJsQzE4bmlmTjwvQ29udGludWF0aW9uVG9rZW4+PEtleUNvdW50PjE8L0tleUNvdW50PjxNYXhLZXlzPjE8L01heEtleXM+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1saXN0LTI8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTUuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestList/by_2.replay ================================================ { "Initial": "AQAAAA7hTgz8FDv03gAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "92d46edf105d7dbe", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?list-type=2\u0026max-keys=1000\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:57 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "QgPw7xnmHJCzFi+CZbOXZVfrpTqfZcfZ+wq8gORWBQ4lY/S8DWZDKSEwVa/Ha1LYVuRRaaALMY4mT3hPhkJVf3EkljkIgwCt" ], "X-Amz-Request-Id": [ "PB02A1AZA1V14C30" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxLZXlDb3VudD4zPC9LZXlDb3VudD48TWF4S2V5cz4xMDAwPC9NYXhLZXlzPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItbGlzdC0wPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE1LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWxpc3QtMTwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNS0xMi0wMVQxOTowMDoxMy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PENoZWNrc3VtQWxnb3JpdGhtPkNSQzMyPC9DaGVja3N1bUFsZ29yaXRobT48Q2hlY2tzdW1UeXBlPkZVTExfT0JKRUNUPC9DaGVja3N1bVR5cGU+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1saXN0LTI8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTUuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "1167dbd870ba1b15", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?list-type=2\u0026max-keys=2\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:57 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "+84pAn2BmPO45MG4+bfsiSs8LQSpHdN//6cB1k4GZOqc+xuJKSqMDkQAzio3l/koHYnWB0hIwjljdTU1iOCTPYVui2UI7kgU" ], "X-Amz-Request-Id": [ "PB01F87H1S9SM7HK" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxOZXh0Q29udGludWF0aW9uVG9rZW4+MXM0S09rai9MRldKVW5ZM1RzMW9yVThkT1M3OXZTbk1sTzhvbzNFcklHMHArdlh3b2F1NEw1THZzclZhbW9WSXk8L05leHRDb250aW51YXRpb25Ub2tlbj48S2V5Q291bnQ+MjwvS2V5Q291bnQ+PE1heEtleXM+MjwvTWF4S2V5cz48SXNUcnVuY2F0ZWQ+dHJ1ZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItbGlzdC0wPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE1LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWxpc3QtMTwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNS0xMi0wMVQxOTowMDoxMy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PENoZWNrc3VtQWxnb3JpdGhtPkNSQzMyPC9DaGVja3N1bUFsZ29yaXRobT48Q2hlY2tzdW1UeXBlPkZVTExfT0JKRUNUPC9DaGVja3N1bVR5cGU+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "2a1938c433f5c4d0", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?continuation-token=1s4KOkj%2FLFWJUnY3Ts1orU8dOS79vSnMlO8oo3ErIG0p%2BvXwoau4L5LvsrVamoVIy\u0026list-type=2\u0026max-keys=2\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:57 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "IRxuUYEd4AQKCtgf8A99eE5V/5OD2vkl0PsrPL/l71YaNIktVTiB94DbPS0WpkuN+3FahlpuSeXzqia1VuGO+q0tC4cL9xpc" ], "X-Amz-Request-Id": [ "PB04D0S6AZW1PXZV" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxDb250aW51YXRpb25Ub2tlbj4xczRLT2tqL0xGV0pVblkzVHMxb3JVOGRPUzc5dlNuTWxPOG9vM0VySUcwcCt2WHdvYXU0TDVMdnNyVmFtb1ZJeTwvQ29udGludWF0aW9uVG9rZW4+PEtleUNvdW50PjE8L0tleUNvdW50PjxNYXhLZXlzPjI8L01heEtleXM+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1saXN0LTI8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTUuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestList/by_3.replay ================================================ { "Initial": "AQAAAA7hTgz8HxmH/QAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "0f8c832f8b9be6d7", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?list-type=2\u0026max-keys=1000\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:57 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "ety1tzvaxp9OGIxMBTvG0Ln1Lq87aC2kX4MnSo7vzGx/tufPlufkIdJSJEBXp8htndJm2tqH7Bs=" ], "X-Amz-Request-Id": [ "PB08E2DD4HH9H11J" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxLZXlDb3VudD4zPC9LZXlDb3VudD48TWF4S2V5cz4xMDAwPC9NYXhLZXlzPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItbGlzdC0wPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE1LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWxpc3QtMTwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNS0xMi0wMVQxOTowMDoxMy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PENoZWNrc3VtQWxnb3JpdGhtPkNSQzMyPC9DaGVja3N1bUFsZ29yaXRobT48Q2hlY2tzdW1UeXBlPkZVTExfT0JKRUNUPC9DaGVja3N1bVR5cGU+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1saXN0LTI8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTUuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "86a17543e3a2bd48", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?list-type=2\u0026max-keys=3\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:57 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "N5hzPGio/dumadHtQlhpskSo2aCEVkb5rZ7dt9J1qiarfL8lVIqVpTLzAfzvJod28b/i6RhkQec=" ], "X-Amz-Request-Id": [ "PB01MRWC2T8GV16M" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxLZXlDb3VudD4zPC9LZXlDb3VudD48TWF4S2V5cz4zPC9NYXhLZXlzPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItbGlzdC0wPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE1LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWxpc3QtMTwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNS0xMi0wMVQxOTowMDoxMy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PENoZWNrc3VtQWxnb3JpdGhtPkNSQzMyPC9DaGVja3N1bUFsZ29yaXRobT48Q2hlY2tzdW1UeXBlPkZVTExfT0JKRUNUPC9DaGVja3N1bVR5cGU+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1saXN0LTI8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTUuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestList/exactly_1_object_due_to_prefix.replay ================================================ { "Initial": "AQAAAA7hTgz7MPEGrAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "cfe039d39746a8c5", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?list-type=2\u0026max-keys=1000\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:56 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "3cyEef4ZNcTsIdh1Yq1riBWuVXMeFnR003FcYKarep9enavOUoMMIQ9119rIJENqvWD5eoz56KcSCVWQ48QJ1/qphUyMqkW1" ], "X-Amz-Request-Id": [ "5WYCF24YJEF469XJ" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxLZXlDb3VudD4zPC9LZXlDb3VudD48TWF4S2V5cz4xMDAwPC9NYXhLZXlzPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItbGlzdC0wPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE1LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWxpc3QtMTwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNS0xMi0wMVQxOTowMDoxMy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PENoZWNrc3VtQWxnb3JpdGhtPkNSQzMyPC9DaGVja3N1bUFsZ29yaXRobT48Q2hlY2tzdW1UeXBlPkZVTExfT0JKRUNUPC9DaGVja3N1bVR5cGU+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1saXN0LTI8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTUuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "ec14859d49cc613b", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?list-type=2\u0026max-keys=1000\u0026prefix=blob-for-list-1", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:56 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "hKVzvxcjEyODzbIZKmEVa3HwctEg7G9BD3k5viN/O8X6L+/9datsXVAuxtaiiMDtME56kIdzJB2yG7OFTSvdu5kqNNJrAN3u" ], "X-Amz-Request-Id": [ "5WY21Z8NJ0XN2XMT" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdC0xPC9QcmVmaXg+PEtleUNvdW50PjE8L0tleUNvdW50PjxNYXhLZXlzPjEwMDA8L01heEtleXM+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1saXN0LTE8L0tleT48TGFzdE1vZGlmaWVkPjIwMjUtMTItMDFUMTk6MDA6MTMuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxDaGVja3N1bUFsZ29yaXRobT5DUkMzMjwvQ2hlY2tzdW1BbGdvcml0aG0+PENoZWNrc3VtVHlwZT5GVUxMX09CSkVDVDwvQ2hlY2tzdW1UeXBlPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestList/no_objects.replay ================================================ { "Initial": "AQAAAA7hTgz7KLlkmwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "8cc3c3594a4c9018", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?list-type=2\u0026max-keys=1000\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:56 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "CpQFxgJsA5PPEepBUAU/UazSpqC5L2KkKtceMSGJbAuHApNjrWub6xplujhgrCo3hTKqSG4phGk=" ], "X-Amz-Request-Id": [ "5WYE5JXM7PSW9R2C" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxLZXlDb3VudD4zPC9LZXlDb3VudD48TWF4S2V5cz4xMDAwPC9NYXhLZXlzPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItbGlzdC0wPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE1LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWxpc3QtMTwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNS0xMi0wMVQxOTowMDoxMy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PENoZWNrc3VtQWxnb3JpdGhtPkNSQzMyPC9DaGVja3N1bUFsZ29yaXRobT48Q2hlY2tzdW1UeXBlPkZVTExfT0JKRUNUPC9DaGVja3N1bVR5cGU+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1saXN0LTI8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTUuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "1ba4061aa03e114e", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?list-type=2\u0026max-keys=1000\u0026prefix=no-objects-with-this-prefix", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:56 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "+/Ueus/EvQ8/uwP5UzcVRAjlrSaPfwfwvkEJFhCgGKF3zfgcty3NZEmpXNVPw4XSYwh0c2kyq1s=" ], "X-Amz-Request-Id": [ "5WY8JB13G6NN0T0X" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+bm8tb2JqZWN0cy13aXRoLXRoaXMtcHJlZml4PC9QcmVmaXg+PEtleUNvdW50PjA8L0tleUNvdW50PjxNYXhLZXlzPjEwMDA8L01heEtleXM+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48L0xpc3RCdWNrZXRSZXN1bHQ+" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestList/no_pagination.replay ================================================ { "Initial": "AQAAAA7hTgz7OdDTaAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "7b10f604ad7db3a5", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?list-type=2\u0026max-keys=1000\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:57 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "64DwXfBfxtMaFHKoSUxSpnfDj9/tEqZBlWyzqe0f3v+CYjWh9B+0ZMzBsVybim2MwAsEqIjCRuzprF3Bv0LpXn4mVtSOqIbB" ], "X-Amz-Request-Id": [ "PB06044R7F5AD4M4" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxLZXlDb3VudD4zPC9LZXlDb3VudD48TWF4S2V5cz4xMDAwPC9NYXhLZXlzPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItbGlzdC0wPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE1LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWxpc3QtMTwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNS0xMi0wMVQxOTowMDoxMy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PENoZWNrc3VtQWxnb3JpdGhtPkNSQzMyPC9DaGVja3N1bUFsZ29yaXRobT48Q2hlY2tzdW1UeXBlPkZVTExfT0JKRUNUPC9DaGVja3N1bVR5cGU+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1saXN0LTI8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTUuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "fe35f21bd3f7667e", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?list-type=2\u0026max-keys=1000\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:57 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "zTN+iB+Vy8gSpLvDt/MoAQVeRclSODyS58KaYL/hu64Q1P+9BFMFfin1ShaKjzzovNQX8l8Kna9dUuUdjksRPZCFLMn1K404" ], "X-Amz-Request-Id": [ "PB0B28B0VQWHAF46" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxLZXlDb3VudD4zPC9LZXlDb3VudD48TWF4S2V5cz4xMDAwPC9NYXhLZXlzPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItbGlzdC0wPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE1LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWxpc3QtMTwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNS0xMi0wMVQxOTowMDoxMy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PENoZWNrc3VtQWxnb3JpdGhtPkNSQzMyPC9DaGVja3N1bUFsZ29yaXRobT48Q2hlY2tzdW1UeXBlPkZVTExfT0JKRUNUPC9DaGVja3N1bVR5cGU+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1saXN0LTI8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTUuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestListDelimiters/abc.replay ================================================ { "Initial": "AQAAAA7hTgz+HlaWTAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "ac5b76a052851cfb", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?list-type=2\u0026max-keys=1000\u0026prefix=blob-for-delimiters-abc", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:59 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "RJZCu7htbHqH0ypJA0UCRi99ac0fWb3Gqhp15VkXMpKyrcxvYorMAUg9wmfEmYpUMYaUgGepLF/HjGGRlBZxdXIyM76d0Dor" ], "X-Amz-Request-Id": [ "EG8VNDFWXCRAG6NE" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmM8L1ByZWZpeD48S2V5Q291bnQ+NjwvS2V5Q291bnQ+PE1heEtleXM+MTAwMDwvTWF4S2V5cz48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY2EudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE5LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY2IudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE5LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY3N1YmRpcmFiY2MudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE5LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY3N1YmRpcmFiY2QudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE5LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMmFiY2UudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI1LTEyLTAxVDE5OjAwOjE1LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48Q2hlY2tzdW1BbGdvcml0aG0+Q1JDMzI8L0NoZWNrc3VtQWxnb3JpdGhtPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZi50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTkuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "49aed2e513837144", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?list-type=2\u0026max-keys=1000\u0026prefix=blob-for-delimiters-abc", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:59 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "ipsRadTvZ/7jaJOdLynb1BIEcbBPTw7RFMJzcxpGBA86/VQ1FkBOPzDhM5ApuLSlt8Ob1vIuCEUe3fBQGnSXNJ6R0P5CXCiv" ], "X-Amz-Request-Id": [ "EG8J223HH4GVEJ5N" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmM8L1ByZWZpeD48S2V5Q291bnQ+NjwvS2V5Q291bnQ+PE1heEtleXM+MTAwMDwvTWF4S2V5cz48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY2EudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE5LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY2IudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE5LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY3N1YmRpcmFiY2MudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE5LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY3N1YmRpcmFiY2QudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE5LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMmFiY2UudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI1LTEyLTAxVDE5OjAwOjE1LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48Q2hlY2tzdW1BbGdvcml0aG0+Q1JDMzI8L0NoZWNrc3VtQWxnb3JpdGhtPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZi50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTkuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "15eb5170821fc658", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=abc\u0026list-type=2\u0026max-keys=1000\u0026prefix=blob-for-delimiters-abc", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:59 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "WWkdRKl5FC3gDdeqz7bnTyJg0HcT+YujdSy44h5Tb/19iNuN2PzvgqQkne6qHqLSC/iHsytVO5thUVXynVfchgvuqUpCApIy" ], "X-Amz-Request-Id": [ "EG8WR78PSW5VK1JS" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmM8L1ByZWZpeD48S2V5Q291bnQ+MzwvS2V5Q291bnQ+PE1heEtleXM+MTAwMDwvTWF4S2V5cz48RGVsaW1pdGVyPmFiYzwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmNmLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxOS4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmM8L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMmFiYzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "7afe50bf8fd3a0ea", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=abc\u0026list-type=2\u0026max-keys=1000\u0026prefix=blob-for-delimiters-abcdir1abc", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:59 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "AgSSvAiSJu/FYXC+PhedKkADjtKfj1Ute1Wfyk7Cpa6ZgPSZsqe/3X2rGQJfuEbpp/FaE8UN2RJv1vES1Y6qvRHIUBAQTpA+" ], "X-Amz-Request-Id": [ "EG8R5PP94QRYXMS3" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjPC9QcmVmaXg+PEtleUNvdW50PjM8L0tleUNvdW50PjxNYXhLZXlzPjEwMDA8L01heEtleXM+PERlbGltaXRlcj5hYmM8L0RlbGltaXRlcj48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY2EudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE5LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY2IudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE5LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY3N1YmRpcmFiYzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "9bc3930d3c8720ce", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=abc\u0026list-type=2\u0026max-keys=1000\u0026prefix=blob-for-delimiters-abcdir1abcsubdirabc", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:59 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "ddFDKGbKzh8n/VAVb3YV01bP8TiWWBdAkkGY1fCa4lqsShMc9on7mCaD3MzlFy9sNeowBeW8ipp1064exFsrmXtC7qiDYDUU" ], "X-Amz-Request-Id": [ "EG8P7ZFRBHXHQ68X" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjc3ViZGlyYWJjPC9QcmVmaXg+PEtleUNvdW50PjI8L0tleUNvdW50PjxNYXhLZXlzPjEwMDA8L01heEtleXM+PERlbGltaXRlcj5hYmM8L0RlbGltaXRlcj48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY3N1YmRpcmFiY2MudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE5LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY3N1YmRpcmFiY2QudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE5LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "79bd9f84bf7a7174", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=abc\u0026list-type=2\u0026max-keys=1000\u0026prefix=blob-for-delimiters-abcdir2abc", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:59 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "ekrIKhmXTispYL4w530HTic5zZum4TvGqrAEEqC+J9bdNtOAtQ2BV4YHk8n1q+gWTgBZ8Yxm9dIfllkX3tPpY46ovFxkl8SL" ], "X-Amz-Request-Id": [ "EG8SFY3Y7T2ZH1AR" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIyYWJjPC9QcmVmaXg+PEtleUNvdW50PjE8L0tleUNvdW50PjxNYXhLZXlzPjEwMDA8L01heEtleXM+PERlbGltaXRlcj5hYmM8L0RlbGltaXRlcj48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMmFiY2UudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI1LTEyLTAxVDE5OjAwOjE1LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48Q2hlY2tzdW1BbGdvcml0aG0+Q1JDMzI8L0NoZWNrc3VtQWxnb3JpdGhtPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "6a14dd2109805c42", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=abc\u0026list-type=2\u0026max-keys=1\u0026prefix=blob-for-delimiters-abc", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:59 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "Ds+3yXwESJ815E1vCamlC+wm7NVo2y8uAMiiSiScEt+gWym+Nh6jE09t9q0ydlo+Itgph/quSAuozAojcJChY5SWrbuG3o5T" ], "X-Amz-Request-Id": [ "EG8SCH19VSBWN226" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmM8L1ByZWZpeD48TmV4dENvbnRpbnVhdGlvblRva2VuPjFLUldXYzJJMk1GRmVyRnYxZHovOW9XdXBGZjJTQ2txOStGR2tVY3ArMHV2SW5Jb21zYkNESXRWOTNmWjMxSlMwc0VxY1ovcUJmUDZRME1Ca2N5VDRSZz09PC9OZXh0Q29udGludWF0aW9uVG9rZW4+PEtleUNvdW50PjE8L0tleUNvdW50PjxNYXhLZXlzPjE8L01heEtleXM+PERlbGltaXRlcj5hYmM8L0RlbGltaXRlcj48SXNUcnVuY2F0ZWQ+dHJ1ZTwvSXNUcnVuY2F0ZWQ+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjPC9QcmVmaXg+PC9Db21tb25QcmVmaXhlcz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "29276d1ce7d7591d", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?continuation-token=1KRWWc2I2MFFerFv1dz%2F9oWupFf2SCkq9%2BFGkUcp%2B0uvInIomsbCDItV93fZ31JS0sEqcZ%2FqBfP6Q0MBkcyT4Rg%3D%3D\u0026delimiter=abc\u0026list-type=2\u0026max-keys=1\u0026prefix=blob-for-delimiters-abc", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:59 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "a6eD5KP12DVOnNgLU5XYSAwO88+x/hxiUc85pmq4rI37UMLH4m1oVNO2E7ZLFCLIf+euQHjD1DPkcVvh08jvVm4xrGZ50OkP" ], "X-Amz-Request-Id": [ "EG8XQ0W66HRTMRNS" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmM8L1ByZWZpeD48Q29udGludWF0aW9uVG9rZW4+MUtSV1djMkkyTUZGZXJGdjFkei85b1d1cEZmMlNDa3E5K0ZHa1VjcCswdXZJbklvbXNiQ0RJdFY5M2ZaMzFKUzBzRXFjWi9xQmZQNlEwTUJrY3lUNFJnPT08L0NvbnRpbnVhdGlvblRva2VuPjxOZXh0Q29udGludWF0aW9uVG9rZW4+MVNMRFdTL2JnQmRidkN4cGczU0dMZ3RMZ2xEekIrV3ZMMW5tVVBUQjlBWFlzNkYvRzNIanlTZGR0R1dHZm1SOHoxcUpxTC9yWnNsV1JaRHhjcHYxTXNnPT08L05leHRDb250aW51YXRpb25Ub2tlbj48S2V5Q291bnQ+MTwvS2V5Q291bnQ+PE1heEtleXM+MTwvTWF4S2V5cz48RGVsaW1pdGVyPmFiYzwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD50cnVlPC9Jc1RydW5jYXRlZD48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjJhYmM8L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "57e84dd6f41f2200", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?continuation-token=1SLDWS%2FbgBdbvCxpg3SGLgtLglDzB%2BWvL1nmUPTB9AXYs6F%2FG3HjySddtGWGfmR8z1qJqL%2FrZslWRZDxcpv1Msg%3D%3D\u0026delimiter=abc\u0026list-type=2\u0026max-keys=1\u0026prefix=blob-for-delimiters-abc", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:59 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "znmqor32UhMUlFDcIAsvRk7Te/VgTLgXqJ3E4v1GFUJTuBsZUDKENNfBi7eiAXV1a5oB687L1ZpgrjEOXyOx7BW5Udii8GRG" ], "X-Amz-Request-Id": [ "EG8W3ZAR6ZDJWSMV" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmM8L1ByZWZpeD48Q29udGludWF0aW9uVG9rZW4+MVNMRFdTL2JnQmRidkN4cGczU0dMZ3RMZ2xEekIrV3ZMMW5tVVBUQjlBWFlzNkYvRzNIanlTZGR0R1dHZm1SOHoxcUpxTC9yWnNsV1JaRHhjcHYxTXNnPT08L0NvbnRpbnVhdGlvblRva2VuPjxLZXlDb3VudD4xPC9LZXlDb3VudD48TWF4S2V5cz4xPC9NYXhLZXlzPjxEZWxpbWl0ZXI+YWJjPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2YudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE5LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "571a3ec47b4928ed", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-delimiters-abcdir2abce.txt", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:27:59 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Mon, 01 Dec 2025 19:00:15 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "a+B36SX6TB9RoIrW7ExcvT+Ly7u6e9tztuAneIpLXzsU33HJ58i6fCmUheQjJcJx11M/G2KJoIpxrqDvCZxSf7gHGp9u5BXo" ], "X-Amz-Request-Id": [ "EG8NG4M59N46HT9D" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "eabb9395c902f988", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-delimiters-abcdir2abce.txt?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:27:59 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "49qtfK1oQB5VcIDwyjVhEL6aW4kg0pKvDQQDlZtKZXtlhs8iJG9CmrPnMQ3mOpUcNFDsTdLG3RC3BBfhUrVo9Dk+bgGkyyqp" ], "X-Amz-Request-Id": [ "EG8WA4ER20G1BNNH" ] }, "Body": "" } }, { "ID": "16ff65504f647273", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=abc\u0026list-type=2\u0026max-keys=1000\u0026prefix=blob-for-delimiters-abc", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:59 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "Dq6D1gy+f/v65Z6st7cZLeRsBjmIyzp5Min2AxMCxWrxM1iejHV2cXYwoHn6pKbQ2aymwnhpTPeUhTngX+7VB7KA0sAtGv06" ], "X-Amz-Request-Id": [ "EG8YKDAHKAN06VN6" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmM8L1ByZWZpeD48S2V5Q291bnQ+MjwvS2V5Q291bnQ+PE1heEtleXM+MTAwMDwvTWF4S2V5cz48RGVsaW1pdGVyPmFiYzwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmNmLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxOS4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmM8L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "5d4312369d7aa28f", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-delimiters-abcdir2abce.txt?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:00 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "EZqaTIaOolezy1nj+drR7lO0q6aBLHc6lQXVON3rT9y/VG1Pqr1EK2MLjeO1pppAoTVxjFFRvdWwu5+9j6USLfRz7pts9UPI" ], "X-Amz-Request-Id": [ "TA8YSHJTWKKJA5EG" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestListDelimiters/backslash.replay ================================================ { "Initial": "AQAAAA7hTgz9OpWFcgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "9115c445e65673bd", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?list-type=2\u0026max-keys=1000\u0026prefix=blob-for-delimiters-%5C", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:59 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "kvA7OK/cAMDgnr560gacJ+YBhon0kdvDaQqhsfMJKy3dRXCty9Ut9ghf2RjQWrUYl6vsNbl95LJQo571cTZia2LMGyXP1hrT" ], "X-Amz-Request-Id": [ "EG8N0C3GW3X0DJV8" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1cPC9QcmVmaXg+PEtleUNvdW50PjY8L0tleUNvdW50PjxNYXhLZXlzPjEwMDA8L01heEtleXM+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLVxkaXIxXGEudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjQxOjI3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtXGRpcjFcYi50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6NDE6MjcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy1cZGlyMVxzdWJkaXJcYy50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6NDE6MjcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy1cZGlyMVxzdWJkaXJcZC50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6NDE6MjcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy1cZGlyMlxlLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNS0xMi0wMVQxOTowMDoxNC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PENoZWNrc3VtQWxnb3JpdGhtPkNSQzMyPC9DaGVja3N1bUFsZ29yaXRobT48Q2hlY2tzdW1UeXBlPkZVTExfT0JKRUNUPC9DaGVja3N1bVR5cGU+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLVxmLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjo0MToyNy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "cd15dfb1a22f4e64", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?list-type=2\u0026max-keys=1000\u0026prefix=blob-for-delimiters-%5C", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:59 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "oxqGxBid34egy6le/F23rfnhZDnek8HNSpTK6GgoXKRkIUgSaxrZMnPfngViM+KwSYOqmckQTEA3yCMpkq2D5M5pr0D0yFKm" ], "X-Amz-Request-Id": [ "EG8P6N193WARPHH7" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1cPC9QcmVmaXg+PEtleUNvdW50PjY8L0tleUNvdW50PjxNYXhLZXlzPjEwMDA8L01heEtleXM+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLVxkaXIxXGEudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjQxOjI3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtXGRpcjFcYi50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6NDE6MjcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy1cZGlyMVxzdWJkaXJcYy50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6NDE6MjcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy1cZGlyMVxzdWJkaXJcZC50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6NDE6MjcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy1cZGlyMlxlLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNS0xMi0wMVQxOTowMDoxNC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PENoZWNrc3VtQWxnb3JpdGhtPkNSQzMyPC9DaGVja3N1bUFsZ29yaXRobT48Q2hlY2tzdW1UeXBlPkZVTExfT0JKRUNUPC9DaGVja3N1bVR5cGU+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLVxmLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjo0MToyNy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "2fcb82e21f671b71", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%5C\u0026list-type=2\u0026max-keys=1000\u0026prefix=blob-for-delimiters-%5C", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:59 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "2Tb1KLlwvbJ9+Qc7n4rLkMkCHNr1hFro6RM8Kk7UCXFPGdzQHicGE3xhqBRMzU2uIbvh+gcPQ3vvLUpe4buAaw2APAQ48ihA" ], "X-Amz-Request-Id": [ "EG8WWX433S5WX9KT" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1cPC9QcmVmaXg+PEtleUNvdW50PjM8L0tleUNvdW50PjxNYXhLZXlzPjEwMDA8L01heEtleXM+PERlbGltaXRlcj5cPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLVxmLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjo0MToyNy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLVxkaXIxXDwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1cZGlyMlw8L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "ca62fd9327c260e3", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%5C\u0026list-type=2\u0026max-keys=1000\u0026prefix=blob-for-delimiters-%5Cdir1%5C", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:59 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "l1lHcGrlNodAsQiz4hnJQ2/UhMlD8AcBsCzYtbFtreiffEq3Opif9DYxWv5bZIGLBLn01TApzGCs4EJpo0LuT9TOCZ2Gp/vq" ], "X-Amz-Request-Id": [ "EG8K1PTESV02V466" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1cZGlyMVw8L1ByZWZpeD48S2V5Q291bnQ+MzwvS2V5Q291bnQ+PE1heEtleXM+MTAwMDwvTWF4S2V5cz48RGVsaW1pdGVyPlw8L0RlbGltaXRlcj48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtXGRpcjFcYS50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6NDE6MjcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy1cZGlyMVxiLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjo0MToyNy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLVxkaXIxXHN1YmRpclw8L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "ad1c1109c11af653", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%5C\u0026list-type=2\u0026max-keys=1000\u0026prefix=blob-for-delimiters-%5Cdir1%5Csubdir%5C", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:59 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "m3wgIncll4Gp5bvFPjVs3Wl9LGkOz05Qhn78xGqMDfLU1atuMzZYtL0zaJn4dch5Bpi5ZaQjvO++jOyNsdUjaoJyXl/p71De" ], "X-Amz-Request-Id": [ "EG8VC8Y28J8G1MJ5" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1cZGlyMVxzdWJkaXJcPC9QcmVmaXg+PEtleUNvdW50PjI8L0tleUNvdW50PjxNYXhLZXlzPjEwMDA8L01heEtleXM+PERlbGltaXRlcj5cPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLVxkaXIxXHN1YmRpclxjLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjo0MToyNy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLVxkaXIxXHN1YmRpclxkLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjo0MToyNy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "35e855ecce396891", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%5C\u0026list-type=2\u0026max-keys=1000\u0026prefix=blob-for-delimiters-%5Cdir2%5C", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:59 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "r/uvqE63HZfDTbbNur3Mdyhm0HI3/oq0eb1WtyZUo1BL5XwieSR/dr81agtM/GjRJISjDF2b+l3ssVyqNWFEUVXhFIT559lY" ], "X-Amz-Request-Id": [ "EG8Z3CRMNQYBQE1Q" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1cZGlyMlw8L1ByZWZpeD48S2V5Q291bnQ+MTwvS2V5Q291bnQ+PE1heEtleXM+MTAwMDwvTWF4S2V5cz48RGVsaW1pdGVyPlw8L0RlbGltaXRlcj48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtXGRpcjJcZS50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjUtMTItMDFUMTk6MDA6MTQuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxDaGVja3N1bUFsZ29yaXRobT5DUkMzMjwvQ2hlY2tzdW1BbGdvcml0aG0+PENoZWNrc3VtVHlwZT5GVUxMX09CSkVDVDwvQ2hlY2tzdW1UeXBlPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "c37303c9c05efb47", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%5C\u0026list-type=2\u0026max-keys=1\u0026prefix=blob-for-delimiters-%5C", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:59 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "qNf+GEpEV/ZoRQyabajeuAfWAE23XsSU34UfNB+t++q4rdiykO/9liB/3KFsmxNRZ6UmHKZrrWo55ggI/u2sHOo40UJtnxIW" ], "X-Amz-Request-Id": [ "EG8WCEJ4TRTV424Y" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1cPC9QcmVmaXg+PE5leHRDb250aW51YXRpb25Ub2tlbj4xWDZzVTlMNFJnOWQ3Mjc2Q01QQlJPcWNqTC96ZmhwTEdRWVBEVEwwY2dVb1VnVHhwOFpLUWtnTWkyWXhUc21xUkkzK2xJdjR1dk1ZPTwvTmV4dENvbnRpbnVhdGlvblRva2VuPjxLZXlDb3VudD4xPC9LZXlDb3VudD48TWF4S2V5cz4xPC9NYXhLZXlzPjxEZWxpbWl0ZXI+XDwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD50cnVlPC9Jc1RydW5jYXRlZD48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLVxkaXIxXDwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "0c0c2069c22feafd", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?continuation-token=1X6sU9L4Rg9d7276CMPBROqcjL%2FzfhpLGQYPDTL0cgUoUgTxp8ZKQkgMi2YxTsmqRI3%2BlIv4uvMY%3D\u0026delimiter=%5C\u0026list-type=2\u0026max-keys=1\u0026prefix=blob-for-delimiters-%5C", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:59 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "V3wpjj89LAmPYCGW4QgchubpQlSd9lXar23d1jw0iUXjCutWmM9LGcTa+Fn5RvVDhIddE0kfZJKs0CAqj0cmYsllCqAi0Iob" ], "X-Amz-Request-Id": [ "EG8NMBDKEFH6MQKC" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1cPC9QcmVmaXg+PENvbnRpbnVhdGlvblRva2VuPjFYNnNVOUw0Umc5ZDcyNzZDTVBCUk9xY2pML3pmaHBMR1FZUERUTDBjZ1VvVWdUeHA4WktRa2dNaTJZeFRzbXFSSTMrbEl2NHV2TVk9PC9Db250aW51YXRpb25Ub2tlbj48TmV4dENvbnRpbnVhdGlvblRva2VuPjFHRWNyQlFRdE9GK3R2dkpoNEtJY0ZEQjJTY3lIeFlZOHlMRkVTQThRcjhRMjErbU8yRFhwM2ZUL2w0eHJ2NVFOMDV6YUtoUmx6RTA9PC9OZXh0Q29udGludWF0aW9uVG9rZW4+PEtleUNvdW50PjE8L0tleUNvdW50PjxNYXhLZXlzPjE8L01heEtleXM+PERlbGltaXRlcj5cPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPnRydWU8L0lzVHJ1bmNhdGVkPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRlbGltaXRlcnMtXGRpcjJcPC9QcmVmaXg+PC9Db21tb25QcmVmaXhlcz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "f8ef36826f9abb49", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?continuation-token=1GEcrBQQtOF%2BtvvJh4KIcFDB2ScyHxYY8yLFESA8Qr8Q21%2BmO2DXp3fT%2Fl4xrv5QN05zaKhRlzE0%3D\u0026delimiter=%5C\u0026list-type=2\u0026max-keys=1\u0026prefix=blob-for-delimiters-%5C", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:59 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "gu0wKfTV5iCCzNc37lY4Ai6VLf77c9nBcPLHP5I0Glatr2MjXr2Tf5QLjmdd4VQqCcTAj0L4d+alIKMXN5mMY83XI4ygFWFm" ], "X-Amz-Request-Id": [ "EG8S439KRG13SK62" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1cPC9QcmVmaXg+PENvbnRpbnVhdGlvblRva2VuPjFHRWNyQlFRdE9GK3R2dkpoNEtJY0ZEQjJTY3lIeFlZOHlMRkVTQThRcjhRMjErbU8yRFhwM2ZUL2w0eHJ2NVFOMDV6YUtoUmx6RTA9PC9Db250aW51YXRpb25Ub2tlbj48S2V5Q291bnQ+MTwvS2V5Q291bnQ+PE1heEtleXM+MTwvTWF4S2V5cz48RGVsaW1pdGVyPlw8L0RlbGltaXRlcj48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtXGYudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjQxOjI3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "84120a935d5bce17", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-delimiters-%5Cdir2%5Ce.txt", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:27:59 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Mon, 01 Dec 2025 19:00:14 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "CYsj8gtJIMYTxwSn/R9OtErgc89Zt4sneqYjdXKwn2IlfkDXmjhNKXVl3GeZ739WCJFxRIRsZeOqWxYu4ic7cFcfylIxhru5" ], "X-Amz-Request-Id": [ "EG8HFJ89Y942NP0C" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "12722b3b14f39ce5", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-delimiters-%5Cdir2%5Ce.txt?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:27:59 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "8K+1YELiJJ3qs/pzW6EQEAxM5T/Jg6z0f6e9Aae2XtsCO50zHMws3E79FeXZu/0XLJcIU32eELAG0g8K1ot6jcS03jKloJJN" ], "X-Amz-Request-Id": [ "EG8VAA2WFXS3D3ZX" ] }, "Body": "" } }, { "ID": "d2bb56cb6384bfdc", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%5C\u0026list-type=2\u0026max-keys=1000\u0026prefix=blob-for-delimiters-%5C", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:59 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "mvvn+5CwQJJ2OqKVWzQrP1wq2B/SCMQsQngl80bs/G/+fG/SdLZouLeWsHiq3eUXaPXAGDEzovmqNXLSWT7T7YVuMWhjCIUY" ], "X-Amz-Request-Id": [ "EG8N3YPREBV4T1RM" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1cPC9QcmVmaXg+PEtleUNvdW50PjI8L0tleUNvdW50PjxNYXhLZXlzPjEwMDA8L01heEtleXM+PERlbGltaXRlcj5cPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLVxmLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjo0MToyNy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLVxkaXIxXDwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "7963e49554e7ec52", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-delimiters-%5Cdir2%5Ce.txt?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:27:59 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "IsXc6+UdCwrFhn4lzcJ43Ebmrw1FI9TrCSg1DBaZAMvyKFuLM13cI9TAzZvzOsGXelKqyT27LiJ2nEsHUKl274vW9rgSTUQT" ], "X-Amz-Request-Id": [ "EG8J24P17H2NW4CC" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestListDelimiters/fwdslash.replay ================================================ { "Initial": "AQAAAA7hTgz9GHz9WQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "7c99ceea1fe69aa1", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?list-type=2\u0026max-keys=1000\u0026prefix=blob-for-delimiters-%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:58 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "vN0/9D9iYklM8I2omBQGoRBL6qhMpspkW/PIqWkWyYiRNC3g4vj+gJc0G9uoKSYqcnkIGuTnrO+AQQyN+tKBgW+C3onJar61" ], "X-Amz-Request-Id": [ "J53C0PFJQGCRW96V" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy0vPC9QcmVmaXg+PEtleUNvdW50PjY8L0tleUNvdW50PjxNYXhLZXlzPjEwMDA8L01heEtleXM+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxL2EudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtL2RpcjEvYi50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTguMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMS9zdWJkaXIvYy50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTguMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMS9zdWJkaXIvZC50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTguMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMi9lLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNS0xMi0wMVQxOTowMDoxNC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PENoZWNrc3VtQWxnb3JpdGhtPkNSQzMyPC9DaGVja3N1bUFsZ29yaXRobT48Q2hlY2tzdW1UeXBlPkZVTExfT0JKRUNUPC9DaGVja3N1bVR5cGU+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLS9mLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxOC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "85fb55d4e8000c19", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?list-type=2\u0026max-keys=1000\u0026prefix=blob-for-delimiters-%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:58 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "4JoWH3cIGAVoh8UqZnzW6CdM5/oQU3TxZOiZA20bt8mj5pnOp53pfzfUPMomCxvoW+z0YVIq/zqGCxdK88KB70yLBMQ4Gmfy" ], "X-Amz-Request-Id": [ "J538KM5WQHCYSNMY" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy0vPC9QcmVmaXg+PEtleUNvdW50PjY8L0tleUNvdW50PjxNYXhLZXlzPjEwMDA8L01heEtleXM+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxL2EudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtL2RpcjEvYi50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTguMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMS9zdWJkaXIvYy50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTguMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMS9zdWJkaXIvZC50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTguMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMi9lLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNS0xMi0wMVQxOTowMDoxNC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PENoZWNrc3VtQWxnb3JpdGhtPkNSQzMyPC9DaGVja3N1bUFsZ29yaXRobT48Q2hlY2tzdW1UeXBlPkZVTExfT0JKRUNUPC9DaGVja3N1bVR5cGU+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLS9mLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxOC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "b1d1171792e7a935", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026list-type=2\u0026max-keys=1000\u0026prefix=blob-for-delimiters-%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:58 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "Sv1Cyg6baoDU3MI9StjQDYqYwz8apHkPjcAniZ9dXLlwbR15JWY3PaWHhv9WaoFlZxzHQu3cv2zvO2egrHyJaeyzVYScBqFj" ], "X-Amz-Request-Id": [ "J534T6X44X4SZRSZ" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy0vPC9QcmVmaXg+PEtleUNvdW50PjM8L0tleUNvdW50PjxNYXhLZXlzPjEwMDA8L01heEtleXM+PERlbGltaXRlcj4vPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLS9mLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxOC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMi88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "6616324bcb9886d8", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026list-type=2\u0026max-keys=1000\u0026prefix=blob-for-delimiters-%2Fdir1%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:58 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "iZgE5LOPoPcphax5oFTWM6D4uUe9EnUjTeTqkVsSz+esh86jWCXkbjGUJv8SivBnBp5uA5Wg7Ju3LUb20wUQlddlKQnwBy1J" ], "X-Amz-Request-Id": [ "J5370E0T0J1VJX49" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMS88L1ByZWZpeD48S2V5Q291bnQ+MzwvS2V5Q291bnQ+PE1heEtleXM+MTAwMDwvTWF4S2V5cz48RGVsaW1pdGVyPi88L0RlbGltaXRlcj48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtL2RpcjEvYS50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTguMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMS9iLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxOC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxL3N1YmRpci88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "7be3cd8f085e7f23", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026list-type=2\u0026max-keys=1000\u0026prefix=blob-for-delimiters-%2Fdir1%2Fsubdir%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:58 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "kC4mJojnu5e2aoqJtiItBPZ9HYkFZWnu+TJ38iINpRrsxN33zw5R6RaPF9cm8w91xIVXxnqhn4nLQjx3CNel/rhLhFQN763m" ], "X-Amz-Request-Id": [ "J531KWQ39QYEHG0C" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMS9zdWJkaXIvPC9QcmVmaXg+PEtleUNvdW50PjI8L0tleUNvdW50PjxNYXhLZXlzPjEwMDA8L01heEtleXM+PERlbGltaXRlcj4vPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxL3N1YmRpci9jLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxOC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxL3N1YmRpci9kLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxOC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "ed847d52a12f308f", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026list-type=2\u0026max-keys=1000\u0026prefix=blob-for-delimiters-%2Fdir2%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:58 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "/YjXj5/XjFJYNQ9tou6smjzqNNg5PoJCXZFfJ+qn7iJLbpKx7bL0fk+6y1ytT4ghDFkqa6ualJ0JDcaSJHn5L5YQsKa+aEl2" ], "X-Amz-Request-Id": [ "J531VMWB220YJWA7" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMi88L1ByZWZpeD48S2V5Q291bnQ+MTwvS2V5Q291bnQ+PE1heEtleXM+MTAwMDwvTWF4S2V5cz48RGVsaW1pdGVyPi88L0RlbGltaXRlcj48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtL2RpcjIvZS50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjUtMTItMDFUMTk6MDA6MTQuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxDaGVja3N1bUFsZ29yaXRobT5DUkMzMjwvQ2hlY2tzdW1BbGdvcml0aG0+PENoZWNrc3VtVHlwZT5GVUxMX09CSkVDVDwvQ2hlY2tzdW1UeXBlPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "a50f1410a4b70446", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026list-type=2\u0026max-keys=1\u0026prefix=blob-for-delimiters-%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:58 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "uMnjh8sSD+qINeZ4odWDdcjyDJ0W/MAVoHCzm+Tj02HdNE22LlwMkADf08kOLCaz6fFcGJdyf/clOrSIaogewKnXSszNeN5p" ], "X-Amz-Request-Id": [ "J539RFEVPJ79NVPQ" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy0vPC9QcmVmaXg+PE5leHRDb250aW51YXRpb25Ub2tlbj4xMkwzVDJWK2NiZmdaUEg3TC9OcWQrVVdHSGpHNlBFZTIrWHdiNWwySGNEV2xmNlpPcXJBQit0MHAxRkI1V3MwM1BNRUJoelZVd2pJPTwvTmV4dENvbnRpbnVhdGlvblRva2VuPjxLZXlDb3VudD4xPC9LZXlDb3VudD48TWF4S2V5cz4xPC9NYXhLZXlzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD50cnVlPC9Jc1RydW5jYXRlZD48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "a7dfe0d33448f879", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?continuation-token=12L3T2V%2BcbfgZPH7L%2FNqd%2BUWGHjG6PEe2%2BXwb5l2HcDWlf6ZOqrAB%2Bt0p1FB5Ws03PMEBhzVUwjI%3D\u0026delimiter=%2F\u0026list-type=2\u0026max-keys=1\u0026prefix=blob-for-delimiters-%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:58 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "RK6mFYneq7pJ9yStzSVW3sj//pwHgmACQrhfneBdXNS/mLiUb+Q2K1cqWlqCNVrm8oMtuO3TWgJjPpRcjyu8V1EkWhacG9f2" ], "X-Amz-Request-Id": [ "J53BMM631FHD3HYP" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy0vPC9QcmVmaXg+PENvbnRpbnVhdGlvblRva2VuPjEyTDNUMlYrY2JmZ1pQSDdML05xZCtVV0dIakc2UEVlMitYd2I1bDJIY0RXbGY2Wk9xckFCK3QwcDFGQjVXczAzUE1FQmh6VlV3akk9PC9Db250aW51YXRpb25Ub2tlbj48TmV4dENvbnRpbnVhdGlvblRva2VuPjFxRklpUEZGZy9FR2JqcUpzTGRVdWliaFdGWDZtTjF2a3JmVkRpRStvYVhqQ1I5Qm9RS3A1ckVFaFVMVHgyUGdtOTV0bC9MWGNzYkk9PC9OZXh0Q29udGludWF0aW9uVG9rZW4+PEtleUNvdW50PjE8L0tleUNvdW50PjxNYXhLZXlzPjE8L01heEtleXM+PERlbGltaXRlcj4vPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPnRydWU8L0lzVHJ1bmNhdGVkPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRlbGltaXRlcnMtL2RpcjIvPC9QcmVmaXg+PC9Db21tb25QcmVmaXhlcz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "4be2233986fcadb1", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?continuation-token=1qFIiPFFg%2FEGbjqJsLdUuibhWFX6mN1vkrfVDiE%2BoaXjCR9BoQKp5rEEhULTx2Pgm95tl%2FLXcsbI%3D\u0026delimiter=%2F\u0026list-type=2\u0026max-keys=1\u0026prefix=blob-for-delimiters-%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:58 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "w/RG4vAnpwXWtv4zRJ1qzMK7E/xEMp6IQLmPh4PUJk5JBZqitxr9e18wL78GHO5MBb5QOYg0bRBa+yQqJyQHFPnH3dW6DIXT" ], "X-Amz-Request-Id": [ "J53ENESBGC42XR6Y" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy0vPC9QcmVmaXg+PENvbnRpbnVhdGlvblRva2VuPjFxRklpUEZGZy9FR2JqcUpzTGRVdWliaFdGWDZtTjF2a3JmVkRpRStvYVhqQ1I5Qm9RS3A1ckVFaFVMVHgyUGdtOTV0bC9MWGNzYkk9PC9Db250aW51YXRpb25Ub2tlbj48S2V5Q291bnQ+MTwvS2V5Q291bnQ+PE1heEtleXM+MTwvTWF4S2V5cz48RGVsaW1pdGVyPi88L0RlbGltaXRlcj48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtL2YudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "265fa96698c05d2a", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-delimiters-/dir2/e.txt", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:27:58 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Mon, 01 Dec 2025 19:00:14 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Q3NFEB8s+GL2avNYWnVnvt0CzPS5jMd5BkiAM1IrTO1pUEm/4Jm4CO/t1DEeAvKI6UNQn2qWS8LSuSbW1TdhPCEc8iRXKwY1" ], "X-Amz-Request-Id": [ "J53A557NJPHJBJZ1" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "03ef43ac8522d5f2", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-delimiters-/dir2/e.txt?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:27:58 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "rSjuKJmQKo67aJrFjnPIY60EP7bj2ecDJPmr2HQFXA7JBYUsdimPflVjz2gpk++8E+tt7ImzjTLD8zvNFpEHLCP5o5L9CdLt" ], "X-Amz-Request-Id": [ "J530PZ49QJNTKR89" ] }, "Body": "" } }, { "ID": "698665c07b4ca4d3", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026list-type=2\u0026max-keys=1000\u0026prefix=blob-for-delimiters-%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:58 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "PD/KUD2PD/TQ3KGf5HRvViM+E71mMo+GsbfrNCrpmJUrZpam04cK3JclJGEsbUjyNm6nazx0pbcmeN+rRzBgrlajMbN6VNVe" ], "X-Amz-Request-Id": [ "J535EYZT1DBD9FZV" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy0vPC9QcmVmaXg+PEtleUNvdW50PjI8L0tleUNvdW50PjxNYXhLZXlzPjEwMDA8L01heEtleXM+PERlbGltaXRlcj4vPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLS9mLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxOC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "21e39883d2fcb1ce", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-delimiters-/dir2/e.txt?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:27:58 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "rU+0Or1QlVsTFasdI7Hz9bm082McKJ/lyWbCYDNLOgOma8rQ3roK4CiebKrrOToUTVn7nZAc9kKLH9pCnO0WTOGDY+V/urDQ" ], "X-Amz-Request-Id": [ "J53A3TMH7Z5AZXP9" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestListWeirdKeys.replay ================================================ { "Initial": "AQAAAA7hTgz9D/EzugAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "feb56a989cae4127", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?list-type=2\u0026max-keys=1000\u0026prefix=list-weirdkeys-", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:58 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "fPoywA+IfMFXIf5hSekXh1w17Xd7vBiAKfuqA7bOLkivqFeI86XnAOUQAotdlnY3vtSPTMNc/Sg=" ], "X-Amz-Request-Id": [ "J534XBZYBC182E5X" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+bGlzdC13ZWlyZGtleXMtPC9QcmVmaXg+PEtleUNvdW50PjE4PC9LZXlDb3VudD48TWF4S2V5cz4xMDAwPC9NYXhLZXlzPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+bGlzdC13ZWlyZGtleXMtICEmcXVvdDsjJCUmYW1wOyZhcG9zOygpKissLS4vPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5Pmxpc3Qtd2VpcmRrZXlzLS4uX18weDJmX19mb28vLi5fXzB4MmZfX2Jhci8uLl9fMHgyZl9fLi5fXzB4MmZfX2Jhei4uX18weDJmX188L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+bGlzdC13ZWlyZGtleXMtLi5fXzB4NWNfX2Zvb19fMHg1Y19fLi5fXzB4NWNfX2Jhcl9fMHg1Y19fLi5fXzB4NWNfXy4uX18weDVjX19iYXouLl9fMHg1Y19fPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5Pmxpc3Qtd2VpcmRrZXlzLS4uX18weDVjX19mb29fXzB4NWNfX19fMHg1Y19fYmFyX18weDVjX19fXzB4NWNfX19fMHg1Y19fYmF6PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5Pmxpc3Qtd2VpcmRrZXlzLTEyMzQ1PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5Pmxpc3Qtd2VpcmRrZXlzLTo7Jmx0Oz0mZ3Q7PzwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxNy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5saXN0LXdlaXJka2V5cy1APC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5Pmxpc3Qtd2VpcmRrZXlzLVtfXzB4NWNfX11eXzwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxNy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5saXN0LXdlaXJka2V5cy1fXzB4MF9fX18weDFfX19fMHgyX19fXzB4M19fX18weDRfX19fMHg1X19fXzB4Nl9fX18weDdfX19fMHg4X19fXzB4OV9fX18weGFfX19fMHhiX19fXzB4Y19fX18weGRfX19fMHhlX19fXzB4Zl9fPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5Pmxpc3Qtd2VpcmRrZXlzLV9fMHgxMF9fX18weDExX19fXzB4MTJfX19fMHgxM19fX18weDE0X19fXzB4MTVfX19fMHgxNl9fX18weDE3X19fXzB4MThfX19fMHgxOV9fX18weDFhX19fXzB4MWJfX19fMHgxY19fX18weDFkX19fXzB4MWVfX19fMHgxZl9fPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5Pmxpc3Qtd2VpcmRrZXlzLWA8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+bGlzdC13ZWlyZGtleXMtZm9vIGJhciBiYXo8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+bGlzdC13ZWlyZGtleXMtZm9vJnF1b3Q7YmFyJnF1b3Q7YmF6PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5Pmxpc3Qtd2VpcmRrZXlzLWZvby8vYmFyLy8vYmF6PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM5OjAxLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5Pmxpc3Qtd2VpcmRrZXlzLWZvby9iYXIvYmF6PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjQwLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5Pmxpc3Qtd2VpcmRrZXlzLWZvb19fMHg1Y19fYmFyX18weDVjX19iYXo8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+bGlzdC13ZWlyZGtleXMte3x9fn88L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+bGlzdC13ZWlyZGtleXMt4pi64pi64pi6PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "d181eba2381d178e", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?list-type=2\u0026max-keys=1000\u0026prefix=list-weirdkeys-", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:58 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "ylruVI6X+EJ+Zjkc4dWCiyE1hBtt1dHThgObEBxWLwhbL9hPEOo3AcqdamB1SM0kN9Iur06HlJ8=" ], "X-Amz-Request-Id": [ "J53CMGA0M490TPSV" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+bGlzdC13ZWlyZGtleXMtPC9QcmVmaXg+PEtleUNvdW50PjE4PC9LZXlDb3VudD48TWF4S2V5cz4xMDAwPC9NYXhLZXlzPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+bGlzdC13ZWlyZGtleXMtICEmcXVvdDsjJCUmYW1wOyZhcG9zOygpKissLS4vPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5Pmxpc3Qtd2VpcmRrZXlzLS4uX18weDJmX19mb28vLi5fXzB4MmZfX2Jhci8uLl9fMHgyZl9fLi5fXzB4MmZfX2Jhei4uX18weDJmX188L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+bGlzdC13ZWlyZGtleXMtLi5fXzB4NWNfX2Zvb19fMHg1Y19fLi5fXzB4NWNfX2Jhcl9fMHg1Y19fLi5fXzB4NWNfXy4uX18weDVjX19iYXouLl9fMHg1Y19fPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5Pmxpc3Qtd2VpcmRrZXlzLS4uX18weDVjX19mb29fXzB4NWNfX19fMHg1Y19fYmFyX18weDVjX19fXzB4NWNfX19fMHg1Y19fYmF6PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5Pmxpc3Qtd2VpcmRrZXlzLTEyMzQ1PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5Pmxpc3Qtd2VpcmRrZXlzLTo7Jmx0Oz0mZ3Q7PzwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxNy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5saXN0LXdlaXJka2V5cy1APC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5Pmxpc3Qtd2VpcmRrZXlzLVtfXzB4NWNfX11eXzwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxNy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5saXN0LXdlaXJka2V5cy1fXzB4MF9fX18weDFfX19fMHgyX19fXzB4M19fX18weDRfX19fMHg1X19fXzB4Nl9fX18weDdfX19fMHg4X19fXzB4OV9fX18weGFfX19fMHhiX19fXzB4Y19fX18weGRfX19fMHhlX19fXzB4Zl9fPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5Pmxpc3Qtd2VpcmRrZXlzLV9fMHgxMF9fX18weDExX19fXzB4MTJfX19fMHgxM19fX18weDE0X19fXzB4MTVfX19fMHgxNl9fX18weDE3X19fXzB4MThfX19fMHgxOV9fX18weDFhX19fXzB4MWJfX19fMHgxY19fX18weDFkX19fXzB4MWVfX19fMHgxZl9fPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5Pmxpc3Qtd2VpcmRrZXlzLWA8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+bGlzdC13ZWlyZGtleXMtZm9vIGJhciBiYXo8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+bGlzdC13ZWlyZGtleXMtZm9vJnF1b3Q7YmFyJnF1b3Q7YmF6PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5Pmxpc3Qtd2VpcmRrZXlzLWZvby8vYmFyLy8vYmF6PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM5OjAxLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5Pmxpc3Qtd2VpcmRrZXlzLWZvby9iYXIvYmF6PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjQwLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5Pmxpc3Qtd2VpcmRrZXlzLWZvb19fMHg1Y19fYmFyX18weDVjX19iYXo8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+bGlzdC13ZWlyZGtleXMte3x9fn88L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+bGlzdC13ZWlyZGtleXMt4pi64pi64pi6PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestMD5.replay ================================================ { "Initial": "AQAAAA7hTg0JKQJGYwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "8851ea99613e2395", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-md5-aaa?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:10 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "NvyBYG+QSFl/MzuwuyRDGLpTf42bw/q3NmW/RQqXwkDdk3lO6GeExqtF8Ok2C8X6xBjTKrgJIbNSY9tQIdUOS0xTBugfFbqZ" ], "X-Amz-Request-Id": [ "2XE1MKRQJ9XP1XGD" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "8e2e1e2662aa98ba", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-md5-bbb?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "48" ], "Content-Md5": [ "afqrYmg1ApVVDefVh7wyPQ==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "7" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "Nw0KZ29vZGJ5ZQ0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6RFkvWWRBPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:10 GMT" ], "Etag": [ "\"69faab6268350295550de7d587bc323d\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "DY/YdA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "e87/jxUYtsam0Q2aHceomBatHbx7SsVv9NvH5LJBGZ9Z8tQRvkDUJGrTS41kZ2vdMkoKShTB3eFIy8g5KNgK5e96tNG8Sbx9" ], "X-Amz-Request-Id": [ "2XE139P6712RHZ8R" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "244f64a136281285", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-md5-aaa", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:10 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:10 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "LR7GbYQIRbih77j+iJwciSdxiCpY37W5APSlY7OupkoFiA4UTJJEbZKSZG9/zFe195xlADSxth3KCnY3GNuYKvYf51ixiWtO" ], "X-Amz-Request-Id": [ "2XEFBQVJEKH27FJZ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "b691a3e212393480", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-md5-bbb", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "7" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:10 GMT" ], "Etag": [ "\"69faab6268350295550de7d587bc323d\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:10 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "/rSc4bK4ic7ybFd8PIMVA7i9HcWllXc/3hQW48AHekYNiFtR3dgMQxB219GNgH7tZ7/yQ7OZDJc6r0MGyibeOuN/heLw6q4e" ], "X-Amz-Request-Id": [ "2XE9G8T7ZQJC1BVF" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "bc5ba9b0ca0dd4a2", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?list-type=2\u0026max-keys=1000\u0026prefix=blob-for-md5-", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:10 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "rI1Rlp1hw0oj5vWqNCoThTLypgTxNe+TNaAV+kwTy7lG39jSYzgbDKv7ozJp5Q/IF2W/3QP+S1EjDCCU7a2Re0BF2bk9klok" ], "X-Amz-Request-Id": [ "2XE2ZX4NRKVFEB2J" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbWQ1LTwvUHJlZml4PjxLZXlDb3VudD4yPC9LZXlDb3VudD48TWF4S2V5cz4xMDAwPC9NYXhLZXlzPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItbWQ1LWFhYTwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNi0wMy0xOVQxNToyODoxMC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PENoZWNrc3VtQWxnb3JpdGhtPkNSQzMyPC9DaGVja3N1bUFsZ29yaXRobT48Q2hlY2tzdW1UeXBlPkZVTExfT0JKRUNUPC9DaGVja3N1bVR5cGU+PFNpemU+NTwvU2l6ZT48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1tZDUtYmJiPC9LZXk+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjEwLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs2OWZhYWI2MjY4MzUwMjk1NTUwZGU3ZDU4N2JjMzIzZCZxdW90OzwvRVRhZz48Q2hlY2tzdW1BbGdvcml0aG0+Q1JDMzI8L0NoZWNrc3VtQWxnb3JpdGhtPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48U2l6ZT43PC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "dbf1ca5663a10282", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-md5-bbb", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "7" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:10 GMT" ], "Etag": [ "\"69faab6268350295550de7d587bc323d\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:10 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "1PyQblI0yCPsu75GcboC29y5xA/JzsahOQs3whVIAZddiiH2HxStWR36v64BqLvrzcuwIx+4MJGof2BR2+nnkgVfFzSmZdxg" ], "X-Amz-Request-Id": [ "2XE4BJSBNQ95NVCW" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "6df0cd0d4865f0a8", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-md5-bbb?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:10 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "592IfY4BZzlV/w7G14eOROSlRyv7jQXvKDN94Hygy9dvEFBdnJMvJ5t7ekRXOfaiOEhMQjgA6+xbWOKyeCPMrUaakl3nYdXh" ], "X-Amz-Request-Id": [ "2XE0SGS73RD1C8JX" ] }, "Body": "" } }, { "ID": "32efa3f97635b1fb", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-md5-aaa", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:11 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:10 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Bp2DS39U/il9I/DUwJaqPxsAkrRJCGikPTZvKvDo7YSz1iPlYnQCYVH0f+RjpSkbl0Wi7p1hcqBlAmCmd3LWuh5FlPsm8zuW" ], "X-Amz-Request-Id": [ "91V7699JQXGPM2TT" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "d9ff5047a70e6dad", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-md5-aaa?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:11 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "s7eu8XGw9UaekHXLZi5IuL2DLOrFIxnly5EKiX4WqxxKEKGCjmXBRomqdQ5k6Jb5ly4P3e2QvfJUg5+qIUI+qjaF8SYNuUyf" ], "X-Amz-Request-Id": [ "91VAYAP8YSDF9RCP" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestMetadata/duplicate_case-insensitive_key_fails.replay ================================================ { "Initial": "AQAAAA7hTg0IKC35EgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": null } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestMetadata/empty.replay ================================================ { "Initial": "AQAAAA7hTg0IGlsLmAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "7e597a3d14aaa6e9", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:09 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "01vXuboxwHfyTw5K6M6Kz2siDtBbOFSP9tXRoAkcV7543d3L54e4/L4JmkvH8Y0k7ZOMZXHuPmg=" ], "X-Amz-Request-Id": [ "1M996GV20M0V7338" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "c9fa6d68b185793f", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:09 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:09 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "goKfu1jZ/0FQmm7TSBr+e4nezAjH1OQHQxW08NtEkTs17cpTHrx972NmeqAPaLEh9Ol1iBEpBqo=" ], "X-Amz-Request-Id": [ "1M9FQK5G364CR8HJ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "29ed30edda5dc76f", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:09 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:09 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "ss8JVPTcrHdYzJI+xd5YHsOK05SWkvEDk3YigIQQywzOe4Y07UxthEeQz7Ij+rTcnUwMHSoSUCI=" ], "X-Amz-Request-Id": [ "1M95TAMMKZQAZRYW" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "4053a3bc85b2d58c", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:09 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "1h4Hw6OSzyAHk7U2jIrH8QczvzT2MOlO3fPwRlqu2Xd0hfgAA9UpbMmx3iYxPLbscb5SkVp9WCA=" ], "X-Amz-Request-Id": [ "1M97DJV6AQJ61543" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestMetadata/empty_key_fails.replay ================================================ { "Initial": "AQAAAA7hTg0IKB1kxgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": null } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestMetadata/non-utf8_metadata_key.replay ================================================ { "Initial": "AQAAAA7hTg0JKOjc4AAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": null } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestMetadata/non-utf8_metadata_value.replay ================================================ { "Initial": "AQAAAA7hTg0JKPZeLwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": null } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestMetadata/valid_metadata.replay ================================================ { "Initial": "AQAAAA7hTg0IKDpeMgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "23061af26cbf8ea7", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Meta-Key_a": [ "value-a" ], "X-Amz-Meta-Key_b": [ "value-b" ], "X-Amz-Meta-Key_c": [ "vAlUe-c" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:09 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "PpreET3+qrt3rbOWvfaG191/LyIXZBOeolPn426k8G+wYcNloAa1a6BYctn7XJ8nwDuXHUUoD5vIB8le3Hjf3IMNJSuXQ6Q9" ], "X-Amz-Request-Id": [ "1M9EGSEVEF1QZFVJ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "68054aff2b26df67", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:09 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:09 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "n1ekgbK99wIiVCiQNOH00KWqp2bvZm5rWPpBmUzLvK9O6WhDxyaE4RkK4vW4cfVWieC6vp08tRjzxA1MpKdtNWUCqHqb/+ru" ], "X-Amz-Meta-Key_a": [ "value-a" ], "X-Amz-Meta-Key_b": [ "value-b" ], "X-Amz-Meta-Key_c": [ "vAlUe-c" ], "X-Amz-Request-Id": [ "1M9AWB8BQVQ23CK5" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "45c4c6678ad78e54", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:09 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:09 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Uu60NlfSpjFPO0WFZiFiUw3p0bLj72HQP1h4Qsz3JP0yRmrinr3OJ8rHo6xFl/K9/lSPI6gnQtF7IkDDOPFlpUOVBxKot+vX" ], "X-Amz-Meta-Key_a": [ "value-a" ], "X-Amz-Meta-Key_b": [ "value-b" ], "X-Amz-Meta-Key_c": [ "vAlUe-c" ], "X-Amz-Request-Id": [ "1M99J22Q9V03PGN3" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "730d2fbaad4d9844", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:09 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "sR3qhaBFGrGcjmlQPnznMUXL07NZZWo0hkaIKg2QlkemGnIMJbfcdi2BU4ZIcqb/ctJ0ELOVN209ASmpi3rmPDMydQXklym0" ], "X-Amz-Request-Id": [ "1M9DZCEAQ629N817" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestMetadata/valid_metadata_with_content_type.replay ================================================ { "Initial": "AQAAAA7hTg0JBeWDNwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "b20543dae740e567", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Meta-Foo": [ "bar" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:10 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "alUQt4e89YydNAu93j1knZ+s96MPtLCNuLXn7G7pMrVsKAE4jqpmDq+/LLqhHMg0bES06c1tC9A=" ], "X-Amz-Request-Id": [ "2XEB58KFH80DG1DY" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "2d2eee4fabddef9e", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 19 Mar 2026 15:28:10 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:10 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "8L8kInH2mnZLvaWiSLW1zL6PcL3LuiP4V3a1G+wpu5LWHs2zhgC5qx4FEcnjFU2w56sr3WVc1ck=" ], "X-Amz-Meta-Foo": [ "bar" ], "X-Amz-Request-Id": [ "2XE25CSG6V2VNA0Z" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "0476ba9697fab91c", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 19 Mar 2026 15:28:10 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:10 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "eMx0XKtG9VjF1BQ2icK0LPxDi2EmqWrNqubEpaKVMyXaoX6NlZLgmZEQWAUW0CzbHeBuMusA8WY=" ], "X-Amz-Meta-Foo": [ "bar" ], "X-Amz-Request-Id": [ "2XE5MKYFV98KB8MC" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "c64bab1c8efaf8d6", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:10 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "U1fHqutpyopBBQoBauBIIBUghkU7wJLDxLIVTIbyuq3PO0SpmsP1tWt5bisWauMCMSKunGovZ0s=" ], "X-Amz-Request-Id": [ "2XEETK8N3268N7V4" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestMetadata/valid_metadata_with_empty_body.replay ================================================ { "Initial": "AQAAAA7hTg0INNMypQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "a9ea4547526135da", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Meta-Foo": [ "bar" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:09 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "2e3zBmhZlIFSakGMTsaOxWu1YBjrkGWcDIXvhJnxv+/ZotYn++YSxkkoJh4UdkO6r4fl09gT82IAzmICWPCFjlnBP9hwlQgC" ], "X-Amz-Request-Id": [ "1M9C4C1ZTYTDYQ24" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "c88d02fa91d9ccea", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:10 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:09 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "g9tj3MqTlqIjlPZtpnnr8ZjRy+4Ih+hT9Mio8fComHZgoLvWSCqHtFXkd90xcsOFbRwAxeukJyfnOcAmV2lJ6l705jvSHURp" ], "X-Amz-Meta-Foo": [ "bar" ], "X-Amz-Request-Id": [ "2XE69FJDRY7BMWDC" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "b2b141fa5b069482", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:10 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:09 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "TXq/bMm/2L/GYwEh6h9DBcjJ7NW9GduzaovT0HFaMW6P2WEJLLEn4z9qFNDxP5Vevc/v6xs6pYKTBrXEv4jgkTAWQG4guE0k" ], "X-Amz-Meta-Foo": [ "bar" ], "X-Amz-Request-Id": [ "2XE64JJ8YB1NHD0Q" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "411365bbfbdfd076", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:10 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "NJeJK9OV651XqGKg9Trj9Joq+54FAkYsuWTWyy+YgPpUntCuSbdJumDwIUyke1CIgPl0JRAMFI6j0Jvjgj22uNdTEoQ03nY3" ], "X-Amz-Request-Id": [ "2XE262BAZDA6YEAH" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestMetadata/weird_metadata_keys.replay ================================================ { "Initial": "AQAAAA7hTg0JGhlFcQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "ed436725ff7dec4e", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Meta-%00%01%02%03%04%05%06%07%08%09%0a%0b%0c%0d%0e%0f": [ "%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F" ], "X-Amz-Meta-%10%11%12%13%14%15%16%17%18%19%1a%1b%1c%1d%1e%1f": [ "%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F" ], "X-Amz-Meta-%20%21%22%23$%25\u0026%27%28%29%2a+%2c-.%2f": [ "%20%21%22%23$%25\u0026%27%28%29%2A+%2C-.%2F" ], "X-Amz-Meta-%5b%5c%5d%5e_": [ "%5B%5C%5D%5E_" ], "X-Amz-Meta-%60": [ "%60" ], "X-Amz-Meta-%7b%7c%7d~%7f": [ "%7B%7C%7D~%7F" ], "X-Amz-Meta-%e2%98%ba%e2%98%ba%e2%98%ba": [ "%E2%98%BA%E2%98%BA%E2%98%BA" ], "X-Amz-Meta-..%2ffoo%2f..%2fbar%2f..%2f..%2fbaz..%2f": [ "..%2Ffoo%2F..%2Fbar%2F..%2F..%2Fbaz..%2F" ], "X-Amz-Meta-..%5cfoo%5c%5cbar%5c%5c%5cbaz": [ "..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz" ], "X-Amz-Meta-..%5cfoo%5c..%5cbar%5c..%5c..%5cbaz..%5c": [ "..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C" ], "X-Amz-Meta-12345": [ "12345" ], "X-Amz-Meta-Foo%20bar%20baz": [ "foo%20bar%20baz" ], "X-Amz-Meta-Foo%22bar%22baz": [ "foo%22bar%22baz" ], "X-Amz-Meta-Foo%2f%2fbar%2f%2f%2fbaz": [ "foo%2F%2Fbar%2F%2F%2Fbaz" ], "X-Amz-Meta-Foo%2fbar%2fbaz": [ "foo%2Fbar%2Fbaz" ], "X-Amz-Meta-Foo%5cbar%5cbaz": [ "foo%5Cbar%5Cbaz" ], "X-Amz-Meta-__0x3a__%3b%3c__0x3d__%3e%3f": [ ":%3B%3C=%3E%3F" ], "X-Amz-Meta-__0x40__": [ "@" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:10 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "qtD+15nT3W+DbKKEhewX8xYDJLS1sVqmYQjG4OPmTpPwLsCuoJ86dC8In4h5VtOi+KMmKZxIyYs=" ], "X-Amz-Request-Id": [ "2XEBGGENWPTACDFZ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "70f5cd6af9194643", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:10 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:10 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "sWF9H3cExhbh24HuRia13/r+U0bnjMxinYmrgJx25oebEa+OjP5ojh4JMOP5ijkflCVaQLry0pg=" ], "X-Amz-Meta-%00%01%02%03%04%05%06%07%08%09%0a%0b%0c%0d%0e%0f": [ "%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F" ], "X-Amz-Meta-%10%11%12%13%14%15%16%17%18%19%1a%1b%1c%1d%1e%1f": [ "%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F" ], "X-Amz-Meta-%20%21%22%23$%25\u0026%27%28%29%2a+%2c-.%2f": [ "%20%21%22%23$%25\u0026%27%28%29%2A+%2C-.%2F" ], "X-Amz-Meta-%5b%5c%5d%5e_": [ "%5B%5C%5D%5E_" ], "X-Amz-Meta-%60": [ "%60" ], "X-Amz-Meta-%7b%7c%7d~%7f": [ "%7B%7C%7D~%7F" ], "X-Amz-Meta-%e2%98%ba%e2%98%ba%e2%98%ba": [ "%E2%98%BA%E2%98%BA%E2%98%BA" ], "X-Amz-Meta-..%2ffoo%2f..%2fbar%2f..%2f..%2fbaz..%2f": [ "..%2Ffoo%2F..%2Fbar%2F..%2F..%2Fbaz..%2F" ], "X-Amz-Meta-..%5cfoo%5c%5cbar%5c%5c%5cbaz": [ "..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz" ], "X-Amz-Meta-..%5cfoo%5c..%5cbar%5c..%5c..%5cbaz..%5c": [ "..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C" ], "X-Amz-Meta-12345": [ "12345" ], "X-Amz-Meta-Foo%20bar%20baz": [ "foo%20bar%20baz" ], "X-Amz-Meta-Foo%22bar%22baz": [ "foo%22bar%22baz" ], "X-Amz-Meta-Foo%2f%2fbar%2f%2f%2fbaz": [ "foo%2F%2Fbar%2F%2F%2Fbaz" ], "X-Amz-Meta-Foo%2fbar%2fbaz": [ "foo%2Fbar%2Fbaz" ], "X-Amz-Meta-Foo%5cbar%5cbaz": [ "foo%5Cbar%5Cbaz" ], "X-Amz-Meta-__0x3a__%3b%3c__0x3d__%3e%3f": [ ":%3B%3C=%3E%3F" ], "X-Amz-Meta-__0x40__": [ "@" ], "X-Amz-Request-Id": [ "2XE8Q5KE5CJVA37V" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "05d7f5c92e326ca1", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:10 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:10 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "IYFXriwuLg2FMfZqTlXuAoS/Cm5NavzTfIYjFoFktGdeT0MJqO744sLnoTPQiuJo5QvN3PH56oQ=" ], "X-Amz-Meta-%00%01%02%03%04%05%06%07%08%09%0a%0b%0c%0d%0e%0f": [ "%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F" ], "X-Amz-Meta-%10%11%12%13%14%15%16%17%18%19%1a%1b%1c%1d%1e%1f": [ "%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F" ], "X-Amz-Meta-%20%21%22%23$%25\u0026%27%28%29%2a+%2c-.%2f": [ "%20%21%22%23$%25\u0026%27%28%29%2A+%2C-.%2F" ], "X-Amz-Meta-%5b%5c%5d%5e_": [ "%5B%5C%5D%5E_" ], "X-Amz-Meta-%60": [ "%60" ], "X-Amz-Meta-%7b%7c%7d~%7f": [ "%7B%7C%7D~%7F" ], "X-Amz-Meta-%e2%98%ba%e2%98%ba%e2%98%ba": [ "%E2%98%BA%E2%98%BA%E2%98%BA" ], "X-Amz-Meta-..%2ffoo%2f..%2fbar%2f..%2f..%2fbaz..%2f": [ "..%2Ffoo%2F..%2Fbar%2F..%2F..%2Fbaz..%2F" ], "X-Amz-Meta-..%5cfoo%5c%5cbar%5c%5c%5cbaz": [ "..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz" ], "X-Amz-Meta-..%5cfoo%5c..%5cbar%5c..%5c..%5cbaz..%5c": [ "..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C" ], "X-Amz-Meta-12345": [ "12345" ], "X-Amz-Meta-Foo%20bar%20baz": [ "foo%20bar%20baz" ], "X-Amz-Meta-Foo%22bar%22baz": [ "foo%22bar%22baz" ], "X-Amz-Meta-Foo%2f%2fbar%2f%2f%2fbaz": [ "foo%2F%2Fbar%2F%2F%2Fbaz" ], "X-Amz-Meta-Foo%2fbar%2fbaz": [ "foo%2Fbar%2Fbaz" ], "X-Amz-Meta-Foo%5cbar%5cbaz": [ "foo%5Cbar%5Cbaz" ], "X-Amz-Meta-__0x3a__%3b%3c__0x3d__%3e%3f": [ ":%3B%3C=%3E%3F" ], "X-Amz-Meta-__0x40__": [ "@" ], "X-Amz-Request-Id": [ "2XE4BGGPRSC4RVMH" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "739ced132767b85c", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:10 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "nqW93toRVzb0jW+2x3esgdWdEVWX5T0G+UxQkGNweQ4WmNWNTMGy1FwxEr2iHJdmrAEilCrOw3Q=" ], "X-Amz-Request-Id": [ "2XEE93S52QPAK599" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestNonexistentBucket.replay ================================================ { "Initial": "AQAAAA7hTgz7CN6TkQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "fdc0aeedfd3d4b02", "Request": { "Method": "GET", "URL": "https://go-cdk-bucket-does-not-exist.s3.us-west-1.amazonaws.com/?list-type=2\u0026max-keys=1", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:54 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "eVg5LVORRu+L5FC3Q5721JqmpEPaa1qFCCTGTBrtTBHWAKwfU9dNHu1t2h/YMjdNsnO5PujTGhs=" ], "X-Amz-Request-Id": [ "5WY71E7KZGCFEE7Q" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPk5vU3VjaEJ1Y2tldDwvQ29kZT48TWVzc2FnZT5UaGUgc3BlY2lmaWVkIGJ1Y2tldCBkb2VzIG5vdCBleGlzdDwvTWVzc2FnZT48QnVja2V0TmFtZT5nby1jZGstYnVja2V0LWRvZXMtbm90LWV4aXN0PC9CdWNrZXROYW1lPjxSZXF1ZXN0SWQ+NVdZNzFFN0taR0NGRUU3UTwvUmVxdWVzdElkPjxIb3N0SWQ+ZVZnNUxWT1JSdStMNUZDM1E1NzIxSnFtcEVQYWExcUZDQ1RHVEJydFRCSFdBS3dmVTlkTkh1MXQyaC9ZTWpkTnNuTzVQdWpUR2hzPTwvSG9zdElkPjwvRXJyb3I+" } }, { "ID": "c1e871c5d5d5c0c7", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?list-type=2\u0026max-keys=1", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:27:56 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "KImgUoSQut2Ky6HJRBea12pXK7VEkF175SSnS7ZjdpPkeRcbmhYE6AtgMN7nUBV2Bo2UnoS3gos=" ], "X-Amz-Request-Id": [ "5WY0WQ83HN6946AZ" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+PC9QcmVmaXg+PE5leHRDb250aW51YXRpb25Ub2tlbj4xeURyUUdsdjB5bnFXUWtXcTNLNURpbHAvVUVzemFaZmU1QXdZdEFrYmh5MXcycW81U0M5RWVkN1FVcE5LcnRxQm9helgrMUc4UXN6enZWRHNZVmNsb1E9PTwvTmV4dENvbnRpbnVhdGlvblRva2VuPjxLZXlDb3VudD4xPC9LZXlDb3VudD48TWF4S2V5cz4xPC9NYXhLZXlzPjxJc1RydW5jYXRlZD50cnVlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1jb3B5aW5nLWRlc3Q8L0tleT48TGFzdE1vZGlmaWVkPjIwMjUtMTItMDFUMTk6MDA6MjQuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90O2IxMGE4ZGIxNjRlMDc1NDEwNWI3YTk5YmU3MmUzZmU1JnF1b3Q7PC9FVGFnPjxDaGVja3N1bUFsZ29yaXRobT5DUkMzMjwvQ2hlY2tzdW1BbGdvcml0aG0+PENoZWNrc3VtVHlwZT5GVUxMX09CSkVDVDwvQ2hlY2tzdW1UeXBlPjxTaXplPjExPC9TaXplPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestRead/length_0_read.replay ================================================ { "Initial": "AQAAAA7hTg0AD9ue/AAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "8717f8afe384f27d", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "69" ], "Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "27" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "MWINCmFiY2RlZmdoaWprbG1ub3BxdXJzdHV2d3h5eg0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6UnlQZzVRPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:01 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "RyPg5Q==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "6DGrztgOst7HViP57EPqBHy0fs5yT5tj7UVQGKBwGdqMc8wxDYVQJS2UQKQqDJPg4ik221kg3ucFFZ0qeqvWUhEVHDgnjO3f" ], "X-Amz-Request-Id": [ "C7XZ6X2HXC3MQA4V" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "72f2c643e0e13bf2", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=0-0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "1" ], "Content-Range": [ "bytes 0-0/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:01 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:01 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "swckE/f3YOpwZ5NPJWTbg01bBCUOxsVa3yBtA+iPAsPSEgNObA2r0aXQByD7IxbBfIjmlZh04FOBL7obRjDc5lBQpTHuZGlu" ], "X-Amz-Request-Id": [ "C7XMYKVQQ9Q0KRJM" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "YQ==" } }, { "ID": "12230824cce6445c", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=0-0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "1" ], "Content-Range": [ "bytes 0-0/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:01 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:01 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Yk4G85tXcXH4w3G4Gx0bHazvm24rqBzxwUgC90bhsqtp/eFs3cd0XIb5ZAdJD54JEqPtgamQHL/reKh0tasJeN6LdQVlqKRw" ], "X-Amz-Request-Id": [ "C7XWGFWKVNZGK71R" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "YQ==" } }, { "ID": "1ac24663f149b5b8", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:01 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:01 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "ubeW/7KXYWO+AAVLTe3HWHjdEtXAGMXlQ8sdrKEh2ijxHuJSyUsIk5WjnHm1yD6ibrAVDPGbSbHp2B3kcznmlwZgzc1Sg4eH" ], "X-Amz-Request-Id": [ "C7XRPKF8CTXK9YYT" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "3be6d18095aa3fe3", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:01 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "fbwNBaMV0gSFNRFAFF5Tp3tQT1ANphMPisJRWyQV5I3H3ZXyS4SK9tNtj66WNAmCH4A0NPeGMdi1zHVw40s//QmUt5b24Lj6" ], "X-Amz-Request-Id": [ "C7XM5VSW2XEW8SJT" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestRead/negative_offset_fails.replay ================================================ { "Initial": "AQAAAA7hTg0AD82AGgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": null } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestRead/read_a_part_in_middle.replay ================================================ { "Initial": "AQAAAA7hTg0AOp8hDAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "d710213baa4d732a", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "69" ], "Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "27" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "MWINCmFiY2RlZmdoaWprbG1ub3BxdXJzdHV2d3h5eg0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6UnlQZzVRPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "RyPg5Q==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "wq36sZiadGl4PdyQ1UBZ2t3DIgNRgc2wCTqPHElFRa3wKwW9jC/uzKmjqrTjr+ZCuwm39ue0LH0=" ], "X-Amz-Request-Id": [ "DT6T9N198C8BNRN8" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "74f2fdfc82d1369a", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=10-14" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Range": [ "bytes 10-14/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "17/+1McADmIgMagGjxxrKOMqSFi2WstO9D1Xs2KJE/zdl7SgUnJ7pk3zxopPdRiDDk0XR4r0eos=" ], "X-Amz-Request-Id": [ "DT6V7YJ84KHC3AQJ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "a2xtbm8=" } }, { "ID": "e3ad6bca750c43d2", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=10-14" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Range": [ "bytes 10-14/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "oeTLBTrtIckWuF3gHDtIQO5LwiB/TP+gkil1+UXwLiYr56PGODAFf+OMz4aJLrLUovBqpb3QHd8=" ], "X-Amz-Request-Id": [ "DT6HDZ39194VC3K3" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "a2xtbm8=" } }, { "ID": "7647df116fa36112", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=14-14" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "1" ], "Content-Range": [ "bytes 14-14/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "RwJYdu7rEjyHhN+J+ea7w1br10OvCeUe58pQF/EOGgtM86arQcXFm0NiUKEepqUytNX+2SlhoiI=" ], "X-Amz-Request-Id": [ "DT6MWD0P1GVXHD46" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "bw==" } }, { "ID": "4f1e3680daba0bb3", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=14-14" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "1" ], "Content-Range": [ "bytes 14-14/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "bO6G6QVZZGEYw/JBgZzudWUW+0vYTALZMgSiR7x0aD5ZfuFWuBbHJc7SzdkLgl8h7aZDQ6qOty4=" ], "X-Amz-Request-Id": [ "DT6NYM3S0EYYDBBJ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "bw==" } }, { "ID": "77b1a1d30c19f93c", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=12-14" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "3" ], "Content-Range": [ "bytes 12-14/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "71edPgwv3B7SvtwjBx6HSYOyUHTVNIXDJAVfUcpJg7MBZPdl7W4U1PVZFleCM7sLc5F503MMMtE=" ], "X-Amz-Request-Id": [ "DT6XWPFFP9SK5P1Z" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "bW5v" } }, { "ID": "5fe48a0139ebeceb", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "z7m8ni1XkY0uRn7af0vH6iCMbOC0F7L2Va/Ojn+B+J8eL516q9eMAYjbmtMoOarPCF9Cd/woYxw=" ], "X-Amz-Request-Id": [ "DT6H27ZVHMWYH69X" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "2fced126409b5ecd", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "cP/KqriFA9Q/Svi4Z/Z2uqsT9be8/3OH641yGHohE+NR6q27/CfEOP+lI5LaDW9Mo5eTAijs8+Q=" ], "X-Amz-Request-Id": [ "DT6SM1FGENKPVGE2" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestRead/read_from_positive_offset_to_end.replay ================================================ { "Initial": "AQAAAA7hTg0AIJ9GFgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "db64e9760e1384bf", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "69" ], "Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "27" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "MWINCmFiY2RlZmdoaWprbG1ub3BxdXJzdHV2d3h5eg0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6UnlQZzVRPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:01 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "RyPg5Q==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "8dLAgUassCL5QgGoVLBxqx8nU7cV0XKGOGeNyHp3EUzzwukQexMP0VcQdVEpSk+M/U7lnpL3qk9ul8BCG94WL8I65TQQmyba" ], "X-Amz-Request-Id": [ "C7XSCMXW9WA2EYYF" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "bd8067e4db6542da", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=10-" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "17" ], "Content-Range": [ "bytes 10-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:01 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:01 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Xi9ABxh5E2mHUMdx+Eb7rt9CRBYgIXIDPCGs3N0Ml/tD0oE3M7tnepBwySxZJvicIa/kzKgKZoPAnlT/ZMgxfFkyzeLuMTlP" ], "X-Amz-Request-Id": [ "C7XHPBVBCYXEQ85X" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "a2xtbm9wcXVyc3R1dnd4eXo=" } }, { "ID": "b6c05fd53128bbd2", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=10-" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "17" ], "Content-Range": [ "bytes 10-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:01 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:01 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "RpXFbH1Nd7SYvHK968KSlKMlb65OCZg5GjmphcYCdFtjFJ73FeWISPmfeCHqS82l1OOHi5+RNSmbrZRU+uzpev6inDwYjaCy" ], "X-Amz-Request-Id": [ "C7XT32N50BF2HC7S" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "a2xtbm9wcXVyc3R1dnd4eXo=" } }, { "ID": "3207c2fb77a2ce17", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=22-" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Range": [ "bytes 22-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:01 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:01 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "jyFwYXBmXdQ9zvMKZAfqF7famaJmPYrX+X//wjt87V8rDwlONbZIndx0IyGcviHqpfhfDR5v6Taf/6gENnHmo0NygxEulxiK" ], "X-Amz-Request-Id": [ "C7XRJA298QDQHMHQ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "dnd4eXo=" } }, { "ID": "8fd4a0b2c1633e32", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=22-" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Range": [ "bytes 22-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:01 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:01 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "iLBlC21Qe5HotsJRSqAUNW4yfYwg1ox8oiTVDJsTllp+drfmh98K3KxiWtjPnx/m0tlM6EMJHpXuZRGSsV+/QEJPzPXIA2Dz" ], "X-Amz-Request-Id": [ "C7XZM00N5TYVJVDQ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "dnd4eXo=" } }, { "ID": "f2eb382152abd076", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=16-" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "11" ], "Content-Range": [ "bytes 16-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:01 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:01 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "k76xyZkJy+IJyzwd07+YgauSg4+zlvfaGp3589dcWv+r++qYaejGnQQhHh9gh5NGgcV0xM4KvL8/7fLTJBXHAG+Y13ZwvOE1" ], "X-Amz-Request-Id": [ "C7XV904AA2Q50V4E" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "cXVyc3R1dnd4eXo=" } }, { "ID": "c2e0c32c041bdfe3", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:01 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:01 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "SuOf/nYErh3HuSb1FHy+4KUj12Tt1Wnd8vikFO3s9aOFS/o/AwS3I6xGJRvplc8vJJd1zxT8NTLmyKgV+RDuAV+yiarNn61C" ], "X-Amz-Request-Id": [ "C7XHBFBJ33F048AK" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "a2e3e952b3426f0e", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:01 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "XFH+WU+fiDycfGjJQjjtzi4l9J+6UfmF23gQu6jpH+B4+GzwGdU+c6+eeIMVwMkDc2XLl6IEy+Jvo+qweG08AI89xi1nKjdw" ], "X-Amz-Request-Id": [ "C7XXAC9TDVMM2NBB" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestRead/read_in_full.replay ================================================ { "Initial": "AQAAAA7hTg0BGT5ICwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "bbe9536d69467dc1", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "69" ], "Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "27" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "MWINCmFiY2RlZmdoaWprbG1ub3BxdXJzdHV2d3h5eg0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6UnlQZzVRPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "RyPg5Q==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "Es1vBhHxgFG/V4/RuYtHMISPlLYHl4HufrsJ/Wwsl32GFdVsBXdoh3klwsyz2+J55XvP6IS7+WE=" ], "X-Amz-Request-Id": [ "DT6V2J5V7N0VYNF9" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "c158e88e9e12434d", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "RyPg5Q==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "oWG2xVfgLaPQ1oBVXvYruVQkQUIKUf66Ay1JovFbjcEPluNqNywMx84Ab+4b7pMdnRDKV4jMiAc=" ], "X-Amz-Request-Id": [ "DT6J8CRHN3Y3Q46R" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "YWJjZGVmZ2hpamtsbW5vcHF1cnN0dXZ3eHl6" } }, { "ID": "1d02af181686753a", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "RyPg5Q==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "CADirsMh/UWRduy6h/msUYP2oDWSZQhq19PlPJNnPtUyjeWVKEdvtSQjtEM43cuLItmNMtURiDU=" ], "X-Amz-Request-Id": [ "DT6GRB85YAQKN3YZ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "YWJjZGVmZ2hpamtsbW5vcHF1cnN0dXZ3eHl6" } }, { "ID": "65cfaff046f2bae2", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=18-" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "9" ], "Content-Range": [ "bytes 18-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "quHynYlGVOfsakOIcJh0WJ8moYZ2fgfWG6pV0LBXE6fKn4Iv/Gcm6DUDVhjGe+U++EEfLd94HYE=" ], "X-Amz-Request-Id": [ "DT6HBS10K23NFTAK" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "cnN0dXZ3eHl6" } }, { "ID": "4127591c254d94e5", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=18-" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "9" ], "Content-Range": [ "bytes 18-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "QdhhN05NFWO+U7+VLufv0IK+/4uaMGmyHdHsqaWxbckIaOaa+hunIedTSc7+y1sx5LHAZbqCwDU=" ], "X-Amz-Request-Id": [ "DT6H1ZYWV8358NMT" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "cnN0dXZ3eHl6" } }, { "ID": "7238c77512f3c1c9", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=9-" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "18" ], "Content-Range": [ "bytes 9-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "qQLIM+16ezQ8lqtanksi1UMXeOHCq8q4B7uC/EobzVe3lvIVnYcqk7m+zHAM/+jRaRuAVVkPveY=" ], "X-Amz-Request-Id": [ "DT6TC4MV6Y0DEY7F" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "amtsbW5vcHF1cnN0dXZ3eHl6" } }, { "ID": "c184ed2cfa4ac726", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "j59Yry+DvuyZsXvBqwjhFoA90wm6bRDfXrGZV4iZC4qSWDYeifV5kFT7hULPhiLllzR8CKWZcTA=" ], "X-Amz-Request-Id": [ "DT6KMQNP6GM5AAXD" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "77713c378733692e", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "/xS3VsHbFtw32YqEgKIAeF4s5XlWQ+iyc/3rZCNiXbVJfZSFGn73JHtVTWW0xdtZGXtOey2ioOQ=" ], "X-Amz-Request-Id": [ "DT6YETZP559J9SZT" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestRead/read_in_full_with_negative_length_not_-1.replay ================================================ { "Initial": "AQAAAA7hTg0BMknIdwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "d023383d863c22cc", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "69" ], "Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "27" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "MWINCmFiY2RlZmdoaWprbG1ub3BxdXJzdHV2d3h5eg0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6UnlQZzVRPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "RyPg5Q==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "g4R5TbYIaRFC7J8vNOVs8Su9iDiWZrXtSANAN+gIU0hqleMrO2t7A1sFgRMbWGl5sRD/bFQKEJA=" ], "X-Amz-Request-Id": [ "DT6ZPPY2HJDEWYTQ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "d335d2da8f28f9f9", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "RyPg5Q==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "p1KaSXRDeoys5BFbG3KHOjTwg/sVTBoZkrKQu1djZmVl4+GV0/nAjMQm88xMkT+SLsJK+YkMc68=" ], "X-Amz-Request-Id": [ "DT6WX26H5FYGF4G5" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "YWJjZGVmZ2hpamtsbW5vcHF1cnN0dXZ3eHl6" } }, { "ID": "7273463293791798", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:03 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "RyPg5Q==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "WAFTllkCq9oAHZ3AGzI+PlgeW3oao4/2fv/bV499HW/85sjmClhAjujN/SKp0eOH8YyF9rW0xMM=" ], "X-Amz-Request-Id": [ "8D99X6H14PD2VJ6J" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "YWJjZGVmZ2hpamtsbW5vcHF1cnN0dXZ3eHl6" } }, { "ID": "7bd8cc336cb9d247", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=18-" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "9" ], "Content-Range": [ "bytes 18-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:03 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Z2KzPM8Lg7pQ5mt2T59Se4+keoQAVThQ2b5oWIKoHFGlwp3JsdrHIvKHNj4ONw5GcIUTH4viMSE=" ], "X-Amz-Request-Id": [ "8D98DE1DBPQGDHKX" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "cnN0dXZ3eHl6" } }, { "ID": "dd1de01bd1189cae", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=18-" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "9" ], "Content-Range": [ "bytes 18-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:03 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "J4DA9Vq0+mH1w8nJDgCo7399Rq2uQrqWKaxEJ8UkLAwx2OREJy+tIRw3EtlCxqnoFB/D5XxJtlQ=" ], "X-Amz-Request-Id": [ "8D938FF8BXVGY1ZR" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "cnN0dXZ3eHl6" } }, { "ID": "a59fc13dc458b7c6", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=9-" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "18" ], "Content-Range": [ "bytes 9-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:03 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Tre3btp7Vmh3PL9JHydV9z1ViFUSTD/Oadl0ERwhsa3r3GauD9+4ZzNiBQLGW0pkXoVUD/N9DGI=" ], "X-Amz-Request-Id": [ "8D9DDSBZPXPJ6QD9" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "amtsbW5vcHF1cnN0dXZ3eHl6" } }, { "ID": "b0ab5687bef8f3c0", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:03 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "2eL9bOcngoQzPIdBQb+/F5OrbE8V9CQfRo7K1BXm6YLN8jKuvYo3IouihsVWU9ML2LSqRBL5fDM=" ], "X-Amz-Request-Id": [ "8D95R2M9XYEQ34Y9" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "03d76aaae1643a28", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:03 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "ld3ZYXyOz2J/5ZLX4DajZB0Hh9ryGwKSA76UUsDfTIobS5Xaftx/26Ury3NYYpB3ZB/MbDroFso=" ], "X-Amz-Request-Id": [ "8D9B8MW1GVKY22H1" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestRead/read_of_nonexistent_key_fails.replay ================================================ { "Initial": "AQAAAA7hTg0AAthUAAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "c77aed156bf05d9a", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "69" ], "Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "27" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "MWINCmFiY2RlZmdoaWprbG1ub3BxdXJzdHV2d3h5eg0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6UnlQZzVRPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:01 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "RyPg5Q==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "mlQhDefsTaxRJXm776JO+BaNdC/IspIS9E08Xvw+FQROFeDgsLm9wqic5t6TS+acR5BctlQiH20=" ], "X-Amz-Request-Id": [ "C7XGMGFTHM9K7NKZ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "7f569ccec934bba4", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key-does-not-exist?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:00 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "u9eGQnwmDfOxpz1K6paJRKVRnSo9aNEmmx7l2UdnuVoxiDwaqIkNWF+GKaCE7mPZAFAf3qvkoGQ=" ], "X-Amz-Request-Id": [ "C7XK2RWSTP89TD98" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPk5vU3VjaEtleTwvQ29kZT48TWVzc2FnZT5UaGUgc3BlY2lmaWVkIGtleSBkb2VzIG5vdCBleGlzdC48L01lc3NhZ2U+PEtleT5rZXktZG9lcy1ub3QtZXhpc3Q8L0tleT48UmVxdWVzdElkPkM3WEsyUldTVFA4OVREOTg8L1JlcXVlc3RJZD48SG9zdElkPnU5ZUdRbndtRGZPeHB6MUs2cGFKUktWUm5TbzlhTkVtbXg3bDJVZG51Vm94aUR3YXFJa05XRitHS2FDRTdtUFpBRkFmM3F2a29HUT08L0hvc3RJZD48L0Vycm9yPg==" } }, { "ID": "2ae5bae300bc4357", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:01 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:01 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "DHZ+eH+ozXgrI5fkcHSH4WhBQw+gix2lRjT3e/mjNdEuBmqiyjwR+65NptFKPwp1iYq4iNJy4DI=" ], "X-Amz-Request-Id": [ "C7XZGXC6SRF4DCKQ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "fc46a1e433583c8d", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:01 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "oh8cRZVxi/UT2Kqp5tLxd4Xcpdy4oXxiSygTQeiKMNfAndSGmEUHaZhSleBIA1cLLzXkUopEwzI=" ], "X-Amz-Request-Id": [ "C7XTFNMM4FWGJAZ1" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestSignedURL.replay ================================================ { "Initial": "AQAAAA7hTg0UBZymtQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "763a932fb92c363a", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-signing?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "11" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "aGVsbG8gd29ybGQ=" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "hseBkpU068NoNVQqJDrzaShR4+oWJJYU922rJjUxfXcsyQvRI/hCz90FBZWi2YRHWPy+9BrT7TobuaF//q8/kT3EfJBboA63" ], "X-Amz-Request-Id": [ "M1VAWESZNF7JNPGT" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPlNpZ25hdHVyZURvZXNOb3RNYXRjaDwvQ29kZT48TWVzc2FnZT5UaGUgcmVxdWVzdCBzaWduYXR1cmUgd2UgY2FsY3VsYXRlZCBkb2VzIG5vdCBtYXRjaCB0aGUgc2lnbmF0dXJlIHlvdSBwcm92aWRlZC4gQ2hlY2sgeW91ciBrZXkgYW5kIHNpZ25pbmcgbWV0aG9kLjwvTWVzc2FnZT48QVdTQWNjZXNzS2V5SWQ+QUtJQVdVV0VVU1BVTFlYM0JMM008L0FXU0FjY2Vzc0tleUlkPjxTdHJpbmdUb1NpZ24+QVdTNC1ITUFDLVNIQTI1NgoyMDI2MDMxOVQxNTI4MjBaCjIwMjYwMzE5L3VzLXdlc3QtMS9zMy9hd3M0X3JlcXVlc3QKNTliMTIwNTVmNTE1MjYyMTc2OWU5MWZkZjMxZDgxZjE2ZWY2MTkwZDE3OTQ2ZmM4NmQ3ZjM5MTliZGQ0ZmE4MDwvU3RyaW5nVG9TaWduPjxTaWduYXR1cmVQcm92aWRlZD44MDQ0YjI4NmY0OTkyZWYwZWRjMTUwZDI3NzYyYjkzZDg2ODhjMDYzY2FhMTEyMGExNjg4MWIyNTlmOGU2NDE4PC9TaWduYXR1cmVQcm92aWRlZD48U3RyaW5nVG9TaWduQnl0ZXM+NDEgNTcgNTMgMzQgMmQgNDggNGQgNDEgNDMgMmQgNTMgNDggNDEgMzIgMzUgMzYgMGEgMzIgMzAgMzIgMzYgMzAgMzMgMzEgMzkgNTQgMzEgMzUgMzIgMzggMzIgMzAgNWEgMGEgMzIgMzAgMzIgMzYgMzAgMzMgMzEgMzkgMmYgNzUgNzMgMmQgNzcgNjUgNzMgNzQgMmQgMzEgMmYgNzMgMzMgMmYgNjEgNzcgNzMgMzQgNWYgNzIgNjUgNzEgNzUgNjUgNzMgNzQgMGEgMzUgMzkgNjIgMzEgMzIgMzAgMzUgMzUgNjYgMzUgMzEgMzUgMzIgMzYgMzIgMzEgMzcgMzYgMzkgNjUgMzkgMzEgNjYgNjQgNjYgMzMgMzEgNjQgMzggMzEgNjYgMzEgMzYgNjUgNjYgMzYgMzEgMzkgMzAgNjQgMzEgMzcgMzkgMzQgMzYgNjYgNjMgMzggMzYgNjQgMzcgNjYgMzMgMzkgMzEgMzkgNjIgNjQgNjQgMzQgNjYgNjEgMzggMzA8L1N0cmluZ1RvU2lnbkJ5dGVzPjxDYW5vbmljYWxSZXF1ZXN0PlBVVAovYmxvYi1mb3Itc2lnbmluZwpYLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZhbXA7WC1BbXotQ2hlY2tzdW0tTW9kZT1FTkFCTEVEJmFtcDtYLUFtei1DcmVkZW50aWFsPUFLSUFXVVdFVVNQVUxZWDNCTDNNJTJGMjAyNjAzMTklMkZ1cy13ZXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZhbXA7WC1BbXotRGF0ZT0yMDI2MDMxOVQxNTI4MjBaJmFtcDtYLUFtei1FeHBpcmVzPTM2MDAmYW1wO1gtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhbXA7eC1pZD1HZXRPYmplY3QKaG9zdDpnby1jbG91ZC10ZXN0aW5nLTIuczMudXMtd2VzdC0xLmFtYXpvbmF3cy5jb20KCmhvc3QKVU5TSUdORUQtUEFZTE9BRDwvQ2Fub25pY2FsUmVxdWVzdD48Q2Fub25pY2FsUmVxdWVzdEJ5dGVzPjUwIDU1IDU0IDBhIDJmIDYyIDZjIDZmIDYyIDJkIDY2IDZmIDcyIDJkIDczIDY5IDY3IDZlIDY5IDZlIDY3IDBhIDU4IDJkIDQxIDZkIDdhIDJkIDQxIDZjIDY3IDZmIDcyIDY5IDc0IDY4IDZkIDNkIDQxIDU3IDUzIDM0IDJkIDQ4IDRkIDQxIDQzIDJkIDUzIDQ4IDQxIDMyIDM1IDM2IDI2IDU4IDJkIDQxIDZkIDdhIDJkIDQzIDY4IDY1IDYzIDZiIDczIDc1IDZkIDJkIDRkIDZmIDY0IDY1IDNkIDQ1IDRlIDQxIDQyIDRjIDQ1IDQ0IDI2IDU4IDJkIDQxIDZkIDdhIDJkIDQzIDcyIDY1IDY0IDY1IDZlIDc0IDY5IDYxIDZjIDNkIDQxIDRiIDQ5IDQxIDU3IDU1IDU3IDQ1IDU1IDUzIDUwIDU1IDRjIDU5IDU4IDMzIDQyIDRjIDMzIDRkIDI1IDMyIDQ2IDMyIDMwIDMyIDM2IDMwIDMzIDMxIDM5IDI1IDMyIDQ2IDc1IDczIDJkIDc3IDY1IDczIDc0IDJkIDMxIDI1IDMyIDQ2IDczIDMzIDI1IDMyIDQ2IDYxIDc3IDczIDM0IDVmIDcyIDY1IDcxIDc1IDY1IDczIDc0IDI2IDU4IDJkIDQxIDZkIDdhIDJkIDQ0IDYxIDc0IDY1IDNkIDMyIDMwIDMyIDM2IDMwIDMzIDMxIDM5IDU0IDMxIDM1IDMyIDM4IDMyIDMwIDVhIDI2IDU4IDJkIDQxIDZkIDdhIDJkIDQ1IDc4IDcwIDY5IDcyIDY1IDczIDNkIDMzIDM2IDMwIDMwIDI2IDU4IDJkIDQxIDZkIDdhIDJkIDUzIDY5IDY3IDZlIDY1IDY0IDQ4IDY1IDYxIDY0IDY1IDcyIDczIDNkIDY4IDZmIDczIDc0IDI2IDc4IDJkIDY5IDY0IDNkIDQ3IDY1IDc0IDRmIDYyIDZhIDY1IDYzIDc0IDBhIDY4IDZmIDczIDc0IDNhIDY3IDZmIDJkIDYzIDZjIDZmIDc1IDY0IDJkIDc0IDY1IDczIDc0IDY5IDZlIDY3IDJkIDMyIDJlIDczIDMzIDJlIDc1IDczIDJkIDc3IDY1IDczIDc0IDJkIDMxIDJlIDYxIDZkIDYxIDdhIDZmIDZlIDYxIDc3IDczIDJlIDYzIDZmIDZkIDBhIDBhIDY4IDZmIDczIDc0IDBhIDU1IDRlIDUzIDQ5IDQ3IDRlIDQ1IDQ0IDJkIDUwIDQxIDU5IDRjIDRmIDQxIDQ0PC9DYW5vbmljYWxSZXF1ZXN0Qnl0ZXM+PFJlcXVlc3RJZD5NMVZBV0VTWk5GN0pOUEdUPC9SZXF1ZXN0SWQ+PEhvc3RJZD5oc2VCa3BVMDY4Tm9OVlFxSkRyemFTaFI0K29XSkpZVTkyMnJKalV4Zlhjc3lRdlJJL2hDejkwRkJaV2kyWVJIV1B5KzlCclQ3VG9idWFGLy9xOC9rVDNFZkpCYm9BNjM8L0hvc3RJZD48L0Vycm9yPg==" } }, { "ID": "aa7a0464e9d762d1", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-signing?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=PutObject", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "11" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "aGVsbG8gd29ybGQ=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:21 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc64nvme": [ "jSnVw/bqjr4=" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "ee6Zr1tS6qgu0nMozkdvfhP+jFFbKBwr02hE1QPx0+quFt4wh+gIW7OGtDkoRsTivi2C5aVNC2M=" ], "X-Amz-Request-Id": [ "M1VBF3JR449N27FF" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "8b7d46790b11b868", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-signing?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=PutObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "wbN6KG1twEpK+SldWzUNdmouFkib9qgDjO1rbEtKdVD18AffpP/iXN5bLwCIda48Z3LbVuje/pc=" ], "X-Amz-Request-Id": [ "M1V6DBAY01M2SF2W" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPlNpZ25hdHVyZURvZXNOb3RNYXRjaDwvQ29kZT48TWVzc2FnZT5UaGUgcmVxdWVzdCBzaWduYXR1cmUgd2UgY2FsY3VsYXRlZCBkb2VzIG5vdCBtYXRjaCB0aGUgc2lnbmF0dXJlIHlvdSBwcm92aWRlZC4gQ2hlY2sgeW91ciBrZXkgYW5kIHNpZ25pbmcgbWV0aG9kLjwvTWVzc2FnZT48QVdTQWNjZXNzS2V5SWQ+QUtJQVdVV0VVU1BVTFlYM0JMM008L0FXU0FjY2Vzc0tleUlkPjxTdHJpbmdUb1NpZ24+QVdTNC1ITUFDLVNIQTI1NgoyMDI2MDMxOVQxNTI4MjBaCjIwMjYwMzE5L3VzLXdlc3QtMS9zMy9hd3M0X3JlcXVlc3QKYjdlNjQ4NmMwMjE5NjMwNzA0MDhlMDliMjNkZjU0MWQxOTViM2U2YjdlYjZhYTlhZWY1OWJkZTNlNDQwYmJkNjwvU3RyaW5nVG9TaWduPjxTaWduYXR1cmVQcm92aWRlZD45OTUzZWRiZWMyMDVkYzk4N2Y2MjMxZWUzMDY5M2Y4ZmNmMDU1YTFkNWRiMDMxMzQ4ZDdkN2Q4ZjU3MmJhY2RlPC9TaWduYXR1cmVQcm92aWRlZD48U3RyaW5nVG9TaWduQnl0ZXM+NDEgNTcgNTMgMzQgMmQgNDggNGQgNDEgNDMgMmQgNTMgNDggNDEgMzIgMzUgMzYgMGEgMzIgMzAgMzIgMzYgMzAgMzMgMzEgMzkgNTQgMzEgMzUgMzIgMzggMzIgMzAgNWEgMGEgMzIgMzAgMzIgMzYgMzAgMzMgMzEgMzkgMmYgNzUgNzMgMmQgNzcgNjUgNzMgNzQgMmQgMzEgMmYgNzMgMzMgMmYgNjEgNzcgNzMgMzQgNWYgNzIgNjUgNzEgNzUgNjUgNzMgNzQgMGEgNjIgMzcgNjUgMzYgMzQgMzggMzYgNjMgMzAgMzIgMzEgMzkgMzYgMzMgMzAgMzcgMzAgMzQgMzAgMzggNjUgMzAgMzkgNjIgMzIgMzMgNjQgNjYgMzUgMzQgMzEgNjQgMzEgMzkgMzUgNjIgMzMgNjUgMzYgNjIgMzcgNjUgNjIgMzYgNjEgNjEgMzkgNjEgNjUgNjYgMzUgMzkgNjIgNjQgNjUgMzMgNjUgMzQgMzQgMzAgNjIgNjIgNjQgMzY8L1N0cmluZ1RvU2lnbkJ5dGVzPjxDYW5vbmljYWxSZXF1ZXN0PkdFVAovYmxvYi1mb3Itc2lnbmluZwpYLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZhbXA7WC1BbXotQ3JlZGVudGlhbD1BS0lBV1VXRVVTUFVMWVgzQkwzTSUyRjIwMjYwMzE5JTJGdXMtd2VzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmYW1wO1gtQW16LURhdGU9MjAyNjAzMTlUMTUyODIwWiZhbXA7WC1BbXotRXhwaXJlcz0zNjAwJmFtcDtYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYW1wO3gtaWQ9UHV0T2JqZWN0Cmhvc3Q6Z28tY2xvdWQtdGVzdGluZy0yLnMzLnVzLXdlc3QtMS5hbWF6b25hd3MuY29tCgpob3N0ClVOU0lHTkVELVBBWUxPQUQ8L0Nhbm9uaWNhbFJlcXVlc3Q+PENhbm9uaWNhbFJlcXVlc3RCeXRlcz40NyA0NSA1NCAwYSAyZiA2MiA2YyA2ZiA2MiAyZCA2NiA2ZiA3MiAyZCA3MyA2OSA2NyA2ZSA2OSA2ZSA2NyAwYSA1OCAyZCA0MSA2ZCA3YSAyZCA0MSA2YyA2NyA2ZiA3MiA2OSA3NCA2OCA2ZCAzZCA0MSA1NyA1MyAzNCAyZCA0OCA0ZCA0MSA0MyAyZCA1MyA0OCA0MSAzMiAzNSAzNiAyNiA1OCAyZCA0MSA2ZCA3YSAyZCA0MyA3MiA2NSA2NCA2NSA2ZSA3NCA2OSA2MSA2YyAzZCA0MSA0YiA0OSA0MSA1NyA1NSA1NyA0NSA1NSA1MyA1MCA1NSA0YyA1OSA1OCAzMyA0MiA0YyAzMyA0ZCAyNSAzMiA0NiAzMiAzMCAzMiAzNiAzMCAzMyAzMSAzOSAyNSAzMiA0NiA3NSA3MyAyZCA3NyA2NSA3MyA3NCAyZCAzMSAyNSAzMiA0NiA3MyAzMyAyNSAzMiA0NiA2MSA3NyA3MyAzNCA1ZiA3MiA2NSA3MSA3NSA2NSA3MyA3NCAyNiA1OCAyZCA0MSA2ZCA3YSAyZCA0NCA2MSA3NCA2NSAzZCAzMiAzMCAzMiAzNiAzMCAzMyAzMSAzOSA1NCAzMSAzNSAzMiAzOCAzMiAzMCA1YSAyNiA1OCAyZCA0MSA2ZCA3YSAyZCA0NSA3OCA3MCA2OSA3MiA2NSA3MyAzZCAzMyAzNiAzMCAzMCAyNiA1OCAyZCA0MSA2ZCA3YSAyZCA1MyA2OSA2NyA2ZSA2NSA2NCA0OCA2NSA2MSA2NCA2NSA3MiA3MyAzZCA2OCA2ZiA3MyA3NCAyNiA3OCAyZCA2OSA2NCAzZCA1MCA3NSA3NCA0ZiA2MiA2YSA2NSA2MyA3NCAwYSA2OCA2ZiA3MyA3NCAzYSA2NyA2ZiAyZCA2MyA2YyA2ZiA3NSA2NCAyZCA3NCA2NSA3MyA3NCA2OSA2ZSA2NyAyZCAzMiAyZSA3MyAzMyAyZSA3NSA3MyAyZCA3NyA2NSA3MyA3NCAyZCAzMSAyZSA2MSA2ZCA2MSA3YSA2ZiA2ZSA2MSA3NyA3MyAyZSA2MyA2ZiA2ZCAwYSAwYSA2OCA2ZiA3MyA3NCAwYSA1NSA0ZSA1MyA0OSA0NyA0ZSA0NSA0NCAyZCA1MCA0MSA1OSA0YyA0ZiA0MSA0NDwvQ2Fub25pY2FsUmVxdWVzdEJ5dGVzPjxSZXF1ZXN0SWQ+TTFWNkRCQVkwMU0yU0YyVzwvUmVxdWVzdElkPjxIb3N0SWQ+d2JONktHMXR3RXBLK1NsZFd6VU5kbW91RmtpYjlxZ0RqTzFyYkV0S2RWRDE4QWZmcFAvaVhONWJMd0NJZGE0OFozTGJWdWplL3BjPTwvSG9zdElkPjwvRXJyb3I+" } }, { "ID": "3a7fca25954639cd", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-signing", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "2a+7XVrkf5OaBB/M14vQQm9S64YS6ttXuA9upWa+UR6rAB3a3CNg+6jJKoMXzdeHsBD+FuvKkWk=" ], "X-Amz-Request-Id": [ "M1VBPVE63PXSCGAZ" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPkFjY2Vzc0RlbmllZDwvQ29kZT48TWVzc2FnZT5BY2Nlc3MgRGVuaWVkPC9NZXNzYWdlPjxSZXF1ZXN0SWQ+TTFWQlBWRTYzUFhTQ0dBWjwvUmVxdWVzdElkPjxIb3N0SWQ+MmErN1hWcmtmNU9hQkIvTTE0dlFRbTlTNjRZUzZ0dFh1QTl1cFdhK1VSNnJBQjNhM0NOZys2akpLb01YemRlSHNCRCtGdXZLa1drPTwvSG9zdElkPjwvRXJyb3I+" } }, { "ID": "bd6d2af534ca4597", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-signing?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "11" ], "Content-Type": [ "binary/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:21 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:21 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "dUlaKInBba0Kzi7NZJJKE63PrFpTtY4HGBK1ej/onuV8q1DByoKVzHfRJC+pNFubdRtz2Ocf6tM=" ], "X-Amz-Request-Id": [ "M1V04HQKNRQ01MTN" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8gd29ybGQ=" } }, { "ID": "413aed2c14fda4b7", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-signing?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "4B8Y9WFSrzPv6nC/A8g/husaUal7vJJnlAJSOShc9ozJIecdwpWJFmpvwmFO63dT3AHmoMsXoiQ=" ], "X-Amz-Request-Id": [ "M1VFK6KPVXCTHW6K" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPlNpZ25hdHVyZURvZXNOb3RNYXRjaDwvQ29kZT48TWVzc2FnZT5UaGUgcmVxdWVzdCBzaWduYXR1cmUgd2UgY2FsY3VsYXRlZCBkb2VzIG5vdCBtYXRjaCB0aGUgc2lnbmF0dXJlIHlvdSBwcm92aWRlZC4gQ2hlY2sgeW91ciBrZXkgYW5kIHNpZ25pbmcgbWV0aG9kLjwvTWVzc2FnZT48QVdTQWNjZXNzS2V5SWQ+QUtJQVdVV0VVU1BVTFlYM0JMM008L0FXU0FjY2Vzc0tleUlkPjxTdHJpbmdUb1NpZ24+QVdTNC1ITUFDLVNIQTI1NgoyMDI2MDMxOVQxNTI4MjBaCjIwMjYwMzE5L3VzLXdlc3QtMS9zMy9hd3M0X3JlcXVlc3QKZmI0NzJkNTM5ZTlmYjZlZGI4ZjQwYWZiYTRjOGZmNWRjYTdiNzYyZDc5OTUzYTU1YWY0ZDc3NjYzZjQ1ODBiMjwvU3RyaW5nVG9TaWduPjxTaWduYXR1cmVQcm92aWRlZD44MDQ0YjI4NmY0OTkyZWYwZWRjMTUwZDI3NzYyYjkzZDg2ODhjMDYzY2FhMTEyMGExNjg4MWIyNTlmOGU2NDE4PC9TaWduYXR1cmVQcm92aWRlZD48U3RyaW5nVG9TaWduQnl0ZXM+NDEgNTcgNTMgMzQgMmQgNDggNGQgNDEgNDMgMmQgNTMgNDggNDEgMzIgMzUgMzYgMGEgMzIgMzAgMzIgMzYgMzAgMzMgMzEgMzkgNTQgMzEgMzUgMzIgMzggMzIgMzAgNWEgMGEgMzIgMzAgMzIgMzYgMzAgMzMgMzEgMzkgMmYgNzUgNzMgMmQgNzcgNjUgNzMgNzQgMmQgMzEgMmYgNzMgMzMgMmYgNjEgNzcgNzMgMzQgNWYgNzIgNjUgNzEgNzUgNjUgNzMgNzQgMGEgNjYgNjIgMzQgMzcgMzIgNjQgMzUgMzMgMzkgNjUgMzkgNjYgNjIgMzYgNjUgNjQgNjIgMzggNjYgMzQgMzAgNjEgNjYgNjIgNjEgMzQgNjMgMzggNjYgNjYgMzUgNjQgNjMgNjEgMzcgNjIgMzcgMzYgMzIgNjQgMzcgMzkgMzkgMzUgMzMgNjEgMzUgMzUgNjEgNjYgMzQgNjQgMzcgMzcgMzYgMzYgMzMgNjYgMzQgMzUgMzggMzAgNjIgMzI8L1N0cmluZ1RvU2lnbkJ5dGVzPjxDYW5vbmljYWxSZXF1ZXN0PkRFTEVURQovYmxvYi1mb3Itc2lnbmluZwpYLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZhbXA7WC1BbXotQ2hlY2tzdW0tTW9kZT1FTkFCTEVEJmFtcDtYLUFtei1DcmVkZW50aWFsPUFLSUFXVVdFVVNQVUxZWDNCTDNNJTJGMjAyNjAzMTklMkZ1cy13ZXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZhbXA7WC1BbXotRGF0ZT0yMDI2MDMxOVQxNTI4MjBaJmFtcDtYLUFtei1FeHBpcmVzPTM2MDAmYW1wO1gtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhbXA7eC1pZD1HZXRPYmplY3QKaG9zdDpnby1jbG91ZC10ZXN0aW5nLTIuczMudXMtd2VzdC0xLmFtYXpvbmF3cy5jb20KCmhvc3QKVU5TSUdORUQtUEFZTE9BRDwvQ2Fub25pY2FsUmVxdWVzdD48Q2Fub25pY2FsUmVxdWVzdEJ5dGVzPjQ0IDQ1IDRjIDQ1IDU0IDQ1IDBhIDJmIDYyIDZjIDZmIDYyIDJkIDY2IDZmIDcyIDJkIDczIDY5IDY3IDZlIDY5IDZlIDY3IDBhIDU4IDJkIDQxIDZkIDdhIDJkIDQxIDZjIDY3IDZmIDcyIDY5IDc0IDY4IDZkIDNkIDQxIDU3IDUzIDM0IDJkIDQ4IDRkIDQxIDQzIDJkIDUzIDQ4IDQxIDMyIDM1IDM2IDI2IDU4IDJkIDQxIDZkIDdhIDJkIDQzIDY4IDY1IDYzIDZiIDczIDc1IDZkIDJkIDRkIDZmIDY0IDY1IDNkIDQ1IDRlIDQxIDQyIDRjIDQ1IDQ0IDI2IDU4IDJkIDQxIDZkIDdhIDJkIDQzIDcyIDY1IDY0IDY1IDZlIDc0IDY5IDYxIDZjIDNkIDQxIDRiIDQ5IDQxIDU3IDU1IDU3IDQ1IDU1IDUzIDUwIDU1IDRjIDU5IDU4IDMzIDQyIDRjIDMzIDRkIDI1IDMyIDQ2IDMyIDMwIDMyIDM2IDMwIDMzIDMxIDM5IDI1IDMyIDQ2IDc1IDczIDJkIDc3IDY1IDczIDc0IDJkIDMxIDI1IDMyIDQ2IDczIDMzIDI1IDMyIDQ2IDYxIDc3IDczIDM0IDVmIDcyIDY1IDcxIDc1IDY1IDczIDc0IDI2IDU4IDJkIDQxIDZkIDdhIDJkIDQ0IDYxIDc0IDY1IDNkIDMyIDMwIDMyIDM2IDMwIDMzIDMxIDM5IDU0IDMxIDM1IDMyIDM4IDMyIDMwIDVhIDI2IDU4IDJkIDQxIDZkIDdhIDJkIDQ1IDc4IDcwIDY5IDcyIDY1IDczIDNkIDMzIDM2IDMwIDMwIDI2IDU4IDJkIDQxIDZkIDdhIDJkIDUzIDY5IDY3IDZlIDY1IDY0IDQ4IDY1IDYxIDY0IDY1IDcyIDczIDNkIDY4IDZmIDczIDc0IDI2IDc4IDJkIDY5IDY0IDNkIDQ3IDY1IDc0IDRmIDYyIDZhIDY1IDYzIDc0IDBhIDY4IDZmIDczIDc0IDNhIDY3IDZmIDJkIDYzIDZjIDZmIDc1IDY0IDJkIDc0IDY1IDczIDc0IDY5IDZlIDY3IDJkIDMyIDJlIDczIDMzIDJlIDc1IDczIDJkIDc3IDY1IDczIDc0IDJkIDMxIDJlIDYxIDZkIDYxIDdhIDZmIDZlIDYxIDc3IDczIDJlIDYzIDZmIDZkIDBhIDBhIDY4IDZmIDczIDc0IDBhIDU1IDRlIDUzIDQ5IDQ3IDRlIDQ1IDQ0IDJkIDUwIDQxIDU5IDRjIDRmIDQxIDQ0PC9DYW5vbmljYWxSZXF1ZXN0Qnl0ZXM+PFJlcXVlc3RJZD5NMVZGSzZLUFZYQ1RIVzZLPC9SZXF1ZXN0SWQ+PEhvc3RJZD40QjhZOVdGU3J6UHY2bkMvQThnL2h1c2FVYWw3dkpKbmxBSlNPU2hjOW96SkllY2R3cFdKRm1wdndtRk82M2RUM0FIbW9Nc1hvaVE9PC9Ib3N0SWQ+PC9FcnJvcj4=" } }, { "ID": "8a6ad74bede085fd", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-signing?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=PutObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:19 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "QzPfzvLUkw7hsoJ8Vi9IX5SdKTt2K0vogZA5p/6T0CtoVVV/pD2k4OEyZxD76FgvFJVMlImu7Xw=" ], "X-Amz-Request-Id": [ "M1VA83TPT738S5G1" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPlNpZ25hdHVyZURvZXNOb3RNYXRjaDwvQ29kZT48TWVzc2FnZT5UaGUgcmVxdWVzdCBzaWduYXR1cmUgd2UgY2FsY3VsYXRlZCBkb2VzIG5vdCBtYXRjaCB0aGUgc2lnbmF0dXJlIHlvdSBwcm92aWRlZC4gQ2hlY2sgeW91ciBrZXkgYW5kIHNpZ25pbmcgbWV0aG9kLjwvTWVzc2FnZT48QVdTQWNjZXNzS2V5SWQ+QUtJQVdVV0VVU1BVTFlYM0JMM008L0FXU0FjY2Vzc0tleUlkPjxTdHJpbmdUb1NpZ24+QVdTNC1ITUFDLVNIQTI1NgoyMDI2MDMxOVQxNTI4MjBaCjIwMjYwMzE5L3VzLXdlc3QtMS9zMy9hd3M0X3JlcXVlc3QKYzIxYzFjZWRlNGQyYWQ3ZTcwZjQ1YzRlODMxNGIzYzhjY2VjNjRiY2U2ZWYzZjExMThlYWQ1NzIzYjYwY2U5YTwvU3RyaW5nVG9TaWduPjxTaWduYXR1cmVQcm92aWRlZD45OTUzZWRiZWMyMDVkYzk4N2Y2MjMxZWUzMDY5M2Y4ZmNmMDU1YTFkNWRiMDMxMzQ4ZDdkN2Q4ZjU3MmJhY2RlPC9TaWduYXR1cmVQcm92aWRlZD48U3RyaW5nVG9TaWduQnl0ZXM+NDEgNTcgNTMgMzQgMmQgNDggNGQgNDEgNDMgMmQgNTMgNDggNDEgMzIgMzUgMzYgMGEgMzIgMzAgMzIgMzYgMzAgMzMgMzEgMzkgNTQgMzEgMzUgMzIgMzggMzIgMzAgNWEgMGEgMzIgMzAgMzIgMzYgMzAgMzMgMzEgMzkgMmYgNzUgNzMgMmQgNzcgNjUgNzMgNzQgMmQgMzEgMmYgNzMgMzMgMmYgNjEgNzcgNzMgMzQgNWYgNzIgNjUgNzEgNzUgNjUgNzMgNzQgMGEgNjMgMzIgMzEgNjMgMzEgNjMgNjUgNjQgNjUgMzQgNjQgMzIgNjEgNjQgMzcgNjUgMzcgMzAgNjYgMzQgMzUgNjMgMzQgNjUgMzggMzMgMzEgMzQgNjIgMzMgNjMgMzggNjMgNjMgNjUgNjMgMzYgMzQgNjIgNjMgNjUgMzYgNjUgNjYgMzMgNjYgMzEgMzEgMzEgMzggNjUgNjEgNjQgMzUgMzcgMzIgMzMgNjIgMzYgMzAgNjMgNjUgMzkgNjE8L1N0cmluZ1RvU2lnbkJ5dGVzPjxDYW5vbmljYWxSZXF1ZXN0PkRFTEVURQovYmxvYi1mb3Itc2lnbmluZwpYLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZhbXA7WC1BbXotQ3JlZGVudGlhbD1BS0lBV1VXRVVTUFVMWVgzQkwzTSUyRjIwMjYwMzE5JTJGdXMtd2VzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmYW1wO1gtQW16LURhdGU9MjAyNjAzMTlUMTUyODIwWiZhbXA7WC1BbXotRXhwaXJlcz0zNjAwJmFtcDtYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYW1wO3gtaWQ9UHV0T2JqZWN0Cmhvc3Q6Z28tY2xvdWQtdGVzdGluZy0yLnMzLnVzLXdlc3QtMS5hbWF6b25hd3MuY29tCgpob3N0ClVOU0lHTkVELVBBWUxPQUQ8L0Nhbm9uaWNhbFJlcXVlc3Q+PENhbm9uaWNhbFJlcXVlc3RCeXRlcz40NCA0NSA0YyA0NSA1NCA0NSAwYSAyZiA2MiA2YyA2ZiA2MiAyZCA2NiA2ZiA3MiAyZCA3MyA2OSA2NyA2ZSA2OSA2ZSA2NyAwYSA1OCAyZCA0MSA2ZCA3YSAyZCA0MSA2YyA2NyA2ZiA3MiA2OSA3NCA2OCA2ZCAzZCA0MSA1NyA1MyAzNCAyZCA0OCA0ZCA0MSA0MyAyZCA1MyA0OCA0MSAzMiAzNSAzNiAyNiA1OCAyZCA0MSA2ZCA3YSAyZCA0MyA3MiA2NSA2NCA2NSA2ZSA3NCA2OSA2MSA2YyAzZCA0MSA0YiA0OSA0MSA1NyA1NSA1NyA0NSA1NSA1MyA1MCA1NSA0YyA1OSA1OCAzMyA0MiA0YyAzMyA0ZCAyNSAzMiA0NiAzMiAzMCAzMiAzNiAzMCAzMyAzMSAzOSAyNSAzMiA0NiA3NSA3MyAyZCA3NyA2NSA3MyA3NCAyZCAzMSAyNSAzMiA0NiA3MyAzMyAyNSAzMiA0NiA2MSA3NyA3MyAzNCA1ZiA3MiA2NSA3MSA3NSA2NSA3MyA3NCAyNiA1OCAyZCA0MSA2ZCA3YSAyZCA0NCA2MSA3NCA2NSAzZCAzMiAzMCAzMiAzNiAzMCAzMyAzMSAzOSA1NCAzMSAzNSAzMiAzOCAzMiAzMCA1YSAyNiA1OCAyZCA0MSA2ZCA3YSAyZCA0NSA3OCA3MCA2OSA3MiA2NSA3MyAzZCAzMyAzNiAzMCAzMCAyNiA1OCAyZCA0MSA2ZCA3YSAyZCA1MyA2OSA2NyA2ZSA2NSA2NCA0OCA2NSA2MSA2NCA2NSA3MiA3MyAzZCA2OCA2ZiA3MyA3NCAyNiA3OCAyZCA2OSA2NCAzZCA1MCA3NSA3NCA0ZiA2MiA2YSA2NSA2MyA3NCAwYSA2OCA2ZiA3MyA3NCAzYSA2NyA2ZiAyZCA2MyA2YyA2ZiA3NSA2NCAyZCA3NCA2NSA3MyA3NCA2OSA2ZSA2NyAyZCAzMiAyZSA3MyAzMyAyZSA3NSA3MyAyZCA3NyA2NSA3MyA3NCAyZCAzMSAyZSA2MSA2ZCA2MSA3YSA2ZiA2ZSA2MSA3NyA3MyAyZSA2MyA2ZiA2ZCAwYSAwYSA2OCA2ZiA3MyA3NCAwYSA1NSA0ZSA1MyA0OSA0NyA0ZSA0NSA0NCAyZCA1MCA0MSA1OSA0YyA0ZiA0MSA0NDwvQ2Fub25pY2FsUmVxdWVzdEJ5dGVzPjxSZXF1ZXN0SWQ+TTFWQTgzVFBUNzM4UzVHMTwvUmVxdWVzdElkPjxIb3N0SWQ+UXpQZnp2TFVrdzdoc29KOFZpOUlYNVNkS1R0Mkswdm9nWkE1cC82VDBDdG9WVlYvcEQyazRPRXlaeEQ3NkZndkZKVk1sSW11N1h3PTwvSG9zdElkPjwvRXJyb3I+" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestUploadDownload.replay ================================================ { "Initial": "AQAAAA7hTg0IBdTDtAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "195e1b6bd4b31183", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-upload-download?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "52" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "11" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text", "BodyParts": [ "Yg0KdXAgYW5kIGRvd24NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk9KM3lsQT09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:09 GMT" ], "Etag": [ "\"1b75533ed5a869ff6f3ae0336d0c3320\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "OJ3ylA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "QGKkwH9fNkxGsPFtZUSgNQyR4roftPolF6DPedqFmeZM3pz0/O9m4E5UWIGLUjB/XXg+u7Da/Bcf7sTcCKKQt7wgcqmJq/Ru" ], "X-Amz-Request-Id": [ "1M956XFMCNDEW9R4" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "b3be35043ec79695", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-upload-download?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "11" ], "Content-Type": [ "text" ], "Date": [ "Thu, 19 Mar 2026 15:28:09 GMT" ], "Etag": [ "\"1b75533ed5a869ff6f3ae0336d0c3320\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:09 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "OJ3ylA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "k9f1pfRpDYzlpLk20yIke8I9mjEVcOMYF/RdhhyGwcyJDVUADatFUx/WtZhn4IeNSn3sG+Vtytt5RgIol/29sFGUORw+A6t1" ], "X-Amz-Request-Id": [ "1M93NXW78NBNB31R" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "dXAgYW5kIGRvd24=" } }, { "ID": "6f7824014050dcb3", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-upload-download?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "52" ], "Content-Md5": [ "G3VTPtWoaf9vOuAzbQwzIA==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "11" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text", "BodyParts": [ "Yg0KdXAgYW5kIGRvd24NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk9KM3lsQT09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:09 GMT" ], "Etag": [ "\"1b75533ed5a869ff6f3ae0336d0c3320\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "OJ3ylA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "XRqgisyBIljw23rHTVjzYsTFCPw81qs6m0uxveS86c507pdIlR1znSfRl70ublolLwpaNJNCQ39u5ZUT3Kp46ggwdIMMqMRS" ], "X-Amz-Request-Id": [ "1M9820F33X9QQ07Y" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "740e40fe7b5eccab", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-upload-download", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "11" ], "Content-Type": [ "text" ], "Date": [ "Thu, 19 Mar 2026 15:28:09 GMT" ], "Etag": [ "\"1b75533ed5a869ff6f3ae0336d0c3320\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:09 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "uJ69Kdg2aM4/n6yqbfV92rWOaO70rFMPgQcj658WilzPlskGWw3EZPFKkKndPHGLqDR2IK8HWFgdpPlwDomwGJsdQXa5Ntrg" ], "X-Amz-Request-Id": [ "1M9FRXEMNVS7SK4E" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "a748bd1026ce96ac", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-upload-download?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:09 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "N2WELNb6lXDzC5mhmapwfjFYuY6hDDmKxPx0sKrS467SdUWcGz4pXL0c3/Wf8pS5YmkeX6hwshKZdePwAQUoTTmLELYD9cr9" ], "X-Amz-Request-Id": [ "1M91RFZFY00XWQEV" ] }, "Body": "" } }, { "ID": "b238b44e5b5968b5", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-upload-download", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:07 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "5etE8Gbe7dooTwvVSv2LqhFaIQUh7TPN+yE5xBRb8gl6q7j4/noWBikpYzTJLidBLl47sDruJXACWCtOwEarP1X85SYp1EMN" ], "X-Amz-Request-Id": [ "1M9AFCQWWF4VQDBK" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestWrite/ContentType_is_discovered_if_not_provided.replay ================================================ { "Initial": "AQAAAA7hTg0DDzyx0AAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "fa77c8db71858305", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "6398" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "6354" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/html", "BodyParts": [ "MThkMg0KPCFET0NUWVBFIGh0bWw+PGh0bWwgbGFuZz0iZW4iPgo8aGVhZCBwcm9maWxlPSJodHRwOi8vYTkuY29tLy0vc3BlYy9vcGVuc2VhcmNoLzEuMS8iPgogIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgPGxpbmsgaHJlZj0iLy0vYm9vdHN0cmFwLm1pbi5jc3M/dj04YmVjMWJiYTNlMjNlY2JhMjJjZmZiMTk3YTJkNDQwYWY0MTBiMTVkIiByZWw9InN0eWxlc2hlZXQiPgogIDxsaW5rIGhyZWY9Ii8tL3NpdGUuY3NzP3Y9N2Q4MWY0MTA0Yzg5ZGJlMzc2MzQ1ZjZiZmUzZTYyYjRlNDBkM2QwNiIgcmVsPSJzdHlsZXNoZWV0Ij4KICA8dGl0bGU+R29Eb2M8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5Pgo8bmF2IGNsYXNzPSJuYXZiYXIgbmF2YmFyLWRlZmF1bHQiIHJvbGU9Im5hdmlnYXRpb24iPgogIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgPGRpdiBjbGFzcz0ibmF2YmFyLWhlYWRlciI+CiAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Im5hdmJhci10b2dnbGUiIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSIgZGF0YS10YXJnZXQ9Ii5uYXZiYXItY29sbGFwc2UiPgogICAgICA8c3BhbiBjbGFzcz0ic3Itb25seSI+VG9nZ2xlIG5hdmlnYXRpb248L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iaWNvbi1iYXIiPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9Imljb24tYmFyIj48L3NwYW4+CiAgICA8L2J1dHRvbj4KICAgIDxhIGNsYXNzPSJuYXZiYXItYnJhbmQiIGhyZWY9Ii8iPjxzdHJvbmc+R29Eb2M8L3N0cm9uZz48L2E+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlIj4KICAgIDx1bCBjbGFzcz0ibmF2IG5hdmJhci1uYXYiPgogICAgICAgIDxsaSBjbGFzcz0iYWN0aXZlIj48YSBocmVmPSIvIj5Ib21lPC9hPjwvbGk+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dDwvYT48L2xpPgogICAgPC91bD4KICAgIDxmb3JtIGNsYXNzPSJuYXZiYXItbmF2IG5hdmJhci1mb3JtIG5hdmJhci1yaWdodCIgaWQ9Ingtc2VhcmNoIiBhY3Rpb249Ii8iIHJvbGU9InNlYXJjaCI+PGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJ4LXNlYXJjaC1xdWVyeSIgdHlwZT0idGV4dCIgbmFtZT0icSIgcGxhY2Vob2xkZXI9IlNlYXJjaCI+PC9mb3JtPgogIDwvZGl2Pgo8L2Rpdj4KPC9uYXY+CjxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgCjxkaXYgY2xhc3M9Imp1bWJvdHJvbiI+CiAgICA8aDI+U2VhcmNoIGZvciBHbyBQYWNrYWdlczwvaDI+CiAgICAKICA8Zm9ybT4KICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5hbWU9InEiIGF1dG9mb2N1cz0iYXV0b2ZvY3VzIiB2YWx1ZT0iIiBwbGFjZWhvbGRlcj0iU2VhcmNoIGZvciBwYWNrYWdlIGJ5IGltcG9ydCBwYXRoIG9yIGtleXdvcmQuIiB0eXBlPSJ0ZXh0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImlucHV0LWdyb3VwLWJ0biI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IiB0eXBlPSJzdWJtaXQiPkdvITwvYnV0dG9uPgogICAgICA8L3NwYW4+CiAgICA8L2Rpdj4KICA8L2Zvcm0+Cgo8L2Rpdj4KCjxwPkdvRG9jIGhvc3RzIGRvY3VtZW50YXRpb24gZm9yIDxhIGhyZWY9Imh0dHA6Ly9nb2xhbmcub3JnLyI+R288L2E+IHBhY2thZ2VzCm9uIEJpdGJ1Y2tldCwgR2l0SHViLCBHb29nbGUgUHJvamVjdCBIb3N0aW5nIGFuZCBMYXVuY2hwYWQuICBSZWFkIHRoZSA8YQogIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dCBQYWdlPC9hPiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYWRkaW5nIHBhY2thZ2VzIHRvIEdvRG9jCmFuZCBtb3JlLgoKPGRpdiBjbGFzcz0icm93Ij4KICA8ZGl2IGNsYXNzPSJjb2wtc20tNiI+CiAgICAKICAgICAgPGg0PlBvcHVsYXIgUGFja2FnZXM8L2g0PgogICAgICA8dWwgY2xhc3M9Imxpc3QtdW5zdHlsZWQiPgogICAgICAgIDxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1nby9hd3MiPmdpdGh1Yi5jb20vYXdzL2F3cy1zZGstZ28vYXdzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9kZ3JpamFsdmEvand0LWdvIj5naXRodWIuY29tL2RncmlqYWx2YS9qd3QtZ288L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dpbi1nb25pYy9naW4iPmdpdGh1Yi5jb20vZ2luLWdvbmljL2dpbjwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXMiPmdpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dvLXNxbC1kcml2ZXIvbXlzcWwiPmdpdGh1Yi5jb20vZ28tc3FsLWRyaXZlci9teXNxbDwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29sYW5nL3Byb3RvYnVmL3Byb3RvIj5naXRodWIuY29tL2dvbGFuZy9wcm90b2J1Zi9wcm90bzwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29tb2R1bGUvcmVkaWdvL3JlZGlzIj5naXRodWIuY29tL2dvbW9kdWxlL3JlZGlnby9yZWRpczwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQiPmdpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQ8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltIj5naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9qaW56aHUvZ29ybSI+Z2l0aHViLmNvbS9qaW56aHUvZ29ybTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vbGliL3BxIj5naXRodWIuY29tL2xpYi9wcTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcGtnL2Vycm9ycyI+Z2l0aHViLmNvbS9wa2cvZXJyb3JzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1cyI+Z2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1czwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcm9iZmlnL2Nyb24iPmdpdGh1Yi5jb20vcm9iZmlnL2Nyb248L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3NpcnVwc2VuL2xvZ3J1cyI+Z2l0aHViLmNvbS9zaXJ1cHNlbi9sb2dydXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0Ij5naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0PC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS91bml4cGlja2xlL2thaG9vdC1oYWNrIj5naXRodWIuY29tL3VuaXhwaWNrbGUva2Fob290LWhhY2s8L2E+PGxpPjxhIGhyZWY9Ii9nby51YmVyLm9yZy96YXAiPmdvLnViZXIub3JnL3phcDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9jcnlwdG8vc3NoIj5nb2xhbmcub3JnL3gvY3J5cHRvL3NzaDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9uZXQvY29udGV4dCI+Z29sYW5nLm9yZy94L25ldC9jb250ZXh0PC9hPjxsaT48YSBocmVmPSIvZ29sYW5nLm9yZy94L29hdXRoMiI+Z29sYW5nLm9yZy94L29hdXRoMjwvYT48bGk+PGEgaHJlZj0iL2dvb2dsZS5nb2xhbmcub3JnL2dycGMiPmdvb2dsZS5nb2xhbmcub3JnL2dycGM8L2E+PGxpPjxhIGhyZWY9Ii9nb3BrZy5pbi9tZ28udjIiPmdvcGtnLmluL21nby52MjwvYT48bGk+PGEgaHJlZj0iL2dvcGtnLmluL3lhbWwudjIiPmdvcGtnLmluL3lhbWwudjI8L2E+PGxpPjxhIGhyZWY9Ii9sYWJpeC5vcmcvdjIvbWdvIj5sYWJpeC5vcmcvdjIvbWdvPC9hPgogICAgICA8L3VsPgogICAgCiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sLXNtLTYiPgogICAgPGg0Pk1vcmUgUGFja2FnZXM8L2g0PgogICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIj4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL2dvIj5HbyBTdGFuZGFyZCBQYWNrYWdlczwvYT4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL3N1YnJlcG8iPkdvIFN1Yi1yZXBvc2l0b3J5IFBhY2thZ2VzPC9hPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9nb2xhbmcub3JnL3dpa2kvUHJvamVjdHMiPlByb2plY3RzIEAgZ28td2lraTwvYT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zZWFyY2g/bz1kZXNjJmFtcDtxPWxhbmd1YWdlJTNBZ28mYW1wO3M9c3RhcnMmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5Nb3N0IHN0YXJzPC9hPiwgCiAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NlYXJjaD9vPWRlc2MmYW1wO3E9bGFuZ3VhZ2UlM0FnbyZhbXA7cz1mb3JrcyZhbXA7dHlwZT1SZXBvc2l0b3JpZXMiPm1vc3QgZm9ya3M8L2E+LCAKICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2VhcmNoP289ZGVzYyZhbXA7cT1sYW5ndWFnZSUzQWdvJmFtcDtzPXVwZGF0ZWQmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5yZWNlbnRseSB1cGRhdGVkPC9hPiBvbiBHaXRIdWIKICAgIDwvdWw+CiAgPC9kaXY+CjwvZGl2PgoKCjwvZGl2Pgo8ZGl2IGlkPSJ4LWZvb3RlciIgY2xhc3M9ImNsZWFyZml4Ij4KICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2dvbGFuZy9nZGRvL2lzc3VlcyI+V2Vic2l0ZSBJc3N1ZXM8L2E+CiAgICA8c3BhbiBjbGFzcz0idGV4dC1tdXRlZCI+fDwvc3Bhbj4gPGEgaHJlZj0iaHR0cDovL2dvbGFuZy5vcmcvIj5HbyBMYW5ndWFnZTwvYT4KICAgIDxzcGFuIGNsYXNzPSJwdWxsLXJpZ2h0Ij48YSBocmVmPSIjIj5CYWNrIHRvIHRvcDwvYT48L3NwYW4+CiAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ieC1zaG9ydGN1dHMiIHRhYmluZGV4PSItMSIgY2xhc3M9Im1vZGFsIj4KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+CiAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvYnV0dG9uPgogICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+S2V5Ym9hcmQgc2hvcnRjdXRzPC9oND4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4/PC9iPjwvdGQ+PHRkPiA6IFRoaXMgbWVudTwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4vPC9iPjwvdGQ+PHRkPiA6IFNlYXJjaCBzaXRlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5mPC9iPjwvdGQ+PHRkPiA6IEp1bXAgdG8gaWRlbnRpZmllcjwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmc8L2I+PC90ZD48dGQ+IDogR28gdG8gdG9wIG9mIHBhZ2U8L3RkPjwvdHI+CiAgICAgICAgICA8dHI+PHRkIGFsaWduPSJyaWdodCI+PGI+ZzwvYj4gdGhlbiA8Yj5iPC9iPjwvdGQ+PHRkPiA6IEdvIHRvIGVuZCBvZiBwYWdlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmk8L2I+PC90ZD48dGQ+IDogR28gdG8gaW5kZXg8L3RkPjwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9InRleHQtbXV0ZWQiPjx0ZCBhbGlnbj0icmlnaHQiPjxiPmc8L2I+IHRoZW4gPGI+ZTwvYj48L3RkPjx0ZD4gOiBHbyB0byBleGFtcGxlczwvdGQ+PC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KPHNjcmlwdCBzcmM9Ii8tL2pxdWVyeS0yLjAuMy5taW4uanM/dj1mYmY5Yzc3ZDBjNGUzYzM0YTQ4NTk4MGMxZTUzMTZiNjIxMjE2MGM4Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL2Jvb3RzdHJhcC5taW4uanM/dj01YWRhN2MxMDNmYzFkZWFiYzkyNWNjMWZkYmJiNmU0NTFjMjFmYzcwIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL3NpdGUuanM/dj0zNzFkZTczMWMxOGQ5MWM0OTlkOTBiMWFiMGJmMzllY2Y2NmQ2Y2Y3Ij48L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+DQowDQp4LWFtei1jaGVja3N1bS1jcmMzMjplQ01DcWc9PQ0KDQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:04 GMT" ], "Etag": [ "\"0f6a7c9ff3d3d770b8f7fa19c2ae19d0\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "eCMCqg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "H+piY6SlgTGxQsQWMLsT1Whi9Mt4AP8Y0C18VWmcb0nC3/r7UqFT9GG4UkD636jMjNYNYcm1Bq57fqEfjI8QFcWf335GIZvE" ], "X-Amz-Request-Id": [ "DMNRZ1WCEG6SPWNS" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "9f297d16afcfd2df", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "6354" ], "Content-Type": [ "text/html; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:04 GMT" ], "Etag": [ "\"0f6a7c9ff3d3d770b8f7fa19c2ae19d0\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:04 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "eCMCqg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "tNHQ2xK+7m3hebNv83xyikJxYemVOM6mb4FkqIvzY6W3S7Uc0k0blLVZokHeLXcaBftTYRd+EodWsRpckN20a4SxyVjxg0pI" ], "X-Amz-Request-Id": [ "DMNRJ7Y8BNQ37SMB" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PCFET0NUWVBFIGh0bWw+PGh0bWwgbGFuZz0iZW4iPgo8aGVhZCBwcm9maWxlPSJodHRwOi8vYTkuY29tLy0vc3BlYy9vcGVuc2VhcmNoLzEuMS8iPgogIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgPGxpbmsgaHJlZj0iLy0vYm9vdHN0cmFwLm1pbi5jc3M/dj04YmVjMWJiYTNlMjNlY2JhMjJjZmZiMTk3YTJkNDQwYWY0MTBiMTVkIiByZWw9InN0eWxlc2hlZXQiPgogIDxsaW5rIGhyZWY9Ii8tL3NpdGUuY3NzP3Y9N2Q4MWY0MTA0Yzg5ZGJlMzc2MzQ1ZjZiZmUzZTYyYjRlNDBkM2QwNiIgcmVsPSJzdHlsZXNoZWV0Ij4KICA8dGl0bGU+R29Eb2M8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5Pgo8bmF2IGNsYXNzPSJuYXZiYXIgbmF2YmFyLWRlZmF1bHQiIHJvbGU9Im5hdmlnYXRpb24iPgogIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgPGRpdiBjbGFzcz0ibmF2YmFyLWhlYWRlciI+CiAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Im5hdmJhci10b2dnbGUiIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSIgZGF0YS10YXJnZXQ9Ii5uYXZiYXItY29sbGFwc2UiPgogICAgICA8c3BhbiBjbGFzcz0ic3Itb25seSI+VG9nZ2xlIG5hdmlnYXRpb248L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iaWNvbi1iYXIiPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9Imljb24tYmFyIj48L3NwYW4+CiAgICA8L2J1dHRvbj4KICAgIDxhIGNsYXNzPSJuYXZiYXItYnJhbmQiIGhyZWY9Ii8iPjxzdHJvbmc+R29Eb2M8L3N0cm9uZz48L2E+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlIj4KICAgIDx1bCBjbGFzcz0ibmF2IG5hdmJhci1uYXYiPgogICAgICAgIDxsaSBjbGFzcz0iYWN0aXZlIj48YSBocmVmPSIvIj5Ib21lPC9hPjwvbGk+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dDwvYT48L2xpPgogICAgPC91bD4KICAgIDxmb3JtIGNsYXNzPSJuYXZiYXItbmF2IG5hdmJhci1mb3JtIG5hdmJhci1yaWdodCIgaWQ9Ingtc2VhcmNoIiBhY3Rpb249Ii8iIHJvbGU9InNlYXJjaCI+PGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJ4LXNlYXJjaC1xdWVyeSIgdHlwZT0idGV4dCIgbmFtZT0icSIgcGxhY2Vob2xkZXI9IlNlYXJjaCI+PC9mb3JtPgogIDwvZGl2Pgo8L2Rpdj4KPC9uYXY+CjxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgCjxkaXYgY2xhc3M9Imp1bWJvdHJvbiI+CiAgICA8aDI+U2VhcmNoIGZvciBHbyBQYWNrYWdlczwvaDI+CiAgICAKICA8Zm9ybT4KICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5hbWU9InEiIGF1dG9mb2N1cz0iYXV0b2ZvY3VzIiB2YWx1ZT0iIiBwbGFjZWhvbGRlcj0iU2VhcmNoIGZvciBwYWNrYWdlIGJ5IGltcG9ydCBwYXRoIG9yIGtleXdvcmQuIiB0eXBlPSJ0ZXh0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImlucHV0LWdyb3VwLWJ0biI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IiB0eXBlPSJzdWJtaXQiPkdvITwvYnV0dG9uPgogICAgICA8L3NwYW4+CiAgICA8L2Rpdj4KICA8L2Zvcm0+Cgo8L2Rpdj4KCjxwPkdvRG9jIGhvc3RzIGRvY3VtZW50YXRpb24gZm9yIDxhIGhyZWY9Imh0dHA6Ly9nb2xhbmcub3JnLyI+R288L2E+IHBhY2thZ2VzCm9uIEJpdGJ1Y2tldCwgR2l0SHViLCBHb29nbGUgUHJvamVjdCBIb3N0aW5nIGFuZCBMYXVuY2hwYWQuICBSZWFkIHRoZSA8YQogIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dCBQYWdlPC9hPiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYWRkaW5nIHBhY2thZ2VzIHRvIEdvRG9jCmFuZCBtb3JlLgoKPGRpdiBjbGFzcz0icm93Ij4KICA8ZGl2IGNsYXNzPSJjb2wtc20tNiI+CiAgICAKICAgICAgPGg0PlBvcHVsYXIgUGFja2FnZXM8L2g0PgogICAgICA8dWwgY2xhc3M9Imxpc3QtdW5zdHlsZWQiPgogICAgICAgIDxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1nby9hd3MiPmdpdGh1Yi5jb20vYXdzL2F3cy1zZGstZ28vYXdzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9kZ3JpamFsdmEvand0LWdvIj5naXRodWIuY29tL2RncmlqYWx2YS9qd3QtZ288L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dpbi1nb25pYy9naW4iPmdpdGh1Yi5jb20vZ2luLWdvbmljL2dpbjwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXMiPmdpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dvLXNxbC1kcml2ZXIvbXlzcWwiPmdpdGh1Yi5jb20vZ28tc3FsLWRyaXZlci9teXNxbDwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29sYW5nL3Byb3RvYnVmL3Byb3RvIj5naXRodWIuY29tL2dvbGFuZy9wcm90b2J1Zi9wcm90bzwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29tb2R1bGUvcmVkaWdvL3JlZGlzIj5naXRodWIuY29tL2dvbW9kdWxlL3JlZGlnby9yZWRpczwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQiPmdpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQ8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltIj5naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9qaW56aHUvZ29ybSI+Z2l0aHViLmNvbS9qaW56aHUvZ29ybTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vbGliL3BxIj5naXRodWIuY29tL2xpYi9wcTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcGtnL2Vycm9ycyI+Z2l0aHViLmNvbS9wa2cvZXJyb3JzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1cyI+Z2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1czwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcm9iZmlnL2Nyb24iPmdpdGh1Yi5jb20vcm9iZmlnL2Nyb248L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3NpcnVwc2VuL2xvZ3J1cyI+Z2l0aHViLmNvbS9zaXJ1cHNlbi9sb2dydXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0Ij5naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0PC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS91bml4cGlja2xlL2thaG9vdC1oYWNrIj5naXRodWIuY29tL3VuaXhwaWNrbGUva2Fob290LWhhY2s8L2E+PGxpPjxhIGhyZWY9Ii9nby51YmVyLm9yZy96YXAiPmdvLnViZXIub3JnL3phcDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9jcnlwdG8vc3NoIj5nb2xhbmcub3JnL3gvY3J5cHRvL3NzaDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9uZXQvY29udGV4dCI+Z29sYW5nLm9yZy94L25ldC9jb250ZXh0PC9hPjxsaT48YSBocmVmPSIvZ29sYW5nLm9yZy94L29hdXRoMiI+Z29sYW5nLm9yZy94L29hdXRoMjwvYT48bGk+PGEgaHJlZj0iL2dvb2dsZS5nb2xhbmcub3JnL2dycGMiPmdvb2dsZS5nb2xhbmcub3JnL2dycGM8L2E+PGxpPjxhIGhyZWY9Ii9nb3BrZy5pbi9tZ28udjIiPmdvcGtnLmluL21nby52MjwvYT48bGk+PGEgaHJlZj0iL2dvcGtnLmluL3lhbWwudjIiPmdvcGtnLmluL3lhbWwudjI8L2E+PGxpPjxhIGhyZWY9Ii9sYWJpeC5vcmcvdjIvbWdvIj5sYWJpeC5vcmcvdjIvbWdvPC9hPgogICAgICA8L3VsPgogICAgCiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sLXNtLTYiPgogICAgPGg0Pk1vcmUgUGFja2FnZXM8L2g0PgogICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIj4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL2dvIj5HbyBTdGFuZGFyZCBQYWNrYWdlczwvYT4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL3N1YnJlcG8iPkdvIFN1Yi1yZXBvc2l0b3J5IFBhY2thZ2VzPC9hPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9nb2xhbmcub3JnL3dpa2kvUHJvamVjdHMiPlByb2plY3RzIEAgZ28td2lraTwvYT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zZWFyY2g/bz1kZXNjJmFtcDtxPWxhbmd1YWdlJTNBZ28mYW1wO3M9c3RhcnMmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5Nb3N0IHN0YXJzPC9hPiwgCiAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NlYXJjaD9vPWRlc2MmYW1wO3E9bGFuZ3VhZ2UlM0FnbyZhbXA7cz1mb3JrcyZhbXA7dHlwZT1SZXBvc2l0b3JpZXMiPm1vc3QgZm9ya3M8L2E+LCAKICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2VhcmNoP289ZGVzYyZhbXA7cT1sYW5ndWFnZSUzQWdvJmFtcDtzPXVwZGF0ZWQmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5yZWNlbnRseSB1cGRhdGVkPC9hPiBvbiBHaXRIdWIKICAgIDwvdWw+CiAgPC9kaXY+CjwvZGl2PgoKCjwvZGl2Pgo8ZGl2IGlkPSJ4LWZvb3RlciIgY2xhc3M9ImNsZWFyZml4Ij4KICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2dvbGFuZy9nZGRvL2lzc3VlcyI+V2Vic2l0ZSBJc3N1ZXM8L2E+CiAgICA8c3BhbiBjbGFzcz0idGV4dC1tdXRlZCI+fDwvc3Bhbj4gPGEgaHJlZj0iaHR0cDovL2dvbGFuZy5vcmcvIj5HbyBMYW5ndWFnZTwvYT4KICAgIDxzcGFuIGNsYXNzPSJwdWxsLXJpZ2h0Ij48YSBocmVmPSIjIj5CYWNrIHRvIHRvcDwvYT48L3NwYW4+CiAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ieC1zaG9ydGN1dHMiIHRhYmluZGV4PSItMSIgY2xhc3M9Im1vZGFsIj4KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+CiAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvYnV0dG9uPgogICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+S2V5Ym9hcmQgc2hvcnRjdXRzPC9oND4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4/PC9iPjwvdGQ+PHRkPiA6IFRoaXMgbWVudTwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4vPC9iPjwvdGQ+PHRkPiA6IFNlYXJjaCBzaXRlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5mPC9iPjwvdGQ+PHRkPiA6IEp1bXAgdG8gaWRlbnRpZmllcjwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmc8L2I+PC90ZD48dGQ+IDogR28gdG8gdG9wIG9mIHBhZ2U8L3RkPjwvdHI+CiAgICAgICAgICA8dHI+PHRkIGFsaWduPSJyaWdodCI+PGI+ZzwvYj4gdGhlbiA8Yj5iPC9iPjwvdGQ+PHRkPiA6IEdvIHRvIGVuZCBvZiBwYWdlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmk8L2I+PC90ZD48dGQ+IDogR28gdG8gaW5kZXg8L3RkPjwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9InRleHQtbXV0ZWQiPjx0ZCBhbGlnbj0icmlnaHQiPjxiPmc8L2I+IHRoZW4gPGI+ZTwvYj48L3RkPjx0ZD4gOiBHbyB0byBleGFtcGxlczwvdGQ+PC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KPHNjcmlwdCBzcmM9Ii8tL2pxdWVyeS0yLjAuMy5taW4uanM/dj1mYmY5Yzc3ZDBjNGUzYzM0YTQ4NTk4MGMxZTUzMTZiNjIxMjE2MGM4Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL2Jvb3RzdHJhcC5taW4uanM/dj01YWRhN2MxMDNmYzFkZWFiYzkyNWNjMWZkYmJiNmU0NTFjMjFmYzcwIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL3NpdGUuanM/dj0zNzFkZTczMWMxOGQ5MWM0OTlkOTBiMWFiMGJmMzllY2Y2NmQ2Y2Y3Ij48L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+" } }, { "ID": "89627495bd334977", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "6354" ], "Content-Type": [ "text/html; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:04 GMT" ], "Etag": [ "\"0f6a7c9ff3d3d770b8f7fa19c2ae19d0\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:04 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "5njE1t3Gzycp7UAbJMzTvyD/BNqOWfh6M17fuypssaWmKgEIItkaGf9qRUSQkeZjEqIRrj8y7KUngbMNga5E4LMT8pQY2kzL" ], "X-Amz-Request-Id": [ "DMNY5WZC3B08F4KZ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "bc3a6b900d8205b8", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "6354" ], "Content-Type": [ "text/html; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:04 GMT" ], "Etag": [ "\"0f6a7c9ff3d3d770b8f7fa19c2ae19d0\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:04 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "B75G4FUWZuC9nxkF+tc7MaJQEvcvoK4XBAjPccSOiH+3iLO9t3OjcVXQ9kpmx/AbtVyuAw270zFNTuI8RrioFouosEPmK6ps" ], "X-Amz-Request-Id": [ "DMNXVMV7FBSBTQ0K" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "1dbdf0cd3d5352eb", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:04 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "HRlcS6TOIRpgwSjPbDN80KROLQwQXU0L4FZXUPPcrTMbUuo6hCLO0Q+3ubLjpOJBjDBNdwYz+RizqdD+PrQjP8r6viCh9hgW" ], "X-Amz-Request-Id": [ "DMNNG2NYY5V2X0BQ" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestWrite/ContentType_is_left_empty_if_not_provided_and_DisableContentTypeDetection_is_true.replay ================================================ { "Initial": "AQAAAA7hTg0DH/Ba7gAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "dc6fe6dc2aa7990e", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "6398" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "6354" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "", "BodyParts": [ "MThkMg0KPCFET0NUWVBFIGh0bWw+PGh0bWwgbGFuZz0iZW4iPgo8aGVhZCBwcm9maWxlPSJodHRwOi8vYTkuY29tLy0vc3BlYy9vcGVuc2VhcmNoLzEuMS8iPgogIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgPGxpbmsgaHJlZj0iLy0vYm9vdHN0cmFwLm1pbi5jc3M/dj04YmVjMWJiYTNlMjNlY2JhMjJjZmZiMTk3YTJkNDQwYWY0MTBiMTVkIiByZWw9InN0eWxlc2hlZXQiPgogIDxsaW5rIGhyZWY9Ii8tL3NpdGUuY3NzP3Y9N2Q4MWY0MTA0Yzg5ZGJlMzc2MzQ1ZjZiZmUzZTYyYjRlNDBkM2QwNiIgcmVsPSJzdHlsZXNoZWV0Ij4KICA8dGl0bGU+R29Eb2M8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5Pgo8bmF2IGNsYXNzPSJuYXZiYXIgbmF2YmFyLWRlZmF1bHQiIHJvbGU9Im5hdmlnYXRpb24iPgogIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgPGRpdiBjbGFzcz0ibmF2YmFyLWhlYWRlciI+CiAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Im5hdmJhci10b2dnbGUiIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSIgZGF0YS10YXJnZXQ9Ii5uYXZiYXItY29sbGFwc2UiPgogICAgICA8c3BhbiBjbGFzcz0ic3Itb25seSI+VG9nZ2xlIG5hdmlnYXRpb248L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iaWNvbi1iYXIiPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9Imljb24tYmFyIj48L3NwYW4+CiAgICA8L2J1dHRvbj4KICAgIDxhIGNsYXNzPSJuYXZiYXItYnJhbmQiIGhyZWY9Ii8iPjxzdHJvbmc+R29Eb2M8L3N0cm9uZz48L2E+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlIj4KICAgIDx1bCBjbGFzcz0ibmF2IG5hdmJhci1uYXYiPgogICAgICAgIDxsaSBjbGFzcz0iYWN0aXZlIj48YSBocmVmPSIvIj5Ib21lPC9hPjwvbGk+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dDwvYT48L2xpPgogICAgPC91bD4KICAgIDxmb3JtIGNsYXNzPSJuYXZiYXItbmF2IG5hdmJhci1mb3JtIG5hdmJhci1yaWdodCIgaWQ9Ingtc2VhcmNoIiBhY3Rpb249Ii8iIHJvbGU9InNlYXJjaCI+PGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJ4LXNlYXJjaC1xdWVyeSIgdHlwZT0idGV4dCIgbmFtZT0icSIgcGxhY2Vob2xkZXI9IlNlYXJjaCI+PC9mb3JtPgogIDwvZGl2Pgo8L2Rpdj4KPC9uYXY+CjxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgCjxkaXYgY2xhc3M9Imp1bWJvdHJvbiI+CiAgICA8aDI+U2VhcmNoIGZvciBHbyBQYWNrYWdlczwvaDI+CiAgICAKICA8Zm9ybT4KICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5hbWU9InEiIGF1dG9mb2N1cz0iYXV0b2ZvY3VzIiB2YWx1ZT0iIiBwbGFjZWhvbGRlcj0iU2VhcmNoIGZvciBwYWNrYWdlIGJ5IGltcG9ydCBwYXRoIG9yIGtleXdvcmQuIiB0eXBlPSJ0ZXh0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImlucHV0LWdyb3VwLWJ0biI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IiB0eXBlPSJzdWJtaXQiPkdvITwvYnV0dG9uPgogICAgICA8L3NwYW4+CiAgICA8L2Rpdj4KICA8L2Zvcm0+Cgo8L2Rpdj4KCjxwPkdvRG9jIGhvc3RzIGRvY3VtZW50YXRpb24gZm9yIDxhIGhyZWY9Imh0dHA6Ly9nb2xhbmcub3JnLyI+R288L2E+IHBhY2thZ2VzCm9uIEJpdGJ1Y2tldCwgR2l0SHViLCBHb29nbGUgUHJvamVjdCBIb3N0aW5nIGFuZCBMYXVuY2hwYWQuICBSZWFkIHRoZSA8YQogIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dCBQYWdlPC9hPiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYWRkaW5nIHBhY2thZ2VzIHRvIEdvRG9jCmFuZCBtb3JlLgoKPGRpdiBjbGFzcz0icm93Ij4KICA8ZGl2IGNsYXNzPSJjb2wtc20tNiI+CiAgICAKICAgICAgPGg0PlBvcHVsYXIgUGFja2FnZXM8L2g0PgogICAgICA8dWwgY2xhc3M9Imxpc3QtdW5zdHlsZWQiPgogICAgICAgIDxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1nby9hd3MiPmdpdGh1Yi5jb20vYXdzL2F3cy1zZGstZ28vYXdzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9kZ3JpamFsdmEvand0LWdvIj5naXRodWIuY29tL2RncmlqYWx2YS9qd3QtZ288L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dpbi1nb25pYy9naW4iPmdpdGh1Yi5jb20vZ2luLWdvbmljL2dpbjwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXMiPmdpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dvLXNxbC1kcml2ZXIvbXlzcWwiPmdpdGh1Yi5jb20vZ28tc3FsLWRyaXZlci9teXNxbDwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29sYW5nL3Byb3RvYnVmL3Byb3RvIj5naXRodWIuY29tL2dvbGFuZy9wcm90b2J1Zi9wcm90bzwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29tb2R1bGUvcmVkaWdvL3JlZGlzIj5naXRodWIuY29tL2dvbW9kdWxlL3JlZGlnby9yZWRpczwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQiPmdpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQ8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltIj5naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9qaW56aHUvZ29ybSI+Z2l0aHViLmNvbS9qaW56aHUvZ29ybTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vbGliL3BxIj5naXRodWIuY29tL2xpYi9wcTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcGtnL2Vycm9ycyI+Z2l0aHViLmNvbS9wa2cvZXJyb3JzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1cyI+Z2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1czwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcm9iZmlnL2Nyb24iPmdpdGh1Yi5jb20vcm9iZmlnL2Nyb248L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3NpcnVwc2VuL2xvZ3J1cyI+Z2l0aHViLmNvbS9zaXJ1cHNlbi9sb2dydXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0Ij5naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0PC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS91bml4cGlja2xlL2thaG9vdC1oYWNrIj5naXRodWIuY29tL3VuaXhwaWNrbGUva2Fob290LWhhY2s8L2E+PGxpPjxhIGhyZWY9Ii9nby51YmVyLm9yZy96YXAiPmdvLnViZXIub3JnL3phcDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9jcnlwdG8vc3NoIj5nb2xhbmcub3JnL3gvY3J5cHRvL3NzaDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9uZXQvY29udGV4dCI+Z29sYW5nLm9yZy94L25ldC9jb250ZXh0PC9hPjxsaT48YSBocmVmPSIvZ29sYW5nLm9yZy94L29hdXRoMiI+Z29sYW5nLm9yZy94L29hdXRoMjwvYT48bGk+PGEgaHJlZj0iL2dvb2dsZS5nb2xhbmcub3JnL2dycGMiPmdvb2dsZS5nb2xhbmcub3JnL2dycGM8L2E+PGxpPjxhIGhyZWY9Ii9nb3BrZy5pbi9tZ28udjIiPmdvcGtnLmluL21nby52MjwvYT48bGk+PGEgaHJlZj0iL2dvcGtnLmluL3lhbWwudjIiPmdvcGtnLmluL3lhbWwudjI8L2E+PGxpPjxhIGhyZWY9Ii9sYWJpeC5vcmcvdjIvbWdvIj5sYWJpeC5vcmcvdjIvbWdvPC9hPgogICAgICA8L3VsPgogICAgCiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sLXNtLTYiPgogICAgPGg0Pk1vcmUgUGFja2FnZXM8L2g0PgogICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIj4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL2dvIj5HbyBTdGFuZGFyZCBQYWNrYWdlczwvYT4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL3N1YnJlcG8iPkdvIFN1Yi1yZXBvc2l0b3J5IFBhY2thZ2VzPC9hPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9nb2xhbmcub3JnL3dpa2kvUHJvamVjdHMiPlByb2plY3RzIEAgZ28td2lraTwvYT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zZWFyY2g/bz1kZXNjJmFtcDtxPWxhbmd1YWdlJTNBZ28mYW1wO3M9c3RhcnMmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5Nb3N0IHN0YXJzPC9hPiwgCiAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NlYXJjaD9vPWRlc2MmYW1wO3E9bGFuZ3VhZ2UlM0FnbyZhbXA7cz1mb3JrcyZhbXA7dHlwZT1SZXBvc2l0b3JpZXMiPm1vc3QgZm9ya3M8L2E+LCAKICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2VhcmNoP289ZGVzYyZhbXA7cT1sYW5ndWFnZSUzQWdvJmFtcDtzPXVwZGF0ZWQmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5yZWNlbnRseSB1cGRhdGVkPC9hPiBvbiBHaXRIdWIKICAgIDwvdWw+CiAgPC9kaXY+CjwvZGl2PgoKCjwvZGl2Pgo8ZGl2IGlkPSJ4LWZvb3RlciIgY2xhc3M9ImNsZWFyZml4Ij4KICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2dvbGFuZy9nZGRvL2lzc3VlcyI+V2Vic2l0ZSBJc3N1ZXM8L2E+CiAgICA8c3BhbiBjbGFzcz0idGV4dC1tdXRlZCI+fDwvc3Bhbj4gPGEgaHJlZj0iaHR0cDovL2dvbGFuZy5vcmcvIj5HbyBMYW5ndWFnZTwvYT4KICAgIDxzcGFuIGNsYXNzPSJwdWxsLXJpZ2h0Ij48YSBocmVmPSIjIj5CYWNrIHRvIHRvcDwvYT48L3NwYW4+CiAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ieC1zaG9ydGN1dHMiIHRhYmluZGV4PSItMSIgY2xhc3M9Im1vZGFsIj4KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+CiAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvYnV0dG9uPgogICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+S2V5Ym9hcmQgc2hvcnRjdXRzPC9oND4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4/PC9iPjwvdGQ+PHRkPiA6IFRoaXMgbWVudTwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4vPC9iPjwvdGQ+PHRkPiA6IFNlYXJjaCBzaXRlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5mPC9iPjwvdGQ+PHRkPiA6IEp1bXAgdG8gaWRlbnRpZmllcjwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmc8L2I+PC90ZD48dGQ+IDogR28gdG8gdG9wIG9mIHBhZ2U8L3RkPjwvdHI+CiAgICAgICAgICA8dHI+PHRkIGFsaWduPSJyaWdodCI+PGI+ZzwvYj4gdGhlbiA8Yj5iPC9iPjwvdGQ+PHRkPiA6IEdvIHRvIGVuZCBvZiBwYWdlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmk8L2I+PC90ZD48dGQ+IDogR28gdG8gaW5kZXg8L3RkPjwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9InRleHQtbXV0ZWQiPjx0ZCBhbGlnbj0icmlnaHQiPjxiPmc8L2I+IHRoZW4gPGI+ZTwvYj48L3RkPjx0ZD4gOiBHbyB0byBleGFtcGxlczwvdGQ+PC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KPHNjcmlwdCBzcmM9Ii8tL2pxdWVyeS0yLjAuMy5taW4uanM/dj1mYmY5Yzc3ZDBjNGUzYzM0YTQ4NTk4MGMxZTUzMTZiNjIxMjE2MGM4Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL2Jvb3RzdHJhcC5taW4uanM/dj01YWRhN2MxMDNmYzFkZWFiYzkyNWNjMWZkYmJiNmU0NTFjMjFmYzcwIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL3NpdGUuanM/dj0zNzFkZTczMWMxOGQ5MWM0OTlkOTBiMWFiMGJmMzllY2Y2NmQ2Y2Y3Ij48L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+DQowDQp4LWFtei1jaGVja3N1bS1jcmMzMjplQ01DcWc9PQ0KDQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:04 GMT" ], "Etag": [ "\"0f6a7c9ff3d3d770b8f7fa19c2ae19d0\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "eCMCqg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "rjjAcqavVyY0k8GsIw28m07DBQ4O6iT5nJo9IfXaJaN+jyGE+p1mujhxecpvhf/BokU+APgC4OI=" ], "X-Amz-Request-Id": [ "DMNWB00TRVRDSSG2" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "4e26ab3234338270", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "6354" ], "Content-Type": [ "" ], "Date": [ "Thu, 19 Mar 2026 15:28:04 GMT" ], "Etag": [ "\"0f6a7c9ff3d3d770b8f7fa19c2ae19d0\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:04 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "eCMCqg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "kzWtWmLIHLU6EhkwUCMzwuTKzihQbMZN5Zb53x4Lqwz64jb7w2LQ2eCNrX2UximHpxtaGi++wqE=" ], "X-Amz-Request-Id": [ "DMNZFPB45EZYZRC6" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PCFET0NUWVBFIGh0bWw+PGh0bWwgbGFuZz0iZW4iPgo8aGVhZCBwcm9maWxlPSJodHRwOi8vYTkuY29tLy0vc3BlYy9vcGVuc2VhcmNoLzEuMS8iPgogIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgPGxpbmsgaHJlZj0iLy0vYm9vdHN0cmFwLm1pbi5jc3M/dj04YmVjMWJiYTNlMjNlY2JhMjJjZmZiMTk3YTJkNDQwYWY0MTBiMTVkIiByZWw9InN0eWxlc2hlZXQiPgogIDxsaW5rIGhyZWY9Ii8tL3NpdGUuY3NzP3Y9N2Q4MWY0MTA0Yzg5ZGJlMzc2MzQ1ZjZiZmUzZTYyYjRlNDBkM2QwNiIgcmVsPSJzdHlsZXNoZWV0Ij4KICA8dGl0bGU+R29Eb2M8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5Pgo8bmF2IGNsYXNzPSJuYXZiYXIgbmF2YmFyLWRlZmF1bHQiIHJvbGU9Im5hdmlnYXRpb24iPgogIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgPGRpdiBjbGFzcz0ibmF2YmFyLWhlYWRlciI+CiAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Im5hdmJhci10b2dnbGUiIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSIgZGF0YS10YXJnZXQ9Ii5uYXZiYXItY29sbGFwc2UiPgogICAgICA8c3BhbiBjbGFzcz0ic3Itb25seSI+VG9nZ2xlIG5hdmlnYXRpb248L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iaWNvbi1iYXIiPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9Imljb24tYmFyIj48L3NwYW4+CiAgICA8L2J1dHRvbj4KICAgIDxhIGNsYXNzPSJuYXZiYXItYnJhbmQiIGhyZWY9Ii8iPjxzdHJvbmc+R29Eb2M8L3N0cm9uZz48L2E+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlIj4KICAgIDx1bCBjbGFzcz0ibmF2IG5hdmJhci1uYXYiPgogICAgICAgIDxsaSBjbGFzcz0iYWN0aXZlIj48YSBocmVmPSIvIj5Ib21lPC9hPjwvbGk+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dDwvYT48L2xpPgogICAgPC91bD4KICAgIDxmb3JtIGNsYXNzPSJuYXZiYXItbmF2IG5hdmJhci1mb3JtIG5hdmJhci1yaWdodCIgaWQ9Ingtc2VhcmNoIiBhY3Rpb249Ii8iIHJvbGU9InNlYXJjaCI+PGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJ4LXNlYXJjaC1xdWVyeSIgdHlwZT0idGV4dCIgbmFtZT0icSIgcGxhY2Vob2xkZXI9IlNlYXJjaCI+PC9mb3JtPgogIDwvZGl2Pgo8L2Rpdj4KPC9uYXY+CjxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgCjxkaXYgY2xhc3M9Imp1bWJvdHJvbiI+CiAgICA8aDI+U2VhcmNoIGZvciBHbyBQYWNrYWdlczwvaDI+CiAgICAKICA8Zm9ybT4KICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5hbWU9InEiIGF1dG9mb2N1cz0iYXV0b2ZvY3VzIiB2YWx1ZT0iIiBwbGFjZWhvbGRlcj0iU2VhcmNoIGZvciBwYWNrYWdlIGJ5IGltcG9ydCBwYXRoIG9yIGtleXdvcmQuIiB0eXBlPSJ0ZXh0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImlucHV0LWdyb3VwLWJ0biI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IiB0eXBlPSJzdWJtaXQiPkdvITwvYnV0dG9uPgogICAgICA8L3NwYW4+CiAgICA8L2Rpdj4KICA8L2Zvcm0+Cgo8L2Rpdj4KCjxwPkdvRG9jIGhvc3RzIGRvY3VtZW50YXRpb24gZm9yIDxhIGhyZWY9Imh0dHA6Ly9nb2xhbmcub3JnLyI+R288L2E+IHBhY2thZ2VzCm9uIEJpdGJ1Y2tldCwgR2l0SHViLCBHb29nbGUgUHJvamVjdCBIb3N0aW5nIGFuZCBMYXVuY2hwYWQuICBSZWFkIHRoZSA8YQogIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dCBQYWdlPC9hPiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYWRkaW5nIHBhY2thZ2VzIHRvIEdvRG9jCmFuZCBtb3JlLgoKPGRpdiBjbGFzcz0icm93Ij4KICA8ZGl2IGNsYXNzPSJjb2wtc20tNiI+CiAgICAKICAgICAgPGg0PlBvcHVsYXIgUGFja2FnZXM8L2g0PgogICAgICA8dWwgY2xhc3M9Imxpc3QtdW5zdHlsZWQiPgogICAgICAgIDxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1nby9hd3MiPmdpdGh1Yi5jb20vYXdzL2F3cy1zZGstZ28vYXdzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9kZ3JpamFsdmEvand0LWdvIj5naXRodWIuY29tL2RncmlqYWx2YS9qd3QtZ288L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dpbi1nb25pYy9naW4iPmdpdGh1Yi5jb20vZ2luLWdvbmljL2dpbjwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXMiPmdpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dvLXNxbC1kcml2ZXIvbXlzcWwiPmdpdGh1Yi5jb20vZ28tc3FsLWRyaXZlci9teXNxbDwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29sYW5nL3Byb3RvYnVmL3Byb3RvIj5naXRodWIuY29tL2dvbGFuZy9wcm90b2J1Zi9wcm90bzwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29tb2R1bGUvcmVkaWdvL3JlZGlzIj5naXRodWIuY29tL2dvbW9kdWxlL3JlZGlnby9yZWRpczwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQiPmdpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQ8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltIj5naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9qaW56aHUvZ29ybSI+Z2l0aHViLmNvbS9qaW56aHUvZ29ybTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vbGliL3BxIj5naXRodWIuY29tL2xpYi9wcTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcGtnL2Vycm9ycyI+Z2l0aHViLmNvbS9wa2cvZXJyb3JzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1cyI+Z2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1czwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcm9iZmlnL2Nyb24iPmdpdGh1Yi5jb20vcm9iZmlnL2Nyb248L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3NpcnVwc2VuL2xvZ3J1cyI+Z2l0aHViLmNvbS9zaXJ1cHNlbi9sb2dydXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0Ij5naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0PC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS91bml4cGlja2xlL2thaG9vdC1oYWNrIj5naXRodWIuY29tL3VuaXhwaWNrbGUva2Fob290LWhhY2s8L2E+PGxpPjxhIGhyZWY9Ii9nby51YmVyLm9yZy96YXAiPmdvLnViZXIub3JnL3phcDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9jcnlwdG8vc3NoIj5nb2xhbmcub3JnL3gvY3J5cHRvL3NzaDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9uZXQvY29udGV4dCI+Z29sYW5nLm9yZy94L25ldC9jb250ZXh0PC9hPjxsaT48YSBocmVmPSIvZ29sYW5nLm9yZy94L29hdXRoMiI+Z29sYW5nLm9yZy94L29hdXRoMjwvYT48bGk+PGEgaHJlZj0iL2dvb2dsZS5nb2xhbmcub3JnL2dycGMiPmdvb2dsZS5nb2xhbmcub3JnL2dycGM8L2E+PGxpPjxhIGhyZWY9Ii9nb3BrZy5pbi9tZ28udjIiPmdvcGtnLmluL21nby52MjwvYT48bGk+PGEgaHJlZj0iL2dvcGtnLmluL3lhbWwudjIiPmdvcGtnLmluL3lhbWwudjI8L2E+PGxpPjxhIGhyZWY9Ii9sYWJpeC5vcmcvdjIvbWdvIj5sYWJpeC5vcmcvdjIvbWdvPC9hPgogICAgICA8L3VsPgogICAgCiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sLXNtLTYiPgogICAgPGg0Pk1vcmUgUGFja2FnZXM8L2g0PgogICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIj4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL2dvIj5HbyBTdGFuZGFyZCBQYWNrYWdlczwvYT4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL3N1YnJlcG8iPkdvIFN1Yi1yZXBvc2l0b3J5IFBhY2thZ2VzPC9hPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9nb2xhbmcub3JnL3dpa2kvUHJvamVjdHMiPlByb2plY3RzIEAgZ28td2lraTwvYT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zZWFyY2g/bz1kZXNjJmFtcDtxPWxhbmd1YWdlJTNBZ28mYW1wO3M9c3RhcnMmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5Nb3N0IHN0YXJzPC9hPiwgCiAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NlYXJjaD9vPWRlc2MmYW1wO3E9bGFuZ3VhZ2UlM0FnbyZhbXA7cz1mb3JrcyZhbXA7dHlwZT1SZXBvc2l0b3JpZXMiPm1vc3QgZm9ya3M8L2E+LCAKICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2VhcmNoP289ZGVzYyZhbXA7cT1sYW5ndWFnZSUzQWdvJmFtcDtzPXVwZGF0ZWQmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5yZWNlbnRseSB1cGRhdGVkPC9hPiBvbiBHaXRIdWIKICAgIDwvdWw+CiAgPC9kaXY+CjwvZGl2PgoKCjwvZGl2Pgo8ZGl2IGlkPSJ4LWZvb3RlciIgY2xhc3M9ImNsZWFyZml4Ij4KICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2dvbGFuZy9nZGRvL2lzc3VlcyI+V2Vic2l0ZSBJc3N1ZXM8L2E+CiAgICA8c3BhbiBjbGFzcz0idGV4dC1tdXRlZCI+fDwvc3Bhbj4gPGEgaHJlZj0iaHR0cDovL2dvbGFuZy5vcmcvIj5HbyBMYW5ndWFnZTwvYT4KICAgIDxzcGFuIGNsYXNzPSJwdWxsLXJpZ2h0Ij48YSBocmVmPSIjIj5CYWNrIHRvIHRvcDwvYT48L3NwYW4+CiAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ieC1zaG9ydGN1dHMiIHRhYmluZGV4PSItMSIgY2xhc3M9Im1vZGFsIj4KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+CiAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvYnV0dG9uPgogICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+S2V5Ym9hcmQgc2hvcnRjdXRzPC9oND4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4/PC9iPjwvdGQ+PHRkPiA6IFRoaXMgbWVudTwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4vPC9iPjwvdGQ+PHRkPiA6IFNlYXJjaCBzaXRlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5mPC9iPjwvdGQ+PHRkPiA6IEp1bXAgdG8gaWRlbnRpZmllcjwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmc8L2I+PC90ZD48dGQ+IDogR28gdG8gdG9wIG9mIHBhZ2U8L3RkPjwvdHI+CiAgICAgICAgICA8dHI+PHRkIGFsaWduPSJyaWdodCI+PGI+ZzwvYj4gdGhlbiA8Yj5iPC9iPjwvdGQ+PHRkPiA6IEdvIHRvIGVuZCBvZiBwYWdlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmk8L2I+PC90ZD48dGQ+IDogR28gdG8gaW5kZXg8L3RkPjwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9InRleHQtbXV0ZWQiPjx0ZCBhbGlnbj0icmlnaHQiPjxiPmc8L2I+IHRoZW4gPGI+ZTwvYj48L3RkPjx0ZD4gOiBHbyB0byBleGFtcGxlczwvdGQ+PC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KPHNjcmlwdCBzcmM9Ii8tL2pxdWVyeS0yLjAuMy5taW4uanM/dj1mYmY5Yzc3ZDBjNGUzYzM0YTQ4NTk4MGMxZTUzMTZiNjIxMjE2MGM4Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL2Jvb3RzdHJhcC5taW4uanM/dj01YWRhN2MxMDNmYzFkZWFiYzkyNWNjMWZkYmJiNmU0NTFjMjFmYzcwIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL3NpdGUuanM/dj0zNzFkZTczMWMxOGQ5MWM0OTlkOTBiMWFiMGJmMzllY2Y2NmQ2Y2Y3Ij48L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+" } }, { "ID": "770a360e2b1f64d2", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "6354" ], "Content-Type": [ "" ], "Date": [ "Thu, 19 Mar 2026 15:28:04 GMT" ], "Etag": [ "\"0f6a7c9ff3d3d770b8f7fa19c2ae19d0\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:04 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "zB95WeNHTTsefalE8/pswIIygxkDDg1uaYEcLTilwW2WVjY0QzxEdop8PZp1wdJJPhysSqbwUyg=" ], "X-Amz-Request-Id": [ "DMNZC6J1ZN7TNP58" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "b1951eb8a406b43c", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:04 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "cGWH4pkwKCtlU/hatcGru4QHTnTRY/f5CvBqlZzeqLg9v30mzXNF6qSuHIEkMdsfvUN77ErnoSs=" ], "X-Amz-Request-Id": [ "DMNMDSM89EAE4PYR" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestWrite/Content_md5_did_not_match,_blob_existed.replay ================================================ { "Initial": "AQAAAA7hTg0EIB7A6AAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "36fb02ee4276faa9", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "58" ], "Content-Md5": [ "dH9B/ScP7BuCvgMMwc1IAQ==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "16" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "MTANCmV4aXN0aW5nIGNvbnRlbnQNCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOkl1VXExUT09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:05 GMT" ], "Etag": [ "\"747f41fd270fec1b82be030cc1cd4801\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "IuUq1Q==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "exqtkOATW9PsPKCeq9nb38Gi/Ah6IUtc0RLU7PVQu0+UKW0+mZKk8vios2SqlD/3lyot4TIWsdFU6nH/yq8ugP5uQLQ+1/Jb" ], "X-Amz-Request-Id": [ "Q2FT9K9FB11JXWMM" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "cf760c8b6073c94f", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "16" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:05 GMT" ], "Etag": [ "\"747f41fd270fec1b82be030cc1cd4801\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:05 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "IuUq1Q==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "DQIUSplHGIurkzUe1IES+9Pa8S+ygH4UrTOxsSpptR++UK2EINeHYSZZfgw0mqpOYBKzTM53cELFFj/Ec+1/U6alM91M6e6C" ], "X-Amz-Request-Id": [ "Q2FM3PZ1C0GQJJCY" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "ZXhpc3RpbmcgY29udGVudA==" } }, { "ID": "79173623acd3d71b", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "16" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:05 GMT" ], "Etag": [ "\"747f41fd270fec1b82be030cc1cd4801\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:05 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Vx/QhwKSXv3UOkmA4fHQUtBiWKk3vyj8n2aaeVgM+SsF3+3h/R5szi6mTWOASaSYy6aFjavwKZB/l2q3I3us7M41ajyFelnA" ], "X-Amz-Request-Id": [ "Q2FKTAFT2VKC52TZ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "443098181da6595c", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:05 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "xxuT2bqFjmJ3TiPaXzVM9e6NpHTFxstbFFADNx5YYFu7kXJ0bCex7mUU866zOkrAf/rQvuBHQ0ir3909ErTmileR/Gx/b1+B" ], "X-Amz-Request-Id": [ "Q2FPFVF7XE0WN5PP" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestWrite/Content_md5_did_not_match.replay ================================================ { "Initial": "AQAAAA7hTg0EGiXAbwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "7ac839aa5dd56e6c", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:03 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "0jyxYHSWtuwKzVBad75iP9iXGFvGHJSe9a4+RZMzp3VIBDPVuh0zm5Dq7lRE2bHttrhHQouNJuZMDeGpm6NVFzrgbfNxgW6m" ], "X-Amz-Request-Id": [ "Q2FHXSQVFBRPNS8X" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPk5vU3VjaEtleTwvQ29kZT48TWVzc2FnZT5UaGUgc3BlY2lmaWVkIGtleSBkb2VzIG5vdCBleGlzdC48L01lc3NhZ2U+PEtleT5ibG9iLWZvci1yZWFkaW5nPC9LZXk+PFJlcXVlc3RJZD5RMkZIWFNRVkZCUlBOUzhYPC9SZXF1ZXN0SWQ+PEhvc3RJZD4wanl4WUhTV3R1d0t6VkJhZDc1aVA5aVhHRnZHSEpTZTlhNCtSWk16cDNWSUJEUFZ1aDB6bTVEcTdsUkUyYkh0dHJoSFFvdU5KdVpNRGVHcG02TlZGenJnYmZOeGdXNm08L0hvc3RJZD48L0Vycm9yPg==" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestWrite/Content_md5_match.replay ================================================ { "Initial": "AQAAAA7hTg0EAq3v4wAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "f0357be1dcd7ec3b", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "52" ], "Content-Md5": [ "XrY7u+Ae7tCTyyK7j1rNww==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "11" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "Yg0KaGVsbG8gd29ybGQNCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOkRVb1JoUT09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:05 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "DUoRhQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "f+huXp6rHYQNeVnsvZt5euqHHCQTiaDLRvRL+9Y8WohaFbmddftJOpQGycnQP6oipiLDn9W2E+Ju3z9S6ryI5XLo6L50V/br" ], "X-Amz-Request-Id": [ "Q2FK7NWZ6VR0NM2C" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "5a9b7787130d5513", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:05 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:05 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "DUoRhQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "C4xsac/iQa2YNlegSX4ussTD8s3/SJ5k6PIMw50SpdlZ3P/bgNP2jyfSvdAwJs4h+CgKvUm/c9eCOBQK3oVk46JNFqIxvwxY" ], "X-Amz-Request-Id": [ "Q2FRVBB4NQTMA37Q" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8gd29ybGQ=" } }, { "ID": "7e435b0b82f8b2b1", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:05 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:05 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "ExbPS4Fz8ilRIv+lUjf9rz0OYc8fnCYcLUM0x73oRNs4k9Y/cAtoV5DbuXYeqhL0mCaNSyn8sj+icDUXR6a00sA/b9qZoCAG" ], "X-Amz-Request-Id": [ "Q2FNQ1ZCW11HDCP8" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "95d40f7e2da37b38", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:05 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "F8zynBqUlRyhAs4lrBQ5ixy4hC0ovLdpT90/Mcj9meQdjFgSEh4q4Hj5b0oNb4tDBZmzFXzgyrm4+KX6ssogjfAwcQyL6VMy" ], "X-Amz-Request-Id": [ "Q2FY3SM2ASJHHSCF" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestWrite/a_large_jpg_file_gets_a_ContentType.replay ================================================ { "Initial": "AQAAAA7hTg0FAQeqmgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "9df1550d395e4907", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "38474" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "38430" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "image/jpeg", "BodyParts": [ "OTYxZQ0K/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAH0A+gDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAooooAKKKKACiiigAooooAKKDRzQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFMkkSJS7sFUdSTQA+iq/wBth3Fd65xnGamV1YZByKAHUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAAGBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFNd1QEsQAOpNADqKwr3xhoVg+y41O2jbjgyDv0qXSfE+ka2hfT76GcA7TtbkH6UAbFFICD0NLQAUUUUAFFGRRQAUUmaTcPWgB1FN3j1FKWA7igAZgqknoK8H+InjWbVNZfSLB7zCtsWOA43sD349vf8ACvV/Getx6H4Wvb9tx2R4G3sTwDXm3wm8OQS2cmuXRWe6uJGdXcElBnpzQBg23w/8ZzWx1VdRe2ugQ8VqJTwPQt612HgDx3qt/q02haxAqXlumWIBBbnuO3avTFjQRYwOBXjscsQ+O935TNkxBWA4Gdo6468etAHtkbbkBp9RQf6sfSpaACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAzzRRRQAUUUhIHU0ALRTd6+op2QaACiiigAooooAKKKSgBaKKKACiiigAooooAKKKKACkzzS0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAjHCk+leGfFLx1Lcu+jaeWVt+C5yuSO3PHPrXtWoXAtrCaYnARCa+f/CsVpr/AMTrm4kh27GJH/TQjvQBteDPhLb3lrDqOuhppZIx+5YkY5zzg81ual8Jbe0/03wzdy6bfpkptfcjcdDnJ/KvTII0hhAHAAqG21S0unZIpkZkOGAPSgDzjw58R7iz1FNC8URi11PzCgbGFcdiPY9K9PhuEmQMjAgjNeY/GDwuuraL/adoyx31mCwbpuTuMiuK0r4u3dn4dWK2t/PvEUKzHO1T0+tAH0M0iqMkiqN7rVhYQmS5uooVHJLuAAK8bt9b8b+I51tSk1sHhwxQfu8nnduAz07Z61sxfDDU7u1SS91udpjy6uisufUZHB/GgDrbvx5pdtG0yTfaI1++0QyE6dfzFY//AAtrRxbzvtuGkjJxEqZLc4GCOOfrUtn8KdFifzLjzbgk5Ikbg57YHaujtPB+iWciywWECSKMbggzigDz+/8AjEpkENhp879N7MCpXjJ4I7fWs+38ZeM9TZpNP064G9SYy8W5Poc4A7cjNewLo1gq4FrCBnOAg61Zjto4wAqKAOmBQB5E918S4oTO0NvgA5QqWJ54IA6fmaW3uPiUbIl4UM8pUpkj5Fzzn3wf0r2DYuMYFARR2FAHjEuieP8AVdMeO+lhk8zG23lVQFI65I/+vUdnYfELSVjgiht4oUXhLeNNuc/d59QeuO1e17B6UFAe1AHkJ1P4kral5LW3B3bQvl7mJ9eD07Dp71xOneIbnS/HtzfavpzQXHypcm35AY45Oe2PSvpQxqR0FUP7HsvPkmFvGJJDl22DLfWgDldD+JWg6mgCzvC27afPQqAc9CwyM/jXaQXUU6bkdWHqDmuO8Q/DTStaVmiZ7Nnbe4twArtggMR689f8K4dPCPjvwlqAbR7yXUbJWBWIyhV285BDd/cUAe35FLXmWj/FKKG6+xeI7cabMuMlycZ98jjPNei2l9b30KTW0qyRsMqynINAFiiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACkJAHNDMFUk14/8Svik2ku+j6Q2b8nYxGcqT6Y70AdX4z+I+l+E0WJmE94+QkKHOD746V5i+vfEfxvI0mnIdOt1YDumee2eTWt4E+Hd3qdxFrPibdNPnekbnOOc5P8AhXssNjDCiqiABemBQB4LeeGPiNpdp9rbV5rnaQzJFKxbaBzycelbPgv4k6hFd29lrMwlE+7bIy4KlTjHGc+tezmNSuCARXm/xA8HW0Wh3OraVFFb3to5vC2OHI5bd+FAHpEUgkjV1OQRmn1zHgjXBrfh2zuiyF3jBYIcgHvXT0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUCigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDm/HAu/8AhGLr7Jy+35lClsr36V4F4V1P+yvHscqPuieQq+8EHBPvX09KgkQowyCMGvCvif4Hk066XW9LgJgiO6ZUYIUHc5oA9vgkE1sD1BFeF+LdS1Dwd4s8+CSRoZpCxYrhR7H1r0jwf4lh1Tw/bzLICdoUgsD04NR+JfCFr4ihfdEjyEEpuJ2nPrigCDw74ms/F2nK6uCRw6MO/wBK85tLaDwf8UrnT57Um01Ah4eBjJI7exroPCngHWfC3irfAXksHHzlnGB9PU/hXoeueD9M8Q/ZpL2FvPt23wzRsVdD7EUAatlbxrEpRQBjjAq6BUdtCIIEjBJCgDJ6mpaACiiigAooooAKKKKACiiigAooooAKTaKWigDmPFnhKz1+xYmygmukH7vzRgH2J9K8ut18VfDAtcmyku9IL5ljik3LCM9VHX8694qOWFJkKOoKngg0AYnhrxXpvifTY72wuFkVuGXoynuCOxrf615l4h+H13pt1Jrng2b7Dfg7pLVR+5n9iOgPvT/C/wAUoL27Ok65bHS9WiKpJDKRhiRxtNAHpVFRxyrIqkHORUlABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRVa/keOxnaLmURsUGcZOOOaAPNfix4/Gh6c+l6dMpv5/kyhyUB6/Q1zfw5+Hvk3S6xrDia4kXKIQSFzzk5715idahtvFM97rllNc3CSNiLO75857mtS/8AiP4k1W+SbSEmtYYQFjRTlQfU9j+NAH1NbNFHGFUjgVP5qk4Br5k0i6+J2syzPb3txFIcYUqFTBHXNbF/YfEnwzbNrl7rxniiw0sSMSAM+mAMc0AfQqnNRXltFd2c1vMu6KVCjqe4IwRWT4T1pdd8P2t9n5pE+b69622+6aAPHfhQyaTr+r6MVdHimb5cgrgMRwevQDrXsleFWVw9l8b9SSGDejNyzM3yBgDkDpyT+le4RSB0BHTFAEtFFFABRRRQAUUUUAFFFFABSb1zjIzXGePfHEXhayEEGJNQnGIowRkZ4Bx1PPavJp7nxvcvJqckOooWVZPMVDwvU4xyOO2B0oA+jcg0V4l4d+KN3pl3Fb6zPFd2Uj7Eu425QcD5hjOM8ZNeyWV/b39vHPbyrJG43KVOcigCzRRRQAUUUUAFFFFABQM45oooAKKKKACiijFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFACMcKTXkvxX8cPpsf9iWNsZ7q4jOcgNt/4Dg5rr/GfjO28Lae0hTz7huEhVwGOe/Nee/D7wzceINduvFOsRyM0r/6OJjk7fXGPyxQBw2gp4m8Hz2zzwsIZz54DcKOuVx2r6D8Oa7bavYQTxkB3UNs3AkfXFR+KPCNt4j0OWwfZG5H7qUpkxt6iub8HfDm88MysTdpIdy/OAQWUHoc0AekqB1xwafSKMACloAKKKKACiiigAprNtHNQXN5DbRs8jgBQTXk/ib4nHzZLPSZvtN0GwIYoWLNg84PT/P4UAeszXkNuheWRVAGck4rIu/FemWgQyXMY3HH3xgcZ5ryo6J498TuiNs0q0YjIaUvJj/P0rorH4M6SrmW/uru9Z1AkE0nBPqMcigDoJviT4bhKhtTg2scAq2f5fStey8UaTfQiWC+hlQ91auePwm8KnP/ABLEyV2n526enWqFz8GNAaN0s3u7TcAMxTH8+c0Ad/FqdrM5RJkZ1ALKGyRmrSyK3Qg14xqnwl8QQSxz6T4ou96YUGWRgQmOmRwfyrNtPGPi/wAATxw+KIzdWJcr5wIZwBnBOPXjrQB73RWFoXifTtds457KdZFYZ6YrcBB6UALRRRQAhFcJ49+Hdl4rtvtEP+j6nD80M6Hbkjs3qK7ykIzQB5R4E8Z3sOoyeGPEMMkGp254ZyMSDtg9+Oc16Y+o2kKAyzxp0HzMBzXnvxb8L3F5ow1zSJHh1PTyZQ0fV1A5B+grzz4e+H38d2klze63dvMshEyMxJz26nGPwoA9guviV4dtZpInumby+rJEzL+YFRzfE/w5FKsYuJZCcZ8uJm2k9jgdam0L4f6Nom54YmllY5LytuPTFaR8JaOZXm+wwiRyCzBcE4II/kKADRvFuk65G72dyGCMVIYFTkdeDWzHPFKMo6kH0NcNq3wt0W6gdrKN7O5bJEsUjDJPrz0rjLHwd448Jy3UtnqsdxCpXyoSSxcDtg8LQB7gKK8x0T4pQrNFYa7by2V8ZPJIdMBnx25OByOtekwXEdxGHjYEHmgCWiiigAooooAKKKKACop4EnQqyg5GOalooA4w/D3QU1c3rWELvJnJdQ3P49K37fRbC0j2Q20SKOgVQBVy9uBbWrykZCjNeHax8ZNdu76Wy0DSVkkRmBcqzAAH0GKAPZha28N0SgVc8kCuU+JGrWVn4N1SNp4RNJAyohkClieOK4C3n+J/iLT3hZ1t1n+UyeRtKg475+tOh+Ceu6iqHWvEUsgUAbFLNx+JoAr/AAv8fW+neGja3swQ20nVmABB5rvY/i74edMO86ZztYxHDfTFZGkfArSLOM/apnncjjtiuug+G/huGFY/7LtzjqdnJ/GgD551/wAW3f8Awnd/renxXAjlOFDcE4AwenT2r0X4ffFu8vNTTSfEVutrLJgRSlSgY+hB716oPCejKBixiyvQlc15x8Z9MtLfw/aXcapFcRXAMbKBu6HPHftQB7DG4kQOpyD0p1c74L1JdT8M2M6ur7ohyvTI4NdFQAUUUUAFFFFABRRQelAHhHjRbfVPi5psMkhZVlAIC4K7e3X1HoK9straMQKAoxivEviXbxaX8QLK+l3ojyK4kCA7TkdDn869ig1W2h0xLiWZFiCbixPbGaAMzXPAWga4h+1WSh+MPESjDGccj6mvJdO1zUvhd4wk0vVJrm40eXLRyMdwRScAj+tdzqXxp8KWbvGLiWR1BxsjPzEehryHxr42/wCEs1azbStMupkjyNkiEs+e3HbvQB9M6Xq9pq1lHdWkySxSKCrKcgiru9c4yM18ueHrr4hWmbDR7C6tY2zKUlQquTzwx/lXXaXp/wATpA1zdPtfj5GlGT/hQB7o0iKOWA+ppv2mHOPNTJ7bhXicvhrx9NObi9kNwrc7DKCI/YAde361Wm8MeLZFP+hlkzgMu4MuAexP+c0Ae7+bGf41/OnBgehFeFjSPFltNvlhvmhUqMRTMMdOncioodZ8RaYRFNdarHwSEADgEDOORn8M96APeqK8LtPilrxkSGYwCQrv2zRMm0e/ua6nTfig77Beaa7DgGS2bzByM5xjNAHpdFc7pnjXRNUYRxXqJKf+WcvyN+RrfSVJEDI4ZT0INAD6O9FFAATiiikJA70ALRWXqHiLSdLLC8v4IioywZxkD1I9KXT9f0vVP+PK+gmOM4RwePWgDTooBzRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABWXr+s2+haRPf3LAJGucE9T6CtMnAzXivxZ11tV1a18PWe+TDBpFRScseAOv40AUfD+lTePPF82ramubVCNsbgMCOw9OPpXt9nZx2kKxxqFUAAADpXO+CfDkPh/R0hXl3O52xjJNdZQAmDmloooAKKKKACiiigAqlql9Hp1jJcybiqDkKuTVwkKCT0FeR/EfxfcXV3F4e0O6zcXLbGePDAdiCCD/kUAZN/wCI9V8feJZNG0WdodNjH76dAQR0zyRj1GPavRvC/gbS/DlikVvCrPnc0rqNzH1zVfwF4Pg8M6UIgTJPJ880p/iau0AxQA1Y1UABQKfRRQAYooqGS6gibDyKp9CaAJsVla34e07X7NrbULWOeMjow6e4q7He28rFUlViOuDnFTggjigDwTVvhz4g8BiTVfCt956oWJgeL5tp984OPwrrfhv8R28Ro1jqqRW+pxHDRA/f9wK9MkjWRSrAEHgg14P8QdHk8F+L7LxHpqxpDJIA0YQD6gdOtAHvKtuAPrTqzdGvl1HTYLlCdsiBgD15FaVABRRRQAySNZEKsMg14TfwN8NvifHIg26Vq0pdnx91jnK+mM4Ne8E4ryv46WLXXgoTxKDLbzrJnbkgdyD2oA9OtpVlhRgc5GanriPhjrX9s+ELO4aQvIF2Mx6kjiu3oAKjlhWUEEdqkoPFAHnfjz4f2OtW73xkliniG7zIkBbAHbHNc58PPGFxp+tTeG9SnMsasRaXDnHmqOwzn1r1y5vII0bzXVVA5LHAr56+JNsPDnjTT9SslIidlKOvRSDyue/rz69aAPo5G3qD606sjw5qMeqaNb3URJSRAwJrXoAKKKKACiiigBAc0tFFAFbUI5JLGZIQpkKELuOBXh3wndYvFmtabc7fO8zeFYc5BINe8P8AcOOteFJatofxw3hfLivSJAAf73X9aAPdFjVVACin4pFOQDUN1KYbaWRQSVUsAO/FAEjyIn3iBVG81zTrBS11ewQgcnfIBXzh4h8b+KNf197SK+e0j3lFjU7dpH6nGOtdDYfCaS/ijudR1qeYnDlVUDJ7gk5yKAOz1z41eHNOLw2bvf3A4CRDg/jXnkms+Lfibqf2eO3+yWBYqf3WVVfUk9T0/wDrVn6r4RtPCfj/AEvZt+wTSKhDqXOT65GBzivofTLWCGBPLRQMdhQBB4S0NtA0SCyaUysg5Y1vZAqB50RCSwGBXG+LPGkOjWMsguFj2jO88ge31NAHaS3UMK7nkAHua5/UfHvh3Sw/2jUoA6ZygbJ4ryG2m8U+O939mh7ezJ+a4uMjPsq9xXf+HfhjpOnW0RuIlubnO6SWZAxY49xwPpQBHN8aPD6k+Rb6hcjGf3VuTn/PP5Vp23xS8MzwCSW7kt2xuMc8LowHrjHT36V0UGhWFsoEVvGvrtQDNU9a8JaPrsCRahYwzKhyu5RkcY4PUUAWNK8UaPrW7+z7+CfacNscEj6itOS4jijLs4CgZJJ7V4V4u+HVl4WE2r6Nq8mmyKMxopPJx0zye1cTB428aeLbVNEgnlcr8ssiDLOM9WIHHTtQB1/xj+IOkalZLpVhH9qm35EwyAuCRx69PpXLaJoni/x7NaQXc9zHp6KoYlWRCAPTuceld34P+DjJNb3+uXUk86YYIrEgY6ZJ5/CvZrWyhtYwkaKoA4AFAHlenfAvRIh/pFxcOOcgEKCCc449Oa9A0zwlpOlIgtrSJSi7Q+3LY+vWt2igCAWsS8BAB9KlVAO1OozQAmB6UYHpS0UAJtB6io3toZCC8asR0yKlooA5rUfAuh6lcG4kt2jmJyXicqc4x2rm7v4R2hG+x1S7gnByGZtw/Hpnv3716TSDmgDya/8Ah3rJRxFdLKcD95Kfm4HGMDP+etY2nah4x8JsZbi1urm3UBXjPzIuDjIORj6V7nUFzaQXcLRTxJIjdVYZFAHlA+NsEF6IbuzZEwFJCk/N39gOnevSdI8QWGs6el5aXCSRN3U5xXC+NvhtHqjJLYfut/EgXAI989ef6V5Ott4s8Naw3hjTdQjuTdgB4kcv5fr6Y/OgD3XxP8RNL8PObcCS6u8f6qIcLxkbieBXmVx4x8ceMb1k0ZZLe23gDyU28d8sc812nhr4W6Xa20c+qxte3jANI0zs4yPQE13ltbWtogSNEQKOmMAUAeMWfwc1XUpEutY1yVpicsMb+vXkn+lZPibwXP8ADyS1vrPVbpYDwSqA5YHOCMgdK+hYriCVikUiMy8EA5Irj/im0cfgm6aRcncojwoOGz15B96ANPwTq11rHh6C6u12uw44xx27mukrlfh/A9v4UtY5EVCF4CnII9eAP5V1VABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRSc59qAFooooAKKKKACiiigAooooAqahdJZ2cszkBUUkk15R4Mg/4STxdf6424xiQqFKbVyMY4z1/Kui+KmpT23h2W2gKDzxsYnOcHrjHSrPw60ZdI8PQRhQHb53Oc5J96AO0jQIoApxOBmgUY5oAWiiigAopOc0tABRRRQBn63ci00e6mJj+WM4EjbQTj1rxz4W6NJrOv3fiO7WM7mKRbVHH+feu2+Ld4bXwZMBHG+9guHzx9MEc1Z+G+mLp3hKxQRorNGGbb0JPNAHYxoEXAFOxz1paKACiiigDL13U10vTZZ2YDapPNeAya/rHjTxI+n2N09umCfMychRxxj616F8YL2W20CfbIEwuef4vYVz/wAOpdG07w6l9LeReaylmZ35XuR1oA841lfEvgzxFFanVy0sieYpVyARngH8q9J+H3xdm1C6+xawYxtGBIhwD065NeOeO/EUfiTxfNewybrYYSLdkAKPr0qnpDSWt7bnywQScYbryMGgD7bjdZEDKQQRkEVxfxS0WHVvBN6XQGW3QzRt02kVueFJZJvDlm8ow5jGQauavbQXml3NvcIrwyRsrq3QgigDjPhTqp1HwrbBiN0WU4AxgdOhPavQa8I+Dxex1a7sFuEkiDHYglDYXPXivdh0oAWs7WNasdEsZLy/uI4YkBOWOM47D1NaDHAJrwDxdcXPjz4iHSFYrZ2WV2FhgHPLEevTFAGzqPxqvri3E+heG7q5g3bTNIDt/DaP61yPij4keJdX0a50+/0IQRXKmMSbGyT3IB/Hv2r2/RNNstO0+G0hRVjiAAHrir17ptld25SaBHVieCOh9aAPHPhd8QtP063h0S7gkt5VYIHCcEn1A5Fe8RSCRAw7186/EDwQnhvVDrsChLNSoCxMcq3bg/QdK9l8C6s+s+F7K8dSrPGMg9/egDqKyfEeprpGjXF2zbQi5zWtXEfFSC4n8F3KW5+Y4zzjigDxXxDq3inxL52oAyw6cD5aNGTgehIzyCa4bU77VIZDb3k8m1lD7AeGB75966q48ciw8Ox6R9nDRyQiMhSQyMD1+hri9S1D7b5UqhVZE2YBycDj9aAPpv4Oagt34MtEVyxjyrcjr+dek15F8C7Ka28JiWZcedIWXjHHT+leu0AFFFFABRRRQAUUUUAFeR/Fy0bT9V0XXoY8eU5ilcYz1BX3PU165XC/Fuy+2eAbxhnMLLINoyeuP60Adfpl0t5psE6nIdAaluU3wOvPIxxXCfCPWxqvg+3RnJkg/dtnrxXfuMqRQB8eeNLJ9L12+cMFkt7xl256huc4/D9a6ew+J3i06Y89lo6PaQx4eRkbHAPOcit34reFmg8Y22rLBFLaXWEdXYcyZxyD2x6e9Fzf65daFLYWGgW9laeSY3a4k2AAjnAx2H8qAOGtb3xR438T2d1MGlEbJKViPyqoOMgZ69a9g8WeO5PDYs9NtPKlvZgAyOx3L6YA7nPWsb4PNaPplxAGVp4JWViMHjPrXn/xL1WWH4gXE7xIzQN5akkg4HTvigC9rHxB8VaBf+Tc38d15iBpIj/B7AjHvVnwvYaj8Q9fS+1NSunxkFYP4WI9fWvP7O0u9c1t+EaR2BkLHjH+RX058PvD66Vo8AZFD4GcUAdbpelwWFtHHFGEVRjaBWkAAMDigDA4paACuN8beO7XwtaeXGonvnB2RBgNvuf8O9a3inxHb+GdEn1CcFyg+SNfvOx6AV8/WcepeOteuLmOEy3EjL5ssg2rGM5A4OfyoAzb0+IPHOrNLKJ23Z89yfkiXP3QO3Tp717p4A8E2XhnR1ihiJdzuZ2AySfU1c8L+DrHRtNWD7OhJO6Q4J3N68k11kcaRqFVcAdB6UAKqhRgDFOorE8SeKdM8L6c15qM4jQfdXqXPoB60AbLOqAlmAArifEHxO0TR5TbW7PqF7natvajexPpx0ric+KfifetOlzPpWgZxHEpKvMvckg85rvPDnw70Xw+Ee3tVMw5MrElifxNAHOP4w8fajI/9neF47WNV3gXbks49iMAH2rPufEvxVtQssvh+3cAfMIjuz+TZzXsSxIowFFKY1JyQKAPH4vjHdaazReINDurORDgkKSCfyrtfDvxC0LxHEDZ3aeaesTHDj8K6Sawtp1IkhVs9ciuE1X4R6HcM1zpYk029GSk0DkAH/dzigD0BJ436MKkr5+Os+KvAXiu3ttenlnsGJVLnPyOOMZHY/417XomvWetWaT2sySKw6qc0Aa1FFFABRRRQBw/xK8Wjw5oyW9uUa/uzsiRienc8c1mfD7wU+nvLrWpYa/uuTxwg64Gcmum1nwXpuua7Z6peoZHtfuIWO3PqRVnxLcSad4fuGtreaWQLhUhByPy7UAYnirx1baLK1hbI0t1tyzKQREMdSM8/SvLYtR8RatqLz3V5ESzhYvNl2q6/wC7yMnPTPatbw58Mv8AhI5zrWqQzWrSSEm2cnp+hFdNL8JrCKB/sckgZnDAO5wv0oA6Pwnoh02JriY5nlUBjuzgAdM964v4iXuoeIvE9n4c0uPzIIWDXDldwVscZ9MCur8Ua5F4L8IlizNNtEMA5ZmfHFZPww8PtbWMusXiyfb79vMl8zg/l2oA73S7c22nwxMAGVACBxVygDFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFBz2ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKQnAzQAtFFIehoA8j+KMd1qOr2NhDCH3Nkhmxx+dekaDaiz0uCAY+RAP0ryv4nGX/hI9IljRWj8/BwOc5H5V61pf8Ax4xk+goAv0UA5ooAKKKKACiiigAooooA80+MshXw7bKFDbpwMbAx/wDrV2XhtFj0W1RcYEajj6Vz/wAU4oz4RlmktoZjGw2+b/CfUe9X/Ad+L7wxZSblY+WAdvTigDqqKKKACiiigDiviR4VTxPoDQiOR5UPGyQJx3znjFfLeseHLnQbuSO5RpIgzKAHwwIOORX2yRmue1bwXomsySSXVmheT77AAFvxoA+NYrP5opUO5sj92BuOa9P+HPw7v9X1aLVL6F4bYPkApjOOePSvb7P4deHrSbetjG+37gYZ2109vaw2sQjhjVEHQKMCgBbeEQQrGowAMCo9QkSKwnkfOxY2Jx6YqzWJ4s1CHTPDl7czyrGixHk+vpxQB4/8IAlx4o1WaNsRpIwiDDJZSfX8K943BUyTgDqa8b+EFhJFDPeSs3znKq3JAPI5zzVj4g+O7xrkeHdAUy3U+Y5GUZx2IHpj6UAdT4n+I2kaFA4VzcyjK7IumcZxu6flmvCNRuPFUeuN4l0rw/cWkc56rGZC2fX/APUK9e8HfDDTLGwguNRt1ub0/vGaTkKevA/E16JHp9vHEI1jUKOgAoA8d0HxjqMUKi/huBdbctE8YTp/KtmT4iNLbSRxeRDOB0d84+uK7vUPDWmajzPZxOQD1Xr9ao2ngnRreR5P7PtvNcYZljxkUAeE+MvEK6pFLA95LqFzKoAjQYii56jjn617N8NLZrPwjYxSkbxGMjPSqviT4W6LrVqVigS2nUYjkjXla4PRPEOr+AddbStXQGAyEq2f9YpOAw6gHjpkUAe+jpVW/sYtQtWgmUFT2IyKWxu1vLVJl6OMgelWc0AeJeJvgdBfX013ZzkNK5YpkIFznpwe9cLrngay8KaHHDcxxtrN3KURPMDMieoXv6cetfSut6raaNpFzf3kgSGFSSSQM+3NeH+EBdePvHUmuXkSG3hYhI2G7YoztA464Oc5/pQB6x4B0uHTPC1lDDGUXywcHrzya6qo4IlhhVFAAUYAFSUAFFFFABRRRQAUUUUAFQXkC3NnLCyqwdCuCM9qnoPSgDxH4SSHTPE+taQ6vEySbhE+Mr+XFe29q8Q8SN/winxntbyOVxb6gAZVJ4BORxx0yPevbIXEkSsO4oA8++L1oJvCDXAVQ0EgbcewPB/nXD2fhHSbnRLS/wBW165MEZEjxyXAK57g/wAuK9h8W2B1Lw1f2qHDvC2364yK+fvDEOkarbXH9vSMyW2WUtOQBnqCAeuR+vtQBtaTrOk6J8Sha6GEktL1AjJbgAIwHU/lWV8V9GW18QNrE1s09tKgA2gkI3Oc8/SpIry01fxHpx8I6LO0Vq582QAKrDPU/TrzXQ/FuSWDw40bYVnUjGPzoA5H4S6TLqmqG5C/ulfLkqCD7V9IWdqlrH8q4z79K8o+CdtCNBWVRyxORjpzXsDOQvt60AWBTC4+b2FVJL1Ily7AAVzHiXxna6VoF9dLIFkjjbZ0OW+lAHmPjO+vPHPxDbSLFRLY2eEcknCt3OM8/iK9W8LeF7bRLbEMYDNy5AxmvN/g9plxI95rOoFlkvJCyqc4xk817fCFCDGKAJdvHFLQKDQBl+INdtPD2kT6jeNiOIZxnlj2A968S8K6ZqPxJ8Tv4h1ku+mo5EFu5ynXgAZ6Ditzx/d/8Jr40tvCVm5NvaMJLx19f7v4f1r0vw7oVroenpa2sYSNRwPegC/ZWENnGEiRVUDAAGAKt0UhYAckUALR3pokU9CD+NOoAKKKKAMvXdFtNc0qexu4leKVCpBFeCSrq3wo8RKsJa40x3AAkJ+QZ/lX0fXHfELw1Hr2gy/JukjXIGOooA3dD1eDWNNiuYXDB1ycHoa1K8K+E/iSbS9en8N37MFOWgL9cZ6GvdQcjNABRRRQAU1kVxhgCO4NOooAQKFGAAKpatqlpo+ny3t7MsUMalmZjir1cV4z8GXPi+7tYpbxoLGDLbUGSzHjnnH060AeO+Pdd1DxRP8A27H50VhYufsymEFAM4DE55Jx36V6R8MfHttr2nJazMiXsfyug4z7iu007wxp2maSNPgt08kLtKlevrmvD/G/hOX4d+IrTW9FaSOzdyTGgJ2nOSCfQ0AfRQIIyKWud8IeJLbxJosF7A3DLyDjKnuDXQigBaKKKACiiigAooooAKTvS0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAYooooAKQ9KWkPQ4oA8p+KER/tLRpASo+0c7VyfWvStN/484sN/CO1edfFaNo7SyuFk2vFPuBLAf8A167DwlNLLpMQlkEhA4YelAHRUUUUAFFFFABRRRQAUUUUAY/ifTV1Xw9eWjRmQtGdqrjJPbGeK86+FWoy2kt5o1yJQ8EmR5iBcZ7cfhXrhGRivF/iNp8nhDxBbeJbESRwyuRP5fOW9/rj6UAe0KdwzS1zXhXxRZ+INOjnt36qCVPUV0uaACiiigAooooAKKKKACvIfjJrjzxWvhuyaRprlszLF1C9uMc+uPavRvEGv2eg6ZNd3UqosakjJxk+lfPmhy6j8QPHf9qyNK0UUoxj5cLngfSgD03RLCbwt4LmuBExuIoSThMlsAgHArifhht1fxlfahcyyyPHlsSnjcTzgHpXtxsEn0uS2dcq6bSD0rwXXNM1X4c+I4NbgSSYSZN4GcFWUkdB2Pt7UAfRUIGwYPGKmrkfDPjjRdesY5LO/hdyoLR7huX2Ircm1uwt0LzXUaIBklmAxQBpUV5re/GzwraX5tRPLIB1mRMoPTmr/h34maPr+9UuYkkUn5d3UevNAHdHGK8I+OTJDrOkSLG5fDBnHCquR37fX2r0HWviRoWlWjyLqNpLKpwUE44+uM/lXhHiHxZH4x8dW15eMDptsAI3RSuR75HqaAPozwk06+H7UXMwlcoDvxjIqzrfiTTNAtPP1C7jgQ8DceW9gO9eLP8AFfV7uX7DoFjHFGija8rZd+3yjpSxeDfEviy7tbrVrgyZOWVmJQDqeM4BwcYAxQBoXWp6j8WNZeyspZ7XQIGwzKoPnng5Ofr79K9Y0DQLXQ7JYLeNQepIUDJ7nApdC0Gz0W0WG1gSNRzhRitigAooooAKKKKACiiigAooooAKKO9FAHlvxksHXTbTVE2f6PKC27OcjpjA+td34avl1HQrS4V1bfGCSp4zjmmeK9P/ALS8OXkIClwm5d0Yfkc9DxXG/CLVml0a402YAS2czIQD2/pQB6POgeNge4r5W8Q6Jp+l/ES5s5jLLbzzbmiVyig57k9e9fVcgJQ7etfPXxU0yWy8YfblTEbqG+Xg479/XNAHsnhnRbDT9NjS0hREK547nrnPeuP+MfhufU/C8lxbAmSD5iAccZGf0zXZ+DLoXvhqynByWiGeMVt3NulzA8UgyrAjFAHlXwckhPhtYhgSox344zzXomr38en24kkYKGOMnoK8sjM/gX4gS27tEumXpBRVwNnYEj6it74ka3pw8Kuk1ygkJDxKG+YkZweo4z9elAHBalquufETxHdWFhcz2WlWhKl4iQ0pzjr+dYOq/C7U4pEgs7uYhz+881sgj6d6m+G/jSw0PWbiDUJVSC7ffHIpyqE9Q3pXvNvLY6msN3a3Mbqw+UqQVagD57jvPGHgFh9te4+z7R5ZiQvEOehz0r2bwD8RrPxPH5DsI7tFBZOua6vULWxlsGW4jjZcfMGAxjvXzppd3aL8TpE0SJo7Vpx+7GUAOec4yMZoA+pVYMOKralcrZ6dcXDttEcbNn6D8afasWgQnrjmuN+LV89n4AvtkojaVkjB9csOP0oA5X4SWH2681PX5iWmu5my2zAIBPSvYRhVznAFcZ8NrJbTwlYoFAPlhjjuTXYzgtA6gZJUjrigDkPE3jqz01Ta2dzA964by1Ykgkdsj34rgb/WPFuo2VvLNJOEkILJaJuXBPdsfpivO/HUs+l+IZ0k8ouHYIyqcsOnOeKl0b4matpOiQqUimCsQc5+YDoPY/SgDes/iNrGl+I/ImnuGskc71kGWUZ6gDBwMdK958Oa9ba9psdzbzCTI54wQfcdq+NdT1mTWNflv58hZHLbOoUGvbvgtq0gPkuVCynjjrxxjigD3WigdKKACmuoZSD0NOpD0oA+cvGbJoXxbsbiByjtKoZuMYPFfQtlL5tpG+c5UV89fGtVXxbBNG2243KoVRnPIINe7eG3Z9GtixO7y1znr0oA2KKKKACiiigAooooAMjOM81l+IdKGs6FeWGdpmiZAwxxkVqUUAfOfw21O68J+Mn0G83QxO7JscgDcDwR65r6JikEkYYHORXhvxk8NvpuoR+JrVz5gYFUCDhgcn3NeleAtbOu+GrW8dBHI6AugOcHvQB1dFFFABRRRQAUYxRRQAUUUUAFFFFABRRRQAUUCigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooPSgDz34rWiXPhp3Eqo8Tq4JXPetDwBdC40K2bdlig3cY/SpfG1mb3wzqETAH92xGcdcVzvwx1JTp8FoxBkQYJ3g5oA9PooFFABRRRQAUUUUAFFFFABVW+sob63aGeNZEbqrDINWqKAPDPEHg/UPAesNrfhoS/ZWy00G75R9FA6V3fhPx/Ya1bJ50ghuMfOjHofr0rsri3juI2R1DAjBB715rr3w1b7c99o5t4ZpOGDIRge2Dj9KAPTEmjkUFHUg+hp+R614kqeN9HeKKGykdR8pZZiRj3pD4+8T2N60U2nSsq5BPPJ/GgD27Io3D1rxVvi7fRK/2jS3DKORG27Jzjr+tRz/FTUZYGFtbOJ84VNnA4/vZ65NAHtM11DAuZJFUe5rmta8d6RpNu8k1wFUA8txkjsPU15ZDf+OPEMa3kQjt/mICzIxJXjkD/APVWh4b+Heo6hqDXviV/tknVA4IVPoM0Ac/qVzqvxL1weTI66ZFINsbKBuP0NeveDPCkOhaeF+zrFK2d5AHzcnmtrTNCsdOQC3t44yBj5VArVAA6UAIq4GKpalpNlq1v5F7bRzx/3XXIq/RQB4d8RfhPpVnpl1rOm28ySRDeYbchRj1HHbFeJw2T3dzaeZcu6TuAElcjd6+o6n9a+2J4lmiZHUMrDBB7188a94Z02w+IX2ax08ukcqsIlB2xs2Dnjtx06UAa/wDwo7RnslkhuLmNzgsd2eO4HpXA6Z8OIta1iaCwvybaNjlzndgHoQQPzr6L1e9XTPCN3ckf6qBjgE56e1ef/DLQsPcagzNIJCdrOoBz36cnt1oA898EeBdP1Dxze6XqMTSxWpIGZB8xDegr3qH4ceHFVR/Z6BRztUkL+Q+tee6BaJZfGO+CMz7pSWIUbVyM4Jx1r3EdKAMu38O6XasGhsoEYcAiMZ9K0kiRBhVAHsKfRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA2RBJGyHowwa8T8Pr/AMIp8Wp9KiMgguwSS4zuPUYPsK9urxT4qRDSPHeg6xDGVZ5AHcHAPIH8sUAe1A5WvMfjHooufDyanFbwyzWjZPmHGV9M5FekWcnm2kb+qg1neKdObVvDOo2MePMmt3VM/wB7HH60AYfw3uUl8KWjJkKV6Z7967M8ivGvg9q/lW8mizNtlgdvkPHfng89TXsg5X8O1AHiHxq1SEPaxR2iG7RxiVlG5Bntn1qh4R+FEeqQW99r1xcXTMAyQPISqDqB71Q8eadLJ8VYoL0vOkrxlW2cFc9DgEHnive9KtkitY1RQAoGMelAHC6z8ItF1VFMUP2V17w/LmuZtvhLr+hyl9I1yVU2kbM4wexH6V7mAKMA0AeFX3gTx3rkE8F/rZFucKqtnLDB5O09efyri/D1g/gDxqLPXrdM+Z+7nIwMHHzAntX1OYwe1ebfGTSLa48I/a3jXzYJkKv3UE46igDv9NuUubNJI2VlIyCD1rz742XGzwhHGIg+Zw5J52gd8fjU3wtuZf7GMDRukKN+6Ehydp5pnxasp7rw+xjRpFQEkHbtHB5we/T/AD1AOp8Hbf8AhHbLAH+pX7vTpXQ9RXBfC+/e88I2O+QSSKoVmxjOOK76gDwn4z+BNS1C/wD7YsLT7UDGI9qhiynvwOPxNeFXlpqFq4tbiylt2iXDqUIPPc190socYYZrkPEXw28P+JJZJbu02zOMNJGxUn0Jx1/GgD4/sd32sKkIdmGMNX0L8F9AniWfUJ7fy0ZsRluWbGcn9T9a6DTfgr4b02YyJHM2eu+TOB6V6FY6fb6fbpBbxLHGgwFUYAoAtUUUUAFNY4Uk9BTqp6rdLZaZcXDZwiEnFAHzv46Da38ULK0jZiZJgeuRtB9vpX0LpUPk2iLjGFFeBeCI/wDhIfifdXjqGSzVsOpyCxP696+hbWPy4VBOeO9AE9FFFABRRRQAUUUUAFFFFAGbrulwaxo9zZTxq6yIQAw4Bxwa8n+Et3Jo2saj4duE2SRyGRDn7w6GvajXjnjWOPwp8SNN1wQsLe7BSVk3Yz79qAPYgcilqvZXEdzaxzRsCjqCCKsUAFFFFABRRRQAUUUUAFFFFABRRjmigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKAc0UAFFFFABRRRQAUUUUAcx4sndNKu0RAT5ZIz9K4D4SyedFI8gj84SnJCkMfrmu88WuV066ZRkqmQM15b8KGuBrF5OwJSSXGc5GcmgD3sdKWmocoKdQAUUUUAFFFFABRRRQAUUUUAFIQDS0UAMaFGHKiqs2m28v3olJHTirtFAGM/h2xfrbx/lSxeHbCI5W3jUn0UVsUUAU4tPhhUBUAx6VZWJVPAFPooAKKKKACiiigAPIrznxR4Y1xtdbVdIKyFlz5TSEAMBxxnmvRefWloA8c1HRPiHqtjLY3L2ogniIfaq8HGNvuD17Yz36V1vgTwpc+GdDW1uZVkk+8SOxPOPf0zXa4FB6GgDxfQ4tnxg1ElSZGkJbKbdoxkYPft+dezqflFeR6TcxH4wasvlksBjzDn0HHP0x+FeozajbWluZbiZIkXqzsAP1oAu0Vwd98W/C1nM0S3pnK/eaFCyjr3/AA7VLpfxQ8N6kqEXqxF32Kso2kn6envQB29FRQzx3EayRMGVhkEd6loAKKKKACiiigAooooAKKKKACiiigArhfirpMeoeDri68oPPZ4mjwuWHrjiu6qjrMJuNHu4lfYzRNhtu7Bx6d6AMPwBria54XtZ1I3qgR19GFdSwypFeO/BLUvk1TS9+5YLgsp6ZyT2r2OgD5+80+F/i41nPvWOW5d48NwRJyM/nXvVs/mQqeua8V+MsX9k+KdI1yEojqRvZhuztPpj0NeuaFex3+mwzxtuR1DA4xQB5z8ZPDN/eJY65pURe6siS2xdzYHIxx65/OpPBfxW0i+05ItUuobO9iXbMkp2jI4PWvU5YlmjZHAKkcg14l8TfBnhzRbKTU4NPUXkz/KsZKj1JwCKAPUbfxloFyF8jVrNy3ACzKea2UuYpACrr+deC+HPhbZa/wCGob3dLZ3cy71YMWHXIJB/lWN4hk8W/DzW9OWPWptQixvMOSflGAcg5wDQB9M7ga4P4u7T4CuuMv5ke0Zxk7x/9eubsPjno4IivbO9t5ApPMYIJHbg1znijxZffEkxWWlWcyafG4Ylg2ZmHbjpjNAHoPw2i8rRYFdt8pHzHIPP4V1+tWEd/p0sL5wQQcHFZfg3SptM0WCC4ULIi845/nXTlQRzQB4n4N1mXwj4sl8O6gsiwTyM1rLK2c+2e9e1RyK6ggjpXCeOvCY1e03wuyXEZ3xupxyO2fWuV8K/ES/0WV9O8UAgRfKk4jPzdOD70Ae0UVU0/UbbUrVLi2lWSNxkMpyDVugAopCM0tABRRSE4oAUnAryj4weK/7P0mSxglKyMMHGO4+tdf4x8TR6FYHZMFuCCQNueB36182XKXnxB8ZQ21mHZHbEsyg4x3PPTjtQB6Z8DtFZdMudSYbDdPkADoBXtqABQB0FYXhXQY9A0iGziHyIoUZrfoAKKKKACiiigAooooAKKKKACuJ+KOhLrfg25VYEkmhxJGWbG3HU5+ldtVTU0Mmm3KL1aNgMru7enegDmfhxqX2/wnZklS0a+W23kZHHBrsa8h+D+puZ9V0x2/497liq7duAT6dBXrw6UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFHagDjPGd7b2VvN9oLbTExwBngCuV+E2mo9hJd+WVEkxZM9evemfFnV2hBsxcbDKMKofBb1GB1rpPhjaiDwzbsHlfeN2ZVw3PtQB3YGBiloooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigApG+6aWo5shGIOAAc0AfOOp+KtQT4j6ymgQxzTSSbfMyxxjjGDx1Hb1rck8BeKvE0cEuqamXz8xV84U56AduKvfD2ztLzxbq99GdrySsGRmD55PINexxxIqqQOgoA87034V2NuwNzcTzKQCRuI55z0NaGr/DnRL2waKO2W2mVT5c8Q2lD1z+YrtyQv4V5/8AETx9YeH9JubSC6zqcqFIkVd2Ce59KAM34TeIL+8ju9JvJjP9icxiQgAnkjGB2GOteqDkV5Z8HdDmsdBN1OiLLO5c7VwfxOa9ToAKMc5oooAKZLKsMLyucKilifQCn1U1S3+16XdW5yRLCyEDGTkY70AeeW+seI/FM017pmoJZWyTFBCUB3KDwTnkEg/qPStPwJ4rutRnudI1Vw+p2rsJCq4BGeORwa8fk13xH4f0290dUS2MUuZZwuGUFh0PTjpxXs3gXw8ml28l48rTXN2RLJISeTj0J4zQB2tFFBGRigAooooAKbIu6Mr6inUUAeDac0nhT4zzWjs6W1zgICMBs9PXgYx2r3dG3ICO9eI/G2xmsNV03XreFgUdFeXOBkNwP0r13QL4ahotrdA58yNW/MUAcZ8YNNW48NR3oCbreTBZlzhW4P8ASovhRrq32jtYkYktTtJHQ57j05zxXa+JrBdS8PXtsVDFoiVBz94cjp7gV4t8K7oWXjK5s8ALPCHyWJJYHB+v1oA9+rxT4pw/2v4007THIEbKE+YE4JOSwHA/nXtanIFch488H/8ACT6Uy2xhgv05juWTLL7Aj2zQBo6JbQ2OlwW8WAsahcAdhXkfxLunm+I+l28UgHlhGGxcuGycjA9RWLr2s/EH4cQRW1xdxXNs7FY53G4sfTk5o8Faf4k8TeMYtZ1GJ8CQOZJIAOMEYHHFAHuNnoNjd2ym4tIZCy4O+MHI961LPRrGwjKWttFEpOdqIFH6VZtYjHCqnqBU9ACAAAAcYpaKKAGuiyLtYZFcH4x8FpqKm6tYF+0KwORxkZHX8BXfUhAIwRQB4Jpeq+IPA3nCGNbuwLFhb5IeP1Ht616J4e+Juh615MRuFguHH+rkYAhvT610up6Bp2rWr293axyI/XI5/OuGv/g5otzG4iaeMliwxKeCRjP8vyoA9GiuYpV3I4I9ql3DPWvJLX4eeK9IumbT/EDeSVCiOZmbA46e/v8A/rqvLoPxLt2VYtRRw2QX8zJXPc54/SgD1i61Ozs1Zri4jjCjJ3MBgV5t4s+N2haKWttNzqN2QQPJ5RT2ye/4Vhv8G9X1b5tT1uUO77ppASzP7e3Wuw8N/CTw54fWORLJJ7pP+W03zHPr6D8KAPII/D/jT4jX732pJ9jtZ2DYZcHb7D6ete4+C/BVj4X0yOCCEBhyWPJJrpYLGKDkLk9s9qs4oAUcCiiigAooooAKKKKACiiigAooooAKa4yhHqKdQelAHi/g+wm0v4parGXQBwSETAGM8ZUV7OvQV5neutj8YkYqpNzagZL9Me2P8a9LQ5UUAOooooABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFRXEohgZ2OAB1qWsXxBqMVlYyuzj5FLMO+PpQB8+/Ee+m1nxzBbQXhCq4Ux7yVUjuR75r3rwegXQLXoT5Y5AwK8K8NxR+LfG89+ke1FmAJKYORkjBGR0HevoywhEFskargAUAW6KKKACiiigAooo5zQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVk+JrlrXw3qEyffWB9v1xxWtXM+P7lbXwbqEjBDiPgPjGe1AHAeAtX0vRdIlubyVYWkmI+Zskk8nqa6a/+Keg6fa+c0xePgIUIO7Iz2PT/AANea2Pw21XxLbrNHqMVvaS/MFQu2MgBhjOOfr9K7rSPgxodl5TTB5nQ7yWxy2APTgcZAoAwNV+K+sa0VsfDekss0vy+dMwZR16bT/XrS+APh1dPqq63rayPcEhiLhdzbiOTkn1/GvWLLw9p1gQ0FqiMBjcBzWmqKvQAUAR29vHboEjUKo6AVNRRQAUUUUAFI33T9KWkb7poA+cPGEMraz4ykjjZo28tUkAxuIIyOTzjmvb/AAazP4Y09mXDG3QkZ9hXifiuCWzbxRbzxiMS3UKKAdy7C+QRgcen+Fe8eH0SLR7dEwVWNQD68UAatFFFABRRRQAUUUUAcZ8T/DreIfBd3DCm64iHmRD1I/GqHwi1t9U8JxQSxlJbQ+S2RgnHqPWu+miWaF43UMrKQQe9eRfD5Z/D3j7V9HuI/JincyQoBwQD19qAPX3UMpU9D1r5w15JfCvxHdIo2iQTboiicBCc4yMDnPT2r6Rrx740aPmG21OPeGJ8pynrzg4HXr+lAHqWk3QurKOQc7lBq8RkV518MvEBvtBt1mYCRV2uD6ivQxKpXduGPWgDxP49QJONGhOR87tuzx2HSvU/DNpHBpFsq84jHP4V5P8AF51uvHWi2zIzxqq7xztwzH0H9a9l0iNYrCJEXChQAKAL9FFFABRRRQAUUUUAFFFFABijAoooAMUUUUAFB5FFFABRRRQAUUUUAFFFFAARRRRQAUUUUAFIaCM0UAeS/EEyWPxF8P3/AJR8tj5YbHGSeefyr1W2bdAp9q82+LANvcaDftGWihuwHIXkA4744r0TT3WWyidehUEUAW6KKKACiigUAFGaKTNAC0Ug6UtABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAIehrx34u6ndadpDWtvLB5l2+0/OAwHtmvYZGCoSTgYrwTxVKviz4nW1la2rSfZAUmcqQAPfIoA7D4W+HZNM0GFrhU8xgG+UDH4Yr0tRgYqjpVqtrZxxqOFUAVfFAC0UUUAFFFFABRRRQAUUUUAFFFFABRR0ooAKKKKACiiigAooooAKKKKACiiigAooooAK87+LFwjaRaae0TOLqbBYcBcDucEc9K9EryT4izw3viuztJ3k8qBA21T/GTx9e3pQB3nhawhstHgiiXamMgFcda36oaTG0dhErkltozmr9ABRRRQAUUUUAFFFFABTX4U/SlJAqveXMdtaSzOQFRCxP0FAHy34/vp08ba9pzOssVxKnlNjJQqwOOO/WvobwHK83hPT2kYM4hUMcY5AxXzx4ysZpdM/t6VAJJ9T52gjIK5GD+Fe+fDtfs/hSyRpPMLRhg315oA7KikDBuhpaACiiigAooooAK8Y8asnhr4r6bqqytEt4mJMKADjjk17PXnXxa0eO50SPU87ZLPJyIt5YHBxntyKAO+s51ubSKZTkOoIrm/H2mPqnhXUYY3ZHWEspUZPA549xkVP4Eu/tvhGwm3ht0QOcVu3MQlhdD0ZSDQB8s+CtAl1m8vI7TVrvT7qKT5WhkbH1xxkV3cWseOPAFwh1tjrWiD5WniXMiL6kdfrnP1rD0W1Xwv8V3sVkDxyllyOMt1/OveYkjuYFDKCD3xQB4B4h8YaT4w8YaPdWhkMcYVZdyYMZ3cZzwB+NfRGmEfYo8HIwK8G+JXh+10zxto88EUEUNwwEgWPbvweSccGvd9KwLGLGMbRjFAF6iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDy/41hf8AhHrNyrELcrkqM12/hh1l0K0kXODEvXr0rkfjDZJdeF0d5lj8qdW+aIuPTnHT61v+CJkn8LWRhlVh5YG4A4P580AdRRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAGD4w1VdH8N3l2WAKRkj59pP0ODzXCfDTS/PuLzVyXzdsG2tL5hHfn0PNZ/xW8RzX2rWvh7T5kZmfM2wZKgds9sntXpfhexNppMCuPn2DcffFAG4q4UCnUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFIWAGScCgMCODQAd6WiigAooooAZK4jjZ2OABkmvEReLrnje8v1dvIEnlcKGBGQP7xwcdx6V6d441X+yPCl7cq4SXYVjJGfmPt3rzbwDYzTamnKMuVllbaoPfGBjI6/5yaAPZrZdsCD2qamoMKBTqACiiigAooprOqKWYgAckmgBxOK5XxV40s/D1odrxSXLYEaM2FznHJ/zmuf8eePpbLy9K0SJLu6ugyK6PwhHY8fXj2rD0H4d3WuSi+8UlZHkXm3jyoB9yMUAVL34rX11dNBEyhAwQfZ87z7gdSMc8VkeIPEHjjWorqx0y3vXgKhWcw7fMUqR8vPAJ59a9osfCOj2USJDp9uoTG392CfzrZW0iXogoA+Y20rxdqnh86I2g3SpuWRDIAoRsk5yQOPb3rV/wCEm+IPha0gtLrSPLjwAjRJuA7fw5/Kvoj7NED9wUPaxOPmUH60AeB+G/i3rUd2sOqxMdkgSTfGYwR7ZGN3fBx1r3DSdZtNXtFuLaZHUgE7WBxkZ7VW1fwxpms6fJZ3dsjpJycDBB9QfWvKrvTPEPwvupb6zke+0IFfMiyWdBnBOPp7gUAe4UVheGfE1h4l05buylDqeozyp9DW7QAUUUUAFZ+tWLajot3aJKY3ljKq4AJU9jg1oUHpQB5X8I9Suo47/RrwtvtJiqZXAx6CvVOoryHxYsvhT4g6ZqsTWdtZ3L+VIRlWfd1yBwcHv9K9YgmE0IZTnIoA+e/jLZ3WkeL7TULGUxzSMHiOM4PQ9vWtLw98UtX0iFF8VaZJDakYjvIIiUY+/wCFb/xwtF/sbTtRa28429wcrkdxnnjkce1bHg2yttX8JWRuoIZAUBKFQVBx6HNAHm/jLxRZeLdU0W50y5ZofOZH38BSMYO0ivetIBGnwgtuIUDPrXinxM0Sw03XNMjsLS2t8/OdgVcYOc4yD29+le06Kc6ZAc9UBoA0aKKKACiiigAooooAKKKKAADFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUfSiigDzz4xO0fgtyqb8zIGG7Ax6k1Z+F8jP4TtQzqzKCp2n/OayvjRGZtBs4hgbp8klsdB9ak+D6NH4bKFw+2VuQc96APS6KKKACik5zxS0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFVdRuls7CadzhUQsTkD+dWq5/xlfJp/hi9ncxhQhB8w4Bz2oA8k8F2yeKvHWpalcbpVgm/d73BK/gBg/WvdbdAkSgDHFeQ/BeGWTT7i7eCOKOR8LsGA2O+MV7Eq4AoAdRRRQAUUUUAFFFFABRRRQAUUUjEKpJoAWiqkWo20t09ssqGZBlk3cgVJdXUdpbSTyECONSzEnGBQBPRXO6N4y0vXBKbSUERyGMnPUj09RW4J49mSwxQAT3MNsm+aRUUdSxwBXOap4/0DS7d5pb+JwvQRtuLH0HrXnfxJ8RKPEKadNqTQ25AdlESkBcY69T+Vc79r8JCxVhO1yrEny/s+GJ5HpwPpQB2v8AwuqzlvUWK1YwyPsUscHHqeMAV6NZ6zb3VolwsiFGGQQeK+avtr6lo9zb6d4ftlaAlppiuxVAPB4Pp710vgPw5eeIdPQ399J9mic7YY5flP4D3z3oA9suPE2k2wbzb6AMoyy+YMj61x918TJZbsw6ZpjXSbgBIGJyCOuAOnar1j4C0+2uHmkkml34JRn+U857dR7Gt9LSzsYRHBDGgHACqABQBwe7xv4gs5J7i7XTLdSWCRIVkwB7/wBa1Pht4ludV01oL6ZpbiJuWbOWUnjtWxrniHR9BsWe+vYow3CpnczE+gHJrgPhc8S6/fwwF9hYn51AJGeD7fjQB7SORS0i/dFLQAUUUjHapJ7UAeV/GG+YwWenoVy5LEOpwc8demeTwa0vhzpX2O3MmYzvUNhMHb14Jx/n2rj9fnbXvHM91JDG8MJEEK/aVUuOTnrkfQjnPWvXdAtVttLgVYwmEAxnP60Aa1FFFACEgDJqJbiJujg/jVbWdP8A7U0m4sxK0RlQqHUnKn8K8O07w/dW+t3WjT6xe2OoRHfFJDMQrrnjIxgmgD3ozoELkgKOa8l8T+NtT8Q6tN4e8MxB40Pl3VySRgcggEdOnXNc54u1LxHoiJpdvrD6ks6hWikwJFP+8uDg4713/wAP9Bj0/Q4M2yQzOoeXGTljyeTzQBB4S8AQaXOLy8PnXjc7j0Ukc4H9a9EhhWNQAB60yJFUnjBqyuMUAKBgYFFFFABRRRQAVFNbxzxtHIoZWGCD3FS0UAeSa1pl18O/EA13TC/9iXMoF9arjERI4dc9s4GK9L07U4L+zS5jkVkdQwINS6jYwahZS21xEkkcilWVhkEV8/SXmveEtYuPC+nXiRoZMQGXn5W6YGM/5NAH0Bc6la2ah7ieOJMgbnYKOenWn2t/bXoY28ySBTg7TnBrw7VtBvpNLfUPEWtXE8MKgvChChm7AfnW18GrGa2tby7cSJHcy5RWYkY9RkUAewUUDpRQB5/8WvD8Gs+FWnaKdp7RvMiaDll9eO44q98PNdj1vwvbTAneqhXzwcjrXVX1nDf2ctrcRrJFIu1kYcEV5J4KR/CPjXU/D0sEkcUrmW3kLYUr6AE/XpQBv/GOVY/A8j7CZPNCoAMnkEVZ+GULR+DrFGCg7OgBGD+Nch8YNWGpXWn6BbqZn3ec6xjcQ38PGc9M/nXpfhayNrotspi8tigLITyDQB5f8bLVxf6RMArLlh8wBxzz29xXqnhaWOXQrVoirL5ajKnjgVwPxwQf2HZOygospzxk9Mjt/hXXfD9ETwpZLGyFfLH3elAHV0UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUmKAPNPjMsT+G7fdnzFmDIApPI9x0pnwfR00B1K7V85sEfxCofjXPGmj2IberCYkOvbirvwgj2+E4yQd29ixLZyc9aAPR6WkxS0AFFFFABQaKKAAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXm/wAWlZtDcpH5jKjfKS2PrxxXo5615l8YHm/sZUhWVmPVVk2oR/tY5NAFv4Tqi+DrLbt+6f516EK80+EOf+ERt8ED5jwAeOenNelgcUALRRRQAUUUUAFFFFABRRmomuIk3bnA28nJoAlqOZgIzzWBf+NNIs96JP58qruKRAnA9Sewrkrz4g3+t2EQ8PabPLLOxUuVIWMDuSwAIP8AWgDP0W6ki+MupxeYTGYQcE59Oa9N1VPP0e6Qoj5jI2vjB4714Jol/feHviy8OrzJJJd91YkDPTrz+Fe/b1msmBPDLz9KAPmbTfFcvhbV7y1SwWacy71WBvl/QH07V2tm3jfxnEgmzp1ky5ASQo2fw5I9jXOaBollB8T763uIZfLVmMPnemete2WWraRaQiM3tshTjBkAx+tAHhPjbwTNot3DLPPJco4DMztkgjPrk11HwxsdPf7VaTWcBuYHJWYrkspJ55q38S9d0rXLGW10lDeX0Q+eWGLcI17/ADdK4nwbe6ydQaPTGVJLpELO7AcLwcZB54oA9O0yytbXxXrWmiNAtyqzLhcDBG0/qKx9G1vSvCGuXkN/qJhP/PGViR16qCO/tWYbPxNp/jHTNT1W9iaGV/s+Y1yQDkgE4Gc/StDWdN0qXx5BLewLJI7BQZMkYwMYAXHX1JoA3n+I91qkgi8OaNdagp+UXGNkO76+lT2/g/xHrMjSa7r8qwSEs1paDywB/d3dcf410YutM0PT/MnmgtoVzjOFHr0rJk+KvhqEER3M0zBchYoGO76cUAaGn+APD+kuJrXT4VkXkOwLEfQnOK5HQVTTfipq1qN7ediRSx+6MZ49smr8nxM1G+UnR/C+pXK54dwEUj15rl77UbmHx9puoahbyw3EqKWgXDFeSPT0x0PagD3RDlRTqhtn8yBT7VNQAVm67qEel6Ld3chQCOMkb3CAnsMngVpV5j8VNf8AIW10qEh2d1aZNxUhe3Qjg4OaAOQ8FRDUPEELgPsLmVcOGKduuD2K9MV7zAgSJVHQCuD8BaZDFEZgT8p2IrDhAOwJFd+OnFAC0UUUAFcV468M/wBq2RvrQtFqNspaF0bGT1wfUZArtazddkEGi3kpO0JCzZ9MCgDxPwhZyax4imk1W3mN1j995uDHnjgD8K9cvb2PQtFuLxkysETPtHHQZrz74YWNu9qdSgYv57YzwMY7bQOPzNdj41uFg8GalJJvCLAc7CAfzNAHG2fxusJ0klu9Kv4Ykk2NJGnmJn/eFdBp3xc8L3UzwNf+QV53XCGNT9Ca4X4UGCw8Jahf6gFW2EzOWYZOBjr610X/AAn/AIFv3CSXds2cDEsOPzyKAOoHxQ8JZCnXLMN6b/fHWrI+IvhYrIw1uy2oQCfOGMkZ4PfofyrFtrTwXc22YrfSWik9FjIPf/Cnf2J4JtY5J/selRqWy5KIBkcf5+tAFuf4seD7eTy21q3d/wDpmC4/MAiptG+JOha7q406xlleRh8r+SwU98Zxx+NRWemeH95WwgsVdeqxIufxxXC6dMy/Fq6tYGMO2UElTlXGwcY7d/zoA9xByKKZEcoM0+gAI4rxT40aS9vPZ6xbrl9wUgJkgqcjB9TyK9rrhfilaNdeFHERAmWRSjZxjsee3BNAHnD67/wnc1jpNlvWBU33RIHJIIA/D1Br2Dw9pkWnWMUEYCrGoVceleH/AA2ntLTxhc2yyjM8e9ADu7/MCfXJPbtX0HYY8v1IoAvDpRRRQAVx3jTwPF4pNvcLcSW11bEmORDz/OuxooA838IfC+HSJTfavMb/AFElSJpDu2hegGf516MqBFwo4p1FAHnvxYtPtXhyFt23y51xlAQSeOc9B/jVX4Q30s2jTQNtaOGUqhXAAHoAO1dL4/sxeeD75TH5m1d4X6enofeuE+DUuXvI4mYwrtABHT29PyoA9iooooAKKKKACiiobm6hs7d553EcSDLMe1AE1FVbLULbUIRLbSrIh6EHNOvbyDT7SW7upVigiUs7t0AFAFiiqWnarZatAJrG5jnjPdDmrtABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUdqAPF/jleNBJpcaumCWZk4J+uDXbfDe0a28JWYdcOyBiMdM1wHxlVo/ENjcu0fleSUwRk59eOccivTPA0bx+FrFXOWES8jPp780AdLRRRQAhApaMZooATvS0UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVwfxMtJrnSAVV/JXPmOjhSo+pI/ka7snArnvF9rb3+gzxT7igG7Cru6e2DQBw3wauBJpt1EpxGkxCLvLEfia9aByOteEfCDUxbaxqGmSSEYkJVPTBxjNe6xnKA+tAD6KKTGKAFooqOdmSF2RC7AZCjvQBX1DU7TTLdprqZI0UZJJrgr74waZHOLbTrC7vrgttCRgc/1/SvOtUE3iTxrfQeIdRksbVGJjV2UfLnkZ6dq7Gz8R+DfDQW3h8vzM8vDHuJx3LAUAS3XiXx5qzltL0ZrOM/dNwVXH1ByT+n40yPwn4kvZmk1zxISjAhooolGR25I/pU4+IjXpcaVpF/cKoBSQQfKx9Ac+9Z6aB4z8SytJqN4dMtpD/q4SPM2+nGf50AXDpHgnwlHvu3i8wNuPnSF2Lf7vr+FWU8ZtdkQeH9Du7xFUfP5flIue3zY/StPSPhrotjJHcTxPeXQOfOuWLnP0PArso7WKJcKgH0FAHz9438NavJbp4iurGODU42DmKIl1I4611nhb4paPcaSYr68WG4iUKVY5LHHbjn0xivRNYtoprZw2MY/CvMtW8GeFJ2FzfS28Euc4QhS/Hp1oA4Oy0uXx18QdRvIr27istxCSAkNj0Gegr17RfhpoFpaos1kty3UtcZck+vNYGjap4X8N7IrF5WL5YADG4/jj2rbuPFfiC4AbR9CeSFhlXmO3I+mRQBa8Z6Tb2vgy9t7CBIBswPLVVCjue1eN+DtThXxDYCOVwI2MZQnqCOpI4659K9HvdI8Z+IbVk1G+t7GM4HlRKSGGDnPPvXjd9oKaL4mls4L5N1uPMGS3BHJBwP5UAel+O/GWku1rp9tOkk9tcI7gAEdcYBPf6VY8c21w8NtqFsVRyiv5knKoQR6DI/Ouc8vwld+C57lvsS6iyNIN8g37/bJyPapdQ+IGlXPgizgku5ftS7VkRODx9QQelAHaeGfh/a6hHb6prN5c6lcyKr4mc+Wp68L/jXodro1jZoFhtoox/sIBXl+h/FPRLDS7azg+23lwsagKkeWbnHU4FS3XxcvJJ0j07QLiXcQBubJ6c8KCOPrQB6p5ESJwuBjHSvJvigbaz1/RJ0cPcyEoITHv3DI5HzDHWhfEXxC1qW3gg08WAlJ3zGHIC4HPJODz6c1b0T4Uyyat/aviTUJdRuQcxrIxIQ/Xj9AKAPTdLZmsIS3UoM4GO1XajhiWGJY14CjAqSgCG6uI7W1lnlYJHGpZmPYCvn24vT4o8Xz6izE/vSIIyu0FQMDkjn1/HivQ/in4ol0bS4rS0lCz3DEMuAcpg5HPTPSs/4aWAKyu8SiMgMnyjofw9jQB2vhvTG0+wijdmb5QTuYsQfxroBTEUKoA6U+gAoopkjlFyBn6UAPrnPHM8UPg/UvOdkR4ShZU3EZ46d+tb/AJq4PPSuE+Kt3Evg6VXmMcZkUO69QM9vf8qAIvh1ZPbeGrUSPIzkE5k4JGfTtxXQ+JNF/t/QrnTS4jM67QxBO0+vas/wxIkGj2sfm7isa8k9eK6MXETqPn/I0AeM51r4cyHT59Pn1XSHBc3EKEsgx90j/PWqXhqLTPGfjiW7+wwrZRw+WiPb435554xkf4V2/wASfEAsdJjtLcxtdX7+Qis3OD1PHPt269RWx4A0KDSNGijVVL9SwAyc80ARx/DPw6hEn9nQjb91RkAV538QtK8G6DIJZdPieeQlvLDN859AAe9e63MyQwMzEAAc14qLW28X+OzfyBHsrFikasvV88k888jrQBwnh3ULXTddj1WTZpflg7bS1gZ3de4Zj9K7vwDBdav48v8AXZrWWNJC3lF4tuFyMDkdce9ekRaZpRbcbaAnGCSgrRtmtYeECLjgYxQBrJ90U6qa3kQHLjripPtcIGd4x9aALFZet2y3ljJASV3DIYHkEcg1NLqlumR5i7h2z0rC1fXI442+Yb8AqM9KAPm3SZF0bxcrAqlzbam0ZPHKscdvx7mvqzSpBJao4OcqDXybPJ9o+JUplYbZLzzPlXgnqBX1P4dk/wBAjz/dFAG5RRRQAUUUUAFFFFAFe9hFxaSwkAh1K4PuK8Z+HuoDRvGGoaTcmPJk2qQ+45Hp6D+Ve2kDrXgviBTp/wARr2Wa4hzHIjxiRMMwPIUEKc9x+VAHvSnKg0tVdOuVvNPgnT7roGFWqACiiigArm/HNy9t4XuDHEZTIQhQMQxB9Md66SuR+Icbv4ZZgsZCSqx8xsDrjrketAFD4d232fTW2zq5X5CgUKBj6d/xNVfi7qjWvgt7UqfMvJFjAABHBzznp0rU8A2wTSFm2Ro0h+ZYzlVxxgHJ44rj/jFdS3GpaXpUUe5TmThsHOcD69KANf4R6fdW+kNc3U4kebAwFAwBx1HWvTK5jwNAYfDlqpQKQg4H+TXT0AFBFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRSH1oA8T+MqouvaazJbFShDF8l+vtz+NereHih0e2ZM7TGvX6V5h8aIpFvtLnSKN1ZthLqeOfyr0zw1ltDtsjB8sdPpQBtUd+lNA29B1p1ABRRSUALRRRnjmgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKgurqG0geaeVY41GWZiABU5rwj4wa/dXepR6PbyuIN6q8aKQWPc5yOPwNAGx4w+LWyb+z/DLRXE4JEs+Cwj6dB3znr0rhxrHjHUUkZ9Yvyzj7hhUJg+5AH4Cuv8LfDwS20LXcKRQjDBAoDk+7D/APXXp1jotlp9qIoYlUfnzigD5z8Gi80j4g2y3VxuLyfMzIVLkj3HT3r6ftW3QKfUV478VtLj06+0vXreGMGCZRK5YcDPYGvU9DvY7vTYJUZWDoDwfagDWooooAD0pMcYpaKAPEviz4Yij1O11QFdpkBcSMcdeevQV1nhbwzoMUYubWygDSLnzMbiQeSMmuj8VaFb67pEtvNgHGQ3oa8e8JX+tJd3ujaZfW5WGQj5uGUZwSvUUAe3w21rBHtVEA9B2qG81Ww0+ESXFzBEvq7gVwI8NavNI0d5rdw8EmAYwSQVyCRmtGHwVolr5kl2RMjYOJmGF9/8aALl18QLfyS2mWNzf9iyKVXPpkiqwv8Axlq1xsSG3021I5dxvk/AZon8WeF9AgaCKWMmM48m3TJz2GBxzXN3vxWuZ9W+waFost0+4AOc4YevA4Ge5oA3JPB+oXasuoa5cyK3UKzLx6dcUyDwPoNpGBM7yhQBiaclfrgnHWsWO0+IfiC5lF2ttYWrjG0sSR7jac5+pp9l8Ir1rZ4b7XLl0LDITIBwc85JoA2pNY8IaBCR9otcx5+VDvbjHHH1H51i3fxStrlGh0Cwe6udp2qyt17cAHP510Fh8JPDtoYzJbvcFOnnyFuevTpXV6f4d03TVAtbOGED+4gFAHjsl18UdaAEFrHZxbeRLhCx7+4rgvEXgXVrDVVn1u9jfdhpJizMOegG4V9ZeSn90Vk6x4ds9XUCaJMgbd20Eken0oA+XbbRPDlvbD7Zfme5Afb5KjYcDjr7j8aqaUthBZXcd1pU0jg5glVScg8AcYyPx719KWnw50KCOVJLOOTzl2yZUDcPoOKcPhv4eimgkgsUi8kggISAR6Edx/hQBx3wz8K29zZPd3+mQFyf3TPGNwU846dK9UttKtLVQsVvGgHQKoAqa3tYrZQkMaogGAFHAqxQBGIY1OQuKdwCB3pxooAKraheR6fYy3UxIjiUs2Bk4FWa8o+K3ifJTQLRgZWIknBYqCvOBke4z+FAHD3d+njLxnLqcgmMcbKsCgj5QM8EZ/XNe7aHYR29mjrGFZlG49z9TXC+BvDENvOlylq8cW3I3OOp9ABwK9QjQKuO1ADhwKWiigBCcDNee+MPiMvh/Uo7GK0M0kgIyX2gcZ/pXoTfdNeJ6pa/2z8UDHgPHbgvknIDdP8AOaAMK+17x8JprmVZhbyDMaoGPr2U8dR37Vy+qXvjjWbGa0ZmmhdvnUfxcdOeR34r6YttIgeGNpY1JxyDUg0W1D/LDGM+goA+aLN/H9jbpFGs4xEMblx5ft78fWtiLXfH0VwjCCd45F2urqMocHnPf2r6EOmW5/5ZLgjrikGmwbcbF46cUAfKF3qPiTU/FVvDfmZ7mIkxgpjHuBX0x4ZhuodKgEoIYICQTzXAzWUP/C6yko+VLQFBt4J+ufrxXrsEYEahQABQByPj7Urmx8MXssDhJFjPNeK6NofjR9EtpNNMcSF/Mz0J69a9S+Msktt4OlaEZy6hsHB69v0q/wDDvbdeFLORkIJXJDdc0Aed/wBjfEt7YPJdRZcD5QOR9SPp+tUy/wARLOZYzpd1LKON6sChHQd/xr6ISCPGAoxT/s0eANo4oA8Js7/4lNEY5fD0JZl4LSbdv15q5DefEWKMJNpER7ZWQADj0z/WvbFgRf4RTvLT+6PyoA8JudW8c2r7W0BpQevlycZzXP694s1l4pIbzQbyKQowRmhbHTnJHBr6UaCNhyi/lWVqenwPA++IMu0kj2oA+SrQ30fiG01K3hKOyCQlssuemDnp0r2fw58Tkt4xBqto1s69XU71PuMVS8Gx6drV3qcEcI8gTYVJFBPI5FdXd/DjRbiPzFs0VwSQUJXn14oA67TPENnqFss0NwjoTjIP+cVso4dcg5ryWXwheaPbtJpt1KSSDsOOfqa7nwnqMt3pyLcLiZRhqAOjooooAKKKKAAjNeUfFvSHMdpqkEKtNG2xpCGJA4I6ds16vXI/Ea2a58I3Zjj3vEBIFyB0PuMH6UAWPAmof2j4Ws5eM7AOPaumry34RaqG02TTnJ82JskFcbQexHY+1epUAFFFFABXPeNI5ZfDF2I7eOf5clHJHA7jHJP4iuhqte2iXtpJbuAVcEHIzigDkvh/qIuvDsLi3MK5ICBiQADgYzziuL+I3max44sbWCN3+yBASgY7SxyT6DitGK08X+Ebqa3srAajZs+UkMxyoJ9McU3w14O1O71+bVNbt385nbLeeQp5zwuM45xgntQB6RoVkLHSoIB0VABWnTI02IFHQCn0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABQelFFAHjvxwQQw6ZdFJXIkIAV/l455Fd74Ju1u/DVnMq4DRg4Ncn8cNPmufCUV1Ark28uWKdlI5P+fWr3wm1JL7wjbAbgYhsO45PHrQB6HSZ5xQKWgAoopMc0AKfakIBHPNLRQAUUUUAFFFGaACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK828beBr3VdSj1TTzB58TBgZFyQB1AFek0UAeOx+PtbsporOXRXEiD96VGR+h4/GqsnjfxRqTuLeMWq7tuBAzsOevQ/yr2GXTLKWTzHtozIP4tozQmnW0WPLhRfooFAHher+G9f8bRyo9zOIkXhrkEbj6hVwMj3rY+E3iGaC4m8O33Fxa/KuZd+QOPWvYvs8YHCgV4j440O98HeMIfEGjx3LQ3JJuBFGGVfrigD3FG3AEU6ua8I+JIfEOkx3MeVb7ro3BVvSuloAKKKKAGsoYEEZB6ivHPEGg6loPi+XVdF04NCRl1xhMHk7RnrmvZaaUU9QDQB4TcQfEbX7mGSFBaQN95CxRQPww3b9a1D8KdY1VE/tPXHAXHyxK5Hb+8x9K9iEarjCgYpcAUAcBYfCTw1atulshcNxkynIOPbpXXWOh6fp0ax2tpDCijAEaAVpUYoAYI0AwBin4oooAO1FFFABRRRQAho60tFABRRRQAUUVXu7uKzt3mmcIiDJJoApeINZh0PR7m/l5ESZC56nsPzrxjQ9Hu/GHi+bVL5JGCnzFkU4UHsFIzkD19qb4g1m58fa3JFbS7LS2YJsGSeTxwOpPH0r1bwl4fGkWYLyySSOASXxx7dPrQBuWVosECKFwQMVcoooAKMUUUAMmbZCzHoBmvIPCPl3fxB1KdVfjJwWyFye49eK9P8AEF/Fpui3VxNIqKqHlumfSvIPhFP9p1jVZWDbnl3FuMHnnpwKAPcEA28UtIn3RSlgo5NABikbgU0zJn7wp2QQDQB4/wDEMTaF4/0TXEJMMw+zPnO1ee/1DcdOler2T74FPqAa474q2P2nwXPOhZZbR1nR1AJGOp59q3PCuppqOg2VxGxdZIVO4jGeOtAHP/Fm2abwXeSAHbFsY7Dhh84yQas/Di0S38K2UaoUCoDtLbsZ56961vGNi+o+EtVt42KyPbvtI6ggZ/pWd8NmR/B9g6xGMGPBB7kcZ/HrQB2KjApaKKACikyKWgAqlqcRlsJkUgMyMBn6Vdqrftts5W9EJ/SgDwT4TK0eu6gjAgo5UhjXvEaAQ7cdq8O+Dn+k6jqlwY8K8xwce9e7oMR4oA5vxX+48NXswk8po49wcdiKh8B3Au9DgmLByRyao/E+/ay8FagVYAsmOe+fSmfCuPyfCdqVZiGG7a2cjPbmgD0KigdKKACiiigAqvfWyXdnNA6grIhUg98irFB6UAfPvhidvDHjiS0mkliHnmJlcEKeeAOTzXv8T74w2eteI/FfSYNH1qHWVlECS8gsxI8z2UeuBz+NeieANei1zwzaXCS+YdgVj/tDrQB1tFFFABRRRQAhUN1FAUDpS0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAc546sH1HwfqVvGxVjEWyD6c4/SvMPgtqRNxeWRLbVwwDBvpxkmva7uPzrWWPOCylcjtXz54EaXR/iTcW01wCzyOjKAASc5BNAH0SvSlpkZyo9MU+gAooooAKQjNLRmgAooooAOlFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVk+I9Gg13Q7mwuE3pKhGM457VrUY4oA+c/BfiGXwF4hvNH1RrnyUIGWT7p+p7V9A2N7Fe20c0TBkdQQR3Fcj478BW3iW1ee1SKHUgPknaMNnHIB9q5Hwb4svdG19PDusTOZvuqHQjn2JPT/ADxQB7PRUcUqyJkGpKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooqte3sFhbSXFxKscUalmZjgAUASXFxHbQvLKwVEGWJPQV4H418Xaj4u8Q22l6Y8kdirMroCVYtnHzDg+nFL45+INx4kv4NM0iO5k04uVmaIOhJz6gdOD+ddd8N/Cr2gnuriMxrI2FgOcLjvzzQBpfD/wAGR6FYh5Ubz5Tufcc5x0/Cu/CgDApEUKoAGMU6gAooooAKKKKAMPxcJD4avPKkEbbPvHtXl3wbtDDPqEhlEpaYkkZwDk5xXo3jiWQ+Gr6CKJpJHhYqB3IHFcJ8G45Psl28vMhmJcbQMN34FAHrk0yW1s8shwiKWJz2FePajrmveLfGFzpukai1rZRxDLREOOfUjoecjB7V69eQtPZTRKcMyFQcZ7V4n4R1a28I+JtTstbZbWW4lBjkdcKevBP+cfhQAzW9D8VeEbVNSk8TXVxaRuoKc888Z56Z6+tet+GtTOqaHa3LSpI0iAlkOQT7VU1q/wBPfw7dSyTKYREzblIPAGeOtcp8HWnOhzNuU2jTsYAo4A/T+VAHomrWq3ul3Ns4VlkjZSGGRyMVwPwnuh/Yk9gH3LaTNEDjjHbsOPwr0lhlTXlfhaVLD4k6/pkXl+S7B1WM8KRwRjHB5HQmgD1G5iW4tniblXUgj1BrjPhur2Wm3WlzzCR7S5kRcEcLuOOB0rtVwYwfavOI86N8WpY12+VfweZtwAdw6njrQB6ZWdrOtWWh2LXd7JsjX8Savo25Qa4D4qC8/sMPDFGYF5llOMoM9skdf6d6AKFt4/1nWLm4bTNN821jDeW6xs24joMkgc/pir+k/EbfeW1hrGn3VldTyGNd8TBCeoGff8a2vCsNmuhWgtFUReWMAdq534ovbLosKji6SUSwlACysvOee3r9aAPRUkEi5HSsjxXP9l8K6rP/AM87SVumeimn+HbmS90O0uJV2vJErMPQkVS8cyNF4N1hlOCLSTB9PlNAHl/wMgB0+5kKEO0uc8jPHpXuJ+Vc15D8F4VGhM4i2lnI3HOWAr1xs+TnvQB5p8X5RH4QuEL4yR1HXmtP4YMW8J2I5BEYBB7Vz/xjmK+HBGzEb3AI7n6cGun+HSGLw7aoChQINpXjjFAHbY4paKKACiiigAooooA4/wCIegnWfDzNDEJLm2y8SEAgnvwa85+EesSWmtX2jysE+YyKm3b7HA7c/Wvc5oxLEyH+IYr5/wDFulXHgnxqNZtgxUsgLbc71P3iTwBQB9AowZQQadWXoWpQ6ppkN1A4aORQwI961KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAQjIxXh2qA2fxnhR7ss7Hcq7AAqkdM17lXzt8X0u0+I+n/2WwW7mVVU4OQ2cfyoA99W9giiDPIqjHc4qW3u4LoboZUcf7JzXjWn/DDVNaTz/Emv3s5PIhjkKoo9KVtJf4Y+I9ObTr6eXT76TypbeZ87T6g496APa6KjhbfEr+ozUlAAeKTrS0Y5oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKO3FAAfeuC8f+Ax4jNtqVjItvqVo25JMZ3L1wa7wccUYoA8h8H+OtU0/Vjo/ih4I2ztjn+4GPHBzXrFtdw3MSvFIrqehU5Fc34u8Ead4lspA9tD9q6q7L3968tutY8SfC55be5MU+mn5rchcKvP3R/nvQB77RXO+EfESeI9Dt79MjzFGQRjBroqACiiigAooooAKKKKACijtSbh3oAWioZbqKEZdgB6k1mX3ifSNORnu9QtoQoyQ8gBoA2aY8qRjLMAK8t1T406YJJodGs7nUnjBLPGu1B+J5x+FcVrV34x8YQXb3V+2m28OcWseUJOM4zxu498UAer+KPiToPhlCs9yJrn+GCH5nP19PxrxzXfFeqeOb+Czu9Ri0+ynkA+xrLhth/vY5yfetT4baDp955iTwv52AxaVQTID33YJro/HfgJ5bSPUdGRUuoCp8uMY3gf4A0AbfhHwdBpUcJR1EaA4RR97Pqe9d/DEsaAKBj2rzH4a+LZdVR7a9lthMpwsaONwA7Yr1FDkAjFADqKKKACiiigAooooA434kSLF4Q1Bvl3NCUGWCjJ9zXM/ByPy9FIDpJ8331B5+tbHxZvUsvCFw7xrIGO3axIz+VUfhKmNJY+V5cZclFB4UegoA9MByOKy9Y8OaVrtv5Oo2UNwm4Nh1zyK1Fp1AHk198FbW5u2Carcx2Mjl2tx0HOcL2A7dOleiaHodroWmQ2Nom2KJQoHetXFGKAGkcGvI4oxZ/HC+KBV+0W6ltxJJOByOMdvXtXrrdK8lvrdrr40F2KqsFuuMMAxyPzI5oA9WiOYwDivKvH7f2d8SvCt4MJ5pkhZy2MjI4/8eNeqQ/6sD2rx34zSKPEXhbEsYeOd2AJIOcpj8OKAPYbVt8Kn2pmoWEGpWMtpcorxSrtZSAR+tRaS5axi3HLbRk1foA8v03wz4r8JXd0unNb32nytujikfZ5XHOB2zz+NUJtG8X+KdWifVbOOysiSrxq4J25POcZz36d69fIB6ik2gHOKAK9larZ2scCKAkahQB2Fc18Rbz7F4H1SVwOYtg43ZyQOnfrXXVwPxbVpPA1zGhjDeYmC/Tr+v0oApfCazW28LWxXb8/zHb78/hXo7DKHPFcf4BhWLw7ZqoAUIDjGO1di/Kc9PegDxn4zNGBYpIygFuVZsA+h/Miu38CxsuhwK2wsqgZQmuA+NLLLqOj242lmf7uRzyBXpnhCLZo8A8sIdgyBQB0g6UtIOlLQAUUhz2pec+1ABRRRQAVynj7Rf7X8N3KRopl24BKk/wAufeurpCoIwQDQB4x8NNcudA1Q+GNVZExnysuCc9x1r2dWDDINebfEnwxFcaadTsmhtLq2PmCQ7UyRyDk8DmsvwL8VrW8MelatOF1FTtYqMo2O+RxQB69RUUM6TKGRgRjqKloAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAIbqdLa2kmc4VFJJzXzlpl7F4s+M0l4VHkwkugycjHHOa734y+OLPRtCm0eOUtfXIGYwP4M85PavFPBcXiW51C4k8MWu15WAaZ8N5Y9MmgD6Y1zxHpvhnRjc3soGOEjU5Zz6Ad64nQNC1fxtrUXiPXyYbeM/6LZquMLnILe/frSaR8Jrm/u11DxVqc1/OGDJHvIVPYV6vZ2sdpbrFGMKowPpQBNGuyNVxjAp9JgdaWgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAry341yxx+F4oXQN50wUg+nWvUq8h+M80qTaOgO1GlIzvZf1H+FAG98MbSK38LW8cb7geT8wPX3FbHifVNW0SIXdlbC7g6OnAMY9c9xWL8Mk8rS5sNuXzTgiXzM/jWp8RtSOm+C9RnRdzmPYBkjrx2oA8+0T4620kc66tbvFMpwPJXcP51pQ/GzTmUM8ZXPCocFjjrnB47cYrK+FHh6C7spZLq1Rmb74kGck8967+T4Y+FZpzO+kQGQnJwCB+WcUAYH/C5tMMiFIS8JxudW5XIzyKuWvxa0ie9MTB1jwT5nYfX0rQk+FnhKRNraNBz/dyP1Bqm/wc8JPgNYSFR0H2mTj/AMeoA1U+IegSSpGL2MblLAswA49zWRd/GTwpatsF20jdD5abgD25HFKnwd8J7gWsGIUbQDO/TrzzzWhH8MfCqQpF/ZMJCnOSSTn65oA5K4+NaXhMOiaRc3UxOEMmEX3z9BWKviz4laope1isokcEqNvvwOfwr2K38NaXbBRFZxLtORhRWgtnCmNsYGKAPnibTfHHiC4SHVr6+kgYgukEe1VyPwz2/OrVp8I52mEksPnBehdmBP1BBFfQC20S9EFPEarnAHNAHnnhv4bWWnWXlXSCYMPmRhx34x0xya6q78P2s+mTWQhQRyJtxt46Vt4ooA+f7ayv/h54x23Twva3IBZlkKKuSBkKele1WlxFeQKyOrqwBBByDWF8QPCMXiTSHeO2SS+hQ+ST/Lr/ADryTwz421HwhdXFprZvQI2IdJEDZ5xweMfmRxQB03i7Rm8I+J4vENjAxtZJAZ9spyGOc4XGMHjnNeo+H9TTVdLguowQsqBgG61414y+JVj4h05dJ0lLuSaV1DMEwAM8jGcn6e1ereDNPGmeHrW3UMAEHBBGD347fSgDpqKQHNLQAUUUA5oAKKKDQB5d8Y7/AMnw9Cik4kl2/KMk8HpyK0fhlaNb+HomfdlxnkYrA+M8wj061QjAably5G0Y6iup+HWz/hHbfYxZcZzQB2oGBS0dqKACiiigBkjhUYnoBXlPhvfrPxC1rVD5bRRyG3RkOfukY/ka0vij4wj0jTRpVo4bUrzCJGOwJxnpVr4feHl0HRokKf6RKA8zddzkcnNAHbJhYyelfP3xkvTfeNrWGEyuljbgyBOiszDHfnqO1e5avqcOkaXc39y+2GCMyMfYV8vHWJNY183kqP5moXZnYIfuop+XPtn3/hoA+oPDrbtJtzz/AKscEYxxWvWR4dDrpNuJCC4QZwcjpWvQAUUUUAITgZNeZ/GuZk8AzbGKt50eGHY5r0xvunNeX/GCUzeG5LXA2E5x7gUAbvw7Yy+FtPdydzQLuBHtXYv9yuW8CR+V4asVCbP3K8fhXTynCE+1AHiXxMFvJ450pZIpGKgAYbAOTzXrmgxLHYRqoKgDjNeJeNbqaf4tWtuJFEaou7Jwe5H64r3LSc/Yoic/dFAGjRRRQAUUd6KACiiigApCcUtch8QPGEPhTQmmLETyHbHhd2PqMigDzn4veJ5bu4bSYWk+zJwUQ43sM9+T1H04rm9J+E92fDaarMkjXTjzDAnDBcduDz3xit74eeGJfF2sy+J9ZQsqvi2jI2huepXJ9u9e2kRWtuxYqscY5zxigDwDQPGXiDwXGyXEcuoaYkm1ssd8Ptz/APq+le4eHfFOn+IrBLqzmDA8FTwVPoRXj3jIHxZrc8dhGbaEfKJEPzSkd9vcVRvPA3iHwcbS+0m+mUkbpnjjdgTjqyjIP40AfRYIPQ0teM+D/i23nrp3iQrDcY4nwArfUDocV6xY6raajCkttMkqOMhkbINAF6ikDA9DS0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABTXYKhJPSlJwK8u+KfxHttAsm0ewIuNTuVKbEbmMHucd/SgDyr4k3/8AwlvxHWxstr7XEOPLAz65IPP6V9AeD/DltoWi29tHEqbUGcDqa88+Dvglra0fWtRgYXU5yokXBUV7QiBVAHSgBcYpaKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArjviJ4YbxFoX+jxB7y3YSRYA3HHUAnpmuxooA+eND8eXPhO5ayudNlhjMzNNHIeUJ64PcDHpS+MfGzeOHh03T4m+wo4Msjgjce46jGPfrXvU+l2VyzNNbRSFhglkByKz4PCml2lx51tbrAS+91iG1XPuKAMrwH4dTRNIQDfuf5jubOPTHtXY01VCDCjAp1ABRRRQAUUUUAFFFBoAKKKKACiiigAPNc5rvgrQtfmSfULBJpU4BJI49ODXR0UAcBZfDHQbS8S7FnskVy6qJDgZ46fStDW/GWleG0iSVy5ZtuF7Duam8Z+JrXQdJmMlwYZ2Q+XhC3NYPhjwlHeJHquqg3E0igpHIvES9cAeueaAJ5viro8chjEdwTtVlYptU7unJ6fjU1l8S9LuGYTn7NGrbPMdxgn/PrWjrGmaVZ6a8k9rG0cI3AFecgYGMflXlCeCG8bu18IRp0AI8oqN24eu3oO2KAPQ5Piz4WilMX9oKxDFdwBxkenHP1HFVZfizpS2UV1HBcywyMRuRRgY9zXIX3wk02x01pjfuJflJluDnBAxwBjnFVPDmh6Ba3cfm6nLcsrMzI6bUZyeoBGfwFAHrmkeM9I1oL9luQWPRDwa6IMHFePax4ORAt/ody0LwfOYwzNk9eBng11/gnxC+q2EgmlSSSFyhZQQD+fegDkPjikv8AZVvsTcsjEOTjaBj+db3wpYDwrZxhydsYPPoaPipGlx4ZmXIDhSVwMnPtWH4H8XaVYaPZW8lyiyrEqsAp/oKAPYRS1zdt4y0eV2j+2orL1D5X+f1rQj8QabMf3d7A30cUAalQXcy29s8rttVFLEnsKpXeu2NpEZJbmNUHcsK8q8R+L73xfI+m6QG+ylgC4I2svct/QUAVbCJPGHj+81h1ka0tyogDD5D23Zz7V6vZuxiUqCFA4I71ieGNEWy0uO3djlQATk5JrS1zWLLw9pE17dyCOC3jLE9z6CgDhvjF4oistC/sSNt15qLKgjU8hN3JP16fjXlngfSxdaxOfJaSRR5UAldcjtk/TAxVVdWPibxnc6zeFwS+63i3btpH3RjqQOOldt4DtHXX7uzeQSSo6uXKksOmevA6e9AHuOhWv2PTLe3yT5cYXJPtWpVS1KpEoyM4q0CCKAFooooARuleSfGKbZpcMO1h50oUMDjBz1r1osOfavI/ivcR3Os6Dp6fO5nMjgdAg9fx/lQB3XhbbHpUEa5+RAP0rXvZlW2ZmOB+Vcbpuvw21gXWWMckBc8gjrXM+MfiPb2VqUiuYmlbIEQyxb8ulAHLeIJI7740wIJjtUIQFUnkf5/WvoHTwFtkyOa+dfA2kalrfi19beF4lZg+5c4bkdz9OlfRtpGy26buDjmgC1RRRQAUUUUAFFFFACE4rwD4i6nPc+Njpk1yfKlmSNleAYVOcYznPJ64/SvoCvOPiB4GbVLuPW7Qb7uEjcrn+Edlz0oA6vRba203SoooEVUVflCgD8q4jx74whknk0eC8SKEIfPkjAkYt3QDt/n3rL1P4h6lp+k3FsmmtFdJGNrO2RzxkAc+ntWL4F8EarrZS71gSC0di5jYjD85zggn+VAHcfDvTYNjzwRbISdwzbmMnPPf+lejeUhXaVBHvUNjZQ2NskEKBUUYAA6VZoA5TxF8P9E8Rw+XdWwQ7t2+L5Tnvn1rzK+8F+LPAU8l74ene6t2bHlld5Cj2xx+Fe8UhUHrQB45oHxheAC28SafNZXAbaG28MR14PSvRdH8W6RrKqbO9jkLDcFDcge47VJrfhTSNetmgvrKKQMMZ2jI+hry3xD8HpbGeS+8O3LxOoBjiiAVwe/Pf6cUAe2BgRkHNLXzraeNvG/hW98vVy91bg874vmB9OAK9E0P4vaBqUaC5uBay45WXgfnQB6NRWXp+v6ZqW4Wd7BPtxny3BxWmGU9CKAFooooAKKKCcUAFFJketGR60ALRSZFMeeNBlnUD60ASUhIHWuV1j4ieGNGjka61e13IM7EkDM3sAO9eX6h8QvFHjbWF0Xw3ANOtpAS0zEO+z1P936daANv4pfEG7sLiLRPDt4BqEjYl2JuaMUzwF8MJYr/APt7xBJ9qv3+Zc8qufb1rX8DfDGLQ5Dfam4u9QZtxlOT/OvSkQIgUDAFADIYEhUKigKO1S0UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRzmigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAopCcUtABRRRQAU122oW9BmnVBeRvLZzRxuUdkIDDqDQB5lp8Fx4p8X315c3E62dpN5aW8i4DEE/pz0r0y3iWJMKAMdK8j8L6zd+FtVudO1oBFlmLrOzg4JOMHvj0r1iC9ilQMrqQQORQBxXjm4N/qlhoUYyJn3z8sMIPp9O9dZZWkdvaoiIqoqjAAxgCuN8Y3KaX4o03VH2+WcxyPgZAJAHcevvXa2lzHPbIVYEEfnQB5l4quJ9cuL3yrhktrBirwKSBIVIJJJHH1FcBJcajd+Rc2cX/EvjGwOriVl9eSK9A8TB9A8STNc29t/Z2qN5X7r72ccEr375PTj8+O3aj4aWa0gtTc2Vw37uZSXVQcBQF3dvY+lAHT/DvV5r+7u7OZxIygPvyvzA9OAOOK2NGt5dL8cXlksyCCZTOkWQOvXAznrnnHeoPh5ol3psM1zfCLfJ90LGFIX0J71Jb36ah8SJ/LlXybWFRuCg7jzkZ9OaAOm1/w8uuaVcWc6qyyqeT2rx+7+D9ylwxhu2hBPygZIB+mc174L2FU5kX865PxH448P6KB9puPNm7RxJuJ59enb17UAeZD4deKEDbLq0kj6BZEznHrnr0qhrGna1oVm8+oQWqLtz8km3OOcAd+nSusm8da3rl39h0S1jhLtt84kOV5644GMZp+l+AtZ1TWTe65M2ApUIspcN055zgcdPegDymLRvEPie6DWlvKsIPzHc3AP8J/Lt717D4K8HS6HGjTA+a2N/J5Nd3pui2mlRiGKJIlJ4CjqT1NWb26ttPTzZpUjTbuJY4GB1NAFa7voNKtWnuZUijQZZ3OAPqa+ePHnje88YasttbRFtMtpOEjyzSEH7/A6f5711/jHV9T+IGoDw9oihLIMHmmZseYAcg4646H8RXUeD/hpFpGJ70pPcFt2SgO04xwev8A+vpQB4pothrVpfw3jaTclQWIl8snGe9dRb6xq2k3dxc/ZngncAnMf3+ccYPJ5r6CTTIEIXy12g56U+TSLWfiSFGGeMigDxS2+JOpQuqTz26sUVtsgZTk9QePpXS2XxNYRRNLJBLuXLbGHHX361383hrTbhcS2sLfVBWXP8PPDc+7fpVsdxyfkHNAGMfihZQSBbhkXI6hhjP1qRPirocinZcKSOvP6fyp1x8IPCk5UnTVUr02Ow/rUSfB3w0kBiWKZFJz8spz+dAEsnxM8PvF/wAhCJWY4wxwRXifjnxLHdeL4ryxnW8hVSqKhO7cc55/pXqOpfBHTJgDaXM0XB+V8MD9as+HfhLpmjNHLOi3EyfKrMv3aAPJNB0rxV4kLQ2pNnCW+Z5Mg47gc16f4d+EFhZqsl9/pM27cSxOM/jXpdppNtaALFGigdgK0FUUAZunaNbadGqQxKgxwAK1BwMUYpaACiiigAooooAKKKKACggEYIyKKKAKUukafNMJntIWlAxuKDNWY4UiGEUAe1SUUAFFFFABRRRQAUhANLRQBTu9Ms70AXFvHJg5G5Qa8z8SfCKzup3udPjjA2sPKcexxhuufrXrFFAHy5N4Q1TR1WSGa806dDiRmf5XGOMMMYPPT/Ctm21vx3pKCdNRW4BbcUl4IBOOjV9A3Vha3sLRXECSxt1V1yDWO/gzQ5GJOn2/IwcoORQB5tb/ABY1vTmA1fTbdo1GZHhlGV6Dkc+tS6h8c9Oj025VLaVbwDCRv0I9c12E3w10Sa5LNAPJP/LIcDPrx35rB8QfC3Sk069ubaFDKsDBN8QbHH0yTQB1PgTxHL4l8O29/NEEdx0Gfz5rqeK88+E11NN4St/O270Jj4GOAcV6GfXvQB498UfGGo+GfFFj9gDuSikxjJDDOMdcD69ax5PjN4jjuWtx4fiSULkBpi3b2wP1qv8AFbF58RrO1QkOYFQEHBGSeR713Wk/CzQjpQW4tS00q5kkLksTj1PNAHn83xT8Y3SsVOn2cT5UMQSQfz61yl/qeu6nEkl34kv5mlXKW0CuN2Tj1xg+tfQ1j8PdAsYfLSwhcFs5dQT9PpWrH4Z0iOUSrYQBwRg7BxigDwnwz8HL7U5o7jUkSGA4bY65Yggcdua9t8P+ENJ8Ow7LCyihz95lHJ+prfSNUGFAAp1ACAADApaKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABSY4xS0UAc5r3hHTdaBea3UuevbPvx3rirjwjr2hzJLpupXrwg8Q53BQBxnJ79+K9YprIGUgjOaAPDNb1PxBf6fd2OqaNHdIn3HZgjZ52nGeO361m+FPibPokq2OqWF3FZLgJK53CMHoM+le8XOl21yuJoUfnPIrndf+Hmia/DHHc2igocq68Ef4/jQBFff2X4y0MqsqTwyqMNG344yOledXmkeJ/D8cQsXV4FYhvNcuuOMfTv0FbFx8OdV8O2bHw9qV6SPuw71C+vPT6cVjw6x8QLOTypdLS7jTAPnL5bN+vP4CgCOLxX4xuLVo30nZBICPOtkZic5HHPHY5pdC+H+orElxcRsWn3NNH9oZX5IIPoCKlPjrxDbMRP4aZIwCQAG3NgjoMe/61YPxTvYYVkOjqrM5QI7spJGAQRt96AEl+G+pSyKqXcqxA5xLKSxXGNucfr798c7enfC/To5TJetLO4AVNzk7FByFHtmqB+LhjSLzdDuE81tm8uMA8jnj2NSN8Vbsp5MHh27e8JIKg/JtHG4NjkcelAHotlpNvbRqqRKu3oQKvuYYEyzBVAySeAK8oHjrxjeSE2egpFEEDATElm57Y+uaqQ6H4v8asH166uLKzddptY22fXp1/H1oA6rxF8R9HsyyadINQu4GCulv823Pv06iufTwprfjG5W58Q3MogJ3LaoNqICOAMEg/jXTaP8OdL0rGyEO3AJZF6D6D9a7K3sY4YgqggAYHtQBmaJ4fs9MiAgt40AGMquDW6IxwMUJGFGOcVJQA3aDTsUUUAFFFFABRRRQAUhGaWigBoQA5Ap1FFABRRRQAUCiigAooooAKKKKAAdKKKKACiiigAooooAKKKKACiiigAooooAKKKKACqOsI0mlXMaruLRsuMZ6j0q9TZF3IRQB5N8MtV8m1n06RGSWGZsfJtDDPXpivSJNSMcO5oyD7mvHPElmngbxu+pmCeSyuvmHlE4Ru4wBirt/wCNZvEMS6X4dtrl5Z12POQcRDHp60Ac5I7+Lvi7LeQITHbuqAhdwwvGa+h7ddsCA9QK4b4f+B/+Ecs/MnObmU7nAOQDXfAYFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAIRmloooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBpUHtVdrRCc4HtVqigCi+nwsclAe4JFQvpFs64aFDnrkVpkUY6UAYf/COaeIti2cIUnLARjBP/wCupl0S0QkLbxjPXCjmtbAoxzQBSWxiRQAg4wOlWBbopGB0qUCloAjVMAVJRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRSY96AFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCpf6baanavbXcKSwv95WHWqml+HNM0hStlaxxAnJ2jqa1qKAAADoKKKKACiiigAooooAKKKKACiiigAooooAKKTNLQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRQKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKO9FGOaACiiigAopAR0zzS0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFGc0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFIeKKKAFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKQnkCiigBaKKKACiiigAooooAKKKKACiiigAooooA//ZDQowDQp4LWFtei1jaGVja3N1bS1jcmMzMjo4RGhML0E9PQ0KDQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:06 GMT" ], "Etag": [ "\"62d43fa20e70bfa1fdb22510d1c060d2\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "8DhL/A==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "nqSml3hNvKUrnSttY6RgHzIfLSaA3KT28NIGsn5Yxb0TrcAGMlKNfTi+J6FDihsAFiyIu8HxvRg=" ], "X-Amz-Request-Id": [ "P48XTZWEHPP5B5PD" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "53e570df8bf48f92", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "38430" ], "Content-Type": [ "image/jpeg" ], "Date": [ "Thu, 19 Mar 2026 15:28:06 GMT" ], "Etag": [ "\"62d43fa20e70bfa1fdb22510d1c060d2\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:06 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "8DhL/A==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "5b3P6tIZgX/zN1ZzGjJvaQvX5hkLscsJQVjNzYCKPHsg4Aaj62Dwovqpyal4acP+d6oNwPk/MsA=" ], "X-Amz-Request-Id": [ "P48GM09GW2TJ5WFW" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "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NQu4GCulv823Pv06iufTwprfjG5W58Q3MogJ3LaoNqICOAMEg/jXTaP8OdL0rGyEO3AJZF6D6D9a7K3sY4YgqggAYHtQBmaJ4fs9MiAgt40AGMquDW6IxwMUJGFGOcVJQA3aDTsUUUAFFFFABRRRQAUhGaWigBoQA5Ap1FFABRRRQAUCiigAooooAKKKKAAdKKKKACiiigAooooAKKKKACiiigAooooAKKKKACqOsI0mlXMaruLRsuMZ6j0q9TZF3IRQB5N8MtV8m1n06RGSWGZsfJtDDPXpivSJNSMcO5oyD7mvHPElmngbxu+pmCeSyuvmHlE4Ru4wBirt/wCNZvEMS6X4dtrl5Z12POQcRDHp60Ac5I7+Lvi7LeQITHbuqAhdwwvGa+h7ddsCA9QK4b4f+B/+Ecs/MnObmU7nAOQDXfAYFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAIRmloooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBpUHtVdrRCc4HtVqigCi+nwsclAe4JFQvpFs64aFDnrkVpkUY6UAYf/COaeIti2cIUnLARjBP/wCupl0S0QkLbxjPXCjmtbAoxzQBSWxiRQAg4wOlWBbopGB0qUCloAjVMAVJRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRSY96AFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCpf6baanavbXcKSwv95WHWqml+HNM0hStlaxxAnJ2jqa1qKAAADoKKKKACiiigAooooAKKKKACiiigAooooAKKTNLQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRQKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKO9FGOaACiiigAopAR0zzS0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFGc0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFIeKKKAFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKQnkCiigBaKKKACiiigAooooAKKKKACiiigAooooA//Z" } }, { "ID": "ca22d00a7c33c49d", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "38430" ], "Content-Type": [ "image/jpeg" ], "Date": [ "Thu, 19 Mar 2026 15:28:06 GMT" ], "Etag": [ "\"62d43fa20e70bfa1fdb22510d1c060d2\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:06 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "vHi+9/cJsvvQo0MsWPLfYWtdwcdrvWJrO8AoAi5ryx1r3nZa/Pd7k1URFEI/ckRIBiYEG53NgYY=" ], "X-Amz-Request-Id": [ "P48KDB4F33871725" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "c82de332d722f18f", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "38430" ], "Content-Type": [ "image/jpeg" ], "Date": [ "Thu, 19 Mar 2026 15:28:06 GMT" ], "Etag": [ "\"62d43fa20e70bfa1fdb22510d1c060d2\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:06 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "kXQGZez22di4no3WfEFglVqS1grIsdX2mHONfScMxYzg7TJvXm98BPZOzQUa8ixAYJK1BcyJwRk=" ], "X-Amz-Request-Id": [ "P48WCHHNKD2M9654" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "2965d1d90f3e5fcf", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:06 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "EG7VSSRmRDN7B3C5Ag9RlZC69PqG0uHnaEe1fRI0x97aHvh+LjvfsFA6kfX5orrC7ChCr22q8u8=" ], "X-Amz-Request-Id": [ "P48ZM7DH1M387JBR" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestWrite/a_large_jpg_file_written_in_two_chunks_gets_a_ContentType.replay ================================================ { "Initial": "AQAAAA7hTg0FFsPv1gAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "c9d5f416cb265dd3", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "38474" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "38430" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "image/jpeg", "BodyParts": [ "OTYxZQ0K/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAH0A+gDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAooooAKKKKACiiigAooooAKKDRzQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFMkkSJS7sFUdSTQA+iq/wBth3Fd65xnGamV1YZByKAHUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAAGBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFNd1QEsQAOpNADqKwr3xhoVg+y41O2jbjgyDv0qXSfE+ka2hfT76GcA7TtbkH6UAbFFICD0NLQAUUUUAFFGRRQAUUmaTcPWgB1FN3j1FKWA7igAZgqknoK8H+InjWbVNZfSLB7zCtsWOA43sD349vf8ACvV/Getx6H4Wvb9tx2R4G3sTwDXm3wm8OQS2cmuXRWe6uJGdXcElBnpzQBg23w/8ZzWx1VdRe2ugQ8VqJTwPQt612HgDx3qt/q02haxAqXlumWIBBbnuO3avTFjQRYwOBXjscsQ+O935TNkxBWA4Gdo6468etAHtkbbkBp9RQf6sfSpaACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAzzRRRQAUUUhIHU0ALRTd6+op2QaACiiigAooooAKKKSgBaKKKACiiigAooooAKKKKACkzzS0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAjHCk+leGfFLx1Lcu+jaeWVt+C5yuSO3PHPrXtWoXAtrCaYnARCa+f/CsVpr/AMTrm4kh27GJH/TQjvQBteDPhLb3lrDqOuhppZIx+5YkY5zzg81ual8Jbe0/03wzdy6bfpkptfcjcdDnJ/KvTII0hhAHAAqG21S0unZIpkZkOGAPSgDzjw58R7iz1FNC8URi11PzCgbGFcdiPY9K9PhuEmQMjAgjNeY/GDwuuraL/adoyx31mCwbpuTuMiuK0r4u3dn4dWK2t/PvEUKzHO1T0+tAH0M0iqMkiqN7rVhYQmS5uooVHJLuAAK8bt9b8b+I51tSk1sHhwxQfu8nnduAz07Z61sxfDDU7u1SS91udpjy6uisufUZHB/GgDrbvx5pdtG0yTfaI1++0QyE6dfzFY//AAtrRxbzvtuGkjJxEqZLc4GCOOfrUtn8KdFifzLjzbgk5Ikbg57YHaujtPB+iWciywWECSKMbggzigDz+/8AjEpkENhp879N7MCpXjJ4I7fWs+38ZeM9TZpNP064G9SYy8W5Poc4A7cjNewLo1gq4FrCBnOAg61Zjto4wAqKAOmBQB5E918S4oTO0NvgA5QqWJ54IA6fmaW3uPiUbIl4UM8pUpkj5Fzzn3wf0r2DYuMYFARR2FAHjEuieP8AVdMeO+lhk8zG23lVQFI65I/+vUdnYfELSVjgiht4oUXhLeNNuc/d59QeuO1e17B6UFAe1AHkJ1P4kral5LW3B3bQvl7mJ9eD07Dp71xOneIbnS/HtzfavpzQXHypcm35AY45Oe2PSvpQxqR0FUP7HsvPkmFvGJJDl22DLfWgDldD+JWg6mgCzvC27afPQqAc9CwyM/jXaQXUU6bkdWHqDmuO8Q/DTStaVmiZ7Nnbe4twArtggMR689f8K4dPCPjvwlqAbR7yXUbJWBWIyhV285BDd/cUAe35FLXmWj/FKKG6+xeI7cabMuMlycZ98jjPNei2l9b30KTW0qyRsMqynINAFiiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACkJAHNDMFUk14/8Svik2ku+j6Q2b8nYxGcqT6Y70AdX4z+I+l+E0WJmE94+QkKHOD746V5i+vfEfxvI0mnIdOt1YDumee2eTWt4E+Hd3qdxFrPibdNPnekbnOOc5P8AhXssNjDCiqiABemBQB4LeeGPiNpdp9rbV5rnaQzJFKxbaBzycelbPgv4k6hFd29lrMwlE+7bIy4KlTjHGc+tezmNSuCARXm/xA8HW0Wh3OraVFFb3to5vC2OHI5bd+FAHpEUgkjV1OQRmn1zHgjXBrfh2zuiyF3jBYIcgHvXT0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUCigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDm/HAu/8AhGLr7Jy+35lClsr36V4F4V1P+yvHscqPuieQq+8EHBPvX09KgkQowyCMGvCvif4Hk066XW9LgJgiO6ZUYIUHc5oA9vgkE1sD1BFeF+LdS1Dwd4s8+CSRoZpCxYrhR7H1r0jwf4lh1Tw/bzLICdoUgsD04NR+JfCFr4ihfdEjyEEpuJ2nPrigCDw74ms/F2nK6uCRw6MO/wBK85tLaDwf8UrnT57Um01Ah4eBjJI7exroPCngHWfC3irfAXksHHzlnGB9PU/hXoeueD9M8Q/ZpL2FvPt23wzRsVdD7EUAatlbxrEpRQBjjAq6BUdtCIIEjBJCgDJ6mpaACiiigAooooAKKKKACiiigAooooAKTaKWigDmPFnhKz1+xYmygmukH7vzRgH2J9K8ut18VfDAtcmyku9IL5ljik3LCM9VHX8694qOWFJkKOoKngg0AYnhrxXpvifTY72wuFkVuGXoynuCOxrf615l4h+H13pt1Jrng2b7Dfg7pLVR+5n9iOgPvT/C/wAUoL27Ok65bHS9WiKpJDKRhiRxtNAHpVFRxyrIqkHORUlABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRVa/keOxnaLmURsUGcZOOOaAPNfix4/Gh6c+l6dMpv5/kyhyUB6/Q1zfw5+Hvk3S6xrDia4kXKIQSFzzk5715idahtvFM97rllNc3CSNiLO75857mtS/8AiP4k1W+SbSEmtYYQFjRTlQfU9j+NAH1NbNFHGFUjgVP5qk4Br5k0i6+J2syzPb3txFIcYUqFTBHXNbF/YfEnwzbNrl7rxniiw0sSMSAM+mAMc0AfQqnNRXltFd2c1vMu6KVCjqe4IwRWT4T1pdd8P2t9n5pE+b69622+6aAPHfhQyaTr+r6MVdHimb5cgrgMRwevQDrXsleFWVw9l8b9SSGDejNyzM3yBgDkDpyT+le4RSB0BHTFAEtFFFABRRRQAUUUUAFFFFABSb1zjIzXGePfHEXhayEEGJNQnGIowRkZ4Bx1PPavJp7nxvcvJqckOooWVZPMVDwvU4xyOO2B0oA+jcg0V4l4d+KN3pl3Fb6zPFd2Uj7Eu425QcD5hjOM8ZNeyWV/b39vHPbyrJG43KVOcigCzRRRQAUUUUAFFFFABQM45oooAKKKKACiijFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFACMcKTXkvxX8cPpsf9iWNsZ7q4jOcgNt/4Dg5rr/GfjO28Lae0hTz7huEhVwGOe/Nee/D7wzceINduvFOsRyM0r/6OJjk7fXGPyxQBw2gp4m8Hz2zzwsIZz54DcKOuVx2r6D8Oa7bavYQTxkB3UNs3AkfXFR+KPCNt4j0OWwfZG5H7qUpkxt6iub8HfDm88MysTdpIdy/OAQWUHoc0AekqB1xwafSKMACloAKKKKACiiigAprNtHNQXN5DbRs8jgBQTXk/ib4nHzZLPSZvtN0GwIYoWLNg84PT/P4UAeszXkNuheWRVAGck4rIu/FemWgQyXMY3HH3xgcZ5ryo6J498TuiNs0q0YjIaUvJj/P0rorH4M6SrmW/uru9Z1AkE0nBPqMcigDoJviT4bhKhtTg2scAq2f5fStey8UaTfQiWC+hlQ91auePwm8KnP/ABLEyV2n526enWqFz8GNAaN0s3u7TcAMxTH8+c0Ad/FqdrM5RJkZ1ALKGyRmrSyK3Qg14xqnwl8QQSxz6T4ou96YUGWRgQmOmRwfyrNtPGPi/wAATxw+KIzdWJcr5wIZwBnBOPXjrQB73RWFoXifTtds457KdZFYZ6YrcBB6UALRRRQAhFcJ49+Hdl4rtvtEP+j6nD80M6Hbkjs3qK7ykIzQB5R4E8Z3sOoyeGPEMMkGp254ZyMSDtg9+Oc16Y+o2kKAyzxp0HzMBzXnvxb8L3F5ow1zSJHh1PTyZQ0fV1A5B+grzz4e+H38d2klze63dvMshEyMxJz26nGPwoA9guviV4dtZpInumby+rJEzL+YFRzfE/w5FKsYuJZCcZ8uJm2k9jgdam0L4f6Nom54YmllY5LytuPTFaR8JaOZXm+wwiRyCzBcE4II/kKADRvFuk65G72dyGCMVIYFTkdeDWzHPFKMo6kH0NcNq3wt0W6gdrKN7O5bJEsUjDJPrz0rjLHwd448Jy3UtnqsdxCpXyoSSxcDtg8LQB7gKK8x0T4pQrNFYa7by2V8ZPJIdMBnx25OByOtekwXEdxGHjYEHmgCWiiigAooooAKKKKACop4EnQqyg5GOalooA4w/D3QU1c3rWELvJnJdQ3P49K37fRbC0j2Q20SKOgVQBVy9uBbWrykZCjNeHax8ZNdu76Wy0DSVkkRmBcqzAAH0GKAPZha28N0SgVc8kCuU+JGrWVn4N1SNp4RNJAyohkClieOK4C3n+J/iLT3hZ1t1n+UyeRtKg475+tOh+Ceu6iqHWvEUsgUAbFLNx+JoAr/AAv8fW+neGja3swQ20nVmABB5rvY/i74edMO86ZztYxHDfTFZGkfArSLOM/apnncjjtiuug+G/huGFY/7LtzjqdnJ/GgD551/wAW3f8Awnd/renxXAjlOFDcE4AwenT2r0X4ffFu8vNTTSfEVutrLJgRSlSgY+hB716oPCejKBixiyvQlc15x8Z9MtLfw/aXcapFcRXAMbKBu6HPHftQB7DG4kQOpyD0p1c74L1JdT8M2M6ur7ohyvTI4NdFQAUUUUAFFFFABRRQelAHhHjRbfVPi5psMkhZVlAIC4K7e3X1HoK9straMQKAoxivEviXbxaX8QLK+l3ojyK4kCA7TkdDn869ig1W2h0xLiWZFiCbixPbGaAMzXPAWga4h+1WSh+MPESjDGccj6mvJdO1zUvhd4wk0vVJrm40eXLRyMdwRScAj+tdzqXxp8KWbvGLiWR1BxsjPzEehryHxr42/wCEs1azbStMupkjyNkiEs+e3HbvQB9M6Xq9pq1lHdWkySxSKCrKcgiru9c4yM18ueHrr4hWmbDR7C6tY2zKUlQquTzwx/lXXaXp/wATpA1zdPtfj5GlGT/hQB7o0iKOWA+ppv2mHOPNTJ7bhXicvhrx9NObi9kNwrc7DKCI/YAde361Wm8MeLZFP+hlkzgMu4MuAexP+c0Ae7+bGf41/OnBgehFeFjSPFltNvlhvmhUqMRTMMdOncioodZ8RaYRFNdarHwSEADgEDOORn8M96APeqK8LtPilrxkSGYwCQrv2zRMm0e/ua6nTfig77Beaa7DgGS2bzByM5xjNAHpdFc7pnjXRNUYRxXqJKf+WcvyN+RrfSVJEDI4ZT0INAD6O9FFAATiiikJA70ALRWXqHiLSdLLC8v4IioywZxkD1I9KXT9f0vVP+PK+gmOM4RwePWgDTooBzRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABWXr+s2+haRPf3LAJGucE9T6CtMnAzXivxZ11tV1a18PWe+TDBpFRScseAOv40AUfD+lTePPF82ramubVCNsbgMCOw9OPpXt9nZx2kKxxqFUAAADpXO+CfDkPh/R0hXl3O52xjJNdZQAmDmloooAKKKKACiiigAqlql9Hp1jJcybiqDkKuTVwkKCT0FeR/EfxfcXV3F4e0O6zcXLbGePDAdiCCD/kUAZN/wCI9V8feJZNG0WdodNjH76dAQR0zyRj1GPavRvC/gbS/DlikVvCrPnc0rqNzH1zVfwF4Pg8M6UIgTJPJ880p/iau0AxQA1Y1UABQKfRRQAYooqGS6gibDyKp9CaAJsVla34e07X7NrbULWOeMjow6e4q7He28rFUlViOuDnFTggjigDwTVvhz4g8BiTVfCt956oWJgeL5tp984OPwrrfhv8R28Ro1jqqRW+pxHDRA/f9wK9MkjWRSrAEHgg14P8QdHk8F+L7LxHpqxpDJIA0YQD6gdOtAHvKtuAPrTqzdGvl1HTYLlCdsiBgD15FaVABRRRQAySNZEKsMg14TfwN8NvifHIg26Vq0pdnx91jnK+mM4Ne8E4ryv46WLXXgoTxKDLbzrJnbkgdyD2oA9OtpVlhRgc5GanriPhjrX9s+ELO4aQvIF2Mx6kjiu3oAKjlhWUEEdqkoPFAHnfjz4f2OtW73xkliniG7zIkBbAHbHNc58PPGFxp+tTeG9SnMsasRaXDnHmqOwzn1r1y5vII0bzXVVA5LHAr56+JNsPDnjTT9SslIidlKOvRSDyue/rz69aAPo5G3qD606sjw5qMeqaNb3URJSRAwJrXoAKKKKACiiigBAc0tFFAFbUI5JLGZIQpkKELuOBXh3wndYvFmtabc7fO8zeFYc5BINe8P8AcOOteFJatofxw3hfLivSJAAf73X9aAPdFjVVACin4pFOQDUN1KYbaWRQSVUsAO/FAEjyIn3iBVG81zTrBS11ewQgcnfIBXzh4h8b+KNf197SK+e0j3lFjU7dpH6nGOtdDYfCaS/ijudR1qeYnDlVUDJ7gk5yKAOz1z41eHNOLw2bvf3A4CRDg/jXnkms+Lfibqf2eO3+yWBYqf3WVVfUk9T0/wDrVn6r4RtPCfj/AEvZt+wTSKhDqXOT65GBzivofTLWCGBPLRQMdhQBB4S0NtA0SCyaUysg5Y1vZAqB50RCSwGBXG+LPGkOjWMsguFj2jO88ge31NAHaS3UMK7nkAHua5/UfHvh3Sw/2jUoA6ZygbJ4ryG2m8U+O939mh7ezJ+a4uMjPsq9xXf+HfhjpOnW0RuIlubnO6SWZAxY49xwPpQBHN8aPD6k+Rb6hcjGf3VuTn/PP5Vp23xS8MzwCSW7kt2xuMc8LowHrjHT36V0UGhWFsoEVvGvrtQDNU9a8JaPrsCRahYwzKhyu5RkcY4PUUAWNK8UaPrW7+z7+CfacNscEj6itOS4jijLs4CgZJJ7V4V4u+HVl4WE2r6Nq8mmyKMxopPJx0zye1cTB428aeLbVNEgnlcr8ssiDLOM9WIHHTtQB1/xj+IOkalZLpVhH9qm35EwyAuCRx69PpXLaJoni/x7NaQXc9zHp6KoYlWRCAPTuceld34P+DjJNb3+uXUk86YYIrEgY6ZJ5/CvZrWyhtYwkaKoA4AFAHlenfAvRIh/pFxcOOcgEKCCc449Oa9A0zwlpOlIgtrSJSi7Q+3LY+vWt2igCAWsS8BAB9KlVAO1OozQAmB6UYHpS0UAJtB6io3toZCC8asR0yKlooA5rUfAuh6lcG4kt2jmJyXicqc4x2rm7v4R2hG+x1S7gnByGZtw/Hpnv3716TSDmgDya/8Ah3rJRxFdLKcD95Kfm4HGMDP+etY2nah4x8JsZbi1urm3UBXjPzIuDjIORj6V7nUFzaQXcLRTxJIjdVYZFAHlA+NsEF6IbuzZEwFJCk/N39gOnevSdI8QWGs6el5aXCSRN3U5xXC+NvhtHqjJLYfut/EgXAI989ef6V5Ott4s8Naw3hjTdQjuTdgB4kcv5fr6Y/OgD3XxP8RNL8PObcCS6u8f6qIcLxkbieBXmVx4x8ceMb1k0ZZLe23gDyU28d8sc812nhr4W6Xa20c+qxte3jANI0zs4yPQE13ltbWtogSNEQKOmMAUAeMWfwc1XUpEutY1yVpicsMb+vXkn+lZPibwXP8ADyS1vrPVbpYDwSqA5YHOCMgdK+hYriCVikUiMy8EA5Irj/im0cfgm6aRcncojwoOGz15B96ANPwTq11rHh6C6u12uw44xx27mukrlfh/A9v4UtY5EVCF4CnII9eAP5V1VABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRSc59qAFooooAKKKKACiiigAooooAqahdJZ2cszkBUUkk15R4Mg/4STxdf6424xiQqFKbVyMY4z1/Kui+KmpT23h2W2gKDzxsYnOcHrjHSrPw60ZdI8PQRhQHb53Oc5J96AO0jQIoApxOBmgUY5oAWiiigAopOc0tABRRRQBn63ci00e6mJj+WM4EjbQTj1rxz4W6NJrOv3fiO7WM7mKRbVHH+feu2+Ld4bXwZMBHG+9guHzx9MEc1Z+G+mLp3hKxQRorNGGbb0JPNAHYxoEXAFOxz1paKACiiigDL13U10vTZZ2YDapPNeAya/rHjTxI+n2N09umCfMychRxxj616F8YL2W20CfbIEwuef4vYVz/wAOpdG07w6l9LeReaylmZ35XuR1oA841lfEvgzxFFanVy0sieYpVyARngH8q9J+H3xdm1C6+xawYxtGBIhwD065NeOeO/EUfiTxfNewybrYYSLdkAKPr0qnpDSWt7bnywQScYbryMGgD7bjdZEDKQQRkEVxfxS0WHVvBN6XQGW3QzRt02kVueFJZJvDlm8ow5jGQauavbQXml3NvcIrwyRsrq3QgigDjPhTqp1HwrbBiN0WU4AxgdOhPavQa8I+Dxex1a7sFuEkiDHYglDYXPXivdh0oAWs7WNasdEsZLy/uI4YkBOWOM47D1NaDHAJrwDxdcXPjz4iHSFYrZ2WV2FhgHPLEevTFAGzqPxqvri3E+heG7q5g3bTNIDt/DaP61yPij4keJdX0a50+/0IQRXKmMSbGyT3IB/Hv2r2/RNNstO0+G0hRVjiAAHrir17ptld25SaBHVieCOh9aAPHPhd8QtP063h0S7gkt5VYIHCcEn1A5Fe8RSCRAw7186/EDwQnhvVDrsChLNSoCxMcq3bg/QdK9l8C6s+s+F7K8dSrPGMg9/egDqKyfEeprpGjXF2zbQi5zWtXEfFSC4n8F3KW5+Y4zzjigDxXxDq3inxL52oAyw6cD5aNGTgehIzyCa4bU77VIZDb3k8m1lD7AeGB75966q48ciw8Ox6R9nDRyQiMhSQyMD1+hri9S1D7b5UqhVZE2YBycDj9aAPpv4Oagt34MtEVyxjyrcjr+dek15F8C7Ka28JiWZcedIWXjHHT+leu0AFFFFABRRRQAUUUUAFeR/Fy0bT9V0XXoY8eU5ilcYz1BX3PU165XC/Fuy+2eAbxhnMLLINoyeuP60Adfpl0t5psE6nIdAaluU3wOvPIxxXCfCPWxqvg+3RnJkg/dtnrxXfuMqRQB8eeNLJ9L12+cMFkt7xl256huc4/D9a6ew+J3i06Y89lo6PaQx4eRkbHAPOcit34reFmg8Y22rLBFLaXWEdXYcyZxyD2x6e9Fzf65daFLYWGgW9laeSY3a4k2AAjnAx2H8qAOGtb3xR438T2d1MGlEbJKViPyqoOMgZ69a9g8WeO5PDYs9NtPKlvZgAyOx3L6YA7nPWsb4PNaPplxAGVp4JWViMHjPrXn/xL1WWH4gXE7xIzQN5akkg4HTvigC9rHxB8VaBf+Tc38d15iBpIj/B7AjHvVnwvYaj8Q9fS+1NSunxkFYP4WI9fWvP7O0u9c1t+EaR2BkLHjH+RX058PvD66Vo8AZFD4GcUAdbpelwWFtHHFGEVRjaBWkAAMDigDA4paACuN8beO7XwtaeXGonvnB2RBgNvuf8O9a3inxHb+GdEn1CcFyg+SNfvOx6AV8/WcepeOteuLmOEy3EjL5ssg2rGM5A4OfyoAzb0+IPHOrNLKJ23Z89yfkiXP3QO3Tp717p4A8E2XhnR1ihiJdzuZ2AySfU1c8L+DrHRtNWD7OhJO6Q4J3N68k11kcaRqFVcAdB6UAKqhRgDFOorE8SeKdM8L6c15qM4jQfdXqXPoB60AbLOqAlmAArifEHxO0TR5TbW7PqF7natvajexPpx0ric+KfifetOlzPpWgZxHEpKvMvckg85rvPDnw70Xw+Ee3tVMw5MrElifxNAHOP4w8fajI/9neF47WNV3gXbks49iMAH2rPufEvxVtQssvh+3cAfMIjuz+TZzXsSxIowFFKY1JyQKAPH4vjHdaazReINDurORDgkKSCfyrtfDvxC0LxHEDZ3aeaesTHDj8K6Sawtp1IkhVs9ciuE1X4R6HcM1zpYk029GSk0DkAH/dzigD0BJ436MKkr5+Os+KvAXiu3ttenlnsGJVLnPyOOMZHY/417XomvWetWaT2sySKw6qc0Aa1FFFABRRRQBw/xK8Wjw5oyW9uUa/uzsiRienc8c1mfD7wU+nvLrWpYa/uuTxwg64Gcmum1nwXpuua7Z6peoZHtfuIWO3PqRVnxLcSad4fuGtreaWQLhUhByPy7UAYnirx1baLK1hbI0t1tyzKQREMdSM8/SvLYtR8RatqLz3V5ESzhYvNl2q6/wC7yMnPTPatbw58Mv8AhI5zrWqQzWrSSEm2cnp+hFdNL8JrCKB/sckgZnDAO5wv0oA6Pwnoh02JriY5nlUBjuzgAdM964v4iXuoeIvE9n4c0uPzIIWDXDldwVscZ9MCur8Ua5F4L8IlizNNtEMA5ZmfHFZPww8PtbWMusXiyfb79vMl8zg/l2oA73S7c22nwxMAGVACBxVygDFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFBz2ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKQnAzQAtFFIehoA8j+KMd1qOr2NhDCH3Nkhmxx+dekaDaiz0uCAY+RAP0ryv4nGX/hI9IljRWj8/BwOc5H5V61pf8Ax4xk+goAv0UA5ooAKKKKACiiigAooooA80+MshXw7bKFDbpwMbAx/wDrV2XhtFj0W1RcYEajj6Vz/wAU4oz4RlmktoZjGw2+b/CfUe9X/Ad+L7wxZSblY+WAdvTigDqqKKKACiiigDiviR4VTxPoDQiOR5UPGyQJx3znjFfLeseHLnQbuSO5RpIgzKAHwwIOORX2yRmue1bwXomsySSXVmheT77AAFvxoA+NYrP5opUO5sj92BuOa9P+HPw7v9X1aLVL6F4bYPkApjOOePSvb7P4deHrSbetjG+37gYZ2109vaw2sQjhjVEHQKMCgBbeEQQrGowAMCo9QkSKwnkfOxY2Jx6YqzWJ4s1CHTPDl7czyrGixHk+vpxQB4/8IAlx4o1WaNsRpIwiDDJZSfX8K943BUyTgDqa8b+EFhJFDPeSs3znKq3JAPI5zzVj4g+O7xrkeHdAUy3U+Y5GUZx2IHpj6UAdT4n+I2kaFA4VzcyjK7IumcZxu6flmvCNRuPFUeuN4l0rw/cWkc56rGZC2fX/APUK9e8HfDDTLGwguNRt1ub0/vGaTkKevA/E16JHp9vHEI1jUKOgAoA8d0HxjqMUKi/huBdbctE8YTp/KtmT4iNLbSRxeRDOB0d84+uK7vUPDWmajzPZxOQD1Xr9ao2ngnRreR5P7PtvNcYZljxkUAeE+MvEK6pFLA95LqFzKoAjQYii56jjn617N8NLZrPwjYxSkbxGMjPSqviT4W6LrVqVigS2nUYjkjXla4PRPEOr+AddbStXQGAyEq2f9YpOAw6gHjpkUAe+jpVW/sYtQtWgmUFT2IyKWxu1vLVJl6OMgelWc0AeJeJvgdBfX013ZzkNK5YpkIFznpwe9cLrngay8KaHHDcxxtrN3KURPMDMieoXv6cetfSut6raaNpFzf3kgSGFSSSQM+3NeH+EBdePvHUmuXkSG3hYhI2G7YoztA464Oc5/pQB6x4B0uHTPC1lDDGUXywcHrzya6qo4IlhhVFAAUYAFSUAFFFFABRRRQAUUUUAFQXkC3NnLCyqwdCuCM9qnoPSgDxH4SSHTPE+taQ6vEySbhE+Mr+XFe29q8Q8SN/winxntbyOVxb6gAZVJ4BORxx0yPevbIXEkSsO4oA8++L1oJvCDXAVQ0EgbcewPB/nXD2fhHSbnRLS/wBW165MEZEjxyXAK57g/wAuK9h8W2B1Lw1f2qHDvC2364yK+fvDEOkarbXH9vSMyW2WUtOQBnqCAeuR+vtQBtaTrOk6J8Sha6GEktL1AjJbgAIwHU/lWV8V9GW18QNrE1s09tKgA2gkI3Oc8/SpIry01fxHpx8I6LO0Vq582QAKrDPU/TrzXQ/FuSWDw40bYVnUjGPzoA5H4S6TLqmqG5C/ulfLkqCD7V9IWdqlrH8q4z79K8o+CdtCNBWVRyxORjpzXsDOQvt60AWBTC4+b2FVJL1Ily7AAVzHiXxna6VoF9dLIFkjjbZ0OW+lAHmPjO+vPHPxDbSLFRLY2eEcknCt3OM8/iK9W8LeF7bRLbEMYDNy5AxmvN/g9plxI95rOoFlkvJCyqc4xk817fCFCDGKAJdvHFLQKDQBl+INdtPD2kT6jeNiOIZxnlj2A968S8K6ZqPxJ8Tv4h1ku+mo5EFu5ynXgAZ6Ditzx/d/8Jr40tvCVm5NvaMJLx19f7v4f1r0vw7oVroenpa2sYSNRwPegC/ZWENnGEiRVUDAAGAKt0UhYAckUALR3pokU9CD+NOoAKKKKAMvXdFtNc0qexu4leKVCpBFeCSrq3wo8RKsJa40x3AAkJ+QZ/lX0fXHfELw1Hr2gy/JukjXIGOooA3dD1eDWNNiuYXDB1ycHoa1K8K+E/iSbS9en8N37MFOWgL9cZ6GvdQcjNABRRRQAU1kVxhgCO4NOooAQKFGAAKpatqlpo+ny3t7MsUMalmZjir1cV4z8GXPi+7tYpbxoLGDLbUGSzHjnnH060AeO+Pdd1DxRP8A27H50VhYufsymEFAM4DE55Jx36V6R8MfHttr2nJazMiXsfyug4z7iu007wxp2maSNPgt08kLtKlevrmvD/G/hOX4d+IrTW9FaSOzdyTGgJ2nOSCfQ0AfRQIIyKWud8IeJLbxJosF7A3DLyDjKnuDXQigBaKKKACiiigAooooAKTvS0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAYooooAKQ9KWkPQ4oA8p+KER/tLRpASo+0c7VyfWvStN/484sN/CO1edfFaNo7SyuFk2vFPuBLAf8A167DwlNLLpMQlkEhA4YelAHRUUUUAFFFFABRRRQAUUUUAY/ifTV1Xw9eWjRmQtGdqrjJPbGeK86+FWoy2kt5o1yJQ8EmR5iBcZ7cfhXrhGRivF/iNp8nhDxBbeJbESRwyuRP5fOW9/rj6UAe0KdwzS1zXhXxRZ+INOjnt36qCVPUV0uaACiiigAooooAKKKKACvIfjJrjzxWvhuyaRprlszLF1C9uMc+uPavRvEGv2eg6ZNd3UqosakjJxk+lfPmhy6j8QPHf9qyNK0UUoxj5cLngfSgD03RLCbwt4LmuBExuIoSThMlsAgHArifhht1fxlfahcyyyPHlsSnjcTzgHpXtxsEn0uS2dcq6bSD0rwXXNM1X4c+I4NbgSSYSZN4GcFWUkdB2Pt7UAfRUIGwYPGKmrkfDPjjRdesY5LO/hdyoLR7huX2Ircm1uwt0LzXUaIBklmAxQBpUV5re/GzwraX5tRPLIB1mRMoPTmr/h34maPr+9UuYkkUn5d3UevNAHdHGK8I+OTJDrOkSLG5fDBnHCquR37fX2r0HWviRoWlWjyLqNpLKpwUE44+uM/lXhHiHxZH4x8dW15eMDptsAI3RSuR75HqaAPozwk06+H7UXMwlcoDvxjIqzrfiTTNAtPP1C7jgQ8DceW9gO9eLP8AFfV7uX7DoFjHFGija8rZd+3yjpSxeDfEviy7tbrVrgyZOWVmJQDqeM4BwcYAxQBoXWp6j8WNZeyspZ7XQIGwzKoPnng5Ofr79K9Y0DQLXQ7JYLeNQepIUDJ7nApdC0Gz0W0WG1gSNRzhRitigAooooAKKKKACiiigAooooAKKO9FAHlvxksHXTbTVE2f6PKC27OcjpjA+td34avl1HQrS4V1bfGCSp4zjmmeK9P/ALS8OXkIClwm5d0Yfkc9DxXG/CLVml0a402YAS2czIQD2/pQB6POgeNge4r5W8Q6Jp+l/ES5s5jLLbzzbmiVyig57k9e9fVcgJQ7etfPXxU0yWy8YfblTEbqG+Xg479/XNAHsnhnRbDT9NjS0hREK547nrnPeuP+MfhufU/C8lxbAmSD5iAccZGf0zXZ+DLoXvhqynByWiGeMVt3NulzA8UgyrAjFAHlXwckhPhtYhgSox344zzXomr38en24kkYKGOMnoK8sjM/gX4gS27tEumXpBRVwNnYEj6it74ka3pw8Kuk1ygkJDxKG+YkZweo4z9elAHBalquufETxHdWFhcz2WlWhKl4iQ0pzjr+dYOq/C7U4pEgs7uYhz+881sgj6d6m+G/jSw0PWbiDUJVSC7ffHIpyqE9Q3pXvNvLY6msN3a3Mbqw+UqQVagD57jvPGHgFh9te4+z7R5ZiQvEOehz0r2bwD8RrPxPH5DsI7tFBZOua6vULWxlsGW4jjZcfMGAxjvXzppd3aL8TpE0SJo7Vpx+7GUAOec4yMZoA+pVYMOKralcrZ6dcXDttEcbNn6D8afasWgQnrjmuN+LV89n4AvtkojaVkjB9csOP0oA5X4SWH2681PX5iWmu5my2zAIBPSvYRhVznAFcZ8NrJbTwlYoFAPlhjjuTXYzgtA6gZJUjrigDkPE3jqz01Ta2dzA964by1Ykgkdsj34rgb/WPFuo2VvLNJOEkILJaJuXBPdsfpivO/HUs+l+IZ0k8ouHYIyqcsOnOeKl0b4matpOiQqUimCsQc5+YDoPY/SgDes/iNrGl+I/ImnuGskc71kGWUZ6gDBwMdK958Oa9ba9psdzbzCTI54wQfcdq+NdT1mTWNflv58hZHLbOoUGvbvgtq0gPkuVCynjjrxxjigD3WigdKKACmuoZSD0NOpD0oA+cvGbJoXxbsbiByjtKoZuMYPFfQtlL5tpG+c5UV89fGtVXxbBNG2243KoVRnPIINe7eG3Z9GtixO7y1znr0oA2KKKKACiiigAooooAMjOM81l+IdKGs6FeWGdpmiZAwxxkVqUUAfOfw21O68J+Mn0G83QxO7JscgDcDwR65r6JikEkYYHORXhvxk8NvpuoR+JrVz5gYFUCDhgcn3NeleAtbOu+GrW8dBHI6AugOcHvQB1dFFFABRRRQAUYxRRQAUUUUAFFFFABRRRQAUUCigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooPSgDz34rWiXPhp3Eqo8Tq4JXPetDwBdC40K2bdlig3cY/SpfG1mb3wzqETAH92xGcdcVzvwx1JTp8FoxBkQYJ3g5oA9PooFFABRRRQAUUUUAFFFFABVW+sob63aGeNZEbqrDINWqKAPDPEHg/UPAesNrfhoS/ZWy00G75R9FA6V3fhPx/Ya1bJ50ghuMfOjHofr0rsri3juI2R1DAjBB715rr3w1b7c99o5t4ZpOGDIRge2Dj9KAPTEmjkUFHUg+hp+R614kqeN9HeKKGykdR8pZZiRj3pD4+8T2N60U2nSsq5BPPJ/GgD27Io3D1rxVvi7fRK/2jS3DKORG27Jzjr+tRz/FTUZYGFtbOJ84VNnA4/vZ65NAHtM11DAuZJFUe5rmta8d6RpNu8k1wFUA8txkjsPU15ZDf+OPEMa3kQjt/mICzIxJXjkD/APVWh4b+Heo6hqDXviV/tknVA4IVPoM0Ac/qVzqvxL1weTI66ZFINsbKBuP0NeveDPCkOhaeF+zrFK2d5AHzcnmtrTNCsdOQC3t44yBj5VArVAA6UAIq4GKpalpNlq1v5F7bRzx/3XXIq/RQB4d8RfhPpVnpl1rOm28ySRDeYbchRj1HHbFeJw2T3dzaeZcu6TuAElcjd6+o6n9a+2J4lmiZHUMrDBB7188a94Z02w+IX2ax08ukcqsIlB2xs2Dnjtx06UAa/wDwo7RnslkhuLmNzgsd2eO4HpXA6Z8OIta1iaCwvybaNjlzndgHoQQPzr6L1e9XTPCN3ckf6qBjgE56e1ef/DLQsPcagzNIJCdrOoBz36cnt1oA898EeBdP1Dxze6XqMTSxWpIGZB8xDegr3qH4ceHFVR/Z6BRztUkL+Q+tee6BaJZfGO+CMz7pSWIUbVyM4Jx1r3EdKAMu38O6XasGhsoEYcAiMZ9K0kiRBhVAHsKfRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA2RBJGyHowwa8T8Pr/AMIp8Wp9KiMgguwSS4zuPUYPsK9urxT4qRDSPHeg6xDGVZ5AHcHAPIH8sUAe1A5WvMfjHooufDyanFbwyzWjZPmHGV9M5FekWcnm2kb+qg1neKdObVvDOo2MePMmt3VM/wB7HH60AYfw3uUl8KWjJkKV6Z7967M8ivGvg9q/lW8mizNtlgdvkPHfng89TXsg5X8O1AHiHxq1SEPaxR2iG7RxiVlG5Bntn1qh4R+FEeqQW99r1xcXTMAyQPISqDqB71Q8eadLJ8VYoL0vOkrxlW2cFc9DgEHnive9KtkitY1RQAoGMelAHC6z8ItF1VFMUP2V17w/LmuZtvhLr+hyl9I1yVU2kbM4wexH6V7mAKMA0AeFX3gTx3rkE8F/rZFucKqtnLDB5O09efyri/D1g/gDxqLPXrdM+Z+7nIwMHHzAntX1OYwe1ebfGTSLa48I/a3jXzYJkKv3UE46igDv9NuUubNJI2VlIyCD1rz742XGzwhHGIg+Zw5J52gd8fjU3wtuZf7GMDRukKN+6Ehydp5pnxasp7rw+xjRpFQEkHbtHB5we/T/AD1AOp8Hbf8AhHbLAH+pX7vTpXQ9RXBfC+/e88I2O+QSSKoVmxjOOK76gDwn4z+BNS1C/wD7YsLT7UDGI9qhiynvwOPxNeFXlpqFq4tbiylt2iXDqUIPPc190socYYZrkPEXw28P+JJZJbu02zOMNJGxUn0Jx1/GgD4/sd32sKkIdmGMNX0L8F9AniWfUJ7fy0ZsRluWbGcn9T9a6DTfgr4b02YyJHM2eu+TOB6V6FY6fb6fbpBbxLHGgwFUYAoAtUUUUAFNY4Uk9BTqp6rdLZaZcXDZwiEnFAHzv46Da38ULK0jZiZJgeuRtB9vpX0LpUPk2iLjGFFeBeCI/wDhIfifdXjqGSzVsOpyCxP696+hbWPy4VBOeO9AE9FFFABRRRQAUUUUAFFFFAGbrulwaxo9zZTxq6yIQAw4Bxwa8n+Et3Jo2saj4duE2SRyGRDn7w6GvajXjnjWOPwp8SNN1wQsLe7BSVk3Yz79qAPYgcilqvZXEdzaxzRsCjqCCKsUAFFFFABRRRQAUUUUAFFFFABRRjmigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKAc0UAFFFFABRRRQAUUUUAcx4sndNKu0RAT5ZIz9K4D4SyedFI8gj84SnJCkMfrmu88WuV066ZRkqmQM15b8KGuBrF5OwJSSXGc5GcmgD3sdKWmocoKdQAUUUUAFFFFABRRRQAUUUUAFIQDS0UAMaFGHKiqs2m28v3olJHTirtFAGM/h2xfrbx/lSxeHbCI5W3jUn0UVsUUAU4tPhhUBUAx6VZWJVPAFPooAKKKKACiiigAPIrznxR4Y1xtdbVdIKyFlz5TSEAMBxxnmvRefWloA8c1HRPiHqtjLY3L2ogniIfaq8HGNvuD17Yz36V1vgTwpc+GdDW1uZVkk+8SOxPOPf0zXa4FB6GgDxfQ4tnxg1ElSZGkJbKbdoxkYPft+dezqflFeR6TcxH4wasvlksBjzDn0HHP0x+FeozajbWluZbiZIkXqzsAP1oAu0Vwd98W/C1nM0S3pnK/eaFCyjr3/AA7VLpfxQ8N6kqEXqxF32Kso2kn6envQB29FRQzx3EayRMGVhkEd6loAKKKKACiiigAooooAKKKKACiiigArhfirpMeoeDri68oPPZ4mjwuWHrjiu6qjrMJuNHu4lfYzRNhtu7Bx6d6AMPwBria54XtZ1I3qgR19GFdSwypFeO/BLUvk1TS9+5YLgsp6ZyT2r2OgD5+80+F/i41nPvWOW5d48NwRJyM/nXvVs/mQqeua8V+MsX9k+KdI1yEojqRvZhuztPpj0NeuaFex3+mwzxtuR1DA4xQB5z8ZPDN/eJY65pURe6siS2xdzYHIxx65/OpPBfxW0i+05ItUuobO9iXbMkp2jI4PWvU5YlmjZHAKkcg14l8TfBnhzRbKTU4NPUXkz/KsZKj1JwCKAPUbfxloFyF8jVrNy3ACzKea2UuYpACrr+deC+HPhbZa/wCGob3dLZ3cy71YMWHXIJB/lWN4hk8W/DzW9OWPWptQixvMOSflGAcg5wDQB9M7ga4P4u7T4CuuMv5ke0Zxk7x/9eubsPjno4IivbO9t5ApPMYIJHbg1znijxZffEkxWWlWcyafG4Ylg2ZmHbjpjNAHoPw2i8rRYFdt8pHzHIPP4V1+tWEd/p0sL5wQQcHFZfg3SptM0WCC4ULIi845/nXTlQRzQB4n4N1mXwj4sl8O6gsiwTyM1rLK2c+2e9e1RyK6ggjpXCeOvCY1e03wuyXEZ3xupxyO2fWuV8K/ES/0WV9O8UAgRfKk4jPzdOD70Ae0UVU0/UbbUrVLi2lWSNxkMpyDVugAopCM0tABRRSE4oAUnAryj4weK/7P0mSxglKyMMHGO4+tdf4x8TR6FYHZMFuCCQNueB36182XKXnxB8ZQ21mHZHbEsyg4x3PPTjtQB6Z8DtFZdMudSYbDdPkADoBXtqABQB0FYXhXQY9A0iGziHyIoUZrfoAKKKKACiiigAooooAKKKKACuJ+KOhLrfg25VYEkmhxJGWbG3HU5+ldtVTU0Mmm3KL1aNgMru7enegDmfhxqX2/wnZklS0a+W23kZHHBrsa8h+D+puZ9V0x2/497liq7duAT6dBXrw6UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFHagDjPGd7b2VvN9oLbTExwBngCuV+E2mo9hJd+WVEkxZM9evemfFnV2hBsxcbDKMKofBb1GB1rpPhjaiDwzbsHlfeN2ZVw3PtQB3YGBiloooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigApG+6aWo5shGIOAAc0AfOOp+KtQT4j6ymgQxzTSSbfMyxxjjGDx1Hb1rck8BeKvE0cEuqamXz8xV84U56AduKvfD2ztLzxbq99GdrySsGRmD55PINexxxIqqQOgoA87034V2NuwNzcTzKQCRuI55z0NaGr/DnRL2waKO2W2mVT5c8Q2lD1z+YrtyQv4V5/8AETx9YeH9JubSC6zqcqFIkVd2Ce59KAM34TeIL+8ju9JvJjP9icxiQgAnkjGB2GOteqDkV5Z8HdDmsdBN1OiLLO5c7VwfxOa9ToAKMc5oooAKZLKsMLyucKilifQCn1U1S3+16XdW5yRLCyEDGTkY70AeeW+seI/FM017pmoJZWyTFBCUB3KDwTnkEg/qPStPwJ4rutRnudI1Vw+p2rsJCq4BGeORwa8fk13xH4f0290dUS2MUuZZwuGUFh0PTjpxXs3gXw8ml28l48rTXN2RLJISeTj0J4zQB2tFFBGRigAooooAKbIu6Mr6inUUAeDac0nhT4zzWjs6W1zgICMBs9PXgYx2r3dG3ICO9eI/G2xmsNV03XreFgUdFeXOBkNwP0r13QL4ahotrdA58yNW/MUAcZ8YNNW48NR3oCbreTBZlzhW4P8ASovhRrq32jtYkYktTtJHQ57j05zxXa+JrBdS8PXtsVDFoiVBz94cjp7gV4t8K7oWXjK5s8ALPCHyWJJYHB+v1oA9+rxT4pw/2v4007THIEbKE+YE4JOSwHA/nXtanIFch488H/8ACT6Uy2xhgv05juWTLL7Aj2zQBo6JbQ2OlwW8WAsahcAdhXkfxLunm+I+l28UgHlhGGxcuGycjA9RWLr2s/EH4cQRW1xdxXNs7FY53G4sfTk5o8Faf4k8TeMYtZ1GJ8CQOZJIAOMEYHHFAHuNnoNjd2ym4tIZCy4O+MHI961LPRrGwjKWttFEpOdqIFH6VZtYjHCqnqBU9ACAAAAcYpaKKAGuiyLtYZFcH4x8FpqKm6tYF+0KwORxkZHX8BXfUhAIwRQB4Jpeq+IPA3nCGNbuwLFhb5IeP1Ht616J4e+Juh615MRuFguHH+rkYAhvT610up6Bp2rWr293axyI/XI5/OuGv/g5otzG4iaeMliwxKeCRjP8vyoA9GiuYpV3I4I9ql3DPWvJLX4eeK9IumbT/EDeSVCiOZmbA46e/v8A/rqvLoPxLt2VYtRRw2QX8zJXPc54/SgD1i61Ozs1Zri4jjCjJ3MBgV5t4s+N2haKWttNzqN2QQPJ5RT2ye/4Vhv8G9X1b5tT1uUO77ppASzP7e3Wuw8N/CTw54fWORLJJ7pP+W03zHPr6D8KAPII/D/jT4jX732pJ9jtZ2DYZcHb7D6ete4+C/BVj4X0yOCCEBhyWPJJrpYLGKDkLk9s9qs4oAUcCiiigAooooAKKKKACiiigAooooAKa4yhHqKdQelAHi/g+wm0v4parGXQBwSETAGM8ZUV7OvQV5neutj8YkYqpNzagZL9Me2P8a9LQ5UUAOooooABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFRXEohgZ2OAB1qWsXxBqMVlYyuzj5FLMO+PpQB8+/Ee+m1nxzBbQXhCq4Ux7yVUjuR75r3rwegXQLXoT5Y5AwK8K8NxR+LfG89+ke1FmAJKYORkjBGR0HevoywhEFskargAUAW6KKKACiiigAooo5zQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVk+JrlrXw3qEyffWB9v1xxWtXM+P7lbXwbqEjBDiPgPjGe1AHAeAtX0vRdIlubyVYWkmI+Zskk8nqa6a/+Keg6fa+c0xePgIUIO7Iz2PT/AANea2Pw21XxLbrNHqMVvaS/MFQu2MgBhjOOfr9K7rSPgxodl5TTB5nQ7yWxy2APTgcZAoAwNV+K+sa0VsfDekss0vy+dMwZR16bT/XrS+APh1dPqq63rayPcEhiLhdzbiOTkn1/GvWLLw9p1gQ0FqiMBjcBzWmqKvQAUAR29vHboEjUKo6AVNRRQAUUUUAFI33T9KWkb7poA+cPGEMraz4ykjjZo28tUkAxuIIyOTzjmvb/AAazP4Y09mXDG3QkZ9hXifiuCWzbxRbzxiMS3UKKAdy7C+QRgcen+Fe8eH0SLR7dEwVWNQD68UAatFFFABRRRQAUUUUAcZ8T/DreIfBd3DCm64iHmRD1I/GqHwi1t9U8JxQSxlJbQ+S2RgnHqPWu+miWaF43UMrKQQe9eRfD5Z/D3j7V9HuI/JincyQoBwQD19qAPX3UMpU9D1r5w15JfCvxHdIo2iQTboiicBCc4yMDnPT2r6Rrx740aPmG21OPeGJ8pynrzg4HXr+lAHqWk3QurKOQc7lBq8RkV518MvEBvtBt1mYCRV2uD6ivQxKpXduGPWgDxP49QJONGhOR87tuzx2HSvU/DNpHBpFsq84jHP4V5P8AF51uvHWi2zIzxqq7xztwzH0H9a9l0iNYrCJEXChQAKAL9FFFABRRRQAUUUUAFFFFABijAoooAMUUUUAFB5FFFABRRRQAUUUUAFFFFAARRRRQAUUUUAFIaCM0UAeS/EEyWPxF8P3/AJR8tj5YbHGSeefyr1W2bdAp9q82+LANvcaDftGWihuwHIXkA4744r0TT3WWyidehUEUAW6KKKACiigUAFGaKTNAC0Ug6UtABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAIehrx34u6ndadpDWtvLB5l2+0/OAwHtmvYZGCoSTgYrwTxVKviz4nW1la2rSfZAUmcqQAPfIoA7D4W+HZNM0GFrhU8xgG+UDH4Yr0tRgYqjpVqtrZxxqOFUAVfFAC0UUUAFFFFABRRRQAUUUUAFFFFABRR0ooAKKKKACiiigAooooAKKKKACiiigAooooAK87+LFwjaRaae0TOLqbBYcBcDucEc9K9EryT4izw3viuztJ3k8qBA21T/GTx9e3pQB3nhawhstHgiiXamMgFcda36oaTG0dhErkltozmr9ABRRRQAUUUUAFFFFABTX4U/SlJAqveXMdtaSzOQFRCxP0FAHy34/vp08ba9pzOssVxKnlNjJQqwOOO/WvobwHK83hPT2kYM4hUMcY5AxXzx4ysZpdM/t6VAJJ9T52gjIK5GD+Fe+fDtfs/hSyRpPMLRhg315oA7KikDBuhpaACiiigAooooAK8Y8asnhr4r6bqqytEt4mJMKADjjk17PXnXxa0eO50SPU87ZLPJyIt5YHBxntyKAO+s51ubSKZTkOoIrm/H2mPqnhXUYY3ZHWEspUZPA549xkVP4Eu/tvhGwm3ht0QOcVu3MQlhdD0ZSDQB8s+CtAl1m8vI7TVrvT7qKT5WhkbH1xxkV3cWseOPAFwh1tjrWiD5WniXMiL6kdfrnP1rD0W1Xwv8V3sVkDxyllyOMt1/OveYkjuYFDKCD3xQB4B4h8YaT4w8YaPdWhkMcYVZdyYMZ3cZzwB+NfRGmEfYo8HIwK8G+JXh+10zxto88EUEUNwwEgWPbvweSccGvd9KwLGLGMbRjFAF6iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDy/41hf8AhHrNyrELcrkqM12/hh1l0K0kXODEvXr0rkfjDZJdeF0d5lj8qdW+aIuPTnHT61v+CJkn8LWRhlVh5YG4A4P580AdRRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAGD4w1VdH8N3l2WAKRkj59pP0ODzXCfDTS/PuLzVyXzdsG2tL5hHfn0PNZ/xW8RzX2rWvh7T5kZmfM2wZKgds9sntXpfhexNppMCuPn2DcffFAG4q4UCnUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFIWAGScCgMCODQAd6WiigAooooAZK4jjZ2OABkmvEReLrnje8v1dvIEnlcKGBGQP7xwcdx6V6d441X+yPCl7cq4SXYVjJGfmPt3rzbwDYzTamnKMuVllbaoPfGBjI6/5yaAPZrZdsCD2qamoMKBTqACiiigAooprOqKWYgAckmgBxOK5XxV40s/D1odrxSXLYEaM2FznHJ/zmuf8eePpbLy9K0SJLu6ugyK6PwhHY8fXj2rD0H4d3WuSi+8UlZHkXm3jyoB9yMUAVL34rX11dNBEyhAwQfZ87z7gdSMc8VkeIPEHjjWorqx0y3vXgKhWcw7fMUqR8vPAJ59a9osfCOj2USJDp9uoTG392CfzrZW0iXogoA+Y20rxdqnh86I2g3SpuWRDIAoRsk5yQOPb3rV/wCEm+IPha0gtLrSPLjwAjRJuA7fw5/Kvoj7NED9wUPaxOPmUH60AeB+G/i3rUd2sOqxMdkgSTfGYwR7ZGN3fBx1r3DSdZtNXtFuLaZHUgE7WBxkZ7VW1fwxpms6fJZ3dsjpJycDBB9QfWvKrvTPEPwvupb6zke+0IFfMiyWdBnBOPp7gUAe4UVheGfE1h4l05buylDqeozyp9DW7QAUUUUAFZ+tWLajot3aJKY3ljKq4AJU9jg1oUHpQB5X8I9Suo47/RrwtvtJiqZXAx6CvVOoryHxYsvhT4g6ZqsTWdtZ3L+VIRlWfd1yBwcHv9K9YgmE0IZTnIoA+e/jLZ3WkeL7TULGUxzSMHiOM4PQ9vWtLw98UtX0iFF8VaZJDakYjvIIiUY+/wCFb/xwtF/sbTtRa28429wcrkdxnnjkce1bHg2yttX8JWRuoIZAUBKFQVBx6HNAHm/jLxRZeLdU0W50y5ZofOZH38BSMYO0ivetIBGnwgtuIUDPrXinxM0Sw03XNMjsLS2t8/OdgVcYOc4yD29+le06Kc6ZAc9UBoA0aKKKACiiigAooooAKKKKAADFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUfSiigDzz4xO0fgtyqb8zIGG7Ax6k1Z+F8jP4TtQzqzKCp2n/OayvjRGZtBs4hgbp8klsdB9ak+D6NH4bKFw+2VuQc96APS6KKKACik5zxS0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFVdRuls7CadzhUQsTkD+dWq5/xlfJp/hi9ncxhQhB8w4Bz2oA8k8F2yeKvHWpalcbpVgm/d73BK/gBg/WvdbdAkSgDHFeQ/BeGWTT7i7eCOKOR8LsGA2O+MV7Eq4AoAdRRRQAUUUUAFFFFABRRRQAUUUjEKpJoAWiqkWo20t09ssqGZBlk3cgVJdXUdpbSTyECONSzEnGBQBPRXO6N4y0vXBKbSUERyGMnPUj09RW4J49mSwxQAT3MNsm+aRUUdSxwBXOap4/0DS7d5pb+JwvQRtuLH0HrXnfxJ8RKPEKadNqTQ25AdlESkBcY69T+Vc79r8JCxVhO1yrEny/s+GJ5HpwPpQB2v8AwuqzlvUWK1YwyPsUscHHqeMAV6NZ6zb3VolwsiFGGQQeK+avtr6lo9zb6d4ftlaAlppiuxVAPB4Pp710vgPw5eeIdPQ399J9mic7YY5flP4D3z3oA9suPE2k2wbzb6AMoyy+YMj61x918TJZbsw6ZpjXSbgBIGJyCOuAOnar1j4C0+2uHmkkml34JRn+U857dR7Gt9LSzsYRHBDGgHACqABQBwe7xv4gs5J7i7XTLdSWCRIVkwB7/wBa1Pht4ludV01oL6ZpbiJuWbOWUnjtWxrniHR9BsWe+vYow3CpnczE+gHJrgPhc8S6/fwwF9hYn51AJGeD7fjQB7SORS0i/dFLQAUUUjHapJ7UAeV/GG+YwWenoVy5LEOpwc8demeTwa0vhzpX2O3MmYzvUNhMHb14Jx/n2rj9fnbXvHM91JDG8MJEEK/aVUuOTnrkfQjnPWvXdAtVttLgVYwmEAxnP60Aa1FFFACEgDJqJbiJujg/jVbWdP8A7U0m4sxK0RlQqHUnKn8K8O07w/dW+t3WjT6xe2OoRHfFJDMQrrnjIxgmgD3ozoELkgKOa8l8T+NtT8Q6tN4e8MxB40Pl3VySRgcggEdOnXNc54u1LxHoiJpdvrD6ks6hWikwJFP+8uDg4713/wAP9Bj0/Q4M2yQzOoeXGTljyeTzQBB4S8AQaXOLy8PnXjc7j0Ukc4H9a9EhhWNQAB60yJFUnjBqyuMUAKBgYFFFFABRRRQAVFNbxzxtHIoZWGCD3FS0UAeSa1pl18O/EA13TC/9iXMoF9arjERI4dc9s4GK9L07U4L+zS5jkVkdQwINS6jYwahZS21xEkkcilWVhkEV8/SXmveEtYuPC+nXiRoZMQGXn5W6YGM/5NAH0Bc6la2ah7ieOJMgbnYKOenWn2t/bXoY28ySBTg7TnBrw7VtBvpNLfUPEWtXE8MKgvChChm7AfnW18GrGa2tby7cSJHcy5RWYkY9RkUAewUUDpRQB5/8WvD8Gs+FWnaKdp7RvMiaDll9eO44q98PNdj1vwvbTAneqhXzwcjrXVX1nDf2ctrcRrJFIu1kYcEV5J4KR/CPjXU/D0sEkcUrmW3kLYUr6AE/XpQBv/GOVY/A8j7CZPNCoAMnkEVZ+GULR+DrFGCg7OgBGD+Nch8YNWGpXWn6BbqZn3ec6xjcQ38PGc9M/nXpfhayNrotspi8tigLITyDQB5f8bLVxf6RMArLlh8wBxzz29xXqnhaWOXQrVoirL5ajKnjgVwPxwQf2HZOygospzxk9Mjt/hXXfD9ETwpZLGyFfLH3elAHV0UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUmKAPNPjMsT+G7fdnzFmDIApPI9x0pnwfR00B1K7V85sEfxCofjXPGmj2IberCYkOvbirvwgj2+E4yQd29ixLZyc9aAPR6WkxS0AFFFFABQaKKAAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXm/wAWlZtDcpH5jKjfKS2PrxxXo5615l8YHm/sZUhWVmPVVk2oR/tY5NAFv4Tqi+DrLbt+6f516EK80+EOf+ERt8ED5jwAeOenNelgcUALRRRQAUUUUAFFFFABRRmomuIk3bnA28nJoAlqOZgIzzWBf+NNIs96JP58qruKRAnA9Sewrkrz4g3+t2EQ8PabPLLOxUuVIWMDuSwAIP8AWgDP0W6ki+MupxeYTGYQcE59Oa9N1VPP0e6Qoj5jI2vjB4714Jol/feHviy8OrzJJJd91YkDPTrz+Fe/b1msmBPDLz9KAPmbTfFcvhbV7y1SwWacy71WBvl/QH07V2tm3jfxnEgmzp1ky5ASQo2fw5I9jXOaBollB8T763uIZfLVmMPnemete2WWraRaQiM3tshTjBkAx+tAHhPjbwTNot3DLPPJco4DMztkgjPrk11HwxsdPf7VaTWcBuYHJWYrkspJ55q38S9d0rXLGW10lDeX0Q+eWGLcI17/ADdK4nwbe6ydQaPTGVJLpELO7AcLwcZB54oA9O0yytbXxXrWmiNAtyqzLhcDBG0/qKx9G1vSvCGuXkN/qJhP/PGViR16qCO/tWYbPxNp/jHTNT1W9iaGV/s+Y1yQDkgE4Gc/StDWdN0qXx5BLewLJI7BQZMkYwMYAXHX1JoA3n+I91qkgi8OaNdagp+UXGNkO76+lT2/g/xHrMjSa7r8qwSEs1paDywB/d3dcf410YutM0PT/MnmgtoVzjOFHr0rJk+KvhqEER3M0zBchYoGO76cUAaGn+APD+kuJrXT4VkXkOwLEfQnOK5HQVTTfipq1qN7ediRSx+6MZ49smr8nxM1G+UnR/C+pXK54dwEUj15rl77UbmHx9puoahbyw3EqKWgXDFeSPT0x0PagD3RDlRTqhtn8yBT7VNQAVm67qEel6Ld3chQCOMkb3CAnsMngVpV5j8VNf8AIW10qEh2d1aZNxUhe3Qjg4OaAOQ8FRDUPEELgPsLmVcOGKduuD2K9MV7zAgSJVHQCuD8BaZDFEZgT8p2IrDhAOwJFd+OnFAC0UUUAFcV468M/wBq2RvrQtFqNspaF0bGT1wfUZArtazddkEGi3kpO0JCzZ9MCgDxPwhZyax4imk1W3mN1j995uDHnjgD8K9cvb2PQtFuLxkysETPtHHQZrz74YWNu9qdSgYv57YzwMY7bQOPzNdj41uFg8GalJJvCLAc7CAfzNAHG2fxusJ0klu9Kv4Ykk2NJGnmJn/eFdBp3xc8L3UzwNf+QV53XCGNT9Ca4X4UGCw8Jahf6gFW2EzOWYZOBjr610X/AAn/AIFv3CSXds2cDEsOPzyKAOoHxQ8JZCnXLMN6b/fHWrI+IvhYrIw1uy2oQCfOGMkZ4PfofyrFtrTwXc22YrfSWik9FjIPf/Cnf2J4JtY5J/selRqWy5KIBkcf5+tAFuf4seD7eTy21q3d/wDpmC4/MAiptG+JOha7q406xlleRh8r+SwU98Zxx+NRWemeH95WwgsVdeqxIufxxXC6dMy/Fq6tYGMO2UElTlXGwcY7d/zoA9xByKKZEcoM0+gAI4rxT40aS9vPZ6xbrl9wUgJkgqcjB9TyK9rrhfilaNdeFHERAmWRSjZxjsee3BNAHnD67/wnc1jpNlvWBU33RIHJIIA/D1Br2Dw9pkWnWMUEYCrGoVceleH/AA2ntLTxhc2yyjM8e9ADu7/MCfXJPbtX0HYY8v1IoAvDpRRRQAVx3jTwPF4pNvcLcSW11bEmORDz/OuxooA838IfC+HSJTfavMb/AFElSJpDu2hegGf516MqBFwo4p1FAHnvxYtPtXhyFt23y51xlAQSeOc9B/jVX4Q30s2jTQNtaOGUqhXAAHoAO1dL4/sxeeD75TH5m1d4X6enofeuE+DUuXvI4mYwrtABHT29PyoA9iooooAKKKKACiiobm6hs7d553EcSDLMe1AE1FVbLULbUIRLbSrIh6EHNOvbyDT7SW7upVigiUs7t0AFAFiiqWnarZatAJrG5jnjPdDmrtABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUdqAPF/jleNBJpcaumCWZk4J+uDXbfDe0a28JWYdcOyBiMdM1wHxlVo/ENjcu0fleSUwRk59eOccivTPA0bx+FrFXOWES8jPp780AdLRRRQAhApaMZooATvS0UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVwfxMtJrnSAVV/JXPmOjhSo+pI/ka7snArnvF9rb3+gzxT7igG7Cru6e2DQBw3wauBJpt1EpxGkxCLvLEfia9aByOteEfCDUxbaxqGmSSEYkJVPTBxjNe6xnKA+tAD6KKTGKAFooqOdmSF2RC7AZCjvQBX1DU7TTLdprqZI0UZJJrgr74waZHOLbTrC7vrgttCRgc/1/SvOtUE3iTxrfQeIdRksbVGJjV2UfLnkZ6dq7Gz8R+DfDQW3h8vzM8vDHuJx3LAUAS3XiXx5qzltL0ZrOM/dNwVXH1ByT+n40yPwn4kvZmk1zxISjAhooolGR25I/pU4+IjXpcaVpF/cKoBSQQfKx9Ac+9Z6aB4z8SytJqN4dMtpD/q4SPM2+nGf50AXDpHgnwlHvu3i8wNuPnSF2Lf7vr+FWU8ZtdkQeH9Du7xFUfP5flIue3zY/StPSPhrotjJHcTxPeXQOfOuWLnP0PArso7WKJcKgH0FAHz9438NavJbp4iurGODU42DmKIl1I4611nhb4paPcaSYr68WG4iUKVY5LHHbjn0xivRNYtoprZw2MY/CvMtW8GeFJ2FzfS28Euc4QhS/Hp1oA4Oy0uXx18QdRvIr27istxCSAkNj0Gegr17RfhpoFpaos1kty3UtcZck+vNYGjap4X8N7IrF5WL5YADG4/jj2rbuPFfiC4AbR9CeSFhlXmO3I+mRQBa8Z6Tb2vgy9t7CBIBswPLVVCjue1eN+DtThXxDYCOVwI2MZQnqCOpI4659K9HvdI8Z+IbVk1G+t7GM4HlRKSGGDnPPvXjd9oKaL4mls4L5N1uPMGS3BHJBwP5UAel+O/GWku1rp9tOkk9tcI7gAEdcYBPf6VY8c21w8NtqFsVRyiv5knKoQR6DI/Ouc8vwld+C57lvsS6iyNIN8g37/bJyPapdQ+IGlXPgizgku5ftS7VkRODx9QQelAHaeGfh/a6hHb6prN5c6lcyKr4mc+Wp68L/jXodro1jZoFhtoox/sIBXl+h/FPRLDS7azg+23lwsagKkeWbnHU4FS3XxcvJJ0j07QLiXcQBubJ6c8KCOPrQB6p5ESJwuBjHSvJvigbaz1/RJ0cPcyEoITHv3DI5HzDHWhfEXxC1qW3gg08WAlJ3zGHIC4HPJODz6c1b0T4Uyyat/aviTUJdRuQcxrIxIQ/Xj9AKAPTdLZmsIS3UoM4GO1XajhiWGJY14CjAqSgCG6uI7W1lnlYJHGpZmPYCvn24vT4o8Xz6izE/vSIIyu0FQMDkjn1/HivQ/in4ol0bS4rS0lCz3DEMuAcpg5HPTPSs/4aWAKyu8SiMgMnyjofw9jQB2vhvTG0+wijdmb5QTuYsQfxroBTEUKoA6U+gAoopkjlFyBn6UAPrnPHM8UPg/UvOdkR4ShZU3EZ46d+tb/AJq4PPSuE+Kt3Evg6VXmMcZkUO69QM9vf8qAIvh1ZPbeGrUSPIzkE5k4JGfTtxXQ+JNF/t/QrnTS4jM67QxBO0+vas/wxIkGj2sfm7isa8k9eK6MXETqPn/I0AeM51r4cyHT59Pn1XSHBc3EKEsgx90j/PWqXhqLTPGfjiW7+wwrZRw+WiPb435554xkf4V2/wASfEAsdJjtLcxtdX7+Qis3OD1PHPt269RWx4A0KDSNGijVVL9SwAyc80ARx/DPw6hEn9nQjb91RkAV538QtK8G6DIJZdPieeQlvLDN859AAe9e63MyQwMzEAAc14qLW28X+OzfyBHsrFikasvV88k888jrQBwnh3ULXTddj1WTZpflg7bS1gZ3de4Zj9K7vwDBdav48v8AXZrWWNJC3lF4tuFyMDkdce9ekRaZpRbcbaAnGCSgrRtmtYeECLjgYxQBrJ90U6qa3kQHLjripPtcIGd4x9aALFZet2y3ljJASV3DIYHkEcg1NLqlumR5i7h2z0rC1fXI442+Yb8AqM9KAPm3SZF0bxcrAqlzbam0ZPHKscdvx7mvqzSpBJao4OcqDXybPJ9o+JUplYbZLzzPlXgnqBX1P4dk/wBAjz/dFAG5RRRQAUUUUAFFFFAFe9hFxaSwkAh1K4PuK8Z+HuoDRvGGoaTcmPJk2qQ+45Hp6D+Ve2kDrXgviBTp/wARr2Wa4hzHIjxiRMMwPIUEKc9x+VAHvSnKg0tVdOuVvNPgnT7roGFWqACiiigArm/HNy9t4XuDHEZTIQhQMQxB9Md66SuR+Icbv4ZZgsZCSqx8xsDrjrketAFD4d232fTW2zq5X5CgUKBj6d/xNVfi7qjWvgt7UqfMvJFjAABHBzznp0rU8A2wTSFm2Ro0h+ZYzlVxxgHJ44rj/jFdS3GpaXpUUe5TmThsHOcD69KANf4R6fdW+kNc3U4kebAwFAwBx1HWvTK5jwNAYfDlqpQKQg4H+TXT0AFBFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRSH1oA8T+MqouvaazJbFShDF8l+vtz+NereHih0e2ZM7TGvX6V5h8aIpFvtLnSKN1ZthLqeOfyr0zw1ltDtsjB8sdPpQBtUd+lNA29B1p1ABRRSUALRRRnjmgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKgurqG0geaeVY41GWZiABU5rwj4wa/dXepR6PbyuIN6q8aKQWPc5yOPwNAGx4w+LWyb+z/DLRXE4JEs+Cwj6dB3znr0rhxrHjHUUkZ9Yvyzj7hhUJg+5AH4Cuv8LfDwS20LXcKRQjDBAoDk+7D/APXXp1jotlp9qIoYlUfnzigD5z8Gi80j4g2y3VxuLyfMzIVLkj3HT3r6ftW3QKfUV478VtLj06+0vXreGMGCZRK5YcDPYGvU9DvY7vTYJUZWDoDwfagDWooooAD0pMcYpaKAPEviz4Yij1O11QFdpkBcSMcdeevQV1nhbwzoMUYubWygDSLnzMbiQeSMmuj8VaFb67pEtvNgHGQ3oa8e8JX+tJd3ujaZfW5WGQj5uGUZwSvUUAe3w21rBHtVEA9B2qG81Ww0+ESXFzBEvq7gVwI8NavNI0d5rdw8EmAYwSQVyCRmtGHwVolr5kl2RMjYOJmGF9/8aALl18QLfyS2mWNzf9iyKVXPpkiqwv8Axlq1xsSG3021I5dxvk/AZon8WeF9AgaCKWMmM48m3TJz2GBxzXN3vxWuZ9W+waFost0+4AOc4YevA4Ge5oA3JPB+oXasuoa5cyK3UKzLx6dcUyDwPoNpGBM7yhQBiaclfrgnHWsWO0+IfiC5lF2ttYWrjG0sSR7jac5+pp9l8Ir1rZ4b7XLl0LDITIBwc85JoA2pNY8IaBCR9otcx5+VDvbjHHH1H51i3fxStrlGh0Cwe6udp2qyt17cAHP510Fh8JPDtoYzJbvcFOnnyFuevTpXV6f4d03TVAtbOGED+4gFAHjsl18UdaAEFrHZxbeRLhCx7+4rgvEXgXVrDVVn1u9jfdhpJizMOegG4V9ZeSn90Vk6x4ds9XUCaJMgbd20Eken0oA+XbbRPDlvbD7Zfme5Afb5KjYcDjr7j8aqaUthBZXcd1pU0jg5glVScg8AcYyPx719KWnw50KCOVJLOOTzl2yZUDcPoOKcPhv4eimgkgsUi8kggISAR6Edx/hQBx3wz8K29zZPd3+mQFyf3TPGNwU846dK9UttKtLVQsVvGgHQKoAqa3tYrZQkMaogGAFHAqxQBGIY1OQuKdwCB3pxooAKraheR6fYy3UxIjiUs2Bk4FWa8o+K3ifJTQLRgZWIknBYqCvOBke4z+FAHD3d+njLxnLqcgmMcbKsCgj5QM8EZ/XNe7aHYR29mjrGFZlG49z9TXC+BvDENvOlylq8cW3I3OOp9ABwK9QjQKuO1ADhwKWiigBCcDNee+MPiMvh/Uo7GK0M0kgIyX2gcZ/pXoTfdNeJ6pa/2z8UDHgPHbgvknIDdP8AOaAMK+17x8JprmVZhbyDMaoGPr2U8dR37Vy+qXvjjWbGa0ZmmhdvnUfxcdOeR34r6YttIgeGNpY1JxyDUg0W1D/LDGM+goA+aLN/H9jbpFGs4xEMblx5ft78fWtiLXfH0VwjCCd45F2urqMocHnPf2r6EOmW5/5ZLgjrikGmwbcbF46cUAfKF3qPiTU/FVvDfmZ7mIkxgpjHuBX0x4ZhuodKgEoIYICQTzXAzWUP/C6yko+VLQFBt4J+ufrxXrsEYEahQABQByPj7Urmx8MXssDhJFjPNeK6NofjR9EtpNNMcSF/Mz0J69a9S+Msktt4OlaEZy6hsHB69v0q/wDDvbdeFLORkIJXJDdc0Aed/wBjfEt7YPJdRZcD5QOR9SPp+tUy/wARLOZYzpd1LKON6sChHQd/xr6ISCPGAoxT/s0eANo4oA8Js7/4lNEY5fD0JZl4LSbdv15q5DefEWKMJNpER7ZWQADj0z/WvbFgRf4RTvLT+6PyoA8JudW8c2r7W0BpQevlycZzXP694s1l4pIbzQbyKQowRmhbHTnJHBr6UaCNhyi/lWVqenwPA++IMu0kj2oA+SrQ30fiG01K3hKOyCQlssuemDnp0r2fw58Tkt4xBqto1s69XU71PuMVS8Gx6drV3qcEcI8gTYVJFBPI5FdXd/DjRbiPzFs0VwSQUJXn14oA67TPENnqFss0NwjoTjIP+cVso4dcg5ryWXwheaPbtJpt1KSSDsOOfqa7nwnqMt3pyLcLiZRhqAOjooooAKKKKAAjNeUfFvSHMdpqkEKtNG2xpCGJA4I6ds16vXI/Ea2a58I3Zjj3vEBIFyB0PuMH6UAWPAmof2j4Ws5eM7AOPaumry34RaqG02TTnJ82JskFcbQexHY+1epUAFFFFABXPeNI5ZfDF2I7eOf5clHJHA7jHJP4iuhqte2iXtpJbuAVcEHIzigDkvh/qIuvDsLi3MK5ICBiQADgYzziuL+I3max44sbWCN3+yBASgY7SxyT6DitGK08X+Ebqa3srAajZs+UkMxyoJ9McU3w14O1O71+bVNbt385nbLeeQp5zwuM45xgntQB6RoVkLHSoIB0VABWnTI02IFHQCn0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABQelFFAHjvxwQQw6ZdFJXIkIAV/l455Fd74Ju1u/DVnMq4DRg4Ncn8cNPmufCUV1Ark28uWKdlI5P+fWr3wm1JL7wjbAbgYhsO45PHrQB6HSZ5xQKWgAoopMc0AKfakIBHPNLRQAUUUUAFFFGaACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK828beBr3VdSj1TTzB58TBgZFyQB1AFek0UAeOx+PtbsporOXRXEiD96VGR+h4/GqsnjfxRqTuLeMWq7tuBAzsOevQ/yr2GXTLKWTzHtozIP4tozQmnW0WPLhRfooFAHher+G9f8bRyo9zOIkXhrkEbj6hVwMj3rY+E3iGaC4m8O33Fxa/KuZd+QOPWvYvs8YHCgV4j440O98HeMIfEGjx3LQ3JJuBFGGVfrigD3FG3AEU6ua8I+JIfEOkx3MeVb7ro3BVvSuloAKKKKAGsoYEEZB6ivHPEGg6loPi+XVdF04NCRl1xhMHk7RnrmvZaaUU9QDQB4TcQfEbX7mGSFBaQN95CxRQPww3b9a1D8KdY1VE/tPXHAXHyxK5Hb+8x9K9iEarjCgYpcAUAcBYfCTw1atulshcNxkynIOPbpXXWOh6fp0ax2tpDCijAEaAVpUYoAYI0AwBin4oooAO1FFFABRRRQAho60tFABRRRQAUUVXu7uKzt3mmcIiDJJoApeINZh0PR7m/l5ESZC56nsPzrxjQ9Hu/GHi+bVL5JGCnzFkU4UHsFIzkD19qb4g1m58fa3JFbS7LS2YJsGSeTxwOpPH0r1bwl4fGkWYLyySSOASXxx7dPrQBuWVosECKFwQMVcoooAKMUUUAMmbZCzHoBmvIPCPl3fxB1KdVfjJwWyFye49eK9P8AEF/Fpui3VxNIqKqHlumfSvIPhFP9p1jVZWDbnl3FuMHnnpwKAPcEA28UtIn3RSlgo5NABikbgU0zJn7wp2QQDQB4/wDEMTaF4/0TXEJMMw+zPnO1ee/1DcdOler2T74FPqAa474q2P2nwXPOhZZbR1nR1AJGOp59q3PCuppqOg2VxGxdZIVO4jGeOtAHP/Fm2abwXeSAHbFsY7Dhh84yQas/Di0S38K2UaoUCoDtLbsZ56961vGNi+o+EtVt42KyPbvtI6ggZ/pWd8NmR/B9g6xGMGPBB7kcZ/HrQB2KjApaKKACikyKWgAqlqcRlsJkUgMyMBn6Vdqrftts5W9EJ/SgDwT4TK0eu6gjAgo5UhjXvEaAQ7cdq8O+Dn+k6jqlwY8K8xwce9e7oMR4oA5vxX+48NXswk8po49wcdiKh8B3Au9DgmLByRyao/E+/ay8FagVYAsmOe+fSmfCuPyfCdqVZiGG7a2cjPbmgD0KigdKKACiiigAqvfWyXdnNA6grIhUg98irFB6UAfPvhidvDHjiS0mkliHnmJlcEKeeAOTzXv8T74w2eteI/FfSYNH1qHWVlECS8gsxI8z2UeuBz+NeieANei1zwzaXCS+YdgVj/tDrQB1tFFFABRRRQAhUN1FAUDpS0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAc546sH1HwfqVvGxVjEWyD6c4/SvMPgtqRNxeWRLbVwwDBvpxkmva7uPzrWWPOCylcjtXz54EaXR/iTcW01wCzyOjKAASc5BNAH0SvSlpkZyo9MU+gAooooAKQjNLRmgAooooAOlFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVk+I9Gg13Q7mwuE3pKhGM457VrUY4oA+c/BfiGXwF4hvNH1RrnyUIGWT7p+p7V9A2N7Fe20c0TBkdQQR3Fcj478BW3iW1ee1SKHUgPknaMNnHIB9q5Hwb4svdG19PDusTOZvuqHQjn2JPT/ADxQB7PRUcUqyJkGpKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooqte3sFhbSXFxKscUalmZjgAUASXFxHbQvLKwVEGWJPQV4H418Xaj4u8Q22l6Y8kdirMroCVYtnHzDg+nFL45+INx4kv4NM0iO5k04uVmaIOhJz6gdOD+ddd8N/Cr2gnuriMxrI2FgOcLjvzzQBpfD/wAGR6FYh5Ubz5Tufcc5x0/Cu/CgDApEUKoAGMU6gAooooAKKKKAMPxcJD4avPKkEbbPvHtXl3wbtDDPqEhlEpaYkkZwDk5xXo3jiWQ+Gr6CKJpJHhYqB3IHFcJ8G45Psl28vMhmJcbQMN34FAHrk0yW1s8shwiKWJz2FePajrmveLfGFzpukai1rZRxDLREOOfUjoecjB7V69eQtPZTRKcMyFQcZ7V4n4R1a28I+JtTstbZbWW4lBjkdcKevBP+cfhQAzW9D8VeEbVNSk8TXVxaRuoKc888Z56Z6+tet+GtTOqaHa3LSpI0iAlkOQT7VU1q/wBPfw7dSyTKYREzblIPAGeOtcp8HWnOhzNuU2jTsYAo4A/T+VAHomrWq3ul3Ns4VlkjZSGGRyMVwPwnuh/Yk9gH3LaTNEDjjHbsOPwr0lhlTXlfhaVLD4k6/pkXl+S7B1WM8KRwRjHB5HQmgD1G5iW4tniblXUgj1BrjPhur2Wm3WlzzCR7S5kRcEcLuOOB0rtVwYwfavOI86N8WpY12+VfweZtwAdw6njrQB6ZWdrOtWWh2LXd7JsjX8Savo25Qa4D4qC8/sMPDFGYF5llOMoM9skdf6d6AKFt4/1nWLm4bTNN821jDeW6xs24joMkgc/pir+k/EbfeW1hrGn3VldTyGNd8TBCeoGff8a2vCsNmuhWgtFUReWMAdq534ovbLosKji6SUSwlACysvOee3r9aAPRUkEi5HSsjxXP9l8K6rP/AM87SVumeimn+HbmS90O0uJV2vJErMPQkVS8cyNF4N1hlOCLSTB9PlNAHl/wMgB0+5kKEO0uc8jPHpXuJ+Vc15D8F4VGhM4i2lnI3HOWAr1xs+TnvQB5p8X5RH4QuEL4yR1HXmtP4YMW8J2I5BEYBB7Vz/xjmK+HBGzEb3AI7n6cGun+HSGLw7aoChQINpXjjFAHbY4paKKACiiigAooooA4/wCIegnWfDzNDEJLm2y8SEAgnvwa85+EesSWmtX2jysE+YyKm3b7HA7c/Wvc5oxLEyH+IYr5/wDFulXHgnxqNZtgxUsgLbc71P3iTwBQB9AowZQQadWXoWpQ6ppkN1A4aORQwI961KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAQjIxXh2qA2fxnhR7ss7Hcq7AAqkdM17lXzt8X0u0+I+n/2WwW7mVVU4OQ2cfyoA99W9giiDPIqjHc4qW3u4LoboZUcf7JzXjWn/DDVNaTz/Emv3s5PIhjkKoo9KVtJf4Y+I9ObTr6eXT76TypbeZ87T6g496APa6KjhbfEr+ozUlAAeKTrS0Y5oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKO3FAAfeuC8f+Ax4jNtqVjItvqVo25JMZ3L1wa7wccUYoA8h8H+OtU0/Vjo/ih4I2ztjn+4GPHBzXrFtdw3MSvFIrqehU5Fc34u8Ead4lspA9tD9q6q7L3968tutY8SfC55be5MU+mn5rchcKvP3R/nvQB77RXO+EfESeI9Dt79MjzFGQRjBroqACiiigAooooAKKKKACijtSbh3oAWioZbqKEZdgB6k1mX3ifSNORnu9QtoQoyQ8gBoA2aY8qRjLMAK8t1T406YJJodGs7nUnjBLPGu1B+J5x+FcVrV34x8YQXb3V+2m28OcWseUJOM4zxu498UAer+KPiToPhlCs9yJrn+GCH5nP19PxrxzXfFeqeOb+Czu9Ri0+ynkA+xrLhth/vY5yfetT4baDp955iTwv52AxaVQTID33YJro/HfgJ5bSPUdGRUuoCp8uMY3gf4A0AbfhHwdBpUcJR1EaA4RR97Pqe9d/DEsaAKBj2rzH4a+LZdVR7a9lthMpwsaONwA7Yr1FDkAjFADqKKKACiiigAooooA434kSLF4Q1Bvl3NCUGWCjJ9zXM/ByPy9FIDpJ8331B5+tbHxZvUsvCFw7xrIGO3axIz+VUfhKmNJY+V5cZclFB4UegoA9MByOKy9Y8OaVrtv5Oo2UNwm4Nh1zyK1Fp1AHk198FbW5u2Carcx2Mjl2tx0HOcL2A7dOleiaHodroWmQ2Nom2KJQoHetXFGKAGkcGvI4oxZ/HC+KBV+0W6ltxJJOByOMdvXtXrrdK8lvrdrr40F2KqsFuuMMAxyPzI5oA9WiOYwDivKvH7f2d8SvCt4MJ5pkhZy2MjI4/8eNeqQ/6sD2rx34zSKPEXhbEsYeOd2AJIOcpj8OKAPYbVt8Kn2pmoWEGpWMtpcorxSrtZSAR+tRaS5axi3HLbRk1foA8v03wz4r8JXd0unNb32nytujikfZ5XHOB2zz+NUJtG8X+KdWifVbOOysiSrxq4J25POcZz36d69fIB6ik2gHOKAK9larZ2scCKAkahQB2Fc18Rbz7F4H1SVwOYtg43ZyQOnfrXXVwPxbVpPA1zGhjDeYmC/Tr+v0oApfCazW28LWxXb8/zHb78/hXo7DKHPFcf4BhWLw7ZqoAUIDjGO1di/Kc9PegDxn4zNGBYpIygFuVZsA+h/Miu38CxsuhwK2wsqgZQmuA+NLLLqOj242lmf7uRzyBXpnhCLZo8A8sIdgyBQB0g6UtIOlLQAUUhz2pec+1ABRRRQAVynj7Rf7X8N3KRopl24BKk/wAufeurpCoIwQDQB4x8NNcudA1Q+GNVZExnysuCc9x1r2dWDDINebfEnwxFcaadTsmhtLq2PmCQ7UyRyDk8DmsvwL8VrW8MelatOF1FTtYqMo2O+RxQB69RUUM6TKGRgRjqKloAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAIbqdLa2kmc4VFJJzXzlpl7F4s+M0l4VHkwkugycjHHOa734y+OLPRtCm0eOUtfXIGYwP4M85PavFPBcXiW51C4k8MWu15WAaZ8N5Y9MmgD6Y1zxHpvhnRjc3soGOEjU5Zz6Ad64nQNC1fxtrUXiPXyYbeM/6LZquMLnILe/frSaR8Jrm/u11DxVqc1/OGDJHvIVPYV6vZ2sdpbrFGMKowPpQBNGuyNVxjAp9JgdaWgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAry341yxx+F4oXQN50wUg+nWvUq8h+M80qTaOgO1GlIzvZf1H+FAG98MbSK38LW8cb7geT8wPX3FbHifVNW0SIXdlbC7g6OnAMY9c9xWL8Mk8rS5sNuXzTgiXzM/jWp8RtSOm+C9RnRdzmPYBkjrx2oA8+0T4620kc66tbvFMpwPJXcP51pQ/GzTmUM8ZXPCocFjjrnB47cYrK+FHh6C7spZLq1Rmb74kGck8967+T4Y+FZpzO+kQGQnJwCB+WcUAYH/C5tMMiFIS8JxudW5XIzyKuWvxa0ie9MTB1jwT5nYfX0rQk+FnhKRNraNBz/dyP1Bqm/wc8JPgNYSFR0H2mTj/AMeoA1U+IegSSpGL2MblLAswA49zWRd/GTwpatsF20jdD5abgD25HFKnwd8J7gWsGIUbQDO/TrzzzWhH8MfCqQpF/ZMJCnOSSTn65oA5K4+NaXhMOiaRc3UxOEMmEX3z9BWKviz4laope1isokcEqNvvwOfwr2K38NaXbBRFZxLtORhRWgtnCmNsYGKAPnibTfHHiC4SHVr6+kgYgukEe1VyPwz2/OrVp8I52mEksPnBehdmBP1BBFfQC20S9EFPEarnAHNAHnnhv4bWWnWXlXSCYMPmRhx34x0xya6q78P2s+mTWQhQRyJtxt46Vt4ooA+f7ayv/h54x23Twva3IBZlkKKuSBkKele1WlxFeQKyOrqwBBByDWF8QPCMXiTSHeO2SS+hQ+ST/Lr/ADryTwz421HwhdXFprZvQI2IdJEDZ5xweMfmRxQB03i7Rm8I+J4vENjAxtZJAZ9spyGOc4XGMHjnNeo+H9TTVdLguowQsqBgG61414y+JVj4h05dJ0lLuSaV1DMEwAM8jGcn6e1ereDNPGmeHrW3UMAEHBBGD347fSgDpqKQHNLQAUUUA5oAKKKDQB5d8Y7/AMnw9Cik4kl2/KMk8HpyK0fhlaNb+HomfdlxnkYrA+M8wj061QjAably5G0Y6iup+HWz/hHbfYxZcZzQB2oGBS0dqKACiiigBkjhUYnoBXlPhvfrPxC1rVD5bRRyG3RkOfukY/ka0vij4wj0jTRpVo4bUrzCJGOwJxnpVr4feHl0HRokKf6RKA8zddzkcnNAHbJhYyelfP3xkvTfeNrWGEyuljbgyBOiszDHfnqO1e5avqcOkaXc39y+2GCMyMfYV8vHWJNY183kqP5moXZnYIfuop+XPtn3/hoA+oPDrbtJtzz/AKscEYxxWvWR4dDrpNuJCC4QZwcjpWvQAUUUUAITgZNeZ/GuZk8AzbGKt50eGHY5r0xvunNeX/GCUzeG5LXA2E5x7gUAbvw7Yy+FtPdydzQLuBHtXYv9yuW8CR+V4asVCbP3K8fhXTynCE+1AHiXxMFvJ450pZIpGKgAYbAOTzXrmgxLHYRqoKgDjNeJeNbqaf4tWtuJFEaou7Jwe5H64r3LSc/Yoic/dFAGjRRRQAUUd6KACiiigApCcUtch8QPGEPhTQmmLETyHbHhd2PqMigDzn4veJ5bu4bSYWk+zJwUQ43sM9+T1H04rm9J+E92fDaarMkjXTjzDAnDBcduDz3xit74eeGJfF2sy+J9ZQsqvi2jI2huepXJ9u9e2kRWtuxYqscY5zxigDwDQPGXiDwXGyXEcuoaYkm1ssd8Ptz/APq+le4eHfFOn+IrBLqzmDA8FTwVPoRXj3jIHxZrc8dhGbaEfKJEPzSkd9vcVRvPA3iHwcbS+0m+mUkbpnjjdgTjqyjIP40AfRYIPQ0teM+D/i23nrp3iQrDcY4nwArfUDocV6xY6raajCkttMkqOMhkbINAF6ikDA9DS0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABTXYKhJPSlJwK8u+KfxHttAsm0ewIuNTuVKbEbmMHucd/SgDyr4k3/8AwlvxHWxstr7XEOPLAz65IPP6V9AeD/DltoWi29tHEqbUGcDqa88+Dvglra0fWtRgYXU5yokXBUV7QiBVAHSgBcYpaKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArjviJ4YbxFoX+jxB7y3YSRYA3HHUAnpmuxooA+eND8eXPhO5ayudNlhjMzNNHIeUJ64PcDHpS+MfGzeOHh03T4m+wo4Msjgjce46jGPfrXvU+l2VyzNNbRSFhglkByKz4PCml2lx51tbrAS+91iG1XPuKAMrwH4dTRNIQDfuf5jubOPTHtXY01VCDCjAp1ABRRRQAUUUUAFFFBoAKKKKACiiigAPNc5rvgrQtfmSfULBJpU4BJI49ODXR0UAcBZfDHQbS8S7FnskVy6qJDgZ46fStDW/GWleG0iSVy5ZtuF7Duam8Z+JrXQdJmMlwYZ2Q+XhC3NYPhjwlHeJHquqg3E0igpHIvES9cAeueaAJ5viro8chjEdwTtVlYptU7unJ6fjU1l8S9LuGYTn7NGrbPMdxgn/PrWjrGmaVZ6a8k9rG0cI3AFecgYGMflXlCeCG8bu18IRp0AI8oqN24eu3oO2KAPQ5Piz4WilMX9oKxDFdwBxkenHP1HFVZfizpS2UV1HBcywyMRuRRgY9zXIX3wk02x01pjfuJflJluDnBAxwBjnFVPDmh6Ba3cfm6nLcsrMzI6bUZyeoBGfwFAHrmkeM9I1oL9luQWPRDwa6IMHFePax4ORAt/ody0LwfOYwzNk9eBng11/gnxC+q2EgmlSSSFyhZQQD+fegDkPjikv8AZVvsTcsjEOTjaBj+db3wpYDwrZxhydsYPPoaPipGlx4ZmXIDhSVwMnPtWH4H8XaVYaPZW8lyiyrEqsAp/oKAPYRS1zdt4y0eV2j+2orL1D5X+f1rQj8QabMf3d7A30cUAalQXcy29s8rttVFLEnsKpXeu2NpEZJbmNUHcsK8q8R+L73xfI+m6QG+ylgC4I2svct/QUAVbCJPGHj+81h1ka0tyogDD5D23Zz7V6vZuxiUqCFA4I71ieGNEWy0uO3djlQATk5JrS1zWLLw9pE17dyCOC3jLE9z6CgDhvjF4oistC/sSNt15qLKgjU8hN3JP16fjXlngfSxdaxOfJaSRR5UAldcjtk/TAxVVdWPibxnc6zeFwS+63i3btpH3RjqQOOldt4DtHXX7uzeQSSo6uXKksOmevA6e9AHuOhWv2PTLe3yT5cYXJPtWpVS1KpEoyM4q0CCKAFooooARuleSfGKbZpcMO1h50oUMDjBz1r1osOfavI/ivcR3Os6Dp6fO5nMjgdAg9fx/lQB3XhbbHpUEa5+RAP0rXvZlW2ZmOB+Vcbpuvw21gXWWMckBc8gjrXM+MfiPb2VqUiuYmlbIEQyxb8ulAHLeIJI7740wIJjtUIQFUnkf5/WvoHTwFtkyOa+dfA2kalrfi19beF4lZg+5c4bkdz9OlfRtpGy26buDjmgC1RRRQAUUUUAFFFFACE4rwD4i6nPc+Njpk1yfKlmSNleAYVOcYznPJ64/SvoCvOPiB4GbVLuPW7Qb7uEjcrn+Edlz0oA6vRba203SoooEVUVflCgD8q4jx74whknk0eC8SKEIfPkjAkYt3QDt/n3rL1P4h6lp+k3FsmmtFdJGNrO2RzxkAc+ntWL4F8EarrZS71gSC0di5jYjD85zggn+VAHcfDvTYNjzwRbISdwzbmMnPPf+lejeUhXaVBHvUNjZQ2NskEKBUUYAA6VZoA5TxF8P9E8Rw+XdWwQ7t2+L5Tnvn1rzK+8F+LPAU8l74ene6t2bHlld5Cj2xx+Fe8UhUHrQB45oHxheAC28SafNZXAbaG28MR14PSvRdH8W6RrKqbO9jkLDcFDcge47VJrfhTSNetmgvrKKQMMZ2jI+hry3xD8HpbGeS+8O3LxOoBjiiAVwe/Pf6cUAe2BgRkHNLXzraeNvG/hW98vVy91bg874vmB9OAK9E0P4vaBqUaC5uBay45WXgfnQB6NRWXp+v6ZqW4Wd7BPtxny3BxWmGU9CKAFooooAKKKCcUAFFJketGR60ALRSZFMeeNBlnUD60ASUhIHWuV1j4ieGNGjka61e13IM7EkDM3sAO9eX6h8QvFHjbWF0Xw3ANOtpAS0zEO+z1P936daANv4pfEG7sLiLRPDt4BqEjYl2JuaMUzwF8MJYr/APt7xBJ9qv3+Zc8qufb1rX8DfDGLQ5Dfam4u9QZtxlOT/OvSkQIgUDAFADIYEhUKigKO1S0UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRzmigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAopCcUtABRRRQAU122oW9BmnVBeRvLZzRxuUdkIDDqDQB5lp8Fx4p8X315c3E62dpN5aW8i4DEE/pz0r0y3iWJMKAMdK8j8L6zd+FtVudO1oBFlmLrOzg4JOMHvj0r1iC9ilQMrqQQORQBxXjm4N/qlhoUYyJn3z8sMIPp9O9dZZWkdvaoiIqoqjAAxgCuN8Y3KaX4o03VH2+WcxyPgZAJAHcevvXa2lzHPbIVYEEfnQB5l4quJ9cuL3yrhktrBirwKSBIVIJJJHH1FcBJcajd+Rc2cX/EvjGwOriVl9eSK9A8TB9A8STNc29t/Z2qN5X7r72ccEr375PTj8+O3aj4aWa0gtTc2Vw37uZSXVQcBQF3dvY+lAHT/DvV5r+7u7OZxIygPvyvzA9OAOOK2NGt5dL8cXlksyCCZTOkWQOvXAznrnnHeoPh5ol3psM1zfCLfJ90LGFIX0J71Jb36ah8SJ/LlXybWFRuCg7jzkZ9OaAOm1/w8uuaVcWc6qyyqeT2rx+7+D9ylwxhu2hBPygZIB+mc174L2FU5kX865PxH448P6KB9puPNm7RxJuJ59enb17UAeZD4deKEDbLq0kj6BZEznHrnr0qhrGna1oVm8+oQWqLtz8km3OOcAd+nSusm8da3rl39h0S1jhLtt84kOV5644GMZp+l+AtZ1TWTe65M2ApUIspcN055zgcdPegDymLRvEPie6DWlvKsIPzHc3AP8J/Lt717D4K8HS6HGjTA+a2N/J5Nd3pui2mlRiGKJIlJ4CjqT1NWb26ttPTzZpUjTbuJY4GB1NAFa7voNKtWnuZUijQZZ3OAPqa+ePHnje88YasttbRFtMtpOEjyzSEH7/A6f5711/jHV9T+IGoDw9oihLIMHmmZseYAcg4646H8RXUeD/hpFpGJ70pPcFt2SgO04xwev8A+vpQB4pothrVpfw3jaTclQWIl8snGe9dRb6xq2k3dxc/ZngncAnMf3+ccYPJ5r6CTTIEIXy12g56U+TSLWfiSFGGeMigDxS2+JOpQuqTz26sUVtsgZTk9QePpXS2XxNYRRNLJBLuXLbGHHX361383hrTbhcS2sLfVBWXP8PPDc+7fpVsdxyfkHNAGMfihZQSBbhkXI6hhjP1qRPirocinZcKSOvP6fyp1x8IPCk5UnTVUr02Ow/rUSfB3w0kBiWKZFJz8spz+dAEsnxM8PvF/wAhCJWY4wxwRXifjnxLHdeL4ryxnW8hVSqKhO7cc55/pXqOpfBHTJgDaXM0XB+V8MD9as+HfhLpmjNHLOi3EyfKrMv3aAPJNB0rxV4kLQ2pNnCW+Z5Mg47gc16f4d+EFhZqsl9/pM27cSxOM/jXpdppNtaALFGigdgK0FUUAZunaNbadGqQxKgxwAK1BwMUYpaACiiigAooooAKKKKACggEYIyKKKAKUukafNMJntIWlAxuKDNWY4UiGEUAe1SUUAFFFFABRRRQAUhANLRQBTu9Ms70AXFvHJg5G5Qa8z8SfCKzup3udPjjA2sPKcexxhuufrXrFFAHy5N4Q1TR1WSGa806dDiRmf5XGOMMMYPPT/Ctm21vx3pKCdNRW4BbcUl4IBOOjV9A3Vha3sLRXECSxt1V1yDWO/gzQ5GJOn2/IwcoORQB5tb/ABY1vTmA1fTbdo1GZHhlGV6Dkc+tS6h8c9Oj025VLaVbwDCRv0I9c12E3w10Sa5LNAPJP/LIcDPrx35rB8QfC3Sk069ubaFDKsDBN8QbHH0yTQB1PgTxHL4l8O29/NEEdx0Gfz5rqeK88+E11NN4St/O270Jj4GOAcV6GfXvQB498UfGGo+GfFFj9gDuSikxjJDDOMdcD69ax5PjN4jjuWtx4fiSULkBpi3b2wP1qv8AFbF58RrO1QkOYFQEHBGSeR713Wk/CzQjpQW4tS00q5kkLksTj1PNAHn83xT8Y3SsVOn2cT5UMQSQfz61yl/qeu6nEkl34kv5mlXKW0CuN2Tj1xg+tfQ1j8PdAsYfLSwhcFs5dQT9PpWrH4Z0iOUSrYQBwRg7BxigDwnwz8HL7U5o7jUkSGA4bY65Yggcdua9t8P+ENJ8Ow7LCyihz95lHJ+prfSNUGFAAp1ACAADApaKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABSY4xS0UAc5r3hHTdaBea3UuevbPvx3rirjwjr2hzJLpupXrwg8Q53BQBxnJ79+K9YprIGUgjOaAPDNb1PxBf6fd2OqaNHdIn3HZgjZ52nGeO361m+FPibPokq2OqWF3FZLgJK53CMHoM+le8XOl21yuJoUfnPIrndf+Hmia/DHHc2igocq68Ef4/jQBFff2X4y0MqsqTwyqMNG344yOledXmkeJ/D8cQsXV4FYhvNcuuOMfTv0FbFx8OdV8O2bHw9qV6SPuw71C+vPT6cVjw6x8QLOTypdLS7jTAPnL5bN+vP4CgCOLxX4xuLVo30nZBICPOtkZic5HHPHY5pdC+H+orElxcRsWn3NNH9oZX5IIPoCKlPjrxDbMRP4aZIwCQAG3NgjoMe/61YPxTvYYVkOjqrM5QI7spJGAQRt96AEl+G+pSyKqXcqxA5xLKSxXGNucfr798c7enfC/To5TJetLO4AVNzk7FByFHtmqB+LhjSLzdDuE81tm8uMA8jnj2NSN8Vbsp5MHh27e8JIKg/JtHG4NjkcelAHotlpNvbRqqRKu3oQKvuYYEyzBVAySeAK8oHjrxjeSE2egpFEEDATElm57Y+uaqQ6H4v8asH166uLKzddptY22fXp1/H1oA6rxF8R9HsyyadINQu4GCulv823Pv06iufTwprfjG5W58Q3MogJ3LaoNqICOAMEg/jXTaP8OdL0rGyEO3AJZF6D6D9a7K3sY4YgqggAYHtQBmaJ4fs9MiAgt40AGMquDW6IxwMUJGFGOcVJQA3aDTsUUUAFFFFABRRRQAUhGaWigBoQA5Ap1FFABRRRQAUCiigAooooAKKKKAAdKKKKACiiigAooooAKKKKACiiigAooooAKKKKACqOsI0mlXMaruLRsuMZ6j0q9TZF3IRQB5N8MtV8m1n06RGSWGZsfJtDDPXpivSJNSMcO5oyD7mvHPElmngbxu+pmCeSyuvmHlE4Ru4wBirt/wCNZvEMS6X4dtrl5Z12POQcRDHp60Ac5I7+Lvi7LeQITHbuqAhdwwvGa+h7ddsCA9QK4b4f+B/+Ecs/MnObmU7nAOQDXfAYFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAIRmloooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBpUHtVdrRCc4HtVqigCi+nwsclAe4JFQvpFs64aFDnrkVpkUY6UAYf/COaeIti2cIUnLARjBP/wCupl0S0QkLbxjPXCjmtbAoxzQBSWxiRQAg4wOlWBbopGB0qUCloAjVMAVJRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRSY96AFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCpf6baanavbXcKSwv95WHWqml+HNM0hStlaxxAnJ2jqa1qKAAADoKKKKACiiigAooooAKKKKACiiigAooooAKKTNLQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRQKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKO9FGOaACiiigAopAR0zzS0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFGc0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFIeKKKAFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKQnkCiigBaKKKACiiigAooooAKKKKACiiigAooooA//ZDQowDQp4LWFtei1jaGVja3N1bS1jcmMzMjo4RGhML0E9PQ0KDQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:06 GMT" ], "Etag": [ "\"62d43fa20e70bfa1fdb22510d1c060d2\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "8DhL/A==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "5bf3Vy9WOud7qOaLzaPApVeVuUdbwihXzuGPxtArpCsgD3Wle8BmFm3Jpef+TsbBDJjImuP+cI4=" ], "X-Amz-Request-Id": [ "P48QGMY0JAHYDVD7" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "db6a1cf7fae0b27e", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "38430" ], "Content-Type": [ "image/jpeg" ], "Date": [ "Thu, 19 Mar 2026 15:28:06 GMT" ], "Etag": [ "\"62d43fa20e70bfa1fdb22510d1c060d2\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:06 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "8DhL/A==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "fUyfRFLaeZgCuO5/4KBn8s+9rNldEJRFtYmMET07wbJZy0rpW+TVS0YIlXhlQ/hXZKDeCxiWTIE=" ], "X-Amz-Request-Id": [ "P48VKSXNA7HTKJE5" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "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NQu4GCulv823Pv06iufTwprfjG5W58Q3MogJ3LaoNqICOAMEg/jXTaP8OdL0rGyEO3AJZF6D6D9a7K3sY4YgqggAYHtQBmaJ4fs9MiAgt40AGMquDW6IxwMUJGFGOcVJQA3aDTsUUUAFFFFABRRRQAUhGaWigBoQA5Ap1FFABRRRQAUCiigAooooAKKKKAAdKKKKACiiigAooooAKKKKACiiigAooooAKKKKACqOsI0mlXMaruLRsuMZ6j0q9TZF3IRQB5N8MtV8m1n06RGSWGZsfJtDDPXpivSJNSMcO5oyD7mvHPElmngbxu+pmCeSyuvmHlE4Ru4wBirt/wCNZvEMS6X4dtrl5Z12POQcRDHp60Ac5I7+Lvi7LeQITHbuqAhdwwvGa+h7ddsCA9QK4b4f+B/+Ecs/MnObmU7nAOQDXfAYFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAIRmloooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBpUHtVdrRCc4HtVqigCi+nwsclAe4JFQvpFs64aFDnrkVpkUY6UAYf/COaeIti2cIUnLARjBP/wCupl0S0QkLbxjPXCjmtbAoxzQBSWxiRQAg4wOlWBbopGB0qUCloAjVMAVJRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRSY96AFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCpf6baanavbXcKSwv95WHWqml+HNM0hStlaxxAnJ2jqa1qKAAADoKKKKACiiigAooooAKKKKACiiigAooooAKKTNLQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRQKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKO9FGOaACiiigAopAR0zzS0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFGc0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFIeKKKAFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKQnkCiigBaKKKACiiigAooooAKKKKACiiigAooooA//Z" } }, { "ID": "c4e72f53e2d2b660", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "38430" ], "Content-Type": [ "image/jpeg" ], "Date": [ "Thu, 19 Mar 2026 15:28:06 GMT" ], "Etag": [ "\"62d43fa20e70bfa1fdb22510d1c060d2\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:06 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "9qJYXM0Cgm8UtH8oG9OUmyXIxOmNwPw++ghyurXitORjh5tfwIqRRYCTmQjwmo4l57a2CngfU+c=" ], "X-Amz-Request-Id": [ "P48RXNRDSXVK1NFP" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "c5e43e1e1854bada", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "38430" ], "Content-Type": [ "image/jpeg" ], "Date": [ "Thu, 19 Mar 2026 15:28:06 GMT" ], "Etag": [ "\"62d43fa20e70bfa1fdb22510d1c060d2\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:06 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "ok2HRAUxiZkqTQfBx7fRmEZO+gDfPosc+gwXhTCRo0kFxFC2hjV82IEFvtoC5H5LFxbA9AOcbIE=" ], "X-Amz-Request-Id": [ "P48JRM4N2WQ33TEW" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "f795893adda911a6", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:06 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "QhP83rkX0wMXrSs0b5zVFTpFUHV8b8I3ToLVF01iP4OVsMEvOsFbeg1GtbyoRMvUP60W2oVpxj0=" ], "X-Amz-Request-Id": [ "P48Y726R524JF5EC" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestWrite/a_small_text_file_gets_a_ContentType.replay ================================================ { "Initial": "AQAAAA7hTg0ELNv5kgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "ea1436d5ed3a2406", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "62" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "20" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "MTQNClRoaXMgaXMgYSB0ZXh0IGZpbGUuDQowDQp4LWFtei1jaGVja3N1bS1jcmMzMjpzUURpRVE9PQ0KDQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:05 GMT" ], "Etag": [ "\"3f3309312cc3264a1389b2d263dece8d\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "sQDiEQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "0o+KMO9vu3BIYqGv1Vz3UmZDeTzUN6NWlHEyAO59wlkoShZbs5WEDp6+6z870e05/RxkFfGO+MzxUmnytd0Nnz1Q8FoBlXYF" ], "X-Amz-Request-Id": [ "Q2FSRER2NZK16QW0" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "2507203fd81a3452", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "20" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:05 GMT" ], "Etag": [ "\"3f3309312cc3264a1389b2d263dece8d\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:05 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "sQDiEQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "dH8re44KqUnW7vor8U9HRmyyyhs+BcFrv1u6Up8Ktq+Tef6bTazRjKC/gTKMyPTWG/3/rOAz0nSChRabDzv3UWM7SH9T/RGh" ], "X-Amz-Request-Id": [ "Q2FVXJWQ93QASJZG" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "VGhpcyBpcyBhIHRleHQgZmlsZS4=" } }, { "ID": "78be3cbec99c1419", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "20" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:05 GMT" ], "Etag": [ "\"3f3309312cc3264a1389b2d263dece8d\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:05 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "JhgmVRc46Z2Zy40LiA8I2/gcr0ZKi1/d+e8rKkmJnXXN2lw9cfx4sQyhUa6gZl6iCJeNr/Zkr92ZSY6uoRSOF9KD9sGRhjRG" ], "X-Amz-Request-Id": [ "Q2FZ2MMA6NDTPG7Z" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "00b3b63e7ccac0c5", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "20" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:05 GMT" ], "Etag": [ "\"3f3309312cc3264a1389b2d263dece8d\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:05 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "+mivFFzd/wPJLdtT64G57lVzncDMflG6uieVL1+ICVnc84LcqBdjUFm3gM/fVNtdcASqFyikQL67YzEhXILPr4EzwNJc45hg" ], "X-Amz-Request-Id": [ "Q2FRJXG7RAW3WMA5" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "2acb83f015d0ffd6", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:05 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "depAM7yJDczg+xhmLZPT16NGrqcGs6IhHbahnaOLt7uOyn88s3K5wmxMCmws4LTdATjgKx5+IhrP5KQFa9JjMAlFN839Xx0c" ], "X-Amz-Request-Id": [ "Q2FTPQVCV14J2ATN" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestWrite/invalid_ContentType_fails.replay ================================================ { "Initial": "AQAAAA7hTg0DCQs6xQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "7f08ebc6dda6150e", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:02 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "OtYzCfPfnbJtoKaMMLUTXhqjjiZw1EdOEhKFXEI+hQfknPuChNQmVp9T7Ra8OMdcZIbYXA68GsC5Esq+EhYdJ+MaGAACLYqI" ], "X-Amz-Request-Id": [ "DMNK5E3T4HTKCTWS" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPk5vU3VjaEtleTwvQ29kZT48TWVzc2FnZT5UaGUgc3BlY2lmaWVkIGtleSBkb2VzIG5vdCBleGlzdC48L01lc3NhZ2U+PEtleT5ibG9iLWZvci1yZWFkaW5nPC9LZXk+PFJlcXVlc3RJZD5ETU5LNUUzVDRIVEtDVFdTPC9SZXF1ZXN0SWQ+PEhvc3RJZD5PdFl6Q2ZQZm5iSnRvS2FNTUxVVFhocWpqaVp3MUVkT0VoS0ZYRUkraFFma25QdUNoTlFtVnA5VDdSYThPTWRjWkliWVhBNjhHc0M1RXNxK0VoWWRKK01hR0FBQ0xZcUk8L0hvc3RJZD48L0Vycm9yPg==" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestWrite/no_write_then_close_results_in_empty_blob,_blob_existed.replay ================================================ { "Initial": "AQAAAA7hTg0CNpkMxgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "7133276b55409f6d", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Crc32": [ "AAAAAA==" ], "X-Amz-Content-Sha256": [ "UNSIGNED-PAYLOAD" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "text/plain", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:03 GMT" ], "Etag": [ "\"d41d8cd98f00b204e9800998ecf8427e\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "AAAAAA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "Ficpv/L0H51EM+oMClfRoZbDc3RbtBlPWQ6I6+PCIgYhDU+Qdl69Ufp8ZkhGYzmWBAO4a+obl2E=" ], "X-Amz-Request-Id": [ "8D97YTNYRX454FA8" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "f9c3a3f5d896ec43", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "0" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:04 GMT" ], "Etag": [ "\"d41d8cd98f00b204e9800998ecf8427e\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:03 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "AAAAAA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "4KtFpkulEIW+nrSdBKVOc7yUEqb7a4eVUMZu7sYgJtF87ZY3RHRB7jmcQiqU1Zv6DodhNay3cNk=" ], "X-Amz-Request-Id": [ "DMNYZ9CCZBVJY5H6" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "5b7606c8db7a3fcf", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "0" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:04 GMT" ], "Etag": [ "\"d41d8cd98f00b204e9800998ecf8427e\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:03 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "uf31jGsfcZKlVAkglWCcwSZJEvwFGGz+yotAiFLX0IrwnJPUiJDM10HxuFACV6wsJNPzyjKMycI=" ], "X-Amz-Request-Id": [ "DMNMK29NSHPW7BED" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "6a7fb6fe2d9869c6", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:04 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "u3IaYpQoUQfTiKFyQSvBMsbgfGy798NPzpeSzjlvuzdTc9wpZvVmyXs+G8PPkBpKreVtvzFvG0I=" ], "X-Amz-Request-Id": [ "DMNS7M80824Z7Q9W" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestWrite/no_write_then_close_results_in_empty_blob.replay ================================================ { "Initial": "AQAAAA7hTg0CKPRyowAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "3b580f8038af034e", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Crc32": [ "AAAAAA==" ], "X-Amz-Content-Sha256": [ "UNSIGNED-PAYLOAD" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "text/plain", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:03 GMT" ], "Etag": [ "\"d41d8cd98f00b204e9800998ecf8427e\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "AAAAAA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "sDZo0Z77mS3B8DrN89f5ccI0XdRVYDJs3nnxkq4gHGju7c6pjsVwIoeNfmJjglpbv+cvbSSo7eo=" ], "X-Amz-Request-Id": [ "8D96Q2G17NWHT38X" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "b6aaa786b982bb04", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "0" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:03 GMT" ], "Etag": [ "\"d41d8cd98f00b204e9800998ecf8427e\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:03 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "AAAAAA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "yK5KGPzIkKO9MkHg7wgGoBPq6+s2UJKXKBwLnY1iJUDSKIzYfTS8XHFtxSegVYr++2lxMqxb0vs=" ], "X-Amz-Request-Id": [ "8D9D7KVB76RZZV8V" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "b9c9e62111b7e3e9", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "0" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:03 GMT" ], "Etag": [ "\"d41d8cd98f00b204e9800998ecf8427e\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:03 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "G/kAmtR8c59o5fqhiEnTp8heOux4NFeaQSJTo0HZ8j/0Ow+qfpLqjR88l6HOuBzgISZlIaGWoDA=" ], "X-Amz-Request-Id": [ "8D9FC0DGQWTGZ41Q" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "0a9085e4b83e69a8", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:03 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "4dVACyjsKaGzXybcLADZXI6p/v6hi1teDP58zDc2b/xXqLiYVK16a5sOo8kOzq9QYSrJ4xqSBog=" ], "X-Amz-Request-Id": [ "8D90BFW2TMNPVSYJ" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestWrite/write_to_empty_key_fails.replay ================================================ { "Initial": "AQAAAA7hTg0CKOQwhwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": null } ================================================ FILE: blob/s3blob/testdata/TestConformance/TestWrite/write_with_explicit_ContentType_overrides_discovery.replay ================================================ { "Initial": "AQAAAA7hTg0DLf36RAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "b994861a1ecdee83", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "6398" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "6354" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/json", "BodyParts": [ "MThkMg0KPCFET0NUWVBFIGh0bWw+PGh0bWwgbGFuZz0iZW4iPgo8aGVhZCBwcm9maWxlPSJodHRwOi8vYTkuY29tLy0vc3BlYy9vcGVuc2VhcmNoLzEuMS8iPgogIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgPGxpbmsgaHJlZj0iLy0vYm9vdHN0cmFwLm1pbi5jc3M/dj04YmVjMWJiYTNlMjNlY2JhMjJjZmZiMTk3YTJkNDQwYWY0MTBiMTVkIiByZWw9InN0eWxlc2hlZXQiPgogIDxsaW5rIGhyZWY9Ii8tL3NpdGUuY3NzP3Y9N2Q4MWY0MTA0Yzg5ZGJlMzc2MzQ1ZjZiZmUzZTYyYjRlNDBkM2QwNiIgcmVsPSJzdHlsZXNoZWV0Ij4KICA8dGl0bGU+R29Eb2M8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5Pgo8bmF2IGNsYXNzPSJuYXZiYXIgbmF2YmFyLWRlZmF1bHQiIHJvbGU9Im5hdmlnYXRpb24iPgogIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgPGRpdiBjbGFzcz0ibmF2YmFyLWhlYWRlciI+CiAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Im5hdmJhci10b2dnbGUiIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSIgZGF0YS10YXJnZXQ9Ii5uYXZiYXItY29sbGFwc2UiPgogICAgICA8c3BhbiBjbGFzcz0ic3Itb25seSI+VG9nZ2xlIG5hdmlnYXRpb248L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iaWNvbi1iYXIiPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9Imljb24tYmFyIj48L3NwYW4+CiAgICA8L2J1dHRvbj4KICAgIDxhIGNsYXNzPSJuYXZiYXItYnJhbmQiIGhyZWY9Ii8iPjxzdHJvbmc+R29Eb2M8L3N0cm9uZz48L2E+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlIj4KICAgIDx1bCBjbGFzcz0ibmF2IG5hdmJhci1uYXYiPgogICAgICAgIDxsaSBjbGFzcz0iYWN0aXZlIj48YSBocmVmPSIvIj5Ib21lPC9hPjwvbGk+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dDwvYT48L2xpPgogICAgPC91bD4KICAgIDxmb3JtIGNsYXNzPSJuYXZiYXItbmF2IG5hdmJhci1mb3JtIG5hdmJhci1yaWdodCIgaWQ9Ingtc2VhcmNoIiBhY3Rpb249Ii8iIHJvbGU9InNlYXJjaCI+PGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJ4LXNlYXJjaC1xdWVyeSIgdHlwZT0idGV4dCIgbmFtZT0icSIgcGxhY2Vob2xkZXI9IlNlYXJjaCI+PC9mb3JtPgogIDwvZGl2Pgo8L2Rpdj4KPC9uYXY+CjxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgCjxkaXYgY2xhc3M9Imp1bWJvdHJvbiI+CiAgICA8aDI+U2VhcmNoIGZvciBHbyBQYWNrYWdlczwvaDI+CiAgICAKICA8Zm9ybT4KICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5hbWU9InEiIGF1dG9mb2N1cz0iYXV0b2ZvY3VzIiB2YWx1ZT0iIiBwbGFjZWhvbGRlcj0iU2VhcmNoIGZvciBwYWNrYWdlIGJ5IGltcG9ydCBwYXRoIG9yIGtleXdvcmQuIiB0eXBlPSJ0ZXh0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImlucHV0LWdyb3VwLWJ0biI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IiB0eXBlPSJzdWJtaXQiPkdvITwvYnV0dG9uPgogICAgICA8L3NwYW4+CiAgICA8L2Rpdj4KICA8L2Zvcm0+Cgo8L2Rpdj4KCjxwPkdvRG9jIGhvc3RzIGRvY3VtZW50YXRpb24gZm9yIDxhIGhyZWY9Imh0dHA6Ly9nb2xhbmcub3JnLyI+R288L2E+IHBhY2thZ2VzCm9uIEJpdGJ1Y2tldCwgR2l0SHViLCBHb29nbGUgUHJvamVjdCBIb3N0aW5nIGFuZCBMYXVuY2hwYWQuICBSZWFkIHRoZSA8YQogIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dCBQYWdlPC9hPiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYWRkaW5nIHBhY2thZ2VzIHRvIEdvRG9jCmFuZCBtb3JlLgoKPGRpdiBjbGFzcz0icm93Ij4KICA8ZGl2IGNsYXNzPSJjb2wtc20tNiI+CiAgICAKICAgICAgPGg0PlBvcHVsYXIgUGFja2FnZXM8L2g0PgogICAgICA8dWwgY2xhc3M9Imxpc3QtdW5zdHlsZWQiPgogICAgICAgIDxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1nby9hd3MiPmdpdGh1Yi5jb20vYXdzL2F3cy1zZGstZ28vYXdzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9kZ3JpamFsdmEvand0LWdvIj5naXRodWIuY29tL2RncmlqYWx2YS9qd3QtZ288L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dpbi1nb25pYy9naW4iPmdpdGh1Yi5jb20vZ2luLWdvbmljL2dpbjwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXMiPmdpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dvLXNxbC1kcml2ZXIvbXlzcWwiPmdpdGh1Yi5jb20vZ28tc3FsLWRyaXZlci9teXNxbDwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29sYW5nL3Byb3RvYnVmL3Byb3RvIj5naXRodWIuY29tL2dvbGFuZy9wcm90b2J1Zi9wcm90bzwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29tb2R1bGUvcmVkaWdvL3JlZGlzIj5naXRodWIuY29tL2dvbW9kdWxlL3JlZGlnby9yZWRpczwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQiPmdpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQ8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltIj5naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9qaW56aHUvZ29ybSI+Z2l0aHViLmNvbS9qaW56aHUvZ29ybTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vbGliL3BxIj5naXRodWIuY29tL2xpYi9wcTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcGtnL2Vycm9ycyI+Z2l0aHViLmNvbS9wa2cvZXJyb3JzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1cyI+Z2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1czwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcm9iZmlnL2Nyb24iPmdpdGh1Yi5jb20vcm9iZmlnL2Nyb248L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3NpcnVwc2VuL2xvZ3J1cyI+Z2l0aHViLmNvbS9zaXJ1cHNlbi9sb2dydXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0Ij5naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0PC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS91bml4cGlja2xlL2thaG9vdC1oYWNrIj5naXRodWIuY29tL3VuaXhwaWNrbGUva2Fob290LWhhY2s8L2E+PGxpPjxhIGhyZWY9Ii9nby51YmVyLm9yZy96YXAiPmdvLnViZXIub3JnL3phcDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9jcnlwdG8vc3NoIj5nb2xhbmcub3JnL3gvY3J5cHRvL3NzaDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9uZXQvY29udGV4dCI+Z29sYW5nLm9yZy94L25ldC9jb250ZXh0PC9hPjxsaT48YSBocmVmPSIvZ29sYW5nLm9yZy94L29hdXRoMiI+Z29sYW5nLm9yZy94L29hdXRoMjwvYT48bGk+PGEgaHJlZj0iL2dvb2dsZS5nb2xhbmcub3JnL2dycGMiPmdvb2dsZS5nb2xhbmcub3JnL2dycGM8L2E+PGxpPjxhIGhyZWY9Ii9nb3BrZy5pbi9tZ28udjIiPmdvcGtnLmluL21nby52MjwvYT48bGk+PGEgaHJlZj0iL2dvcGtnLmluL3lhbWwudjIiPmdvcGtnLmluL3lhbWwudjI8L2E+PGxpPjxhIGhyZWY9Ii9sYWJpeC5vcmcvdjIvbWdvIj5sYWJpeC5vcmcvdjIvbWdvPC9hPgogICAgICA8L3VsPgogICAgCiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sLXNtLTYiPgogICAgPGg0Pk1vcmUgUGFja2FnZXM8L2g0PgogICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIj4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL2dvIj5HbyBTdGFuZGFyZCBQYWNrYWdlczwvYT4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL3N1YnJlcG8iPkdvIFN1Yi1yZXBvc2l0b3J5IFBhY2thZ2VzPC9hPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9nb2xhbmcub3JnL3dpa2kvUHJvamVjdHMiPlByb2plY3RzIEAgZ28td2lraTwvYT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zZWFyY2g/bz1kZXNjJmFtcDtxPWxhbmd1YWdlJTNBZ28mYW1wO3M9c3RhcnMmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5Nb3N0IHN0YXJzPC9hPiwgCiAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NlYXJjaD9vPWRlc2MmYW1wO3E9bGFuZ3VhZ2UlM0FnbyZhbXA7cz1mb3JrcyZhbXA7dHlwZT1SZXBvc2l0b3JpZXMiPm1vc3QgZm9ya3M8L2E+LCAKICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2VhcmNoP289ZGVzYyZhbXA7cT1sYW5ndWFnZSUzQWdvJmFtcDtzPXVwZGF0ZWQmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5yZWNlbnRseSB1cGRhdGVkPC9hPiBvbiBHaXRIdWIKICAgIDwvdWw+CiAgPC9kaXY+CjwvZGl2PgoKCjwvZGl2Pgo8ZGl2IGlkPSJ4LWZvb3RlciIgY2xhc3M9ImNsZWFyZml4Ij4KICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2dvbGFuZy9nZGRvL2lzc3VlcyI+V2Vic2l0ZSBJc3N1ZXM8L2E+CiAgICA8c3BhbiBjbGFzcz0idGV4dC1tdXRlZCI+fDwvc3Bhbj4gPGEgaHJlZj0iaHR0cDovL2dvbGFuZy5vcmcvIj5HbyBMYW5ndWFnZTwvYT4KICAgIDxzcGFuIGNsYXNzPSJwdWxsLXJpZ2h0Ij48YSBocmVmPSIjIj5CYWNrIHRvIHRvcDwvYT48L3NwYW4+CiAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ieC1zaG9ydGN1dHMiIHRhYmluZGV4PSItMSIgY2xhc3M9Im1vZGFsIj4KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+CiAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvYnV0dG9uPgogICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+S2V5Ym9hcmQgc2hvcnRjdXRzPC9oND4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4/PC9iPjwvdGQ+PHRkPiA6IFRoaXMgbWVudTwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4vPC9iPjwvdGQ+PHRkPiA6IFNlYXJjaCBzaXRlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5mPC9iPjwvdGQ+PHRkPiA6IEp1bXAgdG8gaWRlbnRpZmllcjwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmc8L2I+PC90ZD48dGQ+IDogR28gdG8gdG9wIG9mIHBhZ2U8L3RkPjwvdHI+CiAgICAgICAgICA8dHI+PHRkIGFsaWduPSJyaWdodCI+PGI+ZzwvYj4gdGhlbiA8Yj5iPC9iPjwvdGQ+PHRkPiA6IEdvIHRvIGVuZCBvZiBwYWdlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmk8L2I+PC90ZD48dGQ+IDogR28gdG8gaW5kZXg8L3RkPjwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9InRleHQtbXV0ZWQiPjx0ZCBhbGlnbj0icmlnaHQiPjxiPmc8L2I+IHRoZW4gPGI+ZTwvYj48L3RkPjx0ZD4gOiBHbyB0byBleGFtcGxlczwvdGQ+PC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KPHNjcmlwdCBzcmM9Ii8tL2pxdWVyeS0yLjAuMy5taW4uanM/dj1mYmY5Yzc3ZDBjNGUzYzM0YTQ4NTk4MGMxZTUzMTZiNjIxMjE2MGM4Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL2Jvb3RzdHJhcC5taW4uanM/dj01YWRhN2MxMDNmYzFkZWFiYzkyNWNjMWZkYmJiNmU0NTFjMjFmYzcwIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL3NpdGUuanM/dj0zNzFkZTczMWMxOGQ5MWM0OTlkOTBiMWFiMGJmMzllY2Y2NmQ2Y2Y3Ij48L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+DQowDQp4LWFtei1jaGVja3N1bS1jcmMzMjplQ01DcWc9PQ0KDQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:04 GMT" ], "Etag": [ "\"0f6a7c9ff3d3d770b8f7fa19c2ae19d0\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "eCMCqg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "ZWlfdFHFl4igv17nESGVjXA5TI0yZGANRZEx1HPT3gpSGaQq5EtjsIoFGITiM2BdcpP34XTW/p0=" ], "X-Amz-Request-Id": [ "DMNG3X1RWJNFXQYA" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "c9827565ab3f35ae", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "6354" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:28:04 GMT" ], "Etag": [ "\"0f6a7c9ff3d3d770b8f7fa19c2ae19d0\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:04 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "eCMCqg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "8r6Of8LwtYJONot4EaZGOqrnmeoxf5czfeT0bH3XACeVFM+7ufeEoK9WnKLbP4wyuRimTtgR+Z0=" ], "X-Amz-Request-Id": [ "DMNY0QT4R91PCEMY" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PCFET0NUWVBFIGh0bWw+PGh0bWwgbGFuZz0iZW4iPgo8aGVhZCBwcm9maWxlPSJodHRwOi8vYTkuY29tLy0vc3BlYy9vcGVuc2VhcmNoLzEuMS8iPgogIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgPGxpbmsgaHJlZj0iLy0vYm9vdHN0cmFwLm1pbi5jc3M/dj04YmVjMWJiYTNlMjNlY2JhMjJjZmZiMTk3YTJkNDQwYWY0MTBiMTVkIiByZWw9InN0eWxlc2hlZXQiPgogIDxsaW5rIGhyZWY9Ii8tL3NpdGUuY3NzP3Y9N2Q4MWY0MTA0Yzg5ZGJlMzc2MzQ1ZjZiZmUzZTYyYjRlNDBkM2QwNiIgcmVsPSJzdHlsZXNoZWV0Ij4KICA8dGl0bGU+R29Eb2M8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5Pgo8bmF2IGNsYXNzPSJuYXZiYXIgbmF2YmFyLWRlZmF1bHQiIHJvbGU9Im5hdmlnYXRpb24iPgogIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgPGRpdiBjbGFzcz0ibmF2YmFyLWhlYWRlciI+CiAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Im5hdmJhci10b2dnbGUiIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSIgZGF0YS10YXJnZXQ9Ii5uYXZiYXItY29sbGFwc2UiPgogICAgICA8c3BhbiBjbGFzcz0ic3Itb25seSI+VG9nZ2xlIG5hdmlnYXRpb248L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iaWNvbi1iYXIiPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9Imljb24tYmFyIj48L3NwYW4+CiAgICA8L2J1dHRvbj4KICAgIDxhIGNsYXNzPSJuYXZiYXItYnJhbmQiIGhyZWY9Ii8iPjxzdHJvbmc+R29Eb2M8L3N0cm9uZz48L2E+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlIj4KICAgIDx1bCBjbGFzcz0ibmF2IG5hdmJhci1uYXYiPgogICAgICAgIDxsaSBjbGFzcz0iYWN0aXZlIj48YSBocmVmPSIvIj5Ib21lPC9hPjwvbGk+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dDwvYT48L2xpPgogICAgPC91bD4KICAgIDxmb3JtIGNsYXNzPSJuYXZiYXItbmF2IG5hdmJhci1mb3JtIG5hdmJhci1yaWdodCIgaWQ9Ingtc2VhcmNoIiBhY3Rpb249Ii8iIHJvbGU9InNlYXJjaCI+PGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJ4LXNlYXJjaC1xdWVyeSIgdHlwZT0idGV4dCIgbmFtZT0icSIgcGxhY2Vob2xkZXI9IlNlYXJjaCI+PC9mb3JtPgogIDwvZGl2Pgo8L2Rpdj4KPC9uYXY+CjxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgCjxkaXYgY2xhc3M9Imp1bWJvdHJvbiI+CiAgICA8aDI+U2VhcmNoIGZvciBHbyBQYWNrYWdlczwvaDI+CiAgICAKICA8Zm9ybT4KICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5hbWU9InEiIGF1dG9mb2N1cz0iYXV0b2ZvY3VzIiB2YWx1ZT0iIiBwbGFjZWhvbGRlcj0iU2VhcmNoIGZvciBwYWNrYWdlIGJ5IGltcG9ydCBwYXRoIG9yIGtleXdvcmQuIiB0eXBlPSJ0ZXh0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImlucHV0LWdyb3VwLWJ0biI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IiB0eXBlPSJzdWJtaXQiPkdvITwvYnV0dG9uPgogICAgICA8L3NwYW4+CiAgICA8L2Rpdj4KICA8L2Zvcm0+Cgo8L2Rpdj4KCjxwPkdvRG9jIGhvc3RzIGRvY3VtZW50YXRpb24gZm9yIDxhIGhyZWY9Imh0dHA6Ly9nb2xhbmcub3JnLyI+R288L2E+IHBhY2thZ2VzCm9uIEJpdGJ1Y2tldCwgR2l0SHViLCBHb29nbGUgUHJvamVjdCBIb3N0aW5nIGFuZCBMYXVuY2hwYWQuICBSZWFkIHRoZSA8YQogIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dCBQYWdlPC9hPiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYWRkaW5nIHBhY2thZ2VzIHRvIEdvRG9jCmFuZCBtb3JlLgoKPGRpdiBjbGFzcz0icm93Ij4KICA8ZGl2IGNsYXNzPSJjb2wtc20tNiI+CiAgICAKICAgICAgPGg0PlBvcHVsYXIgUGFja2FnZXM8L2g0PgogICAgICA8dWwgY2xhc3M9Imxpc3QtdW5zdHlsZWQiPgogICAgICAgIDxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1nby9hd3MiPmdpdGh1Yi5jb20vYXdzL2F3cy1zZGstZ28vYXdzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9kZ3JpamFsdmEvand0LWdvIj5naXRodWIuY29tL2RncmlqYWx2YS9qd3QtZ288L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dpbi1nb25pYy9naW4iPmdpdGh1Yi5jb20vZ2luLWdvbmljL2dpbjwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXMiPmdpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dvLXNxbC1kcml2ZXIvbXlzcWwiPmdpdGh1Yi5jb20vZ28tc3FsLWRyaXZlci9teXNxbDwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29sYW5nL3Byb3RvYnVmL3Byb3RvIj5naXRodWIuY29tL2dvbGFuZy9wcm90b2J1Zi9wcm90bzwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29tb2R1bGUvcmVkaWdvL3JlZGlzIj5naXRodWIuY29tL2dvbW9kdWxlL3JlZGlnby9yZWRpczwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQiPmdpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQ8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltIj5naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9qaW56aHUvZ29ybSI+Z2l0aHViLmNvbS9qaW56aHUvZ29ybTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vbGliL3BxIj5naXRodWIuY29tL2xpYi9wcTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcGtnL2Vycm9ycyI+Z2l0aHViLmNvbS9wa2cvZXJyb3JzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1cyI+Z2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1czwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcm9iZmlnL2Nyb24iPmdpdGh1Yi5jb20vcm9iZmlnL2Nyb248L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3NpcnVwc2VuL2xvZ3J1cyI+Z2l0aHViLmNvbS9zaXJ1cHNlbi9sb2dydXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0Ij5naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0PC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS91bml4cGlja2xlL2thaG9vdC1oYWNrIj5naXRodWIuY29tL3VuaXhwaWNrbGUva2Fob290LWhhY2s8L2E+PGxpPjxhIGhyZWY9Ii9nby51YmVyLm9yZy96YXAiPmdvLnViZXIub3JnL3phcDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9jcnlwdG8vc3NoIj5nb2xhbmcub3JnL3gvY3J5cHRvL3NzaDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9uZXQvY29udGV4dCI+Z29sYW5nLm9yZy94L25ldC9jb250ZXh0PC9hPjxsaT48YSBocmVmPSIvZ29sYW5nLm9yZy94L29hdXRoMiI+Z29sYW5nLm9yZy94L29hdXRoMjwvYT48bGk+PGEgaHJlZj0iL2dvb2dsZS5nb2xhbmcub3JnL2dycGMiPmdvb2dsZS5nb2xhbmcub3JnL2dycGM8L2E+PGxpPjxhIGhyZWY9Ii9nb3BrZy5pbi9tZ28udjIiPmdvcGtnLmluL21nby52MjwvYT48bGk+PGEgaHJlZj0iL2dvcGtnLmluL3lhbWwudjIiPmdvcGtnLmluL3lhbWwudjI8L2E+PGxpPjxhIGhyZWY9Ii9sYWJpeC5vcmcvdjIvbWdvIj5sYWJpeC5vcmcvdjIvbWdvPC9hPgogICAgICA8L3VsPgogICAgCiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sLXNtLTYiPgogICAgPGg0Pk1vcmUgUGFja2FnZXM8L2g0PgogICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIj4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL2dvIj5HbyBTdGFuZGFyZCBQYWNrYWdlczwvYT4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL3N1YnJlcG8iPkdvIFN1Yi1yZXBvc2l0b3J5IFBhY2thZ2VzPC9hPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9nb2xhbmcub3JnL3dpa2kvUHJvamVjdHMiPlByb2plY3RzIEAgZ28td2lraTwvYT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zZWFyY2g/bz1kZXNjJmFtcDtxPWxhbmd1YWdlJTNBZ28mYW1wO3M9c3RhcnMmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5Nb3N0IHN0YXJzPC9hPiwgCiAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NlYXJjaD9vPWRlc2MmYW1wO3E9bGFuZ3VhZ2UlM0FnbyZhbXA7cz1mb3JrcyZhbXA7dHlwZT1SZXBvc2l0b3JpZXMiPm1vc3QgZm9ya3M8L2E+LCAKICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2VhcmNoP289ZGVzYyZhbXA7cT1sYW5ndWFnZSUzQWdvJmFtcDtzPXVwZGF0ZWQmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5yZWNlbnRseSB1cGRhdGVkPC9hPiBvbiBHaXRIdWIKICAgIDwvdWw+CiAgPC9kaXY+CjwvZGl2PgoKCjwvZGl2Pgo8ZGl2IGlkPSJ4LWZvb3RlciIgY2xhc3M9ImNsZWFyZml4Ij4KICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2dvbGFuZy9nZGRvL2lzc3VlcyI+V2Vic2l0ZSBJc3N1ZXM8L2E+CiAgICA8c3BhbiBjbGFzcz0idGV4dC1tdXRlZCI+fDwvc3Bhbj4gPGEgaHJlZj0iaHR0cDovL2dvbGFuZy5vcmcvIj5HbyBMYW5ndWFnZTwvYT4KICAgIDxzcGFuIGNsYXNzPSJwdWxsLXJpZ2h0Ij48YSBocmVmPSIjIj5CYWNrIHRvIHRvcDwvYT48L3NwYW4+CiAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ieC1zaG9ydGN1dHMiIHRhYmluZGV4PSItMSIgY2xhc3M9Im1vZGFsIj4KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+CiAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvYnV0dG9uPgogICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+S2V5Ym9hcmQgc2hvcnRjdXRzPC9oND4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4/PC9iPjwvdGQ+PHRkPiA6IFRoaXMgbWVudTwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4vPC9iPjwvdGQ+PHRkPiA6IFNlYXJjaCBzaXRlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5mPC9iPjwvdGQ+PHRkPiA6IEp1bXAgdG8gaWRlbnRpZmllcjwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmc8L2I+PC90ZD48dGQ+IDogR28gdG8gdG9wIG9mIHBhZ2U8L3RkPjwvdHI+CiAgICAgICAgICA8dHI+PHRkIGFsaWduPSJyaWdodCI+PGI+ZzwvYj4gdGhlbiA8Yj5iPC9iPjwvdGQ+PHRkPiA6IEdvIHRvIGVuZCBvZiBwYWdlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmk8L2I+PC90ZD48dGQ+IDogR28gdG8gaW5kZXg8L3RkPjwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9InRleHQtbXV0ZWQiPjx0ZCBhbGlnbj0icmlnaHQiPjxiPmc8L2I+IHRoZW4gPGI+ZTwvYj48L3RkPjx0ZD4gOiBHbyB0byBleGFtcGxlczwvdGQ+PC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KPHNjcmlwdCBzcmM9Ii8tL2pxdWVyeS0yLjAuMy5taW4uanM/dj1mYmY5Yzc3ZDBjNGUzYzM0YTQ4NTk4MGMxZTUzMTZiNjIxMjE2MGM4Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL2Jvb3RzdHJhcC5taW4uanM/dj01YWRhN2MxMDNmYzFkZWFiYzkyNWNjMWZkYmJiNmU0NTFjMjFmYzcwIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL3NpdGUuanM/dj0zNzFkZTczMWMxOGQ5MWM0OTlkOTBiMWFiMGJmMzllY2Y2NmQ2Y2Y3Ij48L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+" } }, { "ID": "75cb995a8d6e2dd7", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "6354" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:28:04 GMT" ], "Etag": [ "\"0f6a7c9ff3d3d770b8f7fa19c2ae19d0\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:04 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "QemzLZO6/OznhsZXa7tdM6yZEFAX/uCLZ8O+wunNm2LG17WU7a9Wrfud/TJoYnwqVZAODVP9F/Q=" ], "X-Amz-Request-Id": [ "DMNQ91JR9G94KZV7" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "1472eff734ef93d7", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "6354" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:28:04 GMT" ], "Etag": [ "\"0f6a7c9ff3d3d770b8f7fa19c2ae19d0\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:04 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "H3+QE7nMc0BZVoS7bixqoE1ypjLRFAeLDER2mOJ3XiNaIgpaSAQjO0sXiMHs/9GY+Ib3Gew8VKc=" ], "X-Amz-Request-Id": [ "DMNM5RJSZJFBHB6S" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "9c237c67bc17ec5e", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:05 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "dKUKXK71uwTkH5I2Pm04+0VKbmwJKhhtUoMB5Ex3U0IENtV/E1Hnbm7LNCVyqsbcSuaHddusy/c=" ], "X-Amz-Request-Id": [ "Q2FJX850525AR81C" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestAs/verify_As_returns_false_when_passed_nil.replay ================================================ { "Initial": "AQAAAA7hTg0vKcjuEwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "69b98c1a198cd77a", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/mydir/as-test?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "52" ], "Content-Md5": [ "XrY7u+Ae7tCTyyK7j1rNww==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "11" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "Yg0KaGVsbG8gd29ybGQNCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOkRVb1JoUT09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:48 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "DUoRhQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "v4HWsWs0yfmQK687LugHDYE8fXlyPZerXXyhgLr2F43D0H5wYYU6l/Uhu9JD2RWkQxOpjtV5dGCWHEJtjTsW9lkqapPp4GaO" ], "X-Amz-Request-Id": [ "DRCH2P8VWRC2VEWP" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "32bfda922188099f", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/mydir/as-test", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:48 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:48 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "HndkpMcgY1X8lkc54HjJhFwP8x8ORzZGCDDcbi3JQSnLZpKpS0hVEmQT+LEBKRYjl80zHV4h7TMQJ6A5TiFkl2Wl6YpnYL/K" ], "X-Amz-Request-Id": [ "DRCNETSNTYC58400" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "03f089759108dbc5", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/mydir/as-test?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:48 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:48 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "DUoRhQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "qjfxX5Ff/vPw1vH1JTH/ZPGhxBKPaSRgsWTCMTH2tE/AShPYLjm3dRMHtcbn2tUR1en0Ee912u73NJEf1F8QzIwz/pA7QkqR" ], "X-Amz-Request-Id": [ "DRCG63FPXA86ZN0T" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8gd29ybGQ=" } }, { "ID": "3ca46c38723d3947", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026max-keys=1000\u0026prefix=mydir", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:48 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "QUZ0cZMf0ZPGHJUt+4tu2uQAAj2yndaf1jMgIfnVYP8i1xb2zcHK9/ADUKsf/lK+0YRbgNaTYpluSJUUGCepDH3J+UO3/T2Z" ], "X-Amz-Request-Id": [ "DRCY7MM0NMAMT2SQ" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+bXlkaXI8L1ByZWZpeD48TWFya2VyPjwvTWFya2VyPjxNYXhLZXlzPjEwMDA8L01heEtleXM+PERlbGltaXRlcj4vPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5teWRpci88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "5d62da95f42464b7", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?max-keys=1000\u0026prefix=mydir%2Fas-test", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:48 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "5GTFIdFV7ZuZOsLDerwSsvM8bewIlbzjQezi2xwrAINAFNCnAUausAS4VWFFwT+TXHg7NuLiGK0eMobox7iNzzWE1FqImH9P" ], "X-Amz-Request-Id": [ "DRCNH42WNBXS4687" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+bXlkaXIvYXMtdGVzdDwvUHJlZml4PjxNYXJrZXI+PC9NYXJrZXI+PE1heEtleXM+MTAwMDwvTWF4S2V5cz48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5Pm15ZGlyL2FzLXRlc3Q8L0tleT48TGFzdE1vZGlmaWVkPjIwMjYtMDMtMTlUMTU6Mjg6NDguMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVlYjYzYmJiZTAxZWVlZDA5M2NiMjJiYjhmNWFjZGMzJnF1b3Q7PC9FVGFnPjxDaGVja3N1bUFsZ29yaXRobT5DUkMzMjwvQ2hlY2tzdW1BbGdvcml0aG0+PENoZWNrc3VtVHlwZT5GVUxMX09CSkVDVDwvQ2hlY2tzdW1UeXBlPjxTaXplPjExPC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "b8ad206d0d556357", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key-does-not-exist?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:47 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "069ZZfzVj9jliCBIT3qBX+lO0y9+HxHK+5Knltv17IPbLjapgpX86DdBjB0jztF9H+q31TFhqhtzkWVsaD166RchvtvO9vu6" ], "X-Amz-Request-Id": [ "1HFF1WCPSXZP8GXP" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPk5vU3VjaEtleTwvQ29kZT48TWVzc2FnZT5UaGUgc3BlY2lmaWVkIGtleSBkb2VzIG5vdCBleGlzdC48L01lc3NhZ2U+PEtleT5rZXktZG9lcy1ub3QtZXhpc3Q8L0tleT48UmVxdWVzdElkPjFIRkYxV0NQU1haUDhHWFA8L1JlcXVlc3RJZD48SG9zdElkPjA2OVpaZnpWajlqbGlDQklUM3FCWCtsTzB5OStIeEhLKzVLbmx0djE3SVBiTGphcGdwWDg2RGRCakIwanp0RjlIK3EzMVRGaHFodHprV1ZzYUQxNjZSY2h2dHZPOXZ1NjwvSG9zdElkPjwvRXJyb3I+" } }, { "ID": "b5a03c3e37729bda", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/mydir/as-test-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fmydir%2Fas-test" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:49 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "wYObzZ0l2f/ZJQuDH8olBZNbCLn1T93R/fJhW6VZVXWa8VZiWljuMQ+33Yak2PKCDtLuelFh+sh0hV8DkEYUm3I8BVNtwT0o" ], "X-Amz-Request-Id": [ "1HF7ZV54M4BXY6EX" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjQ5LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWViNjNiYmJlMDFlZWVkMDkzY2IyMmJiOGY1YWNkYzMiPC9FVGFnPjxDaGVja3N1bUNSQzMyPkRVb1JoUT09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "f40ab0a4b21e8673", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/mydir/as-test-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:49 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:49 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "J1rQIa18OJHlFRF+YQzCde6nAleWVR6FrQHYO2uELOjqhnW9y0GfB72eX7max7UL1cYrbAwZyZNoxlPB/P0Go7dl1fQcZHzY" ], "X-Amz-Request-Id": [ "1HF49247A3QJFGE4" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "e494098ca8915b57", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/mydir/as-test-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:49 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "PqYLdkjvh+0AzHQ3/Nbgzj/tm6STWUo6YpkW/NE7he5Kz+/OWgheRF39TMHUmHYE6cVeSFo7wz26WxnzUEZONyMUaFlaQR/Z" ], "X-Amz-Request-Id": [ "1HF38W58TN8M49EH" ] }, "Body": "" } }, { "ID": "410a2c261e662e02", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/mydir/as-test", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:49 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:48 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "ooCzbk1BDyLfAeuh6yCvN0QdmXWrXpKUmQ0W/QzTV8w3Uhs7m606/aMzmjZ9XJHWP6PGw4IODIX6G+BKcbeJlwtYKRgelLyO" ], "X-Amz-Request-Id": [ "1HF53J4AGKVAVHZX" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "954451e686b2d73f", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/mydir/as-test?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:49 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "JJ+7TeJP5iqas2Pf4KbvenScxMesYgYOcY4RkCtw7NJkyPhUYChNLoMzR24naa4Fyu2GmlBMgz49Uj72eOyhMlPGK4ux4xpv" ], "X-Amz-Request-Id": [ "1HFFKHH7J8J6SEC1" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestAs/verify_ContentLanguage_can_be_written_and_read_through_As.replay ================================================ { "Initial": "AQAAAA7hTg0vC1O5ywAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "6d58fd7ffd366c80", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/mydir/as-test?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Language": [ "nl" ], "Content-Length": [ "52" ], "Content-Md5": [ "XrY7u+Ae7tCTyyK7j1rNww==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "11" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "Yg0KaGVsbG8gd29ybGQNCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOkRVb1JoUT09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:48 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "DUoRhQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "D0XbcsRNTns+5oPJke7UE6ZLly48x41sBhF+uvOJK5n/4bL7JMJfZX/1lMVlqOfYnc0oHPIfHbM=" ], "X-Amz-Request-Id": [ "DRCTDPN3V1GEZ4G5" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "c0106fd05df9d14b", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/mydir/as-test", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Language": [ "nl" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:48 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:48 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "B0+kPI6imAQ9X1A9gKfizJXNGBHp6jXN5Tb35ol/gelUHnpgIzHu+aFztptK027JKxGCJr1kAwY=" ], "X-Amz-Request-Id": [ "DRCXNP2JVD11PV21" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "3b76fe489c65facf", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/mydir/as-test?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Language": [ "nl" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:48 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:48 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "DUoRhQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "3xAz0SOfdWPv1uI2uUSY5/dYpCh7tm3iIVPLuCL+Ua9OHu8g7xhFfodgSRhRvjF2lYEAYVS97v0=" ], "X-Amz-Request-Id": [ "DRCN28PA6XFYXNGN" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8gd29ybGQ=" } }, { "ID": "b8048fdd64bd9809", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026max-keys=1000\u0026prefix=mydir", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:48 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "2S4Lx6A25iGfKhpCawJnuvDlwqNhsECcWXa+1vp8tyROt3mdbjHVwYKyZOEj7urdND6/tASNrXc=" ], "X-Amz-Request-Id": [ "DRCV0WM52E0J4TQC" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+bXlkaXI8L1ByZWZpeD48TWFya2VyPjwvTWFya2VyPjxNYXhLZXlzPjEwMDA8L01heEtleXM+PERlbGltaXRlcj4vPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5teWRpci88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "6ea52599f0097587", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?max-keys=1000\u0026prefix=mydir%2Fas-test", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:48 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "DAexnTK9Bsau1xTfXrQps8tWSUZQ9v3kcAx2XLMWuEdqNv2VczkJncYESRdGCUqVHcsc5qfajaw=" ], "X-Amz-Request-Id": [ "DRCXED01S4VHRWN0" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+bXlkaXIvYXMtdGVzdDwvUHJlZml4PjxNYXJrZXI+PC9NYXJrZXI+PE1heEtleXM+MTAwMDwvTWF4S2V5cz48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5Pm15ZGlyL2FzLXRlc3Q8L0tleT48TGFzdE1vZGlmaWVkPjIwMjYtMDMtMTlUMTU6Mjg6NDguMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVlYjYzYmJiZTAxZWVlZDA5M2NiMjJiYjhmNWFjZGMzJnF1b3Q7PC9FVGFnPjxDaGVja3N1bUFsZ29yaXRobT5DUkMzMjwvQ2hlY2tzdW1BbGdvcml0aG0+PENoZWNrc3VtVHlwZT5GVUxMX09CSkVDVDwvQ2hlY2tzdW1UeXBlPjxTaXplPjExPC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "fd6245de8cc30c0b", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key-does-not-exist?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:47 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "zIyVYIuiPzYFwuRZfoYemDcUsylQ8AXuRn80g3fqY5HzmWe0npst94Zl9VMUM0Rk181BvJ/7IbY=" ], "X-Amz-Request-Id": [ "DRCGXEM5VK16QSDB" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPk5vU3VjaEtleTwvQ29kZT48TWVzc2FnZT5UaGUgc3BlY2lmaWVkIGtleSBkb2VzIG5vdCBleGlzdC48L01lc3NhZ2U+PEtleT5rZXktZG9lcy1ub3QtZXhpc3Q8L0tleT48UmVxdWVzdElkPkRSQ0dYRU01VksxNlFTREI8L1JlcXVlc3RJZD48SG9zdElkPnpJeVZZSXVpUHpZRnd1Ulpmb1llbURjVXN5bFE4QVh1Um44MGczZnFZNUh6bVdlMG5wc3Q5NFpsOVZNVU0wUmsxODFCdkovN0liWT08L0hvc3RJZD48L0Vycm9yPg==" } }, { "ID": "9d49969a506c4185", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/mydir/as-test-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fmydir%2Fas-test" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:48 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "kgbi3VkAwsLz1SFDXuPXGYOZgAnTsxjhZBXBljVYyz121gNjxvPa9pB7Ean2zod97CKzE04MjJE=" ], "X-Amz-Request-Id": [ "DRCYQK1MC9WQVFYH" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjQ4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWViNjNiYmJlMDFlZWVkMDkzY2IyMmJiOGY1YWNkYzMiPC9FVGFnPjxDaGVja3N1bUNSQzMyPkRVb1JoUT09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "e12f95b1f5e5ecf7", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/mydir/as-test-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Language": [ "nl" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:48 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:48 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "D4+3/itqHhdFY9w2Uqe4mQPZKy6XXMxY6B0AwSSOTfNlrMr3h3lMuH45BxM4wT4ojmXv+hXw/uM=" ], "X-Amz-Request-Id": [ "DRCQTQZVVBQX7PW3" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "cd319fdc0e1933d5", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/mydir/as-test-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:48 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "KnM1sHR8C5NNJw9pKeBZZxeIAkMhef1BrBRokyJVqGzvAH9MBfidVqgktCQnzJQGO4ig3eWN/4w=" ], "X-Amz-Request-Id": [ "DRCZYB9MMYZ5MVZ3" ] }, "Body": "" } }, { "ID": "a8610630ed426eb1", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/mydir/as-test", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Language": [ "nl" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:48 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:48 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "e2TmXtGgpbvlYePDsS38HvUqprXevYKY1Jo8oVanD0j/ucA5BywDWrznCM10cEdvO0L7Q9MI508=" ], "X-Amz-Request-Id": [ "DRCJ2D0BKEMPN6D2" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "2844e06ca6be346e", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/mydir/as-test?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:48 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Bczc2Z3xCzfgPGPtKkDTto5nqwXohFjfgCNwn9yg20Hy83G+sR85zLaKeO0ixVn7ocEgXrsmpPU=" ], "X-Amz-Request-Id": [ "DRCR8W3FXN2PX242" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestAttributes.replay ================================================ { "Initial": "AQAAAA7hTg0cKEMQhQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "6b60635bfad53e1d", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/someDir/blob-for-attributes?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Cache-Control": [ "no-cache" ], "Content-Disposition": [ "inline" ], "Content-Encoding": [ "identity", "aws-chunked" ], "Content-Language": [ "en" ], "Content-Length": [ "53" ], "Content-Md5": [ "7Qdih1MuhjZehB6Sv8UNjA==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "12" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "Yw0KSGVsbG8gV29ybGQhDQowDQp4LWFtei1jaGVja3N1bS1jcmMzMjpIQ2tjb3c9PQ0KDQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:29 GMT" ], "Etag": [ "\"ed076287532e86365e841e92bfc50d8c\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "HCkcow==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "tA5lJuY7FuJeW6EywBsr3ZPuysGtGaAD8/GaCzCBiJYA/IeBVeWylTQM3ygUm07PQ0fPGB43e5w=" ], "X-Amz-Request-Id": [ "22CE1T4XV768Z56P" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "55071baf093eddd8", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/not-found", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "cKGASMjkGqhHhJisipJhm00VqaX5PAyOjVm0a55qr06v05+OMAsj/+XmTJoMG/I4twLCvwLYd8U=" ], "X-Amz-Request-Id": [ "22CEBB1M38GANZ72" ] }, "Body": "" } }, { "ID": "3d007068573e6c48", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/someDir", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "5LgdFkbL7bXh9AuwMVdrCb/R+eCUheKKNu5bZqwsFtyH0xI7DfdEVx0LAcN6AJ8n2S//HSt76R4=" ], "X-Amz-Request-Id": [ "22C9PKK0VAP10YAN" ] }, "Body": "" } }, { "ID": "583a4746a7ad20a2", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/someDir/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "wiR+P97AxQOXLvFnFTUP+AoX8NKsxMsOgELtKzrzwHa477oan+Vpq/UsQqFIX3tTrDiKkORIs7Q=" ], "X-Amz-Request-Id": [ "22C5WAFYC44P25MF" ] }, "Body": "" } }, { "ID": "a546fc21efe254bf", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/someDir/blob-for-attributes", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "no-cache" ], "Content-Disposition": [ "inline" ], "Content-Encoding": [ "identity" ], "Content-Language": [ "en" ], "Content-Length": [ "12" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 19 Mar 2026 15:28:29 GMT" ], "Etag": [ "\"ed076287532e86365e841e92bfc50d8c\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:29 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "dDImLGGA2gbG3ty1eamPtiA+O8oLbE+Xw/UGGLJwDoNTMYu2BF1176uEJH0DMJ0DdQw0CvbuvnY=" ], "X-Amz-Request-Id": [ "22C2PM4WZG1KY4P8" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "6a7891d9588f30a8", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/someDir/blob-for-attributes?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "no-cache" ], "Content-Disposition": [ "inline" ], "Content-Encoding": [ "identity" ], "Content-Language": [ "en" ], "Content-Length": [ "12" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 19 Mar 2026 15:28:29 GMT" ], "Etag": [ "\"ed076287532e86365e841e92bfc50d8c\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:29 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "HCkcow==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "qg98mn3wHPnE8vfH7Ua7hlfNzjbvTuyldzPTVbEWiWaRxqwJ5jLAHnsplQ61SzvfkmoTBFO1gio=" ], "X-Amz-Request-Id": [ "22CBK2SZT6F2YB7K" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "SGVsbG8gV29ybGQh" } }, { "ID": "81b040a91f0a21dc", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/someDir/blob-for-attributes?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "53" ], "Content-Md5": [ "7Qdih1MuhjZehB6Sv8UNjA==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "12" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "Yw0KSGVsbG8gV29ybGQhDQowDQp4LWFtei1jaGVja3N1bS1jcmMzMjpIQ2tjb3c9PQ0KDQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:29 GMT" ], "Etag": [ "\"ed076287532e86365e841e92bfc50d8c\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "HCkcow==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "P1StGVis8ryi1uIjWDV46obvOf4jmt+9U7/X1VG8Qq3saIgIjCeoRyTXJ6tt1c38VUT/lJB75QE=" ], "X-Amz-Request-Id": [ "22C1YTY31N22ERCT" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "2aa7c82537f9afd3", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/someDir/blob-for-attributes", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "12" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:30 GMT" ], "Etag": [ "\"ed076287532e86365e841e92bfc50d8c\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:29 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "3fRU/DBvV+jhrqSVI9r7+K0ZS+7QfATGlO439YruuPTFLXvEOCIiwrOdSBKT5ysvQFmLdj1SMh0=" ], "X-Amz-Request-Id": [ "DP0QVWFH97TERAX2" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "33b16fc40525bec9", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/someDir/blob-for-attributes", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "12" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:30 GMT" ], "Etag": [ "\"ed076287532e86365e841e92bfc50d8c\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:29 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "FxTBfKr1kQcHWvCrco2JJHLkA0I919D25Bi1DjGYtWcyDDgChmQH2afMjGST+j5FwifOUjdVqwc=" ], "X-Amz-Request-Id": [ "DP0N3MWZ47HW6C6M" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "0549265c830d6f4e", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/someDir/blob-for-attributes?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:30 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "1PywoF+W9DpL4N14VPkEHn+qx3n/RupqWPQMr0ZW0asyjpjHklzHc5HVlCbwxCEfQZmnqvR9q3A=" ], "X-Amz-Request-Id": [ "DP0KR1P2057DDT87" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestCanceledWrite/BlobExists.replay ================================================ { "Initial": "AQAAAA7hTg0gGiOPAwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "fb59fc6eb73404c4", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-canceled-write?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "52" ], "Content-Md5": [ "XrY7u+Ae7tCTyyK7j1rNww==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "11" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "Yg0KaGVsbG8gd29ybGQNCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOkRVb1JoUT09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "DUoRhQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "eO+JRDdGtpS5m/oxYQQf/42QhYg7jbAuLOUFpVipJMjsdcokr2f2qFuV11Suw4iMOBIerzdQpYCTFpo1MMZdhemACkcpx/cr" ], "X-Amz-Request-Id": [ "R94TCVSXSQKXX2A5" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "a0157deee06f502c", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-canceled-write?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "DUoRhQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "0Ll7fck+VdG9hksiZScV6FgbaD5ATjyDe2MDMuHAm/amA/UKBsXGt52uox+G4kSEsGij8ywNQIBBEfVBk5w56+2BmcMUpMjh" ], "X-Amz-Request-Id": [ "R94JQ9WTJT1Z9FJ7" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8gd29ybGQ=" } }, { "ID": "f86970dd0a40eb62", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-canceled-write?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "DUoRhQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "FEFIgCGFwGEEEACq9fra9zYAv2W059hoRzXNavX94kiiRd4fJz6xeweTxmveHgts0zGw7siufHZ6wdAA1oX+Gar4Sq1lNdEm" ], "X-Amz-Request-Id": [ "R94JBHV30MAW81HT" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8gd29ybGQ=" } }, { "ID": "2ab89afe7a3b4902", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-canceled-write", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "3OZNLsY0j6ZKlkgG9VzXCq+z4MnKVZTQVdzbcqFhlvWqsPEGlqCoyClDjG8wKgRptEjH5RyNBSh0Hc8fwDNH74Fr93fSPdxk" ], "X-Amz-Request-Id": [ "R94KN4WZWTP9CQ7K" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "f23866d08af4e911", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-canceled-write?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "V4SUqdiiNepYGSpuCPqHjGtA4AL05EU+OGbsoFHy3IUJg7dtNmA1jNmQAHC8ZF6Vtnk03gN9eCoIFHc+2KXQ/OHlrp3jao7A" ], "X-Amz-Request-Id": [ "R94QZ0SSB3SD7JA2" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestCanceledWrite/EmptyContentType.replay ================================================ { "Initial": "AQAAAA7hTg0gA2U/QQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "bf19282550870109", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-canceled-write?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:31 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "jp3epgd+CjNVuIxhqa4FPejhkvAapcjdrQ7oAoNzFIXKLrkqpn/TCZpPHJPOsPA9dBGuaTFLKpU=" ], "X-Amz-Request-Id": [ "R94QVR62D9EWCH12" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPk5vU3VjaEtleTwvQ29kZT48TWVzc2FnZT5UaGUgc3BlY2lmaWVkIGtleSBkb2VzIG5vdCBleGlzdC48L01lc3NhZ2U+PEtleT5ibG9iLWZvci1jYW5jZWxlZC13cml0ZTwvS2V5PjxSZXF1ZXN0SWQ+Ujk0UVZSNjJEOUVXQ0gxMjwvUmVxdWVzdElkPjxIb3N0SWQ+anAzZXBnZCtDak5WdUl4aHFhNEZQZWpoa3ZBYXBjamRyUTdvQW9OekZJWEtMcmtxcG4vVENacFBISlBPc1BBOWRCR3VhVEZMS3BVPTwvSG9zdElkPjwvRXJyb3I+" } }, { "ID": "bdc77e0cd849527f", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-canceled-write?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:31 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "xoQMiw8DASGP+WaPHZoI8/cT3aGAD7uzbIbMpvboj3XDZw5RFOyulQgVhsckT4uFaHWdWtSK5ds=" ], "X-Amz-Request-Id": [ "R94G7P0TXVK5QNRV" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPk5vU3VjaEtleTwvQ29kZT48TWVzc2FnZT5UaGUgc3BlY2lmaWVkIGtleSBkb2VzIG5vdCBleGlzdC48L01lc3NhZ2U+PEtleT5ibG9iLWZvci1jYW5jZWxlZC13cml0ZTwvS2V5PjxSZXF1ZXN0SWQ+Ujk0RzdQMFRYVks1UU5SVjwvUmVxdWVzdElkPjxIb3N0SWQ+eG9RTWl3OERBU0dQK1dhUEhab0k4L2NUM2FHQUQ3dXpiSWJNcHZib2ozWERadzVSRk95dWxRZ1Zoc2NrVDR1RmFIV2RXdFNLNWRzPTwvSG9zdElkPjwvRXJyb3I+" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestCanceledWrite/NonEmptyContentType.replay ================================================ { "Initial": "AQAAAA7hTg0gEkeSZAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "cbdaa23d106a0526", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-canceled-write?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:31 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "BATjttzP2hjGaj2CFjTU9+VA68BwYh/dQjeM1wuAySoEAiFH3rVpsK8GyuuSn89miKvrPfFcUcA=" ], "X-Amz-Request-Id": [ "R94PCVFR3ZVZBC1N" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPk5vU3VjaEtleTwvQ29kZT48TWVzc2FnZT5UaGUgc3BlY2lmaWVkIGtleSBkb2VzIG5vdCBleGlzdC48L01lc3NhZ2U+PEtleT5ibG9iLWZvci1jYW5jZWxlZC13cml0ZTwvS2V5PjxSZXF1ZXN0SWQ+Ujk0UENWRlIzWlZaQkMxTjwvUmVxdWVzdElkPjxIb3N0SWQ+QkFUanR0elAyaGpHYWoyQ0ZqVFU5K1ZBNjhCd1loL2RRamVNMXd1QXlTb0VBaUZIM3JWcHNLOEd5dXVTbjg5bWlLdnJQZkZjVWNBPTwvSG9zdElkPjwvRXJyb3I+" } }, { "ID": "dc279e064c2bdc2a", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-canceled-write?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:31 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "IIlWBAwX24R/bP8umkp9Jpt0ei8z2aDcj41ZZdT2ZfwGQOi0NvCbsyKn2pSSu0VWIGOoFMi3X30=" ], "X-Amz-Request-Id": [ "R94HER5PSEBWB7HZ" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPk5vU3VjaEtleTwvQ29kZT48TWVzc2FnZT5UaGUgc3BlY2lmaWVkIGtleSBkb2VzIG5vdCBleGlzdC48L01lc3NhZ2U+PEtleT5ibG9iLWZvci1jYW5jZWxlZC13cml0ZTwvS2V5PjxSZXF1ZXN0SWQ+Ujk0SEVSNVBTRUJXQjdIWjwvUmVxdWVzdElkPjxIb3N0SWQ+SUlsV0JBd1gyNFIvYlA4dW1rcDlKcHQwZWk4ejJhRGNqNDFaWmRUMlpmd0dRT2kwTnZDYnN5S24ycFNTdTBWV0lHT29GTWkzWDMwPTwvSG9zdElkPjwvRXJyb3I+" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestConcurrentWriteAndRead.replay ================================================ { "Initial": "AQAAAA7hTg0gLFX6xwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "33f43e0a6d0f262b", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key16?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "65n9CjdrJkNQEaG4fFWMgQ==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "MTAwMA0KEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEA0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6Rzd0M0tBPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"eb99fd0a376b26435011a1b87c558c81\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "G7t3KA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "iPTLrJKR2R5WLxyNigm+prSeQco8TZEU9It2ggF3JXyBrJbN/Gtgg8rBehqcIVkJ7PeCfluW8GI=" ], "X-Amz-Request-Id": [ "R94GG4JM4F6CA875" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "e3891c0c53d3dc90", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key9?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "kfsiuKRZ73D7CzauKodAhg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "MTAwMA0KCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQ0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6dVRMY21nPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"91fb22b8a459ef70fb0b36ae2a874086\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "uTLcmg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "VA8p9sWldvk+7y8+E6SdB9eJF7BTNXaF3+vtGVUxpWxzyvHl3fzK9NZcItzjYfXevijRA1ZJuk0=" ], "X-Amz-Request-Id": [ "R94K75TYFFW9PVFT" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "25aabdb96fff64f9", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key14?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "NlFDUFM0TpF1S+MXE1PxDg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "MTAwMA0KDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6SmZocTNBPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"3651435053344e91754be3171353f10e\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "Jfhq3A==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "lIoN74laKCTmS921j/qYv0OWDq3y3H+jogm3XBh/n496toBMpcix4Z20fjQkbuEkG+D5tD/E1yI=" ], "X-Amz-Request-Id": [ "R94PWK9RBE0KSY45" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "63261116584c681c", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key19?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "2w9S4aRqKABHoeAhyiAJMA==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "MTAwMA0KExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEw0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6eG9SZE1BPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"db0f52e1a46a280047a1e021ca200930\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "xoRdMA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "bAupgKF99+QbqIuVj4p36D2Y4Cz403QCBx3McNs3bDFVBRrsZZokqV1ifFwAGBFMfsgG7PVOGIA=" ], "X-Amz-Request-Id": [ "R94PCAQEVT8ZSKXG" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "392b5ba15040a999", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key0?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "Yg8LZ6kff3QVG8W+dFtxEA==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "MTAwMA0KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6eHh3QUVRPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"620f0b67a91f7f74151bc5be745b7110\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "xxwAEQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "Lt1bGSpEoaXvDDb97xsgY/6uZjeZCtF2Sfd+Fm/kBAT53vL76UOtB4LFu4cXRu4ojuLd9CMDDlc=" ], "X-Amz-Request-Id": [ "R94QJAGTAARZ3RSD" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "c5cd8012fa71c4eb", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key3?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "7tBPOyKIo0omYOmbN3Ht7w==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "MTAwMA0KAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6R2lNcUNRPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"eed04f3b2288a34a2660e99b3771edef\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "GiMqCQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "jPTReZDe4X6GNSjdRA2x/Kj1Lm6cgIgxvn/aIHRiJ81qMhRJKS2WKQNzl1diT0rUAbyIJc7rsnw=" ], "X-Amz-Request-Id": [ "R94VDVAZ8K6P8H0D" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "47a94a739fb15f3f", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key11?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "AbDmWR96f1VIFnW4JQ5/SA==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "MTAwMA0KCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCw0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6bWNnU3RRPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"01b0e6591f7a7f55481675b8250e7f48\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "mcgStQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "TbnW6P+pSwEM7NJwGxDcNLlwbIHEc4mySmkY4t5hZVT7lPIl1IiOmOi7/187Kcu4CpopnuVaAIpjoUTGe+kAJ5fH6T8Qqh09" ], "X-Amz-Request-Id": [ "R94KE0VP1VBX1ZYD" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "4d0a671bbe504c91", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key17?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "32eeXsj7ZyhCl0o20wPQ/w==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "MTAwMA0KEREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREQ0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6NW42VEh3PT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"df679e5ec8fb672842974a36d303d0ff\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "5n6THw==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "Xbbirxu9mGyaDu9kjpEYvc3NPOqPSPmCcp4YloIbfNsQ7owsx0/ErW65hHURRI731jN+Ye+QGq2d3CR7HsLT3sdsoUrbse55" ], "X-Amz-Request-Id": [ "R94KXSGQDE561N5D" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "bdbd8c6586fced2b", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key12?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "VkGQ+3LJseHAFopbb+BYvg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "MTAwMA0KDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6QlFLazh3PT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"564190fb72c9b1e1c0168a5b6fe058be\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "BQKk8w==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "EonuNpmbd2HxCMSxj/cWPXJjIWFJgiaXkUacFIHXK/jTDPveKFNQOrTZ/f6y7jie7cFBxsZ+Wi2khhstQMQExGw5oLdi0r+T" ], "X-Amz-Request-Id": [ "R94P0R9F4PF1SCE6" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "6dda276869dba171", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key2?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "ZUHn/UhoC5tg7AVev6McAg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "MTAwMA0KAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6NStiT1BnPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"6541e7fd48680b9b60ec055ebfa31c02\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "5+bOPg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "jF0yhobWva/1HgODbZqoxeS8tMTowHiiq5vPb3TX7wL7u82Mn03EjNgN84lIVUS3o0bsJ+I6Bei4Ne0yFI1hY1uh5T97SzUB" ], "X-Amz-Request-Id": [ "R94K4KMN2FA4G3QT" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "0a057dc99f746698", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key10?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "AXKK1JVcZ791KxchIXYNNg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "MTAwMA0KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6WkEzMmdnPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"01728ad4955c67bf752b172121760d36\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "ZA32gg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "zPsUqrt9GwReG8tWAryBS17MTe6Azp/6FOpfUeG5wtiCodzyGYLODYNt9ZOg4RwgLoOnKiaKYYr/Qi4b1YXGsRlZYvs/64Va" ], "X-Amz-Request-Id": [ "R94QF4AGWM5TX1QT" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "d921abebc4a0c079", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key6?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "lko2uDqoJrgEyYNnvcJ6vw==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "MTAwMA0KBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBg0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6cGhOU1lBPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"964a36b83aa826b804c98367bdc27abf\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "phNSYA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "uTIw4gbVhaJYgkLoquguiibiX7GKpoU2MI7iZkmY4q3zxJN+u5mrl9pbajkSLZg27l3/J7f9fhduuDQpCR9VK2LikEg+RVab" ], "X-Amz-Request-Id": [ "R94W1M2QH3S3B0K6" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "bc2af4dcf9d8d94b", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key4?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "H06jyF3ZsJDOcwyB5gg+zw==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "MTAwMA0KBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6aHVtY1R3PT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"1f4ea3c85dd9b090ce730c81e6083ecf\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "humcTw==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "PkaqRV9XTa4X+IVOTxzwBsnJo1XUULLcTyHHHNJMtE4yBCJ2oHmjDykRnLDZeChNE9rLt72QvaKRgI4jord0/clme8beQjMg" ], "X-Amz-Request-Id": [ "R94TGQQBT5Q9T5HX" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "8bfdc9b8244497c3", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key8?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "qPZPE0uAGBNKE6LhEQTA8Q==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "MTAwMA0KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6UlBjNHJRPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"a8f64f134b8018134a13a2e11104c0f1\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "RPc4rQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "pbfkhzEhY0+PUnC7LvHOOc2Dmoad8qVYGqS9i7x5Q+CsAm7t4ryCfGYMNw1ix0qYQlR212QxApSsO4OC3JHNtHpJqzIhlJFQ" ], "X-Amz-Request-Id": [ "R94H9VASECTDWXZW" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "0b2e494311f336b6", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key18?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "wZvI1MtOgANGQD0gzZ4NUg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "MTAwMA0KEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEg0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6TzBHNUJ3PT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"c19bc8d4cb4e800346403d20cd9e0d52\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "O0G5Bw==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "jbY9SOzuE/UxuLXEl+gcJahPzfp6aYc+OXxq2e6WkaMkrKVc1QrJtcQE62lYyz8NoHuAIsn18aiqqu0c3qmf5/DViQpX7zBc" ], "X-Amz-Request-Id": [ "R94WV1NYW179C7V2" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "2e8ebb652008dad4", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key15?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "qHqy3TOCPLWABZ/YTEeiAg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "MTAwMA0KDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6MkQyTzZ3PT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"a87ab2dd33823cb580059fd84c47a202\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "2D2O6w==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "slqtsryPh2Fz0KQ3lhsIyJQfIdCbB7EcFIG/icmW56Ii9K9o8f0q5cnqANvNbALTf9RS9CtXfmymM/OirVupvQJ7xuUSISal" ], "X-Amz-Request-Id": [ "R94XRRXH3WCAZC7T" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "9ffa418379f52a4c", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key13?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "SsTzFZ3m7R1NrIc42UKW+Q==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "MTAwMA0KDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6K01kQXhBPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"4ac4f3159de6ed1d4dac8738d94296f9\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "+MdAxA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "1jOdvUEvDACo6OUhyWN/RmX8sy05SFzMey/UG8eWmYRhXXJodbuLLRAZTdSE021ehBk3Wt70GlPZqtLxUx3PvqYRzcxIi7Ri" ], "X-Amz-Request-Id": [ "R94ZW3BME86W39A2" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "c465911e220fd0be", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key5?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "YfRaKQkG0Wv1UeeMsD1f+Q==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "MTAwMA0KBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6ZXl4NGVBPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"61f45a290906d16bf551e78cb03d5ff9\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "eyx4eA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "SyBVweOkAWtjavXwkDF04NSGuMbhCtPZ5rkgFHbRfG7rC1DgCrtFX6l/1W8n7SfSpRny5fkzovCGEDBJhMqgBwy/28e8zWLg" ], "X-Amz-Request-Id": [ "R94M3BB0WSY9XKC8" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "8afc85a3201b0064", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key7?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "kbuiTp5JEugjwAkgztPoXA==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "MTAwMA0KBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBw0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6VzlhMlZ3PT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"91bba24e9e4912e823c00920ced3e85c\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "W9a2Vw==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "ZqTC2y/rfIo+AFhBvhFXDtfZa2oJAZgEit+NaCSJgeVNOiWMEnc7jC+E925n0/sFXrmla6ykwTQ0l0QrbPues+z39m9qeUxP" ], "X-Amz-Request-Id": [ "R94RFDRCX9PJH7EV" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "827c28df42e5d3c2", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key1?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "4140" ], "Content-Md5": [ "qo85ln3rRBpudISWOUWpYA==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "4096" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/octet-stream", "BodyParts": [ "MTAwMA0KAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6T3Rua0pnPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"aa8f39967deb441a6e7484963945a960\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "OtnkJg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "gITttwxlyiWFTLq0l+8Nx/N0Ug2p3mCsZlgQQn8EGHbnBodVaWSsRnJYA310XY2bffm3LpGrM/0=" ], "X-Amz-Request-Id": [ "R94VJFMC9XP5X06Y" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "f7c12fe33c34469c", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key19?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"db0f52e1a46a280047a1e021ca200930\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "xoRdMA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "i7IK3o0YazVUYQHLEmYjP4cFhFqr3b1PwMvFh8OA2MJl4qmdLiGcYdlC+3qL0NzHnfvSw0pTEKE=" ], "X-Amz-Request-Id": [ "R94SZ8GMSF4TKJRY" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "ExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEw==" } }, { "ID": "6202bbbad837c39d", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key14?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"3651435053344e91754be3171353f10e\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "Jfhq3A==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "aODa5ReVH44Fy/UfyqGd3oHrWiJm3FCCVNLZEWjXiUHXR8n8GgwNBNX9/7fyp/LticSpnOMzZfw=" ], "X-Amz-Request-Id": [ "R94R119Y5QKEBJ99" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg==" } }, { "ID": "24819150e5bcbb42", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key8?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"a8f64f134b8018134a13a2e11104c0f1\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "RPc4rQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "d+bQN5sUAKBLE65VWpp5pl1Iakzxp0vdOLYJxUDPNq0wdBmXplmN29ICTOSv/XQmAm7iYhbdHmU=" ], "X-Amz-Request-Id": [ "R94TNA2TH7WR025Y" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA==" } }, { "ID": "e73a9c04802b0b11", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key17?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"df679e5ec8fb672842974a36d303d0ff\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "5n6THw==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "jO5acXeDN89b+eCIPa0WdgHX4Y8L6LDjanv/NTDbFXv9YeXqY/X8wF0tyqjeqEQ1lb3KQN0oXtc=" ], "X-Amz-Request-Id": [ "R94TKYWJMVR7V7KT" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "EREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREQ==" } }, { "ID": "228044239c25cd22", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key15?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"a87ab2dd33823cb580059fd84c47a202\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "2D2O6w==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "cAJJjsZikVJEYZomT/RPdjq+IzKTyPsVDJXG5TdFQiWmoTBYAMBDGrFcOtuKezv3hmFbI13+Z/E=" ], "X-Amz-Request-Id": [ "R94PFVVM6E0TTSAD" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "Dw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw==" } }, { "ID": "53b42fd3ea88d9ec", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key7?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"91bba24e9e4912e823c00920ced3e85c\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "W9a2Vw==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "uGh4xouwrvdowwFrnXc3bRzxkzg+aVsYrAXOFqhyrxSH0VQCN12Ry+JBGKoJCymRID9cKgRZuVk=" ], "X-Amz-Request-Id": [ "R94N4XZJTGTTMM0M" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "BwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBw==" } }, { "ID": "0b81829e1f2df627", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key13?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"4ac4f3159de6ed1d4dac8738d94296f9\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "+MdAxA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "oMPez2aFS0RQ8zmaEu4Gz4nAhzHxiscQmzNvUggXNgthpz+q4MTUZsGb9gsJrrM1Krz5tIhPSkM=" ], "X-Amz-Request-Id": [ "R94T3AFRDA60V11F" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "DQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ==" } }, { "ID": "7bdbdcbad85f41cf", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key6?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"964a36b83aa826b804c98367bdc27abf\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "phNSYA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "0lY6eQxbLhU70hxnIojusvkiCw62A8pXHLiBmjQBLAyWYWSr1oUKlx9MBcn/g7YtwoxD3gCyRDY=" ], "X-Amz-Request-Id": [ "R94PNEF8GGYVA7VR" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBg==" } }, { "ID": "a32046cece6e71fc", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key0?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"620f0b67a91f7f74151bc5be745b7110\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "xxwAEQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "xB62uCBmItQT4J9A13ejhVp+LvbxOO180REouGiFgKORwSLtSGaV+zHKUDCA4RRCOT7rfKhWZks=" ], "X-Amz-Request-Id": [ "R94Q957WGF9ZQQP5" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" } }, { "ID": "9b901bfa8d17afc4", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key16?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"eb99fd0a376b26435011a1b87c558c81\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "G7t3KA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "xHFFIqt4i6g+qlitvHZdvm4zcnrWR85B7n/PyUcH9PyLgUMruCT+MSaEWZtljnolMKPsxNmcrvM=" ], "X-Amz-Request-Id": [ "R94V1F1Z8N0R5B9H" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "EBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEA==" } }, { "ID": "04eb6c4119a88f97", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key10?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"01728ad4955c67bf752b172121760d36\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "ZA32gg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "tYkyP5re1g+XRRq6ozwrTX6QsBWRuAoR/GD/CDmZiOFGJQoYhr2tuZL2j050GCo606mqStlEwOA=" ], "X-Amz-Request-Id": [ "R94P77CE6DED4NE5" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg==" } }, { "ID": "c0aca020d686a624", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key11?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"01b0e6591f7a7f55481675b8250e7f48\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "mcgStQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "iyeXNjQPH8tBhhy7p2R7k3LdoltyQnF5Jw+Ya4gOEPua5zCO0y+01+GPOD0u4hejjqBdm/S6zlc=" ], "X-Amz-Request-Id": [ "R94G0YR3AX3Z6M5V" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "CwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCw==" } }, { "ID": "5e955537ce18f26d", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key18?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"c19bc8d4cb4e800346403d20cd9e0d52\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "O0G5Bw==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "4Ah8xb3uZsvaCBTrPeH0UO1Ar6bQ3FL9bMqtBJkF5TSEz8fUw8dKCdjfglymyTWSKM8aFo4Fd4Y=" ], "X-Amz-Request-Id": [ "R94V5S2ABJQ751KX" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "EhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEg==" } }, { "ID": "661a4d56da0c9105", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key2?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"6541e7fd48680b9b60ec055ebfa31c02\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "5+bOPg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "JgsWEKdzzpavLEI2Jl/Y1XNLNHtDjHPDf/bPrIf/tr14OZrHAywctx3ZnAah01V2sQ/tw/TThbg=" ], "X-Amz-Request-Id": [ "R94QMAR9F43H1E0S" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg==" } }, { "ID": "847379375351f47d", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key1?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"aa8f39967deb441a6e7484963945a960\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "OtnkJg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "H2wg054zVMtrTqEG5mUPbfC6tq8AF654rDBOiuwEmsb1QyoE1OLMsp/J8gJH7WHeiNxMu60oUkI=" ], "X-Amz-Request-Id": [ "R94PGZ46PRB9E7A0" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ==" } }, { "ID": "2b0ec7230f40d9fe", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key4?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"1f4ea3c85dd9b090ce730c81e6083ecf\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "humcTw==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "4Nnyv/NJgud/hmLwjhNDk98phiccLh6L8YLKhx0YIR+2kHl8BdlGy2MFLhSjKFOpvp1Avm/Jx9o=" ], "X-Amz-Request-Id": [ "R94W3DRG3QF342SP" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA==" } }, { "ID": "6d95a7d292f77298", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key3?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"eed04f3b2288a34a2660e99b3771edef\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "GiMqCQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "dkUJKqXC9vfae7ozrv15E4eVO5pyi9ATryg8tmwe6KILk4nEJABacMrNdgCzzayn2UIR4Gc3e6Q=" ], "X-Amz-Request-Id": [ "R94SJK86KT9H7YC1" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw==" } }, { "ID": "cbeaea3b0b077483", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key12?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"564190fb72c9b1e1c0168a5b6fe058be\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "BQKk8w==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "PIMOYLd2hrmHuyK/pODnOglKx9Gf47Tvau/A69D96IHwBP9FW266ZguFaBU1V8b4A9BdJMKyw/o=" ], "X-Amz-Request-Id": [ "R94TFAETJ2CGVNCX" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA==" } }, { "ID": "385c8ed3642e23c3", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key9?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"91fb22b8a459ef70fb0b36ae2a874086\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "uTLcmg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "iGhmLe/IbU/cUKJoskgyFLDnhLg1kvfDCCak2z6yc8CzPam6NJj/w83LBjBOEfo+c+MqjMmkPOM=" ], "X-Amz-Request-Id": [ "R94WSDXG3YKXQ8EM" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQ==" } }, { "ID": "2b8c3139f156e34f", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key5?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Etag": [ "\"61f45a290906d16bf551e78cb03d5ff9\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "eyx4eA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "qHsmkzqlsf8imwHVWzi+iPc2gx1vKgKiB+echupVVZ3j+6YPGvBXSgCp4Mc/ECIpHn+IA2H8+/s=" ], "X-Amz-Request-Id": [ "R94PN934RHHSK443" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ==" } }, { "ID": "1994e2de64ac031d", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key19", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:34 GMT" ], "Etag": [ "\"db0f52e1a46a280047a1e021ca200930\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "W0MWpHf8AIViG8ZT3F77I0Xssr35QxJn2uTf1rLAx9Hddvk7f6mkKL/e5civ28aS7t/NHdrAP+o=" ], "X-Amz-Request-Id": [ "SE1J3BYCYRW7C86R" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "32666e82c9bd27f9", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key19?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:34 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "9T3+x9iVfS56qRLsoQvApO5zwOi+9YxuDQaSoa3kjC0MhL4Px1p8mM5IJ2h0dBAbFXmPYr+Sldg=" ], "X-Amz-Request-Id": [ "SE1KY9SDWSCH6EKC" ] }, "Body": "" } }, { "ID": "8b5b9513c487c49e", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key18", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:34 GMT" ], "Etag": [ "\"c19bc8d4cb4e800346403d20cd9e0d52\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Su+7yXSSg1m4dA0ENO7MDCkgPJ4dZ+m4yxp3owFdjPCQwKc8JeBNrm5WHrN5+7H9e0vUYNQMmN0=" ], "X-Amz-Request-Id": [ "SE1TWCHCXFS6MWWX" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "3493db76246792b2", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key18?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:34 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Tn50bw2Hv4i1E9H/xpEwIJniVfH2UOnbgq0aH5k7eCbJJB9zb24zLYl3x2V0jOiIvzYZc2VKggw=" ], "X-Amz-Request-Id": [ "SE1MZYKQTGWERCN0" ] }, "Body": "" } }, { "ID": "22b38b9a03390b27", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key17", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:34 GMT" ], "Etag": [ "\"df679e5ec8fb672842974a36d303d0ff\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "f7+EELTyh3tH818ZMtcQbhDHJE+S2ebrc45KyjtxMG3KiJiTMnuagtC7QFoXc8Zb50DbTRaPbS0=" ], "X-Amz-Request-Id": [ "SE1JRN7RSTN6N7E6" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "c58d2191a3481dd7", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key17?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:34 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "7Zqk/uXsSfAn8/ivLYV85L5GVGsfyuDKZrzM7ol0eHJu/xBX18Vt4Vli0/9wygU5ytHJRQlG8FU=" ], "X-Amz-Request-Id": [ "SE1KERW4X3P8CYA3" ] }, "Body": "" } }, { "ID": "c4f009dd3a3e01fa", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key16", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:34 GMT" ], "Etag": [ "\"eb99fd0a376b26435011a1b87c558c81\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "VxMyE9Fr0p6cHQ12pBaGuzqoY5hIMEWVeAXJOX9yNdorYvIVoi/Bhudrpp8MSdLrAuwx9dzKq7E=" ], "X-Amz-Request-Id": [ "SE1XV2WVD1T932CR" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "6b508f454997a077", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key16?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:34 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "jsn/77sWHAKOXqE7Nvh6YCs+N5XlfesQ9O+XXzEN6sngfY1tGjct05tyjDabJ3UgORmok1VHr80=" ], "X-Amz-Request-Id": [ "SE1XQTY1B1RSEX8M" ] }, "Body": "" } }, { "ID": "6c4dcdd984cd09aa", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key15", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:34 GMT" ], "Etag": [ "\"a87ab2dd33823cb580059fd84c47a202\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "iXnB99ObOycLCrGT1RnMXFoaQ4eP6hmgF/r3HDFzlzBl3g1nEVri3xQNoAOp1Nj64C1konpRGPk=" ], "X-Amz-Request-Id": [ "SE1M28EXND4JWVTD" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "c1737c25188da75c", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key15?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:34 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "PznxIsKqRons/kvYqUX4XoXtsSkrIMrp9+fvEXdHktivSHspfqnqbbcXqVGY2nbLyLQxFMPkvOU=" ], "X-Amz-Request-Id": [ "SE1Z1DKCZWJNMKFS" ] }, "Body": "" } }, { "ID": "4e493e72ed71a711", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key14", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:34 GMT" ], "Etag": [ "\"3651435053344e91754be3171353f10e\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "zLnLrJxeMLrEWdYIo3Xpp94V/0SuBZnBgoXFldkGkhDxNA1MNzNz8Zn+SqgQStDZw1JIGMOjViA=" ], "X-Amz-Request-Id": [ "SE1HKT82EJ5W6FZF" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "527e14e083e3bdab", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key14?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:34 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Jt+k3KGO+OezildQMhc/JIae8EZ9drWj3HtAAWZ6XeqmRoBKKy/AOa9VqJkvewOQ/eOG4c49qXI=" ], "X-Amz-Request-Id": [ "SE1QHPNWNYZ459EB" ] }, "Body": "" } }, { "ID": "b77b7097c0058f13", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key13", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:34 GMT" ], "Etag": [ "\"4ac4f3159de6ed1d4dac8738d94296f9\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "2htOMEG7pEZ41fHRt5iKEZi/ljycF1qYX9mR05Z3mTn8bYdfI2RheSVTvVPsQNRZOwO+sItOJ4I=" ], "X-Amz-Request-Id": [ "SE1W9DYKT2JNZG1M" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "5516a3bb1d1b9928", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key13?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:34 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "CRU57XlfMUAbH0ElK9QtXzJgJC4sqwBUdOFccfSIZpiwzxGk5Nu2Wxv7s8B5IK4b5fw1gjYgvwU=" ], "X-Amz-Request-Id": [ "SE1V9F8C9PD64TXZ" ] }, "Body": "" } }, { "ID": "d6b20eeb8aaac53e", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key12", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:34 GMT" ], "Etag": [ "\"564190fb72c9b1e1c0168a5b6fe058be\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "p3gZ4D92ialWl340McXXHzf+iLv7kjNtUeP/yAibwPMwxq1w98nFtKlV1k6riL6LfzqF35WKow0=" ], "X-Amz-Request-Id": [ "SE1SPRM07B6AYYBJ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "bedb9e784c674313", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key12?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:34 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "YX/8lB04l1vcOJsJImTKm2Upn7xGBQxxFmmkbufUxds+MfG5Ekvwp+fY/WilHwG1RdsYB1DS5xU=" ], "X-Amz-Request-Id": [ "SE1X3T4QN87Q7HNV" ] }, "Body": "" } }, { "ID": "0964d110b4039196", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key11", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:34 GMT" ], "Etag": [ "\"01b0e6591f7a7f55481675b8250e7f48\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "uYP24wQhLr5QUEzZa4rRvhteOlf4Gmx+8v4vH5Hqpo89400YVnbBuxveY6nLi5oGAncOJOEO5V0=" ], "X-Amz-Request-Id": [ "SE1ZC6NAQJ587A08" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "dae56eb9fae58362", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key11?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:34 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "68XxxKwj/rzZaOxc9HwlHrPeEpWEOramzvoN1h6NL9MrsczV7XY6i1jgGauOWxjWritI0T4aPd4=" ], "X-Amz-Request-Id": [ "SE1JSV4KRPPF38PV" ] }, "Body": "" } }, { "ID": "8e3cc90e195f5a6d", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key10", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:34 GMT" ], "Etag": [ "\"01728ad4955c67bf752b172121760d36\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "CQ4pcth7/4HcvsWARNlMHFhA9A7wf2C187Ncd9t1OWpoK5LAZuuXbUEjVMZzffU42ckMJsasy7g=" ], "X-Amz-Request-Id": [ "SE1TYG6MS4RGVDGW" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "c05e97846a311fdb", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key10?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:34 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "bgbhuQ9wvDBYD4uXwdSSnz1etT1ebHvAtUDJR+aXT3we7ltRMqFD0J4GQcMo+WyD7yfvzXeOqsU=" ], "X-Amz-Request-Id": [ "SE1QNV7GY28R79AB" ] }, "Body": "" } }, { "ID": "8e232a39f7a20329", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key9", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:34 GMT" ], "Etag": [ "\"91fb22b8a459ef70fb0b36ae2a874086\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "nRZ8mehImXaq/I5i0EgplnmIrd4a7MfnBSnpCo0P4zjkKVu8dEfOaP/3fQ0IL8NuAk3wZanr67I=" ], "X-Amz-Request-Id": [ "SE1M4XM68Z2CP7FS" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "c76e1f9f23007b1a", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key9?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:34 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "/1r8M0y9nMagqwgLo2hsi/C9yhjcB1NOm4sxhDEXBcB5gaNqVzr06m2L+5w1VQ0PEIlWnEgXXgU=" ], "X-Amz-Request-Id": [ "SE1NYV6WJHDDWK90" ] }, "Body": "" } }, { "ID": "1280f43ad0ffbd5c", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key8", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:34 GMT" ], "Etag": [ "\"a8f64f134b8018134a13a2e11104c0f1\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "SqjmPXSQT6NXabyY1jJDBDkQGRma4XeuJlKf1i3HZARvo/i1fWTe282MyZP8S5u2ZswD787Hzj4=" ], "X-Amz-Request-Id": [ "SE1XWK1XM0GTB1EB" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "fbacc5d56911480b", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key8?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:34 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Yup3vf0P/xCoX+SL2gSxLUrsWxKE65i5UbyQiAahAosRr5GZHb1/O8ALF0YtZLlKVah37pWjg88=" ], "X-Amz-Request-Id": [ "SE1RWZZZWTF6EW2A" ] }, "Body": "" } }, { "ID": "c487653bda795aed", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key7", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:34 GMT" ], "Etag": [ "\"91bba24e9e4912e823c00920ced3e85c\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "qNkmAQYUBQUQPv3j6ynvv6Wsy2XRqP6862rTNdQkG8gkv4XQph7cEy/sm7E8oC1bjNRH5J1RKrE=" ], "X-Amz-Request-Id": [ "SE1S1K1GH9EQM3HF" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "04d2342e3659f43b", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key7?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:35 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "88rO+HN02eKOk8l/zgCN3wTai/6ASRR/EHeO7CX7elUoNy1iyqdIIxlW1hXQd8gHBP1fJDe3O0w=" ], "X-Amz-Request-Id": [ "FVF4TMZJK9WJTTZV" ] }, "Body": "" } }, { "ID": "0ce9579848dfb638", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key6", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:35 GMT" ], "Etag": [ "\"964a36b83aa826b804c98367bdc27abf\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "pq37jibW50FViU62T5msFbjp2xKXpqGPJvx+9CkbahMentbg704I4ai3o2Nvp4pcwoc9L+OI/pk=" ], "X-Amz-Request-Id": [ "FVFA4Q508WJAZPMX" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "1ba5bdd847bb326a", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key6?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:35 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "3PWpugy/n+RDsUlND62nCFJumQcr8CkgOaQx80X7ooxf+a7lIT5Ujm8zFrwiP7xR7skMHEIbcFI=" ], "X-Amz-Request-Id": [ "FVFBHN0HQ87BX15X" ] }, "Body": "" } }, { "ID": "12bd8ebc8b432cc6", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key5", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:35 GMT" ], "Etag": [ "\"61f45a290906d16bf551e78cb03d5ff9\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "17hhfA7dh1p6f+ctasHaXS+0Q/VZzToJKl7bMrvk3aLLDzZBUPDtDZzWR8k+sneky1L7GSYNgxQ=" ], "X-Amz-Request-Id": [ "FVF5ZN2ZYHVEPNV4" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "dd66f71d4e458072", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key5?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:35 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "bXJkqM/ddjyYFsl4K7B333monUDBLNwH3AoSTcYKUNV2z/adoiVOS0kYlbMQ3Uu2xizw9ENnepI=" ], "X-Amz-Request-Id": [ "FVF0YTF7CVHJZRJH" ] }, "Body": "" } }, { "ID": "4546e13257d33aed", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key4", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:35 GMT" ], "Etag": [ "\"1f4ea3c85dd9b090ce730c81e6083ecf\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "nt9WMEiUb4ZdKY+Rk1Ugx4mgBfENLPv4Tqcb/v9/iyIIyFrDaUtlcXQYdXrr/proLJP8a5eDbc0=" ], "X-Amz-Request-Id": [ "FVF74Q6W0Y2HH91M" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "87b4fdf25cce5c28", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key4?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:35 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "6fAr8g1t9IpAwt7GeauLKt5AQt2BT1qKgvYwRpCMD6b9dYLcCbp1vlzGfK5wm9aJguq2g8TwBfM=" ], "X-Amz-Request-Id": [ "FVF4FA95TCWWPNK9" ] }, "Body": "" } }, { "ID": "054104abd8815fe9", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key3", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:35 GMT" ], "Etag": [ "\"eed04f3b2288a34a2660e99b3771edef\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Mx6+ohohi9F6jAB0KiN2kejOW9dne+E27fjVP8ZAz5WjQcjbPxTvI3vQSXiFJ8NeT8ouKq42bGk=" ], "X-Amz-Request-Id": [ "FVFA3N97TWSF06A1" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "c1451d887959f3c0", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key3?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:35 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "w3Js9gEHWnSnV4j1KQBhpspfTJYGvgRJrFobVWRUgERJ1kfyOML5jTXb5JNc0ee5kWkvOSO8lqA=" ], "X-Amz-Request-Id": [ "FVF0X3YK5D9FJTJ7" ] }, "Body": "" } }, { "ID": "865bd4b39b090372", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key2", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:35 GMT" ], "Etag": [ "\"6541e7fd48680b9b60ec055ebfa31c02\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "C+NJOtBCuzRO+EWCrpAeLvho1soXjZdbNb312Q1uq1ukdGv/k+NmXLNB7768INVu58gpuMXVNGQ=" ], "X-Amz-Request-Id": [ "FVF24WF7CD89NH3Y" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "0e0470ac8b67bf02", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key2?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:35 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "BHdr4yCgpxfnBFMreZY5K8i0YnIv//2sBsHs3+Bto+v7O33lYfD7htpgSQLM3uj/30eoi0y7/tQ=" ], "X-Amz-Request-Id": [ "FVF7AEFHHRAKYV4Y" ] }, "Body": "" } }, { "ID": "1d3c2dfae5665bdc", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key1", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:35 GMT" ], "Etag": [ "\"aa8f39967deb441a6e7484963945a960\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "M09L6EY4juK3igBWQH+aMMSrbSbeUkNmax9rcdggIVR1sMWGTamjauowG1kArkvDhSnAa9On3VQ=" ], "X-Amz-Request-Id": [ "FVF8XQWRT6K2Y5YG" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "07f26e9c57ec9894", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key1?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:35 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "WNzXawh/rC70PxIAGCyWL8gmM9U/jM3SPcd4iwHrZfiCAuNptOu1f77u6IVOYBaxDDHc9jTs3jk=" ], "X-Amz-Request-Id": [ "FVFDJ7NGFE9VTWQT" ] }, "Body": "" } }, { "ID": "2b6e4b346bae4218", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key0", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "4096" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:35 GMT" ], "Etag": [ "\"620f0b67a91f7f74151bc5be745b7110\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "wxhicM9ypvHs+2FOVp9UN3AbeFoy70XUAOeamOp+94H1GiAcTVFpoZVpbG6592rVT1SRB70J+Qw=" ], "X-Amz-Request-Id": [ "FVFFK262GMWZ7R18" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "21d640bbae3b2caa", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key0?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:35 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "zmKwjSqKhk2jJ1XIuy7nzId17N1U4XkhFF3Yy7rtcJVLcz+fpSS5ZIz3GQheFPF8SFvMY1rxUug=" ], "X-Amz-Request-Id": [ "FVFC91HG9CXC0WW5" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestCopy/NonExistentSourceFails.replay ================================================ { "Initial": "AQAAAA7hTg0kG8A5AQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "bc115eb3c90bdc6c", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-copying-dest?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fdoes-not-exist" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:35 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "enkt2LtayBIv5f3j92Yq043VQR9OXwVhjoyQ1tO9KMGdLLRf4Hx/z6+cY6j5pjSRzi2i6mG96ps=" ], "X-Amz-Request-Id": [ "8V2MGFRWNXTTXXBD" ] }, "Body": "PEVycm9yPjxDb2RlPk5vU3VjaEtleTwvQ29kZT48TWVzc2FnZT5UaGUgc3BlY2lmaWVkIGtleSBkb2VzIG5vdCBleGlzdC48L01lc3NhZ2U+PEtleT5kb2VzLW5vdC1leGlzdDwvS2V5PjxSZXF1ZXN0SWQ+OFYyTUdGUldOWFRUWFhCRDwvUmVxdWVzdElkPjxIb3N0SWQ+ZW5rdDJMdGF5Qkl2NWYzajkyWXEwNDNWUVI5T1h3Vmhqb3lRMXRPOUtNR2RMTFJmNEh4L3o2K2NZNmo1cGpTUnppMmk2bUc5NnBzPTwvSG9zdElkPjwvRXJyb3I+" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestCopy/Works.replay ================================================ { "Initial": "AQAAAA7hTg0kIghqrgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "9dd3eeafd4691022", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-copying-src?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Cache-Control": [ "no-cache" ], "Content-Disposition": [ "inline" ], "Content-Encoding": [ "identity", "aws-chunked" ], "Content-Language": [ "en" ], "Content-Length": [ "52" ], "Content-Md5": [ "sQqNsWTgdUEFt6mb5y4/5Q==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "11" ], "X-Amz-Meta-Foo": [ "bar" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "Yg0KSGVsbG8gV29ybGQNCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOlNoZXhWZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:37 GMT" ], "Etag": [ "\"b10a8db164e0754105b7a99be72e3fe5\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "ShexVg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "EWVUX0ayuqGOmPiCaPuGcJf3vuFniizhTpijd5QAU3xL1SBhQ6hobwZDetZVeGNDsVVQnd3xrXy6p251LoFC9S5/2bt1SDvs" ], "X-Amz-Request-Id": [ "8V2VY0HFVX4XXJ9G" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "f7af0de903f7922b", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-copying-src", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "no-cache" ], "Content-Disposition": [ "inline" ], "Content-Encoding": [ "identity" ], "Content-Language": [ "en" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 19 Mar 2026 15:28:37 GMT" ], "Etag": [ "\"b10a8db164e0754105b7a99be72e3fe5\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:37 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "wovY9wIsqdgiRpaXtc9MJL36at3Oye+hFGpQ8rYOEnXvlczaK02Nw9Rm+JM/HUTE1E1FNNXrhGKKL66Of/tP0lWuLF8yVBQB" ], "X-Amz-Meta-Foo": [ "bar" ], "X-Amz-Request-Id": [ "8V2KB0K8EBQ8Z3AV" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "bc489101eac05e32", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-copying-dest-exists?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "51" ], "Content-Md5": [ "oPqafXJA1cXuvXCJlDDFlw==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "10" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "YQ0KY2xvYmJlciBtZQ0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6ZHZHeXlBPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:37 GMT" ], "Etag": [ "\"a0fa9a7d7240d5c5eebd70899430c597\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "dvGyyA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "eC5JqpOW2cSD6oobka+gQ8OAUHqLM+eyGeazh16ssG0UJGYF2fxEpd3zz2kqAIOvoNHpp6L6X+WjGF4D1AVAFvx9Cnocq+8A" ], "X-Amz-Request-Id": [ "8V2S9W59CCJXYVQH" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "ad8dcf4417585d55", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-copying-dest?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fblob-for-copying-src" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:37 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "61L/KfBUYjXCS+CH30KoUVlXnm9lAd8TCyx2wgt+eKgWUc28XkFfg8DjOduAaWeqO5bk9RnmEot8udhvbAH1roQwpuRTbKbr" ], "X-Amz-Request-Id": [ "8V2SPXMR17V2MQ9G" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjM3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iYjEwYThkYjE2NGUwNzU0MTA1YjdhOTliZTcyZTNmZTUiPC9FVGFnPjxDaGVja3N1bUNSQzMyPlNoZXhWZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "9f2628bf58a8ac7e", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-copying-dest?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "no-cache" ], "Content-Disposition": [ "inline" ], "Content-Encoding": [ "identity" ], "Content-Language": [ "en" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 19 Mar 2026 15:28:37 GMT" ], "Etag": [ "\"b10a8db164e0754105b7a99be72e3fe5\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:37 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "ShexVg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "/4pIPHLjYibqh4vnXsP1saD/9ro7DjgoRVpFwtdZfKzGq4lNglE8vy5zpsajM43TMDUs7Til+0TryfqT6h9nQV/X6GEYu3ly" ], "X-Amz-Meta-Foo": [ "bar" ], "X-Amz-Request-Id": [ "8V2Z52MR1Y9G2CA6" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "SGVsbG8gV29ybGQ=" } }, { "ID": "6b3630f3273dd14a", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-copying-dest", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "no-cache" ], "Content-Disposition": [ "inline" ], "Content-Encoding": [ "identity" ], "Content-Language": [ "en" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 19 Mar 2026 15:28:37 GMT" ], "Etag": [ "\"b10a8db164e0754105b7a99be72e3fe5\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:37 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "fLiufBg43jNSZnas8e2NAdsth8OceYih7hqEUQTeKB4j6sN8SvCszB7eb2sM3KrCmoaValJot75vNHJlQHzBDxGzOPPzXPSc" ], "X-Amz-Meta-Foo": [ "bar" ], "X-Amz-Request-Id": [ "8V2G7FTRKSF1XAP6" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "22b3be811df5b501", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-copying-dest-exists?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fblob-for-copying-src" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:37 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "BGxxvq7+bzTbhW9uIS2CBEVQNSC0Jfrbo/L9vZrhxHd1msnGSUXKQAnA+mkB8pTR8oTZIiHcl9hs9ClxUNrAC2zRBgxdwhkg" ], "X-Amz-Request-Id": [ "8V2VFAA3FCKZX4J2" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjM3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iYjEwYThkYjE2NGUwNzU0MTA1YjdhOTliZTcyZTNmZTUiPC9FVGFnPjxDaGVja3N1bUNSQzMyPlNoZXhWZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "8a8a2652efb7dde1", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-copying-dest-exists?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "no-cache" ], "Content-Disposition": [ "inline" ], "Content-Encoding": [ "identity" ], "Content-Language": [ "en" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 19 Mar 2026 15:28:37 GMT" ], "Etag": [ "\"b10a8db164e0754105b7a99be72e3fe5\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:37 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "ShexVg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "MsWdX9BgzrP98UUbv7z6IaW6WFTu92sDSNgp5qP+2Cc90jw1sKbiZWRk4AAcKG0M7XEpPsQ+1CZizdZ6CZMzrOuF4mAwXDsA" ], "X-Amz-Meta-Foo": [ "bar" ], "X-Amz-Request-Id": [ "G3VZNQ40QM2DKJ9D" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "SGVsbG8gV29ybGQ=" } }, { "ID": "842d0a3893194e08", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-copying-dest-exists", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Cache-Control": [ "no-cache" ], "Content-Disposition": [ "inline" ], "Content-Encoding": [ "identity" ], "Content-Language": [ "en" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 19 Mar 2026 15:28:38 GMT" ], "Etag": [ "\"b10a8db164e0754105b7a99be72e3fe5\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:37 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "mcmm+Leef9rQL5kPp6CPy0yow5z/dN6KRK/mnHBwoQnHRVtDp496e4GE/jWrM1VZqTr7ySDzS/jjlQcMj38Sm8MiPzWIns+Q" ], "X-Amz-Meta-Foo": [ "bar" ], "X-Amz-Request-Id": [ "G3VQTBKWEGT962KV" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestDelete/NonExistentFails.replay ================================================ { "Initial": "AQAAAA7hTg0lA5k/BAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "87a72277ae2ec7be", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/does-not-exist", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:36 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "dHnEzapT4AQnYRm8aRf726dnaiJxV4/Qjq2IU8u8AXVI7jaDSbxfwHbGnAOwJF4FXOV7nd/zHOA=" ], "X-Amz-Request-Id": [ "G3VN2WCS434345A9" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestDelete/Works.replay ================================================ { "Initial": "AQAAAA7hTg0lD4XJcgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "2f5fb7a80c1f2b3b", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-deleting?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "52" ], "Content-Md5": [ "PiWWCnnbxptnTNTsZ6csYg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "11" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "Yg0KSGVsbG8gd29ybGQNCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOmk5YWVVZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:38 GMT" ], "Etag": [ "\"3e25960a79dbc69b674cd4ec67a72c62\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "i9aeUg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "8REgOjydqSCGyx5qpG+Xl47su34MZaFdbr4BLl99kKHOeC01VG9mfTAtV+aFIiUc3NMScq2NEPI=" ], "X-Amz-Request-Id": [ "G3VVT0TY2CT3JSTA" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "9340869d16bc22c3", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-deleting", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:38 GMT" ], "Etag": [ "\"3e25960a79dbc69b674cd4ec67a72c62\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:38 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "8oeue6GP3JF8/mXIU9ZjNT7EorNMuyKeee8guVcQ4CihN4WFtXYsUHoxFpi95xlFSLWXIfW5ZVE=" ], "X-Amz-Request-Id": [ "G3VY60F29N5AWG3Y" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "ae90f60e8686340a", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-deleting?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:38 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "1eJxU4RKsRD4fA9vNf5o+4FKF/8MclqkkMaJye3OsxBokdIPL8GlLFiw1r9Xrkhwc+qgo8SV7t8=" ], "X-Amz-Request-Id": [ "G3VRYWT7SN9N8FVJ" ] }, "Body": "" } }, { "ID": "c64ac4867f5bbd60", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-deleting?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:36 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "wC3gs7LZmsbUNnNfQS0+LV1hzw66QpGtYkC1qiNNEGaPd0CRvtk/dp+hOfd7aDzy3ffvBMn9Im4=" ], "X-Amz-Request-Id": [ "G3VSCAVK1SHX5RQM" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPk5vU3VjaEtleTwvQ29kZT48TWVzc2FnZT5UaGUgc3BlY2lmaWVkIGtleSBkb2VzIG5vdCBleGlzdC48L01lc3NhZ2U+PEtleT5ibG9iLWZvci1kZWxldGluZzwvS2V5PjxSZXF1ZXN0SWQ+RzNWU0NBVksxU0hYNVJRTTwvUmVxdWVzdElkPjxIb3N0SWQ+d0MzZ3M3TFptc2JVTm5OZlFTMCtMVjFoenc2NlFwR3RZa0MxcWlOTkVHYVBkMENSdnRrL2RwK2hPZmQ3YUR6eTNmZnZCTW45SW00PTwvSG9zdElkPjwvRXJyb3I+" } }, { "ID": "20045fe7d1fba10b", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-deleting", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:36 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "gaEtBx7mNfhcmB8wPzbKEqyFSEnP40/UlyBgi+N7csc6gLJni7Rbh97aHjwZLUxKlk7tQXDM4bk=" ], "X-Amz-Request-Id": [ "G3VR82B0BNR15N28" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestDirsWithCharactersBeforeDelimiter.replay ================================================ { "Initial": "AQAAAA7hTg0ZGy8lBgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "aa53ab8ec6b02e44", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?max-keys=1000\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:26 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "/p9zzhbUvgXVB4/q79tSOxLJOE3zswnrQ/DkzEhgp9uZmmQkrtlu7UspguEnoGSli6kNtQOfenI=" ], "X-Amz-Request-Id": [ "A7KGXA75VYMY6WVJ" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PE1hcmtlcj48L01hcmtlcj48TWF4S2V5cz4xMDAwPC9NYXhLZXlzPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoyMC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMS90ZXN0RmlsZTFkaXIxPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjIwLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIyL3Rlc3RGaWxlMWRpcjI8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MjAuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QtL3QuPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjIwLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90L3QvdDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoyMC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdGVzdEZpbGUxPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjIwLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "e0719e1edd70dee1", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026max-keys=10\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:26 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "MBYNo5fUAGesSH5gRQl85LYCdGWODEC8dYQHWy+MMDcGojpIWFPrzP4cuCC4JmC1z1yNEXasCR4=" ], "X-Amz-Request-Id": [ "A7KQT6DX70RAD80M" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PE1hcmtlcj48L01hcmtlcj48TWF4S2V5cz4xMDwvTWF4S2V5cz48RGVsaW1pdGVyPi88L0RlbGltaXRlcj48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL2Q8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MjAuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3Rlc3RGaWxlMTwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoyMC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMS88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL2RpcjIvPC9QcmVmaXg+PC9Db21tb25QcmVmaXhlcz48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90LS88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QvPC9QcmVmaXg+PC9Db21tb25QcmVmaXhlcz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "567dafc89ac52b83", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026max-keys=9\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:26 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "aOE7G4X6MKjuY+/NiGCX3RJEfJ/PhBDkkqSXPLW4WT0SMv6jGtAQLcmJ3H1zRaIp5zzgwWJbsGg=" ], "X-Amz-Request-Id": [ "A7KNEE216FCJ0SK4" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PE1hcmtlcj48L01hcmtlcj48TWF4S2V5cz45PC9NYXhLZXlzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoyMC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdGVzdEZpbGUxPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjIwLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIxLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMi88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QtLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdC88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "6c489038e1108ada", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026max-keys=8\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:26 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "jqaOWUgo7k3QWEsWqPHtmaMN4X0oajVzFEU1q0Ayo76ovn+uNVmj6tSIchG/Oj6CcVjMXRXfFrg=" ], "X-Amz-Request-Id": [ "A7KPQJRYRRKJMCXZ" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PE1hcmtlcj48L01hcmtlcj48TWF4S2V5cz44PC9NYXhLZXlzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoyMC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdGVzdEZpbGUxPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjIwLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIxLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMi88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QtLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdC88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "640e311ae9dad041", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026max-keys=7\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:26 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "T64jUoCrZ1h0GXQDidCeHCz9ER6t9MCu/JzaOQPA4BQmao/oibBGh+/u6o+oKqmxd48a2xVWgtY=" ], "X-Amz-Request-Id": [ "A7KWDCW7MD5R9Y6Y" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PE1hcmtlcj48L01hcmtlcj48TWF4S2V5cz43PC9NYXhLZXlzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoyMC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdGVzdEZpbGUxPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjIwLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIxLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMi88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QtLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdC88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "47cb82ad02f49f13", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026max-keys=6\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:26 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "gxTFou1nw+D6utVTjxkJjiF9ZLtd2YmmLcMQhLsLB3qhTUXz80+qE04CD6aNAQvXuZhLOnvahqA=" ], "X-Amz-Request-Id": [ "A7KTZ3JJT17M3KSZ" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PE1hcmtlcj48L01hcmtlcj48TWF4S2V5cz42PC9NYXhLZXlzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoyMC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdGVzdEZpbGUxPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjIwLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIxLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMi88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QtLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdC88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "c72f88346dd5f8ec", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026max-keys=5\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:26 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "2GorQSJCvJ4jOBnC9yh8OmYxmlU7XY+vz0KcVbPnSEh96gG9P47dZyqUwVTu92Huj0S99ioq108=" ], "X-Amz-Request-Id": [ "A7KZMTMDE67TQWKZ" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PE1hcmtlcj48L01hcmtlcj48TmV4dE1hcmtlcj5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90LzwvTmV4dE1hcmtlcj48TWF4S2V5cz41PC9NYXhLZXlzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD50cnVlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjIwLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIxLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMi88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QtLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdC88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "ec859c3cfa77c24c", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026marker=blob-for-dirs-with-chars-before-delimiter%2Ft%2F\u0026max-keys=5\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:26 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "N5AOaz+uBTaTOl3Lx04bSBlHOa7chVnqUTJkdns7ifd4JUbSuLUkSqNJ+cSQ1Si7WOa8KbBsYw0=" ], "X-Amz-Request-Id": [ "A7KZJBKDB3F0Q3M6" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PE1hcmtlcj5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90LzwvTWFya2VyPjxNYXhLZXlzPjU8L01heEtleXM+PERlbGltaXRlcj4vPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90ZXN0RmlsZTE8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MjAuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "6305518a756b7fd1", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026max-keys=4\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:26 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "Wu8yOMX1x0Nc+wkFnvehaWc/1gGE6FY7UY04JYUG2VYOgB2yodSyWzdbNz6vrvgMUnaU/nOHa7M=" ], "X-Amz-Request-Id": [ "A7KS8P81JR9YQZ1A" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PE1hcmtlcj48L01hcmtlcj48TmV4dE1hcmtlcj5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90LS88L05leHRNYXJrZXI+PE1heEtleXM+NDwvTWF4S2V5cz48RGVsaW1pdGVyPi88L0RlbGltaXRlcj48SXNUcnVuY2F0ZWQ+dHJ1ZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoyMC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMS88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL2RpcjIvPC9QcmVmaXg+PC9Db21tb25QcmVmaXhlcz48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90LS88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "2c9b94b94bd7e987", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026marker=blob-for-dirs-with-chars-before-delimiter%2Ft-%2F\u0026max-keys=4\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:26 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "Tf8BCKCuFgVNAjV7iK7BohHLVVpMnswee3iPd+RNcEKrxOMn7zG9aqHnmWUonVkY3st+M8hy+rU=" ], "X-Amz-Request-Id": [ "A7KRJRNG55Y72KP0" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PE1hcmtlcj5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90LS88L01hcmtlcj48TWF4S2V5cz40PC9NYXhLZXlzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdGVzdEZpbGUxPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjIwLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90LzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "5fa679ceaf5a231a", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026max-keys=3\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:26 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "V/0bg5yrsCCeJXq+JvfDPsM/sPe8dToqa8EWc14yVJUe0tebgmxi20gXUu3g2jqMU0RXSZDG0Zc=" ], "X-Amz-Request-Id": [ "A7KX1MRPTH3Y7Z8G" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PE1hcmtlcj48L01hcmtlcj48TmV4dE1hcmtlcj5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIyLzwvTmV4dE1hcmtlcj48TWF4S2V5cz4zPC9NYXhLZXlzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD50cnVlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjIwLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIxLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMi88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "05046632375ff074", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026marker=blob-for-dirs-with-chars-before-delimiter%2Fdir2%2F\u0026max-keys=3\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:26 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "eYWz98cuXn/037kf5fVXNIMlIsgQ0rafBhbv4eVZE+k4s7JG5aD4uu9uqbGNi2TWpgc33VuWMOo=" ], "X-Amz-Request-Id": [ "A7KYQX5G1XBY8K9B" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PE1hcmtlcj5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIyLzwvTWFya2VyPjxNYXhLZXlzPjM8L01heEtleXM+PERlbGltaXRlcj4vPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90ZXN0RmlsZTE8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MjAuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QtLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdC88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "1dfe5f180c78939d", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026max-keys=2\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:27 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "ZvKp4HCe5uTuGaock3r4+AyLQYDmD3Jx2aktfyphTwqmNWiF7s13N+9VXCyAAmeDkWCpx3Nkgcc=" ], "X-Amz-Request-Id": [ "Y9PWSNQ0C86HNE6X" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PE1hcmtlcj48L01hcmtlcj48TmV4dE1hcmtlcj5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIxLzwvTmV4dE1hcmtlcj48TWF4S2V5cz4yPC9NYXhLZXlzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD50cnVlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjIwLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIxLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "c5e40469018878fb", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026marker=blob-for-dirs-with-chars-before-delimiter%2Fdir1%2F\u0026max-keys=2\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:27 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "cdttayTx/cCr2UpSgbPB3aVKwQdB7pKwct39RkoqwhdMw6EnZH0zOmQ6T+QyDiwHqXf4Qi5Szbw=" ], "X-Amz-Request-Id": [ "Y9PG2FRPTFWSX8JM" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PE1hcmtlcj5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIxLzwvTWFya2VyPjxOZXh0TWFya2VyPmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QtLzwvTmV4dE1hcmtlcj48TWF4S2V5cz4yPC9NYXhLZXlzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD50cnVlPC9Jc1RydW5jYXRlZD48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIyLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdC0vPC9QcmVmaXg+PC9Db21tb25QcmVmaXhlcz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "f3e3bcde56303da3", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026marker=blob-for-dirs-with-chars-before-delimiter%2Ft-%2F\u0026max-keys=2\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:27 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "KKBR0vx2FOYakSMBl9YSfymqGpnFPGPo3fw80tzLKM4TPVZOK7zVWaD+oHHesO2QeiV21ip95/E=" ], "X-Amz-Request-Id": [ "Y9PJWJEP4THFA4JX" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PE1hcmtlcj5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90LS88L01hcmtlcj48TWF4S2V5cz4yPC9NYXhLZXlzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvdGVzdEZpbGUxPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjIwLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90LzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "0621349cd2699319", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026max-keys=1\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:27 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "xDsiuocKfdbfcZhAhqpj6MnuqMaEleQO6ng4lc7tkPUNpWCUpbGam08McEfjxM9eAqBZmR8dI40=" ], "X-Amz-Request-Id": [ "Y9PQQY7SWSHX2D25" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PE1hcmtlcj48L01hcmtlcj48TmV4dE1hcmtlcj5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kPC9OZXh0TWFya2VyPjxNYXhLZXlzPjE8L01heEtleXM+PERlbGltaXRlcj4vPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPnRydWU8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL2Q8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MjAuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "f3055d7616ca1022", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026marker=blob-for-dirs-with-chars-before-delimiter%2Fd\u0026max-keys=1\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:27 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "viz/yeM4zyZ8BuZ37DGqonPFDywb3aZk27GyovJrcyLEC+CZHH571oP675B1hoWWDbWPJiPEqEg=" ], "X-Amz-Request-Id": [ "Y9PKRDFVVCN4QKJM" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PE1hcmtlcj5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kPC9NYXJrZXI+PE5leHRNYXJrZXI+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMS88L05leHRNYXJrZXI+PE1heEtleXM+MTwvTWF4S2V5cz48RGVsaW1pdGVyPi88L0RlbGltaXRlcj48SXNUcnVuY2F0ZWQ+dHJ1ZTwvSXNUcnVuY2F0ZWQ+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvZGlyMS88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "65d6253dbf96f723", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026marker=blob-for-dirs-with-chars-before-delimiter%2Fdir1%2F\u0026max-keys=1\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:27 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "cGNE0TpERxZMdKvnFUPE8TnYQSvwyQsbbvvFFhphSJmTJhX9IGqCPsfD0c/DN/bBFRa5z2S1Y5A=" ], "X-Amz-Request-Id": [ "Y9PG5351HGVDF6TD" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PE1hcmtlcj5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIxLzwvTWFya2VyPjxOZXh0TWFya2VyPmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL2RpcjIvPC9OZXh0TWFya2VyPjxNYXhLZXlzPjE8L01heEtleXM+PERlbGltaXRlcj4vPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPnRydWU8L0lzVHJ1bmNhdGVkPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL2RpcjIvPC9QcmVmaXg+PC9Db21tb25QcmVmaXhlcz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "a516f2dd303fe19a", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026marker=blob-for-dirs-with-chars-before-delimiter%2Fdir2%2F\u0026max-keys=1\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:27 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "D5pZmvaYwDBWlOnWBs60r/tfNllYH6TjBoKdnmu5d8rBzYIy6HtC483VkcyPV2vSdvxZ0+juLFg=" ], "X-Amz-Request-Id": [ "Y9PKS7B41QCQ2C33" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PE1hcmtlcj5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci9kaXIyLzwvTWFya2VyPjxOZXh0TWFya2VyPmJsb2ItZm9yLWRpcnMtd2l0aC1jaGFycy1iZWZvcmUtZGVsaW1pdGVyL3QtLzwvTmV4dE1hcmtlcj48TWF4S2V5cz4xPC9NYXhLZXlzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD50cnVlPC9Jc1RydW5jYXRlZD48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90LS88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "5f3b7bb6b796120a", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026marker=blob-for-dirs-with-chars-before-delimiter%2Ft-%2F\u0026max-keys=1\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:27 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "j0v3oTyr8q6DAyk8We9yPxOnUZlgQa2EXTzySdwrGRRm7c6N/S+VxmAW0Fer4h9fNsOVo7ur61I=" ], "X-Amz-Request-Id": [ "Y9PQ50JW90EV0ZVX" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PE1hcmtlcj5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90LS88L01hcmtlcj48TmV4dE1hcmtlcj5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90LzwvTmV4dE1hcmtlcj48TWF4S2V5cz4xPC9NYXhLZXlzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD50cnVlPC9Jc1RydW5jYXRlZD48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90LzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "cd489e018c52ae88", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026marker=blob-for-dirs-with-chars-before-delimiter%2Ft%2F\u0026max-keys=1\u0026prefix=blob-for-dirs-with-chars-before-delimiter%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:27 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "9ga9bFxhRA8jpKQd/GS45MWkRUNM3knsZzavP4lJoI1OziazjGm80n66HcCYy/o5+4rRq+d8Tq8=" ], "X-Amz-Request-Id": [ "Y9PMB9KDHY3ZP6VM" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGlycy13aXRoLWNoYXJzLWJlZm9yZS1kZWxpbWl0ZXIvPC9QcmVmaXg+PE1hcmtlcj5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90LzwvTWFya2VyPjxNYXhLZXlzPjE8L01heEtleXM+PERlbGltaXRlcj4vPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kaXJzLXdpdGgtY2hhcnMtYmVmb3JlLWRlbGltaXRlci90ZXN0RmlsZTE8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MjAuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestIfNotExist.replay ================================================ { "Initial": "AQAAAA7hTg0uORnuQAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "54d654acfce8bd6e", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-if-not-exist?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "52" ], "If-None-Match": [ "*" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "11" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text", "BodyParts": [ "Yg0KdXAgYW5kIGRvd24NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk9KM3lsQT09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:48 GMT" ], "Etag": [ "\"1b75533ed5a869ff6f3ae0336d0c3320\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "OJ3ylA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "yukWpgvoDG4/A9KI3XgCENntg7uhQd3bIYniMiHsLMGetWtFNkQbPaOu52M5HHg/q/+16cvUnPg=" ], "X-Amz-Request-Id": [ "DRCR99CMGJ44SVD1" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "795b7e0789d1746b", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-if-not-exist?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "52" ], "If-None-Match": [ "*" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "11" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text", "BodyParts": [ "Yg0KdXAgYW5kIGRvd24NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk9KM3lsQT09DQoNCg==" ] }, "Response": { "StatusCode": 412, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "e9tYlKmMkExsqUMUojvGI3AQL14We4m0qmq9k7Y/dNH9M+h+XRwVXfj1DxSpFjkVslK2/X+rIF4=" ], "X-Amz-Request-Id": [ "DRCS927ZCZ4Y5RS4" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPlByZWNvbmRpdGlvbkZhaWxlZDwvQ29kZT48TWVzc2FnZT5BdCBsZWFzdCBvbmUgb2YgdGhlIHByZS1jb25kaXRpb25zIHlvdSBzcGVjaWZpZWQgZGlkIG5vdCBob2xkPC9NZXNzYWdlPjxDb25kaXRpb24+SWYtTm9uZS1NYXRjaDwvQ29uZGl0aW9uPjxSZXF1ZXN0SWQ+RFJDUzkyN1pDWjRZNVJTNDwvUmVxdWVzdElkPjxIb3N0SWQ+ZTl0WWxLbU1rRXhzcVVNVW9qdkdJM0FRTDE0V2U0bTBxbXE5azdZL2ROSDlNK2grWFJ3VlhmajFEeFNwRmprVnNsSzIvWCtySUY0PTwvSG9zdElkPjwvRXJyb3I+" } }, { "ID": "72405421fc3968fc", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-if-not-exist", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "11" ], "Content-Type": [ "text" ], "Date": [ "Thu, 19 Mar 2026 15:28:48 GMT" ], "Etag": [ "\"1b75533ed5a869ff6f3ae0336d0c3320\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:48 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "uOKjBOXsNmzzZcD+/2BYplRRZ+weLKHkYBbJ4VvAn3yTQdT569F7yWci5hJOvPnSgQo3tMu+xSc=" ], "X-Amz-Request-Id": [ "DRCGKTBW3ZKG8KWX" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "bc27dc5dae93a9b2", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-if-not-exist?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:48 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "tbR2M+l/cMmB/FrroNIr0xDZyDUVL93BO6XqjQ4P2zi6eSsOKUEXf6eLjf6Aep5DQBVJ7zPYD4k=" ], "X-Amz-Request-Id": [ "DRCQK7JCEA57GEYT" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestKeys/ascii-1.replay ================================================ { "Initial": "AQAAAA7hTg0tAyEwZQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "d262d5b2e12b79cd", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "SSVLh0OHC/JElNdD6/6WBRwES9rO+VeEtD9jDrB12HwIr1qaDNtF0wgkYicYQ2fNyxQXauMyMfo=" ], "X-Amz-Request-Id": [ "PQM8AZ386NTGPARF" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "c90235352ef39936", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "PHwTmBf6RMYMPJshJExqY1PYJx5eCf9T+8uCf3PaDJsRtzrcLD9+MOYeljv0+xMtNXWJ87+fsoI=" ], "X-Amz-Request-Id": [ "PQM645SD8T5RCWQ6" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "227e69f6958d63ec", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "74pDgqHMRm4+2ndusrX0oxo9m6tq+PyhiyvifHl255cfJy7Q/tdEbXPJI/3+bb+JriFcoAYvujI=" ], "X-Amz-Request-Id": [ "PQM2NDFMBART3VKX" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "e6441aad209dd9a0", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "yhpvw1DwyDhjnzE24Q0Tk3PyJ1VwfyPQWBAAn25hesXb/stfy6bM2PGIgTfN14I8SqDRm6TVUXw=" ], "X-Amz-Request-Id": [ "PQM4A4P4D9WEFF1F" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "8b24379ebb9bfa4f", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keys__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "02wVEoXJBXth5YF/fndUVRWky4Hmeocp0QKKVHqcq7zVf5SM3EbTo8W1q8UV7FA78ifJane1KqE=" ], "X-Amz-Request-Id": [ "PQM4ZAWP7276SCS0" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjQ2LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "c43516b0fe9ae9b3", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "TlOE6mav3A9PoAKk04BAhvtFXG44N8f5a68kvlBAEb61JWWkD+w4oVwfnJxNoD41EfL03tV12GQ=" ], "X-Amz-Request-Id": [ "PQM33ZPWCE0TJXX6" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "3cb40305e8225adc", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "/ZJGDZjGpHx8jfjXl1IJq/FBH2BF9g51VT/iIIf67uDWVcJdTATTOwxfH0X/hlESfR3GeiMuhhI=" ], "X-Amz-Request-Id": [ "PQMEG6A6YHCR67GY" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "8035ab707726d9e9", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "WlDvGI5XTXNHRgV8OStK2t9qyGhOUIRksMw5swJ2+V6yfYCoMOqpw47PWKnqY4mbBmjMFRynqQw=" ], "X-Amz-Request-Id": [ "PQM9FRQ2VYCF0MZV" ] }, "Body": "" } }, { "ID": "596cb6dc68b0a586", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "DupKfkSYwYDfgC3j18dmsxAU4BuCY4HQTYYmhO9BzJ79iWlKp7xSsHxo865TtukTfRydbuUDa6M=" ], "X-Amz-Request-Id": [ "PQM4BKYRPZVXQ5GR" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "e6691e570613fe6f", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x0____0x1____0x2____0x3____0x4____0x5____0x6____0x7____0x8____0x9____0xa____0xb____0xc____0xd____0xe____0xf__?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "9ynwYx334rbuaaDwnJoxQ4UcPELCDovusOveOlIsunktTGNnthR6NShSKyinHg555ABxY7f/DXs=" ], "X-Amz-Request-Id": [ "PQMF0CF3JWGAJHG3" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestKeys/ascii-2.replay ================================================ { "Initial": "AQAAAA7hTg0oOtPiywAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "c0d6e91eaafb3894", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:42 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "qXph+YNSqFwpAfSY0MXlzdL0uL1GWciLT+Uvx5WP1nWSSAsOHV0ooe+RjN9GGoEhjR3N0k2z2Is=" ], "X-Amz-Request-Id": [ "SAEC2WWE6N83X8N6" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "9023b9850e203091", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:42 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:42 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "xyn8mAGK4yTRxuHRnECRONBSn195LY6lErNiZvUHFl22a0IWTuC55smJYWNAVhYvahYcLL++P9I=" ], "X-Amz-Request-Id": [ "SAE2YHZ8WC9KCZ0C" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "f9f7bc2d59a6f8b8", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:42 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:42 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "0XwcVHXSleiIoKkH9ElkQjRGFDWWlRwlnwxsBp/sVk7ymeCBuuCM2hRdnKZPpBrqvTTtvksRzyk=" ], "X-Amz-Request-Id": [ "SAEF4K8TM6Y8F899" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "930d0c46987a8830", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:42 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:42 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "wz6wELmxmCvHcN0h1l6JDUCT57G1MO0moUZbHzPa5S4XSXxOzaEuEtZ9a5jAxVo0Ag5fu4Kkn7I=" ], "X-Amz-Request-Id": [ "SAEFVYK2ESGPST44" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "cf5bd6a076ac711a", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keys__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:42 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "RNwItvecDEEhMFNbD6CV7KHmIeq56HJlAlnFO2U4VQjh6B6Oz+daVvUvzGUK0f5+vpO5rSSDkqw=" ], "X-Amz-Request-Id": [ "SAE1PR3P6ZDY8J7M" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjQyLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "cb438cb3eca1da65", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:42 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:42 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "7AQheRO42k2TRvGl1nNDFrWa+JQ4897Cwm5GjqWQ2/XWJoiD8fdE/SsUuyH+UEMH2F3Qgh1MgTo=" ], "X-Amz-Request-Id": [ "SAE5Z0THFYBAYATG" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "05439020943136ca", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:42 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:42 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "3T5CHidKb/iQhCbGW8TupyWhvjAGKaQTDLAcNpG89E6jFSbEPPjMS6B7xu/TFsxtOVRlUzZgIcQ=" ], "X-Amz-Request-Id": [ "SAE49CK092BERAAZ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "36dbefb1dc3c541d", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:42 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "xLtktUIrsnDpUh5iy8pMqgiNF/5yU1DDWCt2EVU+EiNVX6VmEfnOIQzQjsVoDCmD3xgWPPdUF3s=" ], "X-Amz-Request-Id": [ "SAEE1E8CBVNFJ2X3" ] }, "Body": "" } }, { "ID": "b783d2295d560a34", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:42 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:42 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "5cWRPz+LqxNnZTwlPosQQqYNUQc+9nVHWuYvhOo8e7xDY4uwnhAAs16+9p+jcCfqf3UtyYb/hlY=" ], "X-Amz-Request-Id": [ "SAEE9SX96S6RCV25" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "e83cf95bbea2dae3", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys__0x10____0x11____0x12____0x13____0x14____0x15____0x16____0x17____0x18____0x19____0x1a____0x1b____0x1c____0x1d____0x1e____0x1f__?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:42 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "XQmJznpW2BbiqrboOglOrWB27f5OU+PxW5+fh9D9FBXpt9hB9ctY/4eGTKRqcCbble4e13b4ZFQ=" ], "X-Amz-Request-Id": [ "SAEFRZB690AG8JPV" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestKeys/ascii-3.replay ================================================ { "Initial": "AQAAAA7hTg0rB+OhkQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "5cd0f4a06c9e3cca", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-./?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "Y/ZMyTKZfb0jep5iU3TdzzjxQmf2yVkUVlCWWvVhsZeokchmlXoeeXmh3LYEeGJHzBt0N6nR/D6+Lf3+db0a+LmXrqnJ677R" ], "X-Amz-Request-Id": [ "4RTGV0RWWR72ABV7" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "9c5d12a8247efd7a", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-./?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "7vaUQqOfM5qBbQTVdTdeHDRWqIYbbkVWPeJfZ6Z6KzfsecA2Shk1PJqoJ0ewYw2eVgOcAk4zJfrs/1/kIXbnT9xgwIebp3tS" ], "X-Amz-Request-Id": [ "4RTXYV5X9M1FQF0V" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "edfafc04ad8b3e4d", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-./", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "l5MZH7fE55vD3FEQrRtIDY3ZDJd+Bgw/PixL2gt8qyNRlHEvEROtYVm/n4vjTK8OzzLuRu93Yi2L6SCS4qGVtIjYCUnzTSJl" ], "X-Amz-Request-Id": [ "4RTPV5VZH08V3G1X" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "3f6fd469d1ca566d", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-./?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "gjzyFcFt9nRd97k6G8isvrqK4tOjGDYMRzCcjHALPEXQMS60rRRX3hbfqYoWgPY/mSR59EiE18D2HgAjPW+rB/E9Sk2/9+V5" ], "X-Amz-Request-Id": [ "4RTVF0YPAD9V67BS" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "ff5354d6828c7cbe", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-./-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keys+%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "IihRWctDbsTZ+YHMiLHIzEjQVlByjyqi3oba0vG20dpP66KykvPMIUN1kzb64eyGCZvO8zGdZGAE4oyiBToDNb4sEQM9OrzD" ], "X-Amz-Request-Id": [ "4RTZTHE7B73MVK5V" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjQ0LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "e90c332be7bbbd54", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-./-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "1tBL8EnFbj86+NP8vIzGGBEbCg2toq5XT1mJJhINw4dDNgr4Ni16Fas9ZfA+mqKvlB5Ju+C4CPInG3p/aKemhSCUZDuE6DcK" ], "X-Amz-Request-Id": [ "4RTM3JJNR17MQ8NA" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "ff262564715ab018", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-./-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "A4edYQU6o15VQxNm0zNxTwrLTyh4kxhRKoCvuP1D13sBVfqcDyit+g5yl6KS1KMiviBYWZZvLVxuJad/odFFB3r4ZZbdQTAt" ], "X-Amz-Request-Id": [ "4RTSTQ1V3RX64ZWD" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "b6778161f50208b4", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-./-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "t66IpQtrcbRG7wc+7yn81/+ASPLQiwUGO5wejYGKSbwf4TAVUb8Rkg9nZc0leCWr/OCOhfY3LbDRpFDDQ2+dSDw1xdbDFh1h" ], "X-Amz-Request-Id": [ "4RTW37SB7EN7V2CB" ] }, "Body": "" } }, { "ID": "1c28a4695935afe7", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-./", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "ZRzEJc+qnuSpomzEDNXDwmEpHW28fCMI6IKTQhdNRCln3xSzm/fwWOzRu/qpvhF7HoLwr9NBAZBctS0jMrRr/H2/gNAGXCdH" ], "X-Amz-Request-Id": [ "4RTGY79WWRFGA4KZ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "d0fa7c2c0c2d6ccd", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-./?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "mrrpvbILrCNamxeJfKPpDMIvpG3wbYOJT5tjPX3jLyAr8UoQX8U+zzvUZNHM+iAGXQPKI3K9gJ66lnMuz3UY2QQvpO9mRzDx" ], "X-Amz-Request-Id": [ "4RTG188CERM4HZBJ" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestKeys/ascii-4.replay ================================================ { "Initial": "AQAAAA7hTg0rIygXvwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "626ee7cef82202ca", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%3A%3B%3C%3D%3E%3F?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "Z72kbLKe5nJa5/zK20WaECII9VNsY9Fdq/qcrC4QhlJvbWgTmbC8L82AMF+dZeatFGJzUWCCqrOK6UP/M9VMWQXu0MNMxGwx" ], "X-Amz-Request-Id": [ "4RTT23177DQT9QRE" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "d006ddd42e87d21c", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%3A%3B%3C%3D%3E%3F?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "K9VINYRbqP9olXJvCOoDdrLYRtNuv+GhJIBDLWwand+lfdDxeW2tGyelYlOfbHzOoV2b8WG2ba0TN/mN47/sCO1xde+Unwrb" ], "X-Amz-Request-Id": [ "4RTHS8Q2PES6V10K" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "4dcce36683f852c1", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%3A%3B%3C%3D%3E%3F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "FPCZlL86khbrDmQ8cqsTX3OyjR1zklpacFEjckF/LFOvm9Of+VNHnSmHNjMigOzEKDF3gF1towL2uHzsn1iL7JkasgMEGlxw" ], "X-Amz-Request-Id": [ "4RTJ6MQ17S2KBQ1G" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "4c1772c87cb58a3d", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%3A%3B%3C%3D%3E%3F?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "8uHZpG9kXXgh18VTx2vG7hLjiOYve5LgrKyOElgEsLRl+OAHwn4GXXF8WuSvcWdVIv0EFYXzjCw0m0VxemSTgKZphIUm+OBn" ], "X-Amz-Request-Id": [ "4RTTH69QP01ZZFYV" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "6fa9c297199ebd8a", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%3A%3B%3C%3D%3E%3F-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keys%3A%3B%3C%3D%3E%3F" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "NTR6jDH79k/UsC3bOY9gOCy5TxrKvyzgBnlqCjHoX1akjSu0HzqDXee98Ueva6AwRCv+vzAt6mrjCiHmc29YpNwv7P8F0kJM" ], "X-Amz-Request-Id": [ "4RTTM7XBSR4B6ERN" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjQ0LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "5daebb98ae170ffb", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%3A%3B%3C%3D%3E%3F-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "iywOAhkfGNDbvpGFv1NQy1jekH0jAk+KcUsg9QCq7zZJbNsjZVKvwl+9CYQQWfRHWh0PBEJbE76zwIDj6d8ELfGtzetDGCJq" ], "X-Amz-Request-Id": [ "4RTSFDCS0Y9HD0Y6" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "a07bd93b1b399964", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%3A%3B%3C%3D%3E%3F-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "D8TZmlm2Rq7bPDub9zyqmIYcjxdLE5cyxGqt1LOsPI5l9F9/c2SwcXjjE68qbcZMkO0c+ergaRCxQAfgFhOfsIr07WP2roBa" ], "X-Amz-Request-Id": [ "4RTNB1F506CD42VP" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "b64e83c2d94624db", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%3A%3B%3C%3D%3E%3F-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "+BERCRxSZ+tSVrPoxtiiehIckDsCF6+UMw/zdSYJahZAfG99M7RvP5eYORWcPTOK0R1T1qwj0MMt8ZbkAZrImHE3wvp6l/wp" ], "X-Amz-Request-Id": [ "4RTJD98JGXHXMWQX" ] }, "Body": "" } }, { "ID": "e10f24400882e278", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%3A%3B%3C%3D%3E%3F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "HZfDTqGRyc5+ap0nHMxUaPEXGXF7DL6cO+zpor6Q91WzB3U4HJatPiwWDMEWh/WJrc3kK4ulU/9iapUPNQq8OSBhpWg9HbJK" ], "X-Amz-Request-Id": [ "0FX5CM3C8SHCY484" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "3db5d2eb80b21857", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%3A%3B%3C%3D%3E%3F?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "4gzBxmi9G16lBA/dS8UqXccr6wMa+f30nzFEYs8AVprDbHkgofWQJKsEGkAn0pGXpEph7OQfafGZ7Pn+U6kOTNxU9Kao6+Hw" ], "X-Amz-Request-Id": [ "0FX964BM78VQRRQJ" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestKeys/ascii-5.replay ================================================ { "Initial": "AQAAAA7hTg0tJjXHDwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "eedb93ff9e3ffc97", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%40?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "nEkiZ4qNxrgiH0ZeX/IkLkOry3KdH6Rarzf/daSThrG4SYbPgwBcX7+IErc5CWZIsYG4IZzLPos=" ], "X-Amz-Request-Id": [ "PQM3E1ZMG4BHGGM0" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "3a4b91ad9c668e37", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%40?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "9hEqM57mWSKVz+IA0oO+IDyFTUBoyUarzcmJV1S3UabJa7M3BQvWdiKzVfpqdvWYutVipztO9j0=" ], "X-Amz-Request-Id": [ "PQMBZ9VGMYWADF6G" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "caee48e54d27c3d1", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%40", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "kj1gT9X4kw54+SATIxzv/ElQqMwCC7GB4r9QCdEEZ47U/X1PDMf6tvgV5D9X2uDTKTx66m3gLQA=" ], "X-Amz-Request-Id": [ "PQM1GQHAPE9GJCTQ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "36f0eaf5f64f7770", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%40?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "8FhveD+qHdZjTgBhKFRep7URqrnWXWc3QE1zfQIPx0rMR3sXgLrn7e8n/UrsN//Cdzl3xC3Y/vI=" ], "X-Amz-Request-Id": [ "PQMASK2SRD528HXG" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "348f297eb540649d", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%40-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keys%40" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "nZIXSaiXbK0vmCw3fXUkSfI0g/CJtk2oNYChduiw+ii61KtdbnkSNwm5ju29so5VGy6AvPdRQQI=" ], "X-Amz-Request-Id": [ "PQM391BDBEXT6SPB" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjQ2LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "6f2479675f25ccc9", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%40-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "JRa16CLJxAGdGQv6717Ys5bt8CThAp3RU7mqy90JcvXTl0nRMnTVm8aJKb8LSED1ga90T5vfjDI=" ], "X-Amz-Request-Id": [ "PQM3RZYAF5484DJV" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "fb35fe4a7ccd09ea", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%40-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "YQfv3bpJZY2AjeD2iuj5Bf0YITHBX3ykkXxD2rpZxZJAKkpHUUaPiQTg0ZrRCsUNZohZsVKb64E=" ], "X-Amz-Request-Id": [ "PQM9YV7ZNXWAFGCE" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "23222c5e51abb294", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%40-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:47 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "bYNDeBKFPVAuba3uLuXk14CGvgDTBmio5uG6v/ioT4gtXNVXqm5p7OCIorVBGCTyDW3ThnybDoQ=" ], "X-Amz-Request-Id": [ "H8RHZGNTBRV2K7CT" ] }, "Body": "" } }, { "ID": "d5704684087d68ba", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%40", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:47 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "fWWiaWy9sEhjyFW74Kfoev4a0tGB9SoxwotslT4Uuabt0R5fVZWOV9qGjsg5r0IJE6zjcsDHVfc=" ], "X-Amz-Request-Id": [ "H8RGCBXGDWTP0XER" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "0cd844631089e06d", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%40?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:47 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "puPZ8FcsdpyO0ju1fxJ4phjmX/29nQBg4o3MqrW7RXrAc9G/ovr/WlgMhTOxjjiCKQYMdoaGh2U=" ], "X-Amz-Request-Id": [ "H8RZ54CWS56JCRFP" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestKeys/ascii-6.replay ================================================ { "Initial": "AQAAAA7hTg0pHMkLvAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "87a659fbf1b3b620", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%5B%5C%5D%5E_?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:42 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "WGXQ4bi+2NzPE3Zsz27uwVxD9XDa3ewKDPM908eX0tapiMh3o4vXlGo+TvdGoGmDhqIstf6LPrw=" ], "X-Amz-Request-Id": [ "SAE1RHYRXCSHA75D" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "b92fbaa15e6ed194", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%5B%5C%5D%5E_?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:42 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:42 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "RaPwp1HSP2Y7Be0gbayDkmGKX2hCEVI6aaZmjWZ7pMhVtXMB+FCluxYxa81lKAeeSTRWuyrOP8Q=" ], "X-Amz-Request-Id": [ "SAE3RM085JKH3X9D" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "96eee652a3050248", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%5B%5C%5D%5E_", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:42 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:42 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "MIXNfLNQy5KutjC5TdXvEEQeIKzrLesO87fNbcJOIShbkqo2VO7Z/qrtqQsLdEOghT6H20vk05A=" ], "X-Amz-Request-Id": [ "SAEF67X5GA385VBK" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "a2cc30c0e56cb7e6", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%5B%5C%5D%5E_?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:42 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:42 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "JSbCwHzfCrw4KB5TFic9NMn8HNI2ASt4k3GYCqDNYO1B33ZAaRJVkjinaae+o1q2Nc5ronz/PGs=" ], "X-Amz-Request-Id": [ "SAEBARV82F8P3DQQ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "9ac7e5f4858591d3", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%5B%5C%5D%5E_-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keys%5B%5C%5D%5E_" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:42 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Zfgb7kV7nuRYN3fpwVwA6MfST4rR+PFNulbzFyBoaWruCSSa9cQFP/WIJkNq8NUvboHGbhcwcXo=" ], "X-Amz-Request-Id": [ "SAEBG88RCY7SE26W" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjQyLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "ffc503de4b659b39", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%5B%5C%5D%5E_-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:42 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:42 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "uys3yoodZwKTUNyY9F0WWHE9VxvUhZV6otUn4S48v7rKBA+f7vVUZ/0fPrhfE0pIimhRYnqS9q8=" ], "X-Amz-Request-Id": [ "SAE0TZDW68BT44FC" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "95409f296e63d1da", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%5B%5C%5D%5E_-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:42 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:42 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "aHTtT56Q6bfhMyGl6xalz0qs5hWFAiuBoH+F1/7cQB0OEwWyUpRsHexC2QcnHvgrCLTd8UcCiHE=" ], "X-Amz-Request-Id": [ "SAEATEZWRSDKF8FK" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "06b484fe860a3e5e", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%5B%5C%5D%5E_-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:42 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "vfGCHgp0kCsac+q75YRaFHHfGZrn1w8bxB23DeTfPl51GVZTatRJAOz69gPFDRu5cuMW0MIoSVQ=" ], "X-Amz-Request-Id": [ "SAE31EPKQKTHK9HP" ] }, "Body": "" } }, { "ID": "1a4986d477e4a441", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%5B%5C%5D%5E_", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:42 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:42 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "NqqYPujBI/r/FPhmIKIwNcB0abhrmm9MX9UIMNxFG/878yZ0z10+9ICE6FNx8/8NOtYvlNmroKc=" ], "X-Amz-Request-Id": [ "SAEEWDBE49EW7ZXP" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "ae51968f8c4f631c", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%5B%5C%5D%5E_?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:42 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "+W8rbZHkoapI8yI4LWCYc5SHlNOZ5dmY/oRrTSOcZ9pVdN4iMip11JcC+Ky0RG/AcIV30vTxOMo=" ], "X-Amz-Request-Id": [ "SAE3N8SHN00F8379" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestKeys/ascii-7.replay ================================================ { "Initial": "AQAAAA7hTg0uBtQWAAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "88d89e8f52f934ee", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%60?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:47 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "C9tfYmlT2bd3igvW4lwRMD0gvr/SO+MGXRj6X1Oe3OkCl14krBKLVUyFzMTXF235zkIp/eHF3rj1tm9xN6Jv8jcGCUaGU1B2" ], "X-Amz-Request-Id": [ "H8RJCSAFMJS34VTE" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "3b0f811230fd9e49", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%60?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:47 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:47 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "tLS1SbuX3vcZQh0FVVD1v0pnhLCkPZmTzqbnS8RAL1y1S5wVZkgTbz2CuRaGoMySw903VfrTcCgnE48RLdYpJ/SaZ6ZIamRG" ], "X-Amz-Request-Id": [ "H8RS6R0ZTR5KQPQA" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "725caf681418a3cf", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%60", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:47 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:47 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "yVw8zZyFmfa7dGy1rZEOjc/KzGTvftMSsr8BAERBGfYamZ5nsdkgL1ubcfWbehQzxgBiLyJ6MP02zGSAXUHQYIP6blJTqMuo" ], "X-Amz-Request-Id": [ "H8RXYJ7MET2XNMJ3" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "59cc181d105d4471", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%60?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:47 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:47 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "R/gGR1UtwwvDNW5AMOYiD+8QVArPoKCypuL8G/LTVBo/8jTM6L197ZqIhnqRPExTNpJkf6nvvWtsDimhoaLk+bn7yHx8DztI" ], "X-Amz-Request-Id": [ "H8RPPNCFR2HANH46" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "716b82a80413caa9", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%60-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keys%60" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:47 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "1tvgsloQpZXwNuhWWNiEcL+MGx8afjqUcXqbRZhfaa86LXVYr6TV0gQ1Z/qZh0u0jz9yHECp/O2JmzOqDaKf5S2Bn+4K4pfC" ], "X-Amz-Request-Id": [ "H8RVE1H68W8DE3ZH" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjQ3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "d76df5c2f01ec5ad", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%60-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:47 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:47 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "UYHP52HHEUwrGl+CGvXEpYElnJ/F9/PEBJ/VBwXblG9U41yEFWD3Mpd6avecFeLGYZA/cNlsSVpOHn0y4okTTQcZpF+AzD3S" ], "X-Amz-Request-Id": [ "H8RQ9QFETQQ5XYPH" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "c600b9e47c8b6ba4", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%60-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:47 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:47 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "2dhM2nAHNfuo4j2e4jjH2gaTI/ug2F6hr+nBCesjPC5TWqfCjpjjVxY1+XZLMuH89sn1PMdVdnQxHzSjPUwRthQB+bVYVWGu" ], "X-Amz-Request-Id": [ "H8RXZE1MEZ0BMSXP" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "45d30d54a4b567ce", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%60-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:47 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "SVfv6e43zkkTaBp4+qE9KqLSdxS8LIwYhjiez7VbSY3M8JRgBJkReRVMMMucM2C8QfUWjG4uO9cdNvF5itZnBq2JChzIvE19" ], "X-Amz-Request-Id": [ "H8RRKN7WS7SJRX8T" ] }, "Body": "" } }, { "ID": "4862d781a9900479", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%60", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:47 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:47 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "ctGxzz+LJqw80d0AQf/rTexIPiPTgOnwUNtcPwvW9JSVLzEAo1BL48IVSX+G4rT9X3xmqylna++85TnCqxTrnUSOEE+jXWS1" ], "X-Amz-Request-Id": [ "H8RH6JNG68PKVTZV" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "9f9a08b39984fecf", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%60?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:47 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "qekeputXNUirQN+xtuR7jz/KkyrYNAVqMDRX3N2vb9aVNMT+/q76lYNte7aMFWbulmw7xIoAybPY5RmnpytmNXweYOjE+Qpz" ], "X-Amz-Request-Id": [ "H8RPXVMC5RKBZAT3" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestKeys/ascii-8.replay ================================================ { "Initial": "AQAAAA7hTg0sBM5xiAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "1225dcde372ed1b2", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%7B%7C%7D~%7F?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "5rrhG6VqKPxu0NGZjwTujdKU/kni5tzO/tjOg0lvjkIWSAKIs4gDu+0exM+hu8Yh2MUWaMAfsVs=" ], "X-Amz-Request-Id": [ "0FXEW49Y8AT811CB" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "34ee50fe20c74a7c", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%7B%7C%7D~%7F?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "7q3RKISBw40SRIwroF0r3mMIG9Z3BcSPMZSnQm+9vcxSykCXcBBIFJ7hUZjLuPWyo2Cykt0z1WI=" ], "X-Amz-Request-Id": [ "0FXE258AANGST2G3" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "78e1d6d655d738ba", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%7B%7C%7D~%7F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "FnIrNMMUkUFnvLz2o6IM8qQ+JvekafVfMgRJWdBTK+ucr1AI2C1s+TKIes0OQH3Kd+uZiOPKeV8=" ], "X-Amz-Request-Id": [ "0FX2V7F9BK4RYRQN" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "b7d0d3d67c9ae01e", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%7B%7C%7D~%7F?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "DSAbG6ARLx4EkFAncBS1whyHHmBd3zokzKuA7JQr/2WINnsH0sA0sBizMUVkCWAWwH9RHNRFetM=" ], "X-Amz-Request-Id": [ "0FXAZ036F2KBN36D" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "bd37488dc405cba4", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%7B%7C%7D~%7F-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keys%7B%7C%7D~%7F" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "8a1XoznfwxzXMegnuvmY6ENXs29w2ZmAzP7A3j9OOm6IJeQKZrImxqq7Ezn9uiGacGaadWo4N8I=" ], "X-Amz-Request-Id": [ "0FX9FJN9R9F6FC03" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjQ1LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "88d2fecb7397c514", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%7B%7C%7D~%7F-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "uXWxfT6l0n6CYYWPJd1rrhWgtSmZqBxqrBXbBSwBm9i5rYT+Qo+vzPb+gtI/xEqsZIXr/LN9u98=" ], "X-Amz-Request-Id": [ "0FX0115W5MZ0R7X1" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "02aed28ab75e252a", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%7B%7C%7D~%7F-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "hAAztDZljDZcDHXs/FJ66HbHAcGWF4HBv2MU0X6E10h3ItW61J5BiasKcodImSx5chLKtcdUVvA=" ], "X-Amz-Request-Id": [ "0FXATJ9X90E41J31" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "1b80e1d75cfa202b", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%7B%7C%7D~%7F-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "tCeEgHg8lDEcG8gFIA05ihde2/xlymZVTG2Mk8DtFC1wdxQl1/1bs/4k/DYPtUq4J6TNzhvV9gs=" ], "X-Amz-Request-Id": [ "0FX3Z5XR04T8TRHD" ] }, "Body": "" } }, { "ID": "3e4fa44df4e0234f", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%7B%7C%7D~%7F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "O9moiA0dhsKjpbRmN6IksCIoEMsuC0QJh9MeQTDJQ5jD/hINfi2KjnVXBhilvYGbRUxr3zjn3kM=" ], "X-Amz-Request-Id": [ "0FXB6QZMWH0A7EFR" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "80801451d9ce7504", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%7B%7C%7D~%7F?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "ssSpIGu84gUB9VlWHZ/Ube5EDxNMKoPCdk+Z1GUieogtZZAfab8fNwOzJbSfZjnjxWGI8bF30jo=" ], "X-Amz-Request-Id": [ "0FXAB7MG1HZXFBFW" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestKeys/backslashes.replay ================================================ { "Initial": "AQAAAA7hTg0lOrBS+gAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "ab559378a755e24a", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%5Cbar%5Cbaz?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:39 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "gMWFd+RXqGfRz3ES0SP9+vgR+5EA5GUjNJeAqKJxq6lJVEHDFlcA6AaQUD9S2BkZsFGzO6gAr9M=" ], "X-Amz-Request-Id": [ "JNJZP2EYDSACDSRP" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "b5bd1eca0b68bf72", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%5Cbar%5Cbaz?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:39 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:39 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "zeY27o4fZtvHV94K9FdqC1kJsshsF0IFbR7wUd40mpzedHT1yQW1foB5wBJk01ynow6hokFB4o0=" ], "X-Amz-Request-Id": [ "JNJS3CSWWPKM17VJ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "cd8d2e9a6c6a1d8a", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%5Cbar%5Cbaz", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:39 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:39 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "2XtKRhm32r4UMDNPpz0RryznNS8alUqgT5gHMQG2ti3RnDXhP/pEFrA3ihsDte7RbVpE6ert4sg=" ], "X-Amz-Request-Id": [ "JNJQSYS2RGVTZQNF" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "d6930d5dfb69cef2", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%5Cbar%5Cbaz?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:39 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:39 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "5ixuLL3jo6WnQNOEEXAlLxA2SobUUxtRYzZeUnvgWkcg+gkKfvv/ps+nse8gCdHFRcQ81S3pOC4=" ], "X-Amz-Request-Id": [ "JNJYHF345YPVTXA0" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "6bc259ae68f79d1d", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%5Cbar%5Cbaz-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keysfoo%5Cbar%5Cbaz" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:39 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "kObrqAfO4+haEuMB7450dDPOm9Wf+9dfHQdwZHDl/RlUNiHAqdSMFGo5HNQiIqmUp+jswz1mQx8=" ], "X-Amz-Request-Id": [ "JNJPZMZ074EXKNAJ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjM5LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "ca43c5d6c2a3eae7", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%5Cbar%5Cbaz-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:39 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:39 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "nRWVP8mYk8tllzmA9FI3oksu/H/CFf27XQVN2oEM8cERd3YiGsgW7ATYV4n6LTtHFpsQpWaxiGU=" ], "X-Amz-Request-Id": [ "JNJMJN7G26SN7YDK" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "ef05845957b21437", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%5Cbar%5Cbaz-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:39 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:39 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "kvtPJ2IgonYcW/ST+0fOJOojryl9ZnsMkxikiFcrGGqCt2dW27fXvDh2vIwNspwVs4lDDS5QBMM=" ], "X-Amz-Request-Id": [ "JNJXNKN48YAQ2YGK" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "1e41a5889dc47b10", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%5Cbar%5Cbaz-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:39 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "r+9dMpVyFzgXpqah7t8rv3CakbbQVQIBLgyn+V7DtPbjbngL+CYw+1ONYoRZMw3pwiTT5f6UbvM=" ], "X-Amz-Request-Id": [ "JNJTYE8BHXP7Y8ND" ] }, "Body": "" } }, { "ID": "2cac86fd9b817c14", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%5Cbar%5Cbaz", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:39 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:39 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "7tCEpis+0/q1WGKGpry9n3VFsA2UKgxFqKsFAGCkWNxjy6zQd8tNmq/qFiGAbao39Pu3EdJChDQ=" ], "X-Amz-Request-Id": [ "JNJMMAD50MNFXX1M" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "13ba01124c80bf55", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%5Cbar%5Cbaz?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:39 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "QFmwt8xgUQrmBlMYP0tpYADh/gNaJwCsvykYH7WijkDMUoNHRbKpTmDNcUC8BXbwKl21L0WtNxg=" ], "X-Amz-Request-Id": [ "JNJW0CV6VF60KGKB" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestKeys/dotdotbackslash.replay ================================================ { "Initial": "AQAAAA7hTg0qHHm9NAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "5916f088547e4624", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:43 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "yk2JBidSauaFC22B7Zb2SVxFnqM5w9aPVP81zkoUr/MvEPSY15F1L51h0AW1xzfOlqOxz2j8eaV9imonzkvpLprGBly69uJZ" ], "X-Amz-Request-Id": [ "NET31849DMY4KXQZ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "dd2e39cc429b8b39", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:43 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:43 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "tduaEDW9XoQqU8k2adOPBmXrqultSyA24IY311i6UtDWBskeGOkIwOlo+KPSBCh0mOCLhoTZxlVvyOYt9UMtWlLGaISvkaC2" ], "X-Amz-Request-Id": [ "NET90JHR8YVHGM8T" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "e13b7f70e7309324", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:43 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:43 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "qLNmUKv8bq26TJt3+kOaEzQ54UEfRStf7qWtKIi6kCpBcATul+Ypt0CSUr89dOaaGRRSTXqygZXrejcNrEgXTwweCBNcDbnM" ], "X-Amz-Request-Id": [ "NET82Y5H9VW9GDJY" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "5aa90c18adb7e7c0", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:43 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:43 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "AQwsflLALqztx2J0RU6laWwHQTDMPuYUiWdf52TgUkUvfbaQWkNPhiC5ynWNExcnIFnAmlUbUSbS+2pZlncw7H4xcwsnvcZg" ], "X-Amz-Request-Id": [ "NETD4RG9MABPPRG3" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "bc844befd5fdd23e", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keys..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:43 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "0Rhp0CcI9Vly5/j2tNSeOpkgDTxGhWfM3n7KyGZlIblSdqnexIDoPodO7ayMmNuUQB+rb8jcKLKd3xGb0UiUTswGXg9fgLHh" ], "X-Amz-Request-Id": [ "NET2K9XVMWERB4ZE" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjQzLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "e1b312c45e7da3c5", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:43 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:43 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "ZG3kYBeALTV7823zlNgFxoNf4yUqJfczfo3huBD+Bd5Ph7fNxKEEzpQPhKTIJGYDYUWSid2y3TBvdkIMteZ479Lg23j1WAHB" ], "X-Amz-Request-Id": [ "NET8XFP92QSQNBNN" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "bfc896f34db1dc3d", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:43 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:43 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "SFPP/EXbUhDTZjfhK/PQDuDt/pMFsaYEwrOoKqJhGw9a+Uub7/OtKDpq/B7EUAEjuP2lAUbNPw6hBcVIVFbHVCNX+r2c0SMF" ], "X-Amz-Request-Id": [ "NET2ZNAKRTCNPWF2" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "88c2072ecc43839c", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "vS5gKO+unlAfTZ9CsQv+SkoXVVMBgpnJww0pkCKY1lTJbF9hMehqlT9R3BPyD7OaHH0XvseP77EQrOq3FzhC9DgfoXht2rKZ" ], "X-Amz-Request-Id": [ "4RTYFSMZ16T1G9G8" ] }, "Body": "" } }, { "ID": "169b498ff81577bf", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:43 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "EKhPlQZx7ft0/+t0BOmzmikJ17OC0gRd9n1hksGeSrNF5qudqRVGAB994Tu1IAKI2DLw1i84rc5JOtWxqM5cnamtb28/nr4S" ], "X-Amz-Request-Id": [ "4RTH3FKBPZG8323W" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "2c8fe9c459a0399e", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:44 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "JHl0kd+uGwY5HJr8LWsh1zbXYSzrCPlRu2stuT82R1EIgyWdRtsT7kcTrxGVVWL4DpKBk51zA7TQ+jx7ItAOtB4YrYgRf8Kk" ], "X-Amz-Request-Id": [ "4RTND5FVTJQ1M040" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestKeys/dotdotslash.replay ================================================ { "Initial": "AQAAAA7hTg0lHaFAuwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "c61418d270693cbd", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..__0x2f__foo/..__0x2f__bar/..__0x2f__..__0x2f__baz..__0x2f__?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:38 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "zzO9JbejgoR6gJZoi6mWtE0dLYQPVgJmWFGGqsGF3LnNCjx2ee09o9kCU15JrS3yYJxHz/DX8k4=" ], "X-Amz-Request-Id": [ "G3VJE1D07161N39A" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "02e30c911b5dbc0c", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..__0x2f__foo/..__0x2f__bar/..__0x2f__..__0x2f__baz..__0x2f__?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:38 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:38 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "JCUyFnHM4VtHe6rP8v9+6zm7+9sTNN+izcrFC2/OXWAd5DrgGpGug9uAIG+hiMZAVmkiXdNTF5s=" ], "X-Amz-Request-Id": [ "G3VH1JKC32PDBQQN" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "82b9c1f6b916c5fc", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..__0x2f__foo/..__0x2f__bar/..__0x2f__..__0x2f__baz..__0x2f__", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:38 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:38 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "drk7PAUeHZ7WKCH+5boCnY315NGkMUBnKRmfPspzTPEmPE+bQ4FM7KVwHF5yVCmgFyWsbq1aobg=" ], "X-Amz-Request-Id": [ "G3VVD3AJ79GAGTNK" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "3446304e34f93245", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..__0x2f__foo/..__0x2f__bar/..__0x2f__..__0x2f__baz..__0x2f__?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:38 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:38 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "nImJmNWxCOrocXXieuRIWRd4FvPUA8rpCOsVlk3gpM4V3LH17ciMxDFs4ocQuQqFNhE9B0Ctigk=" ], "X-Amz-Request-Id": [ "G3VT8D01PVB14WVX" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "e89df7c41daabb20", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..__0x2f__foo/..__0x2f__bar/..__0x2f__..__0x2f__baz..__0x2f__-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keys..__0x2f__foo%2F..__0x2f__bar%2F..__0x2f__..__0x2f__baz..__0x2f__" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:38 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Dp0V5SIrJemYSfYTlLLRwVFfcRNdVuPF1lJWWHgp1kRJRWCa8dWm/WxLR+21V65MP8BwHdbf6ns=" ], "X-Amz-Request-Id": [ "G3VGV762KSWBRN4J" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjM4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "656c1a22cf7aa8f9", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..__0x2f__foo/..__0x2f__bar/..__0x2f__..__0x2f__baz..__0x2f__-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:38 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:38 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "UClS4xJlE78aqVajay25asUqNsrIvVqOTb/KwlUfaWFimB9QR0uTH88N72BUoHDTmFGRiP6Vs5c=" ], "X-Amz-Request-Id": [ "G3VWJS4BVYCSXA85" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "1251c7d86d82268f", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..__0x2f__foo/..__0x2f__bar/..__0x2f__..__0x2f__baz..__0x2f__-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:38 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:38 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "ZAxLv4LvO6gGwUtQa2GMfImBMEu0GhyjfCYc4tDBAr6I/Yy8FaRiATgekHSLAo8PMKbGsudIEd0=" ], "X-Amz-Request-Id": [ "G3VNE5F56EH9N5D9" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "a1205d4782bc22cd", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..__0x2f__foo/..__0x2f__bar/..__0x2f__..__0x2f__baz..__0x2f__-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:38 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "P9kv8U5EQUHv9YgO+mDW+1u/eUNkKJel4tHcWPru4oFbgj21nQULcEWh75GCMg4fLHX68W0FHiE=" ], "X-Amz-Request-Id": [ "G3VG2G86ZJTC3F1Q" ] }, "Body": "" } }, { "ID": "716f81619ec51e37", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..__0x2f__foo/..__0x2f__bar/..__0x2f__..__0x2f__baz..__0x2f__", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:38 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:38 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "yOSGlBMb+tBwse8DCo0Ywrg1dNr4oaIHhfqLgrCMlUayjsfsIxeBLqc/Lvx02U34JsmGuabi7Io=" ], "X-Amz-Request-Id": [ "G3VG24DCR32760VM" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "45b267982727ae8a", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..__0x2f__foo/..__0x2f__bar/..__0x2f__..__0x2f__baz..__0x2f__?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:38 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "kGU3R9mvKwhzexUDV87PjyVTNklVDeDFqTDRfLaKBCK2dIE0lni9YkEc/aEkeu3fPS20XzvGfMY=" ], "X-Amz-Request-Id": [ "G3VM2FNP552F656H" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestKeys/fwdslashes.replay ================================================ { "Initial": "AQAAAA7hTg0pOqpoPwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "5f8a2439e29f3167", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo/bar/baz?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:43 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "DeN15JQ/sd1tmrDejHcRL203lPeoNrDNBiTL690ihQX8u3Cn9kS4mcGc2spdFxm0YR++2sFQ9rw=" ], "X-Amz-Request-Id": [ "NET7R8JW6MBN32N3" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "3a02bb9814a34f7d", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo/bar/baz?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:43 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:43 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "59OGLsDc6Kr5Poe07SCw/VdSBbOhZoalESd9DaG67qN3yJJ9+0ivml980ks0Xk/ufVThX1RZUdg=" ], "X-Amz-Request-Id": [ "NET4ETM8CR9N0G24" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "af9f639ac1f63945", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo/bar/baz", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:43 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:43 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "aCJcEg2zLAdAO/+1Fl4qM4bKHW1x6qCLmvTPQ6R4Nyx0n52ZqlHqLs+l/V+dK9LXiqhlTtguFBE=" ], "X-Amz-Request-Id": [ "NET1E4X03AVX6GJV" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "c17a138a0686ef4b", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo/bar/baz?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:43 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:43 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "sskFSRNoS2MdxFZoxvJq1RTlPyDQke1hNr9kVtwHJ2yHho/Uq7cwgs9CFhf/TeQZ0BomHjoUm9Q=" ], "X-Amz-Request-Id": [ "NETEKN3JYGCT9M8A" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "45efbff5c8506ba8", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo/bar/baz-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keysfoo%2Fbar%2Fbaz" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:43 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "TrfjQGz4NpduscUdCorW8CkPdpRJYhy0XZI22zWLaQ/3w/C0ukuX4CQs3HoSwhhllFqoH4ioWgU=" ], "X-Amz-Request-Id": [ "NETFMEN67FTH0F69" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjQzLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "605037aa95c5b3d8", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo/bar/baz-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:43 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:43 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "XWqnxA5674YU7R9EV0EDJTA8MjklgsEp+HCBunWpmR6lvMjr2lxCUQM4gUuaWCfLcjy60YK7PgM=" ], "X-Amz-Request-Id": [ "NET7F6JQE0EXDSVK" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "6e97969855188f3a", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo/bar/baz-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:43 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:43 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "ayNF2cjyXQQ+SXVAU721jHLTGIYTWQ1lrcvVvfUfXpOQuxT4qKLwpOj3JIJNEsdQmb+e+EF0h28=" ], "X-Amz-Request-Id": [ "NET2J2W6YC314KBR" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "db4fc35c4161a488", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo/bar/baz-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:43 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "1hVnDptRzhnk0WSWG5SjGlXq3esid30mTp0PNluCwYCfRygsh0zGiWeXKXk63/7nRu+GmV+7uHg=" ], "X-Amz-Request-Id": [ "NET1R9WD4ZENA33Y" ] }, "Body": "" } }, { "ID": "12a7d82d2c502f36", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo/bar/baz", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:43 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:43 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "TIjN96JWe9qjVzJrINSXk/F2m6gmBFsBldGYYbYmY2YZ5zrA6/lIx1HaumvM0oSr+6Xw2IfBOa8=" ], "X-Amz-Request-Id": [ "NET0FME6XGC2CF61" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "1397ad4fd007ea88", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo/bar/baz?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:43 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "ZCcUXiDxq4iexHLZMQaCtB+1yJH0icsn7WCXr5a3pVR/FJg+CG40BD0Ldc3LoxzbJPrdjj+9WD8=" ], "X-Amz-Request-Id": [ "NET2S3P21N5QR2E7" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestKeys/non-UTF8_fails.replay ================================================ { "Initial": "AQAAAA7hTg0lHZG0uwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": null } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestKeys/quote.replay ================================================ { "Initial": "AQAAAA7hTg0nHF5gVQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "6e955c191fc52317", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%22bar%22baz?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:40 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "SYBh8GbazUPUjskOIN/5bxdZCVF/zqRaJ9s8KPL1Ql/88azzCidrQaYwOhy11GakXjN10Q5SVpWmxkvejrLmOdz5EhBKBl7U" ], "X-Amz-Request-Id": [ "ZVFHSX1TE38CZHYG" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "43a26e5bb5811f77", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%22bar%22baz?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:40 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:40 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "ExbR5PbYEc2bbqEonZ7nmtQTvOaTYATnxh4Ynhprqe1h7WlHOxhpXVxr90sfxZtJ6F3N3ItnJl5f8qp3vLl8CaVmzdhkKFdN" ], "X-Amz-Request-Id": [ "ZVFYAXMTBSF5M55R" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "d55777795ae8e4b8", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%22bar%22baz", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:40 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:40 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "oUEILPb/IfD2yMHoAUSoyy66vmZzTmHDndSYJyEJPNlBlkUMmJYlBGkGuv38dZLCc5YNo5I649RFeE50lWiNCTIVkpoierqI" ], "X-Amz-Request-Id": [ "ZVFQ9YRD27NPA4EK" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "0b54e10420969b04", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%22bar%22baz?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:40 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:40 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "5G8MaJajrKawN12yNBKwr79zDsi3v6Mm74V1obeyiUDP36fZPP6IkQZP8E7vuWeCmutY5FmopU97hx6byxCuAt7Lg3mDUbNM" ], "X-Amz-Request-Id": [ "ZVFSPDQ1DVS6W7W3" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "4c8700c3fe3a10e7", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%22bar%22baz-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keysfoo%22bar%22baz" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:40 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "X3DZJ75KzsDRcCDj8Y9oa9rEBm8WpNhBDkRwOb8GAmmDt60YCGT+KQahZllMamMIaeMLWOLZhwHMUOsB9TRmhm7WnMH1Y99N" ], "X-Amz-Request-Id": [ "ZVFWDEDAJYGEEQ36" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjQwLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "9267023b9285eb34", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%22bar%22baz-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:40 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:40 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "UPd44eTfIzPQVGGYd3ZfpZH73yNLVz2fEPgQzwHrliRNfDVWHoP17NIu14zVKJNGinTyfVfz3ORuxJRsbM/heeOlJyWHWffu" ], "X-Amz-Request-Id": [ "ZVFXJ4XA2FC2WW5J" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "f6963e40c4e2bff9", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%22bar%22baz-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:40 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:40 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "/1JqdBmbdYR9FeyOEF14RXfDoN701fOcCBsktkHJe+mJPB9S6JfvQ03wniZKiuGD9VCK9dFrb+rC+qd1x+jYB6PtIdXQskAd" ], "X-Amz-Request-Id": [ "ZVFX57V9Z1G0TJQ9" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "7d514bad1a7e3746", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%22bar%22baz-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:40 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "FAscZF0iXCo2VXgIvNYFzmB8oLNMZ4czh70bs87XW5RQpjJYAlVFCqSaO0XpnxliQpdQo/OgYAlqkb2jFcaYQmKQGgAoHMWj" ], "X-Amz-Request-Id": [ "ZVFKRJ3FYF8KA55Y" ] }, "Body": "" } }, { "ID": "4795ae45a2fc2e71", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%22bar%22baz", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:40 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:40 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "0vmxuK9ijBHEzmbg4NLBq21s6ymp8IP4tTj6vYWIdQ76JZA95wXo/TXjY88PrLtZIpgA/pmBr5m0RnQxH92iQuQJXe/g+k5i" ], "X-Amz-Request-Id": [ "ZVFQQ8YH335DB9RH" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "71bc764f9800d719", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%22bar%22baz?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:40 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "vuza4gMXLFkW0x+YFtfeElw/jqqwg2f7VIIvJB4xoBI3WEGT7tuh0dXK/q2uWqU/FukVUGaI0ylBPzL6v4VRbMND/g40AMZg" ], "X-Amz-Request-Id": [ "ZVFZB2GFCW8GX52M" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestKeys/repeatedbackslashes.replay ================================================ { "Initial": "AQAAAA7hTg0mOrGw8gAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "82affda67d37cf0e", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:40 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "cqupQwHreZZW1y14r4dQBXCnw8XcwDiFSvmfcpkytdIxk0dfLgYGWfuINAp3h9v75cGcMYLnX80=" ], "X-Amz-Request-Id": [ "ZVFJ3QA4VEDEE8JP" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "42ce7857f3371fd1", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:40 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:40 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "Nd2HDAXIWaWXFUrvMic4iGO9/gm+1ULj5kjDab6HpdrI+J6h0zS9mntjcPJjabE+LI02cEH3cso=" ], "X-Amz-Request-Id": [ "ZVFWZ8266VS4JF1D" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "4104960757ad1d61", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:40 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:40 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "xKsdXOEiQgiMMsoCteLUcpn/6fdnuwE4D8FMPzwBpO1vpy3Ij/E/GIp1mdOI7dbbPm7vdYCRNxg=" ], "X-Amz-Request-Id": [ "ZVFXC170Q4M36SFX" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "20ca6600c0a09c73", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:40 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:40 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "2dOH5YqnVYYqH1uiOPk56ksG/4FFFwMsikcE/Ia/28atShN9jl793W9NsnHK7Q0O1lPZjWcQ+Fw=" ], "X-Amz-Request-Id": [ "ZVFGF5P1EHG5EN5Z" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "96ce295c82acb3bd", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keys..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:40 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "f20S9c/b0MbUJyJbs8mItre+7lT19SJqY4OOPNyBXQJc7JICM8BGSTEImnqE/8aMD6FUvCGHmr4=" ], "X-Amz-Request-Id": [ "ZVFZ6CCEA26FCHDC" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjQwLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "3c9e1cc67302918e", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:40 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:40 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "xtIhEvza7jGFxqk3VkUdMfsbQv7uuGZvSK1LZ1xCFRIX3CakQWKRvhxntFt/amQ++blOW/3EMgg=" ], "X-Amz-Request-Id": [ "ZVFRV1CZW2E37SHR" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "a9c7a230d14aab0c", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:40 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:40 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Nz2EgxVkSwo0s/NyeE+TyYzaNqHd4thhfVryv9h8lElCNg8psRQ80GG7XaufY/2OPWnP6ohjUSY=" ], "X-Amz-Request-Id": [ "ZVFTM7QB844559JW" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "4189e3595074ace2", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:40 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "E6dJ2PlvBO6hMIQUIeuZjuRagu6C/oae+2D1wxQSQ8HI9cnAKt9e5wS47zG0+txsN26wV86okOg=" ], "X-Amz-Request-Id": [ "ZVFQAV1ESVAP8GB2" ] }, "Body": "" } }, { "ID": "a5267a101d3d861f", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:40 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:40 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "5Z5pZVX9XQrMG3L7abU5+CawbK04w9xETmFBAaGrePLwqTL3WIlWP10BmbsGDStXuBiIC4EIr2s=" ], "X-Amz-Request-Id": [ "ZVFSA0HCWX0Z2SZ1" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "94187d8e52c61120", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:40 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "r7q0FSCiH8YS7LQEadeSF/XT8lB3jVjGmjTFD9LyM6EmpjzTtefVTxVLIpzQMBWCgzSzMlCa8Fk=" ], "X-Amz-Request-Id": [ "ZVFZHW311KE85X0W" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestKeys/repeatedfwdslashes.replay ================================================ { "Initial": "AQAAAA7hTg0sIV4ONQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "7e9a7664e8f9db17", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo//bar///baz?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "UAdKVU3OMh2lyivqkM2H7Ynh9xROwqSr3Zg7gIR/Rn2mNVR2xTG1szckji89axcRTak5CrN+9vY=" ], "X-Amz-Request-Id": [ "0FX366Q56NXSWEJY" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "8d00c5714d02b234", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo//bar///baz?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "rAfD5cHdw9vt7y41yHjGrb7Pc8r6YNgd5QJjAgspKmAegSgdZvHXVcHAEffgiZVJAwYp/r+5PuI=" ], "X-Amz-Request-Id": [ "0FX4ZNP2HXDZBWTJ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "725bac1b29260461", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo//bar///baz", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "6780wP/tbLAG+r3GPpzfeYg3QCCRarOd1AywkYuoVeHXZ1En63D9BKXXH4Anb6K6EzdkVjKutNA=" ], "X-Amz-Request-Id": [ "0FX159RKXRE37VRV" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "610ad06f9865fd73", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo//bar///baz?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "HIE+sN0asrxeBFFvYziq7CrZDlvejaIaYJQwVhhMQg5p6brFQgjmSZIZB/aoajwk15aTsbJRo7c=" ], "X-Amz-Request-Id": [ "0FXFNPASR9TAQQHY" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "5c269c0a42fe22c7", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo//bar///baz-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keysfoo%2F%2Fbar%2F%2F%2Fbaz" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "X7X5lHHim1dcKFO/yYlMKzXflq7eKWMBL833n1BKDlfz8PdC0hKyxr5eiWuhLUE818HLdhlO3wE=" ], "X-Amz-Request-Id": [ "0FXFDPR09NRXPS8V" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjQ1LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "6a73b9c5328c9aad", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo//bar///baz-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "9E7BoGEjJaiPEOpUS9UaZs9VcbB6aXpm9PIbAXaMQNYZvrmzwhJoJVsyveMFlUjbxAdvMW5XHPk=" ], "X-Amz-Request-Id": [ "0FX0ZAG8ZES6YXQA" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "6c8589fe69bcf698", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo//bar///baz-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "SvsHqMNjqYr2q6pt7B16kvxxSPE+RtcjgsQ8uH2hajUF6duNgjlcnm6py4hiXg5JgT82ps0mXfY=" ], "X-Amz-Request-Id": [ "0FXFZPQTH1BYMJGX" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "b4c6f02e7267b85b", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo//bar///baz-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "EXYKbXnRHbzgmHl14ppLVBQ4aT5sd6eUUZEfbyqn/1/qFXjk4V+hlWdL/+iCS8Hhd+Wqkf4U/0Q=" ], "X-Amz-Request-Id": [ "0FXCJ15RD5PT7R6F" ] }, "Body": "" } }, { "ID": "77d91914814ac940", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo//bar///baz", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:45 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "nma5Mo/rYUo/9ftwVg3BXY9brV8+JbSAmchGaavdRkZoi0o/XLvVo8UyE611m0/34eZcyg3Q44w=" ], "X-Amz-Request-Id": [ "0FX020WFSSCJBB5G" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "bcd74bc9ac4e3bdb", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo//bar///baz?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "nyVjRQq5/mA2J+WcNS8ZHvGhnzh45h7n4we1nvIH0LyybWftUBc5beU74Y6lVCOJWBAuXJ5YCVk=" ], "X-Amz-Request-Id": [ "PQM552K98M8P53P9" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestKeys/spaces.replay ================================================ { "Initial": "AQAAAA7hTg0mHoYEaQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "552b320159be89bb", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%20bar%20baz?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:39 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "DflPQ2nPMvK23BBFrT4VqZM30NaOcTBsC9uwI5k6xDORgYa4AOYxneMTvVVte4G5SRgZ8mlGpxI=" ], "X-Amz-Request-Id": [ "JNJN16FEK29X4VH6" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "0640cea6569924a0", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%20bar%20baz?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:39 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:39 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "WnCJIFxJoTLo48qW5iZRlwajiNQ+U/y6PWI3ZIWPwEvODkp0ih/DGzTK8UgxC1E09sPB0mFi6vk=" ], "X-Amz-Request-Id": [ "JNJR2YAW910J8JMC" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "d98a4ae1c467b775", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%20bar%20baz", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:39 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:39 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "j1R5ng3+4dwvGbUO15FYo30M6q4OJkskkRzpZltyp+Cr/1+LFqwE+aC2v9mm0GMKuw5Su9r5c10=" ], "X-Amz-Request-Id": [ "JNJJTA472GCE7W7K" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "421a5c58ad57f066", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%20bar%20baz?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:39 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:39 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "/w433VhmTKUyHw/j6Jr3Exf2A+/RtyFWg1dqNAArecpXuFSPdWL4aIOoZNCatHdY/erp2DgVwac=" ], "X-Amz-Request-Id": [ "JNJNX70Z9EDGMG23" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "6a0adc772354981d", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%20bar%20baz-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keysfoo+bar+baz" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:39 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "2hcfddd2c9jVo0M7EyiCY5arKdFyOIKBZ3FfZwnBFKkGZERJiQCdhKEyQeT7o2aiWIk9sHqw0jk=" ], "X-Amz-Request-Id": [ "JNJTQGFMG4B861Q9" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjM5LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "448381f7d2ffb0b4", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%20bar%20baz-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:39 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:39 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "jIp7zBTQ7YSI+MctDyVGIApQExFI6fSa17nDJHxtT6kYNFKzO284fDsVKkjrMMpaJbsnU37pY84=" ], "X-Amz-Request-Id": [ "JNJNY8039ZHTKMFZ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "ff4a52611c39b991", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%20bar%20baz-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:39 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:39 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "CE9FnSpNNxbhQ4SQ9911h3MCbZYX1Ij7nOVtnVgsGpQDzUTkPeBWfmn2femmraBvTG5Rc+D10vs=" ], "X-Amz-Request-Id": [ "JNJG2SCJYCRH2ZBA" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "89752b5fa324481d", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%20bar%20baz-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:39 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "6dTQMCAmAqMZMUnVf74+FzjPUUu3dPyt5vUR7RN/f1Pe78X7QznnSbuPhO3ublLee/fe6tH8lII=" ], "X-Amz-Request-Id": [ "JNJX3Y5H86EKE4V2" ] }, "Body": "" } }, { "ID": "1ae128b96504b182", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%20bar%20baz", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:39 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:39 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Hf6Y9PpEaUdwNGkIufb1E+vSeC1ICEkabxgaClg8YkZ7NYHIsxwZ9CsBmzVpXeSoPgAtF1UaQ2M=" ], "X-Amz-Request-Id": [ "JNJVT4RRE9K7SB9P" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "10bc770635c40035", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keysfoo%20bar%20baz?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:39 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "nM1puEdgFGFRHUvCdRX7Yr4Hx3IGPP8OHUKQ0CrhMAq7N/AU147nfXbhRb0xZkOAUXMmNzLMRt4=" ], "X-Amz-Request-Id": [ "JNJHMRRJ1MC91Y11" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestKeys/startwithdigit.replay ================================================ { "Initial": "AQAAAA7hTg0nOyVLwgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "389d583dcdf46634", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys12345?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:41 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "Yf0At8S2hyZEHdI0K0n3mm/Asn2NFp4a4lM5y2cflPvjh4gnXjDSysHHhL+U8k7VwYKqUJglTYo=" ], "X-Amz-Request-Id": [ "9MD81J13JB61X2Y1" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "0fd6b5c32afaf361", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys12345?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:41 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:41 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "SrVzCt522i2hEhbHNyvNJ/CYMOd9Z+9DihzvESknl0EeqNl7+O8iggqWhl9y1/yeSasijH28lNo=" ], "X-Amz-Request-Id": [ "9MDB2RRX6DFCPDHX" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "af36e497c641cf90", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys12345", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:41 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:41 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "s23i6Co0Fh1hLD6Q9atdnqxvuTpj/lQOB/t9EHrHGxZGtK+1onWZAT8EDbgc65+pF08jAyvBK1c=" ], "X-Amz-Request-Id": [ "9MD1CNTTJT9C4EB1" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "c2152601eec7a0f9", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys12345?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:41 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:41 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Acr+XAPbw0ZIXKE1izuNmDLa+Ts93ZjLJdYr0CDRzRqARsdCEIAwpz30pDQ68856sH5rsILn8h0=" ], "X-Amz-Request-Id": [ "9MD049KV05HGT6DR" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "f8961d25454285b6", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys12345-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keys12345" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:41 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "p7QRLO58/pnkg5FFYghEQhSK+A94z47tr5hN5oDmGyCZAl0uaoTwtcLzcDlSCeYzEzgj3L/zS5M=" ], "X-Amz-Request-Id": [ "9MD38HE3YB02D8B5" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjQxLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "69ce33c013e13021", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys12345-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:41 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:41 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "VOgJMLJ7P4N2EjcyGSdQ/N5le/tpxqF5jGrDuhrEjmpYw/5LbMqEYteQXeywPd+49O48n8PYYnM=" ], "X-Amz-Request-Id": [ "9MDAKKFP853NQT6A" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "f72c21bd5eb8ce43", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys12345-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:41 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:41 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "YRNUVF8EgT60vSczHsoFUOy0sEJqVOBha2NpfVGpmChcbBH8TdfsgjwyEt8W62fl6JSsgyx+GdI=" ], "X-Amz-Request-Id": [ "9MDEJ06KQAAHXY67" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "64f0363f0348f581", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys12345-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:41 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "aK8bkfNzw+rCX3Cnx0mM3gu1BySsH7+4PuQjrhwse9BlEDGSP/egFe9qI8LVmApIPRqRRzJByQQ=" ], "X-Amz-Request-Id": [ "9MD5N1DGJAB04PPA" ] }, "Body": "" } }, { "ID": "0e4a3f0a757c5947", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys12345", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:41 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:41 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "wGBg2sP2rqB4UtcQR1KIaUxQU/S5yXx7lGPsYAQ1xjpgVTHo3BbAMWQLcHIoSqZBRRRmVxn806g=" ], "X-Amz-Request-Id": [ "9MDC48JRZ6QZQP7Y" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "054ae70a29d2f9bc", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys12345?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:41 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "jKxKT7uw0aTFvaD10qRJ0VnQpvAu9AyUY279dJKYt3FBh9sjXeLcJEM9AYxzvBcbODv/+f+n0uc=" ], "X-Amz-Request-Id": [ "9MD00YPBDG5VH7PP" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestKeys/unicode.replay ================================================ { "Initial": "AQAAAA7hTg0oHQ9qsQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "7f92f8c1df63a36d", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:41 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "F2EgNHUDlo8OkBUR8rvhUaU3dDvbXQEsmbG4RcG9cy3Py4EXbme6cfTh/G53rPHag3kW2uXcW+4=" ], "X-Amz-Request-Id": [ "9MDB3PA44FG7SQH4" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "40ec9a1ff3b1a62e", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:41 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:41 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "9dnOokJJRsJ3bKx1eAG61L7oJN/3hcqW0ZZrRDQ2cu4GTE8lhpIHGSBKApufhCNaPSMTibQnYpk=" ], "X-Amz-Request-Id": [ "9MD486HS8PSQ89GR" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "c8c4295b8d6e1371", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:41 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:41 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "8+WbFfzLqzF/iUcwIO8VDdWQZ7qgNN3g+NChnJ+DBb8yUJ9fOuwpV+GcIhz5l9HP5a6AbIw0Iog=" ], "X-Amz-Request-Id": [ "9MD14GYPQDHR9308" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "a78cc732ae5da0c6", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:41 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:41 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Q+JvkHtI8qGNQY5TXLl0zKqMIty6N9meFzfE0eoU9EfGjkyZjFyvhekSTzdmOtWH13b9yz3Yk8E=" ], "X-Amz-Request-Id": [ "9MDBDYA4NQMW0613" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "30c8e8f2040b54a5", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA-copy?x-id=CopyObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Copy-Source": [ "go-cloud-testing-2%2Fweird-keys%E2%98%BA%E2%98%BA%E2%98%BA" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:41 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "BHU1oyFUDEWGlAgISqFxyDyfwVIZhKkFqbgyGHf4RqLwqA7HizuicJ8/fGtPegr1X6JzVe2XWS0=" ], "X-Amz-Request-Id": [ "9MD3CCHA6W4RTWGF" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvcHlPYmplY3RSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI4OjQxLjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4iNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTIiPC9FVGFnPjxDaGVja3N1bUNSQzMyPk5oQ21oZz09PC9DaGVja3N1bUNSQzMyPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48L0NvcHlPYmplY3RSZXN1bHQ+" } }, { "ID": "de6478d30bef2390", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA-copy?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:41 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:41 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "pE8Pcr2tuZlEmkVZFbbKwSbigM3mBTkvtOlph4Jrpy4O/y6fTaGT98iJNR4MIt9ERQIdTD+zK2A=" ], "X-Amz-Request-Id": [ "9MDEBKPR0EBN08M7" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8=" } }, { "ID": "f122a56d2c80181d", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA-copy", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:41 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:41 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "G3lv9ykP8UCGD0EUNWJxxpQ050FwdQyhwzzIl+0Fn3qmPYEjyfE9qbrYgjA4xus5KdNRYuf0CLg=" ], "X-Amz-Request-Id": [ "9MDEQVKHMA1HEY2G" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "57e880acf175c7f7", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA-copy?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:41 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "ZDd7XOOKz36KOXKKplf/fG4hdqAZcp01ayj3+PqjSmlI2+njzIY/b31RqRY7bWDI0PWUirENqCw=" ], "X-Amz-Request-Id": [ "9MD3WQ927A321ECG" ] }, "Body": "" } }, { "ID": "ffdec52d7a47e6ce", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:41 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:41 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "QXpam48e4bysuTAbX93vSosbYCEMPCH8p9HeRFV197l3DrAhI8DulGfpNist/i+mOh75q1mbVxI=" ], "X-Amz-Request-Id": [ "9MD8Y2BPDVZMDGNW" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "3a46e242ddebcfaf", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/weird-keys%E2%98%BA%E2%98%BA%E2%98%BA?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:41 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "0LsI9+3kmXBF3m5I6HTVhnBkxqsnEK0vP1lnNb1XXwbrG+3iB5RBfa4wr4LzdILSIoEEi375g04=" ], "X-Amz-Request-Id": [ "9MD4MQWNFXRN08T2" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestList/PaginationConsistencyAfterDelete.replay ================================================ { "Initial": "AQAAAA7hTg0XEBn4fAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "a5f70a80aa28064a", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?max-keys=1000\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:24 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "+uj1elhrYWUJD8+A0qxCe+nlyb/kiFAW74fecbDdYx8KmAvBCJ0wHk+T+UlRYaeiFovb3+731JiH7CO6sTpcdJ7pY3Mlg7X4" ], "X-Amz-Request-Id": [ "1RASQ5M6T350EXPQ" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxNYXJrZXI+PC9NYXJrZXI+PE1heEtleXM+MTAwMDwvTWF4S2V5cz48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWxpc3QtMDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxNS4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItbGlzdC0xPC9LZXk+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI3OjU4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48Q2hlY2tzdW1BbGdvcml0aG0+Q1JDMzI8L0NoZWNrc3VtQWxnb3JpdGhtPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1saXN0LTI8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTUuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "c23f0d2a9be6e8d7", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?max-keys=2\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:24 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "FtR1Rpofi7I1MfEsewfXbWLF5K5dS5yblsz+DJByjU7RvHU0p8on3KFoJT5Jql/ojtdpVaculR07kTziDyHHxHJVoE2GZgwO" ], "X-Amz-Request-Id": [ "1RAR65YQTP44JYET" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxNYXJrZXI+PC9NYXJrZXI+PE1heEtleXM+MjwvTWF4S2V5cz48SXNUcnVuY2F0ZWQ+dHJ1ZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItbGlzdC0wPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE1LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1saXN0LTE8L0tleT48TGFzdE1vZGlmaWVkPjIwMjYtMDMtMTlUMTU6Mjc6NTguMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxDaGVja3N1bUFsZ29yaXRobT5DUkMzMjwvQ2hlY2tzdW1BbGdvcml0aG0+PENoZWNrc3VtVHlwZT5GVUxMX09CSkVDVDwvQ2hlY2tzdW1UeXBlPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "c33cac69793b3e0a", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-list-1", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:24 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:27:58 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "IytZ+vUu6mJO9rVP4x7aSuQ/KKQQhWAXGD+/QRsgCHgBtDA6jmSO5IJk50MS1pmgwagcjQE+OjljJcdrtNAPcRu2Kksks8NT" ], "X-Amz-Request-Id": [ "1RATPBZ86ZDDF9WE" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "a719a1a1c4f8a18e", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-list-1?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:24 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "XhPTzR/Z9ajC0yjXbsfYEmYip8ljmuCTZxUDXDgYnYWHxOJVqI+s87nZLd3f+6HUyeTaSGoX68SpbXkzyjJ4hmo/JkN242kZ" ], "X-Amz-Request-Id": [ "1RASMT1EXHZN8WAT" ] }, "Body": "" } }, { "ID": "981f70ba4993b7b3", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?marker=blob-for-list-1\u0026max-keys=1000\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:24 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "n75qscC3p10Na+q4alGabqltP4gUrly8ECaPKfhtWni33mf6HDsgCvWenY0G2IOQ6ws9MFhL2Gwd/FZ68V0N1OXdo+/b/Uj+" ], "X-Amz-Request-Id": [ "1RAJXXSNHPHFT6QP" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxNYXJrZXI+YmxvYi1mb3ItbGlzdC0xPC9NYXJrZXI+PE1heEtleXM+MTAwMDwvTWF4S2V5cz48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWxpc3QtMjwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxNS4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "96e8d5e59eaad7c3", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-list-1?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:24 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "7rD7/0nwXBKtSo2LoFhN7yuddshOEpkW1F5KmBEBfeHI1878gksjZ4aYKYlVEIiquLqnciMSO+WKUZN2gXG4agxP5ntvLq6K" ], "X-Amz-Request-Id": [ "1RASVBXDBT764HSK" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestList/PaginationConsistencyAfterInsert.replay ================================================ { "Initial": "AQAAAA7hTg0WON3UfwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "12fa0922d0ce71e7", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?max-keys=1000\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:24 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "HM1V33FcJQdQoP4Z5Vdqs/Qjzb9VOEZmqYoBVdheHw3al86Df17tUwP7Gi9BmV/1wuGvmL5w0S0=" ], "X-Amz-Request-Id": [ "1RAQ6KDF5F6Y63PY" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxNYXJrZXI+PC9NYXJrZXI+PE1heEtleXM+MTAwMDwvTWF4S2V5cz48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWxpc3QtMDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxNS4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItbGlzdC0xPC9LZXk+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI3OjU4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48Q2hlY2tzdW1BbGdvcml0aG0+Q1JDMzI8L0NoZWNrc3VtQWxnb3JpdGhtPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1saXN0LTI8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTUuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "dbef8630177dd0a7", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?max-keys=2\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:24 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "cOhjM1jwwdjBkKhFTXv571RdNreKW9S/s+bB+0ZwtBKjQHihVMfbwccWnTlnwgWHq2zvOMuNWuI=" ], "X-Amz-Request-Id": [ "1RAKACDFRG3T8X0V" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxNYXJrZXI+PC9NYXJrZXI+PE1heEtleXM+MjwvTWF4S2V5cz48SXNUcnVuY2F0ZWQ+dHJ1ZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItbGlzdC0wPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE1LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1saXN0LTE8L0tleT48TGFzdE1vZGlmaWVkPjIwMjYtMDMtMTlUMTU6Mjc6NTguMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxDaGVja3N1bUFsZ29yaXRobT5DUkMzMjwvQ2hlY2tzdW1BbGdvcml0aG0+PENoZWNrc3VtVHlwZT5GVUxMX09CSkVDVDwvQ2hlY2tzdW1UeXBlPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "c109a29170b7d558", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-list-0a?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:24 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "cROsV61rE6mx9rPN4gYchBpW+gW29dGBJ5bVp7WYOVryZoe5h8aZIhztvlA/v0NwrB8wm7dIIGc=" ], "X-Amz-Request-Id": [ "1RAPXKVD472EZG5N" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "bc58e67b8e5a06fc", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?marker=blob-for-list-1\u0026max-keys=1000\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:24 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "XfrlUBG3YjmhJ4+cTckuV3/g+Mo9AVHSig6fiW3xQdPElmHY2/xd3taDtN71NTAnzX6kc6C54kM=" ], "X-Amz-Request-Id": [ "1RAW1RK82JKKF9RH" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxNYXJrZXI+YmxvYi1mb3ItbGlzdC0xPC9NYXJrZXI+PE1heEtleXM+MTAwMDwvTWF4S2V5cz48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWxpc3QtMjwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxNS4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "d89035b1cb0ab829", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-list-0a", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:24 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:24 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "vdmr3rya1f2WNKhgC2g1A6wtGhJZPMdP4E3PR1c67tvhvtQAJ9c0sp2EqK0aDMq+rGoDo9PM75A=" ], "X-Amz-Request-Id": [ "1RAX18GQR6BCWE4E" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "cd00d9dc08a91e23", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-list-0a?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:24 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "L1lD6IhxRV1Kbzfvr47u7OdiAFDE8iZMvk0Eu83QNUwZ9lMDC3W1SGFABfH8gP3OVX5O4UVirHw=" ], "X-Amz-Request-Id": [ "1RAWEA9386GTKMZZ" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestList/by_1.replay ================================================ { "Initial": "AQAAAA7hTg0WGebBVgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "fcf191e94a011bac", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?max-keys=1000\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:23 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "iIXVPSijGnGGAFEPX1/8HsNlVklfBYRCckUCMXoW8OW+gWGVcrJUItyopyyoSfICtnEAJeP2NN2YJ2WQj4ZU3XalbxcRDv5x" ], "X-Amz-Request-Id": [ "N992E219WHRG6XCD" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxNYXJrZXI+PC9NYXJrZXI+PE1heEtleXM+MTAwMDwvTWF4S2V5cz48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWxpc3QtMDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxNS4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItbGlzdC0xPC9LZXk+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI3OjU4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48Q2hlY2tzdW1BbGdvcml0aG0+Q1JDMzI8L0NoZWNrc3VtQWxnb3JpdGhtPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1saXN0LTI8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTUuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "9946b81a8656fbfe", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?max-keys=1\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:23 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "88W924qi64OYHHGgYQrH2O60UOE+SvZu340Zf4+j9IDY8pbyjrFz6OKZI4uPcrMsgAQC7czxuiP5jrvukwYu5nDkT3EN0A0t" ], "X-Amz-Request-Id": [ "N99FNRXVFENAG9ZH" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxNYXJrZXI+PC9NYXJrZXI+PE1heEtleXM+MTwvTWF4S2V5cz48SXNUcnVuY2F0ZWQ+dHJ1ZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItbGlzdC0wPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE1LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "47eb9b795870a086", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?marker=blob-for-list-0\u0026max-keys=1\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:23 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "XwbW9xgKP+dti2Svm/EG6vdNUGoBGQ4bw/Jn9hqjGDbS3Cb8xOMCstKPnNGcxKLfAFOrWh+jGSq+th7ndJnYNZczdtFq2lVe" ], "X-Amz-Request-Id": [ "N99DG7VQB1D2318F" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxNYXJrZXI+YmxvYi1mb3ItbGlzdC0wPC9NYXJrZXI+PE1heEtleXM+MTwvTWF4S2V5cz48SXNUcnVuY2F0ZWQ+dHJ1ZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItbGlzdC0xPC9LZXk+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI3OjU4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48Q2hlY2tzdW1BbGdvcml0aG0+Q1JDMzI8L0NoZWNrc3VtQWxnb3JpdGhtPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "ea4e1b26effa99d8", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?marker=blob-for-list-1\u0026max-keys=1\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:23 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "3sM4x34+OJ3a1tRjNsrlmEDQpK1vo8uZE9yb310dGpSDRyK6NuZu0d+LBLFjuSvTHDQxPnkAPegJlLhska/nO7rFW71QMNiW" ], "X-Amz-Request-Id": [ "N99F19WGPQAGA3PQ" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxNYXJrZXI+YmxvYi1mb3ItbGlzdC0xPC9NYXJrZXI+PE1heEtleXM+MTwvTWF4S2V5cz48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWxpc3QtMjwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxNS4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestList/by_2.replay ================================================ { "Initial": "AQAAAA7hTg0WJuC3BQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "c6ce6b73bdc17e45", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?max-keys=1000\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:23 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "WL3p07ih4yD/wba8hmT3Y7vxXNH39+jqAJGgBvBoPApbCjsxSjvr6KLEHx0rNntZYDyk1O0/DTM=" ], "X-Amz-Request-Id": [ "N99DWP958KA67FR0" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxNYXJrZXI+PC9NYXJrZXI+PE1heEtleXM+MTAwMDwvTWF4S2V5cz48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWxpc3QtMDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxNS4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItbGlzdC0xPC9LZXk+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI3OjU4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48Q2hlY2tzdW1BbGdvcml0aG0+Q1JDMzI8L0NoZWNrc3VtQWxnb3JpdGhtPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1saXN0LTI8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTUuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "03a9a3d683130245", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?max-keys=2\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:23 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "Dsc+HiIYfuUAZGhr5nAgGUVWfLFvvLmL3R4xXHSYHgygzFQcng5I1RPPA33IBfEQMNUffzKPhLI=" ], "X-Amz-Request-Id": [ "N99CPNAFYF22NJAD" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxNYXJrZXI+PC9NYXJrZXI+PE1heEtleXM+MjwvTWF4S2V5cz48SXNUcnVuY2F0ZWQ+dHJ1ZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItbGlzdC0wPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE1LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1saXN0LTE8L0tleT48TGFzdE1vZGlmaWVkPjIwMjYtMDMtMTlUMTU6Mjc6NTguMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxDaGVja3N1bUFsZ29yaXRobT5DUkMzMjwvQ2hlY2tzdW1BbGdvcml0aG0+PENoZWNrc3VtVHlwZT5GVUxMX09CSkVDVDwvQ2hlY2tzdW1UeXBlPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "b2242c210ee880d6", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?marker=blob-for-list-1\u0026max-keys=2\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:23 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "sRhxYlZ9iySUh+/7ZjE6+UyIpJD1skL7ltypqRfRsH1ODeE+yFKfvio0hMh1DeSk2Co++OI0444=" ], "X-Amz-Request-Id": [ "N9944X4YTMZ4S6A8" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxNYXJrZXI+YmxvYi1mb3ItbGlzdC0xPC9NYXJrZXI+PE1heEtleXM+MjwvTWF4S2V5cz48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWxpc3QtMjwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxNS4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestList/by_3.replay ================================================ { "Initial": "AQAAAA7hTg0WMIDaZAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "0785736a90a9cf32", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?max-keys=1000\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:23 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "P9SutrjEIAe3qwxcVziRDnkeIzslnvwmsQjU95bUWThZ4shb80xm//JkbKCUvBQsdoEMVx2mSBM=" ], "X-Amz-Request-Id": [ "N99DRHGXBHNE17N5" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxNYXJrZXI+PC9NYXJrZXI+PE1heEtleXM+MTAwMDwvTWF4S2V5cz48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWxpc3QtMDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxNS4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItbGlzdC0xPC9LZXk+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI3OjU4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48Q2hlY2tzdW1BbGdvcml0aG0+Q1JDMzI8L0NoZWNrc3VtQWxnb3JpdGhtPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1saXN0LTI8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTUuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "d0fef238256af632", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?max-keys=3\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:23 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "qUoZNooiBdd8s8/h40JGGSm47QvvOSkGPA4r+uMATG6DDVBQmRxFNncLieGbqE1yvKS+TDdo+Fw=" ], "X-Amz-Request-Id": [ "N99922YYV9JGKQ6P" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxNYXJrZXI+PC9NYXJrZXI+PE1heEtleXM+MzwvTWF4S2V5cz48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWxpc3QtMDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxNS4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItbGlzdC0xPC9LZXk+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI3OjU4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48Q2hlY2tzdW1BbGdvcml0aG0+Q1JDMzI8L0NoZWNrc3VtQWxnb3JpdGhtPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1saXN0LTI8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTUuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestList/exactly_1_object_due_to_prefix.replay ================================================ { "Initial": "AQAAAA7hTg0WCR4JvwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "a560d9f5fdc251cb", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?max-keys=1000\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:23 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "AaZ9WlVUGcb1CdJHkwVTZyRypC4IcyCRCn7af80YjLNNYTUa4BcpEYPJeURMAM8ebL2QDGTzShE=" ], "X-Amz-Request-Id": [ "N99CCFRA9Z9KGYY1" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxNYXJrZXI+PC9NYXJrZXI+PE1heEtleXM+MTAwMDwvTWF4S2V5cz48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWxpc3QtMDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxNS4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItbGlzdC0xPC9LZXk+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI3OjU4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48Q2hlY2tzdW1BbGdvcml0aG0+Q1JDMzI8L0NoZWNrc3VtQWxnb3JpdGhtPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1saXN0LTI8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTUuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "5ad1d861ec76163f", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?max-keys=1000\u0026prefix=blob-for-list-1", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:23 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "rI3Zs98+nR3Nw/CQ4HTBROwcdIxjJqXH/ytCB2rsxU3hUj7OrDAQ20ULbZ0ah2YRDVFpRLM+FyI=" ], "X-Amz-Request-Id": [ "N998PYN81TQKSSGH" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdC0xPC9QcmVmaXg+PE1hcmtlcj48L01hcmtlcj48TWF4S2V5cz4xMDAwPC9NYXhLZXlzPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItbGlzdC0xPC9LZXk+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI3OjU4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48Q2hlY2tzdW1BbGdvcml0aG0+Q1JDMzI8L0NoZWNrc3VtQWxnb3JpdGhtPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48L0xpc3RCdWNrZXRSZXN1bHQ+" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestList/no_objects.replay ================================================ { "Initial": "AQAAAA7hTg0WAHcJIgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "939a7a5f9f0f809b", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?max-keys=1000\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:23 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "c2DeWTNJQxN+ihGIm7rH/SDdjKsox7xfxcCEOZ5eARITbz+v+yW80Vo8xc+8MWeZTDHgtis+jWWQkSVsgWiq73IbMawuvAGD" ], "X-Amz-Request-Id": [ "N9917T8PXZEEQDJK" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxNYXJrZXI+PC9NYXJrZXI+PE1heEtleXM+MTAwMDwvTWF4S2V5cz48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWxpc3QtMDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxNS4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItbGlzdC0xPC9LZXk+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI3OjU4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48Q2hlY2tzdW1BbGdvcml0aG0+Q1JDMzI8L0NoZWNrc3VtQWxnb3JpdGhtPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1saXN0LTI8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTUuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "4a8f0fc0ce8983a7", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?max-keys=1000\u0026prefix=no-objects-with-this-prefix", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:23 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "lS77zKr9+b92jV5yLZwFpFK4uPlrJQ9FZjXGqahhw7vpDiik68HXKyS7zUimG+yJu8NlYoi4HPRniqfNUoLCy9vTYJMoL5Gb" ], "X-Amz-Request-Id": [ "N991ZY8NBMJGAEYK" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+bm8tb2JqZWN0cy13aXRoLXRoaXMtcHJlZml4PC9QcmVmaXg+PE1hcmtlcj48L01hcmtlcj48TWF4S2V5cz4xMDAwPC9NYXhLZXlzPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestList/no_pagination.replay ================================================ { "Initial": "AQAAAA7hTg0WEXaKOwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "a495f9e813168961", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?max-keys=1000\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:23 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "fIu58vTWexGOA5EzlUzPoPVAO+y6J7uXi1c1FpJx44NF/9SppkQaVCCK+8Wi+OzrAeMc2zvCHrpNiBH9Uvoq1G2K8JERH+On" ], "X-Amz-Request-Id": [ "N999VSA2QJ41WXJH" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxNYXJrZXI+PC9NYXJrZXI+PE1heEtleXM+MTAwMDwvTWF4S2V5cz48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWxpc3QtMDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxNS4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItbGlzdC0xPC9LZXk+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI3OjU4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48Q2hlY2tzdW1BbGdvcml0aG0+Q1JDMzI8L0NoZWNrc3VtQWxnb3JpdGhtPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1saXN0LTI8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTUuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "dc55ff268b43400d", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?max-keys=1000\u0026prefix=blob-for-list", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:23 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "iK58nX7r2VxVlmsSGOFbKmBT5v3fiAoFp952sOtEqQ5mR4vwXkXkJg/UpjloSEeF4RfiaIskJ6o5dV87qEGqqaeY5r7rmUXp" ], "X-Amz-Request-Id": [ "N998RZFAPSB7E1MH" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbGlzdDwvUHJlZml4PjxNYXJrZXI+PC9NYXJrZXI+PE1heEtleXM+MTAwMDwvTWF4S2V5cz48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWxpc3QtMDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxNS4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItbGlzdC0xPC9LZXk+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI3OjU4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48Q2hlY2tzdW1BbGdvcml0aG0+Q1JDMzI8L0NoZWNrc3VtQWxnb3JpdGhtPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1saXN0LTI8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTUuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestListDelimiters/abc.replay ================================================ { "Initial": "AQAAAA7hTg0YNMT6rgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "214fc8fbf7eab1f5", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?max-keys=1000\u0026prefix=blob-for-delimiters-abc", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:25 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "o4HADU+wiDqAe018qmpTgJh7xUKUx1maxuPxZ63wC5pSARAqAmgWlVJtW8/speOWerN+8cs7F14=" ], "X-Amz-Request-Id": [ "9MR16G71NE5KFY9F" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmM8L1ByZWZpeD48TWFya2VyPjwvTWFya2VyPjxNYXhLZXlzPjEwMDA8L01heEtleXM+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmNhLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxOS4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjYi50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTkuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY3N1YmRpcmFiY2MudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE5LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmNzdWJkaXJhYmNkLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxOS4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIyYWJjZS50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjYtMDMtMTlUMTU6Mjg6MDAuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxDaGVja3N1bUFsZ29yaXRobT5DUkMzMjwvQ2hlY2tzdW1BbGdvcml0aG0+PENoZWNrc3VtVHlwZT5GVUxMX09CSkVDVDwvQ2hlY2tzdW1UeXBlPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZi50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTkuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "28e8df5e4d046e1e", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?max-keys=1000\u0026prefix=blob-for-delimiters-abc", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:26 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "fIzsf5EG6ZudXfen1Q5y3bBYLUvg5KATmA7R7FgzAK5wc7CL8evQguBVnlYIbx2yBrXBVkmKfow=" ], "X-Amz-Request-Id": [ "A7KXE1PBQJEZRKB7" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmM8L1ByZWZpeD48TWFya2VyPjwvTWFya2VyPjxNYXhLZXlzPjEwMDA8L01heEtleXM+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmNhLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxOS4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjYi50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTkuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY3N1YmRpcmFiY2MudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE5LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmNzdWJkaXJhYmNkLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxOS4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIyYWJjZS50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjYtMDMtMTlUMTU6Mjg6MDAuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxDaGVja3N1bUFsZ29yaXRobT5DUkMzMjwvQ2hlY2tzdW1BbGdvcml0aG0+PENoZWNrc3VtVHlwZT5GVUxMX09CSkVDVDwvQ2hlY2tzdW1UeXBlPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZi50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTkuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "1af06028f93cf144", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=abc\u0026max-keys=1000\u0026prefix=blob-for-delimiters-abc", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:26 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "kmoyenrcZyoiqZ6COEl+5X0CBtXH0ssVLyn5YvGCseFCmsBG6RaJ4/Zcjt3UnQA4ApIUU6UDqrs=" ], "X-Amz-Request-Id": [ "A7KH8F7RER44HWRS" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmM8L1ByZWZpeD48TWFya2VyPjwvTWFya2VyPjxNYXhLZXlzPjEwMDA8L01heEtleXM+PERlbGltaXRlcj5hYmM8L0RlbGltaXRlcj48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZi50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTkuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiYzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PENvbW1vblByZWZpeGVzPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIyYWJjPC9QcmVmaXg+PC9Db21tb25QcmVmaXhlcz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "08da6c314a4b349e", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=abc\u0026max-keys=1000\u0026prefix=blob-for-delimiters-abcdir1abc", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:26 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "HVf52GGSk+cUl1wmUEr2OYWSaUqIZFG/a2GvFENCSI3xAQwyGSGOXyFMN3zfrm9df1gfwzn24/0=" ], "X-Amz-Request-Id": [ "A7KS7X7GRP6503HZ" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjPC9QcmVmaXg+PE1hcmtlcj48L01hcmtlcj48TWF4S2V5cz4xMDAwPC9NYXhLZXlzPjxEZWxpbWl0ZXI+YWJjPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmNhLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxOS4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjYi50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTkuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiY3N1YmRpcmFiYzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "fa8b2f7830890907", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=abc\u0026max-keys=1000\u0026prefix=blob-for-delimiters-abcdir1abcsubdirabc", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:26 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "soWG1mNBbdZD5rV5BMdJm46kxNv+1sr4/LPLKurcU6PCZjakr5O5h6/JGUeQDmSdnDT3VfgY+o8=" ], "X-Amz-Request-Id": [ "A7KHEZYW7W0PXG7T" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjc3ViZGlyYWJjPC9QcmVmaXg+PE1hcmtlcj48L01hcmtlcj48TWF4S2V5cz4xMDAwPC9NYXhLZXlzPjxEZWxpbWl0ZXI+YWJjPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjFhYmNzdWJkaXJhYmNjLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxOS4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIxYWJjc3ViZGlyYWJjZC50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTkuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "8acadd7b9dc30c4c", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=abc\u0026max-keys=1000\u0026prefix=blob-for-delimiters-abcdir2abc", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:26 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "A8qKsBK9pEGZWLCC6cHQ33SiMd7QQwbbQTPrkAdunNBLsGyAhQGNwM0c/RBy3N51zIu2RIOjQKY=" ], "X-Amz-Request-Id": [ "A7KMGA1AAHFSBAN4" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmNkaXIyYWJjPC9QcmVmaXg+PE1hcmtlcj48L01hcmtlcj48TWF4S2V5cz4xMDAwPC9NYXhLZXlzPjxEZWxpbWl0ZXI+YWJjPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLWFiY2RpcjJhYmNlLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNi0wMy0xOVQxNToyODowMC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PENoZWNrc3VtQWxnb3JpdGhtPkNSQzMyPC9DaGVja3N1bUFsZ29yaXRobT48Q2hlY2tzdW1UeXBlPkZVTExfT0JKRUNUPC9DaGVja3N1bVR5cGU+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "71bbd24b4fb41b2f", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=abc\u0026max-keys=1\u0026prefix=blob-for-delimiters-abc", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:26 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "CnehBzYrDxX/Jz9TApf7WWlS2Tc+uZDNijMLDhxG/EceSHAI0sMafra8sUVa7iVUPwlAGLslJyQ=" ], "X-Amz-Request-Id": [ "A7KTQZV94BSTQ6H2" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmM8L1ByZWZpeD48TWFya2VyPjwvTWFya2VyPjxOZXh0TWFya2VyPmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiYzwvTmV4dE1hcmtlcj48TWF4S2V5cz4xPC9NYXhLZXlzPjxEZWxpbWl0ZXI+YWJjPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPnRydWU8L0lzVHJ1bmNhdGVkPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiYzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "58935df1796fe14f", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=abc\u0026marker=blob-for-delimiters-abcdir1abc\u0026max-keys=1\u0026prefix=blob-for-delimiters-abc", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:26 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "6v+XM7088hxZjtdgydef77c3Wxheul/+SgOHCOes1Cmnm9eafP7SevtxarSuSeReuUHdwA0KDhM=" ], "X-Amz-Request-Id": [ "A7KR3Y6SSW23AMCS" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmM8L1ByZWZpeD48TWFya2VyPmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiYzwvTWFya2VyPjxOZXh0TWFya2VyPmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMmFiYzwvTmV4dE1hcmtlcj48TWF4S2V5cz4xPC9NYXhLZXlzPjxEZWxpbWl0ZXI+YWJjPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPnRydWU8L0lzVHJ1bmNhdGVkPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMmFiYzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "1e6280bc2aeff6c2", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=abc\u0026marker=blob-for-delimiters-abcdir2abc\u0026max-keys=1\u0026prefix=blob-for-delimiters-abc", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:26 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "SwkhietCbj47LrTkZN5qI7m/pyclUwgE84IWmIYu7dLnsGooJvoNf+38NIPY38zbbWe5rVYSXRo=" ], "X-Amz-Request-Id": [ "A7KTG48CVK4MM167" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmM8L1ByZWZpeD48TWFya2VyPmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMmFiYzwvTWFya2VyPjxNYXhLZXlzPjE8L01heEtleXM+PERlbGltaXRlcj5hYmM8L0RlbGltaXRlcj48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZi50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTkuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "eceadf64e718fbdd", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-delimiters-abcdir2abce.txt", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:26 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:00 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "bXvlQoKr16qV/ATOgjDqmvrrqHWo1la975CC3XfRUjzEQg863m3fVB8eujEWBs/3nS2CsroKWp0=" ], "X-Amz-Request-Id": [ "A7KVAAQPTZWNKCRD" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "4e5c13ff8e3b215e", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-delimiters-abcdir2abce.txt?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:26 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "GtLenlUc/OHqFD2ZaTFb+CeSo2DojXssKv5ebPCJnTcuu832kxwfT4bpYVZf9iDqTO3YN5CJJ7Q=" ], "X-Amz-Request-Id": [ "A7KW4515DVVSTDN1" ] }, "Body": "" } }, { "ID": "4de92d5343663f2e", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=abc\u0026max-keys=1000\u0026prefix=blob-for-delimiters-abc", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:26 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "VPGyQPZ9COH/c1yRc4xHomNHWJzenbrcc7vzK4MJIVrdUbcU0jnF+7433kDeQaLUB1XLT++0vLc=" ], "X-Amz-Request-Id": [ "A7KX2M7EE29S2FJS" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1hYmM8L1ByZWZpeD48TWFya2VyPjwvTWFya2VyPjxNYXhLZXlzPjEwMDA8L01heEtleXM+PERlbGltaXRlcj5hYmM8L0RlbGltaXRlcj48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZi50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTkuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRlbGltaXRlcnMtYWJjZGlyMWFiYzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "a3b6a844e1e0b994", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-delimiters-abcdir2abce.txt?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:26 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "bBmin8oXs45WVTPEcZPLvmO1zkqXjTIWyE+kJHRwMN/I+GC3GNnESY8aL1oS1NpiNMLkocK15HU=" ], "X-Amz-Request-Id": [ "A7KMNP01FCTAEZ7N" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestListDelimiters/backslash.replay ================================================ { "Initial": "AQAAAA7hTg0YEpLLtAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "2735b673da529c58", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?max-keys=1000\u0026prefix=blob-for-delimiters-%5C", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:25 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "hFIhAJpwUAdor9hhn21Ec5AYnEGqkwBoc9DtM/F29na6GbxkZhpANgiVi6k0Q88r/GmrJfLITOeKSvPHdjTwt+AVh73LrrCu" ], "X-Amz-Request-Id": [ "9MR34N0S80CBGNKF" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1cPC9QcmVmaXg+PE1hcmtlcj48L01hcmtlcj48TWF4S2V5cz4xMDAwPC9NYXhLZXlzPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy1cZGlyMVxhLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjo0MToyNy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy1cZGlyMVxiLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjo0MToyNy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy1cZGlyMVxzdWJkaXJcYy50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6NDE6MjcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtXGRpcjFcc3ViZGlyXGQudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjQxOjI3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLVxkaXIyXGUudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI3OjU5LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48Q2hlY2tzdW1BbGdvcml0aG0+Q1JDMzI8L0NoZWNrc3VtQWxnb3JpdGhtPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLVxmLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjo0MToyNy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "3ce136488bac51b2", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?max-keys=1000\u0026prefix=blob-for-delimiters-%5C", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:25 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "t7Ug43hbBoK+//LUNdpL5lA6aiY2HWsqZ/EvIlRjUXzlYs5a3ahk8VvFcY2dP6Y6ZrDzM1HGMHyO6EYzux37dtsnfMRnGRQG" ], "X-Amz-Request-Id": [ "9MR8VQGE6SX09MV2" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1cPC9QcmVmaXg+PE1hcmtlcj48L01hcmtlcj48TWF4S2V5cz4xMDAwPC9NYXhLZXlzPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy1cZGlyMVxhLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjo0MToyNy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy1cZGlyMVxiLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjo0MToyNy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy1cZGlyMVxzdWJkaXJcYy50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6NDE6MjcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtXGRpcjFcc3ViZGlyXGQudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjQxOjI3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLVxkaXIyXGUudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI3OjU5LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48Q2hlY2tzdW1BbGdvcml0aG0+Q1JDMzI8L0NoZWNrc3VtQWxnb3JpdGhtPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLVxmLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjo0MToyNy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "0ffe97cc8f4bbe1f", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%5C\u0026max-keys=1000\u0026prefix=blob-for-delimiters-%5C", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:25 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "Jq9auZIBF6SRLIPVOCqvI7WG1UzSQnTqmtNsBkxAtbbv7pLqP3O1F/e7nIzHlPX5d0LwiUGe06zHCrc6YzrLC1njP5oAD1Z8" ], "X-Amz-Request-Id": [ "9MRAAXKNKQ6EDDMP" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1cPC9QcmVmaXg+PE1hcmtlcj48L01hcmtlcj48TWF4S2V5cz4xMDAwPC9NYXhLZXlzPjxEZWxpbWl0ZXI+XDwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy1cZi50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6NDE6MjcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRlbGltaXRlcnMtXGRpcjFcPC9QcmVmaXg+PC9Db21tb25QcmVmaXhlcz48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLVxkaXIyXDwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "08b6be712a32189f", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%5C\u0026max-keys=1000\u0026prefix=blob-for-delimiters-%5Cdir1%5C", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:25 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "wAYwuqZQ6W+odk5HOjhEWVspqPUB1EfKr5UDuYd0bJg8A8Xp80hQiASBkiY7A4n2SP78rSjvg2JprCyVrz3Y0HkQRkd6OUgp" ], "X-Amz-Request-Id": [ "9MRB84JHHTJ349KM" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1cZGlyMVw8L1ByZWZpeD48TWFya2VyPjwvTWFya2VyPjxNYXhLZXlzPjEwMDA8L01heEtleXM+PERlbGltaXRlcj5cPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLVxkaXIxXGEudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjQxOjI3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLVxkaXIxXGIudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjQxOjI3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLVxkaXIxXHN1YmRpclw8L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "7d43c6eceff27e4a", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%5C\u0026max-keys=1000\u0026prefix=blob-for-delimiters-%5Cdir1%5Csubdir%5C", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:25 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "y8I4L/I4Emuwk2bwGC5N7/6updBk3J/rU9fValX2iib99BmuB/JW8B6bKtoJ0KxERZEGa6h9H239NbD1f8m/f7MLIzD7pnbu" ], "X-Amz-Request-Id": [ "9MR8V4WSG24R98BZ" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1cZGlyMVxzdWJkaXJcPC9QcmVmaXg+PE1hcmtlcj48L01hcmtlcj48TWF4S2V5cz4xMDAwPC9NYXhLZXlzPjxEZWxpbWl0ZXI+XDwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy1cZGlyMVxzdWJkaXJcYy50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6NDE6MjcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtXGRpcjFcc3ViZGlyXGQudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjQxOjI3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "2cb907be78a9dc35", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%5C\u0026max-keys=1000\u0026prefix=blob-for-delimiters-%5Cdir2%5C", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:25 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "shz8moZPIRQC89hQDSZvjR/KJYk9lo18arlYeNPR6LwtoWza4jW/7oE/uN3lQ9jEBlEbZIeI1mTiveL0b/A0nm05nclHIB8u" ], "X-Amz-Request-Id": [ "9MR80PBF765HJPJM" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1cZGlyMlw8L1ByZWZpeD48TWFya2VyPjwvTWFya2VyPjxNYXhLZXlzPjEwMDA8L01heEtleXM+PERlbGltaXRlcj5cPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLVxkaXIyXGUudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI3OjU5LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48Q2hlY2tzdW1BbGdvcml0aG0+Q1JDMzI8L0NoZWNrc3VtQWxnb3JpdGhtPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "7b3d5c9f8e5382fc", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%5C\u0026max-keys=1\u0026prefix=blob-for-delimiters-%5C", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:25 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "5Aa6teL+O4dFLjAR4sLIXwfaB2R+f2mulGeXFD7zKYlospO2Hyohrw/NE5I1viuIrHSc88GCe+bmeH1HWj3xpzJhKoVJHJi8" ], "X-Amz-Request-Id": [ "9MR369S0V3EW1GW8" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1cPC9QcmVmaXg+PE1hcmtlcj48L01hcmtlcj48TmV4dE1hcmtlcj5ibG9iLWZvci1kZWxpbWl0ZXJzLVxkaXIxXDwvTmV4dE1hcmtlcj48TWF4S2V5cz4xPC9NYXhLZXlzPjxEZWxpbWl0ZXI+XDwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD50cnVlPC9Jc1RydW5jYXRlZD48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLVxkaXIxXDwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "6afa28e768ac16fe", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%5C\u0026marker=blob-for-delimiters-%5Cdir1%5C\u0026max-keys=1\u0026prefix=blob-for-delimiters-%5C", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:25 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "VzKxOh1wazAcuDbMtN5jWRH8bQwIpS/+YF7fM71c88EdHdE/AzkG5Q9YTfcI/+jCvgf+hPeFiWur+UQFtqn0xV73aEBvfb78" ], "X-Amz-Request-Id": [ "9MRBSB4K3P6AJN0F" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1cPC9QcmVmaXg+PE1hcmtlcj5ibG9iLWZvci1kZWxpbWl0ZXJzLVxkaXIxXDwvTWFya2VyPjxOZXh0TWFya2VyPmJsb2ItZm9yLWRlbGltaXRlcnMtXGRpcjJcPC9OZXh0TWFya2VyPjxNYXhLZXlzPjE8L01heEtleXM+PERlbGltaXRlcj5cPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPnRydWU8L0lzVHJ1bmNhdGVkPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRlbGltaXRlcnMtXGRpcjJcPC9QcmVmaXg+PC9Db21tb25QcmVmaXhlcz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "d28fcab247fce296", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%5C\u0026marker=blob-for-delimiters-%5Cdir2%5C\u0026max-keys=1\u0026prefix=blob-for-delimiters-%5C", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:25 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "Q9neP6QpqM9eK6QZQzoxs76xYeg7rylv1OIA6huIfA4iy9ITovinC/s/eSOtRl2PDqYKeIUThI5r37soZMYmQ7jv+6Ghd18M" ], "X-Amz-Request-Id": [ "9MRFQGXNCJZX0YDD" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1cPC9QcmVmaXg+PE1hcmtlcj5ibG9iLWZvci1kZWxpbWl0ZXJzLVxkaXIyXDwvTWFya2VyPjxNYXhLZXlzPjE8L01heEtleXM+PERlbGltaXRlcj5cPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLVxmLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjo0MToyNy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "70feaf4d39334e8c", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-delimiters-%5Cdir2%5Ce.txt", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:25 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:27:59 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "AwGGkctayyU5gsm3qDuId1MThuJb4GAbWt0VhMRiBDtTZDDRiloBN5tynaX3GqUapKA97ePiI4eOt6qcs4qO31KQvwzepw19" ], "X-Amz-Request-Id": [ "9MR7WVD4KVZV4DTG" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "41be41367d26114f", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-delimiters-%5Cdir2%5Ce.txt?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:25 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "qtm4a+RXDRj7Op/V0q6fUSSdt1iXlEbCVSDgNfa7IZPf42kFfQsoBxcHXODWAor5CqPLhP6DfwBPoKzS+Z0+83L8173arv52" ], "X-Amz-Request-Id": [ "9MR38CRN35MTXQTT" ] }, "Body": "" } }, { "ID": "fdbb499adbfe2b9c", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%5C\u0026max-keys=1000\u0026prefix=blob-for-delimiters-%5C", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:25 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "eD32IW7T6OpV1Wzst4+Bj0/HIIH7gXMGsvpVPk2nj6Bx2gbgiDkZjfdGWm1VPfxJydHv9ZEfQFaCK4Eq8Z2gCRSDYPPYx8YB" ], "X-Amz-Request-Id": [ "9MR5SEJET0AH5741" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy1cPC9QcmVmaXg+PE1hcmtlcj48L01hcmtlcj48TWF4S2V5cz4xMDAwPC9NYXhLZXlzPjxEZWxpbWl0ZXI+XDwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy1cZi50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6NDE6MjcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRlbGltaXRlcnMtXGRpcjFcPC9QcmVmaXg+PC9Db21tb25QcmVmaXhlcz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "b98d26f10695b2b3", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-delimiters-%5Cdir2%5Ce.txt?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:25 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "YgL3taMBwkcRT8uGzgNL0EtkMeme/VtqGUDmZO5ZUIXa/qvwk5DKO8P49jD7bz8JjvMRzIvv/z0ei72fAzTOsELGYRbdHFMX" ], "X-Amz-Request-Id": [ "9MRDX6XP6SGMVF0C" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestListDelimiters/fwdslash.replay ================================================ { "Initial": "AQAAAA7hTg0XK8zLUgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "378b7bb1476ed3d3", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?max-keys=1000\u0026prefix=blob-for-delimiters-%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:24 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "xTZ20IUPkinI2X/ikVWKjMjn7wf7Hn7qdRmCxUaTLzKGObrm78V8ytn4JjX0kpuPEdgxnrFIcXkiw+prZZljz7HC7sCwonr0" ], "X-Amz-Request-Id": [ "1RAK3VN12BN3EPH7" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy0vPC9QcmVmaXg+PE1hcmtlcj48L01hcmtlcj48TWF4S2V5cz4xMDAwPC9NYXhLZXlzPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMS9hLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxOC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMS9iLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxOC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMS9zdWJkaXIvYy50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTguMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtL2RpcjEvc3ViZGlyL2QudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIyL2UudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI3OjU4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48Q2hlY2tzdW1BbGdvcml0aG0+Q1JDMzI8L0NoZWNrc3VtQWxnb3JpdGhtPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLS9mLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxOC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "d2cebd35c5b6c2ec", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?max-keys=1000\u0026prefix=blob-for-delimiters-%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:24 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "AAPaR+g8mcZUgrwSugRk6LgWtikVyMTmXL+UU0M2q3hmoTaylOc2qd7TgAFJXRcr2MPGzI97f6exWeGWpOOiKJnf977DpIn6" ], "X-Amz-Request-Id": [ "1RARF7VN8HSGS91P" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy0vPC9QcmVmaXg+PE1hcmtlcj48L01hcmtlcj48TWF4S2V5cz4xMDAwPC9NYXhLZXlzPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMS9hLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxOC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMS9iLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxOC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMS9zdWJkaXIvYy50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTguMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtL2RpcjEvc3ViZGlyL2QudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIyL2UudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI3OjU4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48Q2hlY2tzdW1BbGdvcml0aG0+Q1JDMzI8L0NoZWNrc3VtQWxnb3JpdGhtPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLS9mLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxOC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "a4410267e45ebc98", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026max-keys=1000\u0026prefix=blob-for-delimiters-%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:24 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "QplGN5hkhlYh/j0VQrbGHFpb+hfADcb+y470XprHH/ixfboJP7u3bn5fFXO90FkOSyU4eMdStUhLjb//d2apC2zMS4UB0CsI" ], "X-Amz-Request-Id": [ "1RAKHZ33EQCPMDP4" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy0vPC9QcmVmaXg+PE1hcmtlcj48L01hcmtlcj48TWF4S2V5cz4xMDAwPC9NYXhLZXlzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy0vZi50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTguMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRlbGltaXRlcnMtL2RpcjEvPC9QcmVmaXg+PC9Db21tb25QcmVmaXhlcz48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIyLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "7ef491230f91a977", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026max-keys=1000\u0026prefix=blob-for-delimiters-%2Fdir1%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:24 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "mfO8uPvdQeya+FMEiuvP39KLPlR8k1I43WVo57TnSlkTGs96+rAwm2s+o33p1nPBgMIYxiusWxUtoO3zR6MJk4pKxR84yPM4" ], "X-Amz-Request-Id": [ "1RAY4W4WV28G1MSC" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMS88L1ByZWZpeD48TWFya2VyPjwvTWFya2VyPjxNYXhLZXlzPjEwMDA8L01heEtleXM+PERlbGltaXRlcj4vPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxL2EudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxL2IudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxL3N1YmRpci88L1ByZWZpeD48L0NvbW1vblByZWZpeGVzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "049d5c9b0c2033c5", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026max-keys=1000\u0026prefix=blob-for-delimiters-%2Fdir1%2Fsubdir%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:24 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "rKmHBlwuiRoG8GX56FQ2I40bNG3qciywZws67p2xrLGnPoAS3beJm571AkEvqc5xtzw8D3lfAv8NDSanEro3q7ueNmFi/WjF" ], "X-Amz-Request-Id": [ "1RAPJBGF0D4YX9GB" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMS9zdWJkaXIvPC9QcmVmaXg+PE1hcmtlcj48L01hcmtlcj48TWF4S2V5cz4xMDAwPC9NYXhLZXlzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMS9zdWJkaXIvYy50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTguMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLWRlbGltaXRlcnMtL2RpcjEvc3ViZGlyL2QudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "f104f070b51d6ffd", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026max-keys=1000\u0026prefix=blob-for-delimiters-%2Fdir2%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:25 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "WGQkK2VXJEKpHBBF818YJL1tnwORupld/9HnBanMh1bcVSUDiMByPWvd7JAvfls7ul5BfrZJ9eMb9uMNn/7bFJtdNO5agn8k" ], "X-Amz-Request-Id": [ "9MREXA0YZ6KM8ARA" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy0vZGlyMi88L1ByZWZpeD48TWFya2VyPjwvTWFya2VyPjxNYXhLZXlzPjEwMDA8L01heEtleXM+PERlbGltaXRlcj4vPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIyL2UudHh0PC9LZXk+PExhc3RNb2RpZmllZD4yMDI2LTAzLTE5VDE1OjI3OjU4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48Q2hlY2tzdW1BbGdvcml0aG0+Q1JDMzI8L0NoZWNrc3VtQWxnb3JpdGhtPjxDaGVja3N1bVR5cGU+RlVMTF9PQkpFQ1Q8L0NoZWNrc3VtVHlwZT48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "57625d6e6c3480be", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026max-keys=1\u0026prefix=blob-for-delimiters-%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:25 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "tBDO/VFZ0cU34sSuVOYivHz+9pNfS16tgPNkuUAbDBR9qFRg6IpvUnJCHI9Q6gSg1gxnB7OtNcf9uNjev6Qno1nb/Fc8ON/Q" ], "X-Amz-Request-Id": [ "9MR23C37JWK5CHFX" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy0vPC9QcmVmaXg+PE1hcmtlcj48L01hcmtlcj48TmV4dE1hcmtlcj5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxLzwvTmV4dE1hcmtlcj48TWF4S2V5cz4xPC9NYXhLZXlzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD50cnVlPC9Jc1RydW5jYXRlZD48Q29tbW9uUHJlZml4ZXM+PFByZWZpeD5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxLzwvUHJlZml4PjwvQ29tbW9uUHJlZml4ZXM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "2cf74ace18824e4a", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026marker=blob-for-delimiters-%2Fdir1%2F\u0026max-keys=1\u0026prefix=blob-for-delimiters-%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:25 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "2x/WNZ4ZUNWvjiuvB8UTdRE5RsfS6mD1TUY25Z/Bz4Jt/CKfWI/QWraUklr1SjC6r5tt5u4idTsYDWpiLc+aWkXzSWJIFe3A" ], "X-Amz-Request-Id": [ "9MR8NHCVYRHDNJM2" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy0vPC9QcmVmaXg+PE1hcmtlcj5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIxLzwvTWFya2VyPjxOZXh0TWFya2VyPmJsb2ItZm9yLWRlbGltaXRlcnMtL2RpcjIvPC9OZXh0TWFya2VyPjxNYXhLZXlzPjE8L01heEtleXM+PERlbGltaXRlcj4vPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPnRydWU8L0lzVHJ1bmNhdGVkPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRlbGltaXRlcnMtL2RpcjIvPC9QcmVmaXg+PC9Db21tb25QcmVmaXhlcz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "2490178f5d3689e4", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026marker=blob-for-delimiters-%2Fdir2%2F\u0026max-keys=1\u0026prefix=blob-for-delimiters-%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:25 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "tPb4t/B0xT32mwTpaU2PRwz+sKuA0c7DbrJOSpIyhDaaWpxzcROty+04orGsjhftdlcXlhLjRr7rYa1gHsA74GFDVTXnnUY3" ], "X-Amz-Request-Id": [ "9MR3WYYJKW2RF1VK" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy0vPC9QcmVmaXg+PE1hcmtlcj5ibG9iLWZvci1kZWxpbWl0ZXJzLS9kaXIyLzwvTWFya2VyPjxNYXhLZXlzPjE8L01heEtleXM+PERlbGltaXRlcj4vPC9EZWxpbWl0ZXI+PElzVHJ1bmNhdGVkPmZhbHNlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1kZWxpbWl0ZXJzLS9mLnR4dDwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxOC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PC9MaXN0QnVja2V0UmVzdWx0Pg==" } }, { "ID": "fe134f8311f0a952", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-delimiters-/dir2/e.txt", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:25 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:27:58 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "nD+eqxhK3oXgb2OctVl18Hg8nL6MzPa8KCm5KUC+yfZ3t1oQvip2jSIjwLpn7YWivmw84H17H7nCHIcngPM7kEVMDMbmOlc7" ], "X-Amz-Request-Id": [ "9MR7KD4T2TKF2DJQ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "eb54af0724ea09e4", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-delimiters-/dir2/e.txt?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:25 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "KoGii7h/Ryj/HH7ooNegGpfhmrhW5QST2Q1HTY9CN+jt0Ul0o+WQCd5R3xhYsQ5RfIRz5BqzCar7XtjqdPPh8EUCA1in7rzT" ], "X-Amz-Request-Id": [ "9MRF0N8ET7H47NNR" ] }, "Body": "" } }, { "ID": "743c0dde46f2a78b", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?delimiter=%2F\u0026max-keys=1000\u0026prefix=blob-for-delimiters-%2F", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:25 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "hIWT4zXDyodroCbN9qOBpUvWmYcQRQzobH2Mp1H8Lc3AL/4MDycvKQtxaAV+NalCBTE6WRALJa9aBxNvMuqm4lINjWj77LVd" ], "X-Amz-Request-Id": [ "9MREFMWZ39ECYKYX" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItZGVsaW1pdGVycy0vPC9QcmVmaXg+PE1hcmtlcj48L01hcmtlcj48TWF4S2V5cz4xMDAwPC9NYXhLZXlzPjxEZWxpbWl0ZXI+LzwvRGVsaW1pdGVyPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+YmxvYi1mb3ItZGVsaW1pdGVycy0vZi50eHQ8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTguMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb21tb25QcmVmaXhlcz48UHJlZml4PmJsb2ItZm9yLWRlbGltaXRlcnMtL2RpcjEvPC9QcmVmaXg+PC9Db21tb25QcmVmaXhlcz48L0xpc3RCdWNrZXRSZXN1bHQ+" } }, { "ID": "c51883cbd48bd847", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-delimiters-/dir2/e.txt?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:25 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "g9llOzZobfp9kslLI4lG+Kje8Jsy/jR9SQgbhtnDacbbzQZJdKr88fyxZ4LLJuMwlUPvN6WZjDZJfcGrLtJ+njqDDJfNZ/Mc" ], "X-Amz-Request-Id": [ "9MR1N60RFBX4M6W0" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestListWeirdKeys.replay ================================================ { "Initial": "AQAAAA7hTg0XIlhJwgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "41d759341e841342", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?max-keys=1000\u0026prefix=list-weirdkeys-", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:24 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "2hXtG6JBSN8xq93bKJSSJpitia+pcbKdjMr3v3KHnQFnG4NNzTDmrKihnfS4kEmVZ3rx4SEr18Y=" ], "X-Amz-Request-Id": [ "1RAKHTSJ8YXG0SEG" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+bGlzdC13ZWlyZGtleXMtPC9QcmVmaXg+PE1hcmtlcj48L01hcmtlcj48TWF4S2V5cz4xMDAwPC9NYXhLZXlzPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+bGlzdC13ZWlyZGtleXMtICEmcXVvdDsjJCUmYW1wOyZhcG9zOygpKissLS4vPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5saXN0LXdlaXJka2V5cy0uLl9fMHgyZl9fZm9vLy4uX18weDJmX19iYXIvLi5fXzB4MmZfXy4uX18weDJmX19iYXouLl9fMHgyZl9fPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5saXN0LXdlaXJka2V5cy0uLl9fMHg1Y19fZm9vX18weDVjX18uLl9fMHg1Y19fYmFyX18weDVjX18uLl9fMHg1Y19fLi5fXzB4NWNfX2Jhei4uX18weDVjX188L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5Pmxpc3Qtd2VpcmRrZXlzLS4uX18weDVjX19mb29fXzB4NWNfX19fMHg1Y19fYmFyX18weDVjX19fXzB4NWNfX19fMHg1Y19fYmF6PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5saXN0LXdlaXJka2V5cy0xMjM0NTwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxOC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+bGlzdC13ZWlyZGtleXMtOjsmbHQ7PSZndDs/PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5saXN0LXdlaXJka2V5cy1APC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5saXN0LXdlaXJka2V5cy1bX18weDVjX19dXl88L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5Pmxpc3Qtd2VpcmRrZXlzLV9fMHgwX19fXzB4MV9fX18weDJfX19fMHgzX19fXzB4NF9fX18weDVfX19fMHg2X19fXzB4N19fX18weDhfX19fMHg5X19fXzB4YV9fX18weGJfX19fMHhjX19fXzB4ZF9fX18weGVfX19fMHhmX188L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5Pmxpc3Qtd2VpcmRrZXlzLV9fMHgxMF9fX18weDExX19fXzB4MTJfX19fMHgxM19fX18weDE0X19fXzB4MTVfX19fMHgxNl9fX18weDE3X19fXzB4MThfX19fMHgxOV9fX18weDFhX19fXzB4MWJfX19fMHgxY19fX18weDFkX19fXzB4MWVfX19fMHgxZl9fPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5saXN0LXdlaXJka2V5cy1gPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5saXN0LXdlaXJka2V5cy1mb28gYmFyIGJhejwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxNy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+bGlzdC13ZWlyZGtleXMtZm9vJnF1b3Q7YmFyJnF1b3Q7YmF6PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5saXN0LXdlaXJka2V5cy1mb28vL2Jhci8vL2JhejwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozOTowMS4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+bGlzdC13ZWlyZGtleXMtZm9vL2Jhci9iYXo8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6NDAuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5Pmxpc3Qtd2VpcmRrZXlzLWZvb19fMHg1Y19fYmFyX18weDVjX19iYXo8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5Pmxpc3Qtd2VpcmRrZXlzLXt8fX5/PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5saXN0LXdlaXJka2V5cy3imLrimLrimLo8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "97b0e52f1707918f", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?max-keys=1000\u0026prefix=list-weirdkeys-", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:24 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "dhhr3242v/KsQSQ418yl3/o4sL9VtRyrcPoeMwP5q2xTMKih9QkCz25uBU0fs83zG7RYu0lsRhY=" ], "X-Amz-Request-Id": [ "1RAN5S2M04BHNDJ9" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+bGlzdC13ZWlyZGtleXMtPC9QcmVmaXg+PE1hcmtlcj48L01hcmtlcj48TWF4S2V5cz4xMDAwPC9NYXhLZXlzPjxJc1RydW5jYXRlZD5mYWxzZTwvSXNUcnVuY2F0ZWQ+PENvbnRlbnRzPjxLZXk+bGlzdC13ZWlyZGtleXMtICEmcXVvdDsjJCUmYW1wOyZhcG9zOygpKissLS4vPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5saXN0LXdlaXJka2V5cy0uLl9fMHgyZl9fZm9vLy4uX18weDJmX19iYXIvLi5fXzB4MmZfXy4uX18weDJmX19iYXouLl9fMHgyZl9fPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5saXN0LXdlaXJka2V5cy0uLl9fMHg1Y19fZm9vX18weDVjX18uLl9fMHg1Y19fYmFyX18weDVjX18uLl9fMHg1Y19fLi5fXzB4NWNfX2Jhei4uX18weDVjX188L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5Pmxpc3Qtd2VpcmRrZXlzLS4uX18weDVjX19mb29fXzB4NWNfX19fMHg1Y19fYmFyX18weDVjX19fXzB4NWNfX19fMHg1Y19fYmF6PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5saXN0LXdlaXJka2V5cy0xMjM0NTwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxOC4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+bGlzdC13ZWlyZGtleXMtOjsmbHQ7PSZndDs/PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5saXN0LXdlaXJka2V5cy1APC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5saXN0LXdlaXJka2V5cy1bX18weDVjX19dXl88L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5Pmxpc3Qtd2VpcmRrZXlzLV9fMHgwX19fXzB4MV9fX18weDJfX19fMHgzX19fXzB4NF9fX18weDVfX19fMHg2X19fXzB4N19fX18weDhfX19fMHg5X19fXzB4YV9fX18weGJfX19fMHhjX19fXzB4ZF9fX18weGVfX19fMHhmX188L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5Pmxpc3Qtd2VpcmRrZXlzLV9fMHgxMF9fX18weDExX19fXzB4MTJfX19fMHgxM19fX18weDE0X19fXzB4MTVfX19fMHgxNl9fX18weDE3X19fXzB4MThfX19fMHgxOV9fX18weDFhX19fXzB4MWJfX19fMHgxY19fX18weDFkX19fXzB4MWVfX19fMHgxZl9fPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE4LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5saXN0LXdlaXJka2V5cy1gPC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5saXN0LXdlaXJka2V5cy1mb28gYmFyIGJhejwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozODoxNy4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+bGlzdC13ZWlyZGtleXMtZm9vJnF1b3Q7YmFyJnF1b3Q7YmF6PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5saXN0LXdlaXJka2V5cy1mb28vL2Jhci8vL2JhejwvS2V5PjxMYXN0TW9kaWZpZWQ+MjAyNC0wOC0yMFQyMjozOTowMS4wMDBaPC9MYXN0TW9kaWZpZWQ+PEVUYWc+JnF1b3Q7NWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTImcXVvdDs8L0VUYWc+PFNpemU+NTwvU2l6ZT48T3duZXI+PElEPmY0Mzc1YjU5YzBjZmY0OGI4ZWQ5OTAwMjJlOWYyNjY2YTQ1M2Q5NTlmMTNkNzcyYWY0YzE2MWNlOWUwNjRhMmI8L0lEPjwvT3duZXI+PFN0b3JhZ2VDbGFzcz5TVEFOREFSRDwvU3RvcmFnZUNsYXNzPjwvQ29udGVudHM+PENvbnRlbnRzPjxLZXk+bGlzdC13ZWlyZGtleXMtZm9vL2Jhci9iYXo8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6NDAuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5Pmxpc3Qtd2VpcmRrZXlzLWZvb19fMHg1Y19fYmFyX18weDVjX19iYXo8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5Pmxpc3Qtd2VpcmRrZXlzLXt8fX5/PC9LZXk+PExhc3RNb2RpZmllZD4yMDI0LTA4LTIwVDIyOjM4OjE3LjAwMFo8L0xhc3RNb2RpZmllZD48RVRhZz4mcXVvdDs1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MiZxdW90OzwvRVRhZz48U2l6ZT41PC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48Q29udGVudHM+PEtleT5saXN0LXdlaXJka2V5cy3imLrimLrimLo8L0tleT48TGFzdE1vZGlmaWVkPjIwMjQtMDgtMjBUMjI6Mzg6MTcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestMD5.replay ================================================ { "Initial": "AQAAAA7hTg0kBSvkUQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "53eaad2723088416", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-md5-aaa?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:37 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "az7p2FeUq6YZnEclo0umYBVAO/o8RVWKhLVqXoPWfa5zhLkWZZMvmpG8lyEYFgFosEWgRgkbD/8=" ], "X-Amz-Request-Id": [ "8V2ZSME4TGE516RT" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "b31b7f09a1f68d7e", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-md5-bbb?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "48" ], "Content-Md5": [ "afqrYmg1ApVVDefVh7wyPQ==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "7" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "Nw0KZ29vZGJ5ZQ0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6RFkvWWRBPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:37 GMT" ], "Etag": [ "\"69faab6268350295550de7d587bc323d\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "DY/YdA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "J9bd9Xlj1BSBozP+OoJeFm7vGWfimHbHZVr0KtsNFvUbb7ItNVOqrC+bqPEoJi3qYE1+cE7EnB8=" ], "X-Amz-Request-Id": [ "8V2RCZT4YARGB64F" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "6faf6a9b6b8dda0d", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-md5-aaa", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:37 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:37 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "mkGJRPmcxVxUUVmAET783A16Uxxdykc4YVi0o7lQtW96hDrr/iGNg3o431gYW0MCOIHANGD85e0=" ], "X-Amz-Request-Id": [ "8V2JY7YP67C2HJKT" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "b16479d102da391f", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-md5-bbb", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "7" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:37 GMT" ], "Etag": [ "\"69faab6268350295550de7d587bc323d\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:37 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "KS/fy3s/rVqjJxOP1itjBPhNilqGcE+dorJ0tqnISa/PHgKtxYG1p3BXklhC46vf7n3lyRFvRl0=" ], "X-Amz-Request-Id": [ "8V2YHZ1F0VZ49D28" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "f7b0f1ecf324d821", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?max-keys=1000\u0026prefix=blob-for-md5-", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:37 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "A1dX8uMiwB534QW8go8H1Wc7FL0hawyVO1bjC0dVejohhIVd1/DP9K6rOQ93Hn0lOyHAywwK7sE=" ], "X-Amz-Request-Id": [ "8V2X7NY5JQ3BDQSZ" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+YmxvYi1mb3ItbWQ1LTwvUHJlZml4PjxNYXJrZXI+PC9NYXJrZXI+PE1heEtleXM+MTAwMDwvTWF4S2V5cz48SXNUcnVuY2F0ZWQ+ZmFsc2U8L0lzVHJ1bmNhdGVkPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLW1kNS1hYWE8L0tleT48TGFzdE1vZGlmaWVkPjIwMjYtMDMtMTlUMTU6Mjg6MzcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJnF1b3Q7PC9FVGFnPjxDaGVja3N1bUFsZ29yaXRobT5DUkMzMjwvQ2hlY2tzdW1BbGdvcml0aG0+PENoZWNrc3VtVHlwZT5GVUxMX09CSkVDVDwvQ2hlY2tzdW1UeXBlPjxTaXplPjU8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjxDb250ZW50cz48S2V5PmJsb2ItZm9yLW1kNS1iYmI8L0tleT48TGFzdE1vZGlmaWVkPjIwMjYtMDMtMTlUMTU6Mjg6MzcuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90OzY5ZmFhYjYyNjgzNTAyOTU1NTBkZTdkNTg3YmMzMjNkJnF1b3Q7PC9FVGFnPjxDaGVja3N1bUFsZ29yaXRobT5DUkMzMjwvQ2hlY2tzdW1BbGdvcml0aG0+PENoZWNrc3VtVHlwZT5GVUxMX09CSkVDVDwvQ2hlY2tzdW1UeXBlPjxTaXplPjc8L1NpemU+PE93bmVyPjxJRD5mNDM3NWI1OWMwY2ZmNDhiOGVkOTkwMDIyZTlmMjY2NmE0NTNkOTU5ZjEzZDc3MmFmNGMxNjFjZTllMDY0YTJiPC9JRD48L093bmVyPjxTdG9yYWdlQ2xhc3M+U1RBTkRBUkQ8L1N0b3JhZ2VDbGFzcz48L0NvbnRlbnRzPjwvTGlzdEJ1Y2tldFJlc3VsdD4=" } }, { "ID": "b693e5aa86fc0f78", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-md5-bbb", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "7" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:37 GMT" ], "Etag": [ "\"69faab6268350295550de7d587bc323d\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:37 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "M8EyqgJrhzCCYWUoZqNSmrq/ayVz517pN8WIKUGqP2tIRMrHHsgslz1BIJngvaRoC3tIdOFhRj0=" ], "X-Amz-Request-Id": [ "8V2S43VYK5B6MBP6" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "c29fb1dc907edc45", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-md5-bbb?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:37 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "zRIEfx6UP7/N1AiGQXanw9NOJ+Ek/Z86AGtzk2RY7n59FWK3FoJiSzMQzSDwnVtgYwu/BRhgEEU=" ], "X-Amz-Request-Id": [ "8V2PDNK1CTF8WSTY" ] }, "Body": "" } }, { "ID": "37f8ea11639cf335", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-md5-aaa", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:37 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:37 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Y6Osqpt7wR5wmM4DNLliDTgMCQILQ71QfzJt+5YGrWFqd3HJG28xKO1cLbwnMYkm5p70ihG3kDk=" ], "X-Amz-Request-Id": [ "8V2T98MQMWVX3E44" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "3587ca4a03e7884b", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-md5-aaa?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:37 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "BWyoyIJZRq/zIA7xAvVp08/FeHmPOJw0V7U9Ky+OZu7Jm+JcL1s+oqCRFH2X43s7ZXsteF2Xc6U=" ], "X-Amz-Request-Id": [ "8V2YWX15AR6978N9" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestMetadata/duplicate_case-insensitive_key_fails.replay ================================================ { "Initial": "AQAAAA7hTg0jB4D/uwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": null } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestMetadata/empty.replay ================================================ { "Initial": "AQAAAA7hTg0iNOquIwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "9582b0622ba2bf6e", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:35 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "tEbGQ5hWink/V9NjRb9xaNAXyC0pJqJvJe6ydZLuwBTVuKUtu6kUeYqRdr30lvfEhaQC4C0u4oE=" ], "X-Amz-Request-Id": [ "FVF0JEY6BZW9BDAP" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "cc9d872f5a551875", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:35 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:35 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "ZBBq6eJXX3uMPf9bBRKBsa7K/irz6L69xHiQd7jO9BmS0xmnIERxo/hD8jO6zAoKsnaFtlT0q7U=" ], "X-Amz-Request-Id": [ "FVFCABYC4BZRTFNB" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "30b8b7674585bb06", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:36 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:35 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "iZj2xgSbBCwccyzuRwyzVo09Yi1Wwg46pjdKyudAFmqBllXMhpzzam/BHufrXdzKZ35MpHCd+JY=" ], "X-Amz-Request-Id": [ "Q3JRBXFZSQDRJK2Z" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "66daef679dbf6e4e", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:36 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "vmOpbyCYUEe/yOnVPzovToEX/aq1V0OwhVEnmibEMFBPiw5gNL1/JkGOyj33sEI+00uWZ/VR0LQ=" ], "X-Amz-Request-Id": [ "Q3JTGWV3G75DQSFG" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestMetadata/empty_key_fails.replay ================================================ { "Initial": "AQAAAA7hTg0jB3M1VwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": null } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestMetadata/non-utf8_metadata_key.replay ================================================ { "Initial": "AQAAAA7hTg0kBRJEqwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": null } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestMetadata/non-utf8_metadata_value.replay ================================================ { "Initial": "AQAAAA7hTg0kBSDIuQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": null } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestMetadata/valid_metadata.replay ================================================ { "Initial": "AQAAAA7hTg0jB4q54wAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "e5fdbe75f0acfd57", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Meta-Key_a": [ "value-a" ], "X-Amz-Meta-Key_b": [ "value-b" ], "X-Amz-Meta-Key_c": [ "vAlUe-c" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:36 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "L5m8426JaE2OhHsyGN+LwrzPZnwU6kQl7mXYOS/Gh0jeR8LCX2dCc+9CXUNHvcQMSVc/Qa1GQ72vOwle9YQgu0wlcL8EaLcX" ], "X-Amz-Request-Id": [ "Q3JVX0Z3MG52YQG3" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "81690fc7f80cf080", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:36 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:36 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Ao+rYwlgOIpX2ZDodwevMkOT0vxGoERFjwRlogul6kSjuIR0cqS7cZdkPBt4/AInfuwH42Bq25AlijdKOIqCyZUllMIr9Qcr" ], "X-Amz-Meta-Key_a": [ "value-a" ], "X-Amz-Meta-Key_b": [ "value-b" ], "X-Amz-Meta-Key_c": [ "vAlUe-c" ], "X-Amz-Request-Id": [ "Q3JH6HM2KSQC34KP" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "4a45b46cdbf6693b", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:36 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:36 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "B23Jn/OQDXHt9STVmrjYQtbiG/mDMYU4kJz1Z0falMNXz4brcnA113T6KZ/3brBn39dG+HFdxUfpzTz770je3GAJqY/JFFi+" ], "X-Amz-Meta-Key_a": [ "value-a" ], "X-Amz-Meta-Key_b": [ "value-b" ], "X-Amz-Meta-Key_c": [ "vAlUe-c" ], "X-Amz-Request-Id": [ "Q3JNN4ZX765K90XG" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "b5c366507e3dcf60", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:36 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "EJE5slIJTubdoPZSolD0f4LRGHb7oWbnuTTyNkbJBGDr/iW3f5IR31C53eQN9q/8207w9odWFEwrhhLS5Ek2wN/R37vCyIwM" ], "X-Amz-Request-Id": [ "Q3JPEWC3MPBYWZ3W" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestMetadata/valid_metadata_with_content_type.replay ================================================ { "Initial": "AQAAAA7hTg0jI9XpugAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "0b2467194a569e6f", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Meta-Foo": [ "bar" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:36 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "IQK2oRYDQUXSzR6Sg08+zEJD5rVgWBm71lhAf71bX2BhIDB8PTICRr5/6GhlsfyFlPLSoG4zH63tt7K7kLWfLWAcPZdAWBdD" ], "X-Amz-Request-Id": [ "Q3JR68R9ERYR7CVD" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "b8187daede55ce30", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 19 Mar 2026 15:28:36 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:36 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "OgyLDIw2n3TtNcjne/ahWy+90kAqh9HhZVt997MjzSg9zuxFLJ5NyWJgXN4ZacWQcOFH425HGsQpSLBboq1JzKhqQqlDmPX4" ], "X-Amz-Meta-Foo": [ "bar" ], "X-Amz-Request-Id": [ "Q3JVAPD9DCWHBS43" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "59cc8939844f3797", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 19 Mar 2026 15:28:36 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:36 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "TycYzUQBzQCO15fpFfzZbZC3GljVOKPEr3o3X+H38fBy0OGHLlvAmJOWRPcbmutd/9v5beYSFNYsnlibfArq2LoIkp8EIo2B" ], "X-Amz-Meta-Foo": [ "bar" ], "X-Amz-Request-Id": [ "Q3JY2BQRRDABANV3" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "e42fa1bd9a297f1b", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:36 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "BrifymH/nLnKjnOeiGVBN8/QSKTFj2d3sxLu9jc6G0sOcpOdLFLQD5/mnfjEwHVxmhh56ZP9qnqXL0Xs+Nr5JjM4M5JAKLbf" ], "X-Amz-Request-Id": [ "Q3JGAFEVER2T6462" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestMetadata/valid_metadata_with_empty_body.replay ================================================ { "Initial": "AQAAAA7hTg0jFfIYxgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "09fadaef7bb161f7", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Meta-Foo": [ "bar" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:36 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "DYUHxa1bq5nSuhg9TL7B4z0RFkIfse0/XxO5AP3O1zr1F7pkTf02T+nwkhoo3mBCUWYjcnHqgWLXhJBaa3eTrrUjTTeT7CPx" ], "X-Amz-Request-Id": [ "Q3JHWYQQE46GQ4Z1" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "1f4f5a171e9488cf", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:36 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:36 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "ov98fBC03mNzWNIYd74pLv73BWa7rHIbHZSzXJyiNS2dc8CZA/cJcqO9K7an7w/+bfzX/+oC9OnAja+tKCuJ7SnszKQaqvPz" ], "X-Amz-Meta-Foo": [ "bar" ], "X-Amz-Request-Id": [ "Q3JZ4J99FNTGWCMG" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "a818601a548504c8", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:36 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:36 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "vrhr99rJxZl6DP6eza2tYlhVouw2Qcy380i0nVibdZFTXgjGKT9vihT9WXpi/lzUctYNvlggSB/CsD5wdBqZhaklTKs0Tceo" ], "X-Amz-Meta-Foo": [ "bar" ], "X-Amz-Request-Id": [ "Q3JQ5B8XJNTG8F7N" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "b764e47feee4be53", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:36 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "A8o4IKUuJA3SrcGNKy7O+1Wu45G/ZPpOXsI4UGEfD/Hc8UI8vvu7iuikbD+vEFrXWDiwhkWWFYVpA1MaG4IyjHBD1Cg7xzbl" ], "X-Amz-Request-Id": [ "Q3JX3AKF96MYJBS8" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestMetadata/weird_metadata_keys.replay ================================================ { "Initial": "AQAAAA7hTg0jMbErFAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "e890432c4147560c", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "46" ], "Content-Md5": [ "XUFAKrxLKna5cZ2REBfFkg==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "5" ], "X-Amz-Meta-%00%01%02%03%04%05%06%07%08%09%0a%0b%0c%0d%0e%0f": [ "%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F" ], "X-Amz-Meta-%10%11%12%13%14%15%16%17%18%19%1a%1b%1c%1d%1e%1f": [ "%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F" ], "X-Amz-Meta-%20%21%22%23$%25\u0026%27%28%29%2a+%2c-.%2f": [ "%20%21%22%23$%25\u0026%27%28%29%2A+%2C-.%2F" ], "X-Amz-Meta-%5b%5c%5d%5e_": [ "%5B%5C%5D%5E_" ], "X-Amz-Meta-%60": [ "%60" ], "X-Amz-Meta-%7b%7c%7d~%7f": [ "%7B%7C%7D~%7F" ], "X-Amz-Meta-%e2%98%ba%e2%98%ba%e2%98%ba": [ "%E2%98%BA%E2%98%BA%E2%98%BA" ], "X-Amz-Meta-..%2ffoo%2f..%2fbar%2f..%2f..%2fbaz..%2f": [ "..%2Ffoo%2F..%2Fbar%2F..%2F..%2Fbaz..%2F" ], "X-Amz-Meta-..%5cfoo%5c%5cbar%5c%5c%5cbaz": [ "..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz" ], "X-Amz-Meta-..%5cfoo%5c..%5cbar%5c..%5c..%5cbaz..%5c": [ "..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C" ], "X-Amz-Meta-12345": [ "12345" ], "X-Amz-Meta-Foo%20bar%20baz": [ "foo%20bar%20baz" ], "X-Amz-Meta-Foo%22bar%22baz": [ "foo%22bar%22baz" ], "X-Amz-Meta-Foo%2f%2fbar%2f%2f%2fbaz": [ "foo%2F%2Fbar%2F%2F%2Fbaz" ], "X-Amz-Meta-Foo%2fbar%2fbaz": [ "foo%2Fbar%2Fbaz" ], "X-Amz-Meta-Foo%5cbar%5cbaz": [ "foo%5Cbar%5Cbaz" ], "X-Amz-Meta-__0x3a__%3b%3c__0x3d__%3e%3f": [ ":%3B%3C=%3E%3F" ], "X-Amz-Meta-__0x40__": [ "@" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "NQ0KaGVsbG8NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk5oQ21oZz09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:36 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "NhCmhg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "YxWHSLMzOIRBfYyh/AHZ9iXH4X6ykQzxvuDTDqhsRp9bv9NB+z+tTmmvnF8V0tSrPuG41K3lLso=" ], "X-Amz-Request-Id": [ "Q3JRHWDNFD6W4Z33" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "1558d9e284414cce", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:36 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:36 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "ZRfh06DMtYQPPWl74bB3lU37OoXe4cP8rUP31h8HgsTWduSHsmNXwBhCAGypBtmOc/+6E4FhdGk=" ], "X-Amz-Meta-%00%01%02%03%04%05%06%07%08%09%0a%0b%0c%0d%0e%0f": [ "%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F" ], "X-Amz-Meta-%10%11%12%13%14%15%16%17%18%19%1a%1b%1c%1d%1e%1f": [ "%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F" ], "X-Amz-Meta-%20%21%22%23$%25\u0026%27%28%29%2a+%2c-.%2f": [ "%20%21%22%23$%25\u0026%27%28%29%2A+%2C-.%2F" ], "X-Amz-Meta-%5b%5c%5d%5e_": [ "%5B%5C%5D%5E_" ], "X-Amz-Meta-%60": [ "%60" ], "X-Amz-Meta-%7b%7c%7d~%7f": [ "%7B%7C%7D~%7F" ], "X-Amz-Meta-%e2%98%ba%e2%98%ba%e2%98%ba": [ "%E2%98%BA%E2%98%BA%E2%98%BA" ], "X-Amz-Meta-..%2ffoo%2f..%2fbar%2f..%2f..%2fbaz..%2f": [ "..%2Ffoo%2F..%2Fbar%2F..%2F..%2Fbaz..%2F" ], "X-Amz-Meta-..%5cfoo%5c%5cbar%5c%5c%5cbaz": [ "..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz" ], "X-Amz-Meta-..%5cfoo%5c..%5cbar%5c..%5c..%5cbaz..%5c": [ "..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C" ], "X-Amz-Meta-12345": [ "12345" ], "X-Amz-Meta-Foo%20bar%20baz": [ "foo%20bar%20baz" ], "X-Amz-Meta-Foo%22bar%22baz": [ "foo%22bar%22baz" ], "X-Amz-Meta-Foo%2f%2fbar%2f%2f%2fbaz": [ "foo%2F%2Fbar%2F%2F%2Fbaz" ], "X-Amz-Meta-Foo%2fbar%2fbaz": [ "foo%2Fbar%2Fbaz" ], "X-Amz-Meta-Foo%5cbar%5cbaz": [ "foo%5Cbar%5Cbaz" ], "X-Amz-Meta-__0x3a__%3b%3c__0x3d__%3e%3f": [ ":%3B%3C=%3E%3F" ], "X-Amz-Meta-__0x40__": [ "@" ], "X-Amz-Request-Id": [ "Q3JWMCGNAR3AAS2T" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "0cbcd12b5b7abd59", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:37 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:36 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "fXOvBYQlir2HMZMXzUCmmx8CeI49mA57IP0fcpkEAxz5/JG0kiJWPk5sBmSw1AxWh80PtvRJy3c=" ], "X-Amz-Meta-%00%01%02%03%04%05%06%07%08%09%0a%0b%0c%0d%0e%0f": [ "%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F" ], "X-Amz-Meta-%10%11%12%13%14%15%16%17%18%19%1a%1b%1c%1d%1e%1f": [ "%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F" ], "X-Amz-Meta-%20%21%22%23$%25\u0026%27%28%29%2a+%2c-.%2f": [ "%20%21%22%23$%25\u0026%27%28%29%2A+%2C-.%2F" ], "X-Amz-Meta-%5b%5c%5d%5e_": [ "%5B%5C%5D%5E_" ], "X-Amz-Meta-%60": [ "%60" ], "X-Amz-Meta-%7b%7c%7d~%7f": [ "%7B%7C%7D~%7F" ], "X-Amz-Meta-%e2%98%ba%e2%98%ba%e2%98%ba": [ "%E2%98%BA%E2%98%BA%E2%98%BA" ], "X-Amz-Meta-..%2ffoo%2f..%2fbar%2f..%2f..%2fbaz..%2f": [ "..%2Ffoo%2F..%2Fbar%2F..%2F..%2Fbaz..%2F" ], "X-Amz-Meta-..%5cfoo%5c%5cbar%5c%5c%5cbaz": [ "..%5Cfoo%5C%5Cbar%5C%5C%5Cbaz" ], "X-Amz-Meta-..%5cfoo%5c..%5cbar%5c..%5c..%5cbaz..%5c": [ "..%5Cfoo%5C..%5Cbar%5C..%5C..%5Cbaz..%5C" ], "X-Amz-Meta-12345": [ "12345" ], "X-Amz-Meta-Foo%20bar%20baz": [ "foo%20bar%20baz" ], "X-Amz-Meta-Foo%22bar%22baz": [ "foo%22bar%22baz" ], "X-Amz-Meta-Foo%2f%2fbar%2f%2f%2fbaz": [ "foo%2F%2Fbar%2F%2F%2Fbaz" ], "X-Amz-Meta-Foo%2fbar%2fbaz": [ "foo%2Fbar%2Fbaz" ], "X-Amz-Meta-Foo%5cbar%5cbaz": [ "foo%5Cbar%5Cbaz" ], "X-Amz-Meta-__0x3a__%3b%3c__0x3d__%3e%3f": [ ":%3B%3C=%3E%3F" ], "X-Amz-Meta-__0x40__": [ "@" ], "X-Amz-Request-Id": [ "8V2PXA8W2NRTR6DE" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "6535e221ef23bae7", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-metadata?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:37 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "iOu6CT1cf5oca+IyPldFUOufWY+Ca5nLD+U13RT9/Pbf/EfVgfAGMmx2Mzv/4dggBeerDatiw8Y=" ], "X-Amz-Request-Id": [ "8V2PQ5CQ3GY43791" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestNonexistentBucket.replay ================================================ { "Initial": "AQAAAA7hTg0VMFsWNwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "72c98808950b4711", "Request": { "Method": "GET", "URL": "https://go-cdk-bucket-does-not-exist.s3.us-west-1.amazonaws.com/?max-keys=1", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:21 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "+UxN47HfrfA3rtMhSa+58epZWOPdWaNAFJYfYsIySa1q5KHL/fjTBGMccgqo114N1f4yx3dhMNY=" ], "X-Amz-Request-Id": [ "JEBCDNGEZT3GT8QN" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPk5vU3VjaEJ1Y2tldDwvQ29kZT48TWVzc2FnZT5UaGUgc3BlY2lmaWVkIGJ1Y2tldCBkb2VzIG5vdCBleGlzdDwvTWVzc2FnZT48QnVja2V0TmFtZT5nby1jZGstYnVja2V0LWRvZXMtbm90LWV4aXN0PC9CdWNrZXROYW1lPjxSZXF1ZXN0SWQ+SkVCQ0ROR0VaVDNHVDhRTjwvUmVxdWVzdElkPjxIb3N0SWQ+K1V4TjQ3SGZyZkEzcnRNaFNhKzU4ZXBaV09QZFdhTkFGSllmWXNJeVNhMXE1S0hML2ZqVEJHTWNjZ3FvMTE0TjFmNHl4M2RoTU5ZPTwvSG9zdElkPjwvRXJyb3I+" } }, { "ID": "a65aaaf980492e7f", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/?max-keys=1", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:22 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Bucket-Region": [ "us-west-1" ], "X-Amz-Id-2": [ "EnlE3lIX0ghY8Hdp7eVVYqiMLQiHeZCn20+rtQet0lxU7Sik99JE41xpmyUiKlSfV4E+8Th7eyM=" ], "X-Amz-Request-Id": [ "JEB8K5E8PXSSAADE" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExpc3RCdWNrZXRSZXN1bHQgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PE5hbWU+Z28tY2xvdWQtdGVzdGluZy0yPC9OYW1lPjxQcmVmaXg+PC9QcmVmaXg+PE1hcmtlcj48L01hcmtlcj48TWF4S2V5cz4xPC9NYXhLZXlzPjxJc1RydW5jYXRlZD50cnVlPC9Jc1RydW5jYXRlZD48Q29udGVudHM+PEtleT5ibG9iLWZvci1jb3B5aW5nLWRlc3Q8L0tleT48TGFzdE1vZGlmaWVkPjIwMjYtMDMtMTlUMTU6Mjg6MTEuMDAwWjwvTGFzdE1vZGlmaWVkPjxFVGFnPiZxdW90O2IxMGE4ZGIxNjRlMDc1NDEwNWI3YTk5YmU3MmUzZmU1JnF1b3Q7PC9FVGFnPjxDaGVja3N1bUFsZ29yaXRobT5DUkMzMjwvQ2hlY2tzdW1BbGdvcml0aG0+PENoZWNrc3VtVHlwZT5GVUxMX09CSkVDVDwvQ2hlY2tzdW1UeXBlPjxTaXplPjExPC9TaXplPjxPd25lcj48SUQ+ZjQzNzViNTljMGNmZjQ4YjhlZDk5MDAyMmU5ZjI2NjZhNDUzZDk1OWYxM2Q3NzJhZjRjMTYxY2U5ZTA2NGEyYjwvSUQ+PC9Pd25lcj48U3RvcmFnZUNsYXNzPlNUQU5EQVJEPC9TdG9yYWdlQ2xhc3M+PC9Db250ZW50cz48L0xpc3RCdWNrZXRSZXN1bHQ+" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestRead/length_0_read.replay ================================================ { "Initial": "AQAAAA7hTg0aKoQOHgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "7339d242625d5887", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "69" ], "Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "27" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "MWINCmFiY2RlZmdoaWprbG1ub3BxdXJzdHV2d3h5eg0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6UnlQZzVRPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:27 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "RyPg5Q==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "fdx36OI5thWQn8Fz6W+/XJv+4VUJ3nUkhbtGLdexsD42cUH5y8OhGDbLwDsxUiddVLeURGcC44g=" ], "X-Amz-Request-Id": [ "Y9PSNYB8WHNC0DYM" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "22ab3d529c292916", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=0-0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "1" ], "Content-Range": [ "bytes 0-0/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:27 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:27 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "PDaxHoErtB54gDoiAoZnvn9xGSR0Wc3oAKYhHPHReV7zdxZiyICtzVXUwHiC/5hOWK8COgSJwPY=" ], "X-Amz-Request-Id": [ "Y9PPQSZVR1WVG7SC" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "YQ==" } }, { "ID": "8eae30145092dd32", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=0-0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "1" ], "Content-Range": [ "bytes 0-0/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:27 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:27 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "LdJA3ZosRluB/Z57oks5eZgq09uhtYAYk9eGigTiZbfLah+MCgprqxo/w74Vrox5foHLwl0z3cs=" ], "X-Amz-Request-Id": [ "Y9PHS638VASG2180" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "YQ==" } }, { "ID": "79fd2d6252675f0c", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:27 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:27 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "mZY5tOLGvE/MT6wEfq1WIGxIvFfUQs+fcBLvGpctyuPhDDeOsJlrcNFBNYunJdixsZrY2BCJ8wY=" ], "X-Amz-Request-Id": [ "Y9PSD5FHMFHW4MCY" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "014c97b7f04735e7", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:27 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "DsIHw1lCHQAg64G3rUfwZFQ12WTQij+Zzpr9Vh4/LoLTfToxbqULKB2ldJWs3sX724Yx6jXz62g=" ], "X-Amz-Request-Id": [ "Y9PZ41J4YZQ2J7JQ" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestRead/negative_offset_fails.replay ================================================ { "Initial": "AQAAAA7hTg0aKnUNzgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": null } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestRead/read_a_part_in_middle.replay ================================================ { "Initial": "AQAAAA7hTg0bGUu+XwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "5aad781fe5098d73", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "69" ], "Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "27" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "MWINCmFiY2RlZmdoaWprbG1ub3BxdXJzdHV2d3h5eg0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6UnlQZzVRPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "RyPg5Q==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "rabKwaHJj8xmmLSxFJHTjFtDECwjr/vg84Kj6rkyKwDipTY6hLfxpf9T2UsWjvWxqvtKtWb7Bp0=" ], "X-Amz-Request-Id": [ "KP4XQW779ACQ74F1" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "d040d12bb49f0039", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=10-14" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Range": [ "bytes 10-14/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "VtzmQI4q3tmehfW4R7W4lGajpdVkZsKXVbpD3CJHzL8V1hBRFWEtbhmhiUNV13HQO0vdzuRxYJU=" ], "X-Amz-Request-Id": [ "KP4YZMN2B810VY9E" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "a2xtbm8=" } }, { "ID": "671ceb92e13f86dd", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=10-14" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Range": [ "bytes 10-14/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "zymj6/NjvIEmPpLpBmWFyKQP9pvgbD0nnAe6ErpK54fTGFtsh4j5+hHjBj6jD+SdU6SpgLJxKN8=" ], "X-Amz-Request-Id": [ "KP4QHE75F3JZP0YJ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "a2xtbm8=" } }, { "ID": "bd424f94418e654e", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=14-14" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "1" ], "Content-Range": [ "bytes 14-14/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "D6Gf4I5At2Ytz7evOuqzBOezVqzMVGcxtrREfVsqwygk97U8ccApPOaben/ga1AeCjnu93t+m3o=" ], "X-Amz-Request-Id": [ "KP4GT6WMTR24X5V7" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "bw==" } }, { "ID": "8a576cd34c495e2f", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=14-14" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "1" ], "Content-Range": [ "bytes 14-14/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "oQbhrY5hs0k79x4otqUBUUM1e7N7VAEiHftZPAygE+vqiKHk3XjMB27v8EYJb7eW0dgylesJAA8=" ], "X-Amz-Request-Id": [ "KP4MJTFPVXBEKK51" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "bw==" } }, { "ID": "6163a6482192d122", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=12-14" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "3" ], "Content-Range": [ "bytes 12-14/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "ghI6Xo+Bra3QtnpPEIYNPCgRLtGgm42PiZ41iEXdkDclYBb4zdEhwTCVWIHaPTQRC3jpqV2KvIk=" ], "X-Amz-Request-Id": [ "KP4JFRN7R0CP9ZBA" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "bW5v" } }, { "ID": "01fe55e00b04f411", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "0G6x0pykznIzLn/ku3DV/rk1tqLJlBihELhYESz9JfdXi+z8H6I0s5Ruro7qzH/VSyc3TXva264=" ], "X-Amz-Request-Id": [ "KP4Z6MQ5Q7A33H4W" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "56be9b1d26db185e", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "yE44/RXBD2jdi5BRf80bA1AEvejNvto+xSgd35FiVSvLTB5FbJhL3w/QI9SL0rIgPm0VRarEG6s=" ], "X-Amz-Request-Id": [ "KP4JRHH6S91FVSBE" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestRead/read_from_positive_offset_to_end.replay ================================================ { "Initial": "AQAAAA7hTg0bAH8oKQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "7b12cd9815ed1b07", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "69" ], "Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "27" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "MWINCmFiY2RlZmdoaWprbG1ub3BxdXJzdHV2d3h5eg0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6UnlQZzVRPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "RyPg5Q==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "QZ+X7iICmqFIFceNdlBv7jPg3eHlQTbaflzj8ujeB2nA3GEgOaUN5wnfLT7XoFoxGC191wRh5BU=" ], "X-Amz-Request-Id": [ "KP4R00TAJPB6KMAB" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "eeb923b5ee46e45f", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=10-" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "17" ], "Content-Range": [ "bytes 10-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "/HPQla8s/9cbH9YP5bWlwaHar27T3zPhAI5clFSawnF9CCxLiu3Bg4oLrc6X3gdBGxamVX8bm5o=" ], "X-Amz-Request-Id": [ "KP4GESPNRFPB7Q95" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "a2xtbm9wcXVyc3R1dnd4eXo=" } }, { "ID": "89e97135fd34b5e7", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=10-" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "17" ], "Content-Range": [ "bytes 10-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Ce0joVhA8oIGcswefGk1tkn9tMs+36xjVuyIAIFIp5uAi6zflfLN5W030eJFlDRSdWvLWlVK/yo=" ], "X-Amz-Request-Id": [ "KP4Q98G98MMBDQNS" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "a2xtbm9wcXVyc3R1dnd4eXo=" } }, { "ID": "1bc553dce245d96a", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=22-" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Range": [ "bytes 22-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "hg/urUf4FZs94LCCn756cX5T98/xU7N2zoUtwP/dDd1Zlp++aKh0k2c350g3TimtaVtv7MXh8cs=" ], "X-Amz-Request-Id": [ "KP4G4JX616HCMMR4" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "dnd4eXo=" } }, { "ID": "7e9b68d0d58be5db", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=22-" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "5" ], "Content-Range": [ "bytes 22-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "8BaaG6glktVJATjWuxdHZq0oMITEwDlqjAAqUTBpblWVhX+tyy2qbDk6XFVRNeizqjf6SHx0JM0=" ], "X-Amz-Request-Id": [ "KP4YB81X1JEVS2CT" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "dnd4eXo=" } }, { "ID": "c0f73fddc1d7a5ce", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=16-" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "11" ], "Content-Range": [ "bytes 16-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "6YMYwee6Ibdu7PvmIEaz83fSMRu8XpmsDAhBi7+UPwNHToRu+gQBGwDxBpiSQoG6yoLaRvVQMSU=" ], "X-Amz-Request-Id": [ "KP4YMCPTTEJR6E8G" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "cXVyc3R1dnd4eXo=" } }, { "ID": "4dbb85594cae2fd7", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "DHkwnoPcaRG1wYFnhk2SsAroOXTg1we8+lAwLgeXt/uaDjL2okLKPBW/q3P/D6nJzOq/ycPBP10=" ], "X-Amz-Request-Id": [ "KP4PXXJV4SHPC3T2" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "e049e04b744b12f4", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "ac0VMMIZma9MZVE/E48KXdazly9x5Jrqch9B4aKiB6dvkW4KWuptdJBeL9yDBvlfeE7NiFEH1wg=" ], "X-Amz-Request-Id": [ "KP4MEETBJ6V4888T" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestRead/read_in_full.replay ================================================ { "Initial": "AQAAAA7hTg0bMRz+PAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "c5817740dca021bc", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "69" ], "Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "27" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "MWINCmFiY2RlZmdoaWprbG1ub3BxdXJzdHV2d3h5eg0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6UnlQZzVRPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "RyPg5Q==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "menh2t51CgnEkBQZWSGOrDB4pOR0a6hjxQAC064j/4dtGTSpQYYynlpp+yMsrYZJ0P0h/+vtuQk=" ], "X-Amz-Request-Id": [ "KP4TVXCN4ZGJZWZS" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "a9294781ab69fa23", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "RyPg5Q==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "7J0teKSzu3EJ1YCAkNx90BxB5mkOyoRJKp4KqSAUkIveieTOQIVMX+m+A4DfgnqIZbcLIgqiavM=" ], "X-Amz-Request-Id": [ "KP4RQ7B823MD0906" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "YWJjZGVmZ2hpamtsbW5vcHF1cnN0dXZ3eHl6" } }, { "ID": "7a18ced93e11200e", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "RyPg5Q==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "4IRU0B7wodogIbNpVKcfbeOvHo+HnTYJXVHcpAMI6OyGR1qtXQowRPFAqKn1+k3IsPRKe7aukuE=" ], "X-Amz-Request-Id": [ "KP4YNQYR1BBRKVV8" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "YWJjZGVmZ2hpamtsbW5vcHF1cnN0dXZ3eHl6" } }, { "ID": "1c0fbc887d6d4795", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=18-" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "9" ], "Content-Range": [ "bytes 18-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:29 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "LTncSFqdiEjLq4ckef3fr6CnOeOEWvtbf9Sr14nBUQh9H/QmHSufhm3TUoZxDsZKyxo79oRJvvE=" ], "X-Amz-Request-Id": [ "22C49RD5N6THWFG7" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "cnN0dXZ3eHl6" } }, { "ID": "6b3d1672e5ceef9e", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=18-" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "9" ], "Content-Range": [ "bytes 18-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:29 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "eBL9Z6RItRUfQhGney6WcJ4clX7QMU4Zks67WIvr9Spd06I+jJQi1MYeSKoI3kmdPK/nrrTHQpI=" ], "X-Amz-Request-Id": [ "22CC3SZNN4YHBQPY" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "cnN0dXZ3eHl6" } }, { "ID": "d441259877f01773", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=9-" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "18" ], "Content-Range": [ "bytes 9-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:29 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "I47CQXtTqEtlE/lunul8Zvod33KG6fHsmC7KQIhhu8afLvnFwqF+Zk/dWNvkwlQwgB6Y09kgcQY=" ], "X-Amz-Request-Id": [ "22CB6EPVSD2XVPMV" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "amtsbW5vcHF1cnN0dXZ3eHl6" } }, { "ID": "663b7a8eca75e9ee", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:29 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:28 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "hggj2xlvydi23bqVoSc9L7fSkxNafFUpid/luM6rAcc85dMCet1B8oMjUWlNLkS2vBdEppZuN/0=" ], "X-Amz-Request-Id": [ "22C31189HKYWG1JP" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "883677f11a548388", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:29 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "idRbbLCz3OTskOO5rkVv3m0Kf8CDFFKc1xQquHmdC+OF/XdPVpcNyK40jmK1FEn1QkxshJXbjrs=" ], "X-Amz-Request-Id": [ "22C4P8NSBSMY53RE" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestRead/read_in_full_with_negative_length_not_-1.replay ================================================ { "Initial": "AQAAAA7hTg0cDdIOwwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "1fb11d05541d6d75", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "69" ], "Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "27" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "MWINCmFiY2RlZmdoaWprbG1ub3BxdXJzdHV2d3h5eg0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6UnlQZzVRPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:29 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "RyPg5Q==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "T1LFe04M7v7inRA09B9n0fKChHg7GnBerGoaVqxJU251h7hD3DekT56c1hY++FXoj3/aIhGjRsk=" ], "X-Amz-Request-Id": [ "22C356N3YQ38M2J5" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "77a0a0943b7c4ee3", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:29 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:29 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "RyPg5Q==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "qRezLr4kOQQvwvSn7e9lE367OWAoZzeEgPofY1/PKN+prXsknbQYtDqOvEmSsC6cF6oi6cZrCHo=" ], "X-Amz-Request-Id": [ "22C1QNVQ0D9Z8YPV" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "YWJjZGVmZ2hpamtsbW5vcHF1cnN0dXZ3eHl6" } }, { "ID": "18ad881612c7f1d9", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:29 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:29 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "RyPg5Q==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "CsyT7IOOAShzhGwf3bUidHn4ou0kuYOW5NHKOdErdQAjIAhr7acpSI9R6m8fZsT5GvKJTleapfo=" ], "X-Amz-Request-Id": [ "22CFJZ0NP7TDCR3K" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "YWJjZGVmZ2hpamtsbW5vcHF1cnN0dXZ3eHl6" } }, { "ID": "6d94aa9d90f0515d", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=18-" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "9" ], "Content-Range": [ "bytes 18-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:29 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:29 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "/wp75O21t6KBYox4a+Q36q1DrCna8oqfEbJDV+9ON+FmHKSh63ahz69Spz4aMf0IqOqLALJevFc=" ], "X-Amz-Request-Id": [ "22C94QK5ECWEJQ8W" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "cnN0dXZ3eHl6" } }, { "ID": "d1d3a4fc5b9406fa", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=18-" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "9" ], "Content-Range": [ "bytes 18-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:29 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:29 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "zFHDsLDS2Ni5gqvq2zvcm46bykZNvJGJYldVJHzZO+AgCXj8UqZhxlfXmjMYqSLf9vS5omBg4wk=" ], "X-Amz-Request-Id": [ "22C9SKPPJZS15BX7" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "cnN0dXZ3eHl6" } }, { "ID": "e6492e8884e86156", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Range": [ "bytes=9-" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "18" ], "Content-Range": [ "bytes 9-26/27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:29 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:29 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "p2/BBjEPg6tBr968OPg3k3yOoR63BUWAnqEljqNeaZa4Q0obMCItd4SCIoHXWhYzSk0C1d4uhDc=" ], "X-Amz-Request-Id": [ "22C74ZA42WXECCXW" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "amtsbW5vcHF1cnN0dXZ3eHl6" } }, { "ID": "3a2a99a8fa609895", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:29 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:29 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "EuwTt/WBRv8ulMH7T5MDeC/+q+WeVyTCTkB2KqIh/0LT4YVFQd9RTcazvMtkp5cDdp0OqviT/DM=" ], "X-Amz-Request-Id": [ "22CFDKERTJ0TTTJ6" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "ff0a19a22ef3f581", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:29 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "f2cuxiDjnQqfHwtNEGjcwGoFfkIHvzQTCaiCSWWuWC1F6ilEDsRzx9CGKY79mRos6iykuMlSDQ8=" ], "X-Amz-Request-Id": [ "22CB2DYE2F54W30J" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestRead/read_of_nonexistent_key_fails.replay ================================================ { "Initial": "AQAAAA7hTg0aFJRfUQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "6698af1f1a48977a", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "69" ], "Content-Md5": [ "PflsWr6X8pZ9OAEIcAMKXw==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "27" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "MWINCmFiY2RlZmdoaWprbG1ub3BxdXJzdHV2d3h5eg0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6UnlQZzVRPT0NCg0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:27 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "RyPg5Q==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "/U9BH0VRdiwJz6pFjU1iY2ulK25Zeg0XE2jiQn0Ep6KMHV3yb10BQbQTypLNk75ZbcxtiTblGhk=" ], "X-Amz-Request-Id": [ "Y9PQ60BCRG4DQ7XA" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "65d22df1acbff19c", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/key-does-not-exist?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:25 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "RYkgMyV6dUxJTXUHSJjhmVE13hZB7hSDG5EsESfdXYk2ETKEWNB0Vrt9AlNJmT+tfkpsT4QXzNI=" ], "X-Amz-Request-Id": [ "Y9PVFWHM99RXW1NQ" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPk5vU3VjaEtleTwvQ29kZT48TWVzc2FnZT5UaGUgc3BlY2lmaWVkIGtleSBkb2VzIG5vdCBleGlzdC48L01lc3NhZ2U+PEtleT5rZXktZG9lcy1ub3QtZXhpc3Q8L0tleT48UmVxdWVzdElkPlk5UFZGV0hNOTlSWFcxTlE8L1JlcXVlc3RJZD48SG9zdElkPlJZa2dNeVY2ZFV4SlRYVUhTSmpobVZFMTNoWkI3aFNERzVFc0VTZmRYWWsyRVRLRVdOQjBWcnQ5QWxOSm1UK3Rma3BzVDRRWHpOST08L0hvc3RJZD48L0Vycm9yPg==" } }, { "ID": "d40f1b62bfccc52d", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "27" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:27 GMT" ], "Etag": [ "\"3df96c5abe97f2967d38010870030a5f\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:27 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "jL5Ac2pV7C96L+mqoWK35xqf3PBYUU9veASYNbEd9xD0dKyfJvvCPTXQLybKbWF3YTlPLMkdUxw=" ], "X-Amz-Request-Id": [ "Y9PZG5W7J17H6EHA" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "91be0158cf778c2d", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:27 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "GHLQur45ac7uiElWnz0oNfgDCS8DOJvAh+l0rregPkwsGHbgsRwkyslq09HhN3xIpvqQddBlJR0=" ], "X-Amz-Request-Id": [ "Y9PJV7SG7V31PGEM" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestSignedURL.replay ================================================ { "Initial": "AQAAAA7hTg0uJID6FgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "ceffe01fe232ea8c", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-signing?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "11" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "aGVsbG8gd29ybGQ=" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "mR6Ad0L2BK6ovyhPAeA3BqJ5129myyGHViHYzUxuZ3C+HS1KgoF2yvrQwF10KbpYv4Q2sm6nopA=" ], "X-Amz-Request-Id": [ "H8RM0YWBPHJ5VSTM" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPlNpZ25hdHVyZURvZXNOb3RNYXRjaDwvQ29kZT48TWVzc2FnZT5UaGUgcmVxdWVzdCBzaWduYXR1cmUgd2UgY2FsY3VsYXRlZCBkb2VzIG5vdCBtYXRjaCB0aGUgc2lnbmF0dXJlIHlvdSBwcm92aWRlZC4gQ2hlY2sgeW91ciBrZXkgYW5kIHNpZ25pbmcgbWV0aG9kLjwvTWVzc2FnZT48QVdTQWNjZXNzS2V5SWQ+QUtJQVdVV0VVU1BVTFlYM0JMM008L0FXU0FjY2Vzc0tleUlkPjxTdHJpbmdUb1NpZ24+QVdTNC1ITUFDLVNIQTI1NgoyMDI2MDMxOVQxNTI4NDZaCjIwMjYwMzE5L3VzLXdlc3QtMS9zMy9hd3M0X3JlcXVlc3QKOWZiZmU1NjZmNzc2ZjE3NzY2MWUzNzg2ZTlkMzY2YzA0YmU2ODg4M2FjOTI3MzE4YjgwZDk5YmMzNDA0NTZiZDwvU3RyaW5nVG9TaWduPjxTaWduYXR1cmVQcm92aWRlZD5lNmYwMzZjZTQ2ODU0M2FiZDMyNmMwZTRlMjA5OWJkZDNmZTE1ZDg1MWY1MTg2M2ZmNjhmNWIwZGVjZDA2ZTg4PC9TaWduYXR1cmVQcm92aWRlZD48U3RyaW5nVG9TaWduQnl0ZXM+NDEgNTcgNTMgMzQgMmQgNDggNGQgNDEgNDMgMmQgNTMgNDggNDEgMzIgMzUgMzYgMGEgMzIgMzAgMzIgMzYgMzAgMzMgMzEgMzkgNTQgMzEgMzUgMzIgMzggMzQgMzYgNWEgMGEgMzIgMzAgMzIgMzYgMzAgMzMgMzEgMzkgMmYgNzUgNzMgMmQgNzcgNjUgNzMgNzQgMmQgMzEgMmYgNzMgMzMgMmYgNjEgNzcgNzMgMzQgNWYgNzIgNjUgNzEgNzUgNjUgNzMgNzQgMGEgMzkgNjYgNjIgNjYgNjUgMzUgMzYgMzYgNjYgMzcgMzcgMzYgNjYgMzEgMzcgMzcgMzYgMzYgMzEgNjUgMzMgMzcgMzggMzYgNjUgMzkgNjQgMzMgMzYgMzYgNjMgMzAgMzQgNjIgNjUgMzYgMzggMzggMzggMzMgNjEgNjMgMzkgMzIgMzcgMzMgMzEgMzggNjIgMzggMzAgNjQgMzkgMzkgNjIgNjMgMzMgMzQgMzAgMzQgMzUgMzYgNjIgNjQ8L1N0cmluZ1RvU2lnbkJ5dGVzPjxDYW5vbmljYWxSZXF1ZXN0PlBVVAovYmxvYi1mb3Itc2lnbmluZwpYLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZhbXA7WC1BbXotQ2hlY2tzdW0tTW9kZT1FTkFCTEVEJmFtcDtYLUFtei1DcmVkZW50aWFsPUFLSUFXVVdFVVNQVUxZWDNCTDNNJTJGMjAyNjAzMTklMkZ1cy13ZXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZhbXA7WC1BbXotRGF0ZT0yMDI2MDMxOVQxNTI4NDZaJmFtcDtYLUFtei1FeHBpcmVzPTM2MDAmYW1wO1gtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhbXA7eC1pZD1HZXRPYmplY3QKaG9zdDpnby1jbG91ZC10ZXN0aW5nLTIuczMudXMtd2VzdC0xLmFtYXpvbmF3cy5jb20KCmhvc3QKVU5TSUdORUQtUEFZTE9BRDwvQ2Fub25pY2FsUmVxdWVzdD48Q2Fub25pY2FsUmVxdWVzdEJ5dGVzPjUwIDU1IDU0IDBhIDJmIDYyIDZjIDZmIDYyIDJkIDY2IDZmIDcyIDJkIDczIDY5IDY3IDZlIDY5IDZlIDY3IDBhIDU4IDJkIDQxIDZkIDdhIDJkIDQxIDZjIDY3IDZmIDcyIDY5IDc0IDY4IDZkIDNkIDQxIDU3IDUzIDM0IDJkIDQ4IDRkIDQxIDQzIDJkIDUzIDQ4IDQxIDMyIDM1IDM2IDI2IDU4IDJkIDQxIDZkIDdhIDJkIDQzIDY4IDY1IDYzIDZiIDczIDc1IDZkIDJkIDRkIDZmIDY0IDY1IDNkIDQ1IDRlIDQxIDQyIDRjIDQ1IDQ0IDI2IDU4IDJkIDQxIDZkIDdhIDJkIDQzIDcyIDY1IDY0IDY1IDZlIDc0IDY5IDYxIDZjIDNkIDQxIDRiIDQ5IDQxIDU3IDU1IDU3IDQ1IDU1IDUzIDUwIDU1IDRjIDU5IDU4IDMzIDQyIDRjIDMzIDRkIDI1IDMyIDQ2IDMyIDMwIDMyIDM2IDMwIDMzIDMxIDM5IDI1IDMyIDQ2IDc1IDczIDJkIDc3IDY1IDczIDc0IDJkIDMxIDI1IDMyIDQ2IDczIDMzIDI1IDMyIDQ2IDYxIDc3IDczIDM0IDVmIDcyIDY1IDcxIDc1IDY1IDczIDc0IDI2IDU4IDJkIDQxIDZkIDdhIDJkIDQ0IDYxIDc0IDY1IDNkIDMyIDMwIDMyIDM2IDMwIDMzIDMxIDM5IDU0IDMxIDM1IDMyIDM4IDM0IDM2IDVhIDI2IDU4IDJkIDQxIDZkIDdhIDJkIDQ1IDc4IDcwIDY5IDcyIDY1IDczIDNkIDMzIDM2IDMwIDMwIDI2IDU4IDJkIDQxIDZkIDdhIDJkIDUzIDY5IDY3IDZlIDY1IDY0IDQ4IDY1IDYxIDY0IDY1IDcyIDczIDNkIDY4IDZmIDczIDc0IDI2IDc4IDJkIDY5IDY0IDNkIDQ3IDY1IDc0IDRmIDYyIDZhIDY1IDYzIDc0IDBhIDY4IDZmIDczIDc0IDNhIDY3IDZmIDJkIDYzIDZjIDZmIDc1IDY0IDJkIDc0IDY1IDczIDc0IDY5IDZlIDY3IDJkIDMyIDJlIDczIDMzIDJlIDc1IDczIDJkIDc3IDY1IDczIDc0IDJkIDMxIDJlIDYxIDZkIDYxIDdhIDZmIDZlIDYxIDc3IDczIDJlIDYzIDZmIDZkIDBhIDBhIDY4IDZmIDczIDc0IDBhIDU1IDRlIDUzIDQ5IDQ3IDRlIDQ1IDQ0IDJkIDUwIDQxIDU5IDRjIDRmIDQxIDQ0PC9DYW5vbmljYWxSZXF1ZXN0Qnl0ZXM+PFJlcXVlc3RJZD5IOFJNMFlXQlBISjVWU1RNPC9SZXF1ZXN0SWQ+PEhvc3RJZD5tUjZBZDBMMkJLNm92eWhQQWVBM0JxSjUxMjlteXlHSFZpSFl6VXh1WjNDK0hTMUtnb0YyeXZyUXdGMTBLYnBZdjRRMnNtNm5vcEE9PC9Ib3N0SWQ+PC9FcnJvcj4=" } }, { "ID": "baef9af875f7d65d", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-signing?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=PutObject", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "11" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "aGVsbG8gd29ybGQ=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:47 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc64nvme": [ "jSnVw/bqjr4=" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "27EzUdmnMoiBv9NZZ3YBdFp04RnFTKAVxIn+zNOqdJoBPva8UeiYQytwiKTEc3GCdQA/UAQGn2k=" ], "X-Amz-Request-Id": [ "H8RNCK53P1XZ01N8" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "68c4f19cc291ac58", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-signing?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=PutObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "lIyR3Bcx1hl0zr+F0cBdyssA1jZP40b6G9cbtQ/OH3pD6ZkYgGn7+bDFpaPcDLUnkbSbwvt0jwA=" ], "X-Amz-Request-Id": [ "H8RRR1MY40XYAHTR" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPlNpZ25hdHVyZURvZXNOb3RNYXRjaDwvQ29kZT48TWVzc2FnZT5UaGUgcmVxdWVzdCBzaWduYXR1cmUgd2UgY2FsY3VsYXRlZCBkb2VzIG5vdCBtYXRjaCB0aGUgc2lnbmF0dXJlIHlvdSBwcm92aWRlZC4gQ2hlY2sgeW91ciBrZXkgYW5kIHNpZ25pbmcgbWV0aG9kLjwvTWVzc2FnZT48QVdTQWNjZXNzS2V5SWQ+QUtJQVdVV0VVU1BVTFlYM0JMM008L0FXU0FjY2Vzc0tleUlkPjxTdHJpbmdUb1NpZ24+QVdTNC1ITUFDLVNIQTI1NgoyMDI2MDMxOVQxNTI4NDZaCjIwMjYwMzE5L3VzLXdlc3QtMS9zMy9hd3M0X3JlcXVlc3QKZGFjMGI4NDBhZDc4YTI3MDcxMzVmY2RkYjVhZDY5OGNhZjgyMDkwZGI3NzVlMzI5MTQ0NzgyNzNmMGM3YzA3MDwvU3RyaW5nVG9TaWduPjxTaWduYXR1cmVQcm92aWRlZD4zNTQ2ODE2NzgxZmZkYzEzOGViZTQ1ZjRhNjAwMDg2OGFiM2I1MzE1ZDM0NDYyMjYyYTI2ZGZkNjFhZmNiNmFmPC9TaWduYXR1cmVQcm92aWRlZD48U3RyaW5nVG9TaWduQnl0ZXM+NDEgNTcgNTMgMzQgMmQgNDggNGQgNDEgNDMgMmQgNTMgNDggNDEgMzIgMzUgMzYgMGEgMzIgMzAgMzIgMzYgMzAgMzMgMzEgMzkgNTQgMzEgMzUgMzIgMzggMzQgMzYgNWEgMGEgMzIgMzAgMzIgMzYgMzAgMzMgMzEgMzkgMmYgNzUgNzMgMmQgNzcgNjUgNzMgNzQgMmQgMzEgMmYgNzMgMzMgMmYgNjEgNzcgNzMgMzQgNWYgNzIgNjUgNzEgNzUgNjUgNzMgNzQgMGEgNjQgNjEgNjMgMzAgNjIgMzggMzQgMzAgNjEgNjQgMzcgMzggNjEgMzIgMzcgMzAgMzcgMzEgMzMgMzUgNjYgNjMgNjQgNjQgNjIgMzUgNjEgNjQgMzYgMzkgMzggNjMgNjEgNjYgMzggMzIgMzAgMzkgMzAgNjQgNjIgMzcgMzcgMzUgNjUgMzMgMzIgMzkgMzEgMzQgMzQgMzcgMzggMzIgMzcgMzMgNjYgMzAgNjMgMzcgNjMgMzAgMzcgMzA8L1N0cmluZ1RvU2lnbkJ5dGVzPjxDYW5vbmljYWxSZXF1ZXN0PkdFVAovYmxvYi1mb3Itc2lnbmluZwpYLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZhbXA7WC1BbXotQ3JlZGVudGlhbD1BS0lBV1VXRVVTUFVMWVgzQkwzTSUyRjIwMjYwMzE5JTJGdXMtd2VzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmYW1wO1gtQW16LURhdGU9MjAyNjAzMTlUMTUyODQ2WiZhbXA7WC1BbXotRXhwaXJlcz0zNjAwJmFtcDtYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYW1wO3gtaWQ9UHV0T2JqZWN0Cmhvc3Q6Z28tY2xvdWQtdGVzdGluZy0yLnMzLnVzLXdlc3QtMS5hbWF6b25hd3MuY29tCgpob3N0ClVOU0lHTkVELVBBWUxPQUQ8L0Nhbm9uaWNhbFJlcXVlc3Q+PENhbm9uaWNhbFJlcXVlc3RCeXRlcz40NyA0NSA1NCAwYSAyZiA2MiA2YyA2ZiA2MiAyZCA2NiA2ZiA3MiAyZCA3MyA2OSA2NyA2ZSA2OSA2ZSA2NyAwYSA1OCAyZCA0MSA2ZCA3YSAyZCA0MSA2YyA2NyA2ZiA3MiA2OSA3NCA2OCA2ZCAzZCA0MSA1NyA1MyAzNCAyZCA0OCA0ZCA0MSA0MyAyZCA1MyA0OCA0MSAzMiAzNSAzNiAyNiA1OCAyZCA0MSA2ZCA3YSAyZCA0MyA3MiA2NSA2NCA2NSA2ZSA3NCA2OSA2MSA2YyAzZCA0MSA0YiA0OSA0MSA1NyA1NSA1NyA0NSA1NSA1MyA1MCA1NSA0YyA1OSA1OCAzMyA0MiA0YyAzMyA0ZCAyNSAzMiA0NiAzMiAzMCAzMiAzNiAzMCAzMyAzMSAzOSAyNSAzMiA0NiA3NSA3MyAyZCA3NyA2NSA3MyA3NCAyZCAzMSAyNSAzMiA0NiA3MyAzMyAyNSAzMiA0NiA2MSA3NyA3MyAzNCA1ZiA3MiA2NSA3MSA3NSA2NSA3MyA3NCAyNiA1OCAyZCA0MSA2ZCA3YSAyZCA0NCA2MSA3NCA2NSAzZCAzMiAzMCAzMiAzNiAzMCAzMyAzMSAzOSA1NCAzMSAzNSAzMiAzOCAzNCAzNiA1YSAyNiA1OCAyZCA0MSA2ZCA3YSAyZCA0NSA3OCA3MCA2OSA3MiA2NSA3MyAzZCAzMyAzNiAzMCAzMCAyNiA1OCAyZCA0MSA2ZCA3YSAyZCA1MyA2OSA2NyA2ZSA2NSA2NCA0OCA2NSA2MSA2NCA2NSA3MiA3MyAzZCA2OCA2ZiA3MyA3NCAyNiA3OCAyZCA2OSA2NCAzZCA1MCA3NSA3NCA0ZiA2MiA2YSA2NSA2MyA3NCAwYSA2OCA2ZiA3MyA3NCAzYSA2NyA2ZiAyZCA2MyA2YyA2ZiA3NSA2NCAyZCA3NCA2NSA3MyA3NCA2OSA2ZSA2NyAyZCAzMiAyZSA3MyAzMyAyZSA3NSA3MyAyZCA3NyA2NSA3MyA3NCAyZCAzMSAyZSA2MSA2ZCA2MSA3YSA2ZiA2ZSA2MSA3NyA3MyAyZSA2MyA2ZiA2ZCAwYSAwYSA2OCA2ZiA3MyA3NCAwYSA1NSA0ZSA1MyA0OSA0NyA0ZSA0NSA0NCAyZCA1MCA0MSA1OSA0YyA0ZiA0MSA0NDwvQ2Fub25pY2FsUmVxdWVzdEJ5dGVzPjxSZXF1ZXN0SWQ+SDhSUlIxTVk0MFhZQUhUUjwvUmVxdWVzdElkPjxIb3N0SWQ+bEl5UjNCY3gxaGwwenIrRjBjQmR5c3NBMWpaUDQwYjZHOWNidFEvT0gzcEQ2WmtZZ0duNytiREZwYVBjRExVbmtiU2J3dnQwandBPTwvSG9zdElkPjwvRXJyb3I+" } }, { "ID": "e21b3f992491c98f", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-signing", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "a8/+19PcwFp0J25o7qSmZhCE9E6wgjN+t5MAwLfJOYM3c125+6lUov4ZbY5o+J5uNhmo8XS3R1c=" ], "X-Amz-Request-Id": [ "H8RK0NBXQ1TPSN2N" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPkFjY2Vzc0RlbmllZDwvQ29kZT48TWVzc2FnZT5BY2Nlc3MgRGVuaWVkPC9NZXNzYWdlPjxSZXF1ZXN0SWQ+SDhSSzBOQlhRMVRQU04yTjwvUmVxdWVzdElkPjxIb3N0SWQ+YTgvKzE5UGN3RnAwSjI1bzdxU21aaENFOUU2d2dqTit0NU1Bd0xmSk9ZTTNjMTI1KzZsVW92NFpiWTVvK0o1dU5obW84WFMzUjFjPTwvSG9zdElkPjwvRXJyb3I+" } }, { "ID": "1d9443d1a492cf9b", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-signing?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "11" ], "Content-Type": [ "binary/octet-stream" ], "Date": [ "Thu, 19 Mar 2026 15:28:47 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:47 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "QSHCxJFUtWWnjjk1XFQOqPQnmjJgJxUCTa71lvbuT/7vEGgcVvKvvBNv/QKIhBWqK1UriUfDXeM=" ], "X-Amz-Request-Id": [ "H8RZ35V0E63VWFCK" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8gd29ybGQ=" } }, { "ID": "38dced70cbd3e43a", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-signing?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Checksum-Mode=ENABLED\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=GetObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Qzad6o51g/TOjK4J+/KIKGXTy8cO51eOvjlNEj6dQruED+KQN5r+E0f6O71Oh3Rhf+f3uH09qEo=" ], "X-Amz-Request-Id": [ "H8RHBJ7Z58FV5FEG" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPlNpZ25hdHVyZURvZXNOb3RNYXRjaDwvQ29kZT48TWVzc2FnZT5UaGUgcmVxdWVzdCBzaWduYXR1cmUgd2UgY2FsY3VsYXRlZCBkb2VzIG5vdCBtYXRjaCB0aGUgc2lnbmF0dXJlIHlvdSBwcm92aWRlZC4gQ2hlY2sgeW91ciBrZXkgYW5kIHNpZ25pbmcgbWV0aG9kLjwvTWVzc2FnZT48QVdTQWNjZXNzS2V5SWQ+QUtJQVdVV0VVU1BVTFlYM0JMM008L0FXU0FjY2Vzc0tleUlkPjxTdHJpbmdUb1NpZ24+QVdTNC1ITUFDLVNIQTI1NgoyMDI2MDMxOVQxNTI4NDZaCjIwMjYwMzE5L3VzLXdlc3QtMS9zMy9hd3M0X3JlcXVlc3QKOTFhMDE5YjAyYmJkMTRiNmU2NzA2ZGQ1OTRlODc4MTQxYjE3YzA5YjUzZDc4NmQ1ZjI3ZjIyYjhiODI3MzkxODwvU3RyaW5nVG9TaWduPjxTaWduYXR1cmVQcm92aWRlZD5lNmYwMzZjZTQ2ODU0M2FiZDMyNmMwZTRlMjA5OWJkZDNmZTE1ZDg1MWY1MTg2M2ZmNjhmNWIwZGVjZDA2ZTg4PC9TaWduYXR1cmVQcm92aWRlZD48U3RyaW5nVG9TaWduQnl0ZXM+NDEgNTcgNTMgMzQgMmQgNDggNGQgNDEgNDMgMmQgNTMgNDggNDEgMzIgMzUgMzYgMGEgMzIgMzAgMzIgMzYgMzAgMzMgMzEgMzkgNTQgMzEgMzUgMzIgMzggMzQgMzYgNWEgMGEgMzIgMzAgMzIgMzYgMzAgMzMgMzEgMzkgMmYgNzUgNzMgMmQgNzcgNjUgNzMgNzQgMmQgMzEgMmYgNzMgMzMgMmYgNjEgNzcgNzMgMzQgNWYgNzIgNjUgNzEgNzUgNjUgNzMgNzQgMGEgMzkgMzEgNjEgMzAgMzEgMzkgNjIgMzAgMzIgNjIgNjIgNjQgMzEgMzQgNjIgMzYgNjUgMzYgMzcgMzAgMzYgNjQgNjQgMzUgMzkgMzQgNjUgMzggMzcgMzggMzEgMzQgMzEgNjIgMzEgMzcgNjMgMzAgMzkgNjIgMzUgMzMgNjQgMzcgMzggMzYgNjQgMzUgNjYgMzIgMzcgNjYgMzIgMzIgNjIgMzggNjIgMzggMzIgMzcgMzMgMzkgMzEgMzg8L1N0cmluZ1RvU2lnbkJ5dGVzPjxDYW5vbmljYWxSZXF1ZXN0PkRFTEVURQovYmxvYi1mb3Itc2lnbmluZwpYLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZhbXA7WC1BbXotQ2hlY2tzdW0tTW9kZT1FTkFCTEVEJmFtcDtYLUFtei1DcmVkZW50aWFsPUFLSUFXVVdFVVNQVUxZWDNCTDNNJTJGMjAyNjAzMTklMkZ1cy13ZXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZhbXA7WC1BbXotRGF0ZT0yMDI2MDMxOVQxNTI4NDZaJmFtcDtYLUFtei1FeHBpcmVzPTM2MDAmYW1wO1gtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhbXA7eC1pZD1HZXRPYmplY3QKaG9zdDpnby1jbG91ZC10ZXN0aW5nLTIuczMudXMtd2VzdC0xLmFtYXpvbmF3cy5jb20KCmhvc3QKVU5TSUdORUQtUEFZTE9BRDwvQ2Fub25pY2FsUmVxdWVzdD48Q2Fub25pY2FsUmVxdWVzdEJ5dGVzPjQ0IDQ1IDRjIDQ1IDU0IDQ1IDBhIDJmIDYyIDZjIDZmIDYyIDJkIDY2IDZmIDcyIDJkIDczIDY5IDY3IDZlIDY5IDZlIDY3IDBhIDU4IDJkIDQxIDZkIDdhIDJkIDQxIDZjIDY3IDZmIDcyIDY5IDc0IDY4IDZkIDNkIDQxIDU3IDUzIDM0IDJkIDQ4IDRkIDQxIDQzIDJkIDUzIDQ4IDQxIDMyIDM1IDM2IDI2IDU4IDJkIDQxIDZkIDdhIDJkIDQzIDY4IDY1IDYzIDZiIDczIDc1IDZkIDJkIDRkIDZmIDY0IDY1IDNkIDQ1IDRlIDQxIDQyIDRjIDQ1IDQ0IDI2IDU4IDJkIDQxIDZkIDdhIDJkIDQzIDcyIDY1IDY0IDY1IDZlIDc0IDY5IDYxIDZjIDNkIDQxIDRiIDQ5IDQxIDU3IDU1IDU3IDQ1IDU1IDUzIDUwIDU1IDRjIDU5IDU4IDMzIDQyIDRjIDMzIDRkIDI1IDMyIDQ2IDMyIDMwIDMyIDM2IDMwIDMzIDMxIDM5IDI1IDMyIDQ2IDc1IDczIDJkIDc3IDY1IDczIDc0IDJkIDMxIDI1IDMyIDQ2IDczIDMzIDI1IDMyIDQ2IDYxIDc3IDczIDM0IDVmIDcyIDY1IDcxIDc1IDY1IDczIDc0IDI2IDU4IDJkIDQxIDZkIDdhIDJkIDQ0IDYxIDc0IDY1IDNkIDMyIDMwIDMyIDM2IDMwIDMzIDMxIDM5IDU0IDMxIDM1IDMyIDM4IDM0IDM2IDVhIDI2IDU4IDJkIDQxIDZkIDdhIDJkIDQ1IDc4IDcwIDY5IDcyIDY1IDczIDNkIDMzIDM2IDMwIDMwIDI2IDU4IDJkIDQxIDZkIDdhIDJkIDUzIDY5IDY3IDZlIDY1IDY0IDQ4IDY1IDYxIDY0IDY1IDcyIDczIDNkIDY4IDZmIDczIDc0IDI2IDc4IDJkIDY5IDY0IDNkIDQ3IDY1IDc0IDRmIDYyIDZhIDY1IDYzIDc0IDBhIDY4IDZmIDczIDc0IDNhIDY3IDZmIDJkIDYzIDZjIDZmIDc1IDY0IDJkIDc0IDY1IDczIDc0IDY5IDZlIDY3IDJkIDMyIDJlIDczIDMzIDJlIDc1IDczIDJkIDc3IDY1IDczIDc0IDJkIDMxIDJlIDYxIDZkIDYxIDdhIDZmIDZlIDYxIDc3IDczIDJlIDYzIDZmIDZkIDBhIDBhIDY4IDZmIDczIDc0IDBhIDU1IDRlIDUzIDQ5IDQ3IDRlIDQ1IDQ0IDJkIDUwIDQxIDU5IDRjIDRmIDQxIDQ0PC9DYW5vbmljYWxSZXF1ZXN0Qnl0ZXM+PFJlcXVlc3RJZD5IOFJIQko3WjU4RlY1RkVHPC9SZXF1ZXN0SWQ+PEhvc3RJZD5RemFkNm81MWcvVE9qSzRKKy9LSUtHWFR5OGNPNTFlT3ZqbE5FajZkUXJ1RUQrS1FONXIrRTBmNk83MU9oM1JoZitmM3VIMDlxRW89PC9Ib3N0SWQ+PC9FcnJvcj4=" } }, { "ID": "9d89ec7cf6e52bb7", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-signing?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Date=CLEARED\u0026X-Amz-Expires=3600\u0026X-Amz-SignedHeaders=host\u0026x-id=PutObject", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:46 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "cVRD8/0gReUy/PeLF1JWnPgVUWVIOJABY9IZLnfOphLyz7JREYEGw4YOjiywPb7VcTMHHJl7b0g=" ], "X-Amz-Request-Id": [ "H8RZRDKENV44BEPP" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPlNpZ25hdHVyZURvZXNOb3RNYXRjaDwvQ29kZT48TWVzc2FnZT5UaGUgcmVxdWVzdCBzaWduYXR1cmUgd2UgY2FsY3VsYXRlZCBkb2VzIG5vdCBtYXRjaCB0aGUgc2lnbmF0dXJlIHlvdSBwcm92aWRlZC4gQ2hlY2sgeW91ciBrZXkgYW5kIHNpZ25pbmcgbWV0aG9kLjwvTWVzc2FnZT48QVdTQWNjZXNzS2V5SWQ+QUtJQVdVV0VVU1BVTFlYM0JMM008L0FXU0FjY2Vzc0tleUlkPjxTdHJpbmdUb1NpZ24+QVdTNC1ITUFDLVNIQTI1NgoyMDI2MDMxOVQxNTI4NDZaCjIwMjYwMzE5L3VzLXdlc3QtMS9zMy9hd3M0X3JlcXVlc3QKOGUxNDNkYjNlZmQwNmMyMWZmYjc2MmRhZWY5MWNhODAyZGY2YTFjYjU4MmQzMTQxMmFmMjg2ZTY4NzI3YmRjYjwvU3RyaW5nVG9TaWduPjxTaWduYXR1cmVQcm92aWRlZD4zNTQ2ODE2NzgxZmZkYzEzOGViZTQ1ZjRhNjAwMDg2OGFiM2I1MzE1ZDM0NDYyMjYyYTI2ZGZkNjFhZmNiNmFmPC9TaWduYXR1cmVQcm92aWRlZD48U3RyaW5nVG9TaWduQnl0ZXM+NDEgNTcgNTMgMzQgMmQgNDggNGQgNDEgNDMgMmQgNTMgNDggNDEgMzIgMzUgMzYgMGEgMzIgMzAgMzIgMzYgMzAgMzMgMzEgMzkgNTQgMzEgMzUgMzIgMzggMzQgMzYgNWEgMGEgMzIgMzAgMzIgMzYgMzAgMzMgMzEgMzkgMmYgNzUgNzMgMmQgNzcgNjUgNzMgNzQgMmQgMzEgMmYgNzMgMzMgMmYgNjEgNzcgNzMgMzQgNWYgNzIgNjUgNzEgNzUgNjUgNzMgNzQgMGEgMzggNjUgMzEgMzQgMzMgNjQgNjIgMzMgNjUgNjYgNjQgMzAgMzYgNjMgMzIgMzEgNjYgNjYgNjIgMzcgMzYgMzIgNjQgNjEgNjUgNjYgMzkgMzEgNjMgNjEgMzggMzAgMzIgNjQgNjYgMzYgNjEgMzEgNjMgNjIgMzUgMzggMzIgNjQgMzMgMzEgMzQgMzEgMzIgNjEgNjYgMzIgMzggMzYgNjUgMzYgMzggMzcgMzIgMzcgNjIgNjQgNjMgNjI8L1N0cmluZ1RvU2lnbkJ5dGVzPjxDYW5vbmljYWxSZXF1ZXN0PkRFTEVURQovYmxvYi1mb3Itc2lnbmluZwpYLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZhbXA7WC1BbXotQ3JlZGVudGlhbD1BS0lBV1VXRVVTUFVMWVgzQkwzTSUyRjIwMjYwMzE5JTJGdXMtd2VzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmYW1wO1gtQW16LURhdGU9MjAyNjAzMTlUMTUyODQ2WiZhbXA7WC1BbXotRXhwaXJlcz0zNjAwJmFtcDtYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYW1wO3gtaWQ9UHV0T2JqZWN0Cmhvc3Q6Z28tY2xvdWQtdGVzdGluZy0yLnMzLnVzLXdlc3QtMS5hbWF6b25hd3MuY29tCgpob3N0ClVOU0lHTkVELVBBWUxPQUQ8L0Nhbm9uaWNhbFJlcXVlc3Q+PENhbm9uaWNhbFJlcXVlc3RCeXRlcz40NCA0NSA0YyA0NSA1NCA0NSAwYSAyZiA2MiA2YyA2ZiA2MiAyZCA2NiA2ZiA3MiAyZCA3MyA2OSA2NyA2ZSA2OSA2ZSA2NyAwYSA1OCAyZCA0MSA2ZCA3YSAyZCA0MSA2YyA2NyA2ZiA3MiA2OSA3NCA2OCA2ZCAzZCA0MSA1NyA1MyAzNCAyZCA0OCA0ZCA0MSA0MyAyZCA1MyA0OCA0MSAzMiAzNSAzNiAyNiA1OCAyZCA0MSA2ZCA3YSAyZCA0MyA3MiA2NSA2NCA2NSA2ZSA3NCA2OSA2MSA2YyAzZCA0MSA0YiA0OSA0MSA1NyA1NSA1NyA0NSA1NSA1MyA1MCA1NSA0YyA1OSA1OCAzMyA0MiA0YyAzMyA0ZCAyNSAzMiA0NiAzMiAzMCAzMiAzNiAzMCAzMyAzMSAzOSAyNSAzMiA0NiA3NSA3MyAyZCA3NyA2NSA3MyA3NCAyZCAzMSAyNSAzMiA0NiA3MyAzMyAyNSAzMiA0NiA2MSA3NyA3MyAzNCA1ZiA3MiA2NSA3MSA3NSA2NSA3MyA3NCAyNiA1OCAyZCA0MSA2ZCA3YSAyZCA0NCA2MSA3NCA2NSAzZCAzMiAzMCAzMiAzNiAzMCAzMyAzMSAzOSA1NCAzMSAzNSAzMiAzOCAzNCAzNiA1YSAyNiA1OCAyZCA0MSA2ZCA3YSAyZCA0NSA3OCA3MCA2OSA3MiA2NSA3MyAzZCAzMyAzNiAzMCAzMCAyNiA1OCAyZCA0MSA2ZCA3YSAyZCA1MyA2OSA2NyA2ZSA2NSA2NCA0OCA2NSA2MSA2NCA2NSA3MiA3MyAzZCA2OCA2ZiA3MyA3NCAyNiA3OCAyZCA2OSA2NCAzZCA1MCA3NSA3NCA0ZiA2MiA2YSA2NSA2MyA3NCAwYSA2OCA2ZiA3MyA3NCAzYSA2NyA2ZiAyZCA2MyA2YyA2ZiA3NSA2NCAyZCA3NCA2NSA3MyA3NCA2OSA2ZSA2NyAyZCAzMiAyZSA3MyAzMyAyZSA3NSA3MyAyZCA3NyA2NSA3MyA3NCAyZCAzMSAyZSA2MSA2ZCA2MSA3YSA2ZiA2ZSA2MSA3NyA3MyAyZSA2MyA2ZiA2ZCAwYSAwYSA2OCA2ZiA3MyA3NCAwYSA1NSA0ZSA1MyA0OSA0NyA0ZSA0NSA0NCAyZCA1MCA0MSA1OSA0YyA0ZiA0MSA0NDwvQ2Fub25pY2FsUmVxdWVzdEJ5dGVzPjxSZXF1ZXN0SWQ+SDhSWlJES0VOVjQ0QkVQUDwvUmVxdWVzdElkPjxIb3N0SWQ+Y1ZSRDgvMGdSZVV5L1BlTEYxSlduUGdWVVdWSU9KQUJZOUlaTG5mT3BoTHl6N0pSRVlFR3c0WU9qaXl3UGI3VmNUTUhISmw3YjBnPTwvSG9zdElkPjwvRXJyb3I+" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestUploadDownload.replay ================================================ { "Initial": "AQAAAA7hTg0iIUGywAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "174ba01ce14df6d0", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-upload-download?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "52" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "11" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text", "BodyParts": [ "Yg0KdXAgYW5kIGRvd24NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk9KM3lsQT09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:35 GMT" ], "Etag": [ "\"1b75533ed5a869ff6f3ae0336d0c3320\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "OJ3ylA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "zmHflKo4yL3iMgdKIXq0+wOE0wFYSe7btFmVSSeJmr8oP+hREz+lYiVyHZvhQ09SbFbF0K0ORDYAWb90CnFvAfKTe5aF5db8" ], "X-Amz-Request-Id": [ "FVF50PJ3ZN3QHGY9" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "2b7efce59ac524d1", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-upload-download?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "11" ], "Content-Type": [ "text" ], "Date": [ "Thu, 19 Mar 2026 15:28:35 GMT" ], "Etag": [ "\"1b75533ed5a869ff6f3ae0336d0c3320\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:35 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "OJ3ylA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "x23wYqew2GxU9wXm/7KFJ0+CDTMRh1mz7qaXy/CUVVegGWlJ4i5c/l8qknPgBoSLhknwO+khMOhTGqSi5Jlq/rF7Ry2BnEiP" ], "X-Amz-Request-Id": [ "FVFBGRHFGKFC2GR9" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "dXAgYW5kIGRvd24=" } }, { "ID": "88f915e9f7b85f27", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-upload-download?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "52" ], "Content-Md5": [ "G3VTPtWoaf9vOuAzbQwzIA==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "11" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text", "BodyParts": [ "Yg0KdXAgYW5kIGRvd24NCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOk9KM3lsQT09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:35 GMT" ], "Etag": [ "\"1b75533ed5a869ff6f3ae0336d0c3320\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "OJ3ylA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "Lkb+ig5Q2W3BaiUwlebqC58LW2fXbPdbPWVuZZOQSSNHDZBRp5fZzeRJxJGYMslnrB5tEvvO7JTRPoqzdnla0GV+eUD+VC/o" ], "X-Amz-Request-Id": [ "FVFFDS5ZA6NJFJS9" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "3ed03f494c4f4cd6", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-upload-download", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "11" ], "Content-Type": [ "text" ], "Date": [ "Thu, 19 Mar 2026 15:28:35 GMT" ], "Etag": [ "\"1b75533ed5a869ff6f3ae0336d0c3320\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:35 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "UxaPpkKwwv3hEnIJQm8Z143FDzdHn2WsE64FghBHydybmrhvyDdVSqHfXUZ5gGFzEt5216flZfhIaIvTtReyJy+O3aYtsI6G" ], "X-Amz-Request-Id": [ "FVFCJAM1H1YYTP2A" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "a7b0c38fe5a58088", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-upload-download?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:35 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "gZb+Tc3FhB7OO0fXgRk9DVohIAuare5RgEwzsvIr7qP2RiyNnqSG8xihRmoYAmcmIjOHw1zc6O54Ess8+bTeD6RPKTYygtul" ], "X-Amz-Request-Id": [ "FVF4469SVZ8EPB8C" ] }, "Body": "" } }, { "ID": "fbca228af713a7a7", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-upload-download", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:34 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "GYoDXPIr9GHEKnlQMqRexSuYA4rG5iNSfTI0Lmsu5iEfA3bBP0twOFvYTWHv5is3XQKP5SfNGw8Uy3bm6X7WBxWNp+IX9OmZ" ], "X-Amz-Request-Id": [ "FVFEWYPQFNMMGX8S" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestWrite/ContentType_is_discovered_if_not_provided.replay ================================================ { "Initial": "AQAAAA7hTg0dKEENcwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "db41352dd673b26a", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "6398" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "6354" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/html", "BodyParts": [ "MThkMg0KPCFET0NUWVBFIGh0bWw+PGh0bWwgbGFuZz0iZW4iPgo8aGVhZCBwcm9maWxlPSJodHRwOi8vYTkuY29tLy0vc3BlYy9vcGVuc2VhcmNoLzEuMS8iPgogIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgPGxpbmsgaHJlZj0iLy0vYm9vdHN0cmFwLm1pbi5jc3M/dj04YmVjMWJiYTNlMjNlY2JhMjJjZmZiMTk3YTJkNDQwYWY0MTBiMTVkIiByZWw9InN0eWxlc2hlZXQiPgogIDxsaW5rIGhyZWY9Ii8tL3NpdGUuY3NzP3Y9N2Q4MWY0MTA0Yzg5ZGJlMzc2MzQ1ZjZiZmUzZTYyYjRlNDBkM2QwNiIgcmVsPSJzdHlsZXNoZWV0Ij4KICA8dGl0bGU+R29Eb2M8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5Pgo8bmF2IGNsYXNzPSJuYXZiYXIgbmF2YmFyLWRlZmF1bHQiIHJvbGU9Im5hdmlnYXRpb24iPgogIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgPGRpdiBjbGFzcz0ibmF2YmFyLWhlYWRlciI+CiAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Im5hdmJhci10b2dnbGUiIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSIgZGF0YS10YXJnZXQ9Ii5uYXZiYXItY29sbGFwc2UiPgogICAgICA8c3BhbiBjbGFzcz0ic3Itb25seSI+VG9nZ2xlIG5hdmlnYXRpb248L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iaWNvbi1iYXIiPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9Imljb24tYmFyIj48L3NwYW4+CiAgICA8L2J1dHRvbj4KICAgIDxhIGNsYXNzPSJuYXZiYXItYnJhbmQiIGhyZWY9Ii8iPjxzdHJvbmc+R29Eb2M8L3N0cm9uZz48L2E+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlIj4KICAgIDx1bCBjbGFzcz0ibmF2IG5hdmJhci1uYXYiPgogICAgICAgIDxsaSBjbGFzcz0iYWN0aXZlIj48YSBocmVmPSIvIj5Ib21lPC9hPjwvbGk+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dDwvYT48L2xpPgogICAgPC91bD4KICAgIDxmb3JtIGNsYXNzPSJuYXZiYXItbmF2IG5hdmJhci1mb3JtIG5hdmJhci1yaWdodCIgaWQ9Ingtc2VhcmNoIiBhY3Rpb249Ii8iIHJvbGU9InNlYXJjaCI+PGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJ4LXNlYXJjaC1xdWVyeSIgdHlwZT0idGV4dCIgbmFtZT0icSIgcGxhY2Vob2xkZXI9IlNlYXJjaCI+PC9mb3JtPgogIDwvZGl2Pgo8L2Rpdj4KPC9uYXY+CjxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgCjxkaXYgY2xhc3M9Imp1bWJvdHJvbiI+CiAgICA8aDI+U2VhcmNoIGZvciBHbyBQYWNrYWdlczwvaDI+CiAgICAKICA8Zm9ybT4KICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5hbWU9InEiIGF1dG9mb2N1cz0iYXV0b2ZvY3VzIiB2YWx1ZT0iIiBwbGFjZWhvbGRlcj0iU2VhcmNoIGZvciBwYWNrYWdlIGJ5IGltcG9ydCBwYXRoIG9yIGtleXdvcmQuIiB0eXBlPSJ0ZXh0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImlucHV0LWdyb3VwLWJ0biI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IiB0eXBlPSJzdWJtaXQiPkdvITwvYnV0dG9uPgogICAgICA8L3NwYW4+CiAgICA8L2Rpdj4KICA8L2Zvcm0+Cgo8L2Rpdj4KCjxwPkdvRG9jIGhvc3RzIGRvY3VtZW50YXRpb24gZm9yIDxhIGhyZWY9Imh0dHA6Ly9nb2xhbmcub3JnLyI+R288L2E+IHBhY2thZ2VzCm9uIEJpdGJ1Y2tldCwgR2l0SHViLCBHb29nbGUgUHJvamVjdCBIb3N0aW5nIGFuZCBMYXVuY2hwYWQuICBSZWFkIHRoZSA8YQogIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dCBQYWdlPC9hPiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYWRkaW5nIHBhY2thZ2VzIHRvIEdvRG9jCmFuZCBtb3JlLgoKPGRpdiBjbGFzcz0icm93Ij4KICA8ZGl2IGNsYXNzPSJjb2wtc20tNiI+CiAgICAKICAgICAgPGg0PlBvcHVsYXIgUGFja2FnZXM8L2g0PgogICAgICA8dWwgY2xhc3M9Imxpc3QtdW5zdHlsZWQiPgogICAgICAgIDxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1nby9hd3MiPmdpdGh1Yi5jb20vYXdzL2F3cy1zZGstZ28vYXdzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9kZ3JpamFsdmEvand0LWdvIj5naXRodWIuY29tL2RncmlqYWx2YS9qd3QtZ288L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dpbi1nb25pYy9naW4iPmdpdGh1Yi5jb20vZ2luLWdvbmljL2dpbjwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXMiPmdpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dvLXNxbC1kcml2ZXIvbXlzcWwiPmdpdGh1Yi5jb20vZ28tc3FsLWRyaXZlci9teXNxbDwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29sYW5nL3Byb3RvYnVmL3Byb3RvIj5naXRodWIuY29tL2dvbGFuZy9wcm90b2J1Zi9wcm90bzwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29tb2R1bGUvcmVkaWdvL3JlZGlzIj5naXRodWIuY29tL2dvbW9kdWxlL3JlZGlnby9yZWRpczwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQiPmdpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQ8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltIj5naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9qaW56aHUvZ29ybSI+Z2l0aHViLmNvbS9qaW56aHUvZ29ybTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vbGliL3BxIj5naXRodWIuY29tL2xpYi9wcTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcGtnL2Vycm9ycyI+Z2l0aHViLmNvbS9wa2cvZXJyb3JzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1cyI+Z2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1czwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcm9iZmlnL2Nyb24iPmdpdGh1Yi5jb20vcm9iZmlnL2Nyb248L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3NpcnVwc2VuL2xvZ3J1cyI+Z2l0aHViLmNvbS9zaXJ1cHNlbi9sb2dydXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0Ij5naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0PC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS91bml4cGlja2xlL2thaG9vdC1oYWNrIj5naXRodWIuY29tL3VuaXhwaWNrbGUva2Fob290LWhhY2s8L2E+PGxpPjxhIGhyZWY9Ii9nby51YmVyLm9yZy96YXAiPmdvLnViZXIub3JnL3phcDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9jcnlwdG8vc3NoIj5nb2xhbmcub3JnL3gvY3J5cHRvL3NzaDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9uZXQvY29udGV4dCI+Z29sYW5nLm9yZy94L25ldC9jb250ZXh0PC9hPjxsaT48YSBocmVmPSIvZ29sYW5nLm9yZy94L29hdXRoMiI+Z29sYW5nLm9yZy94L29hdXRoMjwvYT48bGk+PGEgaHJlZj0iL2dvb2dsZS5nb2xhbmcub3JnL2dycGMiPmdvb2dsZS5nb2xhbmcub3JnL2dycGM8L2E+PGxpPjxhIGhyZWY9Ii9nb3BrZy5pbi9tZ28udjIiPmdvcGtnLmluL21nby52MjwvYT48bGk+PGEgaHJlZj0iL2dvcGtnLmluL3lhbWwudjIiPmdvcGtnLmluL3lhbWwudjI8L2E+PGxpPjxhIGhyZWY9Ii9sYWJpeC5vcmcvdjIvbWdvIj5sYWJpeC5vcmcvdjIvbWdvPC9hPgogICAgICA8L3VsPgogICAgCiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sLXNtLTYiPgogICAgPGg0Pk1vcmUgUGFja2FnZXM8L2g0PgogICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIj4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL2dvIj5HbyBTdGFuZGFyZCBQYWNrYWdlczwvYT4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL3N1YnJlcG8iPkdvIFN1Yi1yZXBvc2l0b3J5IFBhY2thZ2VzPC9hPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9nb2xhbmcub3JnL3dpa2kvUHJvamVjdHMiPlByb2plY3RzIEAgZ28td2lraTwvYT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zZWFyY2g/bz1kZXNjJmFtcDtxPWxhbmd1YWdlJTNBZ28mYW1wO3M9c3RhcnMmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5Nb3N0IHN0YXJzPC9hPiwgCiAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NlYXJjaD9vPWRlc2MmYW1wO3E9bGFuZ3VhZ2UlM0FnbyZhbXA7cz1mb3JrcyZhbXA7dHlwZT1SZXBvc2l0b3JpZXMiPm1vc3QgZm9ya3M8L2E+LCAKICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2VhcmNoP289ZGVzYyZhbXA7cT1sYW5ndWFnZSUzQWdvJmFtcDtzPXVwZGF0ZWQmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5yZWNlbnRseSB1cGRhdGVkPC9hPiBvbiBHaXRIdWIKICAgIDwvdWw+CiAgPC9kaXY+CjwvZGl2PgoKCjwvZGl2Pgo8ZGl2IGlkPSJ4LWZvb3RlciIgY2xhc3M9ImNsZWFyZml4Ij4KICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2dvbGFuZy9nZGRvL2lzc3VlcyI+V2Vic2l0ZSBJc3N1ZXM8L2E+CiAgICA8c3BhbiBjbGFzcz0idGV4dC1tdXRlZCI+fDwvc3Bhbj4gPGEgaHJlZj0iaHR0cDovL2dvbGFuZy5vcmcvIj5HbyBMYW5ndWFnZTwvYT4KICAgIDxzcGFuIGNsYXNzPSJwdWxsLXJpZ2h0Ij48YSBocmVmPSIjIj5CYWNrIHRvIHRvcDwvYT48L3NwYW4+CiAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ieC1zaG9ydGN1dHMiIHRhYmluZGV4PSItMSIgY2xhc3M9Im1vZGFsIj4KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+CiAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvYnV0dG9uPgogICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+S2V5Ym9hcmQgc2hvcnRjdXRzPC9oND4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4/PC9iPjwvdGQ+PHRkPiA6IFRoaXMgbWVudTwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4vPC9iPjwvdGQ+PHRkPiA6IFNlYXJjaCBzaXRlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5mPC9iPjwvdGQ+PHRkPiA6IEp1bXAgdG8gaWRlbnRpZmllcjwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmc8L2I+PC90ZD48dGQ+IDogR28gdG8gdG9wIG9mIHBhZ2U8L3RkPjwvdHI+CiAgICAgICAgICA8dHI+PHRkIGFsaWduPSJyaWdodCI+PGI+ZzwvYj4gdGhlbiA8Yj5iPC9iPjwvdGQ+PHRkPiA6IEdvIHRvIGVuZCBvZiBwYWdlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmk8L2I+PC90ZD48dGQ+IDogR28gdG8gaW5kZXg8L3RkPjwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9InRleHQtbXV0ZWQiPjx0ZCBhbGlnbj0icmlnaHQiPjxiPmc8L2I+IHRoZW4gPGI+ZTwvYj48L3RkPjx0ZD4gOiBHbyB0byBleGFtcGxlczwvdGQ+PC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KPHNjcmlwdCBzcmM9Ii8tL2pxdWVyeS0yLjAuMy5taW4uanM/dj1mYmY5Yzc3ZDBjNGUzYzM0YTQ4NTk4MGMxZTUzMTZiNjIxMjE2MGM4Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL2Jvb3RzdHJhcC5taW4uanM/dj01YWRhN2MxMDNmYzFkZWFiYzkyNWNjMWZkYmJiNmU0NTFjMjFmYzcwIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL3NpdGUuanM/dj0zNzFkZTczMWMxOGQ5MWM0OTlkOTBiMWFiMGJmMzllY2Y2NmQ2Y2Y3Ij48L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+DQowDQp4LWFtei1jaGVja3N1bS1jcmMzMjplQ01DcWc9PQ0KDQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:30 GMT" ], "Etag": [ "\"0f6a7c9ff3d3d770b8f7fa19c2ae19d0\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "eCMCqg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "uJXkaaoFSWjV9BVxBlGZ9JCLh+B7RYs84g3S7rf6uSjH99InQws/e9gQYRinBdU2iPvlJYEP3wI=" ], "X-Amz-Request-Id": [ "DP0WJCA1ST5D7RWK" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "65127174285f0133", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "6354" ], "Content-Type": [ "text/html; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:30 GMT" ], "Etag": [ "\"0f6a7c9ff3d3d770b8f7fa19c2ae19d0\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:30 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "eCMCqg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "0yU97wfIRWFwbXgeU/jWwyfWZNPYi0dWGgNd/IHxNkWVQgNzjshPblZ8b8+PDX376be8IuM0Qbc=" ], "X-Amz-Request-Id": [ "DP0HHH4KE87C8Q7A" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PCFET0NUWVBFIGh0bWw+PGh0bWwgbGFuZz0iZW4iPgo8aGVhZCBwcm9maWxlPSJodHRwOi8vYTkuY29tLy0vc3BlYy9vcGVuc2VhcmNoLzEuMS8iPgogIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgPGxpbmsgaHJlZj0iLy0vYm9vdHN0cmFwLm1pbi5jc3M/dj04YmVjMWJiYTNlMjNlY2JhMjJjZmZiMTk3YTJkNDQwYWY0MTBiMTVkIiByZWw9InN0eWxlc2hlZXQiPgogIDxsaW5rIGhyZWY9Ii8tL3NpdGUuY3NzP3Y9N2Q4MWY0MTA0Yzg5ZGJlMzc2MzQ1ZjZiZmUzZTYyYjRlNDBkM2QwNiIgcmVsPSJzdHlsZXNoZWV0Ij4KICA8dGl0bGU+R29Eb2M8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5Pgo8bmF2IGNsYXNzPSJuYXZiYXIgbmF2YmFyLWRlZmF1bHQiIHJvbGU9Im5hdmlnYXRpb24iPgogIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgPGRpdiBjbGFzcz0ibmF2YmFyLWhlYWRlciI+CiAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Im5hdmJhci10b2dnbGUiIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSIgZGF0YS10YXJnZXQ9Ii5uYXZiYXItY29sbGFwc2UiPgogICAgICA8c3BhbiBjbGFzcz0ic3Itb25seSI+VG9nZ2xlIG5hdmlnYXRpb248L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iaWNvbi1iYXIiPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9Imljb24tYmFyIj48L3NwYW4+CiAgICA8L2J1dHRvbj4KICAgIDxhIGNsYXNzPSJuYXZiYXItYnJhbmQiIGhyZWY9Ii8iPjxzdHJvbmc+R29Eb2M8L3N0cm9uZz48L2E+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlIj4KICAgIDx1bCBjbGFzcz0ibmF2IG5hdmJhci1uYXYiPgogICAgICAgIDxsaSBjbGFzcz0iYWN0aXZlIj48YSBocmVmPSIvIj5Ib21lPC9hPjwvbGk+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dDwvYT48L2xpPgogICAgPC91bD4KICAgIDxmb3JtIGNsYXNzPSJuYXZiYXItbmF2IG5hdmJhci1mb3JtIG5hdmJhci1yaWdodCIgaWQ9Ingtc2VhcmNoIiBhY3Rpb249Ii8iIHJvbGU9InNlYXJjaCI+PGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJ4LXNlYXJjaC1xdWVyeSIgdHlwZT0idGV4dCIgbmFtZT0icSIgcGxhY2Vob2xkZXI9IlNlYXJjaCI+PC9mb3JtPgogIDwvZGl2Pgo8L2Rpdj4KPC9uYXY+CjxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgCjxkaXYgY2xhc3M9Imp1bWJvdHJvbiI+CiAgICA8aDI+U2VhcmNoIGZvciBHbyBQYWNrYWdlczwvaDI+CiAgICAKICA8Zm9ybT4KICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5hbWU9InEiIGF1dG9mb2N1cz0iYXV0b2ZvY3VzIiB2YWx1ZT0iIiBwbGFjZWhvbGRlcj0iU2VhcmNoIGZvciBwYWNrYWdlIGJ5IGltcG9ydCBwYXRoIG9yIGtleXdvcmQuIiB0eXBlPSJ0ZXh0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImlucHV0LWdyb3VwLWJ0biI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IiB0eXBlPSJzdWJtaXQiPkdvITwvYnV0dG9uPgogICAgICA8L3NwYW4+CiAgICA8L2Rpdj4KICA8L2Zvcm0+Cgo8L2Rpdj4KCjxwPkdvRG9jIGhvc3RzIGRvY3VtZW50YXRpb24gZm9yIDxhIGhyZWY9Imh0dHA6Ly9nb2xhbmcub3JnLyI+R288L2E+IHBhY2thZ2VzCm9uIEJpdGJ1Y2tldCwgR2l0SHViLCBHb29nbGUgUHJvamVjdCBIb3N0aW5nIGFuZCBMYXVuY2hwYWQuICBSZWFkIHRoZSA8YQogIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dCBQYWdlPC9hPiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYWRkaW5nIHBhY2thZ2VzIHRvIEdvRG9jCmFuZCBtb3JlLgoKPGRpdiBjbGFzcz0icm93Ij4KICA8ZGl2IGNsYXNzPSJjb2wtc20tNiI+CiAgICAKICAgICAgPGg0PlBvcHVsYXIgUGFja2FnZXM8L2g0PgogICAgICA8dWwgY2xhc3M9Imxpc3QtdW5zdHlsZWQiPgogICAgICAgIDxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1nby9hd3MiPmdpdGh1Yi5jb20vYXdzL2F3cy1zZGstZ28vYXdzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9kZ3JpamFsdmEvand0LWdvIj5naXRodWIuY29tL2RncmlqYWx2YS9qd3QtZ288L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dpbi1nb25pYy9naW4iPmdpdGh1Yi5jb20vZ2luLWdvbmljL2dpbjwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXMiPmdpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dvLXNxbC1kcml2ZXIvbXlzcWwiPmdpdGh1Yi5jb20vZ28tc3FsLWRyaXZlci9teXNxbDwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29sYW5nL3Byb3RvYnVmL3Byb3RvIj5naXRodWIuY29tL2dvbGFuZy9wcm90b2J1Zi9wcm90bzwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29tb2R1bGUvcmVkaWdvL3JlZGlzIj5naXRodWIuY29tL2dvbW9kdWxlL3JlZGlnby9yZWRpczwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQiPmdpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQ8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltIj5naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9qaW56aHUvZ29ybSI+Z2l0aHViLmNvbS9qaW56aHUvZ29ybTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vbGliL3BxIj5naXRodWIuY29tL2xpYi9wcTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcGtnL2Vycm9ycyI+Z2l0aHViLmNvbS9wa2cvZXJyb3JzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1cyI+Z2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1czwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcm9iZmlnL2Nyb24iPmdpdGh1Yi5jb20vcm9iZmlnL2Nyb248L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3NpcnVwc2VuL2xvZ3J1cyI+Z2l0aHViLmNvbS9zaXJ1cHNlbi9sb2dydXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0Ij5naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0PC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS91bml4cGlja2xlL2thaG9vdC1oYWNrIj5naXRodWIuY29tL3VuaXhwaWNrbGUva2Fob290LWhhY2s8L2E+PGxpPjxhIGhyZWY9Ii9nby51YmVyLm9yZy96YXAiPmdvLnViZXIub3JnL3phcDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9jcnlwdG8vc3NoIj5nb2xhbmcub3JnL3gvY3J5cHRvL3NzaDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9uZXQvY29udGV4dCI+Z29sYW5nLm9yZy94L25ldC9jb250ZXh0PC9hPjxsaT48YSBocmVmPSIvZ29sYW5nLm9yZy94L29hdXRoMiI+Z29sYW5nLm9yZy94L29hdXRoMjwvYT48bGk+PGEgaHJlZj0iL2dvb2dsZS5nb2xhbmcub3JnL2dycGMiPmdvb2dsZS5nb2xhbmcub3JnL2dycGM8L2E+PGxpPjxhIGhyZWY9Ii9nb3BrZy5pbi9tZ28udjIiPmdvcGtnLmluL21nby52MjwvYT48bGk+PGEgaHJlZj0iL2dvcGtnLmluL3lhbWwudjIiPmdvcGtnLmluL3lhbWwudjI8L2E+PGxpPjxhIGhyZWY9Ii9sYWJpeC5vcmcvdjIvbWdvIj5sYWJpeC5vcmcvdjIvbWdvPC9hPgogICAgICA8L3VsPgogICAgCiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sLXNtLTYiPgogICAgPGg0Pk1vcmUgUGFja2FnZXM8L2g0PgogICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIj4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL2dvIj5HbyBTdGFuZGFyZCBQYWNrYWdlczwvYT4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL3N1YnJlcG8iPkdvIFN1Yi1yZXBvc2l0b3J5IFBhY2thZ2VzPC9hPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9nb2xhbmcub3JnL3dpa2kvUHJvamVjdHMiPlByb2plY3RzIEAgZ28td2lraTwvYT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zZWFyY2g/bz1kZXNjJmFtcDtxPWxhbmd1YWdlJTNBZ28mYW1wO3M9c3RhcnMmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5Nb3N0IHN0YXJzPC9hPiwgCiAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NlYXJjaD9vPWRlc2MmYW1wO3E9bGFuZ3VhZ2UlM0FnbyZhbXA7cz1mb3JrcyZhbXA7dHlwZT1SZXBvc2l0b3JpZXMiPm1vc3QgZm9ya3M8L2E+LCAKICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2VhcmNoP289ZGVzYyZhbXA7cT1sYW5ndWFnZSUzQWdvJmFtcDtzPXVwZGF0ZWQmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5yZWNlbnRseSB1cGRhdGVkPC9hPiBvbiBHaXRIdWIKICAgIDwvdWw+CiAgPC9kaXY+CjwvZGl2PgoKCjwvZGl2Pgo8ZGl2IGlkPSJ4LWZvb3RlciIgY2xhc3M9ImNsZWFyZml4Ij4KICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2dvbGFuZy9nZGRvL2lzc3VlcyI+V2Vic2l0ZSBJc3N1ZXM8L2E+CiAgICA8c3BhbiBjbGFzcz0idGV4dC1tdXRlZCI+fDwvc3Bhbj4gPGEgaHJlZj0iaHR0cDovL2dvbGFuZy5vcmcvIj5HbyBMYW5ndWFnZTwvYT4KICAgIDxzcGFuIGNsYXNzPSJwdWxsLXJpZ2h0Ij48YSBocmVmPSIjIj5CYWNrIHRvIHRvcDwvYT48L3NwYW4+CiAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ieC1zaG9ydGN1dHMiIHRhYmluZGV4PSItMSIgY2xhc3M9Im1vZGFsIj4KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+CiAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvYnV0dG9uPgogICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+S2V5Ym9hcmQgc2hvcnRjdXRzPC9oND4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4/PC9iPjwvdGQ+PHRkPiA6IFRoaXMgbWVudTwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4vPC9iPjwvdGQ+PHRkPiA6IFNlYXJjaCBzaXRlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5mPC9iPjwvdGQ+PHRkPiA6IEp1bXAgdG8gaWRlbnRpZmllcjwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmc8L2I+PC90ZD48dGQ+IDogR28gdG8gdG9wIG9mIHBhZ2U8L3RkPjwvdHI+CiAgICAgICAgICA8dHI+PHRkIGFsaWduPSJyaWdodCI+PGI+ZzwvYj4gdGhlbiA8Yj5iPC9iPjwvdGQ+PHRkPiA6IEdvIHRvIGVuZCBvZiBwYWdlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmk8L2I+PC90ZD48dGQ+IDogR28gdG8gaW5kZXg8L3RkPjwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9InRleHQtbXV0ZWQiPjx0ZCBhbGlnbj0icmlnaHQiPjxiPmc8L2I+IHRoZW4gPGI+ZTwvYj48L3RkPjx0ZD4gOiBHbyB0byBleGFtcGxlczwvdGQ+PC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KPHNjcmlwdCBzcmM9Ii8tL2pxdWVyeS0yLjAuMy5taW4uanM/dj1mYmY5Yzc3ZDBjNGUzYzM0YTQ4NTk4MGMxZTUzMTZiNjIxMjE2MGM4Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL2Jvb3RzdHJhcC5taW4uanM/dj01YWRhN2MxMDNmYzFkZWFiYzkyNWNjMWZkYmJiNmU0NTFjMjFmYzcwIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL3NpdGUuanM/dj0zNzFkZTczMWMxOGQ5MWM0OTlkOTBiMWFiMGJmMzllY2Y2NmQ2Y2Y3Ij48L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+" } }, { "ID": "21017789b19d6740", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "6354" ], "Content-Type": [ "text/html; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:30 GMT" ], "Etag": [ "\"0f6a7c9ff3d3d770b8f7fa19c2ae19d0\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:30 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Bzv4p0wm1WhaMZghJMio4UBqHgNKDrqmPMJZOyB8lzs74mUKVP9hN3+feE00VX+uHwbhy4hI3Ow=" ], "X-Amz-Request-Id": [ "DP0M5163GA99CAKZ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "1142ed403cf85d2a", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "6354" ], "Content-Type": [ "text/html; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:30 GMT" ], "Etag": [ "\"0f6a7c9ff3d3d770b8f7fa19c2ae19d0\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:30 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "ItVgBlStvf2elNXX6DMkS8XX0MmFTm9kbzlvFnr9vU4jBfCGXXQHTXmeaY37BW8VBN01HOBpeJU=" ], "X-Amz-Request-Id": [ "DP0GMH9XVTPFF8XC" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "f090e112fb0d2091", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:30 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "nnzmVxjA8G+22uVBGKECKeNJudOwX8UBNV8CBxgW4NgDNR0NBjO6A+rUPW4dNwTTTV1xXSfVvR4=" ], "X-Amz-Request-Id": [ "DP0GT9ME1CF11KMB" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestWrite/ContentType_is_left_empty_if_not_provided_and_DisableContentTypeDetection_is_true.replay ================================================ { "Initial": "AQAAAA7hTg0dORbqFAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "129d318eb0bf28e5", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "6398" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "6354" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "", "BodyParts": [ "MThkMg0KPCFET0NUWVBFIGh0bWw+PGh0bWwgbGFuZz0iZW4iPgo8aGVhZCBwcm9maWxlPSJodHRwOi8vYTkuY29tLy0vc3BlYy9vcGVuc2VhcmNoLzEuMS8iPgogIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgPGxpbmsgaHJlZj0iLy0vYm9vdHN0cmFwLm1pbi5jc3M/dj04YmVjMWJiYTNlMjNlY2JhMjJjZmZiMTk3YTJkNDQwYWY0MTBiMTVkIiByZWw9InN0eWxlc2hlZXQiPgogIDxsaW5rIGhyZWY9Ii8tL3NpdGUuY3NzP3Y9N2Q4MWY0MTA0Yzg5ZGJlMzc2MzQ1ZjZiZmUzZTYyYjRlNDBkM2QwNiIgcmVsPSJzdHlsZXNoZWV0Ij4KICA8dGl0bGU+R29Eb2M8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5Pgo8bmF2IGNsYXNzPSJuYXZiYXIgbmF2YmFyLWRlZmF1bHQiIHJvbGU9Im5hdmlnYXRpb24iPgogIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgPGRpdiBjbGFzcz0ibmF2YmFyLWhlYWRlciI+CiAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Im5hdmJhci10b2dnbGUiIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSIgZGF0YS10YXJnZXQ9Ii5uYXZiYXItY29sbGFwc2UiPgogICAgICA8c3BhbiBjbGFzcz0ic3Itb25seSI+VG9nZ2xlIG5hdmlnYXRpb248L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iaWNvbi1iYXIiPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9Imljb24tYmFyIj48L3NwYW4+CiAgICA8L2J1dHRvbj4KICAgIDxhIGNsYXNzPSJuYXZiYXItYnJhbmQiIGhyZWY9Ii8iPjxzdHJvbmc+R29Eb2M8L3N0cm9uZz48L2E+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlIj4KICAgIDx1bCBjbGFzcz0ibmF2IG5hdmJhci1uYXYiPgogICAgICAgIDxsaSBjbGFzcz0iYWN0aXZlIj48YSBocmVmPSIvIj5Ib21lPC9hPjwvbGk+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dDwvYT48L2xpPgogICAgPC91bD4KICAgIDxmb3JtIGNsYXNzPSJuYXZiYXItbmF2IG5hdmJhci1mb3JtIG5hdmJhci1yaWdodCIgaWQ9Ingtc2VhcmNoIiBhY3Rpb249Ii8iIHJvbGU9InNlYXJjaCI+PGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJ4LXNlYXJjaC1xdWVyeSIgdHlwZT0idGV4dCIgbmFtZT0icSIgcGxhY2Vob2xkZXI9IlNlYXJjaCI+PC9mb3JtPgogIDwvZGl2Pgo8L2Rpdj4KPC9uYXY+CjxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgCjxkaXYgY2xhc3M9Imp1bWJvdHJvbiI+CiAgICA8aDI+U2VhcmNoIGZvciBHbyBQYWNrYWdlczwvaDI+CiAgICAKICA8Zm9ybT4KICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5hbWU9InEiIGF1dG9mb2N1cz0iYXV0b2ZvY3VzIiB2YWx1ZT0iIiBwbGFjZWhvbGRlcj0iU2VhcmNoIGZvciBwYWNrYWdlIGJ5IGltcG9ydCBwYXRoIG9yIGtleXdvcmQuIiB0eXBlPSJ0ZXh0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImlucHV0LWdyb3VwLWJ0biI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IiB0eXBlPSJzdWJtaXQiPkdvITwvYnV0dG9uPgogICAgICA8L3NwYW4+CiAgICA8L2Rpdj4KICA8L2Zvcm0+Cgo8L2Rpdj4KCjxwPkdvRG9jIGhvc3RzIGRvY3VtZW50YXRpb24gZm9yIDxhIGhyZWY9Imh0dHA6Ly9nb2xhbmcub3JnLyI+R288L2E+IHBhY2thZ2VzCm9uIEJpdGJ1Y2tldCwgR2l0SHViLCBHb29nbGUgUHJvamVjdCBIb3N0aW5nIGFuZCBMYXVuY2hwYWQuICBSZWFkIHRoZSA8YQogIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dCBQYWdlPC9hPiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYWRkaW5nIHBhY2thZ2VzIHRvIEdvRG9jCmFuZCBtb3JlLgoKPGRpdiBjbGFzcz0icm93Ij4KICA8ZGl2IGNsYXNzPSJjb2wtc20tNiI+CiAgICAKICAgICAgPGg0PlBvcHVsYXIgUGFja2FnZXM8L2g0PgogICAgICA8dWwgY2xhc3M9Imxpc3QtdW5zdHlsZWQiPgogICAgICAgIDxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1nby9hd3MiPmdpdGh1Yi5jb20vYXdzL2F3cy1zZGstZ28vYXdzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9kZ3JpamFsdmEvand0LWdvIj5naXRodWIuY29tL2RncmlqYWx2YS9qd3QtZ288L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dpbi1nb25pYy9naW4iPmdpdGh1Yi5jb20vZ2luLWdvbmljL2dpbjwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXMiPmdpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dvLXNxbC1kcml2ZXIvbXlzcWwiPmdpdGh1Yi5jb20vZ28tc3FsLWRyaXZlci9teXNxbDwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29sYW5nL3Byb3RvYnVmL3Byb3RvIj5naXRodWIuY29tL2dvbGFuZy9wcm90b2J1Zi9wcm90bzwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29tb2R1bGUvcmVkaWdvL3JlZGlzIj5naXRodWIuY29tL2dvbW9kdWxlL3JlZGlnby9yZWRpczwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQiPmdpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQ8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltIj5naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9qaW56aHUvZ29ybSI+Z2l0aHViLmNvbS9qaW56aHUvZ29ybTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vbGliL3BxIj5naXRodWIuY29tL2xpYi9wcTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcGtnL2Vycm9ycyI+Z2l0aHViLmNvbS9wa2cvZXJyb3JzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1cyI+Z2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1czwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcm9iZmlnL2Nyb24iPmdpdGh1Yi5jb20vcm9iZmlnL2Nyb248L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3NpcnVwc2VuL2xvZ3J1cyI+Z2l0aHViLmNvbS9zaXJ1cHNlbi9sb2dydXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0Ij5naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0PC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS91bml4cGlja2xlL2thaG9vdC1oYWNrIj5naXRodWIuY29tL3VuaXhwaWNrbGUva2Fob290LWhhY2s8L2E+PGxpPjxhIGhyZWY9Ii9nby51YmVyLm9yZy96YXAiPmdvLnViZXIub3JnL3phcDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9jcnlwdG8vc3NoIj5nb2xhbmcub3JnL3gvY3J5cHRvL3NzaDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9uZXQvY29udGV4dCI+Z29sYW5nLm9yZy94L25ldC9jb250ZXh0PC9hPjxsaT48YSBocmVmPSIvZ29sYW5nLm9yZy94L29hdXRoMiI+Z29sYW5nLm9yZy94L29hdXRoMjwvYT48bGk+PGEgaHJlZj0iL2dvb2dsZS5nb2xhbmcub3JnL2dycGMiPmdvb2dsZS5nb2xhbmcub3JnL2dycGM8L2E+PGxpPjxhIGhyZWY9Ii9nb3BrZy5pbi9tZ28udjIiPmdvcGtnLmluL21nby52MjwvYT48bGk+PGEgaHJlZj0iL2dvcGtnLmluL3lhbWwudjIiPmdvcGtnLmluL3lhbWwudjI8L2E+PGxpPjxhIGhyZWY9Ii9sYWJpeC5vcmcvdjIvbWdvIj5sYWJpeC5vcmcvdjIvbWdvPC9hPgogICAgICA8L3VsPgogICAgCiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sLXNtLTYiPgogICAgPGg0Pk1vcmUgUGFja2FnZXM8L2g0PgogICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIj4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL2dvIj5HbyBTdGFuZGFyZCBQYWNrYWdlczwvYT4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL3N1YnJlcG8iPkdvIFN1Yi1yZXBvc2l0b3J5IFBhY2thZ2VzPC9hPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9nb2xhbmcub3JnL3dpa2kvUHJvamVjdHMiPlByb2plY3RzIEAgZ28td2lraTwvYT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zZWFyY2g/bz1kZXNjJmFtcDtxPWxhbmd1YWdlJTNBZ28mYW1wO3M9c3RhcnMmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5Nb3N0IHN0YXJzPC9hPiwgCiAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NlYXJjaD9vPWRlc2MmYW1wO3E9bGFuZ3VhZ2UlM0FnbyZhbXA7cz1mb3JrcyZhbXA7dHlwZT1SZXBvc2l0b3JpZXMiPm1vc3QgZm9ya3M8L2E+LCAKICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2VhcmNoP289ZGVzYyZhbXA7cT1sYW5ndWFnZSUzQWdvJmFtcDtzPXVwZGF0ZWQmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5yZWNlbnRseSB1cGRhdGVkPC9hPiBvbiBHaXRIdWIKICAgIDwvdWw+CiAgPC9kaXY+CjwvZGl2PgoKCjwvZGl2Pgo8ZGl2IGlkPSJ4LWZvb3RlciIgY2xhc3M9ImNsZWFyZml4Ij4KICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2dvbGFuZy9nZGRvL2lzc3VlcyI+V2Vic2l0ZSBJc3N1ZXM8L2E+CiAgICA8c3BhbiBjbGFzcz0idGV4dC1tdXRlZCI+fDwvc3Bhbj4gPGEgaHJlZj0iaHR0cDovL2dvbGFuZy5vcmcvIj5HbyBMYW5ndWFnZTwvYT4KICAgIDxzcGFuIGNsYXNzPSJwdWxsLXJpZ2h0Ij48YSBocmVmPSIjIj5CYWNrIHRvIHRvcDwvYT48L3NwYW4+CiAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ieC1zaG9ydGN1dHMiIHRhYmluZGV4PSItMSIgY2xhc3M9Im1vZGFsIj4KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+CiAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvYnV0dG9uPgogICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+S2V5Ym9hcmQgc2hvcnRjdXRzPC9oND4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4/PC9iPjwvdGQ+PHRkPiA6IFRoaXMgbWVudTwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4vPC9iPjwvdGQ+PHRkPiA6IFNlYXJjaCBzaXRlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5mPC9iPjwvdGQ+PHRkPiA6IEp1bXAgdG8gaWRlbnRpZmllcjwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmc8L2I+PC90ZD48dGQ+IDogR28gdG8gdG9wIG9mIHBhZ2U8L3RkPjwvdHI+CiAgICAgICAgICA8dHI+PHRkIGFsaWduPSJyaWdodCI+PGI+ZzwvYj4gdGhlbiA8Yj5iPC9iPjwvdGQ+PHRkPiA6IEdvIHRvIGVuZCBvZiBwYWdlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmk8L2I+PC90ZD48dGQ+IDogR28gdG8gaW5kZXg8L3RkPjwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9InRleHQtbXV0ZWQiPjx0ZCBhbGlnbj0icmlnaHQiPjxiPmc8L2I+IHRoZW4gPGI+ZTwvYj48L3RkPjx0ZD4gOiBHbyB0byBleGFtcGxlczwvdGQ+PC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KPHNjcmlwdCBzcmM9Ii8tL2pxdWVyeS0yLjAuMy5taW4uanM/dj1mYmY5Yzc3ZDBjNGUzYzM0YTQ4NTk4MGMxZTUzMTZiNjIxMjE2MGM4Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL2Jvb3RzdHJhcC5taW4uanM/dj01YWRhN2MxMDNmYzFkZWFiYzkyNWNjMWZkYmJiNmU0NTFjMjFmYzcwIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL3NpdGUuanM/dj0zNzFkZTczMWMxOGQ5MWM0OTlkOTBiMWFiMGJmMzllY2Y2NmQ2Y2Y3Ij48L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+DQowDQp4LWFtei1jaGVja3N1bS1jcmMzMjplQ01DcWc9PQ0KDQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:31 GMT" ], "Etag": [ "\"0f6a7c9ff3d3d770b8f7fa19c2ae19d0\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "eCMCqg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "SDbgVP63V+P8urKEnNrX6pSiTpLN1lzx9k/VE4vQ3kI5ssAKr7K+ofjxaL56Tm81hPSnLdz8tww=" ], "X-Amz-Request-Id": [ "0R40BF4EMPT5A0E9" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "058fe0d5ae48d178", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "6354" ], "Content-Type": [ "" ], "Date": [ "Thu, 19 Mar 2026 15:28:31 GMT" ], "Etag": [ "\"0f6a7c9ff3d3d770b8f7fa19c2ae19d0\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:31 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "eCMCqg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "Q9/EUOa7m1LlEkg5M1Phfg8z65gpXZ/OmZaHcONpbyFW+c8I5jygDDTmZDxuwsYjyX/TvLdlKbs=" ], "X-Amz-Request-Id": [ "0R4FS57HRH3B1FVN" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PCFET0NUWVBFIGh0bWw+PGh0bWwgbGFuZz0iZW4iPgo8aGVhZCBwcm9maWxlPSJodHRwOi8vYTkuY29tLy0vc3BlYy9vcGVuc2VhcmNoLzEuMS8iPgogIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgPGxpbmsgaHJlZj0iLy0vYm9vdHN0cmFwLm1pbi5jc3M/dj04YmVjMWJiYTNlMjNlY2JhMjJjZmZiMTk3YTJkNDQwYWY0MTBiMTVkIiByZWw9InN0eWxlc2hlZXQiPgogIDxsaW5rIGhyZWY9Ii8tL3NpdGUuY3NzP3Y9N2Q4MWY0MTA0Yzg5ZGJlMzc2MzQ1ZjZiZmUzZTYyYjRlNDBkM2QwNiIgcmVsPSJzdHlsZXNoZWV0Ij4KICA8dGl0bGU+R29Eb2M8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5Pgo8bmF2IGNsYXNzPSJuYXZiYXIgbmF2YmFyLWRlZmF1bHQiIHJvbGU9Im5hdmlnYXRpb24iPgogIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgPGRpdiBjbGFzcz0ibmF2YmFyLWhlYWRlciI+CiAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Im5hdmJhci10b2dnbGUiIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSIgZGF0YS10YXJnZXQ9Ii5uYXZiYXItY29sbGFwc2UiPgogICAgICA8c3BhbiBjbGFzcz0ic3Itb25seSI+VG9nZ2xlIG5hdmlnYXRpb248L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iaWNvbi1iYXIiPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9Imljb24tYmFyIj48L3NwYW4+CiAgICA8L2J1dHRvbj4KICAgIDxhIGNsYXNzPSJuYXZiYXItYnJhbmQiIGhyZWY9Ii8iPjxzdHJvbmc+R29Eb2M8L3N0cm9uZz48L2E+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlIj4KICAgIDx1bCBjbGFzcz0ibmF2IG5hdmJhci1uYXYiPgogICAgICAgIDxsaSBjbGFzcz0iYWN0aXZlIj48YSBocmVmPSIvIj5Ib21lPC9hPjwvbGk+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dDwvYT48L2xpPgogICAgPC91bD4KICAgIDxmb3JtIGNsYXNzPSJuYXZiYXItbmF2IG5hdmJhci1mb3JtIG5hdmJhci1yaWdodCIgaWQ9Ingtc2VhcmNoIiBhY3Rpb249Ii8iIHJvbGU9InNlYXJjaCI+PGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJ4LXNlYXJjaC1xdWVyeSIgdHlwZT0idGV4dCIgbmFtZT0icSIgcGxhY2Vob2xkZXI9IlNlYXJjaCI+PC9mb3JtPgogIDwvZGl2Pgo8L2Rpdj4KPC9uYXY+CjxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgCjxkaXYgY2xhc3M9Imp1bWJvdHJvbiI+CiAgICA8aDI+U2VhcmNoIGZvciBHbyBQYWNrYWdlczwvaDI+CiAgICAKICA8Zm9ybT4KICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5hbWU9InEiIGF1dG9mb2N1cz0iYXV0b2ZvY3VzIiB2YWx1ZT0iIiBwbGFjZWhvbGRlcj0iU2VhcmNoIGZvciBwYWNrYWdlIGJ5IGltcG9ydCBwYXRoIG9yIGtleXdvcmQuIiB0eXBlPSJ0ZXh0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImlucHV0LWdyb3VwLWJ0biI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IiB0eXBlPSJzdWJtaXQiPkdvITwvYnV0dG9uPgogICAgICA8L3NwYW4+CiAgICA8L2Rpdj4KICA8L2Zvcm0+Cgo8L2Rpdj4KCjxwPkdvRG9jIGhvc3RzIGRvY3VtZW50YXRpb24gZm9yIDxhIGhyZWY9Imh0dHA6Ly9nb2xhbmcub3JnLyI+R288L2E+IHBhY2thZ2VzCm9uIEJpdGJ1Y2tldCwgR2l0SHViLCBHb29nbGUgUHJvamVjdCBIb3N0aW5nIGFuZCBMYXVuY2hwYWQuICBSZWFkIHRoZSA8YQogIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dCBQYWdlPC9hPiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYWRkaW5nIHBhY2thZ2VzIHRvIEdvRG9jCmFuZCBtb3JlLgoKPGRpdiBjbGFzcz0icm93Ij4KICA8ZGl2IGNsYXNzPSJjb2wtc20tNiI+CiAgICAKICAgICAgPGg0PlBvcHVsYXIgUGFja2FnZXM8L2g0PgogICAgICA8dWwgY2xhc3M9Imxpc3QtdW5zdHlsZWQiPgogICAgICAgIDxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1nby9hd3MiPmdpdGh1Yi5jb20vYXdzL2F3cy1zZGstZ28vYXdzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9kZ3JpamFsdmEvand0LWdvIj5naXRodWIuY29tL2RncmlqYWx2YS9qd3QtZ288L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dpbi1nb25pYy9naW4iPmdpdGh1Yi5jb20vZ2luLWdvbmljL2dpbjwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXMiPmdpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dvLXNxbC1kcml2ZXIvbXlzcWwiPmdpdGh1Yi5jb20vZ28tc3FsLWRyaXZlci9teXNxbDwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29sYW5nL3Byb3RvYnVmL3Byb3RvIj5naXRodWIuY29tL2dvbGFuZy9wcm90b2J1Zi9wcm90bzwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29tb2R1bGUvcmVkaWdvL3JlZGlzIj5naXRodWIuY29tL2dvbW9kdWxlL3JlZGlnby9yZWRpczwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQiPmdpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQ8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltIj5naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9qaW56aHUvZ29ybSI+Z2l0aHViLmNvbS9qaW56aHUvZ29ybTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vbGliL3BxIj5naXRodWIuY29tL2xpYi9wcTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcGtnL2Vycm9ycyI+Z2l0aHViLmNvbS9wa2cvZXJyb3JzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1cyI+Z2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1czwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcm9iZmlnL2Nyb24iPmdpdGh1Yi5jb20vcm9iZmlnL2Nyb248L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3NpcnVwc2VuL2xvZ3J1cyI+Z2l0aHViLmNvbS9zaXJ1cHNlbi9sb2dydXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0Ij5naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0PC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS91bml4cGlja2xlL2thaG9vdC1oYWNrIj5naXRodWIuY29tL3VuaXhwaWNrbGUva2Fob290LWhhY2s8L2E+PGxpPjxhIGhyZWY9Ii9nby51YmVyLm9yZy96YXAiPmdvLnViZXIub3JnL3phcDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9jcnlwdG8vc3NoIj5nb2xhbmcub3JnL3gvY3J5cHRvL3NzaDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9uZXQvY29udGV4dCI+Z29sYW5nLm9yZy94L25ldC9jb250ZXh0PC9hPjxsaT48YSBocmVmPSIvZ29sYW5nLm9yZy94L29hdXRoMiI+Z29sYW5nLm9yZy94L29hdXRoMjwvYT48bGk+PGEgaHJlZj0iL2dvb2dsZS5nb2xhbmcub3JnL2dycGMiPmdvb2dsZS5nb2xhbmcub3JnL2dycGM8L2E+PGxpPjxhIGhyZWY9Ii9nb3BrZy5pbi9tZ28udjIiPmdvcGtnLmluL21nby52MjwvYT48bGk+PGEgaHJlZj0iL2dvcGtnLmluL3lhbWwudjIiPmdvcGtnLmluL3lhbWwudjI8L2E+PGxpPjxhIGhyZWY9Ii9sYWJpeC5vcmcvdjIvbWdvIj5sYWJpeC5vcmcvdjIvbWdvPC9hPgogICAgICA8L3VsPgogICAgCiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sLXNtLTYiPgogICAgPGg0Pk1vcmUgUGFja2FnZXM8L2g0PgogICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIj4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL2dvIj5HbyBTdGFuZGFyZCBQYWNrYWdlczwvYT4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL3N1YnJlcG8iPkdvIFN1Yi1yZXBvc2l0b3J5IFBhY2thZ2VzPC9hPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9nb2xhbmcub3JnL3dpa2kvUHJvamVjdHMiPlByb2plY3RzIEAgZ28td2lraTwvYT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zZWFyY2g/bz1kZXNjJmFtcDtxPWxhbmd1YWdlJTNBZ28mYW1wO3M9c3RhcnMmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5Nb3N0IHN0YXJzPC9hPiwgCiAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NlYXJjaD9vPWRlc2MmYW1wO3E9bGFuZ3VhZ2UlM0FnbyZhbXA7cz1mb3JrcyZhbXA7dHlwZT1SZXBvc2l0b3JpZXMiPm1vc3QgZm9ya3M8L2E+LCAKICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2VhcmNoP289ZGVzYyZhbXA7cT1sYW5ndWFnZSUzQWdvJmFtcDtzPXVwZGF0ZWQmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5yZWNlbnRseSB1cGRhdGVkPC9hPiBvbiBHaXRIdWIKICAgIDwvdWw+CiAgPC9kaXY+CjwvZGl2PgoKCjwvZGl2Pgo8ZGl2IGlkPSJ4LWZvb3RlciIgY2xhc3M9ImNsZWFyZml4Ij4KICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2dvbGFuZy9nZGRvL2lzc3VlcyI+V2Vic2l0ZSBJc3N1ZXM8L2E+CiAgICA8c3BhbiBjbGFzcz0idGV4dC1tdXRlZCI+fDwvc3Bhbj4gPGEgaHJlZj0iaHR0cDovL2dvbGFuZy5vcmcvIj5HbyBMYW5ndWFnZTwvYT4KICAgIDxzcGFuIGNsYXNzPSJwdWxsLXJpZ2h0Ij48YSBocmVmPSIjIj5CYWNrIHRvIHRvcDwvYT48L3NwYW4+CiAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ieC1zaG9ydGN1dHMiIHRhYmluZGV4PSItMSIgY2xhc3M9Im1vZGFsIj4KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+CiAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvYnV0dG9uPgogICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+S2V5Ym9hcmQgc2hvcnRjdXRzPC9oND4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4/PC9iPjwvdGQ+PHRkPiA6IFRoaXMgbWVudTwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4vPC9iPjwvdGQ+PHRkPiA6IFNlYXJjaCBzaXRlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5mPC9iPjwvdGQ+PHRkPiA6IEp1bXAgdG8gaWRlbnRpZmllcjwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmc8L2I+PC90ZD48dGQ+IDogR28gdG8gdG9wIG9mIHBhZ2U8L3RkPjwvdHI+CiAgICAgICAgICA8dHI+PHRkIGFsaWduPSJyaWdodCI+PGI+ZzwvYj4gdGhlbiA8Yj5iPC9iPjwvdGQ+PHRkPiA6IEdvIHRvIGVuZCBvZiBwYWdlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmk8L2I+PC90ZD48dGQ+IDogR28gdG8gaW5kZXg8L3RkPjwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9InRleHQtbXV0ZWQiPjx0ZCBhbGlnbj0icmlnaHQiPjxiPmc8L2I+IHRoZW4gPGI+ZTwvYj48L3RkPjx0ZD4gOiBHbyB0byBleGFtcGxlczwvdGQ+PC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KPHNjcmlwdCBzcmM9Ii8tL2pxdWVyeS0yLjAuMy5taW4uanM/dj1mYmY5Yzc3ZDBjNGUzYzM0YTQ4NTk4MGMxZTUzMTZiNjIxMjE2MGM4Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL2Jvb3RzdHJhcC5taW4uanM/dj01YWRhN2MxMDNmYzFkZWFiYzkyNWNjMWZkYmJiNmU0NTFjMjFmYzcwIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL3NpdGUuanM/dj0zNzFkZTczMWMxOGQ5MWM0OTlkOTBiMWFiMGJmMzllY2Y2NmQ2Y2Y3Ij48L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+" } }, { "ID": "cd3d2d52f8651c0f", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "6354" ], "Content-Type": [ "" ], "Date": [ "Thu, 19 Mar 2026 15:28:31 GMT" ], "Etag": [ "\"0f6a7c9ff3d3d770b8f7fa19c2ae19d0\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:31 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "kOsDrdTU6qBi+HWOflNAOxJFbA6KxfwZDHwvf4boHg8h4a0VL6TVbpvNzn69gN/e8ttxozeTpxI=" ], "X-Amz-Request-Id": [ "0R46PZJFF5D9CMJA" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "5d6bfcb15f0112f5", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:31 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "3HxR8GHLB/4dCetKY4+QrKayQqedqsC5Erq9G6yLJP7LM9pmhWMB1bFHeB/v/Y4IdksmWcHSKDQ=" ], "X-Amz-Request-Id": [ "0R49PT148FFYEE6B" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestWrite/Content_md5_did_not_match,_blob_existed.replay ================================================ { "Initial": "AQAAAA7hTg0eNyD6IwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "4bdf65bf65fb1d11", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "58" ], "Content-Md5": [ "dH9B/ScP7BuCvgMMwc1IAQ==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "16" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "MTANCmV4aXN0aW5nIGNvbnRlbnQNCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOkl1VXExUT09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:31 GMT" ], "Etag": [ "\"747f41fd270fec1b82be030cc1cd4801\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "IuUq1Q==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "EmzF1M7kegDNK3BmWCHKdpWHjAIUaYLdzncIjxCJ6Taql58p4TwH4aO4U9r435pQprzItDgQzl8=" ], "X-Amz-Request-Id": [ "0R470TKDS3PWHRFZ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "b4aaef8235876658", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "16" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:32 GMT" ], "Etag": [ "\"747f41fd270fec1b82be030cc1cd4801\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:31 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "IuUq1Q==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "zvCc0GO4ytlk5inrKGY8DO9NlCr7oGMIjN9fqzBwXpL8xvKGDmQKR0wztShyPM+NhAKVdMg0NCY=" ], "X-Amz-Request-Id": [ "4TS79CD37SM4VP5V" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "ZXhpc3RpbmcgY29udGVudA==" } }, { "ID": "9837259398b1315c", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "16" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:32 GMT" ], "Etag": [ "\"747f41fd270fec1b82be030cc1cd4801\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:31 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "7qPagQyhCBR/ee7gqu509nMHjiA0QfelT1jaB7UlFC/3xF8mWNVppqy+VWk3w4K7Oruvcqm1lv8=" ], "X-Amz-Request-Id": [ "4TS6KKF9FM91J0Q5" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "85567678f3215b68", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:32 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "HY8ALjVd1iTaxTMUx7oNMOfBTGLiSmu0JQazeit7NXIrcAGu07yRbL+RWJi+gwfNdgPBxt941oo=" ], "X-Amz-Request-Id": [ "4TS511KB3CGM21CH" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestWrite/Content_md5_did_not_match.replay ================================================ { "Initial": "AQAAAA7hTg0eMNfSIgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "36b6be2685c7d02d", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:30 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "9KEtVwL//pXhKBts0jgdylr/NGWEhrRcoxZD0zsIe+NGEvV8I2zTF5lGhf7MUZJS5+LaUNbcm18=" ], "X-Amz-Request-Id": [ "0R4F3EPE577137AH" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPk5vU3VjaEtleTwvQ29kZT48TWVzc2FnZT5UaGUgc3BlY2lmaWVkIGtleSBkb2VzIG5vdCBleGlzdC48L01lc3NhZ2U+PEtleT5ibG9iLWZvci1yZWFkaW5nPC9LZXk+PFJlcXVlc3RJZD4wUjRGM0VQRTU3NzEzN0FIPC9SZXF1ZXN0SWQ+PEhvc3RJZD45S0V0VndMLy9wWGhLQnRzMGpnZHlsci9OR1dFaHJSY294WkQwenNJZStOR0V2VjhJMnpURjVsR2hmN01VWkpTNStMYVVOYmNtMTg9PC9Ib3N0SWQ+PC9FcnJvcj4=" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestWrite/Content_md5_match.replay ================================================ { "Initial": "AQAAAA7hTg0eId1kIwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "3ff9680be4486137", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "52" ], "Content-Md5": [ "XrY7u+Ae7tCTyyK7j1rNww==" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "11" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "Yg0KaGVsbG8gd29ybGQNCjANCngtYW16LWNoZWNrc3VtLWNyYzMyOkRVb1JoUT09DQoNCg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:31 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "DUoRhQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "d7ahMAtC+WqVLyxc6WG8bXpilD4LU2m494PjvLsUCkwK/w82hdxTxJhKN35aGHPvLn32ij0RthUv6tLZxIgsQi99Av5Biq72" ], "X-Amz-Request-Id": [ "0R4F2AMZ7V64F4VE" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "1764215c7be954f6", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:31 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:31 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "DUoRhQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "39gbHE4Num/hXImbgWBJSSH0wW7mf/ajqdnzZ7h/t6RRsYwSPJXXMBl/goNE89fWXMchN+AlZlsYs8X1sU3wDuUa2/X53Rcp" ], "X-Amz-Request-Id": [ "0R446VEHH7FDD0NA" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "aGVsbG8gd29ybGQ=" } }, { "ID": "8d3d767bb9eb702f", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:31 GMT" ], "Etag": [ "\"5eb63bbbe01eeed093cb22bb8f5acdc3\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:31 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "a0aeY/aFCCbAS7Iw9MrlKS2NaM55mqpbmeSWPHuZ9WIhZUL+m+DN9eummNBMVYZ/nsK4f8p5IlZiCC91Q4MHc+bhTvJptVYl" ], "X-Amz-Request-Id": [ "0R40DC4W9CV0JTJ0" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "f6121178df37878d", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:31 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "Y1LGUY6pdbsf5nt0OG1okyiutQ2DXIRpv3sX6ezbIEIng0SX32Ldcmm17lCVi3qpz5wH3A55QrvGEsas4VEa1n3UOqWSgp7Q" ], "X-Amz-Request-Id": [ "0R470WDSXV6BB9VX" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestWrite/a_large_jpg_file_gets_a_ContentType.replay ================================================ { "Initial": "AQAAAA7hTg0fGLfWBwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "0acadbc383e9a16d", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "38474" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "38430" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "image/jpeg", "BodyParts": [ "OTYxZQ0K/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAH0A+gDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAooooAKKKKACiiigAooooAKKDRzQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFMkkSJS7sFUdSTQA+iq/wBth3Fd65xnGamV1YZByKAHUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAAGBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFNd1QEsQAOpNADqKwr3xhoVg+y41O2jbjgyDv0qXSfE+ka2hfT76GcA7TtbkH6UAbFFICD0NLQAUUUUAFFGRRQAUUmaTcPWgB1FN3j1FKWA7igAZgqknoK8H+InjWbVNZfSLB7zCtsWOA43sD349vf8ACvV/Getx6H4Wvb9tx2R4G3sTwDXm3wm8OQS2cmuXRWe6uJGdXcElBnpzQBg23w/8ZzWx1VdRe2ugQ8VqJTwPQt612HgDx3qt/q02haxAqXlumWIBBbnuO3avTFjQRYwOBXjscsQ+O935TNkxBWA4Gdo6468etAHtkbbkBp9RQf6sfSpaACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAzzRRRQAUUUhIHU0ALRTd6+op2QaACiiigAooooAKKKSgBaKKKACiiigAooooAKKKKACkzzS0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAjHCk+leGfFLx1Lcu+jaeWVt+C5yuSO3PHPrXtWoXAtrCaYnARCa+f/CsVpr/AMTrm4kh27GJH/TQjvQBteDPhLb3lrDqOuhppZIx+5YkY5zzg81ual8Jbe0/03wzdy6bfpkptfcjcdDnJ/KvTII0hhAHAAqG21S0unZIpkZkOGAPSgDzjw58R7iz1FNC8URi11PzCgbGFcdiPY9K9PhuEmQMjAgjNeY/GDwuuraL/adoyx31mCwbpuTuMiuK0r4u3dn4dWK2t/PvEUKzHO1T0+tAH0M0iqMkiqN7rVhYQmS5uooVHJLuAAK8bt9b8b+I51tSk1sHhwxQfu8nnduAz07Z61sxfDDU7u1SS91udpjy6uisufUZHB/GgDrbvx5pdtG0yTfaI1++0QyE6dfzFY//AAtrRxbzvtuGkjJxEqZLc4GCOOfrUtn8KdFifzLjzbgk5Ikbg57YHaujtPB+iWciywWECSKMbggzigDz+/8AjEpkENhp879N7MCpXjJ4I7fWs+38ZeM9TZpNP064G9SYy8W5Poc4A7cjNewLo1gq4FrCBnOAg61Zjto4wAqKAOmBQB5E918S4oTO0NvgA5QqWJ54IA6fmaW3uPiUbIl4UM8pUpkj5Fzzn3wf0r2DYuMYFARR2FAHjEuieP8AVdMeO+lhk8zG23lVQFI65I/+vUdnYfELSVjgiht4oUXhLeNNuc/d59QeuO1e17B6UFAe1AHkJ1P4kral5LW3B3bQvl7mJ9eD07Dp71xOneIbnS/HtzfavpzQXHypcm35AY45Oe2PSvpQxqR0FUP7HsvPkmFvGJJDl22DLfWgDldD+JWg6mgCzvC27afPQqAc9CwyM/jXaQXUU6bkdWHqDmuO8Q/DTStaVmiZ7Nnbe4twArtggMR689f8K4dPCPjvwlqAbR7yXUbJWBWIyhV285BDd/cUAe35FLXmWj/FKKG6+xeI7cabMuMlycZ98jjPNei2l9b30KTW0qyRsMqynINAFiiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACkJAHNDMFUk14/8Svik2ku+j6Q2b8nYxGcqT6Y70AdX4z+I+l+E0WJmE94+QkKHOD746V5i+vfEfxvI0mnIdOt1YDumee2eTWt4E+Hd3qdxFrPibdNPnekbnOOc5P8AhXssNjDCiqiABemBQB4LeeGPiNpdp9rbV5rnaQzJFKxbaBzycelbPgv4k6hFd29lrMwlE+7bIy4KlTjHGc+tezmNSuCARXm/xA8HW0Wh3OraVFFb3to5vC2OHI5bd+FAHpEUgkjV1OQRmn1zHgjXBrfh2zuiyF3jBYIcgHvXT0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUCigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDm/HAu/8AhGLr7Jy+35lClsr36V4F4V1P+yvHscqPuieQq+8EHBPvX09KgkQowyCMGvCvif4Hk066XW9LgJgiO6ZUYIUHc5oA9vgkE1sD1BFeF+LdS1Dwd4s8+CSRoZpCxYrhR7H1r0jwf4lh1Tw/bzLICdoUgsD04NR+JfCFr4ihfdEjyEEpuJ2nPrigCDw74ms/F2nK6uCRw6MO/wBK85tLaDwf8UrnT57Um01Ah4eBjJI7exroPCngHWfC3irfAXksHHzlnGB9PU/hXoeueD9M8Q/ZpL2FvPt23wzRsVdD7EUAatlbxrEpRQBjjAq6BUdtCIIEjBJCgDJ6mpaACiiigAooooAKKKKACiiigAooooAKTaKWigDmPFnhKz1+xYmygmukH7vzRgH2J9K8ut18VfDAtcmyku9IL5ljik3LCM9VHX8694qOWFJkKOoKngg0AYnhrxXpvifTY72wuFkVuGXoynuCOxrf615l4h+H13pt1Jrng2b7Dfg7pLVR+5n9iOgPvT/C/wAUoL27Ok65bHS9WiKpJDKRhiRxtNAHpVFRxyrIqkHORUlABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRVa/keOxnaLmURsUGcZOOOaAPNfix4/Gh6c+l6dMpv5/kyhyUB6/Q1zfw5+Hvk3S6xrDia4kXKIQSFzzk5715idahtvFM97rllNc3CSNiLO75857mtS/8AiP4k1W+SbSEmtYYQFjRTlQfU9j+NAH1NbNFHGFUjgVP5qk4Br5k0i6+J2syzPb3txFIcYUqFTBHXNbF/YfEnwzbNrl7rxniiw0sSMSAM+mAMc0AfQqnNRXltFd2c1vMu6KVCjqe4IwRWT4T1pdd8P2t9n5pE+b69622+6aAPHfhQyaTr+r6MVdHimb5cgrgMRwevQDrXsleFWVw9l8b9SSGDejNyzM3yBgDkDpyT+le4RSB0BHTFAEtFFFABRRRQAUUUUAFFFFABSb1zjIzXGePfHEXhayEEGJNQnGIowRkZ4Bx1PPavJp7nxvcvJqckOooWVZPMVDwvU4xyOO2B0oA+jcg0V4l4d+KN3pl3Fb6zPFd2Uj7Eu425QcD5hjOM8ZNeyWV/b39vHPbyrJG43KVOcigCzRRRQAUUUUAFFFFABQM45oooAKKKKACiijFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFACMcKTXkvxX8cPpsf9iWNsZ7q4jOcgNt/4Dg5rr/GfjO28Lae0hTz7huEhVwGOe/Nee/D7wzceINduvFOsRyM0r/6OJjk7fXGPyxQBw2gp4m8Hz2zzwsIZz54DcKOuVx2r6D8Oa7bavYQTxkB3UNs3AkfXFR+KPCNt4j0OWwfZG5H7qUpkxt6iub8HfDm88MysTdpIdy/OAQWUHoc0AekqB1xwafSKMACloAKKKKACiiigAprNtHNQXN5DbRs8jgBQTXk/ib4nHzZLPSZvtN0GwIYoWLNg84PT/P4UAeszXkNuheWRVAGck4rIu/FemWgQyXMY3HH3xgcZ5ryo6J498TuiNs0q0YjIaUvJj/P0rorH4M6SrmW/uru9Z1AkE0nBPqMcigDoJviT4bhKhtTg2scAq2f5fStey8UaTfQiWC+hlQ91auePwm8KnP/ABLEyV2n526enWqFz8GNAaN0s3u7TcAMxTH8+c0Ad/FqdrM5RJkZ1ALKGyRmrSyK3Qg14xqnwl8QQSxz6T4ou96YUGWRgQmOmRwfyrNtPGPi/wAATxw+KIzdWJcr5wIZwBnBOPXjrQB73RWFoXifTtds457KdZFYZ6YrcBB6UALRRRQAhFcJ49+Hdl4rtvtEP+j6nD80M6Hbkjs3qK7ykIzQB5R4E8Z3sOoyeGPEMMkGp254ZyMSDtg9+Oc16Y+o2kKAyzxp0HzMBzXnvxb8L3F5ow1zSJHh1PTyZQ0fV1A5B+grzz4e+H38d2klze63dvMshEyMxJz26nGPwoA9guviV4dtZpInumby+rJEzL+YFRzfE/w5FKsYuJZCcZ8uJm2k9jgdam0L4f6Nom54YmllY5LytuPTFaR8JaOZXm+wwiRyCzBcE4II/kKADRvFuk65G72dyGCMVIYFTkdeDWzHPFKMo6kH0NcNq3wt0W6gdrKN7O5bJEsUjDJPrz0rjLHwd448Jy3UtnqsdxCpXyoSSxcDtg8LQB7gKK8x0T4pQrNFYa7by2V8ZPJIdMBnx25OByOtekwXEdxGHjYEHmgCWiiigAooooAKKKKACop4EnQqyg5GOalooA4w/D3QU1c3rWELvJnJdQ3P49K37fRbC0j2Q20SKOgVQBVy9uBbWrykZCjNeHax8ZNdu76Wy0DSVkkRmBcqzAAH0GKAPZha28N0SgVc8kCuU+JGrWVn4N1SNp4RNJAyohkClieOK4C3n+J/iLT3hZ1t1n+UyeRtKg475+tOh+Ceu6iqHWvEUsgUAbFLNx+JoAr/AAv8fW+neGja3swQ20nVmABB5rvY/i74edMO86ZztYxHDfTFZGkfArSLOM/apnncjjtiuug+G/huGFY/7LtzjqdnJ/GgD551/wAW3f8Awnd/renxXAjlOFDcE4AwenT2r0X4ffFu8vNTTSfEVutrLJgRSlSgY+hB716oPCejKBixiyvQlc15x8Z9MtLfw/aXcapFcRXAMbKBu6HPHftQB7DG4kQOpyD0p1c74L1JdT8M2M6ur7ohyvTI4NdFQAUUUUAFFFFABRRQelAHhHjRbfVPi5psMkhZVlAIC4K7e3X1HoK9straMQKAoxivEviXbxaX8QLK+l3ojyK4kCA7TkdDn869ig1W2h0xLiWZFiCbixPbGaAMzXPAWga4h+1WSh+MPESjDGccj6mvJdO1zUvhd4wk0vVJrm40eXLRyMdwRScAj+tdzqXxp8KWbvGLiWR1BxsjPzEehryHxr42/wCEs1azbStMupkjyNkiEs+e3HbvQB9M6Xq9pq1lHdWkySxSKCrKcgiru9c4yM18ueHrr4hWmbDR7C6tY2zKUlQquTzwx/lXXaXp/wATpA1zdPtfj5GlGT/hQB7o0iKOWA+ppv2mHOPNTJ7bhXicvhrx9NObi9kNwrc7DKCI/YAde361Wm8MeLZFP+hlkzgMu4MuAexP+c0Ae7+bGf41/OnBgehFeFjSPFltNvlhvmhUqMRTMMdOncioodZ8RaYRFNdarHwSEADgEDOORn8M96APeqK8LtPilrxkSGYwCQrv2zRMm0e/ua6nTfig77Beaa7DgGS2bzByM5xjNAHpdFc7pnjXRNUYRxXqJKf+WcvyN+RrfSVJEDI4ZT0INAD6O9FFAATiiikJA70ALRWXqHiLSdLLC8v4IioywZxkD1I9KXT9f0vVP+PK+gmOM4RwePWgDTooBzRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABWXr+s2+haRPf3LAJGucE9T6CtMnAzXivxZ11tV1a18PWe+TDBpFRScseAOv40AUfD+lTePPF82ramubVCNsbgMCOw9OPpXt9nZx2kKxxqFUAAADpXO+CfDkPh/R0hXl3O52xjJNdZQAmDmloooAKKKKACiiigAqlql9Hp1jJcybiqDkKuTVwkKCT0FeR/EfxfcXV3F4e0O6zcXLbGePDAdiCCD/kUAZN/wCI9V8feJZNG0WdodNjH76dAQR0zyRj1GPavRvC/gbS/DlikVvCrPnc0rqNzH1zVfwF4Pg8M6UIgTJPJ880p/iau0AxQA1Y1UABQKfRRQAYooqGS6gibDyKp9CaAJsVla34e07X7NrbULWOeMjow6e4q7He28rFUlViOuDnFTggjigDwTVvhz4g8BiTVfCt956oWJgeL5tp984OPwrrfhv8R28Ro1jqqRW+pxHDRA/f9wK9MkjWRSrAEHgg14P8QdHk8F+L7LxHpqxpDJIA0YQD6gdOtAHvKtuAPrTqzdGvl1HTYLlCdsiBgD15FaVABRRRQAySNZEKsMg14TfwN8NvifHIg26Vq0pdnx91jnK+mM4Ne8E4ryv46WLXXgoTxKDLbzrJnbkgdyD2oA9OtpVlhRgc5GanriPhjrX9s+ELO4aQvIF2Mx6kjiu3oAKjlhWUEEdqkoPFAHnfjz4f2OtW73xkliniG7zIkBbAHbHNc58PPGFxp+tTeG9SnMsasRaXDnHmqOwzn1r1y5vII0bzXVVA5LHAr56+JNsPDnjTT9SslIidlKOvRSDyue/rz69aAPo5G3qD606sjw5qMeqaNb3URJSRAwJrXoAKKKKACiiigBAc0tFFAFbUI5JLGZIQpkKELuOBXh3wndYvFmtabc7fO8zeFYc5BINe8P8AcOOteFJatofxw3hfLivSJAAf73X9aAPdFjVVACin4pFOQDUN1KYbaWRQSVUsAO/FAEjyIn3iBVG81zTrBS11ewQgcnfIBXzh4h8b+KNf197SK+e0j3lFjU7dpH6nGOtdDYfCaS/ijudR1qeYnDlVUDJ7gk5yKAOz1z41eHNOLw2bvf3A4CRDg/jXnkms+Lfibqf2eO3+yWBYqf3WVVfUk9T0/wDrVn6r4RtPCfj/AEvZt+wTSKhDqXOT65GBzivofTLWCGBPLRQMdhQBB4S0NtA0SCyaUysg5Y1vZAqB50RCSwGBXG+LPGkOjWMsguFj2jO88ge31NAHaS3UMK7nkAHua5/UfHvh3Sw/2jUoA6ZygbJ4ryG2m8U+O939mh7ezJ+a4uMjPsq9xXf+HfhjpOnW0RuIlubnO6SWZAxY49xwPpQBHN8aPD6k+Rb6hcjGf3VuTn/PP5Vp23xS8MzwCSW7kt2xuMc8LowHrjHT36V0UGhWFsoEVvGvrtQDNU9a8JaPrsCRahYwzKhyu5RkcY4PUUAWNK8UaPrW7+z7+CfacNscEj6itOS4jijLs4CgZJJ7V4V4u+HVl4WE2r6Nq8mmyKMxopPJx0zye1cTB428aeLbVNEgnlcr8ssiDLOM9WIHHTtQB1/xj+IOkalZLpVhH9qm35EwyAuCRx69PpXLaJoni/x7NaQXc9zHp6KoYlWRCAPTuceld34P+DjJNb3+uXUk86YYIrEgY6ZJ5/CvZrWyhtYwkaKoA4AFAHlenfAvRIh/pFxcOOcgEKCCc449Oa9A0zwlpOlIgtrSJSi7Q+3LY+vWt2igCAWsS8BAB9KlVAO1OozQAmB6UYHpS0UAJtB6io3toZCC8asR0yKlooA5rUfAuh6lcG4kt2jmJyXicqc4x2rm7v4R2hG+x1S7gnByGZtw/Hpnv3716TSDmgDya/8Ah3rJRxFdLKcD95Kfm4HGMDP+etY2nah4x8JsZbi1urm3UBXjPzIuDjIORj6V7nUFzaQXcLRTxJIjdVYZFAHlA+NsEF6IbuzZEwFJCk/N39gOnevSdI8QWGs6el5aXCSRN3U5xXC+NvhtHqjJLYfut/EgXAI989ef6V5Ott4s8Naw3hjTdQjuTdgB4kcv5fr6Y/OgD3XxP8RNL8PObcCS6u8f6qIcLxkbieBXmVx4x8ceMb1k0ZZLe23gDyU28d8sc812nhr4W6Xa20c+qxte3jANI0zs4yPQE13ltbWtogSNEQKOmMAUAeMWfwc1XUpEutY1yVpicsMb+vXkn+lZPibwXP8ADyS1vrPVbpYDwSqA5YHOCMgdK+hYriCVikUiMy8EA5Irj/im0cfgm6aRcncojwoOGz15B96ANPwTq11rHh6C6u12uw44xx27mukrlfh/A9v4UtY5EVCF4CnII9eAP5V1VABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRSc59qAFooooAKKKKACiiigAooooAqahdJZ2cszkBUUkk15R4Mg/4STxdf6424xiQqFKbVyMY4z1/Kui+KmpT23h2W2gKDzxsYnOcHrjHSrPw60ZdI8PQRhQHb53Oc5J96AO0jQIoApxOBmgUY5oAWiiigAopOc0tABRRRQBn63ci00e6mJj+WM4EjbQTj1rxz4W6NJrOv3fiO7WM7mKRbVHH+feu2+Ld4bXwZMBHG+9guHzx9MEc1Z+G+mLp3hKxQRorNGGbb0JPNAHYxoEXAFOxz1paKACiiigDL13U10vTZZ2YDapPNeAya/rHjTxI+n2N09umCfMychRxxj616F8YL2W20CfbIEwuef4vYVz/wAOpdG07w6l9LeReaylmZ35XuR1oA841lfEvgzxFFanVy0sieYpVyARngH8q9J+H3xdm1C6+xawYxtGBIhwD065NeOeO/EUfiTxfNewybrYYSLdkAKPr0qnpDSWt7bnywQScYbryMGgD7bjdZEDKQQRkEVxfxS0WHVvBN6XQGW3QzRt02kVueFJZJvDlm8ow5jGQauavbQXml3NvcIrwyRsrq3QgigDjPhTqp1HwrbBiN0WU4AxgdOhPavQa8I+Dxex1a7sFuEkiDHYglDYXPXivdh0oAWs7WNasdEsZLy/uI4YkBOWOM47D1NaDHAJrwDxdcXPjz4iHSFYrZ2WV2FhgHPLEevTFAGzqPxqvri3E+heG7q5g3bTNIDt/DaP61yPij4keJdX0a50+/0IQRXKmMSbGyT3IB/Hv2r2/RNNstO0+G0hRVjiAAHrir17ptld25SaBHVieCOh9aAPHPhd8QtP063h0S7gkt5VYIHCcEn1A5Fe8RSCRAw7186/EDwQnhvVDrsChLNSoCxMcq3bg/QdK9l8C6s+s+F7K8dSrPGMg9/egDqKyfEeprpGjXF2zbQi5zWtXEfFSC4n8F3KW5+Y4zzjigDxXxDq3inxL52oAyw6cD5aNGTgehIzyCa4bU77VIZDb3k8m1lD7AeGB75966q48ciw8Ox6R9nDRyQiMhSQyMD1+hri9S1D7b5UqhVZE2YBycDj9aAPpv4Oagt34MtEVyxjyrcjr+dek15F8C7Ka28JiWZcedIWXjHHT+leu0AFFFFABRRRQAUUUUAFeR/Fy0bT9V0XXoY8eU5ilcYz1BX3PU165XC/Fuy+2eAbxhnMLLINoyeuP60Adfpl0t5psE6nIdAaluU3wOvPIxxXCfCPWxqvg+3RnJkg/dtnrxXfuMqRQB8eeNLJ9L12+cMFkt7xl256huc4/D9a6ew+J3i06Y89lo6PaQx4eRkbHAPOcit34reFmg8Y22rLBFLaXWEdXYcyZxyD2x6e9Fzf65daFLYWGgW9laeSY3a4k2AAjnAx2H8qAOGtb3xR438T2d1MGlEbJKViPyqoOMgZ69a9g8WeO5PDYs9NtPKlvZgAyOx3L6YA7nPWsb4PNaPplxAGVp4JWViMHjPrXn/xL1WWH4gXE7xIzQN5akkg4HTvigC9rHxB8VaBf+Tc38d15iBpIj/B7AjHvVnwvYaj8Q9fS+1NSunxkFYP4WI9fWvP7O0u9c1t+EaR2BkLHjH+RX058PvD66Vo8AZFD4GcUAdbpelwWFtHHFGEVRjaBWkAAMDigDA4paACuN8beO7XwtaeXGonvnB2RBgNvuf8O9a3inxHb+GdEn1CcFyg+SNfvOx6AV8/WcepeOteuLmOEy3EjL5ssg2rGM5A4OfyoAzb0+IPHOrNLKJ23Z89yfkiXP3QO3Tp717p4A8E2XhnR1ihiJdzuZ2AySfU1c8L+DrHRtNWD7OhJO6Q4J3N68k11kcaRqFVcAdB6UAKqhRgDFOorE8SeKdM8L6c15qM4jQfdXqXPoB60AbLOqAlmAArifEHxO0TR5TbW7PqF7natvajexPpx0ric+KfifetOlzPpWgZxHEpKvMvckg85rvPDnw70Xw+Ee3tVMw5MrElifxNAHOP4w8fajI/9neF47WNV3gXbks49iMAH2rPufEvxVtQssvh+3cAfMIjuz+TZzXsSxIowFFKY1JyQKAPH4vjHdaazReINDurORDgkKSCfyrtfDvxC0LxHEDZ3aeaesTHDj8K6Sawtp1IkhVs9ciuE1X4R6HcM1zpYk029GSk0DkAH/dzigD0BJ436MKkr5+Os+KvAXiu3ttenlnsGJVLnPyOOMZHY/417XomvWetWaT2sySKw6qc0Aa1FFFABRRRQBw/xK8Wjw5oyW9uUa/uzsiRienc8c1mfD7wU+nvLrWpYa/uuTxwg64Gcmum1nwXpuua7Z6peoZHtfuIWO3PqRVnxLcSad4fuGtreaWQLhUhByPy7UAYnirx1baLK1hbI0t1tyzKQREMdSM8/SvLYtR8RatqLz3V5ESzhYvNl2q6/wC7yMnPTPatbw58Mv8AhI5zrWqQzWrSSEm2cnp+hFdNL8JrCKB/sckgZnDAO5wv0oA6Pwnoh02JriY5nlUBjuzgAdM964v4iXuoeIvE9n4c0uPzIIWDXDldwVscZ9MCur8Ua5F4L8IlizNNtEMA5ZmfHFZPww8PtbWMusXiyfb79vMl8zg/l2oA73S7c22nwxMAGVACBxVygDFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFBz2ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKQnAzQAtFFIehoA8j+KMd1qOr2NhDCH3Nkhmxx+dekaDaiz0uCAY+RAP0ryv4nGX/hI9IljRWj8/BwOc5H5V61pf8Ax4xk+goAv0UA5ooAKKKKACiiigAooooA80+MshXw7bKFDbpwMbAx/wDrV2XhtFj0W1RcYEajj6Vz/wAU4oz4RlmktoZjGw2+b/CfUe9X/Ad+L7wxZSblY+WAdvTigDqqKKKACiiigDiviR4VTxPoDQiOR5UPGyQJx3znjFfLeseHLnQbuSO5RpIgzKAHwwIOORX2yRmue1bwXomsySSXVmheT77AAFvxoA+NYrP5opUO5sj92BuOa9P+HPw7v9X1aLVL6F4bYPkApjOOePSvb7P4deHrSbetjG+37gYZ2109vaw2sQjhjVEHQKMCgBbeEQQrGowAMCo9QkSKwnkfOxY2Jx6YqzWJ4s1CHTPDl7czyrGixHk+vpxQB4/8IAlx4o1WaNsRpIwiDDJZSfX8K943BUyTgDqa8b+EFhJFDPeSs3znKq3JAPI5zzVj4g+O7xrkeHdAUy3U+Y5GUZx2IHpj6UAdT4n+I2kaFA4VzcyjK7IumcZxu6flmvCNRuPFUeuN4l0rw/cWkc56rGZC2fX/APUK9e8HfDDTLGwguNRt1ub0/vGaTkKevA/E16JHp9vHEI1jUKOgAoA8d0HxjqMUKi/huBdbctE8YTp/KtmT4iNLbSRxeRDOB0d84+uK7vUPDWmajzPZxOQD1Xr9ao2ngnRreR5P7PtvNcYZljxkUAeE+MvEK6pFLA95LqFzKoAjQYii56jjn617N8NLZrPwjYxSkbxGMjPSqviT4W6LrVqVigS2nUYjkjXla4PRPEOr+AddbStXQGAyEq2f9YpOAw6gHjpkUAe+jpVW/sYtQtWgmUFT2IyKWxu1vLVJl6OMgelWc0AeJeJvgdBfX013ZzkNK5YpkIFznpwe9cLrngay8KaHHDcxxtrN3KURPMDMieoXv6cetfSut6raaNpFzf3kgSGFSSSQM+3NeH+EBdePvHUmuXkSG3hYhI2G7YoztA464Oc5/pQB6x4B0uHTPC1lDDGUXywcHrzya6qo4IlhhVFAAUYAFSUAFFFFABRRRQAUUUUAFQXkC3NnLCyqwdCuCM9qnoPSgDxH4SSHTPE+taQ6vEySbhE+Mr+XFe29q8Q8SN/winxntbyOVxb6gAZVJ4BORxx0yPevbIXEkSsO4oA8++L1oJvCDXAVQ0EgbcewPB/nXD2fhHSbnRLS/wBW165MEZEjxyXAK57g/wAuK9h8W2B1Lw1f2qHDvC2364yK+fvDEOkarbXH9vSMyW2WUtOQBnqCAeuR+vtQBtaTrOk6J8Sha6GEktL1AjJbgAIwHU/lWV8V9GW18QNrE1s09tKgA2gkI3Oc8/SpIry01fxHpx8I6LO0Vq582QAKrDPU/TrzXQ/FuSWDw40bYVnUjGPzoA5H4S6TLqmqG5C/ulfLkqCD7V9IWdqlrH8q4z79K8o+CdtCNBWVRyxORjpzXsDOQvt60AWBTC4+b2FVJL1Ily7AAVzHiXxna6VoF9dLIFkjjbZ0OW+lAHmPjO+vPHPxDbSLFRLY2eEcknCt3OM8/iK9W8LeF7bRLbEMYDNy5AxmvN/g9plxI95rOoFlkvJCyqc4xk817fCFCDGKAJdvHFLQKDQBl+INdtPD2kT6jeNiOIZxnlj2A968S8K6ZqPxJ8Tv4h1ku+mo5EFu5ynXgAZ6Ditzx/d/8Jr40tvCVm5NvaMJLx19f7v4f1r0vw7oVroenpa2sYSNRwPegC/ZWENnGEiRVUDAAGAKt0UhYAckUALR3pokU9CD+NOoAKKKKAMvXdFtNc0qexu4leKVCpBFeCSrq3wo8RKsJa40x3AAkJ+QZ/lX0fXHfELw1Hr2gy/JukjXIGOooA3dD1eDWNNiuYXDB1ycHoa1K8K+E/iSbS9en8N37MFOWgL9cZ6GvdQcjNABRRRQAU1kVxhgCO4NOooAQKFGAAKpatqlpo+ny3t7MsUMalmZjir1cV4z8GXPi+7tYpbxoLGDLbUGSzHjnnH060AeO+Pdd1DxRP8A27H50VhYufsymEFAM4DE55Jx36V6R8MfHttr2nJazMiXsfyug4z7iu007wxp2maSNPgt08kLtKlevrmvD/G/hOX4d+IrTW9FaSOzdyTGgJ2nOSCfQ0AfRQIIyKWud8IeJLbxJosF7A3DLyDjKnuDXQigBaKKKACiiigAooooAKTvS0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAYooooAKQ9KWkPQ4oA8p+KER/tLRpASo+0c7VyfWvStN/484sN/CO1edfFaNo7SyuFk2vFPuBLAf8A167DwlNLLpMQlkEhA4YelAHRUUUUAFFFFABRRRQAUUUUAY/ifTV1Xw9eWjRmQtGdqrjJPbGeK86+FWoy2kt5o1yJQ8EmR5iBcZ7cfhXrhGRivF/iNp8nhDxBbeJbESRwyuRP5fOW9/rj6UAe0KdwzS1zXhXxRZ+INOjnt36qCVPUV0uaACiiigAooooAKKKKACvIfjJrjzxWvhuyaRprlszLF1C9uMc+uPavRvEGv2eg6ZNd3UqosakjJxk+lfPmhy6j8QPHf9qyNK0UUoxj5cLngfSgD03RLCbwt4LmuBExuIoSThMlsAgHArifhht1fxlfahcyyyPHlsSnjcTzgHpXtxsEn0uS2dcq6bSD0rwXXNM1X4c+I4NbgSSYSZN4GcFWUkdB2Pt7UAfRUIGwYPGKmrkfDPjjRdesY5LO/hdyoLR7huX2Ircm1uwt0LzXUaIBklmAxQBpUV5re/GzwraX5tRPLIB1mRMoPTmr/h34maPr+9UuYkkUn5d3UevNAHdHGK8I+OTJDrOkSLG5fDBnHCquR37fX2r0HWviRoWlWjyLqNpLKpwUE44+uM/lXhHiHxZH4x8dW15eMDptsAI3RSuR75HqaAPozwk06+H7UXMwlcoDvxjIqzrfiTTNAtPP1C7jgQ8DceW9gO9eLP8AFfV7uX7DoFjHFGija8rZd+3yjpSxeDfEviy7tbrVrgyZOWVmJQDqeM4BwcYAxQBoXWp6j8WNZeyspZ7XQIGwzKoPnng5Ofr79K9Y0DQLXQ7JYLeNQepIUDJ7nApdC0Gz0W0WG1gSNRzhRitigAooooAKKKKACiiigAooooAKKO9FAHlvxksHXTbTVE2f6PKC27OcjpjA+td34avl1HQrS4V1bfGCSp4zjmmeK9P/ALS8OXkIClwm5d0Yfkc9DxXG/CLVml0a402YAS2czIQD2/pQB6POgeNge4r5W8Q6Jp+l/ES5s5jLLbzzbmiVyig57k9e9fVcgJQ7etfPXxU0yWy8YfblTEbqG+Xg479/XNAHsnhnRbDT9NjS0hREK547nrnPeuP+MfhufU/C8lxbAmSD5iAccZGf0zXZ+DLoXvhqynByWiGeMVt3NulzA8UgyrAjFAHlXwckhPhtYhgSox344zzXomr38en24kkYKGOMnoK8sjM/gX4gS27tEumXpBRVwNnYEj6it74ka3pw8Kuk1ygkJDxKG+YkZweo4z9elAHBalquufETxHdWFhcz2WlWhKl4iQ0pzjr+dYOq/C7U4pEgs7uYhz+881sgj6d6m+G/jSw0PWbiDUJVSC7ffHIpyqE9Q3pXvNvLY6msN3a3Mbqw+UqQVagD57jvPGHgFh9te4+z7R5ZiQvEOehz0r2bwD8RrPxPH5DsI7tFBZOua6vULWxlsGW4jjZcfMGAxjvXzppd3aL8TpE0SJo7Vpx+7GUAOec4yMZoA+pVYMOKralcrZ6dcXDttEcbNn6D8afasWgQnrjmuN+LV89n4AvtkojaVkjB9csOP0oA5X4SWH2681PX5iWmu5my2zAIBPSvYRhVznAFcZ8NrJbTwlYoFAPlhjjuTXYzgtA6gZJUjrigDkPE3jqz01Ta2dzA964by1Ykgkdsj34rgb/WPFuo2VvLNJOEkILJaJuXBPdsfpivO/HUs+l+IZ0k8ouHYIyqcsOnOeKl0b4matpOiQqUimCsQc5+YDoPY/SgDes/iNrGl+I/ImnuGskc71kGWUZ6gDBwMdK958Oa9ba9psdzbzCTI54wQfcdq+NdT1mTWNflv58hZHLbOoUGvbvgtq0gPkuVCynjjrxxjigD3WigdKKACmuoZSD0NOpD0oA+cvGbJoXxbsbiByjtKoZuMYPFfQtlL5tpG+c5UV89fGtVXxbBNG2243KoVRnPIINe7eG3Z9GtixO7y1znr0oA2KKKKACiiigAooooAMjOM81l+IdKGs6FeWGdpmiZAwxxkVqUUAfOfw21O68J+Mn0G83QxO7JscgDcDwR65r6JikEkYYHORXhvxk8NvpuoR+JrVz5gYFUCDhgcn3NeleAtbOu+GrW8dBHI6AugOcHvQB1dFFFABRRRQAUYxRRQAUUUUAFFFFABRRRQAUUCigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooPSgDz34rWiXPhp3Eqo8Tq4JXPetDwBdC40K2bdlig3cY/SpfG1mb3wzqETAH92xGcdcVzvwx1JTp8FoxBkQYJ3g5oA9PooFFABRRRQAUUUUAFFFFABVW+sob63aGeNZEbqrDINWqKAPDPEHg/UPAesNrfhoS/ZWy00G75R9FA6V3fhPx/Ya1bJ50ghuMfOjHofr0rsri3juI2R1DAjBB715rr3w1b7c99o5t4ZpOGDIRge2Dj9KAPTEmjkUFHUg+hp+R614kqeN9HeKKGykdR8pZZiRj3pD4+8T2N60U2nSsq5BPPJ/GgD27Io3D1rxVvi7fRK/2jS3DKORG27Jzjr+tRz/FTUZYGFtbOJ84VNnA4/vZ65NAHtM11DAuZJFUe5rmta8d6RpNu8k1wFUA8txkjsPU15ZDf+OPEMa3kQjt/mICzIxJXjkD/APVWh4b+Heo6hqDXviV/tknVA4IVPoM0Ac/qVzqvxL1weTI66ZFINsbKBuP0NeveDPCkOhaeF+zrFK2d5AHzcnmtrTNCsdOQC3t44yBj5VArVAA6UAIq4GKpalpNlq1v5F7bRzx/3XXIq/RQB4d8RfhPpVnpl1rOm28ySRDeYbchRj1HHbFeJw2T3dzaeZcu6TuAElcjd6+o6n9a+2J4lmiZHUMrDBB7188a94Z02w+IX2ax08ukcqsIlB2xs2Dnjtx06UAa/wDwo7RnslkhuLmNzgsd2eO4HpXA6Z8OIta1iaCwvybaNjlzndgHoQQPzr6L1e9XTPCN3ckf6qBjgE56e1ef/DLQsPcagzNIJCdrOoBz36cnt1oA898EeBdP1Dxze6XqMTSxWpIGZB8xDegr3qH4ceHFVR/Z6BRztUkL+Q+tee6BaJZfGO+CMz7pSWIUbVyM4Jx1r3EdKAMu38O6XasGhsoEYcAiMZ9K0kiRBhVAHsKfRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA2RBJGyHowwa8T8Pr/AMIp8Wp9KiMgguwSS4zuPUYPsK9urxT4qRDSPHeg6xDGVZ5AHcHAPIH8sUAe1A5WvMfjHooufDyanFbwyzWjZPmHGV9M5FekWcnm2kb+qg1neKdObVvDOo2MePMmt3VM/wB7HH60AYfw3uUl8KWjJkKV6Z7967M8ivGvg9q/lW8mizNtlgdvkPHfng89TXsg5X8O1AHiHxq1SEPaxR2iG7RxiVlG5Bntn1qh4R+FEeqQW99r1xcXTMAyQPISqDqB71Q8eadLJ8VYoL0vOkrxlW2cFc9DgEHnive9KtkitY1RQAoGMelAHC6z8ItF1VFMUP2V17w/LmuZtvhLr+hyl9I1yVU2kbM4wexH6V7mAKMA0AeFX3gTx3rkE8F/rZFucKqtnLDB5O09efyri/D1g/gDxqLPXrdM+Z+7nIwMHHzAntX1OYwe1ebfGTSLa48I/a3jXzYJkKv3UE46igDv9NuUubNJI2VlIyCD1rz742XGzwhHGIg+Zw5J52gd8fjU3wtuZf7GMDRukKN+6Ehydp5pnxasp7rw+xjRpFQEkHbtHB5we/T/AD1AOp8Hbf8AhHbLAH+pX7vTpXQ9RXBfC+/e88I2O+QSSKoVmxjOOK76gDwn4z+BNS1C/wD7YsLT7UDGI9qhiynvwOPxNeFXlpqFq4tbiylt2iXDqUIPPc190socYYZrkPEXw28P+JJZJbu02zOMNJGxUn0Jx1/GgD4/sd32sKkIdmGMNX0L8F9AniWfUJ7fy0ZsRluWbGcn9T9a6DTfgr4b02YyJHM2eu+TOB6V6FY6fb6fbpBbxLHGgwFUYAoAtUUUUAFNY4Uk9BTqp6rdLZaZcXDZwiEnFAHzv46Da38ULK0jZiZJgeuRtB9vpX0LpUPk2iLjGFFeBeCI/wDhIfifdXjqGSzVsOpyCxP696+hbWPy4VBOeO9AE9FFFABRRRQAUUUUAFFFFAGbrulwaxo9zZTxq6yIQAw4Bxwa8n+Et3Jo2saj4duE2SRyGRDn7w6GvajXjnjWOPwp8SNN1wQsLe7BSVk3Yz79qAPYgcilqvZXEdzaxzRsCjqCCKsUAFFFFABRRRQAUUUUAFFFFABRRjmigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKAc0UAFFFFABRRRQAUUUUAcx4sndNKu0RAT5ZIz9K4D4SyedFI8gj84SnJCkMfrmu88WuV066ZRkqmQM15b8KGuBrF5OwJSSXGc5GcmgD3sdKWmocoKdQAUUUUAFFFFABRRRQAUUUUAFIQDS0UAMaFGHKiqs2m28v3olJHTirtFAGM/h2xfrbx/lSxeHbCI5W3jUn0UVsUUAU4tPhhUBUAx6VZWJVPAFPooAKKKKACiiigAPIrznxR4Y1xtdbVdIKyFlz5TSEAMBxxnmvRefWloA8c1HRPiHqtjLY3L2ogniIfaq8HGNvuD17Yz36V1vgTwpc+GdDW1uZVkk+8SOxPOPf0zXa4FB6GgDxfQ4tnxg1ElSZGkJbKbdoxkYPft+dezqflFeR6TcxH4wasvlksBjzDn0HHP0x+FeozajbWluZbiZIkXqzsAP1oAu0Vwd98W/C1nM0S3pnK/eaFCyjr3/AA7VLpfxQ8N6kqEXqxF32Kso2kn6envQB29FRQzx3EayRMGVhkEd6loAKKKKACiiigAooooAKKKKACiiigArhfirpMeoeDri68oPPZ4mjwuWHrjiu6qjrMJuNHu4lfYzRNhtu7Bx6d6AMPwBria54XtZ1I3qgR19GFdSwypFeO/BLUvk1TS9+5YLgsp6ZyT2r2OgD5+80+F/i41nPvWOW5d48NwRJyM/nXvVs/mQqeua8V+MsX9k+KdI1yEojqRvZhuztPpj0NeuaFex3+mwzxtuR1DA4xQB5z8ZPDN/eJY65pURe6siS2xdzYHIxx65/OpPBfxW0i+05ItUuobO9iXbMkp2jI4PWvU5YlmjZHAKkcg14l8TfBnhzRbKTU4NPUXkz/KsZKj1JwCKAPUbfxloFyF8jVrNy3ACzKea2UuYpACrr+deC+HPhbZa/wCGob3dLZ3cy71YMWHXIJB/lWN4hk8W/DzW9OWPWptQixvMOSflGAcg5wDQB9M7ga4P4u7T4CuuMv5ke0Zxk7x/9eubsPjno4IivbO9t5ApPMYIJHbg1znijxZffEkxWWlWcyafG4Ylg2ZmHbjpjNAHoPw2i8rRYFdt8pHzHIPP4V1+tWEd/p0sL5wQQcHFZfg3SptM0WCC4ULIi845/nXTlQRzQB4n4N1mXwj4sl8O6gsiwTyM1rLK2c+2e9e1RyK6ggjpXCeOvCY1e03wuyXEZ3xupxyO2fWuV8K/ES/0WV9O8UAgRfKk4jPzdOD70Ae0UVU0/UbbUrVLi2lWSNxkMpyDVugAopCM0tABRRSE4oAUnAryj4weK/7P0mSxglKyMMHGO4+tdf4x8TR6FYHZMFuCCQNueB36182XKXnxB8ZQ21mHZHbEsyg4x3PPTjtQB6Z8DtFZdMudSYbDdPkADoBXtqABQB0FYXhXQY9A0iGziHyIoUZrfoAKKKKACiiigAooooAKKKKACuJ+KOhLrfg25VYEkmhxJGWbG3HU5+ldtVTU0Mmm3KL1aNgMru7enegDmfhxqX2/wnZklS0a+W23kZHHBrsa8h+D+puZ9V0x2/497liq7duAT6dBXrw6UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFHagDjPGd7b2VvN9oLbTExwBngCuV+E2mo9hJd+WVEkxZM9evemfFnV2hBsxcbDKMKofBb1GB1rpPhjaiDwzbsHlfeN2ZVw3PtQB3YGBiloooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigApG+6aWo5shGIOAAc0AfOOp+KtQT4j6ymgQxzTSSbfMyxxjjGDx1Hb1rck8BeKvE0cEuqamXz8xV84U56AduKvfD2ztLzxbq99GdrySsGRmD55PINexxxIqqQOgoA87034V2NuwNzcTzKQCRuI55z0NaGr/DnRL2waKO2W2mVT5c8Q2lD1z+YrtyQv4V5/8AETx9YeH9JubSC6zqcqFIkVd2Ce59KAM34TeIL+8ju9JvJjP9icxiQgAnkjGB2GOteqDkV5Z8HdDmsdBN1OiLLO5c7VwfxOa9ToAKMc5oooAKZLKsMLyucKilifQCn1U1S3+16XdW5yRLCyEDGTkY70AeeW+seI/FM017pmoJZWyTFBCUB3KDwTnkEg/qPStPwJ4rutRnudI1Vw+p2rsJCq4BGeORwa8fk13xH4f0290dUS2MUuZZwuGUFh0PTjpxXs3gXw8ml28l48rTXN2RLJISeTj0J4zQB2tFFBGRigAooooAKbIu6Mr6inUUAeDac0nhT4zzWjs6W1zgICMBs9PXgYx2r3dG3ICO9eI/G2xmsNV03XreFgUdFeXOBkNwP0r13QL4ahotrdA58yNW/MUAcZ8YNNW48NR3oCbreTBZlzhW4P8ASovhRrq32jtYkYktTtJHQ57j05zxXa+JrBdS8PXtsVDFoiVBz94cjp7gV4t8K7oWXjK5s8ALPCHyWJJYHB+v1oA9+rxT4pw/2v4007THIEbKE+YE4JOSwHA/nXtanIFch488H/8ACT6Uy2xhgv05juWTLL7Aj2zQBo6JbQ2OlwW8WAsahcAdhXkfxLunm+I+l28UgHlhGGxcuGycjA9RWLr2s/EH4cQRW1xdxXNs7FY53G4sfTk5o8Faf4k8TeMYtZ1GJ8CQOZJIAOMEYHHFAHuNnoNjd2ym4tIZCy4O+MHI961LPRrGwjKWttFEpOdqIFH6VZtYjHCqnqBU9ACAAAAcYpaKKAGuiyLtYZFcH4x8FpqKm6tYF+0KwORxkZHX8BXfUhAIwRQB4Jpeq+IPA3nCGNbuwLFhb5IeP1Ht616J4e+Juh615MRuFguHH+rkYAhvT610up6Bp2rWr293axyI/XI5/OuGv/g5otzG4iaeMliwxKeCRjP8vyoA9GiuYpV3I4I9ql3DPWvJLX4eeK9IumbT/EDeSVCiOZmbA46e/v8A/rqvLoPxLt2VYtRRw2QX8zJXPc54/SgD1i61Ozs1Zri4jjCjJ3MBgV5t4s+N2haKWttNzqN2QQPJ5RT2ye/4Vhv8G9X1b5tT1uUO77ppASzP7e3Wuw8N/CTw54fWORLJJ7pP+W03zHPr6D8KAPII/D/jT4jX732pJ9jtZ2DYZcHb7D6ete4+C/BVj4X0yOCCEBhyWPJJrpYLGKDkLk9s9qs4oAUcCiiigAooooAKKKKACiiigAooooAKa4yhHqKdQelAHi/g+wm0v4parGXQBwSETAGM8ZUV7OvQV5neutj8YkYqpNzagZL9Me2P8a9LQ5UUAOooooABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFRXEohgZ2OAB1qWsXxBqMVlYyuzj5FLMO+PpQB8+/Ee+m1nxzBbQXhCq4Ux7yVUjuR75r3rwegXQLXoT5Y5AwK8K8NxR+LfG89+ke1FmAJKYORkjBGR0HevoywhEFskargAUAW6KKKACiiigAooo5zQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVk+JrlrXw3qEyffWB9v1xxWtXM+P7lbXwbqEjBDiPgPjGe1AHAeAtX0vRdIlubyVYWkmI+Zskk8nqa6a/+Keg6fa+c0xePgIUIO7Iz2PT/AANea2Pw21XxLbrNHqMVvaS/MFQu2MgBhjOOfr9K7rSPgxodl5TTB5nQ7yWxy2APTgcZAoAwNV+K+sa0VsfDekss0vy+dMwZR16bT/XrS+APh1dPqq63rayPcEhiLhdzbiOTkn1/GvWLLw9p1gQ0FqiMBjcBzWmqKvQAUAR29vHboEjUKo6AVNRRQAUUUUAFI33T9KWkb7poA+cPGEMraz4ykjjZo28tUkAxuIIyOTzjmvb/AAazP4Y09mXDG3QkZ9hXifiuCWzbxRbzxiMS3UKKAdy7C+QRgcen+Fe8eH0SLR7dEwVWNQD68UAatFFFABRRRQAUUUUAcZ8T/DreIfBd3DCm64iHmRD1I/GqHwi1t9U8JxQSxlJbQ+S2RgnHqPWu+miWaF43UMrKQQe9eRfD5Z/D3j7V9HuI/JincyQoBwQD19qAPX3UMpU9D1r5w15JfCvxHdIo2iQTboiicBCc4yMDnPT2r6Rrx740aPmG21OPeGJ8pynrzg4HXr+lAHqWk3QurKOQc7lBq8RkV518MvEBvtBt1mYCRV2uD6ivQxKpXduGPWgDxP49QJONGhOR87tuzx2HSvU/DNpHBpFsq84jHP4V5P8AF51uvHWi2zIzxqq7xztwzH0H9a9l0iNYrCJEXChQAKAL9FFFABRRRQAUUUUAFFFFABijAoooAMUUUUAFB5FFFABRRRQAUUUUAFFFFAARRRRQAUUUUAFIaCM0UAeS/EEyWPxF8P3/AJR8tj5YbHGSeefyr1W2bdAp9q82+LANvcaDftGWihuwHIXkA4744r0TT3WWyidehUEUAW6KKKACiigUAFGaKTNAC0Ug6UtABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAIehrx34u6ndadpDWtvLB5l2+0/OAwHtmvYZGCoSTgYrwTxVKviz4nW1la2rSfZAUmcqQAPfIoA7D4W+HZNM0GFrhU8xgG+UDH4Yr0tRgYqjpVqtrZxxqOFUAVfFAC0UUUAFFFFABRRRQAUUUUAFFFFABRR0ooAKKKKACiiigAooooAKKKKACiiigAooooAK87+LFwjaRaae0TOLqbBYcBcDucEc9K9EryT4izw3viuztJ3k8qBA21T/GTx9e3pQB3nhawhstHgiiXamMgFcda36oaTG0dhErkltozmr9ABRRRQAUUUUAFFFFABTX4U/SlJAqveXMdtaSzOQFRCxP0FAHy34/vp08ba9pzOssVxKnlNjJQqwOOO/WvobwHK83hPT2kYM4hUMcY5AxXzx4ysZpdM/t6VAJJ9T52gjIK5GD+Fe+fDtfs/hSyRpPMLRhg315oA7KikDBuhpaACiiigAooooAK8Y8asnhr4r6bqqytEt4mJMKADjjk17PXnXxa0eO50SPU87ZLPJyIt5YHBxntyKAO+s51ubSKZTkOoIrm/H2mPqnhXUYY3ZHWEspUZPA549xkVP4Eu/tvhGwm3ht0QOcVu3MQlhdD0ZSDQB8s+CtAl1m8vI7TVrvT7qKT5WhkbH1xxkV3cWseOPAFwh1tjrWiD5WniXMiL6kdfrnP1rD0W1Xwv8V3sVkDxyllyOMt1/OveYkjuYFDKCD3xQB4B4h8YaT4w8YaPdWhkMcYVZdyYMZ3cZzwB+NfRGmEfYo8HIwK8G+JXh+10zxto88EUEUNwwEgWPbvweSccGvd9KwLGLGMbRjFAF6iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDy/41hf8AhHrNyrELcrkqM12/hh1l0K0kXODEvXr0rkfjDZJdeF0d5lj8qdW+aIuPTnHT61v+CJkn8LWRhlVh5YG4A4P580AdRRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAGD4w1VdH8N3l2WAKRkj59pP0ODzXCfDTS/PuLzVyXzdsG2tL5hHfn0PNZ/xW8RzX2rWvh7T5kZmfM2wZKgds9sntXpfhexNppMCuPn2DcffFAG4q4UCnUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFIWAGScCgMCODQAd6WiigAooooAZK4jjZ2OABkmvEReLrnje8v1dvIEnlcKGBGQP7xwcdx6V6d441X+yPCl7cq4SXYVjJGfmPt3rzbwDYzTamnKMuVllbaoPfGBjI6/5yaAPZrZdsCD2qamoMKBTqACiiigAooprOqKWYgAckmgBxOK5XxV40s/D1odrxSXLYEaM2FznHJ/zmuf8eePpbLy9K0SJLu6ugyK6PwhHY8fXj2rD0H4d3WuSi+8UlZHkXm3jyoB9yMUAVL34rX11dNBEyhAwQfZ87z7gdSMc8VkeIPEHjjWorqx0y3vXgKhWcw7fMUqR8vPAJ59a9osfCOj2USJDp9uoTG392CfzrZW0iXogoA+Y20rxdqnh86I2g3SpuWRDIAoRsk5yQOPb3rV/wCEm+IPha0gtLrSPLjwAjRJuA7fw5/Kvoj7NED9wUPaxOPmUH60AeB+G/i3rUd2sOqxMdkgSTfGYwR7ZGN3fBx1r3DSdZtNXtFuLaZHUgE7WBxkZ7VW1fwxpms6fJZ3dsjpJycDBB9QfWvKrvTPEPwvupb6zke+0IFfMiyWdBnBOPp7gUAe4UVheGfE1h4l05buylDqeozyp9DW7QAUUUUAFZ+tWLajot3aJKY3ljKq4AJU9jg1oUHpQB5X8I9Suo47/RrwtvtJiqZXAx6CvVOoryHxYsvhT4g6ZqsTWdtZ3L+VIRlWfd1yBwcHv9K9YgmE0IZTnIoA+e/jLZ3WkeL7TULGUxzSMHiOM4PQ9vWtLw98UtX0iFF8VaZJDakYjvIIiUY+/wCFb/xwtF/sbTtRa28429wcrkdxnnjkce1bHg2yttX8JWRuoIZAUBKFQVBx6HNAHm/jLxRZeLdU0W50y5ZofOZH38BSMYO0ivetIBGnwgtuIUDPrXinxM0Sw03XNMjsLS2t8/OdgVcYOc4yD29+le06Kc6ZAc9UBoA0aKKKACiiigAooooAKKKKAADFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUfSiigDzz4xO0fgtyqb8zIGG7Ax6k1Z+F8jP4TtQzqzKCp2n/OayvjRGZtBs4hgbp8klsdB9ak+D6NH4bKFw+2VuQc96APS6KKKACik5zxS0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFVdRuls7CadzhUQsTkD+dWq5/xlfJp/hi9ncxhQhB8w4Bz2oA8k8F2yeKvHWpalcbpVgm/d73BK/gBg/WvdbdAkSgDHFeQ/BeGWTT7i7eCOKOR8LsGA2O+MV7Eq4AoAdRRRQAUUUUAFFFFABRRRQAUUUjEKpJoAWiqkWo20t09ssqGZBlk3cgVJdXUdpbSTyECONSzEnGBQBPRXO6N4y0vXBKbSUERyGMnPUj09RW4J49mSwxQAT3MNsm+aRUUdSxwBXOap4/0DS7d5pb+JwvQRtuLH0HrXnfxJ8RKPEKadNqTQ25AdlESkBcY69T+Vc79r8JCxVhO1yrEny/s+GJ5HpwPpQB2v8AwuqzlvUWK1YwyPsUscHHqeMAV6NZ6zb3VolwsiFGGQQeK+avtr6lo9zb6d4ftlaAlppiuxVAPB4Pp710vgPw5eeIdPQ399J9mic7YY5flP4D3z3oA9suPE2k2wbzb6AMoyy+YMj61x918TJZbsw6ZpjXSbgBIGJyCOuAOnar1j4C0+2uHmkkml34JRn+U857dR7Gt9LSzsYRHBDGgHACqABQBwe7xv4gs5J7i7XTLdSWCRIVkwB7/wBa1Pht4ludV01oL6ZpbiJuWbOWUnjtWxrniHR9BsWe+vYow3CpnczE+gHJrgPhc8S6/fwwF9hYn51AJGeD7fjQB7SORS0i/dFLQAUUUjHapJ7UAeV/GG+YwWenoVy5LEOpwc8demeTwa0vhzpX2O3MmYzvUNhMHb14Jx/n2rj9fnbXvHM91JDG8MJEEK/aVUuOTnrkfQjnPWvXdAtVttLgVYwmEAxnP60Aa1FFFACEgDJqJbiJujg/jVbWdP8A7U0m4sxK0RlQqHUnKn8K8O07w/dW+t3WjT6xe2OoRHfFJDMQrrnjIxgmgD3ozoELkgKOa8l8T+NtT8Q6tN4e8MxB40Pl3VySRgcggEdOnXNc54u1LxHoiJpdvrD6ks6hWikwJFP+8uDg4713/wAP9Bj0/Q4M2yQzOoeXGTljyeTzQBB4S8AQaXOLy8PnXjc7j0Ukc4H9a9EhhWNQAB60yJFUnjBqyuMUAKBgYFFFFABRRRQAVFNbxzxtHIoZWGCD3FS0UAeSa1pl18O/EA13TC/9iXMoF9arjERI4dc9s4GK9L07U4L+zS5jkVkdQwINS6jYwahZS21xEkkcilWVhkEV8/SXmveEtYuPC+nXiRoZMQGXn5W6YGM/5NAH0Bc6la2ah7ieOJMgbnYKOenWn2t/bXoY28ySBTg7TnBrw7VtBvpNLfUPEWtXE8MKgvChChm7AfnW18GrGa2tby7cSJHcy5RWYkY9RkUAewUUDpRQB5/8WvD8Gs+FWnaKdp7RvMiaDll9eO44q98PNdj1vwvbTAneqhXzwcjrXVX1nDf2ctrcRrJFIu1kYcEV5J4KR/CPjXU/D0sEkcUrmW3kLYUr6AE/XpQBv/GOVY/A8j7CZPNCoAMnkEVZ+GULR+DrFGCg7OgBGD+Nch8YNWGpXWn6BbqZn3ec6xjcQ38PGc9M/nXpfhayNrotspi8tigLITyDQB5f8bLVxf6RMArLlh8wBxzz29xXqnhaWOXQrVoirL5ajKnjgVwPxwQf2HZOygospzxk9Mjt/hXXfD9ETwpZLGyFfLH3elAHV0UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUmKAPNPjMsT+G7fdnzFmDIApPI9x0pnwfR00B1K7V85sEfxCofjXPGmj2IberCYkOvbirvwgj2+E4yQd29ixLZyc9aAPR6WkxS0AFFFFABQaKKAAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXm/wAWlZtDcpH5jKjfKS2PrxxXo5615l8YHm/sZUhWVmPVVk2oR/tY5NAFv4Tqi+DrLbt+6f516EK80+EOf+ERt8ED5jwAeOenNelgcUALRRRQAUUUUAFFFFABRRmomuIk3bnA28nJoAlqOZgIzzWBf+NNIs96JP58qruKRAnA9Sewrkrz4g3+t2EQ8PabPLLOxUuVIWMDuSwAIP8AWgDP0W6ki+MupxeYTGYQcE59Oa9N1VPP0e6Qoj5jI2vjB4714Jol/feHviy8OrzJJJd91YkDPTrz+Fe/b1msmBPDLz9KAPmbTfFcvhbV7y1SwWacy71WBvl/QH07V2tm3jfxnEgmzp1ky5ASQo2fw5I9jXOaBollB8T763uIZfLVmMPnemete2WWraRaQiM3tshTjBkAx+tAHhPjbwTNot3DLPPJco4DMztkgjPrk11HwxsdPf7VaTWcBuYHJWYrkspJ55q38S9d0rXLGW10lDeX0Q+eWGLcI17/ADdK4nwbe6ydQaPTGVJLpELO7AcLwcZB54oA9O0yytbXxXrWmiNAtyqzLhcDBG0/qKx9G1vSvCGuXkN/qJhP/PGViR16qCO/tWYbPxNp/jHTNT1W9iaGV/s+Y1yQDkgE4Gc/StDWdN0qXx5BLewLJI7BQZMkYwMYAXHX1JoA3n+I91qkgi8OaNdagp+UXGNkO76+lT2/g/xHrMjSa7r8qwSEs1paDywB/d3dcf410YutM0PT/MnmgtoVzjOFHr0rJk+KvhqEER3M0zBchYoGO76cUAaGn+APD+kuJrXT4VkXkOwLEfQnOK5HQVTTfipq1qN7ediRSx+6MZ49smr8nxM1G+UnR/C+pXK54dwEUj15rl77UbmHx9puoahbyw3EqKWgXDFeSPT0x0PagD3RDlRTqhtn8yBT7VNQAVm67qEel6Ld3chQCOMkb3CAnsMngVpV5j8VNf8AIW10qEh2d1aZNxUhe3Qjg4OaAOQ8FRDUPEELgPsLmVcOGKduuD2K9MV7zAgSJVHQCuD8BaZDFEZgT8p2IrDhAOwJFd+OnFAC0UUUAFcV468M/wBq2RvrQtFqNspaF0bGT1wfUZArtazddkEGi3kpO0JCzZ9MCgDxPwhZyax4imk1W3mN1j995uDHnjgD8K9cvb2PQtFuLxkysETPtHHQZrz74YWNu9qdSgYv57YzwMY7bQOPzNdj41uFg8GalJJvCLAc7CAfzNAHG2fxusJ0klu9Kv4Ykk2NJGnmJn/eFdBp3xc8L3UzwNf+QV53XCGNT9Ca4X4UGCw8Jahf6gFW2EzOWYZOBjr610X/AAn/AIFv3CSXds2cDEsOPzyKAOoHxQ8JZCnXLMN6b/fHWrI+IvhYrIw1uy2oQCfOGMkZ4PfofyrFtrTwXc22YrfSWik9FjIPf/Cnf2J4JtY5J/selRqWy5KIBkcf5+tAFuf4seD7eTy21q3d/wDpmC4/MAiptG+JOha7q406xlleRh8r+SwU98Zxx+NRWemeH95WwgsVdeqxIufxxXC6dMy/Fq6tYGMO2UElTlXGwcY7d/zoA9xByKKZEcoM0+gAI4rxT40aS9vPZ6xbrl9wUgJkgqcjB9TyK9rrhfilaNdeFHERAmWRSjZxjsee3BNAHnD67/wnc1jpNlvWBU33RIHJIIA/D1Br2Dw9pkWnWMUEYCrGoVceleH/AA2ntLTxhc2yyjM8e9ADu7/MCfXJPbtX0HYY8v1IoAvDpRRRQAVx3jTwPF4pNvcLcSW11bEmORDz/OuxooA838IfC+HSJTfavMb/AFElSJpDu2hegGf516MqBFwo4p1FAHnvxYtPtXhyFt23y51xlAQSeOc9B/jVX4Q30s2jTQNtaOGUqhXAAHoAO1dL4/sxeeD75TH5m1d4X6enofeuE+DUuXvI4mYwrtABHT29PyoA9iooooAKKKKACiiobm6hs7d553EcSDLMe1AE1FVbLULbUIRLbSrIh6EHNOvbyDT7SW7upVigiUs7t0AFAFiiqWnarZatAJrG5jnjPdDmrtABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUdqAPF/jleNBJpcaumCWZk4J+uDXbfDe0a28JWYdcOyBiMdM1wHxlVo/ENjcu0fleSUwRk59eOccivTPA0bx+FrFXOWES8jPp780AdLRRRQAhApaMZooATvS0UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVwfxMtJrnSAVV/JXPmOjhSo+pI/ka7snArnvF9rb3+gzxT7igG7Cru6e2DQBw3wauBJpt1EpxGkxCLvLEfia9aByOteEfCDUxbaxqGmSSEYkJVPTBxjNe6xnKA+tAD6KKTGKAFooqOdmSF2RC7AZCjvQBX1DU7TTLdprqZI0UZJJrgr74waZHOLbTrC7vrgttCRgc/1/SvOtUE3iTxrfQeIdRksbVGJjV2UfLnkZ6dq7Gz8R+DfDQW3h8vzM8vDHuJx3LAUAS3XiXx5qzltL0ZrOM/dNwVXH1ByT+n40yPwn4kvZmk1zxISjAhooolGR25I/pU4+IjXpcaVpF/cKoBSQQfKx9Ac+9Z6aB4z8SytJqN4dMtpD/q4SPM2+nGf50AXDpHgnwlHvu3i8wNuPnSF2Lf7vr+FWU8ZtdkQeH9Du7xFUfP5flIue3zY/StPSPhrotjJHcTxPeXQOfOuWLnP0PArso7WKJcKgH0FAHz9438NavJbp4iurGODU42DmKIl1I4611nhb4paPcaSYr68WG4iUKVY5LHHbjn0xivRNYtoprZw2MY/CvMtW8GeFJ2FzfS28Euc4QhS/Hp1oA4Oy0uXx18QdRvIr27istxCSAkNj0Gegr17RfhpoFpaos1kty3UtcZck+vNYGjap4X8N7IrF5WL5YADG4/jj2rbuPFfiC4AbR9CeSFhlXmO3I+mRQBa8Z6Tb2vgy9t7CBIBswPLVVCjue1eN+DtThXxDYCOVwI2MZQnqCOpI4659K9HvdI8Z+IbVk1G+t7GM4HlRKSGGDnPPvXjd9oKaL4mls4L5N1uPMGS3BHJBwP5UAel+O/GWku1rp9tOkk9tcI7gAEdcYBPf6VY8c21w8NtqFsVRyiv5knKoQR6DI/Ouc8vwld+C57lvsS6iyNIN8g37/bJyPapdQ+IGlXPgizgku5ftS7VkRODx9QQelAHaeGfh/a6hHb6prN5c6lcyKr4mc+Wp68L/jXodro1jZoFhtoox/sIBXl+h/FPRLDS7azg+23lwsagKkeWbnHU4FS3XxcvJJ0j07QLiXcQBubJ6c8KCOPrQB6p5ESJwuBjHSvJvigbaz1/RJ0cPcyEoITHv3DI5HzDHWhfEXxC1qW3gg08WAlJ3zGHIC4HPJODz6c1b0T4Uyyat/aviTUJdRuQcxrIxIQ/Xj9AKAPTdLZmsIS3UoM4GO1XajhiWGJY14CjAqSgCG6uI7W1lnlYJHGpZmPYCvn24vT4o8Xz6izE/vSIIyu0FQMDkjn1/HivQ/in4ol0bS4rS0lCz3DEMuAcpg5HPTPSs/4aWAKyu8SiMgMnyjofw9jQB2vhvTG0+wijdmb5QTuYsQfxroBTEUKoA6U+gAoopkjlFyBn6UAPrnPHM8UPg/UvOdkR4ShZU3EZ46d+tb/AJq4PPSuE+Kt3Evg6VXmMcZkUO69QM9vf8qAIvh1ZPbeGrUSPIzkE5k4JGfTtxXQ+JNF/t/QrnTS4jM67QxBO0+vas/wxIkGj2sfm7isa8k9eK6MXETqPn/I0AeM51r4cyHT59Pn1XSHBc3EKEsgx90j/PWqXhqLTPGfjiW7+wwrZRw+WiPb435554xkf4V2/wASfEAsdJjtLcxtdX7+Qis3OD1PHPt269RWx4A0KDSNGijVVL9SwAyc80ARx/DPw6hEn9nQjb91RkAV538QtK8G6DIJZdPieeQlvLDN859AAe9e63MyQwMzEAAc14qLW28X+OzfyBHsrFikasvV88k888jrQBwnh3ULXTddj1WTZpflg7bS1gZ3de4Zj9K7vwDBdav48v8AXZrWWNJC3lF4tuFyMDkdce9ekRaZpRbcbaAnGCSgrRtmtYeECLjgYxQBrJ90U6qa3kQHLjripPtcIGd4x9aALFZet2y3ljJASV3DIYHkEcg1NLqlumR5i7h2z0rC1fXI442+Yb8AqM9KAPm3SZF0bxcrAqlzbam0ZPHKscdvx7mvqzSpBJao4OcqDXybPJ9o+JUplYbZLzzPlXgnqBX1P4dk/wBAjz/dFAG5RRRQAUUUUAFFFFAFe9hFxaSwkAh1K4PuK8Z+HuoDRvGGoaTcmPJk2qQ+45Hp6D+Ve2kDrXgviBTp/wARr2Wa4hzHIjxiRMMwPIUEKc9x+VAHvSnKg0tVdOuVvNPgnT7roGFWqACiiigArm/HNy9t4XuDHEZTIQhQMQxB9Md66SuR+Icbv4ZZgsZCSqx8xsDrjrketAFD4d232fTW2zq5X5CgUKBj6d/xNVfi7qjWvgt7UqfMvJFjAABHBzznp0rU8A2wTSFm2Ro0h+ZYzlVxxgHJ44rj/jFdS3GpaXpUUe5TmThsHOcD69KANf4R6fdW+kNc3U4kebAwFAwBx1HWvTK5jwNAYfDlqpQKQg4H+TXT0AFBFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRSH1oA8T+MqouvaazJbFShDF8l+vtz+NereHih0e2ZM7TGvX6V5h8aIpFvtLnSKN1ZthLqeOfyr0zw1ltDtsjB8sdPpQBtUd+lNA29B1p1ABRRSUALRRRnjmgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKgurqG0geaeVY41GWZiABU5rwj4wa/dXepR6PbyuIN6q8aKQWPc5yOPwNAGx4w+LWyb+z/DLRXE4JEs+Cwj6dB3znr0rhxrHjHUUkZ9Yvyzj7hhUJg+5AH4Cuv8LfDwS20LXcKRQjDBAoDk+7D/APXXp1jotlp9qIoYlUfnzigD5z8Gi80j4g2y3VxuLyfMzIVLkj3HT3r6ftW3QKfUV478VtLj06+0vXreGMGCZRK5YcDPYGvU9DvY7vTYJUZWDoDwfagDWooooAD0pMcYpaKAPEviz4Yij1O11QFdpkBcSMcdeevQV1nhbwzoMUYubWygDSLnzMbiQeSMmuj8VaFb67pEtvNgHGQ3oa8e8JX+tJd3ujaZfW5WGQj5uGUZwSvUUAe3w21rBHtVEA9B2qG81Ww0+ESXFzBEvq7gVwI8NavNI0d5rdw8EmAYwSQVyCRmtGHwVolr5kl2RMjYOJmGF9/8aALl18QLfyS2mWNzf9iyKVXPpkiqwv8Axlq1xsSG3021I5dxvk/AZon8WeF9AgaCKWMmM48m3TJz2GBxzXN3vxWuZ9W+waFost0+4AOc4YevA4Ge5oA3JPB+oXasuoa5cyK3UKzLx6dcUyDwPoNpGBM7yhQBiaclfrgnHWsWO0+IfiC5lF2ttYWrjG0sSR7jac5+pp9l8Ir1rZ4b7XLl0LDITIBwc85JoA2pNY8IaBCR9otcx5+VDvbjHHH1H51i3fxStrlGh0Cwe6udp2qyt17cAHP510Fh8JPDtoYzJbvcFOnnyFuevTpXV6f4d03TVAtbOGED+4gFAHjsl18UdaAEFrHZxbeRLhCx7+4rgvEXgXVrDVVn1u9jfdhpJizMOegG4V9ZeSn90Vk6x4ds9XUCaJMgbd20Eken0oA+XbbRPDlvbD7Zfme5Afb5KjYcDjr7j8aqaUthBZXcd1pU0jg5glVScg8AcYyPx719KWnw50KCOVJLOOTzl2yZUDcPoOKcPhv4eimgkgsUi8kggISAR6Edx/hQBx3wz8K29zZPd3+mQFyf3TPGNwU846dK9UttKtLVQsVvGgHQKoAqa3tYrZQkMaogGAFHAqxQBGIY1OQuKdwCB3pxooAKraheR6fYy3UxIjiUs2Bk4FWa8o+K3ifJTQLRgZWIknBYqCvOBke4z+FAHD3d+njLxnLqcgmMcbKsCgj5QM8EZ/XNe7aHYR29mjrGFZlG49z9TXC+BvDENvOlylq8cW3I3OOp9ABwK9QjQKuO1ADhwKWiigBCcDNee+MPiMvh/Uo7GK0M0kgIyX2gcZ/pXoTfdNeJ6pa/2z8UDHgPHbgvknIDdP8AOaAMK+17x8JprmVZhbyDMaoGPr2U8dR37Vy+qXvjjWbGa0ZmmhdvnUfxcdOeR34r6YttIgeGNpY1JxyDUg0W1D/LDGM+goA+aLN/H9jbpFGs4xEMblx5ft78fWtiLXfH0VwjCCd45F2urqMocHnPf2r6EOmW5/5ZLgjrikGmwbcbF46cUAfKF3qPiTU/FVvDfmZ7mIkxgpjHuBX0x4ZhuodKgEoIYICQTzXAzWUP/C6yko+VLQFBt4J+ufrxXrsEYEahQABQByPj7Urmx8MXssDhJFjPNeK6NofjR9EtpNNMcSF/Mz0J69a9S+Msktt4OlaEZy6hsHB69v0q/wDDvbdeFLORkIJXJDdc0Aed/wBjfEt7YPJdRZcD5QOR9SPp+tUy/wARLOZYzpd1LKON6sChHQd/xr6ISCPGAoxT/s0eANo4oA8Js7/4lNEY5fD0JZl4LSbdv15q5DefEWKMJNpER7ZWQADj0z/WvbFgRf4RTvLT+6PyoA8JudW8c2r7W0BpQevlycZzXP694s1l4pIbzQbyKQowRmhbHTnJHBr6UaCNhyi/lWVqenwPA++IMu0kj2oA+SrQ30fiG01K3hKOyCQlssuemDnp0r2fw58Tkt4xBqto1s69XU71PuMVS8Gx6drV3qcEcI8gTYVJFBPI5FdXd/DjRbiPzFs0VwSQUJXn14oA67TPENnqFss0NwjoTjIP+cVso4dcg5ryWXwheaPbtJpt1KSSDsOOfqa7nwnqMt3pyLcLiZRhqAOjooooAKKKKAAjNeUfFvSHMdpqkEKtNG2xpCGJA4I6ds16vXI/Ea2a58I3Zjj3vEBIFyB0PuMH6UAWPAmof2j4Ws5eM7AOPaumry34RaqG02TTnJ82JskFcbQexHY+1epUAFFFFABXPeNI5ZfDF2I7eOf5clHJHA7jHJP4iuhqte2iXtpJbuAVcEHIzigDkvh/qIuvDsLi3MK5ICBiQADgYzziuL+I3max44sbWCN3+yBASgY7SxyT6DitGK08X+Ebqa3srAajZs+UkMxyoJ9McU3w14O1O71+bVNbt385nbLeeQp5zwuM45xgntQB6RoVkLHSoIB0VABWnTI02IFHQCn0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABQelFFAHjvxwQQw6ZdFJXIkIAV/l455Fd74Ju1u/DVnMq4DRg4Ncn8cNPmufCUV1Ark28uWKdlI5P+fWr3wm1JL7wjbAbgYhsO45PHrQB6HSZ5xQKWgAoopMc0AKfakIBHPNLRQAUUUUAFFFGaACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK828beBr3VdSj1TTzB58TBgZFyQB1AFek0UAeOx+PtbsporOXRXEiD96VGR+h4/GqsnjfxRqTuLeMWq7tuBAzsOevQ/yr2GXTLKWTzHtozIP4tozQmnW0WPLhRfooFAHher+G9f8bRyo9zOIkXhrkEbj6hVwMj3rY+E3iGaC4m8O33Fxa/KuZd+QOPWvYvs8YHCgV4j440O98HeMIfEGjx3LQ3JJuBFGGVfrigD3FG3AEU6ua8I+JIfEOkx3MeVb7ro3BVvSuloAKKKKAGsoYEEZB6ivHPEGg6loPi+XVdF04NCRl1xhMHk7RnrmvZaaUU9QDQB4TcQfEbX7mGSFBaQN95CxRQPww3b9a1D8KdY1VE/tPXHAXHyxK5Hb+8x9K9iEarjCgYpcAUAcBYfCTw1atulshcNxkynIOPbpXXWOh6fp0ax2tpDCijAEaAVpUYoAYI0AwBin4oooAO1FFFABRRRQAho60tFABRRRQAUUVXu7uKzt3mmcIiDJJoApeINZh0PR7m/l5ESZC56nsPzrxjQ9Hu/GHi+bVL5JGCnzFkU4UHsFIzkD19qb4g1m58fa3JFbS7LS2YJsGSeTxwOpPH0r1bwl4fGkWYLyySSOASXxx7dPrQBuWVosECKFwQMVcoooAKMUUUAMmbZCzHoBmvIPCPl3fxB1KdVfjJwWyFye49eK9P8AEF/Fpui3VxNIqKqHlumfSvIPhFP9p1jVZWDbnl3FuMHnnpwKAPcEA28UtIn3RSlgo5NABikbgU0zJn7wp2QQDQB4/wDEMTaF4/0TXEJMMw+zPnO1ee/1DcdOler2T74FPqAa474q2P2nwXPOhZZbR1nR1AJGOp59q3PCuppqOg2VxGxdZIVO4jGeOtAHP/Fm2abwXeSAHbFsY7Dhh84yQas/Di0S38K2UaoUCoDtLbsZ56961vGNi+o+EtVt42KyPbvtI6ggZ/pWd8NmR/B9g6xGMGPBB7kcZ/HrQB2KjApaKKACikyKWgAqlqcRlsJkUgMyMBn6Vdqrftts5W9EJ/SgDwT4TK0eu6gjAgo5UhjXvEaAQ7cdq8O+Dn+k6jqlwY8K8xwce9e7oMR4oA5vxX+48NXswk8po49wcdiKh8B3Au9DgmLByRyao/E+/ay8FagVYAsmOe+fSmfCuPyfCdqVZiGG7a2cjPbmgD0KigdKKACiiigAqvfWyXdnNA6grIhUg98irFB6UAfPvhidvDHjiS0mkliHnmJlcEKeeAOTzXv8T74w2eteI/FfSYNH1qHWVlECS8gsxI8z2UeuBz+NeieANei1zwzaXCS+YdgVj/tDrQB1tFFFABRRRQAhUN1FAUDpS0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAc546sH1HwfqVvGxVjEWyD6c4/SvMPgtqRNxeWRLbVwwDBvpxkmva7uPzrWWPOCylcjtXz54EaXR/iTcW01wCzyOjKAASc5BNAH0SvSlpkZyo9MU+gAooooAKQjNLRmgAooooAOlFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVk+I9Gg13Q7mwuE3pKhGM457VrUY4oA+c/BfiGXwF4hvNH1RrnyUIGWT7p+p7V9A2N7Fe20c0TBkdQQR3Fcj478BW3iW1ee1SKHUgPknaMNnHIB9q5Hwb4svdG19PDusTOZvuqHQjn2JPT/ADxQB7PRUcUqyJkGpKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooqte3sFhbSXFxKscUalmZjgAUASXFxHbQvLKwVEGWJPQV4H418Xaj4u8Q22l6Y8kdirMroCVYtnHzDg+nFL45+INx4kv4NM0iO5k04uVmaIOhJz6gdOD+ddd8N/Cr2gnuriMxrI2FgOcLjvzzQBpfD/wAGR6FYh5Ubz5Tufcc5x0/Cu/CgDApEUKoAGMU6gAooooAKKKKAMPxcJD4avPKkEbbPvHtXl3wbtDDPqEhlEpaYkkZwDk5xXo3jiWQ+Gr6CKJpJHhYqB3IHFcJ8G45Psl28vMhmJcbQMN34FAHrk0yW1s8shwiKWJz2FePajrmveLfGFzpukai1rZRxDLREOOfUjoecjB7V69eQtPZTRKcMyFQcZ7V4n4R1a28I+JtTstbZbWW4lBjkdcKevBP+cfhQAzW9D8VeEbVNSk8TXVxaRuoKc888Z56Z6+tet+GtTOqaHa3LSpI0iAlkOQT7VU1q/wBPfw7dSyTKYREzblIPAGeOtcp8HWnOhzNuU2jTsYAo4A/T+VAHomrWq3ul3Ns4VlkjZSGGRyMVwPwnuh/Yk9gH3LaTNEDjjHbsOPwr0lhlTXlfhaVLD4k6/pkXl+S7B1WM8KRwRjHB5HQmgD1G5iW4tniblXUgj1BrjPhur2Wm3WlzzCR7S5kRcEcLuOOB0rtVwYwfavOI86N8WpY12+VfweZtwAdw6njrQB6ZWdrOtWWh2LXd7JsjX8Savo25Qa4D4qC8/sMPDFGYF5llOMoM9skdf6d6AKFt4/1nWLm4bTNN821jDeW6xs24joMkgc/pir+k/EbfeW1hrGn3VldTyGNd8TBCeoGff8a2vCsNmuhWgtFUReWMAdq534ovbLosKji6SUSwlACysvOee3r9aAPRUkEi5HSsjxXP9l8K6rP/AM87SVumeimn+HbmS90O0uJV2vJErMPQkVS8cyNF4N1hlOCLSTB9PlNAHl/wMgB0+5kKEO0uc8jPHpXuJ+Vc15D8F4VGhM4i2lnI3HOWAr1xs+TnvQB5p8X5RH4QuEL4yR1HXmtP4YMW8J2I5BEYBB7Vz/xjmK+HBGzEb3AI7n6cGun+HSGLw7aoChQINpXjjFAHbY4paKKACiiigAooooA4/wCIegnWfDzNDEJLm2y8SEAgnvwa85+EesSWmtX2jysE+YyKm3b7HA7c/Wvc5oxLEyH+IYr5/wDFulXHgnxqNZtgxUsgLbc71P3iTwBQB9AowZQQadWXoWpQ6ppkN1A4aORQwI961KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAQjIxXh2qA2fxnhR7ss7Hcq7AAqkdM17lXzt8X0u0+I+n/2WwW7mVVU4OQ2cfyoA99W9giiDPIqjHc4qW3u4LoboZUcf7JzXjWn/DDVNaTz/Emv3s5PIhjkKoo9KVtJf4Y+I9ObTr6eXT76TypbeZ87T6g496APa6KjhbfEr+ozUlAAeKTrS0Y5oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKO3FAAfeuC8f+Ax4jNtqVjItvqVo25JMZ3L1wa7wccUYoA8h8H+OtU0/Vjo/ih4I2ztjn+4GPHBzXrFtdw3MSvFIrqehU5Fc34u8Ead4lspA9tD9q6q7L3968tutY8SfC55be5MU+mn5rchcKvP3R/nvQB77RXO+EfESeI9Dt79MjzFGQRjBroqACiiigAooooAKKKKACijtSbh3oAWioZbqKEZdgB6k1mX3ifSNORnu9QtoQoyQ8gBoA2aY8qRjLMAK8t1T406YJJodGs7nUnjBLPGu1B+J5x+FcVrV34x8YQXb3V+2m28OcWseUJOM4zxu498UAer+KPiToPhlCs9yJrn+GCH5nP19PxrxzXfFeqeOb+Czu9Ri0+ynkA+xrLhth/vY5yfetT4baDp955iTwv52AxaVQTID33YJro/HfgJ5bSPUdGRUuoCp8uMY3gf4A0AbfhHwdBpUcJR1EaA4RR97Pqe9d/DEsaAKBj2rzH4a+LZdVR7a9lthMpwsaONwA7Yr1FDkAjFADqKKKACiiigAooooA434kSLF4Q1Bvl3NCUGWCjJ9zXM/ByPy9FIDpJ8331B5+tbHxZvUsvCFw7xrIGO3axIz+VUfhKmNJY+V5cZclFB4UegoA9MByOKy9Y8OaVrtv5Oo2UNwm4Nh1zyK1Fp1AHk198FbW5u2Carcx2Mjl2tx0HOcL2A7dOleiaHodroWmQ2Nom2KJQoHetXFGKAGkcGvI4oxZ/HC+KBV+0W6ltxJJOByOMdvXtXrrdK8lvrdrr40F2KqsFuuMMAxyPzI5oA9WiOYwDivKvH7f2d8SvCt4MJ5pkhZy2MjI4/8eNeqQ/6sD2rx34zSKPEXhbEsYeOd2AJIOcpj8OKAPYbVt8Kn2pmoWEGpWMtpcorxSrtZSAR+tRaS5axi3HLbRk1foA8v03wz4r8JXd0unNb32nytujikfZ5XHOB2zz+NUJtG8X+KdWifVbOOysiSrxq4J25POcZz36d69fIB6ik2gHOKAK9larZ2scCKAkahQB2Fc18Rbz7F4H1SVwOYtg43ZyQOnfrXXVwPxbVpPA1zGhjDeYmC/Tr+v0oApfCazW28LWxXb8/zHb78/hXo7DKHPFcf4BhWLw7ZqoAUIDjGO1di/Kc9PegDxn4zNGBYpIygFuVZsA+h/Miu38CxsuhwK2wsqgZQmuA+NLLLqOj242lmf7uRzyBXpnhCLZo8A8sIdgyBQB0g6UtIOlLQAUUhz2pec+1ABRRRQAVynj7Rf7X8N3KRopl24BKk/wAufeurpCoIwQDQB4x8NNcudA1Q+GNVZExnysuCc9x1r2dWDDINebfEnwxFcaadTsmhtLq2PmCQ7UyRyDk8DmsvwL8VrW8MelatOF1FTtYqMo2O+RxQB69RUUM6TKGRgRjqKloAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAIbqdLa2kmc4VFJJzXzlpl7F4s+M0l4VHkwkugycjHHOa734y+OLPRtCm0eOUtfXIGYwP4M85PavFPBcXiW51C4k8MWu15WAaZ8N5Y9MmgD6Y1zxHpvhnRjc3soGOEjU5Zz6Ad64nQNC1fxtrUXiPXyYbeM/6LZquMLnILe/frSaR8Jrm/u11DxVqc1/OGDJHvIVPYV6vZ2sdpbrFGMKowPpQBNGuyNVxjAp9JgdaWgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAry341yxx+F4oXQN50wUg+nWvUq8h+M80qTaOgO1GlIzvZf1H+FAG98MbSK38LW8cb7geT8wPX3FbHifVNW0SIXdlbC7g6OnAMY9c9xWL8Mk8rS5sNuXzTgiXzM/jWp8RtSOm+C9RnRdzmPYBkjrx2oA8+0T4620kc66tbvFMpwPJXcP51pQ/GzTmUM8ZXPCocFjjrnB47cYrK+FHh6C7spZLq1Rmb74kGck8967+T4Y+FZpzO+kQGQnJwCB+WcUAYH/C5tMMiFIS8JxudW5XIzyKuWvxa0ie9MTB1jwT5nYfX0rQk+FnhKRNraNBz/dyP1Bqm/wc8JPgNYSFR0H2mTj/AMeoA1U+IegSSpGL2MblLAswA49zWRd/GTwpatsF20jdD5abgD25HFKnwd8J7gWsGIUbQDO/TrzzzWhH8MfCqQpF/ZMJCnOSSTn65oA5K4+NaXhMOiaRc3UxOEMmEX3z9BWKviz4laope1isokcEqNvvwOfwr2K38NaXbBRFZxLtORhRWgtnCmNsYGKAPnibTfHHiC4SHVr6+kgYgukEe1VyPwz2/OrVp8I52mEksPnBehdmBP1BBFfQC20S9EFPEarnAHNAHnnhv4bWWnWXlXSCYMPmRhx34x0xya6q78P2s+mTWQhQRyJtxt46Vt4ooA+f7ayv/h54x23Twva3IBZlkKKuSBkKele1WlxFeQKyOrqwBBByDWF8QPCMXiTSHeO2SS+hQ+ST/Lr/ADryTwz421HwhdXFprZvQI2IdJEDZ5xweMfmRxQB03i7Rm8I+J4vENjAxtZJAZ9spyGOc4XGMHjnNeo+H9TTVdLguowQsqBgG61414y+JVj4h05dJ0lLuSaV1DMEwAM8jGcn6e1ereDNPGmeHrW3UMAEHBBGD347fSgDpqKQHNLQAUUUA5oAKKKDQB5d8Y7/AMnw9Cik4kl2/KMk8HpyK0fhlaNb+HomfdlxnkYrA+M8wj061QjAably5G0Y6iup+HWz/hHbfYxZcZzQB2oGBS0dqKACiiigBkjhUYnoBXlPhvfrPxC1rVD5bRRyG3RkOfukY/ka0vij4wj0jTRpVo4bUrzCJGOwJxnpVr4feHl0HRokKf6RKA8zddzkcnNAHbJhYyelfP3xkvTfeNrWGEyuljbgyBOiszDHfnqO1e5avqcOkaXc39y+2GCMyMfYV8vHWJNY183kqP5moXZnYIfuop+XPtn3/hoA+oPDrbtJtzz/AKscEYxxWvWR4dDrpNuJCC4QZwcjpWvQAUUUUAITgZNeZ/GuZk8AzbGKt50eGHY5r0xvunNeX/GCUzeG5LXA2E5x7gUAbvw7Yy+FtPdydzQLuBHtXYv9yuW8CR+V4asVCbP3K8fhXTynCE+1AHiXxMFvJ450pZIpGKgAYbAOTzXrmgxLHYRqoKgDjNeJeNbqaf4tWtuJFEaou7Jwe5H64r3LSc/Yoic/dFAGjRRRQAUUd6KACiiigApCcUtch8QPGEPhTQmmLETyHbHhd2PqMigDzn4veJ5bu4bSYWk+zJwUQ43sM9+T1H04rm9J+E92fDaarMkjXTjzDAnDBcduDz3xit74eeGJfF2sy+J9ZQsqvi2jI2huepXJ9u9e2kRWtuxYqscY5zxigDwDQPGXiDwXGyXEcuoaYkm1ssd8Ptz/APq+le4eHfFOn+IrBLqzmDA8FTwVPoRXj3jIHxZrc8dhGbaEfKJEPzSkd9vcVRvPA3iHwcbS+0m+mUkbpnjjdgTjqyjIP40AfRYIPQ0teM+D/i23nrp3iQrDcY4nwArfUDocV6xY6raajCkttMkqOMhkbINAF6ikDA9DS0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABTXYKhJPSlJwK8u+KfxHttAsm0ewIuNTuVKbEbmMHucd/SgDyr4k3/8AwlvxHWxstr7XEOPLAz65IPP6V9AeD/DltoWi29tHEqbUGcDqa88+Dvglra0fWtRgYXU5yokXBUV7QiBVAHSgBcYpaKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArjviJ4YbxFoX+jxB7y3YSRYA3HHUAnpmuxooA+eND8eXPhO5ayudNlhjMzNNHIeUJ64PcDHpS+MfGzeOHh03T4m+wo4Msjgjce46jGPfrXvU+l2VyzNNbRSFhglkByKz4PCml2lx51tbrAS+91iG1XPuKAMrwH4dTRNIQDfuf5jubOPTHtXY01VCDCjAp1ABRRRQAUUUUAFFFBoAKKKKACiiigAPNc5rvgrQtfmSfULBJpU4BJI49ODXR0UAcBZfDHQbS8S7FnskVy6qJDgZ46fStDW/GWleG0iSVy5ZtuF7Duam8Z+JrXQdJmMlwYZ2Q+XhC3NYPhjwlHeJHquqg3E0igpHIvES9cAeueaAJ5viro8chjEdwTtVlYptU7unJ6fjU1l8S9LuGYTn7NGrbPMdxgn/PrWjrGmaVZ6a8k9rG0cI3AFecgYGMflXlCeCG8bu18IRp0AI8oqN24eu3oO2KAPQ5Piz4WilMX9oKxDFdwBxkenHP1HFVZfizpS2UV1HBcywyMRuRRgY9zXIX3wk02x01pjfuJflJluDnBAxwBjnFVPDmh6Ba3cfm6nLcsrMzI6bUZyeoBGfwFAHrmkeM9I1oL9luQWPRDwa6IMHFePax4ORAt/ody0LwfOYwzNk9eBng11/gnxC+q2EgmlSSSFyhZQQD+fegDkPjikv8AZVvsTcsjEOTjaBj+db3wpYDwrZxhydsYPPoaPipGlx4ZmXIDhSVwMnPtWH4H8XaVYaPZW8lyiyrEqsAp/oKAPYRS1zdt4y0eV2j+2orL1D5X+f1rQj8QabMf3d7A30cUAalQXcy29s8rttVFLEnsKpXeu2NpEZJbmNUHcsK8q8R+L73xfI+m6QG+ylgC4I2svct/QUAVbCJPGHj+81h1ka0tyogDD5D23Zz7V6vZuxiUqCFA4I71ieGNEWy0uO3djlQATk5JrS1zWLLw9pE17dyCOC3jLE9z6CgDhvjF4oistC/sSNt15qLKgjU8hN3JP16fjXlngfSxdaxOfJaSRR5UAldcjtk/TAxVVdWPibxnc6zeFwS+63i3btpH3RjqQOOldt4DtHXX7uzeQSSo6uXKksOmevA6e9AHuOhWv2PTLe3yT5cYXJPtWpVS1KpEoyM4q0CCKAFooooARuleSfGKbZpcMO1h50oUMDjBz1r1osOfavI/ivcR3Os6Dp6fO5nMjgdAg9fx/lQB3XhbbHpUEa5+RAP0rXvZlW2ZmOB+Vcbpuvw21gXWWMckBc8gjrXM+MfiPb2VqUiuYmlbIEQyxb8ulAHLeIJI7740wIJjtUIQFUnkf5/WvoHTwFtkyOa+dfA2kalrfi19beF4lZg+5c4bkdz9OlfRtpGy26buDjmgC1RRRQAUUUUAFFFFACE4rwD4i6nPc+Njpk1yfKlmSNleAYVOcYznPJ64/SvoCvOPiB4GbVLuPW7Qb7uEjcrn+Edlz0oA6vRba203SoooEVUVflCgD8q4jx74whknk0eC8SKEIfPkjAkYt3QDt/n3rL1P4h6lp+k3FsmmtFdJGNrO2RzxkAc+ntWL4F8EarrZS71gSC0di5jYjD85zggn+VAHcfDvTYNjzwRbISdwzbmMnPPf+lejeUhXaVBHvUNjZQ2NskEKBUUYAA6VZoA5TxF8P9E8Rw+XdWwQ7t2+L5Tnvn1rzK+8F+LPAU8l74ene6t2bHlld5Cj2xx+Fe8UhUHrQB45oHxheAC28SafNZXAbaG28MR14PSvRdH8W6RrKqbO9jkLDcFDcge47VJrfhTSNetmgvrKKQMMZ2jI+hry3xD8HpbGeS+8O3LxOoBjiiAVwe/Pf6cUAe2BgRkHNLXzraeNvG/hW98vVy91bg874vmB9OAK9E0P4vaBqUaC5uBay45WXgfnQB6NRWXp+v6ZqW4Wd7BPtxny3BxWmGU9CKAFooooAKKKCcUAFFJketGR60ALRSZFMeeNBlnUD60ASUhIHWuV1j4ieGNGjka61e13IM7EkDM3sAO9eX6h8QvFHjbWF0Xw3ANOtpAS0zEO+z1P936daANv4pfEG7sLiLRPDt4BqEjYl2JuaMUzwF8MJYr/APt7xBJ9qv3+Zc8qufb1rX8DfDGLQ5Dfam4u9QZtxlOT/OvSkQIgUDAFADIYEhUKigKO1S0UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRzmigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAopCcUtABRRRQAU122oW9BmnVBeRvLZzRxuUdkIDDqDQB5lp8Fx4p8X315c3E62dpN5aW8i4DEE/pz0r0y3iWJMKAMdK8j8L6zd+FtVudO1oBFlmLrOzg4JOMHvj0r1iC9ilQMrqQQORQBxXjm4N/qlhoUYyJn3z8sMIPp9O9dZZWkdvaoiIqoqjAAxgCuN8Y3KaX4o03VH2+WcxyPgZAJAHcevvXa2lzHPbIVYEEfnQB5l4quJ9cuL3yrhktrBirwKSBIVIJJJHH1FcBJcajd+Rc2cX/EvjGwOriVl9eSK9A8TB9A8STNc29t/Z2qN5X7r72ccEr375PTj8+O3aj4aWa0gtTc2Vw37uZSXVQcBQF3dvY+lAHT/DvV5r+7u7OZxIygPvyvzA9OAOOK2NGt5dL8cXlksyCCZTOkWQOvXAznrnnHeoPh5ol3psM1zfCLfJ90LGFIX0J71Jb36ah8SJ/LlXybWFRuCg7jzkZ9OaAOm1/w8uuaVcWc6qyyqeT2rx+7+D9ylwxhu2hBPygZIB+mc174L2FU5kX865PxH448P6KB9puPNm7RxJuJ59enb17UAeZD4deKEDbLq0kj6BZEznHrnr0qhrGna1oVm8+oQWqLtz8km3OOcAd+nSusm8da3rl39h0S1jhLtt84kOV5644GMZp+l+AtZ1TWTe65M2ApUIspcN055zgcdPegDymLRvEPie6DWlvKsIPzHc3AP8J/Lt717D4K8HS6HGjTA+a2N/J5Nd3pui2mlRiGKJIlJ4CjqT1NWb26ttPTzZpUjTbuJY4GB1NAFa7voNKtWnuZUijQZZ3OAPqa+ePHnje88YasttbRFtMtpOEjyzSEH7/A6f5711/jHV9T+IGoDw9oihLIMHmmZseYAcg4646H8RXUeD/hpFpGJ70pPcFt2SgO04xwev8A+vpQB4pothrVpfw3jaTclQWIl8snGe9dRb6xq2k3dxc/ZngncAnMf3+ccYPJ5r6CTTIEIXy12g56U+TSLWfiSFGGeMigDxS2+JOpQuqTz26sUVtsgZTk9QePpXS2XxNYRRNLJBLuXLbGHHX361383hrTbhcS2sLfVBWXP8PPDc+7fpVsdxyfkHNAGMfihZQSBbhkXI6hhjP1qRPirocinZcKSOvP6fyp1x8IPCk5UnTVUr02Ow/rUSfB3w0kBiWKZFJz8spz+dAEsnxM8PvF/wAhCJWY4wxwRXifjnxLHdeL4ryxnW8hVSqKhO7cc55/pXqOpfBHTJgDaXM0XB+V8MD9as+HfhLpmjNHLOi3EyfKrMv3aAPJNB0rxV4kLQ2pNnCW+Z5Mg47gc16f4d+EFhZqsl9/pM27cSxOM/jXpdppNtaALFGigdgK0FUUAZunaNbadGqQxKgxwAK1BwMUYpaACiiigAooooAKKKKACggEYIyKKKAKUukafNMJntIWlAxuKDNWY4UiGEUAe1SUUAFFFFABRRRQAUhANLRQBTu9Ms70AXFvHJg5G5Qa8z8SfCKzup3udPjjA2sPKcexxhuufrXrFFAHy5N4Q1TR1WSGa806dDiRmf5XGOMMMYPPT/Ctm21vx3pKCdNRW4BbcUl4IBOOjV9A3Vha3sLRXECSxt1V1yDWO/gzQ5GJOn2/IwcoORQB5tb/ABY1vTmA1fTbdo1GZHhlGV6Dkc+tS6h8c9Oj025VLaVbwDCRv0I9c12E3w10Sa5LNAPJP/LIcDPrx35rB8QfC3Sk069ubaFDKsDBN8QbHH0yTQB1PgTxHL4l8O29/NEEdx0Gfz5rqeK88+E11NN4St/O270Jj4GOAcV6GfXvQB498UfGGo+GfFFj9gDuSikxjJDDOMdcD69ax5PjN4jjuWtx4fiSULkBpi3b2wP1qv8AFbF58RrO1QkOYFQEHBGSeR713Wk/CzQjpQW4tS00q5kkLksTj1PNAHn83xT8Y3SsVOn2cT5UMQSQfz61yl/qeu6nEkl34kv5mlXKW0CuN2Tj1xg+tfQ1j8PdAsYfLSwhcFs5dQT9PpWrH4Z0iOUSrYQBwRg7BxigDwnwz8HL7U5o7jUkSGA4bY65Yggcdua9t8P+ENJ8Ow7LCyihz95lHJ+prfSNUGFAAp1ACAADApaKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABSY4xS0UAc5r3hHTdaBea3UuevbPvx3rirjwjr2hzJLpupXrwg8Q53BQBxnJ79+K9YprIGUgjOaAPDNb1PxBf6fd2OqaNHdIn3HZgjZ52nGeO361m+FPibPokq2OqWF3FZLgJK53CMHoM+le8XOl21yuJoUfnPIrndf+Hmia/DHHc2igocq68Ef4/jQBFff2X4y0MqsqTwyqMNG344yOledXmkeJ/D8cQsXV4FYhvNcuuOMfTv0FbFx8OdV8O2bHw9qV6SPuw71C+vPT6cVjw6x8QLOTypdLS7jTAPnL5bN+vP4CgCOLxX4xuLVo30nZBICPOtkZic5HHPHY5pdC+H+orElxcRsWn3NNH9oZX5IIPoCKlPjrxDbMRP4aZIwCQAG3NgjoMe/61YPxTvYYVkOjqrM5QI7spJGAQRt96AEl+G+pSyKqXcqxA5xLKSxXGNucfr798c7enfC/To5TJetLO4AVNzk7FByFHtmqB+LhjSLzdDuE81tm8uMA8jnj2NSN8Vbsp5MHh27e8JIKg/JtHG4NjkcelAHotlpNvbRqqRKu3oQKvuYYEyzBVAySeAK8oHjrxjeSE2egpFEEDATElm57Y+uaqQ6H4v8asH166uLKzddptY22fXp1/H1oA6rxF8R9HsyyadINQu4GCulv823Pv06iufTwprfjG5W58Q3MogJ3LaoNqICOAMEg/jXTaP8OdL0rGyEO3AJZF6D6D9a7K3sY4YgqggAYHtQBmaJ4fs9MiAgt40AGMquDW6IxwMUJGFGOcVJQA3aDTsUUUAFFFFABRRRQAUhGaWigBoQA5Ap1FFABRRRQAUCiigAooooAKKKKAAdKKKKACiiigAooooAKKKKACiiigAooooAKKKKACqOsI0mlXMaruLRsuMZ6j0q9TZF3IRQB5N8MtV8m1n06RGSWGZsfJtDDPXpivSJNSMcO5oyD7mvHPElmngbxu+pmCeSyuvmHlE4Ru4wBirt/wCNZvEMS6X4dtrl5Z12POQcRDHp60Ac5I7+Lvi7LeQITHbuqAhdwwvGa+h7ddsCA9QK4b4f+B/+Ecs/MnObmU7nAOQDXfAYFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAIRmloooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBpUHtVdrRCc4HtVqigCi+nwsclAe4JFQvpFs64aFDnrkVpkUY6UAYf/COaeIti2cIUnLARjBP/wCupl0S0QkLbxjPXCjmtbAoxzQBSWxiRQAg4wOlWBbopGB0qUCloAjVMAVJRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRSY96AFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCpf6baanavbXcKSwv95WHWqml+HNM0hStlaxxAnJ2jqa1qKAAADoKKKKACiiigAooooAKKKKACiiigAooooAKKTNLQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRQKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKO9FGOaACiiigAopAR0zzS0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFGc0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFIeKKKAFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKQnkCiigBaKKKACiiigAooooAKKKKACiiigAooooA//ZDQowDQp4LWFtei1jaGVja3N1bS1jcmMzMjo4RGhML0E9PQ0KDQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:32 GMT" ], "Etag": [ "\"62d43fa20e70bfa1fdb22510d1c060d2\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "8DhL/A==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "t27qguywbU79ckUDAfbAM8elQr0FTtMd1iQKhPdXb2797Hm6LosuzeNXZSH9kAX8BabtjGdmGz4=" ], "X-Amz-Request-Id": [ "4TSD7VVJ3J9BM67V" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "01377cdd32416524", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "38430" ], "Content-Type": [ "image/jpeg" ], "Date": [ "Thu, 19 Mar 2026 15:28:32 GMT" ], "Etag": [ "\"62d43fa20e70bfa1fdb22510d1c060d2\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:32 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "8DhL/A==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "jTAQhaH9mFoLVSjJPoVpIN7k0ch6yWSdokwJ09OtLtX6NaKC5PkmnlmWRSQLrVB+FdMw4DYKa4Q=" ], "X-Amz-Request-Id": [ "4TS3J5THRD8NB8CH" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "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NQu4GCulv823Pv06iufTwprfjG5W58Q3MogJ3LaoNqICOAMEg/jXTaP8OdL0rGyEO3AJZF6D6D9a7K3sY4YgqggAYHtQBmaJ4fs9MiAgt40AGMquDW6IxwMUJGFGOcVJQA3aDTsUUUAFFFFABRRRQAUhGaWigBoQA5Ap1FFABRRRQAUCiigAooooAKKKKAAdKKKKACiiigAooooAKKKKACiiigAooooAKKKKACqOsI0mlXMaruLRsuMZ6j0q9TZF3IRQB5N8MtV8m1n06RGSWGZsfJtDDPXpivSJNSMcO5oyD7mvHPElmngbxu+pmCeSyuvmHlE4Ru4wBirt/wCNZvEMS6X4dtrl5Z12POQcRDHp60Ac5I7+Lvi7LeQITHbuqAhdwwvGa+h7ddsCA9QK4b4f+B/+Ecs/MnObmU7nAOQDXfAYFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAIRmloooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBpUHtVdrRCc4HtVqigCi+nwsclAe4JFQvpFs64aFDnrkVpkUY6UAYf/COaeIti2cIUnLARjBP/wCupl0S0QkLbxjPXCjmtbAoxzQBSWxiRQAg4wOlWBbopGB0qUCloAjVMAVJRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRSY96AFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCpf6baanavbXcKSwv95WHWqml+HNM0hStlaxxAnJ2jqa1qKAAADoKKKKACiiigAooooAKKKKACiiigAooooAKKTNLQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRQKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKO9FGOaACiiigAopAR0zzS0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFGc0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFIeKKKAFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKQnkCiigBaKKKACiiigAooooAKKKKACiiigAooooA//Z" } }, { "ID": "529ea37350e771ab", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "38430" ], "Content-Type": [ "image/jpeg" ], "Date": [ "Thu, 19 Mar 2026 15:28:32 GMT" ], "Etag": [ "\"62d43fa20e70bfa1fdb22510d1c060d2\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:32 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "mLWCMa2EK2FSz6IpndT8TDGnIfoXXBToHh8KHax5+Sk+Fx00O7xTrw08lYUkdCO2kofHLjPqYfg=" ], "X-Amz-Request-Id": [ "4TS36HJEGSBDCZXS" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "d16e4c48d852beca", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "38430" ], "Content-Type": [ "image/jpeg" ], "Date": [ "Thu, 19 Mar 2026 15:28:32 GMT" ], "Etag": [ "\"62d43fa20e70bfa1fdb22510d1c060d2\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:32 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "W00YAfZywZAZBbxLL3+YLvegrk/FY8tTBP+owHjIgC0iMp5iY0cjk2VIb0vTRdtkAmdtsiKWflw=" ], "X-Amz-Request-Id": [ "4TSCF6R1MJGJ7SH6" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "2f5b41662f9b7e00", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:32 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "vC6Aio9v/aZ4KfC/IcbHXgeBxy9kaENBB2XKZxkRwNm/dlFdF5nVMk8+WhZ7JhimiJFP6pkRuBw=" ], "X-Amz-Request-Id": [ "4TS7FVJS75EETQA6" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestWrite/a_large_jpg_file_written_in_two_chunks_gets_a_ContentType.replay ================================================ { "Initial": "AQAAAA7hTg0fK3ratgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "c14c450d33703f79", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "38474" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "38430" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "image/jpeg", "BodyParts": [ "OTYxZQ0K/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAH0A+gDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAooooAKKKKACiiigAooooAKKDRzQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFMkkSJS7sFUdSTQA+iq/wBth3Fd65xnGamV1YZByKAHUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAAGBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFNd1QEsQAOpNADqKwr3xhoVg+y41O2jbjgyDv0qXSfE+ka2hfT76GcA7TtbkH6UAbFFICD0NLQAUUUUAFFGRRQAUUmaTcPWgB1FN3j1FKWA7igAZgqknoK8H+InjWbVNZfSLB7zCtsWOA43sD349vf8ACvV/Getx6H4Wvb9tx2R4G3sTwDXm3wm8OQS2cmuXRWe6uJGdXcElBnpzQBg23w/8ZzWx1VdRe2ugQ8VqJTwPQt612HgDx3qt/q02haxAqXlumWIBBbnuO3avTFjQRYwOBXjscsQ+O935TNkxBWA4Gdo6468etAHtkbbkBp9RQf6sfSpaACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAzzRRRQAUUUhIHU0ALRTd6+op2QaACiiigAooooAKKKSgBaKKKACiiigAooooAKKKKACkzzS0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAjHCk+leGfFLx1Lcu+jaeWVt+C5yuSO3PHPrXtWoXAtrCaYnARCa+f/CsVpr/AMTrm4kh27GJH/TQjvQBteDPhLb3lrDqOuhppZIx+5YkY5zzg81ual8Jbe0/03wzdy6bfpkptfcjcdDnJ/KvTII0hhAHAAqG21S0unZIpkZkOGAPSgDzjw58R7iz1FNC8URi11PzCgbGFcdiPY9K9PhuEmQMjAgjNeY/GDwuuraL/adoyx31mCwbpuTuMiuK0r4u3dn4dWK2t/PvEUKzHO1T0+tAH0M0iqMkiqN7rVhYQmS5uooVHJLuAAK8bt9b8b+I51tSk1sHhwxQfu8nnduAz07Z61sxfDDU7u1SS91udpjy6uisufUZHB/GgDrbvx5pdtG0yTfaI1++0QyE6dfzFY//AAtrRxbzvtuGkjJxEqZLc4GCOOfrUtn8KdFifzLjzbgk5Ikbg57YHaujtPB+iWciywWECSKMbggzigDz+/8AjEpkENhp879N7MCpXjJ4I7fWs+38ZeM9TZpNP064G9SYy8W5Poc4A7cjNewLo1gq4FrCBnOAg61Zjto4wAqKAOmBQB5E918S4oTO0NvgA5QqWJ54IA6fmaW3uPiUbIl4UM8pUpkj5Fzzn3wf0r2DYuMYFARR2FAHjEuieP8AVdMeO+lhk8zG23lVQFI65I/+vUdnYfELSVjgiht4oUXhLeNNuc/d59QeuO1e17B6UFAe1AHkJ1P4kral5LW3B3bQvl7mJ9eD07Dp71xOneIbnS/HtzfavpzQXHypcm35AY45Oe2PSvpQxqR0FUP7HsvPkmFvGJJDl22DLfWgDldD+JWg6mgCzvC27afPQqAc9CwyM/jXaQXUU6bkdWHqDmuO8Q/DTStaVmiZ7Nnbe4twArtggMR689f8K4dPCPjvwlqAbR7yXUbJWBWIyhV285BDd/cUAe35FLXmWj/FKKG6+xeI7cabMuMlycZ98jjPNei2l9b30KTW0qyRsMqynINAFiiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACkJAHNDMFUk14/8Svik2ku+j6Q2b8nYxGcqT6Y70AdX4z+I+l+E0WJmE94+QkKHOD746V5i+vfEfxvI0mnIdOt1YDumee2eTWt4E+Hd3qdxFrPibdNPnekbnOOc5P8AhXssNjDCiqiABemBQB4LeeGPiNpdp9rbV5rnaQzJFKxbaBzycelbPgv4k6hFd29lrMwlE+7bIy4KlTjHGc+tezmNSuCARXm/xA8HW0Wh3OraVFFb3to5vC2OHI5bd+FAHpEUgkjV1OQRmn1zHgjXBrfh2zuiyF3jBYIcgHvXT0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUCigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDm/HAu/8AhGLr7Jy+35lClsr36V4F4V1P+yvHscqPuieQq+8EHBPvX09KgkQowyCMGvCvif4Hk066XW9LgJgiO6ZUYIUHc5oA9vgkE1sD1BFeF+LdS1Dwd4s8+CSRoZpCxYrhR7H1r0jwf4lh1Tw/bzLICdoUgsD04NR+JfCFr4ihfdEjyEEpuJ2nPrigCDw74ms/F2nK6uCRw6MO/wBK85tLaDwf8UrnT57Um01Ah4eBjJI7exroPCngHWfC3irfAXksHHzlnGB9PU/hXoeueD9M8Q/ZpL2FvPt23wzRsVdD7EUAatlbxrEpRQBjjAq6BUdtCIIEjBJCgDJ6mpaACiiigAooooAKKKKACiiigAooooAKTaKWigDmPFnhKz1+xYmygmukH7vzRgH2J9K8ut18VfDAtcmyku9IL5ljik3LCM9VHX8694qOWFJkKOoKngg0AYnhrxXpvifTY72wuFkVuGXoynuCOxrf615l4h+H13pt1Jrng2b7Dfg7pLVR+5n9iOgPvT/C/wAUoL27Ok65bHS9WiKpJDKRhiRxtNAHpVFRxyrIqkHORUlABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRVa/keOxnaLmURsUGcZOOOaAPNfix4/Gh6c+l6dMpv5/kyhyUB6/Q1zfw5+Hvk3S6xrDia4kXKIQSFzzk5715idahtvFM97rllNc3CSNiLO75857mtS/8AiP4k1W+SbSEmtYYQFjRTlQfU9j+NAH1NbNFHGFUjgVP5qk4Br5k0i6+J2syzPb3txFIcYUqFTBHXNbF/YfEnwzbNrl7rxniiw0sSMSAM+mAMc0AfQqnNRXltFd2c1vMu6KVCjqe4IwRWT4T1pdd8P2t9n5pE+b69622+6aAPHfhQyaTr+r6MVdHimb5cgrgMRwevQDrXsleFWVw9l8b9SSGDejNyzM3yBgDkDpyT+le4RSB0BHTFAEtFFFABRRRQAUUUUAFFFFABSb1zjIzXGePfHEXhayEEGJNQnGIowRkZ4Bx1PPavJp7nxvcvJqckOooWVZPMVDwvU4xyOO2B0oA+jcg0V4l4d+KN3pl3Fb6zPFd2Uj7Eu425QcD5hjOM8ZNeyWV/b39vHPbyrJG43KVOcigCzRRRQAUUUUAFFFFABQM45oooAKKKKACiijFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFACMcKTXkvxX8cPpsf9iWNsZ7q4jOcgNt/4Dg5rr/GfjO28Lae0hTz7huEhVwGOe/Nee/D7wzceINduvFOsRyM0r/6OJjk7fXGPyxQBw2gp4m8Hz2zzwsIZz54DcKOuVx2r6D8Oa7bavYQTxkB3UNs3AkfXFR+KPCNt4j0OWwfZG5H7qUpkxt6iub8HfDm88MysTdpIdy/OAQWUHoc0AekqB1xwafSKMACloAKKKKACiiigAprNtHNQXN5DbRs8jgBQTXk/ib4nHzZLPSZvtN0GwIYoWLNg84PT/P4UAeszXkNuheWRVAGck4rIu/FemWgQyXMY3HH3xgcZ5ryo6J498TuiNs0q0YjIaUvJj/P0rorH4M6SrmW/uru9Z1AkE0nBPqMcigDoJviT4bhKhtTg2scAq2f5fStey8UaTfQiWC+hlQ91auePwm8KnP/ABLEyV2n526enWqFz8GNAaN0s3u7TcAMxTH8+c0Ad/FqdrM5RJkZ1ALKGyRmrSyK3Qg14xqnwl8QQSxz6T4ou96YUGWRgQmOmRwfyrNtPGPi/wAATxw+KIzdWJcr5wIZwBnBOPXjrQB73RWFoXifTtds457KdZFYZ6YrcBB6UALRRRQAhFcJ49+Hdl4rtvtEP+j6nD80M6Hbkjs3qK7ykIzQB5R4E8Z3sOoyeGPEMMkGp254ZyMSDtg9+Oc16Y+o2kKAyzxp0HzMBzXnvxb8L3F5ow1zSJHh1PTyZQ0fV1A5B+grzz4e+H38d2klze63dvMshEyMxJz26nGPwoA9guviV4dtZpInumby+rJEzL+YFRzfE/w5FKsYuJZCcZ8uJm2k9jgdam0L4f6Nom54YmllY5LytuPTFaR8JaOZXm+wwiRyCzBcE4II/kKADRvFuk65G72dyGCMVIYFTkdeDWzHPFKMo6kH0NcNq3wt0W6gdrKN7O5bJEsUjDJPrz0rjLHwd448Jy3UtnqsdxCpXyoSSxcDtg8LQB7gKK8x0T4pQrNFYa7by2V8ZPJIdMBnx25OByOtekwXEdxGHjYEHmgCWiiigAooooAKKKKACop4EnQqyg5GOalooA4w/D3QU1c3rWELvJnJdQ3P49K37fRbC0j2Q20SKOgVQBVy9uBbWrykZCjNeHax8ZNdu76Wy0DSVkkRmBcqzAAH0GKAPZha28N0SgVc8kCuU+JGrWVn4N1SNp4RNJAyohkClieOK4C3n+J/iLT3hZ1t1n+UyeRtKg475+tOh+Ceu6iqHWvEUsgUAbFLNx+JoAr/AAv8fW+neGja3swQ20nVmABB5rvY/i74edMO86ZztYxHDfTFZGkfArSLOM/apnncjjtiuug+G/huGFY/7LtzjqdnJ/GgD551/wAW3f8Awnd/renxXAjlOFDcE4AwenT2r0X4ffFu8vNTTSfEVutrLJgRSlSgY+hB716oPCejKBixiyvQlc15x8Z9MtLfw/aXcapFcRXAMbKBu6HPHftQB7DG4kQOpyD0p1c74L1JdT8M2M6ur7ohyvTI4NdFQAUUUUAFFFFABRRQelAHhHjRbfVPi5psMkhZVlAIC4K7e3X1HoK9straMQKAoxivEviXbxaX8QLK+l3ojyK4kCA7TkdDn869ig1W2h0xLiWZFiCbixPbGaAMzXPAWga4h+1WSh+MPESjDGccj6mvJdO1zUvhd4wk0vVJrm40eXLRyMdwRScAj+tdzqXxp8KWbvGLiWR1BxsjPzEehryHxr42/wCEs1azbStMupkjyNkiEs+e3HbvQB9M6Xq9pq1lHdWkySxSKCrKcgiru9c4yM18ueHrr4hWmbDR7C6tY2zKUlQquTzwx/lXXaXp/wATpA1zdPtfj5GlGT/hQB7o0iKOWA+ppv2mHOPNTJ7bhXicvhrx9NObi9kNwrc7DKCI/YAde361Wm8MeLZFP+hlkzgMu4MuAexP+c0Ae7+bGf41/OnBgehFeFjSPFltNvlhvmhUqMRTMMdOncioodZ8RaYRFNdarHwSEADgEDOORn8M96APeqK8LtPilrxkSGYwCQrv2zRMm0e/ua6nTfig77Beaa7DgGS2bzByM5xjNAHpdFc7pnjXRNUYRxXqJKf+WcvyN+RrfSVJEDI4ZT0INAD6O9FFAATiiikJA70ALRWXqHiLSdLLC8v4IioywZxkD1I9KXT9f0vVP+PK+gmOM4RwePWgDTooBzRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABWXr+s2+haRPf3LAJGucE9T6CtMnAzXivxZ11tV1a18PWe+TDBpFRScseAOv40AUfD+lTePPF82ramubVCNsbgMCOw9OPpXt9nZx2kKxxqFUAAADpXO+CfDkPh/R0hXl3O52xjJNdZQAmDmloooAKKKKACiiigAqlql9Hp1jJcybiqDkKuTVwkKCT0FeR/EfxfcXV3F4e0O6zcXLbGePDAdiCCD/kUAZN/wCI9V8feJZNG0WdodNjH76dAQR0zyRj1GPavRvC/gbS/DlikVvCrPnc0rqNzH1zVfwF4Pg8M6UIgTJPJ880p/iau0AxQA1Y1UABQKfRRQAYooqGS6gibDyKp9CaAJsVla34e07X7NrbULWOeMjow6e4q7He28rFUlViOuDnFTggjigDwTVvhz4g8BiTVfCt956oWJgeL5tp984OPwrrfhv8R28Ro1jqqRW+pxHDRA/f9wK9MkjWRSrAEHgg14P8QdHk8F+L7LxHpqxpDJIA0YQD6gdOtAHvKtuAPrTqzdGvl1HTYLlCdsiBgD15FaVABRRRQAySNZEKsMg14TfwN8NvifHIg26Vq0pdnx91jnK+mM4Ne8E4ryv46WLXXgoTxKDLbzrJnbkgdyD2oA9OtpVlhRgc5GanriPhjrX9s+ELO4aQvIF2Mx6kjiu3oAKjlhWUEEdqkoPFAHnfjz4f2OtW73xkliniG7zIkBbAHbHNc58PPGFxp+tTeG9SnMsasRaXDnHmqOwzn1r1y5vII0bzXVVA5LHAr56+JNsPDnjTT9SslIidlKOvRSDyue/rz69aAPo5G3qD606sjw5qMeqaNb3URJSRAwJrXoAKKKKACiiigBAc0tFFAFbUI5JLGZIQpkKELuOBXh3wndYvFmtabc7fO8zeFYc5BINe8P8AcOOteFJatofxw3hfLivSJAAf73X9aAPdFjVVACin4pFOQDUN1KYbaWRQSVUsAO/FAEjyIn3iBVG81zTrBS11ewQgcnfIBXzh4h8b+KNf197SK+e0j3lFjU7dpH6nGOtdDYfCaS/ijudR1qeYnDlVUDJ7gk5yKAOz1z41eHNOLw2bvf3A4CRDg/jXnkms+Lfibqf2eO3+yWBYqf3WVVfUk9T0/wDrVn6r4RtPCfj/AEvZt+wTSKhDqXOT65GBzivofTLWCGBPLRQMdhQBB4S0NtA0SCyaUysg5Y1vZAqB50RCSwGBXG+LPGkOjWMsguFj2jO88ge31NAHaS3UMK7nkAHua5/UfHvh3Sw/2jUoA6ZygbJ4ryG2m8U+O939mh7ezJ+a4uMjPsq9xXf+HfhjpOnW0RuIlubnO6SWZAxY49xwPpQBHN8aPD6k+Rb6hcjGf3VuTn/PP5Vp23xS8MzwCSW7kt2xuMc8LowHrjHT36V0UGhWFsoEVvGvrtQDNU9a8JaPrsCRahYwzKhyu5RkcY4PUUAWNK8UaPrW7+z7+CfacNscEj6itOS4jijLs4CgZJJ7V4V4u+HVl4WE2r6Nq8mmyKMxopPJx0zye1cTB428aeLbVNEgnlcr8ssiDLOM9WIHHTtQB1/xj+IOkalZLpVhH9qm35EwyAuCRx69PpXLaJoni/x7NaQXc9zHp6KoYlWRCAPTuceld34P+DjJNb3+uXUk86YYIrEgY6ZJ5/CvZrWyhtYwkaKoA4AFAHlenfAvRIh/pFxcOOcgEKCCc449Oa9A0zwlpOlIgtrSJSi7Q+3LY+vWt2igCAWsS8BAB9KlVAO1OozQAmB6UYHpS0UAJtB6io3toZCC8asR0yKlooA5rUfAuh6lcG4kt2jmJyXicqc4x2rm7v4R2hG+x1S7gnByGZtw/Hpnv3716TSDmgDya/8Ah3rJRxFdLKcD95Kfm4HGMDP+etY2nah4x8JsZbi1urm3UBXjPzIuDjIORj6V7nUFzaQXcLRTxJIjdVYZFAHlA+NsEF6IbuzZEwFJCk/N39gOnevSdI8QWGs6el5aXCSRN3U5xXC+NvhtHqjJLYfut/EgXAI989ef6V5Ott4s8Naw3hjTdQjuTdgB4kcv5fr6Y/OgD3XxP8RNL8PObcCS6u8f6qIcLxkbieBXmVx4x8ceMb1k0ZZLe23gDyU28d8sc812nhr4W6Xa20c+qxte3jANI0zs4yPQE13ltbWtogSNEQKOmMAUAeMWfwc1XUpEutY1yVpicsMb+vXkn+lZPibwXP8ADyS1vrPVbpYDwSqA5YHOCMgdK+hYriCVikUiMy8EA5Irj/im0cfgm6aRcncojwoOGz15B96ANPwTq11rHh6C6u12uw44xx27mukrlfh/A9v4UtY5EVCF4CnII9eAP5V1VABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRSc59qAFooooAKKKKACiiigAooooAqahdJZ2cszkBUUkk15R4Mg/4STxdf6424xiQqFKbVyMY4z1/Kui+KmpT23h2W2gKDzxsYnOcHrjHSrPw60ZdI8PQRhQHb53Oc5J96AO0jQIoApxOBmgUY5oAWiiigAopOc0tABRRRQBn63ci00e6mJj+WM4EjbQTj1rxz4W6NJrOv3fiO7WM7mKRbVHH+feu2+Ld4bXwZMBHG+9guHzx9MEc1Z+G+mLp3hKxQRorNGGbb0JPNAHYxoEXAFOxz1paKACiiigDL13U10vTZZ2YDapPNeAya/rHjTxI+n2N09umCfMychRxxj616F8YL2W20CfbIEwuef4vYVz/wAOpdG07w6l9LeReaylmZ35XuR1oA841lfEvgzxFFanVy0sieYpVyARngH8q9J+H3xdm1C6+xawYxtGBIhwD065NeOeO/EUfiTxfNewybrYYSLdkAKPr0qnpDSWt7bnywQScYbryMGgD7bjdZEDKQQRkEVxfxS0WHVvBN6XQGW3QzRt02kVueFJZJvDlm8ow5jGQauavbQXml3NvcIrwyRsrq3QgigDjPhTqp1HwrbBiN0WU4AxgdOhPavQa8I+Dxex1a7sFuEkiDHYglDYXPXivdh0oAWs7WNasdEsZLy/uI4YkBOWOM47D1NaDHAJrwDxdcXPjz4iHSFYrZ2WV2FhgHPLEevTFAGzqPxqvri3E+heG7q5g3bTNIDt/DaP61yPij4keJdX0a50+/0IQRXKmMSbGyT3IB/Hv2r2/RNNstO0+G0hRVjiAAHrir17ptld25SaBHVieCOh9aAPHPhd8QtP063h0S7gkt5VYIHCcEn1A5Fe8RSCRAw7186/EDwQnhvVDrsChLNSoCxMcq3bg/QdK9l8C6s+s+F7K8dSrPGMg9/egDqKyfEeprpGjXF2zbQi5zWtXEfFSC4n8F3KW5+Y4zzjigDxXxDq3inxL52oAyw6cD5aNGTgehIzyCa4bU77VIZDb3k8m1lD7AeGB75966q48ciw8Ox6R9nDRyQiMhSQyMD1+hri9S1D7b5UqhVZE2YBycDj9aAPpv4Oagt34MtEVyxjyrcjr+dek15F8C7Ka28JiWZcedIWXjHHT+leu0AFFFFABRRRQAUUUUAFeR/Fy0bT9V0XXoY8eU5ilcYz1BX3PU165XC/Fuy+2eAbxhnMLLINoyeuP60Adfpl0t5psE6nIdAaluU3wOvPIxxXCfCPWxqvg+3RnJkg/dtnrxXfuMqRQB8eeNLJ9L12+cMFkt7xl256huc4/D9a6ew+J3i06Y89lo6PaQx4eRkbHAPOcit34reFmg8Y22rLBFLaXWEdXYcyZxyD2x6e9Fzf65daFLYWGgW9laeSY3a4k2AAjnAx2H8qAOGtb3xR438T2d1MGlEbJKViPyqoOMgZ69a9g8WeO5PDYs9NtPKlvZgAyOx3L6YA7nPWsb4PNaPplxAGVp4JWViMHjPrXn/xL1WWH4gXE7xIzQN5akkg4HTvigC9rHxB8VaBf+Tc38d15iBpIj/B7AjHvVnwvYaj8Q9fS+1NSunxkFYP4WI9fWvP7O0u9c1t+EaR2BkLHjH+RX058PvD66Vo8AZFD4GcUAdbpelwWFtHHFGEVRjaBWkAAMDigDA4paACuN8beO7XwtaeXGonvnB2RBgNvuf8O9a3inxHb+GdEn1CcFyg+SNfvOx6AV8/WcepeOteuLmOEy3EjL5ssg2rGM5A4OfyoAzb0+IPHOrNLKJ23Z89yfkiXP3QO3Tp717p4A8E2XhnR1ihiJdzuZ2AySfU1c8L+DrHRtNWD7OhJO6Q4J3N68k11kcaRqFVcAdB6UAKqhRgDFOorE8SeKdM8L6c15qM4jQfdXqXPoB60AbLOqAlmAArifEHxO0TR5TbW7PqF7natvajexPpx0ric+KfifetOlzPpWgZxHEpKvMvckg85rvPDnw70Xw+Ee3tVMw5MrElifxNAHOP4w8fajI/9neF47WNV3gXbks49iMAH2rPufEvxVtQssvh+3cAfMIjuz+TZzXsSxIowFFKY1JyQKAPH4vjHdaazReINDurORDgkKSCfyrtfDvxC0LxHEDZ3aeaesTHDj8K6Sawtp1IkhVs9ciuE1X4R6HcM1zpYk029GSk0DkAH/dzigD0BJ436MKkr5+Os+KvAXiu3ttenlnsGJVLnPyOOMZHY/417XomvWetWaT2sySKw6qc0Aa1FFFABRRRQBw/xK8Wjw5oyW9uUa/uzsiRienc8c1mfD7wU+nvLrWpYa/uuTxwg64Gcmum1nwXpuua7Z6peoZHtfuIWO3PqRVnxLcSad4fuGtreaWQLhUhByPy7UAYnirx1baLK1hbI0t1tyzKQREMdSM8/SvLYtR8RatqLz3V5ESzhYvNl2q6/wC7yMnPTPatbw58Mv8AhI5zrWqQzWrSSEm2cnp+hFdNL8JrCKB/sckgZnDAO5wv0oA6Pwnoh02JriY5nlUBjuzgAdM964v4iXuoeIvE9n4c0uPzIIWDXDldwVscZ9MCur8Ua5F4L8IlizNNtEMA5ZmfHFZPww8PtbWMusXiyfb79vMl8zg/l2oA73S7c22nwxMAGVACBxVygDFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFBz2ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKQnAzQAtFFIehoA8j+KMd1qOr2NhDCH3Nkhmxx+dekaDaiz0uCAY+RAP0ryv4nGX/hI9IljRWj8/BwOc5H5V61pf8Ax4xk+goAv0UA5ooAKKKKACiiigAooooA80+MshXw7bKFDbpwMbAx/wDrV2XhtFj0W1RcYEajj6Vz/wAU4oz4RlmktoZjGw2+b/CfUe9X/Ad+L7wxZSblY+WAdvTigDqqKKKACiiigDiviR4VTxPoDQiOR5UPGyQJx3znjFfLeseHLnQbuSO5RpIgzKAHwwIOORX2yRmue1bwXomsySSXVmheT77AAFvxoA+NYrP5opUO5sj92BuOa9P+HPw7v9X1aLVL6F4bYPkApjOOePSvb7P4deHrSbetjG+37gYZ2109vaw2sQjhjVEHQKMCgBbeEQQrGowAMCo9QkSKwnkfOxY2Jx6YqzWJ4s1CHTPDl7czyrGixHk+vpxQB4/8IAlx4o1WaNsRpIwiDDJZSfX8K943BUyTgDqa8b+EFhJFDPeSs3znKq3JAPI5zzVj4g+O7xrkeHdAUy3U+Y5GUZx2IHpj6UAdT4n+I2kaFA4VzcyjK7IumcZxu6flmvCNRuPFUeuN4l0rw/cWkc56rGZC2fX/APUK9e8HfDDTLGwguNRt1ub0/vGaTkKevA/E16JHp9vHEI1jUKOgAoA8d0HxjqMUKi/huBdbctE8YTp/KtmT4iNLbSRxeRDOB0d84+uK7vUPDWmajzPZxOQD1Xr9ao2ngnRreR5P7PtvNcYZljxkUAeE+MvEK6pFLA95LqFzKoAjQYii56jjn617N8NLZrPwjYxSkbxGMjPSqviT4W6LrVqVigS2nUYjkjXla4PRPEOr+AddbStXQGAyEq2f9YpOAw6gHjpkUAe+jpVW/sYtQtWgmUFT2IyKWxu1vLVJl6OMgelWc0AeJeJvgdBfX013ZzkNK5YpkIFznpwe9cLrngay8KaHHDcxxtrN3KURPMDMieoXv6cetfSut6raaNpFzf3kgSGFSSSQM+3NeH+EBdePvHUmuXkSG3hYhI2G7YoztA464Oc5/pQB6x4B0uHTPC1lDDGUXywcHrzya6qo4IlhhVFAAUYAFSUAFFFFABRRRQAUUUUAFQXkC3NnLCyqwdCuCM9qnoPSgDxH4SSHTPE+taQ6vEySbhE+Mr+XFe29q8Q8SN/winxntbyOVxb6gAZVJ4BORxx0yPevbIXEkSsO4oA8++L1oJvCDXAVQ0EgbcewPB/nXD2fhHSbnRLS/wBW165MEZEjxyXAK57g/wAuK9h8W2B1Lw1f2qHDvC2364yK+fvDEOkarbXH9vSMyW2WUtOQBnqCAeuR+vtQBtaTrOk6J8Sha6GEktL1AjJbgAIwHU/lWV8V9GW18QNrE1s09tKgA2gkI3Oc8/SpIry01fxHpx8I6LO0Vq582QAKrDPU/TrzXQ/FuSWDw40bYVnUjGPzoA5H4S6TLqmqG5C/ulfLkqCD7V9IWdqlrH8q4z79K8o+CdtCNBWVRyxORjpzXsDOQvt60AWBTC4+b2FVJL1Ily7AAVzHiXxna6VoF9dLIFkjjbZ0OW+lAHmPjO+vPHPxDbSLFRLY2eEcknCt3OM8/iK9W8LeF7bRLbEMYDNy5AxmvN/g9plxI95rOoFlkvJCyqc4xk817fCFCDGKAJdvHFLQKDQBl+INdtPD2kT6jeNiOIZxnlj2A968S8K6ZqPxJ8Tv4h1ku+mo5EFu5ynXgAZ6Ditzx/d/8Jr40tvCVm5NvaMJLx19f7v4f1r0vw7oVroenpa2sYSNRwPegC/ZWENnGEiRVUDAAGAKt0UhYAckUALR3pokU9CD+NOoAKKKKAMvXdFtNc0qexu4leKVCpBFeCSrq3wo8RKsJa40x3AAkJ+QZ/lX0fXHfELw1Hr2gy/JukjXIGOooA3dD1eDWNNiuYXDB1ycHoa1K8K+E/iSbS9en8N37MFOWgL9cZ6GvdQcjNABRRRQAU1kVxhgCO4NOooAQKFGAAKpatqlpo+ny3t7MsUMalmZjir1cV4z8GXPi+7tYpbxoLGDLbUGSzHjnnH060AeO+Pdd1DxRP8A27H50VhYufsymEFAM4DE55Jx36V6R8MfHttr2nJazMiXsfyug4z7iu007wxp2maSNPgt08kLtKlevrmvD/G/hOX4d+IrTW9FaSOzdyTGgJ2nOSCfQ0AfRQIIyKWud8IeJLbxJosF7A3DLyDjKnuDXQigBaKKKACiiigAooooAKTvS0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAYooooAKQ9KWkPQ4oA8p+KER/tLRpASo+0c7VyfWvStN/484sN/CO1edfFaNo7SyuFk2vFPuBLAf8A167DwlNLLpMQlkEhA4YelAHRUUUUAFFFFABRRRQAUUUUAY/ifTV1Xw9eWjRmQtGdqrjJPbGeK86+FWoy2kt5o1yJQ8EmR5iBcZ7cfhXrhGRivF/iNp8nhDxBbeJbESRwyuRP5fOW9/rj6UAe0KdwzS1zXhXxRZ+INOjnt36qCVPUV0uaACiiigAooooAKKKKACvIfjJrjzxWvhuyaRprlszLF1C9uMc+uPavRvEGv2eg6ZNd3UqosakjJxk+lfPmhy6j8QPHf9qyNK0UUoxj5cLngfSgD03RLCbwt4LmuBExuIoSThMlsAgHArifhht1fxlfahcyyyPHlsSnjcTzgHpXtxsEn0uS2dcq6bSD0rwXXNM1X4c+I4NbgSSYSZN4GcFWUkdB2Pt7UAfRUIGwYPGKmrkfDPjjRdesY5LO/hdyoLR7huX2Ircm1uwt0LzXUaIBklmAxQBpUV5re/GzwraX5tRPLIB1mRMoPTmr/h34maPr+9UuYkkUn5d3UevNAHdHGK8I+OTJDrOkSLG5fDBnHCquR37fX2r0HWviRoWlWjyLqNpLKpwUE44+uM/lXhHiHxZH4x8dW15eMDptsAI3RSuR75HqaAPozwk06+H7UXMwlcoDvxjIqzrfiTTNAtPP1C7jgQ8DceW9gO9eLP8AFfV7uX7DoFjHFGija8rZd+3yjpSxeDfEviy7tbrVrgyZOWVmJQDqeM4BwcYAxQBoXWp6j8WNZeyspZ7XQIGwzKoPnng5Ofr79K9Y0DQLXQ7JYLeNQepIUDJ7nApdC0Gz0W0WG1gSNRzhRitigAooooAKKKKACiiigAooooAKKO9FAHlvxksHXTbTVE2f6PKC27OcjpjA+td34avl1HQrS4V1bfGCSp4zjmmeK9P/ALS8OXkIClwm5d0Yfkc9DxXG/CLVml0a402YAS2czIQD2/pQB6POgeNge4r5W8Q6Jp+l/ES5s5jLLbzzbmiVyig57k9e9fVcgJQ7etfPXxU0yWy8YfblTEbqG+Xg479/XNAHsnhnRbDT9NjS0hREK547nrnPeuP+MfhufU/C8lxbAmSD5iAccZGf0zXZ+DLoXvhqynByWiGeMVt3NulzA8UgyrAjFAHlXwckhPhtYhgSox344zzXomr38en24kkYKGOMnoK8sjM/gX4gS27tEumXpBRVwNnYEj6it74ka3pw8Kuk1ygkJDxKG+YkZweo4z9elAHBalquufETxHdWFhcz2WlWhKl4iQ0pzjr+dYOq/C7U4pEgs7uYhz+881sgj6d6m+G/jSw0PWbiDUJVSC7ffHIpyqE9Q3pXvNvLY6msN3a3Mbqw+UqQVagD57jvPGHgFh9te4+z7R5ZiQvEOehz0r2bwD8RrPxPH5DsI7tFBZOua6vULWxlsGW4jjZcfMGAxjvXzppd3aL8TpE0SJo7Vpx+7GUAOec4yMZoA+pVYMOKralcrZ6dcXDttEcbNn6D8afasWgQnrjmuN+LV89n4AvtkojaVkjB9csOP0oA5X4SWH2681PX5iWmu5my2zAIBPSvYRhVznAFcZ8NrJbTwlYoFAPlhjjuTXYzgtA6gZJUjrigDkPE3jqz01Ta2dzA964by1Ykgkdsj34rgb/WPFuo2VvLNJOEkILJaJuXBPdsfpivO/HUs+l+IZ0k8ouHYIyqcsOnOeKl0b4matpOiQqUimCsQc5+YDoPY/SgDes/iNrGl+I/ImnuGskc71kGWUZ6gDBwMdK958Oa9ba9psdzbzCTI54wQfcdq+NdT1mTWNflv58hZHLbOoUGvbvgtq0gPkuVCynjjrxxjigD3WigdKKACmuoZSD0NOpD0oA+cvGbJoXxbsbiByjtKoZuMYPFfQtlL5tpG+c5UV89fGtVXxbBNG2243KoVRnPIINe7eG3Z9GtixO7y1znr0oA2KKKKACiiigAooooAMjOM81l+IdKGs6FeWGdpmiZAwxxkVqUUAfOfw21O68J+Mn0G83QxO7JscgDcDwR65r6JikEkYYHORXhvxk8NvpuoR+JrVz5gYFUCDhgcn3NeleAtbOu+GrW8dBHI6AugOcHvQB1dFFFABRRRQAUYxRRQAUUUUAFFFFABRRRQAUUCigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooPSgDz34rWiXPhp3Eqo8Tq4JXPetDwBdC40K2bdlig3cY/SpfG1mb3wzqETAH92xGcdcVzvwx1JTp8FoxBkQYJ3g5oA9PooFFABRRRQAUUUUAFFFFABVW+sob63aGeNZEbqrDINWqKAPDPEHg/UPAesNrfhoS/ZWy00G75R9FA6V3fhPx/Ya1bJ50ghuMfOjHofr0rsri3juI2R1DAjBB715rr3w1b7c99o5t4ZpOGDIRge2Dj9KAPTEmjkUFHUg+hp+R614kqeN9HeKKGykdR8pZZiRj3pD4+8T2N60U2nSsq5BPPJ/GgD27Io3D1rxVvi7fRK/2jS3DKORG27Jzjr+tRz/FTUZYGFtbOJ84VNnA4/vZ65NAHtM11DAuZJFUe5rmta8d6RpNu8k1wFUA8txkjsPU15ZDf+OPEMa3kQjt/mICzIxJXjkD/APVWh4b+Heo6hqDXviV/tknVA4IVPoM0Ac/qVzqvxL1weTI66ZFINsbKBuP0NeveDPCkOhaeF+zrFK2d5AHzcnmtrTNCsdOQC3t44yBj5VArVAA6UAIq4GKpalpNlq1v5F7bRzx/3XXIq/RQB4d8RfhPpVnpl1rOm28ySRDeYbchRj1HHbFeJw2T3dzaeZcu6TuAElcjd6+o6n9a+2J4lmiZHUMrDBB7188a94Z02w+IX2ax08ukcqsIlB2xs2Dnjtx06UAa/wDwo7RnslkhuLmNzgsd2eO4HpXA6Z8OIta1iaCwvybaNjlzndgHoQQPzr6L1e9XTPCN3ckf6qBjgE56e1ef/DLQsPcagzNIJCdrOoBz36cnt1oA898EeBdP1Dxze6XqMTSxWpIGZB8xDegr3qH4ceHFVR/Z6BRztUkL+Q+tee6BaJZfGO+CMz7pSWIUbVyM4Jx1r3EdKAMu38O6XasGhsoEYcAiMZ9K0kiRBhVAHsKfRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA2RBJGyHowwa8T8Pr/AMIp8Wp9KiMgguwSS4zuPUYPsK9urxT4qRDSPHeg6xDGVZ5AHcHAPIH8sUAe1A5WvMfjHooufDyanFbwyzWjZPmHGV9M5FekWcnm2kb+qg1neKdObVvDOo2MePMmt3VM/wB7HH60AYfw3uUl8KWjJkKV6Z7967M8ivGvg9q/lW8mizNtlgdvkPHfng89TXsg5X8O1AHiHxq1SEPaxR2iG7RxiVlG5Bntn1qh4R+FEeqQW99r1xcXTMAyQPISqDqB71Q8eadLJ8VYoL0vOkrxlW2cFc9DgEHnive9KtkitY1RQAoGMelAHC6z8ItF1VFMUP2V17w/LmuZtvhLr+hyl9I1yVU2kbM4wexH6V7mAKMA0AeFX3gTx3rkE8F/rZFucKqtnLDB5O09efyri/D1g/gDxqLPXrdM+Z+7nIwMHHzAntX1OYwe1ebfGTSLa48I/a3jXzYJkKv3UE46igDv9NuUubNJI2VlIyCD1rz742XGzwhHGIg+Zw5J52gd8fjU3wtuZf7GMDRukKN+6Ehydp5pnxasp7rw+xjRpFQEkHbtHB5we/T/AD1AOp8Hbf8AhHbLAH+pX7vTpXQ9RXBfC+/e88I2O+QSSKoVmxjOOK76gDwn4z+BNS1C/wD7YsLT7UDGI9qhiynvwOPxNeFXlpqFq4tbiylt2iXDqUIPPc190socYYZrkPEXw28P+JJZJbu02zOMNJGxUn0Jx1/GgD4/sd32sKkIdmGMNX0L8F9AniWfUJ7fy0ZsRluWbGcn9T9a6DTfgr4b02YyJHM2eu+TOB6V6FY6fb6fbpBbxLHGgwFUYAoAtUUUUAFNY4Uk9BTqp6rdLZaZcXDZwiEnFAHzv46Da38ULK0jZiZJgeuRtB9vpX0LpUPk2iLjGFFeBeCI/wDhIfifdXjqGSzVsOpyCxP696+hbWPy4VBOeO9AE9FFFABRRRQAUUUUAFFFFAGbrulwaxo9zZTxq6yIQAw4Bxwa8n+Et3Jo2saj4duE2SRyGRDn7w6GvajXjnjWOPwp8SNN1wQsLe7BSVk3Yz79qAPYgcilqvZXEdzaxzRsCjqCCKsUAFFFFABRRRQAUUUUAFFFFABRRjmigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKAc0UAFFFFABRRRQAUUUUAcx4sndNKu0RAT5ZIz9K4D4SyedFI8gj84SnJCkMfrmu88WuV066ZRkqmQM15b8KGuBrF5OwJSSXGc5GcmgD3sdKWmocoKdQAUUUUAFFFFABRRRQAUUUUAFIQDS0UAMaFGHKiqs2m28v3olJHTirtFAGM/h2xfrbx/lSxeHbCI5W3jUn0UVsUUAU4tPhhUBUAx6VZWJVPAFPooAKKKKACiiigAPIrznxR4Y1xtdbVdIKyFlz5TSEAMBxxnmvRefWloA8c1HRPiHqtjLY3L2ogniIfaq8HGNvuD17Yz36V1vgTwpc+GdDW1uZVkk+8SOxPOPf0zXa4FB6GgDxfQ4tnxg1ElSZGkJbKbdoxkYPft+dezqflFeR6TcxH4wasvlksBjzDn0HHP0x+FeozajbWluZbiZIkXqzsAP1oAu0Vwd98W/C1nM0S3pnK/eaFCyjr3/AA7VLpfxQ8N6kqEXqxF32Kso2kn6envQB29FRQzx3EayRMGVhkEd6loAKKKKACiiigAooooAKKKKACiiigArhfirpMeoeDri68oPPZ4mjwuWHrjiu6qjrMJuNHu4lfYzRNhtu7Bx6d6AMPwBria54XtZ1I3qgR19GFdSwypFeO/BLUvk1TS9+5YLgsp6ZyT2r2OgD5+80+F/i41nPvWOW5d48NwRJyM/nXvVs/mQqeua8V+MsX9k+KdI1yEojqRvZhuztPpj0NeuaFex3+mwzxtuR1DA4xQB5z8ZPDN/eJY65pURe6siS2xdzYHIxx65/OpPBfxW0i+05ItUuobO9iXbMkp2jI4PWvU5YlmjZHAKkcg14l8TfBnhzRbKTU4NPUXkz/KsZKj1JwCKAPUbfxloFyF8jVrNy3ACzKea2UuYpACrr+deC+HPhbZa/wCGob3dLZ3cy71YMWHXIJB/lWN4hk8W/DzW9OWPWptQixvMOSflGAcg5wDQB9M7ga4P4u7T4CuuMv5ke0Zxk7x/9eubsPjno4IivbO9t5ApPMYIJHbg1znijxZffEkxWWlWcyafG4Ylg2ZmHbjpjNAHoPw2i8rRYFdt8pHzHIPP4V1+tWEd/p0sL5wQQcHFZfg3SptM0WCC4ULIi845/nXTlQRzQB4n4N1mXwj4sl8O6gsiwTyM1rLK2c+2e9e1RyK6ggjpXCeOvCY1e03wuyXEZ3xupxyO2fWuV8K/ES/0WV9O8UAgRfKk4jPzdOD70Ae0UVU0/UbbUrVLi2lWSNxkMpyDVugAopCM0tABRRSE4oAUnAryj4weK/7P0mSxglKyMMHGO4+tdf4x8TR6FYHZMFuCCQNueB36182XKXnxB8ZQ21mHZHbEsyg4x3PPTjtQB6Z8DtFZdMudSYbDdPkADoBXtqABQB0FYXhXQY9A0iGziHyIoUZrfoAKKKKACiiigAooooAKKKKACuJ+KOhLrfg25VYEkmhxJGWbG3HU5+ldtVTU0Mmm3KL1aNgMru7enegDmfhxqX2/wnZklS0a+W23kZHHBrsa8h+D+puZ9V0x2/497liq7duAT6dBXrw6UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFHagDjPGd7b2VvN9oLbTExwBngCuV+E2mo9hJd+WVEkxZM9evemfFnV2hBsxcbDKMKofBb1GB1rpPhjaiDwzbsHlfeN2ZVw3PtQB3YGBiloooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigApG+6aWo5shGIOAAc0AfOOp+KtQT4j6ymgQxzTSSbfMyxxjjGDx1Hb1rck8BeKvE0cEuqamXz8xV84U56AduKvfD2ztLzxbq99GdrySsGRmD55PINexxxIqqQOgoA87034V2NuwNzcTzKQCRuI55z0NaGr/DnRL2waKO2W2mVT5c8Q2lD1z+YrtyQv4V5/8AETx9YeH9JubSC6zqcqFIkVd2Ce59KAM34TeIL+8ju9JvJjP9icxiQgAnkjGB2GOteqDkV5Z8HdDmsdBN1OiLLO5c7VwfxOa9ToAKMc5oooAKZLKsMLyucKilifQCn1U1S3+16XdW5yRLCyEDGTkY70AeeW+seI/FM017pmoJZWyTFBCUB3KDwTnkEg/qPStPwJ4rutRnudI1Vw+p2rsJCq4BGeORwa8fk13xH4f0290dUS2MUuZZwuGUFh0PTjpxXs3gXw8ml28l48rTXN2RLJISeTj0J4zQB2tFFBGRigAooooAKbIu6Mr6inUUAeDac0nhT4zzWjs6W1zgICMBs9PXgYx2r3dG3ICO9eI/G2xmsNV03XreFgUdFeXOBkNwP0r13QL4ahotrdA58yNW/MUAcZ8YNNW48NR3oCbreTBZlzhW4P8ASovhRrq32jtYkYktTtJHQ57j05zxXa+JrBdS8PXtsVDFoiVBz94cjp7gV4t8K7oWXjK5s8ALPCHyWJJYHB+v1oA9+rxT4pw/2v4007THIEbKE+YE4JOSwHA/nXtanIFch488H/8ACT6Uy2xhgv05juWTLL7Aj2zQBo6JbQ2OlwW8WAsahcAdhXkfxLunm+I+l28UgHlhGGxcuGycjA9RWLr2s/EH4cQRW1xdxXNs7FY53G4sfTk5o8Faf4k8TeMYtZ1GJ8CQOZJIAOMEYHHFAHuNnoNjd2ym4tIZCy4O+MHI961LPRrGwjKWttFEpOdqIFH6VZtYjHCqnqBU9ACAAAAcYpaKKAGuiyLtYZFcH4x8FpqKm6tYF+0KwORxkZHX8BXfUhAIwRQB4Jpeq+IPA3nCGNbuwLFhb5IeP1Ht616J4e+Juh615MRuFguHH+rkYAhvT610up6Bp2rWr293axyI/XI5/OuGv/g5otzG4iaeMliwxKeCRjP8vyoA9GiuYpV3I4I9ql3DPWvJLX4eeK9IumbT/EDeSVCiOZmbA46e/v8A/rqvLoPxLt2VYtRRw2QX8zJXPc54/SgD1i61Ozs1Zri4jjCjJ3MBgV5t4s+N2haKWttNzqN2QQPJ5RT2ye/4Vhv8G9X1b5tT1uUO77ppASzP7e3Wuw8N/CTw54fWORLJJ7pP+W03zHPr6D8KAPII/D/jT4jX732pJ9jtZ2DYZcHb7D6ete4+C/BVj4X0yOCCEBhyWPJJrpYLGKDkLk9s9qs4oAUcCiiigAooooAKKKKACiiigAooooAKa4yhHqKdQelAHi/g+wm0v4parGXQBwSETAGM8ZUV7OvQV5neutj8YkYqpNzagZL9Me2P8a9LQ5UUAOooooABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFRXEohgZ2OAB1qWsXxBqMVlYyuzj5FLMO+PpQB8+/Ee+m1nxzBbQXhCq4Ux7yVUjuR75r3rwegXQLXoT5Y5AwK8K8NxR+LfG89+ke1FmAJKYORkjBGR0HevoywhEFskargAUAW6KKKACiiigAooo5zQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVk+JrlrXw3qEyffWB9v1xxWtXM+P7lbXwbqEjBDiPgPjGe1AHAeAtX0vRdIlubyVYWkmI+Zskk8nqa6a/+Keg6fa+c0xePgIUIO7Iz2PT/AANea2Pw21XxLbrNHqMVvaS/MFQu2MgBhjOOfr9K7rSPgxodl5TTB5nQ7yWxy2APTgcZAoAwNV+K+sa0VsfDekss0vy+dMwZR16bT/XrS+APh1dPqq63rayPcEhiLhdzbiOTkn1/GvWLLw9p1gQ0FqiMBjcBzWmqKvQAUAR29vHboEjUKo6AVNRRQAUUUUAFI33T9KWkb7poA+cPGEMraz4ykjjZo28tUkAxuIIyOTzjmvb/AAazP4Y09mXDG3QkZ9hXifiuCWzbxRbzxiMS3UKKAdy7C+QRgcen+Fe8eH0SLR7dEwVWNQD68UAatFFFABRRRQAUUUUAcZ8T/DreIfBd3DCm64iHmRD1I/GqHwi1t9U8JxQSxlJbQ+S2RgnHqPWu+miWaF43UMrKQQe9eRfD5Z/D3j7V9HuI/JincyQoBwQD19qAPX3UMpU9D1r5w15JfCvxHdIo2iQTboiicBCc4yMDnPT2r6Rrx740aPmG21OPeGJ8pynrzg4HXr+lAHqWk3QurKOQc7lBq8RkV518MvEBvtBt1mYCRV2uD6ivQxKpXduGPWgDxP49QJONGhOR87tuzx2HSvU/DNpHBpFsq84jHP4V5P8AF51uvHWi2zIzxqq7xztwzH0H9a9l0iNYrCJEXChQAKAL9FFFABRRRQAUUUUAFFFFABijAoooAMUUUUAFB5FFFABRRRQAUUUUAFFFFAARRRRQAUUUUAFIaCM0UAeS/EEyWPxF8P3/AJR8tj5YbHGSeefyr1W2bdAp9q82+LANvcaDftGWihuwHIXkA4744r0TT3WWyidehUEUAW6KKKACiigUAFGaKTNAC0Ug6UtABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAIehrx34u6ndadpDWtvLB5l2+0/OAwHtmvYZGCoSTgYrwTxVKviz4nW1la2rSfZAUmcqQAPfIoA7D4W+HZNM0GFrhU8xgG+UDH4Yr0tRgYqjpVqtrZxxqOFUAVfFAC0UUUAFFFFABRRRQAUUUUAFFFFABRR0ooAKKKKACiiigAooooAKKKKACiiigAooooAK87+LFwjaRaae0TOLqbBYcBcDucEc9K9EryT4izw3viuztJ3k8qBA21T/GTx9e3pQB3nhawhstHgiiXamMgFcda36oaTG0dhErkltozmr9ABRRRQAUUUUAFFFFABTX4U/SlJAqveXMdtaSzOQFRCxP0FAHy34/vp08ba9pzOssVxKnlNjJQqwOOO/WvobwHK83hPT2kYM4hUMcY5AxXzx4ysZpdM/t6VAJJ9T52gjIK5GD+Fe+fDtfs/hSyRpPMLRhg315oA7KikDBuhpaACiiigAooooAK8Y8asnhr4r6bqqytEt4mJMKADjjk17PXnXxa0eO50SPU87ZLPJyIt5YHBxntyKAO+s51ubSKZTkOoIrm/H2mPqnhXUYY3ZHWEspUZPA549xkVP4Eu/tvhGwm3ht0QOcVu3MQlhdD0ZSDQB8s+CtAl1m8vI7TVrvT7qKT5WhkbH1xxkV3cWseOPAFwh1tjrWiD5WniXMiL6kdfrnP1rD0W1Xwv8V3sVkDxyllyOMt1/OveYkjuYFDKCD3xQB4B4h8YaT4w8YaPdWhkMcYVZdyYMZ3cZzwB+NfRGmEfYo8HIwK8G+JXh+10zxto88EUEUNwwEgWPbvweSccGvd9KwLGLGMbRjFAF6iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDy/41hf8AhHrNyrELcrkqM12/hh1l0K0kXODEvXr0rkfjDZJdeF0d5lj8qdW+aIuPTnHT61v+CJkn8LWRhlVh5YG4A4P580AdRRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAGD4w1VdH8N3l2WAKRkj59pP0ODzXCfDTS/PuLzVyXzdsG2tL5hHfn0PNZ/xW8RzX2rWvh7T5kZmfM2wZKgds9sntXpfhexNppMCuPn2DcffFAG4q4UCnUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFIWAGScCgMCODQAd6WiigAooooAZK4jjZ2OABkmvEReLrnje8v1dvIEnlcKGBGQP7xwcdx6V6d441X+yPCl7cq4SXYVjJGfmPt3rzbwDYzTamnKMuVllbaoPfGBjI6/5yaAPZrZdsCD2qamoMKBTqACiiigAooprOqKWYgAckmgBxOK5XxV40s/D1odrxSXLYEaM2FznHJ/zmuf8eePpbLy9K0SJLu6ugyK6PwhHY8fXj2rD0H4d3WuSi+8UlZHkXm3jyoB9yMUAVL34rX11dNBEyhAwQfZ87z7gdSMc8VkeIPEHjjWorqx0y3vXgKhWcw7fMUqR8vPAJ59a9osfCOj2USJDp9uoTG392CfzrZW0iXogoA+Y20rxdqnh86I2g3SpuWRDIAoRsk5yQOPb3rV/wCEm+IPha0gtLrSPLjwAjRJuA7fw5/Kvoj7NED9wUPaxOPmUH60AeB+G/i3rUd2sOqxMdkgSTfGYwR7ZGN3fBx1r3DSdZtNXtFuLaZHUgE7WBxkZ7VW1fwxpms6fJZ3dsjpJycDBB9QfWvKrvTPEPwvupb6zke+0IFfMiyWdBnBOPp7gUAe4UVheGfE1h4l05buylDqeozyp9DW7QAUUUUAFZ+tWLajot3aJKY3ljKq4AJU9jg1oUHpQB5X8I9Suo47/RrwtvtJiqZXAx6CvVOoryHxYsvhT4g6ZqsTWdtZ3L+VIRlWfd1yBwcHv9K9YgmE0IZTnIoA+e/jLZ3WkeL7TULGUxzSMHiOM4PQ9vWtLw98UtX0iFF8VaZJDakYjvIIiUY+/wCFb/xwtF/sbTtRa28429wcrkdxnnjkce1bHg2yttX8JWRuoIZAUBKFQVBx6HNAHm/jLxRZeLdU0W50y5ZofOZH38BSMYO0ivetIBGnwgtuIUDPrXinxM0Sw03XNMjsLS2t8/OdgVcYOc4yD29+le06Kc6ZAc9UBoA0aKKKACiiigAooooAKKKKAADFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUfSiigDzz4xO0fgtyqb8zIGG7Ax6k1Z+F8jP4TtQzqzKCp2n/OayvjRGZtBs4hgbp8klsdB9ak+D6NH4bKFw+2VuQc96APS6KKKACik5zxS0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFVdRuls7CadzhUQsTkD+dWq5/xlfJp/hi9ncxhQhB8w4Bz2oA8k8F2yeKvHWpalcbpVgm/d73BK/gBg/WvdbdAkSgDHFeQ/BeGWTT7i7eCOKOR8LsGA2O+MV7Eq4AoAdRRRQAUUUUAFFFFABRRRQAUUUjEKpJoAWiqkWo20t09ssqGZBlk3cgVJdXUdpbSTyECONSzEnGBQBPRXO6N4y0vXBKbSUERyGMnPUj09RW4J49mSwxQAT3MNsm+aRUUdSxwBXOap4/0DS7d5pb+JwvQRtuLH0HrXnfxJ8RKPEKadNqTQ25AdlESkBcY69T+Vc79r8JCxVhO1yrEny/s+GJ5HpwPpQB2v8AwuqzlvUWK1YwyPsUscHHqeMAV6NZ6zb3VolwsiFGGQQeK+avtr6lo9zb6d4ftlaAlppiuxVAPB4Pp710vgPw5eeIdPQ399J9mic7YY5flP4D3z3oA9suPE2k2wbzb6AMoyy+YMj61x918TJZbsw6ZpjXSbgBIGJyCOuAOnar1j4C0+2uHmkkml34JRn+U857dR7Gt9LSzsYRHBDGgHACqABQBwe7xv4gs5J7i7XTLdSWCRIVkwB7/wBa1Pht4ludV01oL6ZpbiJuWbOWUnjtWxrniHR9BsWe+vYow3CpnczE+gHJrgPhc8S6/fwwF9hYn51AJGeD7fjQB7SORS0i/dFLQAUUUjHapJ7UAeV/GG+YwWenoVy5LEOpwc8demeTwa0vhzpX2O3MmYzvUNhMHb14Jx/n2rj9fnbXvHM91JDG8MJEEK/aVUuOTnrkfQjnPWvXdAtVttLgVYwmEAxnP60Aa1FFFACEgDJqJbiJujg/jVbWdP8A7U0m4sxK0RlQqHUnKn8K8O07w/dW+t3WjT6xe2OoRHfFJDMQrrnjIxgmgD3ozoELkgKOa8l8T+NtT8Q6tN4e8MxB40Pl3VySRgcggEdOnXNc54u1LxHoiJpdvrD6ks6hWikwJFP+8uDg4713/wAP9Bj0/Q4M2yQzOoeXGTljyeTzQBB4S8AQaXOLy8PnXjc7j0Ukc4H9a9EhhWNQAB60yJFUnjBqyuMUAKBgYFFFFABRRRQAVFNbxzxtHIoZWGCD3FS0UAeSa1pl18O/EA13TC/9iXMoF9arjERI4dc9s4GK9L07U4L+zS5jkVkdQwINS6jYwahZS21xEkkcilWVhkEV8/SXmveEtYuPC+nXiRoZMQGXn5W6YGM/5NAH0Bc6la2ah7ieOJMgbnYKOenWn2t/bXoY28ySBTg7TnBrw7VtBvpNLfUPEWtXE8MKgvChChm7AfnW18GrGa2tby7cSJHcy5RWYkY9RkUAewUUDpRQB5/8WvD8Gs+FWnaKdp7RvMiaDll9eO44q98PNdj1vwvbTAneqhXzwcjrXVX1nDf2ctrcRrJFIu1kYcEV5J4KR/CPjXU/D0sEkcUrmW3kLYUr6AE/XpQBv/GOVY/A8j7CZPNCoAMnkEVZ+GULR+DrFGCg7OgBGD+Nch8YNWGpXWn6BbqZn3ec6xjcQ38PGc9M/nXpfhayNrotspi8tigLITyDQB5f8bLVxf6RMArLlh8wBxzz29xXqnhaWOXQrVoirL5ajKnjgVwPxwQf2HZOygospzxk9Mjt/hXXfD9ETwpZLGyFfLH3elAHV0UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUmKAPNPjMsT+G7fdnzFmDIApPI9x0pnwfR00B1K7V85sEfxCofjXPGmj2IberCYkOvbirvwgj2+E4yQd29ixLZyc9aAPR6WkxS0AFFFFABQaKKAAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXm/wAWlZtDcpH5jKjfKS2PrxxXo5615l8YHm/sZUhWVmPVVk2oR/tY5NAFv4Tqi+DrLbt+6f516EK80+EOf+ERt8ED5jwAeOenNelgcUALRRRQAUUUUAFFFFABRRmomuIk3bnA28nJoAlqOZgIzzWBf+NNIs96JP58qruKRAnA9Sewrkrz4g3+t2EQ8PabPLLOxUuVIWMDuSwAIP8AWgDP0W6ki+MupxeYTGYQcE59Oa9N1VPP0e6Qoj5jI2vjB4714Jol/feHviy8OrzJJJd91YkDPTrz+Fe/b1msmBPDLz9KAPmbTfFcvhbV7y1SwWacy71WBvl/QH07V2tm3jfxnEgmzp1ky5ASQo2fw5I9jXOaBollB8T763uIZfLVmMPnemete2WWraRaQiM3tshTjBkAx+tAHhPjbwTNot3DLPPJco4DMztkgjPrk11HwxsdPf7VaTWcBuYHJWYrkspJ55q38S9d0rXLGW10lDeX0Q+eWGLcI17/ADdK4nwbe6ydQaPTGVJLpELO7AcLwcZB54oA9O0yytbXxXrWmiNAtyqzLhcDBG0/qKx9G1vSvCGuXkN/qJhP/PGViR16qCO/tWYbPxNp/jHTNT1W9iaGV/s+Y1yQDkgE4Gc/StDWdN0qXx5BLewLJI7BQZMkYwMYAXHX1JoA3n+I91qkgi8OaNdagp+UXGNkO76+lT2/g/xHrMjSa7r8qwSEs1paDywB/d3dcf410YutM0PT/MnmgtoVzjOFHr0rJk+KvhqEER3M0zBchYoGO76cUAaGn+APD+kuJrXT4VkXkOwLEfQnOK5HQVTTfipq1qN7ediRSx+6MZ49smr8nxM1G+UnR/C+pXK54dwEUj15rl77UbmHx9puoahbyw3EqKWgXDFeSPT0x0PagD3RDlRTqhtn8yBT7VNQAVm67qEel6Ld3chQCOMkb3CAnsMngVpV5j8VNf8AIW10qEh2d1aZNxUhe3Qjg4OaAOQ8FRDUPEELgPsLmVcOGKduuD2K9MV7zAgSJVHQCuD8BaZDFEZgT8p2IrDhAOwJFd+OnFAC0UUUAFcV468M/wBq2RvrQtFqNspaF0bGT1wfUZArtazddkEGi3kpO0JCzZ9MCgDxPwhZyax4imk1W3mN1j995uDHnjgD8K9cvb2PQtFuLxkysETPtHHQZrz74YWNu9qdSgYv57YzwMY7bQOPzNdj41uFg8GalJJvCLAc7CAfzNAHG2fxusJ0klu9Kv4Ykk2NJGnmJn/eFdBp3xc8L3UzwNf+QV53XCGNT9Ca4X4UGCw8Jahf6gFW2EzOWYZOBjr610X/AAn/AIFv3CSXds2cDEsOPzyKAOoHxQ8JZCnXLMN6b/fHWrI+IvhYrIw1uy2oQCfOGMkZ4PfofyrFtrTwXc22YrfSWik9FjIPf/Cnf2J4JtY5J/selRqWy5KIBkcf5+tAFuf4seD7eTy21q3d/wDpmC4/MAiptG+JOha7q406xlleRh8r+SwU98Zxx+NRWemeH95WwgsVdeqxIufxxXC6dMy/Fq6tYGMO2UElTlXGwcY7d/zoA9xByKKZEcoM0+gAI4rxT40aS9vPZ6xbrl9wUgJkgqcjB9TyK9rrhfilaNdeFHERAmWRSjZxjsee3BNAHnD67/wnc1jpNlvWBU33RIHJIIA/D1Br2Dw9pkWnWMUEYCrGoVceleH/AA2ntLTxhc2yyjM8e9ADu7/MCfXJPbtX0HYY8v1IoAvDpRRRQAVx3jTwPF4pNvcLcSW11bEmORDz/OuxooA838IfC+HSJTfavMb/AFElSJpDu2hegGf516MqBFwo4p1FAHnvxYtPtXhyFt23y51xlAQSeOc9B/jVX4Q30s2jTQNtaOGUqhXAAHoAO1dL4/sxeeD75TH5m1d4X6enofeuE+DUuXvI4mYwrtABHT29PyoA9iooooAKKKKACiiobm6hs7d553EcSDLMe1AE1FVbLULbUIRLbSrIh6EHNOvbyDT7SW7upVigiUs7t0AFAFiiqWnarZatAJrG5jnjPdDmrtABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUdqAPF/jleNBJpcaumCWZk4J+uDXbfDe0a28JWYdcOyBiMdM1wHxlVo/ENjcu0fleSUwRk59eOccivTPA0bx+FrFXOWES8jPp780AdLRRRQAhApaMZooATvS0UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVwfxMtJrnSAVV/JXPmOjhSo+pI/ka7snArnvF9rb3+gzxT7igG7Cru6e2DQBw3wauBJpt1EpxGkxCLvLEfia9aByOteEfCDUxbaxqGmSSEYkJVPTBxjNe6xnKA+tAD6KKTGKAFooqOdmSF2RC7AZCjvQBX1DU7TTLdprqZI0UZJJrgr74waZHOLbTrC7vrgttCRgc/1/SvOtUE3iTxrfQeIdRksbVGJjV2UfLnkZ6dq7Gz8R+DfDQW3h8vzM8vDHuJx3LAUAS3XiXx5qzltL0ZrOM/dNwVXH1ByT+n40yPwn4kvZmk1zxISjAhooolGR25I/pU4+IjXpcaVpF/cKoBSQQfKx9Ac+9Z6aB4z8SytJqN4dMtpD/q4SPM2+nGf50AXDpHgnwlHvu3i8wNuPnSF2Lf7vr+FWU8ZtdkQeH9Du7xFUfP5flIue3zY/StPSPhrotjJHcTxPeXQOfOuWLnP0PArso7WKJcKgH0FAHz9438NavJbp4iurGODU42DmKIl1I4611nhb4paPcaSYr68WG4iUKVY5LHHbjn0xivRNYtoprZw2MY/CvMtW8GeFJ2FzfS28Euc4QhS/Hp1oA4Oy0uXx18QdRvIr27istxCSAkNj0Gegr17RfhpoFpaos1kty3UtcZck+vNYGjap4X8N7IrF5WL5YADG4/jj2rbuPFfiC4AbR9CeSFhlXmO3I+mRQBa8Z6Tb2vgy9t7CBIBswPLVVCjue1eN+DtThXxDYCOVwI2MZQnqCOpI4659K9HvdI8Z+IbVk1G+t7GM4HlRKSGGDnPPvXjd9oKaL4mls4L5N1uPMGS3BHJBwP5UAel+O/GWku1rp9tOkk9tcI7gAEdcYBPf6VY8c21w8NtqFsVRyiv5knKoQR6DI/Ouc8vwld+C57lvsS6iyNIN8g37/bJyPapdQ+IGlXPgizgku5ftS7VkRODx9QQelAHaeGfh/a6hHb6prN5c6lcyKr4mc+Wp68L/jXodro1jZoFhtoox/sIBXl+h/FPRLDS7azg+23lwsagKkeWbnHU4FS3XxcvJJ0j07QLiXcQBubJ6c8KCOPrQB6p5ESJwuBjHSvJvigbaz1/RJ0cPcyEoITHv3DI5HzDHWhfEXxC1qW3gg08WAlJ3zGHIC4HPJODz6c1b0T4Uyyat/aviTUJdRuQcxrIxIQ/Xj9AKAPTdLZmsIS3UoM4GO1XajhiWGJY14CjAqSgCG6uI7W1lnlYJHGpZmPYCvn24vT4o8Xz6izE/vSIIyu0FQMDkjn1/HivQ/in4ol0bS4rS0lCz3DEMuAcpg5HPTPSs/4aWAKyu8SiMgMnyjofw9jQB2vhvTG0+wijdmb5QTuYsQfxroBTEUKoA6U+gAoopkjlFyBn6UAPrnPHM8UPg/UvOdkR4ShZU3EZ46d+tb/AJq4PPSuE+Kt3Evg6VXmMcZkUO69QM9vf8qAIvh1ZPbeGrUSPIzkE5k4JGfTtxXQ+JNF/t/QrnTS4jM67QxBO0+vas/wxIkGj2sfm7isa8k9eK6MXETqPn/I0AeM51r4cyHT59Pn1XSHBc3EKEsgx90j/PWqXhqLTPGfjiW7+wwrZRw+WiPb435554xkf4V2/wASfEAsdJjtLcxtdX7+Qis3OD1PHPt269RWx4A0KDSNGijVVL9SwAyc80ARx/DPw6hEn9nQjb91RkAV538QtK8G6DIJZdPieeQlvLDN859AAe9e63MyQwMzEAAc14qLW28X+OzfyBHsrFikasvV88k888jrQBwnh3ULXTddj1WTZpflg7bS1gZ3de4Zj9K7vwDBdav48v8AXZrWWNJC3lF4tuFyMDkdce9ekRaZpRbcbaAnGCSgrRtmtYeECLjgYxQBrJ90U6qa3kQHLjripPtcIGd4x9aALFZet2y3ljJASV3DIYHkEcg1NLqlumR5i7h2z0rC1fXI442+Yb8AqM9KAPm3SZF0bxcrAqlzbam0ZPHKscdvx7mvqzSpBJao4OcqDXybPJ9o+JUplYbZLzzPlXgnqBX1P4dk/wBAjz/dFAG5RRRQAUUUUAFFFFAFe9hFxaSwkAh1K4PuK8Z+HuoDRvGGoaTcmPJk2qQ+45Hp6D+Ve2kDrXgviBTp/wARr2Wa4hzHIjxiRMMwPIUEKc9x+VAHvSnKg0tVdOuVvNPgnT7roGFWqACiiigArm/HNy9t4XuDHEZTIQhQMQxB9Md66SuR+Icbv4ZZgsZCSqx8xsDrjrketAFD4d232fTW2zq5X5CgUKBj6d/xNVfi7qjWvgt7UqfMvJFjAABHBzznp0rU8A2wTSFm2Ro0h+ZYzlVxxgHJ44rj/jFdS3GpaXpUUe5TmThsHOcD69KANf4R6fdW+kNc3U4kebAwFAwBx1HWvTK5jwNAYfDlqpQKQg4H+TXT0AFBFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRSH1oA8T+MqouvaazJbFShDF8l+vtz+NereHih0e2ZM7TGvX6V5h8aIpFvtLnSKN1ZthLqeOfyr0zw1ltDtsjB8sdPpQBtUd+lNA29B1p1ABRRSUALRRRnjmgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKgurqG0geaeVY41GWZiABU5rwj4wa/dXepR6PbyuIN6q8aKQWPc5yOPwNAGx4w+LWyb+z/DLRXE4JEs+Cwj6dB3znr0rhxrHjHUUkZ9Yvyzj7hhUJg+5AH4Cuv8LfDwS20LXcKRQjDBAoDk+7D/APXXp1jotlp9qIoYlUfnzigD5z8Gi80j4g2y3VxuLyfMzIVLkj3HT3r6ftW3QKfUV478VtLj06+0vXreGMGCZRK5YcDPYGvU9DvY7vTYJUZWDoDwfagDWooooAD0pMcYpaKAPEviz4Yij1O11QFdpkBcSMcdeevQV1nhbwzoMUYubWygDSLnzMbiQeSMmuj8VaFb67pEtvNgHGQ3oa8e8JX+tJd3ujaZfW5WGQj5uGUZwSvUUAe3w21rBHtVEA9B2qG81Ww0+ESXFzBEvq7gVwI8NavNI0d5rdw8EmAYwSQVyCRmtGHwVolr5kl2RMjYOJmGF9/8aALl18QLfyS2mWNzf9iyKVXPpkiqwv8Axlq1xsSG3021I5dxvk/AZon8WeF9AgaCKWMmM48m3TJz2GBxzXN3vxWuZ9W+waFost0+4AOc4YevA4Ge5oA3JPB+oXasuoa5cyK3UKzLx6dcUyDwPoNpGBM7yhQBiaclfrgnHWsWO0+IfiC5lF2ttYWrjG0sSR7jac5+pp9l8Ir1rZ4b7XLl0LDITIBwc85JoA2pNY8IaBCR9otcx5+VDvbjHHH1H51i3fxStrlGh0Cwe6udp2qyt17cAHP510Fh8JPDtoYzJbvcFOnnyFuevTpXV6f4d03TVAtbOGED+4gFAHjsl18UdaAEFrHZxbeRLhCx7+4rgvEXgXVrDVVn1u9jfdhpJizMOegG4V9ZeSn90Vk6x4ds9XUCaJMgbd20Eken0oA+XbbRPDlvbD7Zfme5Afb5KjYcDjr7j8aqaUthBZXcd1pU0jg5glVScg8AcYyPx719KWnw50KCOVJLOOTzl2yZUDcPoOKcPhv4eimgkgsUi8kggISAR6Edx/hQBx3wz8K29zZPd3+mQFyf3TPGNwU846dK9UttKtLVQsVvGgHQKoAqa3tYrZQkMaogGAFHAqxQBGIY1OQuKdwCB3pxooAKraheR6fYy3UxIjiUs2Bk4FWa8o+K3ifJTQLRgZWIknBYqCvOBke4z+FAHD3d+njLxnLqcgmMcbKsCgj5QM8EZ/XNe7aHYR29mjrGFZlG49z9TXC+BvDENvOlylq8cW3I3OOp9ABwK9QjQKuO1ADhwKWiigBCcDNee+MPiMvh/Uo7GK0M0kgIyX2gcZ/pXoTfdNeJ6pa/2z8UDHgPHbgvknIDdP8AOaAMK+17x8JprmVZhbyDMaoGPr2U8dR37Vy+qXvjjWbGa0ZmmhdvnUfxcdOeR34r6YttIgeGNpY1JxyDUg0W1D/LDGM+goA+aLN/H9jbpFGs4xEMblx5ft78fWtiLXfH0VwjCCd45F2urqMocHnPf2r6EOmW5/5ZLgjrikGmwbcbF46cUAfKF3qPiTU/FVvDfmZ7mIkxgpjHuBX0x4ZhuodKgEoIYICQTzXAzWUP/C6yko+VLQFBt4J+ufrxXrsEYEahQABQByPj7Urmx8MXssDhJFjPNeK6NofjR9EtpNNMcSF/Mz0J69a9S+Msktt4OlaEZy6hsHB69v0q/wDDvbdeFLORkIJXJDdc0Aed/wBjfEt7YPJdRZcD5QOR9SPp+tUy/wARLOZYzpd1LKON6sChHQd/xr6ISCPGAoxT/s0eANo4oA8Js7/4lNEY5fD0JZl4LSbdv15q5DefEWKMJNpER7ZWQADj0z/WvbFgRf4RTvLT+6PyoA8JudW8c2r7W0BpQevlycZzXP694s1l4pIbzQbyKQowRmhbHTnJHBr6UaCNhyi/lWVqenwPA++IMu0kj2oA+SrQ30fiG01K3hKOyCQlssuemDnp0r2fw58Tkt4xBqto1s69XU71PuMVS8Gx6drV3qcEcI8gTYVJFBPI5FdXd/DjRbiPzFs0VwSQUJXn14oA67TPENnqFss0NwjoTjIP+cVso4dcg5ryWXwheaPbtJpt1KSSDsOOfqa7nwnqMt3pyLcLiZRhqAOjooooAKKKKAAjNeUfFvSHMdpqkEKtNG2xpCGJA4I6ds16vXI/Ea2a58I3Zjj3vEBIFyB0PuMH6UAWPAmof2j4Ws5eM7AOPaumry34RaqG02TTnJ82JskFcbQexHY+1epUAFFFFABXPeNI5ZfDF2I7eOf5clHJHA7jHJP4iuhqte2iXtpJbuAVcEHIzigDkvh/qIuvDsLi3MK5ICBiQADgYzziuL+I3max44sbWCN3+yBASgY7SxyT6DitGK08X+Ebqa3srAajZs+UkMxyoJ9McU3w14O1O71+bVNbt385nbLeeQp5zwuM45xgntQB6RoVkLHSoIB0VABWnTI02IFHQCn0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABQelFFAHjvxwQQw6ZdFJXIkIAV/l455Fd74Ju1u/DVnMq4DRg4Ncn8cNPmufCUV1Ark28uWKdlI5P+fWr3wm1JL7wjbAbgYhsO45PHrQB6HSZ5xQKWgAoopMc0AKfakIBHPNLRQAUUUUAFFFGaACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK828beBr3VdSj1TTzB58TBgZFyQB1AFek0UAeOx+PtbsporOXRXEiD96VGR+h4/GqsnjfxRqTuLeMWq7tuBAzsOevQ/yr2GXTLKWTzHtozIP4tozQmnW0WPLhRfooFAHher+G9f8bRyo9zOIkXhrkEbj6hVwMj3rY+E3iGaC4m8O33Fxa/KuZd+QOPWvYvs8YHCgV4j440O98HeMIfEGjx3LQ3JJuBFGGVfrigD3FG3AEU6ua8I+JIfEOkx3MeVb7ro3BVvSuloAKKKKAGsoYEEZB6ivHPEGg6loPi+XVdF04NCRl1xhMHk7RnrmvZaaUU9QDQB4TcQfEbX7mGSFBaQN95CxRQPww3b9a1D8KdY1VE/tPXHAXHyxK5Hb+8x9K9iEarjCgYpcAUAcBYfCTw1atulshcNxkynIOPbpXXWOh6fp0ax2tpDCijAEaAVpUYoAYI0AwBin4oooAO1FFFABRRRQAho60tFABRRRQAUUVXu7uKzt3mmcIiDJJoApeINZh0PR7m/l5ESZC56nsPzrxjQ9Hu/GHi+bVL5JGCnzFkU4UHsFIzkD19qb4g1m58fa3JFbS7LS2YJsGSeTxwOpPH0r1bwl4fGkWYLyySSOASXxx7dPrQBuWVosECKFwQMVcoooAKMUUUAMmbZCzHoBmvIPCPl3fxB1KdVfjJwWyFye49eK9P8AEF/Fpui3VxNIqKqHlumfSvIPhFP9p1jVZWDbnl3FuMHnnpwKAPcEA28UtIn3RSlgo5NABikbgU0zJn7wp2QQDQB4/wDEMTaF4/0TXEJMMw+zPnO1ee/1DcdOler2T74FPqAa474q2P2nwXPOhZZbR1nR1AJGOp59q3PCuppqOg2VxGxdZIVO4jGeOtAHP/Fm2abwXeSAHbFsY7Dhh84yQas/Di0S38K2UaoUCoDtLbsZ56961vGNi+o+EtVt42KyPbvtI6ggZ/pWd8NmR/B9g6xGMGPBB7kcZ/HrQB2KjApaKKACikyKWgAqlqcRlsJkUgMyMBn6Vdqrftts5W9EJ/SgDwT4TK0eu6gjAgo5UhjXvEaAQ7cdq8O+Dn+k6jqlwY8K8xwce9e7oMR4oA5vxX+48NXswk8po49wcdiKh8B3Au9DgmLByRyao/E+/ay8FagVYAsmOe+fSmfCuPyfCdqVZiGG7a2cjPbmgD0KigdKKACiiigAqvfWyXdnNA6grIhUg98irFB6UAfPvhidvDHjiS0mkliHnmJlcEKeeAOTzXv8T74w2eteI/FfSYNH1qHWVlECS8gsxI8z2UeuBz+NeieANei1zwzaXCS+YdgVj/tDrQB1tFFFABRRRQAhUN1FAUDpS0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAc546sH1HwfqVvGxVjEWyD6c4/SvMPgtqRNxeWRLbVwwDBvpxkmva7uPzrWWPOCylcjtXz54EaXR/iTcW01wCzyOjKAASc5BNAH0SvSlpkZyo9MU+gAooooAKQjNLRmgAooooAOlFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVk+I9Gg13Q7mwuE3pKhGM457VrUY4oA+c/BfiGXwF4hvNH1RrnyUIGWT7p+p7V9A2N7Fe20c0TBkdQQR3Fcj478BW3iW1ee1SKHUgPknaMNnHIB9q5Hwb4svdG19PDusTOZvuqHQjn2JPT/ADxQB7PRUcUqyJkGpKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooqte3sFhbSXFxKscUalmZjgAUASXFxHbQvLKwVEGWJPQV4H418Xaj4u8Q22l6Y8kdirMroCVYtnHzDg+nFL45+INx4kv4NM0iO5k04uVmaIOhJz6gdOD+ddd8N/Cr2gnuriMxrI2FgOcLjvzzQBpfD/wAGR6FYh5Ubz5Tufcc5x0/Cu/CgDApEUKoAGMU6gAooooAKKKKAMPxcJD4avPKkEbbPvHtXl3wbtDDPqEhlEpaYkkZwDk5xXo3jiWQ+Gr6CKJpJHhYqB3IHFcJ8G45Psl28vMhmJcbQMN34FAHrk0yW1s8shwiKWJz2FePajrmveLfGFzpukai1rZRxDLREOOfUjoecjB7V69eQtPZTRKcMyFQcZ7V4n4R1a28I+JtTstbZbWW4lBjkdcKevBP+cfhQAzW9D8VeEbVNSk8TXVxaRuoKc888Z56Z6+tet+GtTOqaHa3LSpI0iAlkOQT7VU1q/wBPfw7dSyTKYREzblIPAGeOtcp8HWnOhzNuU2jTsYAo4A/T+VAHomrWq3ul3Ns4VlkjZSGGRyMVwPwnuh/Yk9gH3LaTNEDjjHbsOPwr0lhlTXlfhaVLD4k6/pkXl+S7B1WM8KRwRjHB5HQmgD1G5iW4tniblXUgj1BrjPhur2Wm3WlzzCR7S5kRcEcLuOOB0rtVwYwfavOI86N8WpY12+VfweZtwAdw6njrQB6ZWdrOtWWh2LXd7JsjX8Savo25Qa4D4qC8/sMPDFGYF5llOMoM9skdf6d6AKFt4/1nWLm4bTNN821jDeW6xs24joMkgc/pir+k/EbfeW1hrGn3VldTyGNd8TBCeoGff8a2vCsNmuhWgtFUReWMAdq534ovbLosKji6SUSwlACysvOee3r9aAPRUkEi5HSsjxXP9l8K6rP/AM87SVumeimn+HbmS90O0uJV2vJErMPQkVS8cyNF4N1hlOCLSTB9PlNAHl/wMgB0+5kKEO0uc8jPHpXuJ+Vc15D8F4VGhM4i2lnI3HOWAr1xs+TnvQB5p8X5RH4QuEL4yR1HXmtP4YMW8J2I5BEYBB7Vz/xjmK+HBGzEb3AI7n6cGun+HSGLw7aoChQINpXjjFAHbY4paKKACiiigAooooA4/wCIegnWfDzNDEJLm2y8SEAgnvwa85+EesSWmtX2jysE+YyKm3b7HA7c/Wvc5oxLEyH+IYr5/wDFulXHgnxqNZtgxUsgLbc71P3iTwBQB9AowZQQadWXoWpQ6ppkN1A4aORQwI961KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAQjIxXh2qA2fxnhR7ss7Hcq7AAqkdM17lXzt8X0u0+I+n/2WwW7mVVU4OQ2cfyoA99W9giiDPIqjHc4qW3u4LoboZUcf7JzXjWn/DDVNaTz/Emv3s5PIhjkKoo9KVtJf4Y+I9ObTr6eXT76TypbeZ87T6g496APa6KjhbfEr+ozUlAAeKTrS0Y5oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKO3FAAfeuC8f+Ax4jNtqVjItvqVo25JMZ3L1wa7wccUYoA8h8H+OtU0/Vjo/ih4I2ztjn+4GPHBzXrFtdw3MSvFIrqehU5Fc34u8Ead4lspA9tD9q6q7L3968tutY8SfC55be5MU+mn5rchcKvP3R/nvQB77RXO+EfESeI9Dt79MjzFGQRjBroqACiiigAooooAKKKKACijtSbh3oAWioZbqKEZdgB6k1mX3ifSNORnu9QtoQoyQ8gBoA2aY8qRjLMAK8t1T406YJJodGs7nUnjBLPGu1B+J5x+FcVrV34x8YQXb3V+2m28OcWseUJOM4zxu498UAer+KPiToPhlCs9yJrn+GCH5nP19PxrxzXfFeqeOb+Czu9Ri0+ynkA+xrLhth/vY5yfetT4baDp955iTwv52AxaVQTID33YJro/HfgJ5bSPUdGRUuoCp8uMY3gf4A0AbfhHwdBpUcJR1EaA4RR97Pqe9d/DEsaAKBj2rzH4a+LZdVR7a9lthMpwsaONwA7Yr1FDkAjFADqKKKACiiigAooooA434kSLF4Q1Bvl3NCUGWCjJ9zXM/ByPy9FIDpJ8331B5+tbHxZvUsvCFw7xrIGO3axIz+VUfhKmNJY+V5cZclFB4UegoA9MByOKy9Y8OaVrtv5Oo2UNwm4Nh1zyK1Fp1AHk198FbW5u2Carcx2Mjl2tx0HOcL2A7dOleiaHodroWmQ2Nom2KJQoHetXFGKAGkcGvI4oxZ/HC+KBV+0W6ltxJJOByOMdvXtXrrdK8lvrdrr40F2KqsFuuMMAxyPzI5oA9WiOYwDivKvH7f2d8SvCt4MJ5pkhZy2MjI4/8eNeqQ/6sD2rx34zSKPEXhbEsYeOd2AJIOcpj8OKAPYbVt8Kn2pmoWEGpWMtpcorxSrtZSAR+tRaS5axi3HLbRk1foA8v03wz4r8JXd0unNb32nytujikfZ5XHOB2zz+NUJtG8X+KdWifVbOOysiSrxq4J25POcZz36d69fIB6ik2gHOKAK9larZ2scCKAkahQB2Fc18Rbz7F4H1SVwOYtg43ZyQOnfrXXVwPxbVpPA1zGhjDeYmC/Tr+v0oApfCazW28LWxXb8/zHb78/hXo7DKHPFcf4BhWLw7ZqoAUIDjGO1di/Kc9PegDxn4zNGBYpIygFuVZsA+h/Miu38CxsuhwK2wsqgZQmuA+NLLLqOj242lmf7uRzyBXpnhCLZo8A8sIdgyBQB0g6UtIOlLQAUUhz2pec+1ABRRRQAVynj7Rf7X8N3KRopl24BKk/wAufeurpCoIwQDQB4x8NNcudA1Q+GNVZExnysuCc9x1r2dWDDINebfEnwxFcaadTsmhtLq2PmCQ7UyRyDk8DmsvwL8VrW8MelatOF1FTtYqMo2O+RxQB69RUUM6TKGRgRjqKloAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAIbqdLa2kmc4VFJJzXzlpl7F4s+M0l4VHkwkugycjHHOa734y+OLPRtCm0eOUtfXIGYwP4M85PavFPBcXiW51C4k8MWu15WAaZ8N5Y9MmgD6Y1zxHpvhnRjc3soGOEjU5Zz6Ad64nQNC1fxtrUXiPXyYbeM/6LZquMLnILe/frSaR8Jrm/u11DxVqc1/OGDJHvIVPYV6vZ2sdpbrFGMKowPpQBNGuyNVxjAp9JgdaWgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAry341yxx+F4oXQN50wUg+nWvUq8h+M80qTaOgO1GlIzvZf1H+FAG98MbSK38LW8cb7geT8wPX3FbHifVNW0SIXdlbC7g6OnAMY9c9xWL8Mk8rS5sNuXzTgiXzM/jWp8RtSOm+C9RnRdzmPYBkjrx2oA8+0T4620kc66tbvFMpwPJXcP51pQ/GzTmUM8ZXPCocFjjrnB47cYrK+FHh6C7spZLq1Rmb74kGck8967+T4Y+FZpzO+kQGQnJwCB+WcUAYH/C5tMMiFIS8JxudW5XIzyKuWvxa0ie9MTB1jwT5nYfX0rQk+FnhKRNraNBz/dyP1Bqm/wc8JPgNYSFR0H2mTj/AMeoA1U+IegSSpGL2MblLAswA49zWRd/GTwpatsF20jdD5abgD25HFKnwd8J7gWsGIUbQDO/TrzzzWhH8MfCqQpF/ZMJCnOSSTn65oA5K4+NaXhMOiaRc3UxOEMmEX3z9BWKviz4laope1isokcEqNvvwOfwr2K38NaXbBRFZxLtORhRWgtnCmNsYGKAPnibTfHHiC4SHVr6+kgYgukEe1VyPwz2/OrVp8I52mEksPnBehdmBP1BBFfQC20S9EFPEarnAHNAHnnhv4bWWnWXlXSCYMPmRhx34x0xya6q78P2s+mTWQhQRyJtxt46Vt4ooA+f7ayv/h54x23Twva3IBZlkKKuSBkKele1WlxFeQKyOrqwBBByDWF8QPCMXiTSHeO2SS+hQ+ST/Lr/ADryTwz421HwhdXFprZvQI2IdJEDZ5xweMfmRxQB03i7Rm8I+J4vENjAxtZJAZ9spyGOc4XGMHjnNeo+H9TTVdLguowQsqBgG61414y+JVj4h05dJ0lLuSaV1DMEwAM8jGcn6e1ereDNPGmeHrW3UMAEHBBGD347fSgDpqKQHNLQAUUUA5oAKKKDQB5d8Y7/AMnw9Cik4kl2/KMk8HpyK0fhlaNb+HomfdlxnkYrA+M8wj061QjAably5G0Y6iup+HWz/hHbfYxZcZzQB2oGBS0dqKACiiigBkjhUYnoBXlPhvfrPxC1rVD5bRRyG3RkOfukY/ka0vij4wj0jTRpVo4bUrzCJGOwJxnpVr4feHl0HRokKf6RKA8zddzkcnNAHbJhYyelfP3xkvTfeNrWGEyuljbgyBOiszDHfnqO1e5avqcOkaXc39y+2GCMyMfYV8vHWJNY183kqP5moXZnYIfuop+XPtn3/hoA+oPDrbtJtzz/AKscEYxxWvWR4dDrpNuJCC4QZwcjpWvQAUUUUAITgZNeZ/GuZk8AzbGKt50eGHY5r0xvunNeX/GCUzeG5LXA2E5x7gUAbvw7Yy+FtPdydzQLuBHtXYv9yuW8CR+V4asVCbP3K8fhXTynCE+1AHiXxMFvJ450pZIpGKgAYbAOTzXrmgxLHYRqoKgDjNeJeNbqaf4tWtuJFEaou7Jwe5H64r3LSc/Yoic/dFAGjRRRQAUUd6KACiiigApCcUtch8QPGEPhTQmmLETyHbHhd2PqMigDzn4veJ5bu4bSYWk+zJwUQ43sM9+T1H04rm9J+E92fDaarMkjXTjzDAnDBcduDz3xit74eeGJfF2sy+J9ZQsqvi2jI2huepXJ9u9e2kRWtuxYqscY5zxigDwDQPGXiDwXGyXEcuoaYkm1ssd8Ptz/APq+le4eHfFOn+IrBLqzmDA8FTwVPoRXj3jIHxZrc8dhGbaEfKJEPzSkd9vcVRvPA3iHwcbS+0m+mUkbpnjjdgTjqyjIP40AfRYIPQ0teM+D/i23nrp3iQrDcY4nwArfUDocV6xY6raajCkttMkqOMhkbINAF6ikDA9DS0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABTXYKhJPSlJwK8u+KfxHttAsm0ewIuNTuVKbEbmMHucd/SgDyr4k3/8AwlvxHWxstr7XEOPLAz65IPP6V9AeD/DltoWi29tHEqbUGcDqa88+Dvglra0fWtRgYXU5yokXBUV7QiBVAHSgBcYpaKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArjviJ4YbxFoX+jxB7y3YSRYA3HHUAnpmuxooA+eND8eXPhO5ayudNlhjMzNNHIeUJ64PcDHpS+MfGzeOHh03T4m+wo4Msjgjce46jGPfrXvU+l2VyzNNbRSFhglkByKz4PCml2lx51tbrAS+91iG1XPuKAMrwH4dTRNIQDfuf5jubOPTHtXY01VCDCjAp1ABRRRQAUUUUAFFFBoAKKKKACiiigAPNc5rvgrQtfmSfULBJpU4BJI49ODXR0UAcBZfDHQbS8S7FnskVy6qJDgZ46fStDW/GWleG0iSVy5ZtuF7Duam8Z+JrXQdJmMlwYZ2Q+XhC3NYPhjwlHeJHquqg3E0igpHIvES9cAeueaAJ5viro8chjEdwTtVlYptU7unJ6fjU1l8S9LuGYTn7NGrbPMdxgn/PrWjrGmaVZ6a8k9rG0cI3AFecgYGMflXlCeCG8bu18IRp0AI8oqN24eu3oO2KAPQ5Piz4WilMX9oKxDFdwBxkenHP1HFVZfizpS2UV1HBcywyMRuRRgY9zXIX3wk02x01pjfuJflJluDnBAxwBjnFVPDmh6Ba3cfm6nLcsrMzI6bUZyeoBGfwFAHrmkeM9I1oL9luQWPRDwa6IMHFePax4ORAt/ody0LwfOYwzNk9eBng11/gnxC+q2EgmlSSSFyhZQQD+fegDkPjikv8AZVvsTcsjEOTjaBj+db3wpYDwrZxhydsYPPoaPipGlx4ZmXIDhSVwMnPtWH4H8XaVYaPZW8lyiyrEqsAp/oKAPYRS1zdt4y0eV2j+2orL1D5X+f1rQj8QabMf3d7A30cUAalQXcy29s8rttVFLEnsKpXeu2NpEZJbmNUHcsK8q8R+L73xfI+m6QG+ylgC4I2svct/QUAVbCJPGHj+81h1ka0tyogDD5D23Zz7V6vZuxiUqCFA4I71ieGNEWy0uO3djlQATk5JrS1zWLLw9pE17dyCOC3jLE9z6CgDhvjF4oistC/sSNt15qLKgjU8hN3JP16fjXlngfSxdaxOfJaSRR5UAldcjtk/TAxVVdWPibxnc6zeFwS+63i3btpH3RjqQOOldt4DtHXX7uzeQSSo6uXKksOmevA6e9AHuOhWv2PTLe3yT5cYXJPtWpVS1KpEoyM4q0CCKAFooooARuleSfGKbZpcMO1h50oUMDjBz1r1osOfavI/ivcR3Os6Dp6fO5nMjgdAg9fx/lQB3XhbbHpUEa5+RAP0rXvZlW2ZmOB+Vcbpuvw21gXWWMckBc8gjrXM+MfiPb2VqUiuYmlbIEQyxb8ulAHLeIJI7740wIJjtUIQFUnkf5/WvoHTwFtkyOa+dfA2kalrfi19beF4lZg+5c4bkdz9OlfRtpGy26buDjmgC1RRRQAUUUUAFFFFACE4rwD4i6nPc+Njpk1yfKlmSNleAYVOcYznPJ64/SvoCvOPiB4GbVLuPW7Qb7uEjcrn+Edlz0oA6vRba203SoooEVUVflCgD8q4jx74whknk0eC8SKEIfPkjAkYt3QDt/n3rL1P4h6lp+k3FsmmtFdJGNrO2RzxkAc+ntWL4F8EarrZS71gSC0di5jYjD85zggn+VAHcfDvTYNjzwRbISdwzbmMnPPf+lejeUhXaVBHvUNjZQ2NskEKBUUYAA6VZoA5TxF8P9E8Rw+XdWwQ7t2+L5Tnvn1rzK+8F+LPAU8l74ene6t2bHlld5Cj2xx+Fe8UhUHrQB45oHxheAC28SafNZXAbaG28MR14PSvRdH8W6RrKqbO9jkLDcFDcge47VJrfhTSNetmgvrKKQMMZ2jI+hry3xD8HpbGeS+8O3LxOoBjiiAVwe/Pf6cUAe2BgRkHNLXzraeNvG/hW98vVy91bg874vmB9OAK9E0P4vaBqUaC5uBay45WXgfnQB6NRWXp+v6ZqW4Wd7BPtxny3BxWmGU9CKAFooooAKKKCcUAFFJketGR60ALRSZFMeeNBlnUD60ASUhIHWuV1j4ieGNGjka61e13IM7EkDM3sAO9eX6h8QvFHjbWF0Xw3ANOtpAS0zEO+z1P936daANv4pfEG7sLiLRPDt4BqEjYl2JuaMUzwF8MJYr/APt7xBJ9qv3+Zc8qufb1rX8DfDGLQ5Dfam4u9QZtxlOT/OvSkQIgUDAFADIYEhUKigKO1S0UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRzmigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAopCcUtABRRRQAU122oW9BmnVBeRvLZzRxuUdkIDDqDQB5lp8Fx4p8X315c3E62dpN5aW8i4DEE/pz0r0y3iWJMKAMdK8j8L6zd+FtVudO1oBFlmLrOzg4JOMHvj0r1iC9ilQMrqQQORQBxXjm4N/qlhoUYyJn3z8sMIPp9O9dZZWkdvaoiIqoqjAAxgCuN8Y3KaX4o03VH2+WcxyPgZAJAHcevvXa2lzHPbIVYEEfnQB5l4quJ9cuL3yrhktrBirwKSBIVIJJJHH1FcBJcajd+Rc2cX/EvjGwOriVl9eSK9A8TB9A8STNc29t/Z2qN5X7r72ccEr375PTj8+O3aj4aWa0gtTc2Vw37uZSXVQcBQF3dvY+lAHT/DvV5r+7u7OZxIygPvyvzA9OAOOK2NGt5dL8cXlksyCCZTOkWQOvXAznrnnHeoPh5ol3psM1zfCLfJ90LGFIX0J71Jb36ah8SJ/LlXybWFRuCg7jzkZ9OaAOm1/w8uuaVcWc6qyyqeT2rx+7+D9ylwxhu2hBPygZIB+mc174L2FU5kX865PxH448P6KB9puPNm7RxJuJ59enb17UAeZD4deKEDbLq0kj6BZEznHrnr0qhrGna1oVm8+oQWqLtz8km3OOcAd+nSusm8da3rl39h0S1jhLtt84kOV5644GMZp+l+AtZ1TWTe65M2ApUIspcN055zgcdPegDymLRvEPie6DWlvKsIPzHc3AP8J/Lt717D4K8HS6HGjTA+a2N/J5Nd3pui2mlRiGKJIlJ4CjqT1NWb26ttPTzZpUjTbuJY4GB1NAFa7voNKtWnuZUijQZZ3OAPqa+ePHnje88YasttbRFtMtpOEjyzSEH7/A6f5711/jHV9T+IGoDw9oihLIMHmmZseYAcg4646H8RXUeD/hpFpGJ70pPcFt2SgO04xwev8A+vpQB4pothrVpfw3jaTclQWIl8snGe9dRb6xq2k3dxc/ZngncAnMf3+ccYPJ5r6CTTIEIXy12g56U+TSLWfiSFGGeMigDxS2+JOpQuqTz26sUVtsgZTk9QePpXS2XxNYRRNLJBLuXLbGHHX361383hrTbhcS2sLfVBWXP8PPDc+7fpVsdxyfkHNAGMfihZQSBbhkXI6hhjP1qRPirocinZcKSOvP6fyp1x8IPCk5UnTVUr02Ow/rUSfB3w0kBiWKZFJz8spz+dAEsnxM8PvF/wAhCJWY4wxwRXifjnxLHdeL4ryxnW8hVSqKhO7cc55/pXqOpfBHTJgDaXM0XB+V8MD9as+HfhLpmjNHLOi3EyfKrMv3aAPJNB0rxV4kLQ2pNnCW+Z5Mg47gc16f4d+EFhZqsl9/pM27cSxOM/jXpdppNtaALFGigdgK0FUUAZunaNbadGqQxKgxwAK1BwMUYpaACiiigAooooAKKKKACggEYIyKKKAKUukafNMJntIWlAxuKDNWY4UiGEUAe1SUUAFFFFABRRRQAUhANLRQBTu9Ms70AXFvHJg5G5Qa8z8SfCKzup3udPjjA2sPKcexxhuufrXrFFAHy5N4Q1TR1WSGa806dDiRmf5XGOMMMYPPT/Ctm21vx3pKCdNRW4BbcUl4IBOOjV9A3Vha3sLRXECSxt1V1yDWO/gzQ5GJOn2/IwcoORQB5tb/ABY1vTmA1fTbdo1GZHhlGV6Dkc+tS6h8c9Oj025VLaVbwDCRv0I9c12E3w10Sa5LNAPJP/LIcDPrx35rB8QfC3Sk069ubaFDKsDBN8QbHH0yTQB1PgTxHL4l8O29/NEEdx0Gfz5rqeK88+E11NN4St/O270Jj4GOAcV6GfXvQB498UfGGo+GfFFj9gDuSikxjJDDOMdcD69ax5PjN4jjuWtx4fiSULkBpi3b2wP1qv8AFbF58RrO1QkOYFQEHBGSeR713Wk/CzQjpQW4tS00q5kkLksTj1PNAHn83xT8Y3SsVOn2cT5UMQSQfz61yl/qeu6nEkl34kv5mlXKW0CuN2Tj1xg+tfQ1j8PdAsYfLSwhcFs5dQT9PpWrH4Z0iOUSrYQBwRg7BxigDwnwz8HL7U5o7jUkSGA4bY65Yggcdua9t8P+ENJ8Ow7LCyihz95lHJ+prfSNUGFAAp1ACAADApaKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABSY4xS0UAc5r3hHTdaBea3UuevbPvx3rirjwjr2hzJLpupXrwg8Q53BQBxnJ79+K9YprIGUgjOaAPDNb1PxBf6fd2OqaNHdIn3HZgjZ52nGeO361m+FPibPokq2OqWF3FZLgJK53CMHoM+le8XOl21yuJoUfnPIrndf+Hmia/DHHc2igocq68Ef4/jQBFff2X4y0MqsqTwyqMNG344yOledXmkeJ/D8cQsXV4FYhvNcuuOMfTv0FbFx8OdV8O2bHw9qV6SPuw71C+vPT6cVjw6x8QLOTypdLS7jTAPnL5bN+vP4CgCOLxX4xuLVo30nZBICPOtkZic5HHPHY5pdC+H+orElxcRsWn3NNH9oZX5IIPoCKlPjrxDbMRP4aZIwCQAG3NgjoMe/61YPxTvYYVkOjqrM5QI7spJGAQRt96AEl+G+pSyKqXcqxA5xLKSxXGNucfr798c7enfC/To5TJetLO4AVNzk7FByFHtmqB+LhjSLzdDuE81tm8uMA8jnj2NSN8Vbsp5MHh27e8JIKg/JtHG4NjkcelAHotlpNvbRqqRKu3oQKvuYYEyzBVAySeAK8oHjrxjeSE2egpFEEDATElm57Y+uaqQ6H4v8asH166uLKzddptY22fXp1/H1oA6rxF8R9HsyyadINQu4GCulv823Pv06iufTwprfjG5W58Q3MogJ3LaoNqICOAMEg/jXTaP8OdL0rGyEO3AJZF6D6D9a7K3sY4YgqggAYHtQBmaJ4fs9MiAgt40AGMquDW6IxwMUJGFGOcVJQA3aDTsUUUAFFFFABRRRQAUhGaWigBoQA5Ap1FFABRRRQAUCiigAooooAKKKKAAdKKKKACiiigAooooAKKKKACiiigAooooAKKKKACqOsI0mlXMaruLRsuMZ6j0q9TZF3IRQB5N8MtV8m1n06RGSWGZsfJtDDPXpivSJNSMcO5oyD7mvHPElmngbxu+pmCeSyuvmHlE4Ru4wBirt/wCNZvEMS6X4dtrl5Z12POQcRDHp60Ac5I7+Lvi7LeQITHbuqAhdwwvGa+h7ddsCA9QK4b4f+B/+Ecs/MnObmU7nAOQDXfAYFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAIRmloooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBpUHtVdrRCc4HtVqigCi+nwsclAe4JFQvpFs64aFDnrkVpkUY6UAYf/COaeIti2cIUnLARjBP/wCupl0S0QkLbxjPXCjmtbAoxzQBSWxiRQAg4wOlWBbopGB0qUCloAjVMAVJRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRSY96AFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCpf6baanavbXcKSwv95WHWqml+HNM0hStlaxxAnJ2jqa1qKAAADoKKKKACiiigAooooAKKKKACiiigAooooAKKTNLQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRQKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKO9FGOaACiiigAopAR0zzS0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFGc0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFIeKKKAFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKQnkCiigBaKKKACiiigAooooAKKKKACiiigAooooA//ZDQowDQp4LWFtei1jaGVja3N1bS1jcmMzMjo4RGhML0E9PQ0KDQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:32 GMT" ], "Etag": [ "\"62d43fa20e70bfa1fdb22510d1c060d2\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "8DhL/A==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "6H2/vc9nTTL+8yZPpm+y9ZUrD1pOake35cEd3mVRhg0iRUWhZSwUekUIUBeVPO1c06dhLN2Qr32kL8W5/wADLfh6m9RkrNxd" ], "X-Amz-Request-Id": [ "4TS4GXEWD0H6QDRZ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "c30dcefadee091bf", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "38430" ], "Content-Type": [ "image/jpeg" ], "Date": [ "Thu, 19 Mar 2026 15:28:32 GMT" ], "Etag": [ "\"62d43fa20e70bfa1fdb22510d1c060d2\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:32 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "8DhL/A==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "m/8cV+leLtRC4VR8854UbHJizcVgpl2ha7nbPTDNAxPqsyitMuvruqng7FDDDTJVmMkjYvC1J4aVL3iK5wiLJmT3xbIBMDMJ" ], "X-Amz-Request-Id": [ "4TS20CE452NCNB2X" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "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NQu4GCulv823Pv06iufTwprfjG5W58Q3MogJ3LaoNqICOAMEg/jXTaP8OdL0rGyEO3AJZF6D6D9a7K3sY4YgqggAYHtQBmaJ4fs9MiAgt40AGMquDW6IxwMUJGFGOcVJQA3aDTsUUUAFFFFABRRRQAUhGaWigBoQA5Ap1FFABRRRQAUCiigAooooAKKKKAAdKKKKACiiigAooooAKKKKACiiigAooooAKKKKACqOsI0mlXMaruLRsuMZ6j0q9TZF3IRQB5N8MtV8m1n06RGSWGZsfJtDDPXpivSJNSMcO5oyD7mvHPElmngbxu+pmCeSyuvmHlE4Ru4wBirt/wCNZvEMS6X4dtrl5Z12POQcRDHp60Ac5I7+Lvi7LeQITHbuqAhdwwvGa+h7ddsCA9QK4b4f+B/+Ecs/MnObmU7nAOQDXfAYFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAIRmloooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBpUHtVdrRCc4HtVqigCi+nwsclAe4JFQvpFs64aFDnrkVpkUY6UAYf/COaeIti2cIUnLARjBP/wCupl0S0QkLbxjPXCjmtbAoxzQBSWxiRQAg4wOlWBbopGB0qUCloAjVMAVJRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRSY96AFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCpf6baanavbXcKSwv95WHWqml+HNM0hStlaxxAnJ2jqa1qKAAADoKKKKACiiigAooooAKKKKACiiigAooooAKKTNLQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRQKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKO9FGOaACiiigAopAR0zzS0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFGc0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFIeKKKAFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKQnkCiigBaKKKACiiigAooooAKKKKACiiigAooooA//Z" } }, { "ID": "b09b93971b4dad01", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "38430" ], "Content-Type": [ "image/jpeg" ], "Date": [ "Thu, 19 Mar 2026 15:28:32 GMT" ], "Etag": [ "\"62d43fa20e70bfa1fdb22510d1c060d2\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:32 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "j8/6eR8BvvalLcCz/qphLaOZ0987YuEKrLQgUD1v+rPAk2V9+8gW73lqeVbDEof74x2r8MdLM7xxJccRCiGX+p+HGFxrplkX" ], "X-Amz-Request-Id": [ "4TS8Q9HQ347PRSM7" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "9ff4606e26af6e2a", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "38430" ], "Content-Type": [ "image/jpeg" ], "Date": [ "Thu, 19 Mar 2026 15:28:32 GMT" ], "Etag": [ "\"62d43fa20e70bfa1fdb22510d1c060d2\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:32 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "DmcZ93ptktvqSX0ZJEcut3g0n8Xz4E3/wBKsLRWkRv0cgskmhlfvCuZ36FTnYMT7ah7ODt5EjHcXrVsN4TvFvxTzVe8nX6wD" ], "X-Amz-Request-Id": [ "4TS7SXYK5RYCTSQ9" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "3cf2a97fca65ad48", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:33 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "XuCjvoF5/Gfw/thhUymv+5RbWXyPTk10XVjYgcft8/5AU+vHQdagqHEuaKstbOO/uzDyG1Jz5Gd1Q/dfpuidstxyxlvVJbCZ" ], "X-Amz-Request-Id": [ "R94X10G6PBKNCCGZ" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestWrite/a_small_text_file_gets_a_ContentType.replay ================================================ { "Initial": "AQAAAA7hTg0fCacQ2gAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "f1828ffc14b960eb", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "62" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "20" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "text/plain", "BodyParts": [ "MTQNClRoaXMgaXMgYSB0ZXh0IGZpbGUuDQowDQp4LWFtei1jaGVja3N1bS1jcmMzMjpzUURpRVE9PQ0KDQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:32 GMT" ], "Etag": [ "\"3f3309312cc3264a1389b2d263dece8d\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "sQDiEQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "hRoJ8akCHFn0IdRu20A1lbiR/jp60QSbQvuOGuBfFn7PWEXXJwhCfS3sMRE03Bd/UQ31PAV+0ibhQ8yuFKsSxAarPP5VM58r" ], "X-Amz-Request-Id": [ "4TSE5BGVNCCDSC59" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "24d41b0455c7ab9e", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "20" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:32 GMT" ], "Etag": [ "\"3f3309312cc3264a1389b2d263dece8d\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:32 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "sQDiEQ==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "dvpqiB3YgL+6eJB2t2reXr8364SUR2/ZSxdnKLAD4fE8ZCjhYd0jO0QWVU/mgRidxMq6n3rcwZm4VEPCDbO4aNb3zSDmH8cw" ], "X-Amz-Request-Id": [ "4TS71RFX00MAADAS" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "VGhpcyBpcyBhIHRleHQgZmlsZS4=" } }, { "ID": "7b008ed833432c57", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "20" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:32 GMT" ], "Etag": [ "\"3f3309312cc3264a1389b2d263dece8d\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:32 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "N3nI+ci6QTxZapHIY2c0KDkLROeSmYB2vBjCKHWKa2AeUncqyVX+Bo6rjkSHh0I23uZLpu1/zTk6b9mwcg44sqIzAC+zohDW" ], "X-Amz-Request-Id": [ "4TSEE5EYJ6W44P2H" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "98c6979d85d38701", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "20" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:32 GMT" ], "Etag": [ "\"3f3309312cc3264a1389b2d263dece8d\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:32 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "ekucX+e2f7Tp6AmFfEo6AG0FdchbMr8DQgHIuWsFZ9Xs1lwZEsU/2YmiwsczkPTHysBVNv991ChktDUCVerd5UceL/B5ujMp" ], "X-Amz-Request-Id": [ "4TSC9ZYY1H43GYYZ" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "84f16053418a3ee8", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:32 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "bhyzuwL4npBdlgNtAetZ8fB1GR1ELVGQFUnAS9Ud3d1yat9WuX7Lq70nleCslrcqvadimxDvX1DckhJxwgrqZGhjr4vd36L/" ], "X-Amz-Request-Id": [ "4TSA65E6SZ1SHDGD" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestWrite/invalid_ContentType_fails.replay ================================================ { "Initial": "AQAAAA7hTg0dIg+FGgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "d7182a9892b5d023", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Type": [ "application/xml" ], "Date": [ "Thu, 19 Mar 2026 15:28:29 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "pqEL7FhOYdmKOtMNdA2LTjrlhkRV/VZJujoRL9D+xUxtBWkN0zBALcSz4lnpAobLPzzayDy2edw=" ], "X-Amz-Request-Id": [ "DP0PFDTPN82WQXT9" ] }, "Body": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPEVycm9yPjxDb2RlPk5vU3VjaEtleTwvQ29kZT48TWVzc2FnZT5UaGUgc3BlY2lmaWVkIGtleSBkb2VzIG5vdCBleGlzdC48L01lc3NhZ2U+PEtleT5ibG9iLWZvci1yZWFkaW5nPC9LZXk+PFJlcXVlc3RJZD5EUDBQRkRUUE44MldRWFQ5PC9SZXF1ZXN0SWQ+PEhvc3RJZD5wcUVMN0ZoT1lkbUtPdE1OZEEyTFRqcmxoa1JWL1ZaSnVqb1JMOUQreFV4dEJXa04wekJBTGNTejRsbnBBb2JMUHp6YXlEeTJlZHc9PC9Ib3N0SWQ+PC9FcnJvcj4=" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestWrite/no_write_then_close_results_in_empty_blob,_blob_existed.replay ================================================ { "Initial": "AQAAAA7hTg0dFIfa5AAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "5326bf58d7bb393a", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Crc32": [ "AAAAAA==" ], "X-Amz-Content-Sha256": [ "UNSIGNED-PAYLOAD" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "text/plain", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:30 GMT" ], "Etag": [ "\"d41d8cd98f00b204e9800998ecf8427e\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "AAAAAA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "hmSJ4LbboUPZhgu9YBSKIW90A5DZ9hF8QIIn7atY4TmeBLFAZN+2LQGRn0amSjrzjuOueI5cqpdmuEtDLImseevfyFxoxqL6" ], "X-Amz-Request-Id": [ "DP0N9RC2Y3JY1732" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "1fe6693cb270dbd0", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "0" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:30 GMT" ], "Etag": [ "\"d41d8cd98f00b204e9800998ecf8427e\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:30 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "AAAAAA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "aZG7EHXhvwXZOqGz0BRUdo8KDssrv+tkQJj8HDbDBaj4jbNHPOU8ACy4EfOpvb3NbHFQGNh1lBe0mTkoCKTDDlTS+vXa6nbK" ], "X-Amz-Request-Id": [ "DP0MMW5E49BZMQW4" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "ec35bf717bfa41f8", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "0" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:30 GMT" ], "Etag": [ "\"d41d8cd98f00b204e9800998ecf8427e\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:30 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "YapDKqUi9J4wmKmZ8vsOCJLeVr/aOTqrY8W29PxY13zQF95HLMXZ5Le+x6T3cdX1vxhrFzfamsNsfSUTzahj/QiP0DeemLJh" ], "X-Amz-Request-Id": [ "DP0ZZHNXXM4Y6066" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "1f744b2fae61d7d7", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:30 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "hGKLqVavcBodDc7VQRnlBRj4WJtM9s06WoIJCwrDP1lFRj8bDf1n421tCX83GthkwRcK0WdKg5cn48/sKQDKx5EvLwIx38JK" ], "X-Amz-Request-Id": [ "DP0ZHRF4MP0HWWRA" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestWrite/no_write_then_close_results_in_empty_blob.replay ================================================ { "Initial": "AQAAAA7hTg0dB5ItxQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "f317c2b248144515", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Crc32": [ "AAAAAA==" ], "X-Amz-Content-Sha256": [ "UNSIGNED-PAYLOAD" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "text/plain", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:30 GMT" ], "Etag": [ "\"d41d8cd98f00b204e9800998ecf8427e\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "AAAAAA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "NWv5D5owQW7f0bM24eCimsfboXcssdP94+ExMOr8GVhk13AX0SZT78g1EFltA1rJT7q1LDbh/X8=" ], "X-Amz-Request-Id": [ "DP0QVW1Y8QVSPBH6" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "3ce7ab387c639e40", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "0" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:30 GMT" ], "Etag": [ "\"d41d8cd98f00b204e9800998ecf8427e\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:30 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "AAAAAA==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "OyePdrMCEhVAV38sLmoRtr//3F6703+brZ9HcTZ0f6vDpNXnON0bEdX5ba8DbyZQMuEeUy8ruqA=" ], "X-Amz-Request-Id": [ "DP0GYVVKZSXS9K9P" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "804a06c1173fb5d9", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "0" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 19 Mar 2026 15:28:30 GMT" ], "Etag": [ "\"d41d8cd98f00b204e9800998ecf8427e\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:30 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "0w90/mtyL1zIBEKkff8fwMpG6OCxCAx7z/gpVjZ3rAq+l0ynVKDQyuEvyqYxKMc5tExUnGA202c=" ], "X-Amz-Request-Id": [ "DP0KWJ8CBDMQRBFH" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "643f9309eba8c130", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:30 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "gEU9IaRENeKdgxNuJOnA/Mmga+l0Si9iY7BZPrnAJN8mEO+C74adHy+Lh+xhak4thKxXe5TuZDw=" ], "X-Amz-Request-Id": [ "DP0GDAAAF9W4AXE8" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestWrite/write_to_empty_key_fails.replay ================================================ { "Initial": "AQAAAA7hTg0dB28S0QAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": null } ================================================ FILE: blob/s3blob/testdata/TestConformanceUsingLegacyList/TestWrite/write_with_explicit_ContentType_overrides_discovery.replay ================================================ { "Initial": "AQAAAA7hTg0eC9MzygAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "aa3c1ff88bf44bd8", "Request": { "Method": "PUT", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=PutObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Encoding": [ "aws-chunked" ], "Content-Length": [ "6398" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Decoded-Content-Length": [ "6354" ], "X-Amz-Trailer": [ "x-amz-checksum-crc32" ] }, "MediaType": "application/json", "BodyParts": [ "MThkMg0KPCFET0NUWVBFIGh0bWw+PGh0bWwgbGFuZz0iZW4iPgo8aGVhZCBwcm9maWxlPSJodHRwOi8vYTkuY29tLy0vc3BlYy9vcGVuc2VhcmNoLzEuMS8iPgogIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgPGxpbmsgaHJlZj0iLy0vYm9vdHN0cmFwLm1pbi5jc3M/dj04YmVjMWJiYTNlMjNlY2JhMjJjZmZiMTk3YTJkNDQwYWY0MTBiMTVkIiByZWw9InN0eWxlc2hlZXQiPgogIDxsaW5rIGhyZWY9Ii8tL3NpdGUuY3NzP3Y9N2Q4MWY0MTA0Yzg5ZGJlMzc2MzQ1ZjZiZmUzZTYyYjRlNDBkM2QwNiIgcmVsPSJzdHlsZXNoZWV0Ij4KICA8dGl0bGU+R29Eb2M8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5Pgo8bmF2IGNsYXNzPSJuYXZiYXIgbmF2YmFyLWRlZmF1bHQiIHJvbGU9Im5hdmlnYXRpb24iPgogIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgPGRpdiBjbGFzcz0ibmF2YmFyLWhlYWRlciI+CiAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Im5hdmJhci10b2dnbGUiIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSIgZGF0YS10YXJnZXQ9Ii5uYXZiYXItY29sbGFwc2UiPgogICAgICA8c3BhbiBjbGFzcz0ic3Itb25seSI+VG9nZ2xlIG5hdmlnYXRpb248L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iaWNvbi1iYXIiPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9Imljb24tYmFyIj48L3NwYW4+CiAgICA8L2J1dHRvbj4KICAgIDxhIGNsYXNzPSJuYXZiYXItYnJhbmQiIGhyZWY9Ii8iPjxzdHJvbmc+R29Eb2M8L3N0cm9uZz48L2E+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlIj4KICAgIDx1bCBjbGFzcz0ibmF2IG5hdmJhci1uYXYiPgogICAgICAgIDxsaSBjbGFzcz0iYWN0aXZlIj48YSBocmVmPSIvIj5Ib21lPC9hPjwvbGk+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dDwvYT48L2xpPgogICAgPC91bD4KICAgIDxmb3JtIGNsYXNzPSJuYXZiYXItbmF2IG5hdmJhci1mb3JtIG5hdmJhci1yaWdodCIgaWQ9Ingtc2VhcmNoIiBhY3Rpb249Ii8iIHJvbGU9InNlYXJjaCI+PGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJ4LXNlYXJjaC1xdWVyeSIgdHlwZT0idGV4dCIgbmFtZT0icSIgcGxhY2Vob2xkZXI9IlNlYXJjaCI+PC9mb3JtPgogIDwvZGl2Pgo8L2Rpdj4KPC9uYXY+CjxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgCjxkaXYgY2xhc3M9Imp1bWJvdHJvbiI+CiAgICA8aDI+U2VhcmNoIGZvciBHbyBQYWNrYWdlczwvaDI+CiAgICAKICA8Zm9ybT4KICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5hbWU9InEiIGF1dG9mb2N1cz0iYXV0b2ZvY3VzIiB2YWx1ZT0iIiBwbGFjZWhvbGRlcj0iU2VhcmNoIGZvciBwYWNrYWdlIGJ5IGltcG9ydCBwYXRoIG9yIGtleXdvcmQuIiB0eXBlPSJ0ZXh0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImlucHV0LWdyb3VwLWJ0biI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IiB0eXBlPSJzdWJtaXQiPkdvITwvYnV0dG9uPgogICAgICA8L3NwYW4+CiAgICA8L2Rpdj4KICA8L2Zvcm0+Cgo8L2Rpdj4KCjxwPkdvRG9jIGhvc3RzIGRvY3VtZW50YXRpb24gZm9yIDxhIGhyZWY9Imh0dHA6Ly9nb2xhbmcub3JnLyI+R288L2E+IHBhY2thZ2VzCm9uIEJpdGJ1Y2tldCwgR2l0SHViLCBHb29nbGUgUHJvamVjdCBIb3N0aW5nIGFuZCBMYXVuY2hwYWQuICBSZWFkIHRoZSA8YQogIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dCBQYWdlPC9hPiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYWRkaW5nIHBhY2thZ2VzIHRvIEdvRG9jCmFuZCBtb3JlLgoKPGRpdiBjbGFzcz0icm93Ij4KICA8ZGl2IGNsYXNzPSJjb2wtc20tNiI+CiAgICAKICAgICAgPGg0PlBvcHVsYXIgUGFja2FnZXM8L2g0PgogICAgICA8dWwgY2xhc3M9Imxpc3QtdW5zdHlsZWQiPgogICAgICAgIDxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1nby9hd3MiPmdpdGh1Yi5jb20vYXdzL2F3cy1zZGstZ28vYXdzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9kZ3JpamFsdmEvand0LWdvIj5naXRodWIuY29tL2RncmlqYWx2YS9qd3QtZ288L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dpbi1nb25pYy9naW4iPmdpdGh1Yi5jb20vZ2luLWdvbmljL2dpbjwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXMiPmdpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dvLXNxbC1kcml2ZXIvbXlzcWwiPmdpdGh1Yi5jb20vZ28tc3FsLWRyaXZlci9teXNxbDwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29sYW5nL3Byb3RvYnVmL3Byb3RvIj5naXRodWIuY29tL2dvbGFuZy9wcm90b2J1Zi9wcm90bzwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29tb2R1bGUvcmVkaWdvL3JlZGlzIj5naXRodWIuY29tL2dvbW9kdWxlL3JlZGlnby9yZWRpczwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQiPmdpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQ8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltIj5naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9qaW56aHUvZ29ybSI+Z2l0aHViLmNvbS9qaW56aHUvZ29ybTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vbGliL3BxIj5naXRodWIuY29tL2xpYi9wcTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcGtnL2Vycm9ycyI+Z2l0aHViLmNvbS9wa2cvZXJyb3JzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1cyI+Z2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1czwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcm9iZmlnL2Nyb24iPmdpdGh1Yi5jb20vcm9iZmlnL2Nyb248L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3NpcnVwc2VuL2xvZ3J1cyI+Z2l0aHViLmNvbS9zaXJ1cHNlbi9sb2dydXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0Ij5naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0PC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS91bml4cGlja2xlL2thaG9vdC1oYWNrIj5naXRodWIuY29tL3VuaXhwaWNrbGUva2Fob290LWhhY2s8L2E+PGxpPjxhIGhyZWY9Ii9nby51YmVyLm9yZy96YXAiPmdvLnViZXIub3JnL3phcDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9jcnlwdG8vc3NoIj5nb2xhbmcub3JnL3gvY3J5cHRvL3NzaDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9uZXQvY29udGV4dCI+Z29sYW5nLm9yZy94L25ldC9jb250ZXh0PC9hPjxsaT48YSBocmVmPSIvZ29sYW5nLm9yZy94L29hdXRoMiI+Z29sYW5nLm9yZy94L29hdXRoMjwvYT48bGk+PGEgaHJlZj0iL2dvb2dsZS5nb2xhbmcub3JnL2dycGMiPmdvb2dsZS5nb2xhbmcub3JnL2dycGM8L2E+PGxpPjxhIGhyZWY9Ii9nb3BrZy5pbi9tZ28udjIiPmdvcGtnLmluL21nby52MjwvYT48bGk+PGEgaHJlZj0iL2dvcGtnLmluL3lhbWwudjIiPmdvcGtnLmluL3lhbWwudjI8L2E+PGxpPjxhIGhyZWY9Ii9sYWJpeC5vcmcvdjIvbWdvIj5sYWJpeC5vcmcvdjIvbWdvPC9hPgogICAgICA8L3VsPgogICAgCiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sLXNtLTYiPgogICAgPGg0Pk1vcmUgUGFja2FnZXM8L2g0PgogICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIj4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL2dvIj5HbyBTdGFuZGFyZCBQYWNrYWdlczwvYT4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL3N1YnJlcG8iPkdvIFN1Yi1yZXBvc2l0b3J5IFBhY2thZ2VzPC9hPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9nb2xhbmcub3JnL3dpa2kvUHJvamVjdHMiPlByb2plY3RzIEAgZ28td2lraTwvYT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zZWFyY2g/bz1kZXNjJmFtcDtxPWxhbmd1YWdlJTNBZ28mYW1wO3M9c3RhcnMmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5Nb3N0IHN0YXJzPC9hPiwgCiAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NlYXJjaD9vPWRlc2MmYW1wO3E9bGFuZ3VhZ2UlM0FnbyZhbXA7cz1mb3JrcyZhbXA7dHlwZT1SZXBvc2l0b3JpZXMiPm1vc3QgZm9ya3M8L2E+LCAKICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2VhcmNoP289ZGVzYyZhbXA7cT1sYW5ndWFnZSUzQWdvJmFtcDtzPXVwZGF0ZWQmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5yZWNlbnRseSB1cGRhdGVkPC9hPiBvbiBHaXRIdWIKICAgIDwvdWw+CiAgPC9kaXY+CjwvZGl2PgoKCjwvZGl2Pgo8ZGl2IGlkPSJ4LWZvb3RlciIgY2xhc3M9ImNsZWFyZml4Ij4KICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2dvbGFuZy9nZGRvL2lzc3VlcyI+V2Vic2l0ZSBJc3N1ZXM8L2E+CiAgICA8c3BhbiBjbGFzcz0idGV4dC1tdXRlZCI+fDwvc3Bhbj4gPGEgaHJlZj0iaHR0cDovL2dvbGFuZy5vcmcvIj5HbyBMYW5ndWFnZTwvYT4KICAgIDxzcGFuIGNsYXNzPSJwdWxsLXJpZ2h0Ij48YSBocmVmPSIjIj5CYWNrIHRvIHRvcDwvYT48L3NwYW4+CiAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ieC1zaG9ydGN1dHMiIHRhYmluZGV4PSItMSIgY2xhc3M9Im1vZGFsIj4KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+CiAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvYnV0dG9uPgogICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+S2V5Ym9hcmQgc2hvcnRjdXRzPC9oND4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4/PC9iPjwvdGQ+PHRkPiA6IFRoaXMgbWVudTwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4vPC9iPjwvdGQ+PHRkPiA6IFNlYXJjaCBzaXRlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5mPC9iPjwvdGQ+PHRkPiA6IEp1bXAgdG8gaWRlbnRpZmllcjwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmc8L2I+PC90ZD48dGQ+IDogR28gdG8gdG9wIG9mIHBhZ2U8L3RkPjwvdHI+CiAgICAgICAgICA8dHI+PHRkIGFsaWduPSJyaWdodCI+PGI+ZzwvYj4gdGhlbiA8Yj5iPC9iPjwvdGQ+PHRkPiA6IEdvIHRvIGVuZCBvZiBwYWdlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmk8L2I+PC90ZD48dGQ+IDogR28gdG8gaW5kZXg8L3RkPjwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9InRleHQtbXV0ZWQiPjx0ZCBhbGlnbj0icmlnaHQiPjxiPmc8L2I+IHRoZW4gPGI+ZTwvYj48L3RkPjx0ZD4gOiBHbyB0byBleGFtcGxlczwvdGQ+PC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KPHNjcmlwdCBzcmM9Ii8tL2pxdWVyeS0yLjAuMy5taW4uanM/dj1mYmY5Yzc3ZDBjNGUzYzM0YTQ4NTk4MGMxZTUzMTZiNjIxMjE2MGM4Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL2Jvb3RzdHJhcC5taW4uanM/dj01YWRhN2MxMDNmYzFkZWFiYzkyNWNjMWZkYmJiNmU0NTFjMjFmYzcwIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL3NpdGUuanM/dj0zNzFkZTczMWMxOGQ5MWM0OTlkOTBiMWFiMGJmMzllY2Y2NmQ2Y2Y3Ij48L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+DQowDQp4LWFtei1jaGVja3N1bS1jcmMzMjplQ01DcWc9PQ0KDQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Date": [ "Thu, 19 Mar 2026 15:28:31 GMT" ], "Etag": [ "\"0f6a7c9ff3d3d770b8f7fa19c2ae19d0\"" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "eCMCqg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "C33fNMK7z7wFOOo2IvPiLMWFtJ/LgJ4OQAaHAFLu+hVUvWhLywh9MEOoZKGGFD7sf+SBSmTnpTHvs5Q8fOn/puJKvNJp/enE" ], "X-Amz-Request-Id": [ "0R45RECMTEXY2RC8" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "fc853a36c6b16f46", "Request": { "Method": "GET", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=GetObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Checksum-Mode": [ "ENABLED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "6354" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:28:31 GMT" ], "Etag": [ "\"0f6a7c9ff3d3d770b8f7fa19c2ae19d0\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:31 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Checksum-Crc32": [ "eCMCqg==" ], "X-Amz-Checksum-Type": [ "FULL_OBJECT" ], "X-Amz-Id-2": [ "EoFENcBcec6dcXxC9mq+XbfDiRGEBRKcVtSF1B5+IM7ADQYQV7a9XGc4EyNBNL5ZYRHIjxW2HYiXsk0zCPmE7NmyB2oHChK/" ], "X-Amz-Request-Id": [ "0R445RQBYEE5V4BB" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "PCFET0NUWVBFIGh0bWw+PGh0bWwgbGFuZz0iZW4iPgo8aGVhZCBwcm9maWxlPSJodHRwOi8vYTkuY29tLy0vc3BlYy9vcGVuc2VhcmNoLzEuMS8iPgogIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgPGxpbmsgaHJlZj0iLy0vYm9vdHN0cmFwLm1pbi5jc3M/dj04YmVjMWJiYTNlMjNlY2JhMjJjZmZiMTk3YTJkNDQwYWY0MTBiMTVkIiByZWw9InN0eWxlc2hlZXQiPgogIDxsaW5rIGhyZWY9Ii8tL3NpdGUuY3NzP3Y9N2Q4MWY0MTA0Yzg5ZGJlMzc2MzQ1ZjZiZmUzZTYyYjRlNDBkM2QwNiIgcmVsPSJzdHlsZXNoZWV0Ij4KICA8dGl0bGU+R29Eb2M8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5Pgo8bmF2IGNsYXNzPSJuYXZiYXIgbmF2YmFyLWRlZmF1bHQiIHJvbGU9Im5hdmlnYXRpb24iPgogIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgPGRpdiBjbGFzcz0ibmF2YmFyLWhlYWRlciI+CiAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Im5hdmJhci10b2dnbGUiIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSIgZGF0YS10YXJnZXQ9Ii5uYXZiYXItY29sbGFwc2UiPgogICAgICA8c3BhbiBjbGFzcz0ic3Itb25seSI+VG9nZ2xlIG5hdmlnYXRpb248L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0iaWNvbi1iYXIiPjwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9Imljb24tYmFyIj48L3NwYW4+CiAgICA8L2J1dHRvbj4KICAgIDxhIGNsYXNzPSJuYXZiYXItYnJhbmQiIGhyZWY9Ii8iPjxzdHJvbmc+R29Eb2M8L3N0cm9uZz48L2E+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlIj4KICAgIDx1bCBjbGFzcz0ibmF2IG5hdmJhci1uYXYiPgogICAgICAgIDxsaSBjbGFzcz0iYWN0aXZlIj48YSBocmVmPSIvIj5Ib21lPC9hPjwvbGk+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dDwvYT48L2xpPgogICAgPC91bD4KICAgIDxmb3JtIGNsYXNzPSJuYXZiYXItbmF2IG5hdmJhci1mb3JtIG5hdmJhci1yaWdodCIgaWQ9Ingtc2VhcmNoIiBhY3Rpb249Ii8iIHJvbGU9InNlYXJjaCI+PGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJ4LXNlYXJjaC1xdWVyeSIgdHlwZT0idGV4dCIgbmFtZT0icSIgcGxhY2Vob2xkZXI9IlNlYXJjaCI+PC9mb3JtPgogIDwvZGl2Pgo8L2Rpdj4KPC9uYXY+CjxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgCjxkaXYgY2xhc3M9Imp1bWJvdHJvbiI+CiAgICA8aDI+U2VhcmNoIGZvciBHbyBQYWNrYWdlczwvaDI+CiAgICAKICA8Zm9ybT4KICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5hbWU9InEiIGF1dG9mb2N1cz0iYXV0b2ZvY3VzIiB2YWx1ZT0iIiBwbGFjZWhvbGRlcj0iU2VhcmNoIGZvciBwYWNrYWdlIGJ5IGltcG9ydCBwYXRoIG9yIGtleXdvcmQuIiB0eXBlPSJ0ZXh0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImlucHV0LWdyb3VwLWJ0biI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IiB0eXBlPSJzdWJtaXQiPkdvITwvYnV0dG9uPgogICAgICA8L3NwYW4+CiAgICA8L2Rpdj4KICA8L2Zvcm0+Cgo8L2Rpdj4KCjxwPkdvRG9jIGhvc3RzIGRvY3VtZW50YXRpb24gZm9yIDxhIGhyZWY9Imh0dHA6Ly9nb2xhbmcub3JnLyI+R288L2E+IHBhY2thZ2VzCm9uIEJpdGJ1Y2tldCwgR2l0SHViLCBHb29nbGUgUHJvamVjdCBIb3N0aW5nIGFuZCBMYXVuY2hwYWQuICBSZWFkIHRoZSA8YQogIGhyZWY9Ii8tL2Fib3V0Ij5BYm91dCBQYWdlPC9hPiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYWRkaW5nIHBhY2thZ2VzIHRvIEdvRG9jCmFuZCBtb3JlLgoKPGRpdiBjbGFzcz0icm93Ij4KICA8ZGl2IGNsYXNzPSJjb2wtc20tNiI+CiAgICAKICAgICAgPGg0PlBvcHVsYXIgUGFja2FnZXM8L2g0PgogICAgICA8dWwgY2xhc3M9Imxpc3QtdW5zdHlsZWQiPgogICAgICAgIDxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1nby9hd3MiPmdpdGh1Yi5jb20vYXdzL2F3cy1zZGstZ28vYXdzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9kZ3JpamFsdmEvand0LWdvIj5naXRodWIuY29tL2RncmlqYWx2YS9qd3QtZ288L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dpbi1nb25pYy9naW4iPmdpdGh1Yi5jb20vZ2luLWdvbmljL2dpbjwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXMiPmdpdGh1Yi5jb20vZ28tcmVkaXMvcmVkaXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2dvLXNxbC1kcml2ZXIvbXlzcWwiPmdpdGh1Yi5jb20vZ28tc3FsLWRyaXZlci9teXNxbDwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29sYW5nL3Byb3RvYnVmL3Byb3RvIj5naXRodWIuY29tL2dvbGFuZy9wcm90b2J1Zi9wcm90bzwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29tb2R1bGUvcmVkaWdvL3JlZGlzIj5naXRodWIuY29tL2dvbW9kdWxlL3JlZGlnby9yZWRpczwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQiPmdpdGh1Yi5jb20vZ29yaWxsYS93ZWJzb2NrZXQ8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltIj5naXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9jb3JlL2NoYWluY29kZS9zaGltPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9qaW56aHUvZ29ybSI+Z2l0aHViLmNvbS9qaW56aHUvZ29ybTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vbGliL3BxIj5naXRodWIuY29tL2xpYi9wcTwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcGtnL2Vycm9ycyI+Z2l0aHViLmNvbS9wa2cvZXJyb3JzPC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1cyI+Z2l0aHViLmNvbS9wcm9tZXRoZXVzL2NsaWVudF9nb2xhbmcvcHJvbWV0aGV1czwvYT48bGk+PGEgaHJlZj0iL2dpdGh1Yi5jb20vcm9iZmlnL2Nyb24iPmdpdGh1Yi5jb20vcm9iZmlnL2Nyb248L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3NpcnVwc2VuL2xvZ3J1cyI+Z2l0aHViLmNvbS9zaXJ1cHNlbi9sb2dydXM8L2E+PGxpPjxhIGhyZWY9Ii9naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0Ij5naXRodWIuY29tL3N0cmV0Y2hyL3Rlc3RpZnkvYXNzZXJ0PC9hPjxsaT48YSBocmVmPSIvZ2l0aHViLmNvbS91bml4cGlja2xlL2thaG9vdC1oYWNrIj5naXRodWIuY29tL3VuaXhwaWNrbGUva2Fob290LWhhY2s8L2E+PGxpPjxhIGhyZWY9Ii9nby51YmVyLm9yZy96YXAiPmdvLnViZXIub3JnL3phcDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9jcnlwdG8vc3NoIj5nb2xhbmcub3JnL3gvY3J5cHRvL3NzaDwvYT48bGk+PGEgaHJlZj0iL2dvbGFuZy5vcmcveC9uZXQvY29udGV4dCI+Z29sYW5nLm9yZy94L25ldC9jb250ZXh0PC9hPjxsaT48YSBocmVmPSIvZ29sYW5nLm9yZy94L29hdXRoMiI+Z29sYW5nLm9yZy94L29hdXRoMjwvYT48bGk+PGEgaHJlZj0iL2dvb2dsZS5nb2xhbmcub3JnL2dycGMiPmdvb2dsZS5nb2xhbmcub3JnL2dycGM8L2E+PGxpPjxhIGhyZWY9Ii9nb3BrZy5pbi9tZ28udjIiPmdvcGtnLmluL21nby52MjwvYT48bGk+PGEgaHJlZj0iL2dvcGtnLmluL3lhbWwudjIiPmdvcGtnLmluL3lhbWwudjI8L2E+PGxpPjxhIGhyZWY9Ii9sYWJpeC5vcmcvdjIvbWdvIj5sYWJpeC5vcmcvdjIvbWdvPC9hPgogICAgICA8L3VsPgogICAgCiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29sLXNtLTYiPgogICAgPGg0Pk1vcmUgUGFja2FnZXM8L2g0PgogICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIj4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL2dvIj5HbyBTdGFuZGFyZCBQYWNrYWdlczwvYT4KICAgICAgPGxpPjxhIGhyZWY9Ii8tL3N1YnJlcG8iPkdvIFN1Yi1yZXBvc2l0b3J5IFBhY2thZ2VzPC9hPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9nb2xhbmcub3JnL3dpa2kvUHJvamVjdHMiPlByb2plY3RzIEAgZ28td2lraTwvYT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zZWFyY2g/bz1kZXNjJmFtcDtxPWxhbmd1YWdlJTNBZ28mYW1wO3M9c3RhcnMmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5Nb3N0IHN0YXJzPC9hPiwgCiAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NlYXJjaD9vPWRlc2MmYW1wO3E9bGFuZ3VhZ2UlM0FnbyZhbXA7cz1mb3JrcyZhbXA7dHlwZT1SZXBvc2l0b3JpZXMiPm1vc3QgZm9ya3M8L2E+LCAKICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2VhcmNoP289ZGVzYyZhbXA7cT1sYW5ndWFnZSUzQWdvJmFtcDtzPXVwZGF0ZWQmYW1wO3R5cGU9UmVwb3NpdG9yaWVzIj5yZWNlbnRseSB1cGRhdGVkPC9hPiBvbiBHaXRIdWIKICAgIDwvdWw+CiAgPC9kaXY+CjwvZGl2PgoKCjwvZGl2Pgo8ZGl2IGlkPSJ4LWZvb3RlciIgY2xhc3M9ImNsZWFyZml4Ij4KICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2dvbGFuZy9nZGRvL2lzc3VlcyI+V2Vic2l0ZSBJc3N1ZXM8L2E+CiAgICA8c3BhbiBjbGFzcz0idGV4dC1tdXRlZCI+fDwvc3Bhbj4gPGEgaHJlZj0iaHR0cDovL2dvbGFuZy5vcmcvIj5HbyBMYW5ndWFnZTwvYT4KICAgIDxzcGFuIGNsYXNzPSJwdWxsLXJpZ2h0Ij48YSBocmVmPSIjIj5CYWNrIHRvIHRvcDwvYT48L3NwYW4+CiAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ieC1zaG9ydGN1dHMiIHRhYmluZGV4PSItMSIgY2xhc3M9Im1vZGFsIj4KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+CiAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvYnV0dG9uPgogICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+S2V5Ym9hcmQgc2hvcnRjdXRzPC9oND4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4/PC9iPjwvdGQ+PHRkPiA6IFRoaXMgbWVudTwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj4vPC9iPjwvdGQ+PHRkPiA6IFNlYXJjaCBzaXRlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5mPC9iPjwvdGQ+PHRkPiA6IEp1bXAgdG8gaWRlbnRpZmllcjwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmc8L2I+PC90ZD48dGQ+IDogR28gdG8gdG9wIG9mIHBhZ2U8L3RkPjwvdHI+CiAgICAgICAgICA8dHI+PHRkIGFsaWduPSJyaWdodCI+PGI+ZzwvYj4gdGhlbiA8Yj5iPC9iPjwvdGQ+PHRkPiA6IEdvIHRvIGVuZCBvZiBwYWdlPC90ZD48L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJ0ZXh0LW11dGVkIj48dGQgYWxpZ249InJpZ2h0Ij48Yj5nPC9iPiB0aGVuIDxiPmk8L2I+PC90ZD48dGQ+IDogR28gdG8gaW5kZXg8L3RkPjwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9InRleHQtbXV0ZWQiPjx0ZCBhbGlnbj0icmlnaHQiPjxiPmc8L2I+IHRoZW4gPGI+ZTwvYj48L3RkPjx0ZD4gOiBHbyB0byBleGFtcGxlczwvdGQ+PC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KPHNjcmlwdCBzcmM9Ii8tL2pxdWVyeS0yLjAuMy5taW4uanM/dj1mYmY5Yzc3ZDBjNGUzYzM0YTQ4NTk4MGMxZTUzMTZiNjIxMjE2MGM4Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL2Jvb3RzdHJhcC5taW4uanM/dj01YWRhN2MxMDNmYzFkZWFiYzkyNWNjMWZkYmJiNmU0NTFjMjFmYzcwIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8tL3NpdGUuanM/dj0zNzFkZTczMWMxOGQ5MWM0OTlkOTBiMWFiMGJmMzllY2Y2NmQ2Y2Y3Ij48L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+" } }, { "ID": "f7ae4a04c8e15618", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "6354" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:28:31 GMT" ], "Etag": [ "\"0f6a7c9ff3d3d770b8f7fa19c2ae19d0\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:31 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "rRfgZLcglv08Foy2n2Iw5sU10iBfo4Ht3IeGeMZOd2rfdcw5utLaKhk/SpjS20nIeN08DIhv693xmOIIXLKdq+x6ms79oaA4" ], "X-Amz-Request-Id": [ "0R45FDJ2CPJDB4F3" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "fa1213ddcf16c95d", "Request": { "Method": "HEAD", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Content-Length": [ "6354" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 19 Mar 2026 15:28:31 GMT" ], "Etag": [ "\"0f6a7c9ff3d3d770b8f7fa19c2ae19d0\"" ], "Last-Modified": [ "Thu, 19 Mar 2026 15:28:31 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "J44kjrgTA+7UlQG3WqKYbyZGN4ZNs7s3ev+Bk99OzsDIbkTcrl2NMoAU0iR8F2fxAB8XXI9s0dA9eC5CORa+1RqsxpsOxkmC" ], "X-Amz-Request-Id": [ "0R4FXC029BWYKYDS" ], "X-Amz-Server-Side-Encryption": [ "AES256" ] }, "Body": "" } }, { "ID": "c1ece5fa4580017a", "Request": { "Method": "DELETE", "URL": "https://go-cloud-testing-2.s3.us-west-1.amazonaws.com/blob-for-reading?x-id=DeleteObject", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "User-Agent": [ "CLEARED" ], "X-Amz-Content-Sha256": [ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ null ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Date": [ "Thu, 19 Mar 2026 15:28:31 GMT" ], "Server": [ "AmazonS3" ], "X-Amz-Id-2": [ "QZuYkhR+NKhylqdix4IsG+zTJv6K1svia3L1kWgyKwsf/rCZoaGIE9DOBPnCPCszb8LEBuNTNWu+Me0JramRCSOhHF/iZPBR" ], "X-Amz-Request-Id": [ "0R48VJTW5Q5FQBT4" ] }, "Body": "" } } ] } ================================================ FILE: blob/s3blob/testdata/TestOpenBucket/empty_bucket_name_results_in_error.replay ================================================ { "Initial": "AQAAAA7hTg0wDiZvowAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": null } ================================================ FILE: blob/s3blob/testdata/TestOpenBucket/empty_bucket_name_results_in_error_V2.replay ================================================ { "Initial": "AQAAAA7fe2/sO5bkMQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": null } ================================================ FILE: blob/s3blob/testdata/TestOpenBucket/success.replay ================================================ { "Initial": "AQAAAA7hTg0wDjU7LgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": null } ================================================ FILE: blob/s3blob/testdata/TestOpenBucket/success_V2.replay ================================================ { "Initial": "AQAAAA7fe2/tABc27wAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": null } ================================================ FILE: blob/wrapped_bucket_test.go ================================================ package blob_test import ( "context" "os" "path/filepath" "strings" "testing" "gocloud.dev/blob" "gocloud.dev/blob/fileblob" ) func TestPrefixedBucket(t *testing.T) { dir := t.TempDir() bucket, err := fileblob.OpenBucket(dir, nil) if err != nil { t.Fatal(err) } const contents = "contents" ctx := context.Background() if err := bucket.WriteAll(ctx, "foo/bar/baz.txt", []byte(contents), nil); err != nil { t.Fatal(err) } wrapped := blob.PrefixedBucket(bucket, "foo/bar/") defer wrapped.Close() got, err := wrapped.ReadAll(ctx, "baz.txt") if err != nil { t.Fatal(err) } if string(got) != contents { t.Errorf("got %q want %q", string(got), contents) } } func TestSingleKeyBucket(t *testing.T) { dir := t.TempDir() bucket, err := fileblob.OpenBucket(dir, nil) if err != nil { t.Fatal(err) } const contents = "contents" ctx := context.Background() if err := bucket.WriteAll(ctx, "foo/bar.txt", []byte(contents), nil); err != nil { t.Fatal(err) } dirpath := filepath.ToSlash(dir) if os.PathSeparator != '/' && !strings.HasPrefix(dirpath, "/") { dirpath = "/" + dirpath } wrapped, err := blob.OpenBucket(ctx, "file://"+dirpath+"?key=foo/bar.txt") if err != nil { t.Fatal(err) } defer wrapped.Close() got, err := wrapped.ReadAll(ctx, "") if err != nil { t.Fatal(err) } if string(got) != contents { t.Errorf("got %q want %q", string(got), contents) } } ================================================ FILE: contrib/upgrade-dependency.sh ================================================ #!/usr/bin/env bash # Upgrade a dependency across all dependent submodules. # # Usage: # ./contrib/upgrade-dependency.sh github.com/foo/bar # # Requires ripgrep. if [[ -z "$1" ]]; then echo "Usage: ./contrib/upgrade-dependency.sh github.com/foo/bar" exit 1 fi if [[ -z "$(which rg)" ]]; then echo "This script requires ripgrep. Please visit https://github.com/BurntSushi/ripgrep to learn how to install this utility." exit 1 fi set -euo pipefail DEPENDENCY="$1" printf "%s\n" "Upgrading \"$DEPENDENCY\"." ROOT="$(git rev-parse --show-toplevel)" GO_MOD_FILES=$(rg -l "$DEPENDENCY" | grep "go.mod") printf "%s\n" "Module files to adjust: ${GO_MOD_FILES//$'\n'/, }." for f in ${GO_MOD_FILES}; do MODULE_PATH="$(dirname "$f")" printf "%s\n" "Upgrading \"$DEPENDENCY\" in \"$MODULE_PATH\"." set -x cd "$MODULE_PATH" go get -u "$DEPENDENCY" go mod tidy cd "$ROOT" set +x done ================================================ FILE: doc.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /* Package cloud contains a library and tools for open cloud development in Go. The Go Cloud Development Kit (Go CDK) allows application developers to seamlessly deploy cloud applications on any combination of cloud providers. It does this by providing stable, idiomatic interfaces for common uses like storage and databases. Think `database/sql` for cloud products. At the core of the Go CDK are common "portable types", implemented on top of service-specific drivers for supported cloud services. For example, objects of the blob.Bucket portable type can be created using gcsblob.OpenBucket, s3blob.OpenBucket, or any other Go CDK driver. Then, the blob.Bucket can be used throughout your application without worrying about the underlying implementation. The Go CDK works well with a code generator called Wire (https://github.com/google/wire/blob/master/README.md). It creates human-readable code that only imports the cloud SDKs for drivers you use. This allows the Go CDK to grow to support any number of cloud services, without increasing compile times or binary sizes, and avoiding any side effects from `init()` functions. For non-reference documentation, see https://gocloud.dev/ # URLs See https://gocloud.dev/concepts/urls/ for a discussion of URLs in the Go CDK. # As See https://gocloud.dev/concepts/as/ for a discussion of how to write service-specific code with the Go CDK. */ package cloud // import "gocloud.dev" ================================================ FILE: docstore/awsdynamodb/v2/benchmark_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package awsdynamodb import ( "context" "fmt" "strconv" "testing" awsv2cfg "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression" "github.com/aws/aws-sdk-go-v2/service/dynamodb" dyn2Types "github.com/aws/aws-sdk-go-v2/service/dynamodb/types" ) var benchmarkTableName = collectionName3 func BenchmarkPutVSTransact(b *testing.B) { // This benchmark compares two ways to replace N items and retrieve their previous values. // The first way makes N calls to PutItem with ReturnValues set to ALL_OLD. // The second way calls BatchGetItem followed by TransactWriteItem. // // The results show that separate PutItems are faster for up to two items. cfg, err := awsv2cfg.LoadDefaultConfig(context.Background()) if err != nil { b.Fatal("Error initializing aws session for benchmark: ", err) } db := dynamodb.NewFromConfig(cfg) for nItems := 1; nItems <= 5; nItems++ { b.Run(fmt.Sprintf("%d-Items", nItems), func(b *testing.B) { var items []map[string]dyn2Types.AttributeValue for i := 0; i < nItems; i++ { items = append(items, map[string]dyn2Types.AttributeValue{ "name": &dyn2Types.AttributeValueMemberS{Value: fmt.Sprintf("pt-vs-transact-%d", i)}, "x": &dyn2Types.AttributeValueMemberN{Value: strconv.Itoa(i)}, "rev": &dyn2Types.AttributeValueMemberN{Value: "1"}, }) } for _, item := range items { _, err := db.PutItem(context.Background(), &dynamodb.PutItemInput{ TableName: &benchmarkTableName, Item: item, }) if err != nil { b.Fatal(err) } } b.Run("PutItem", func(b *testing.B) { for n := 0; n < b.N; n++ { putItems(b, db, items) } }) b.Run("TransactWrite", func(b *testing.B) { for n := 0; n < b.N; n++ { batchGetTransactWrite(b, db, items) } }) }) } } func putItems(b *testing.B, db *dynamodb.Client, items []map[string]dyn2Types.AttributeValue) { b.Helper() for i, item := range items { item["x"] = &dyn2Types.AttributeValueMemberN{Value: strconv.Itoa(i + 1)} in := &dynamodb.PutItemInput{ TableName: &benchmarkTableName, Item: item, ReturnValues: dyn2Types.ReturnValueAllOld, } ce, err := expression.NewBuilder(). WithCondition(expression.Name("rev").Equal(expression.Value(1))). Build() if err != nil { b.Fatal(err) } in.ExpressionAttributeNames = ce.Names() in.ExpressionAttributeValues = ce.Values() in.ConditionExpression = ce.Condition() out, err := db.PutItem(context.Background(), in) if err != nil { b.Fatal(err) } if got, want := len(out.Attributes), 3; got != want { b.Fatalf("got %d attributes, want %d", got, want) } } } func batchGetTransactWrite(b *testing.B, db *dynamodb.Client, items []map[string]dyn2Types.AttributeValue) { b.Helper() keys := make([]map[string]dyn2Types.AttributeValue, len(items)) tws := make([]dyn2Types.TransactWriteItem, len(items)) for i, item := range items { keys[i] = map[string]dyn2Types.AttributeValue{"name": items[i]["name"]} item["x"] = &dyn2Types.AttributeValueMemberN{Value: strconv.Itoa(i + 2)} put := &dyn2Types.Put{TableName: &benchmarkTableName, Item: items[i]} ce, err := expression.NewBuilder(). WithCondition(expression.Name("rev").Equal(expression.Value(1))). Build() if err != nil { b.Fatal(err) } put.ExpressionAttributeNames = ce.Names() put.ExpressionAttributeValues = ce.Values() put.ConditionExpression = ce.Condition() tws[i] = dyn2Types.TransactWriteItem{Put: put} } _, err := db.BatchGetItem(context.Background(), &dynamodb.BatchGetItemInput{ RequestItems: map[string]dyn2Types.KeysAndAttributes{ benchmarkTableName: {Keys: keys}, }, }) if err != nil { b.Fatal(err) } _, err = db.TransactWriteItems(context.Background(), &dynamodb.TransactWriteItemsInput{TransactItems: tws}) if err != nil { b.Fatal(err) } } ================================================ FILE: docstore/awsdynamodb/v2/codec.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package awsdynamodb import ( "errors" "fmt" "reflect" "strconv" "time" dyn2Types "github.com/aws/aws-sdk-go-v2/service/dynamodb/types" "gocloud.dev/docstore/driver" ) var nullValue = &dyn2Types.AttributeValueMemberNULL{Value: true} type encoder struct { av dyn2Types.AttributeValue } func (e *encoder) EncodeNil() { e.av = nullValue } func (e *encoder) EncodeBool(x bool) { e.av = &dyn2Types.AttributeValueMemberBOOL{Value: x} } func (e *encoder) EncodeInt(x int64) { e.av = &dyn2Types.AttributeValueMemberN{Value: strconv.FormatInt(x, 10)} } func (e *encoder) EncodeUint(x uint64) { e.av = &dyn2Types.AttributeValueMemberN{Value: strconv.FormatUint(x, 10)} } func (e *encoder) EncodeBytes(x []byte) { e.av = &dyn2Types.AttributeValueMemberB{Value: x} } func (e *encoder) EncodeFloat(x float64) { e.av = encodeFloat(x) } func (e *encoder) ListIndex(int) { panic("impossible") } func (e *encoder) MapKey(string) { panic("impossible") } func (e *encoder) EncodeString(x string) { if len(x) == 0 { e.av = nullValue } else { e.av = &dyn2Types.AttributeValueMemberS{Value: x} } } func (e *encoder) EncodeComplex(x complex128) { e.av = &dyn2Types.AttributeValueMemberL{Value: []dyn2Types.AttributeValue{encodeFloat(real(x)), encodeFloat(imag(x))}} } func (e *encoder) EncodeList(n int) driver.Encoder { s := make([]dyn2Types.AttributeValue, n) e.av = &dyn2Types.AttributeValueMemberL{Value: s} return &listEncoder{s: s} } func (e *encoder) EncodeMap(n int) driver.Encoder { m := make(map[string]dyn2Types.AttributeValue, n) e.av = &dyn2Types.AttributeValueMemberM{Value: m} return &mapEncoder{m: m} } var typeOfGoTime = reflect.TypeFor[time.Time]() // EncodeSpecial encodes time.Time specially. func (e *encoder) EncodeSpecial(v reflect.Value) (bool, error) { switch v.Type() { case typeOfGoTime: ts := v.Interface().(time.Time).Format(time.RFC3339Nano) e.EncodeString(ts) default: return false, nil } return true, nil } type listEncoder struct { s []dyn2Types.AttributeValue encoder } func (e *listEncoder) ListIndex(i int) { e.s[i] = e.av } type mapEncoder struct { m map[string]dyn2Types.AttributeValue encoder } func (e *mapEncoder) MapKey(k string) { e.m[k] = e.av } func encodeDoc(doc driver.Document) (dyn2Types.AttributeValue, error) { var e encoder if err := doc.Encode(&e); err != nil { return nil, err } return e.av, nil } // Encode the key fields of the given document into a map AttributeValue. // pkey and skey are the names of the partition key field and the sort key field. // pkey must always be non-empty, but skey may be empty if the collection has no sort key. func encodeDocKeyFields(doc driver.Document, pkey, skey string) (*dyn2Types.AttributeValueMemberM, error) { m := map[string]dyn2Types.AttributeValue{} set := func(fieldName string) error { fieldVal, err := doc.GetField(fieldName) if err != nil { return err } attrVal, err := encodeValue(fieldVal) if err != nil { return err } m[fieldName] = attrVal return nil } if err := set(pkey); err != nil { return nil, err } if skey != "" { if err := set(skey); err != nil { return nil, err } } return &dyn2Types.AttributeValueMemberM{Value: m}, nil } func encodeValue(v any) (dyn2Types.AttributeValue, error) { var e encoder if err := driver.Encode(reflect.ValueOf(v), &e); err != nil { return nil, err } return e.av, nil } func encodeFloat(f float64) dyn2Types.AttributeValue { return &dyn2Types.AttributeValueMemberN{Value: strconv.FormatFloat(f, 'f', -1, 64)} } //////////////////////////////////////////////////////////////// func decodeDoc(item dyn2Types.AttributeValue, doc driver.Document) error { return doc.Decode(decoder{av: item}) } type decoder struct { av dyn2Types.AttributeValue } func (d decoder) String() string { if s, ok := d.av.(fmt.Stringer); ok { return s.String() } return fmt.Sprint(d.av) } func (d decoder) AsBool() (bool, bool) { i, ok := d.av.(*dyn2Types.AttributeValueMemberBOOL) if !ok { return false, false } return i.Value, true } func (d decoder) AsNull() bool { i, ok := d.av.(*dyn2Types.AttributeValueMemberNULL) if !ok { return false } return i.Value } func (d decoder) AsString() (string, bool) { // Empty string is represented by NULL. _, ok := d.av.(*dyn2Types.AttributeValueMemberNULL) if ok { return "", true } i, ok := d.av.(*dyn2Types.AttributeValueMemberS) if !ok { return "", false } return i.Value, true } func (d decoder) AsInt() (int64, bool) { i, ok := d.av.(*dyn2Types.AttributeValueMemberN) if !ok { return 0, false } v, err := strconv.ParseInt(i.Value, 10, 64) if err != nil { return 0, false } return v, true } func (d decoder) AsUint() (uint64, bool) { i, ok := d.av.(*dyn2Types.AttributeValueMemberN) if !ok { return 0, false } v, err := strconv.ParseUint(i.Value, 10, 64) if err != nil { return 0, false } return v, true } func (d decoder) AsFloat() (float64, bool) { i, ok := d.av.(*dyn2Types.AttributeValueMemberN) if !ok { return 0, false } v, err := strconv.ParseFloat(i.Value, 64) if err != nil { return 0, false } return v, true } func (d decoder) AsComplex() (complex128, bool) { iface, ok := d.av.(*dyn2Types.AttributeValueMemberL) if !ok { return 0, false } if len(iface.Value) != 2 { return 0, false } r, ok := decoder{iface.Value[0]}.AsFloat() if !ok { return 0, false } i, ok := decoder{iface.Value[1]}.AsFloat() if !ok { return 0, false } return complex(r, i), true } func (d decoder) AsBytes() ([]byte, bool) { i, ok := d.av.(*dyn2Types.AttributeValueMemberB) if !ok { return nil, false } return i.Value, true } func (d decoder) ListLen() (int, bool) { i, ok := d.av.(*dyn2Types.AttributeValueMemberL) if !ok { return 0, false } return len(i.Value), true } func (d decoder) DecodeList(f func(i int, vd driver.Decoder) bool) { iface, ok := d.av.(*dyn2Types.AttributeValueMemberL) if !ok { // V1 behavior treated this as indistinct from an empty list, // which this return replicates. // Should this be explicitly handled in some way? return } for i, el := range iface.Value { if !f(i, decoder{el}) { break } } } func (d decoder) MapLen() (int, bool) { i, ok := d.av.(*dyn2Types.AttributeValueMemberM) if !ok { return 0, false } return len(i.Value), true } func (d decoder) DecodeMap(f func(key string, vd driver.Decoder, exactMatch bool) bool) { i, ok := d.av.(*dyn2Types.AttributeValueMemberM) if !ok { // V1 behavior treated this as indistinct from an empty map, // which this return replicates. // Should this be explicitly handled in some way? return } for k, av := range i.Value { if !f(k, decoder{av}, true) { break } } } func (d decoder) AsInterface() (any, error) { return toGoValue(d.av) } func toGoValue(av dyn2Types.AttributeValue) (any, error) { switch v := av.(type) { case *dyn2Types.AttributeValueMemberNULL: return nil, nil case *dyn2Types.AttributeValueMemberBOOL: return v.Value, nil case *dyn2Types.AttributeValueMemberN: f, err := strconv.ParseFloat(v.Value, 64) if err != nil { return nil, err } i := int64(f) if float64(i) == f { return i, nil } u := uint64(f) if float64(u) == f { return u, nil } return f, nil case *dyn2Types.AttributeValueMemberB: return v.Value, nil case *dyn2Types.AttributeValueMemberS: return v.Value, nil case *dyn2Types.AttributeValueMemberL: s := make([]any, len(v.Value)) for i, v := range v.Value { x, err := toGoValue(v) if err != nil { return nil, err } s[i] = x } return s, nil case *dyn2Types.AttributeValueMemberM: m := make(map[string]any, len(v.Value)) for k, v := range v.Value { x, err := toGoValue(v) if err != nil { return nil, err } m[k] = x } return m, nil default: return nil, fmt.Errorf("awsdynamodb: AttributeValue %s not supported", av) } } func (d decoder) AsSpecial(v reflect.Value) (bool, any, error) { unsupportedTypes := `unsupported type, the docstore driver for DynamoDB does not decode DynamoDB set types, such as string set, number set and binary set` switch d.av.(type) { case *dyn2Types.AttributeValueMemberSS: return true, nil, errors.New(unsupportedTypes) case *dyn2Types.AttributeValueMemberNS: return true, nil, errors.New(unsupportedTypes) case *dyn2Types.AttributeValueMemberBS: return true, nil, errors.New(unsupportedTypes) } switch v.Type() { case typeOfGoTime: i, ok := d.av.(*dyn2Types.AttributeValueMemberS) if !ok { return false, nil, errors.New("expected string field for time.Time") } t, err := time.Parse(time.RFC3339Nano, i.Value) return true, t, err } return false, nil, nil } ================================================ FILE: docstore/awsdynamodb/v2/codec_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package awsdynamodb import ( "reflect" "testing" dynattr "github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue" dyn2Types "github.com/aws/aws-sdk-go-v2/service/dynamodb/types" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "gocloud.dev/docstore/driver" "gocloud.dev/docstore/drivertest" ) var compareIgnoreAttributeUnexported = cmpopts.IgnoreUnexported( dyn2Types.AttributeValueMemberB{}, dyn2Types.AttributeValueMemberBOOL{}, dyn2Types.AttributeValueMemberBS{}, dyn2Types.AttributeValueMemberL{}, dyn2Types.AttributeValueMemberM{}, dyn2Types.AttributeValueMemberN{}, dyn2Types.AttributeValueMemberNS{}, dyn2Types.AttributeValueMemberNULL{}, dyn2Types.AttributeValueMemberS{}, dyn2Types.AttributeValueMemberSS{}, ) func TestEncodeValue(t *testing.T) { avn := func(s string) dyn2Types.AttributeValue { return &dyn2Types.AttributeValueMemberN{Value: s} } avl := func(avs ...dyn2Types.AttributeValue) dyn2Types.AttributeValue { return &dyn2Types.AttributeValueMemberL{Value: avs} } var seven int32 = 7 var nullptr *int for _, test := range []struct { in any want dyn2Types.AttributeValue }{ // null {nil, nullValue}, {nullptr, nullValue}, // number {0, avn("0")}, {uint64(999), avn("999")}, {3.5, avn("3.5")}, {seven, avn("7")}, {&seven, avn("7")}, // string {"", nullValue}, {"x", &dyn2Types.AttributeValueMemberS{Value: "x"}}, {"abc123", &dyn2Types.AttributeValueMemberS{Value: "abc123"}}, {"abc 123", &dyn2Types.AttributeValueMemberS{Value: "abc 123"}}, // bool {true, &dyn2Types.AttributeValueMemberBOOL{Value: true}}, {false, &dyn2Types.AttributeValueMemberBOOL{Value: false}}, // list {[]int(nil), nullValue}, {[]int{}, &dyn2Types.AttributeValueMemberL{Value: []dyn2Types.AttributeValue{}}}, {[]int{1, 2}, avl(avn("1"), avn("2"))}, {[...]int{1, 2}, avl(avn("1"), avn("2"))}, {[]any{nil, false}, avl(nullValue, &dyn2Types.AttributeValueMemberBOOL{Value: false})}, // map {map[string]int(nil), nullValue}, {map[string]int{}, &dyn2Types.AttributeValueMemberM{Value: map[string]dyn2Types.AttributeValue{}}}, { map[string]int{"a": 1, "b": 2}, &dyn2Types.AttributeValueMemberM{Value: map[string]dyn2Types.AttributeValue{ "a": avn("1"), "b": avn("2"), }}, }, } { var e encoder if err := driver.Encode(reflect.ValueOf(test.in), &e); err != nil { t.Fatal(err) } got := e.av if !cmp.Equal(got, test.want, compareIgnoreAttributeUnexported) { t.Errorf("%#v: got %#v, want %#v", test.in, got, test.want) } } } func TestDecodeValue(t *testing.T) { avn := func(s string) dyn2Types.AttributeValue { return &dyn2Types.AttributeValueMemberN{Value: s} } avl := func(vals ...dyn2Types.AttributeValue) dyn2Types.AttributeValue { return &dyn2Types.AttributeValueMemberL{Value: vals} } for _, test := range []struct { in dyn2Types.AttributeValue want any }{ // null // {nullValue, nil}, // cant reflect new, how best to test? // bool {&dyn2Types.AttributeValueMemberBOOL{Value: false}, false}, {&dyn2Types.AttributeValueMemberBOOL{Value: true}, true}, // string {&dyn2Types.AttributeValueMemberS{Value: "x"}, "x"}, // int64 {avn("7"), int64(7)}, {avn("-7"), int64(-7)}, {avn("0"), int64(0)}, // uint64 {avn("7"), uint64(7)}, {avn("0"), uint64(0)}, // float64 {avn("7"), float64(7)}, {avn("0"), float64(0)}, {avn("3.1415"), float64(3.1415)}, // []byte {&dyn2Types.AttributeValueMemberB{Value: []byte(`123`)}, []byte(`123`)}, // List {avl(avn("12"), avn("37")), []int64{12, 37}}, {avl(avn("12"), avn("37")), []uint64{12, 37}}, {avl(avn("12.8"), avn("37.1")), []float64{12.8, 37.1}}, // Map { &dyn2Types.AttributeValueMemberM{Value: map[string]dyn2Types.AttributeValue{}}, map[string]int{}, }, { &dyn2Types.AttributeValueMemberM{Value: map[string]dyn2Types.AttributeValue{"a": avn("1"), "b": avn("2")}}, map[string]int{"a": 1, "b": 2}, }, } { var ( target = reflect.New(reflect.TypeOf(test.want)) ) dec := decoder{av: test.in} if err := driver.Decode(target.Elem(), dec); err != nil { t.Errorf(" error decoding value %#v, got error: %#v", test.in, err) continue } if !cmp.Equal(target.Elem().Interface(), test.want, compareIgnoreAttributeUnexported) { t.Errorf(" %#v: got %#v, want %#v", test.in, target.Elem().Interface(), test.want) } } } func TestDecodeErrorOnUnsupported(t *testing.T) { for _, tc := range []struct { in dyn2Types.AttributeValue out any }{ {&dyn2Types.AttributeValueMemberSS{Value: []string{"foo", "bar"}}, []string{}}, {&dyn2Types.AttributeValueMemberNS{Value: []string{"1.1", "-2.2", "3.3"}}, []float64{}}, {&dyn2Types.AttributeValueMemberBS{Value: [][]byte{{4}, {5}, {6}}}, [][]byte{}}, } { d := decoder{av: tc.in} if err := driver.Decode(reflect.ValueOf(tc.out), &d); err == nil { t.Error("got nil error, want unsupported error") } } } type codecTester struct{} func (ct *codecTester) UnsupportedTypes() []drivertest.UnsupportedType { return []drivertest.UnsupportedType{drivertest.BinarySet} } func (ct *codecTester) NativeEncode(obj any) (any, error) { return dynattr.Marshal(obj) } func (ct *codecTester) NativeDecode(value, dest any) error { return dynattr.Unmarshal(value.(dyn2Types.AttributeValue), dest) } func (ct *codecTester) DocstoreEncode(obj any) (any, error) { return encodeDoc(drivertest.MustDocument(obj)) } func (ct *codecTester) DocstoreDecode(value, dest any) error { return decodeDoc(value.(dyn2Types.AttributeValue), drivertest.MustDocument(dest)) } ================================================ FILE: docstore/awsdynamodb/v2/create_tables.sh ================================================ #!/usr/bin/env bash # Copyright 2019 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Creates the DynamoDB tables needed for tests. # # If a table already exists, this script will fail. To re-create the table, run # aws dynamodb delete-table --table-name ... # and wait until the deletion completes. # https://coderwall.com/p/fkfaqq/safer-bash-scripts-with-set-euxo-pipefail # except we want to keep going if there is a failure. set -uxo pipefail # The docstore-test-1 table has a single partition key called "name". aws dynamodb create-table \ --region us-east-2 \ --table-name docstore-test-1 \ --attribute-definitions AttributeName=name,AttributeType=S \ --key-schema AttributeName=name,KeyType=HASH \ --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 # The docstore-test-2 table has both a partition and a sort key, and two indexes. aws dynamodb create-table \ --region us-east-2 \ --table-name docstore-test-2 \ --attribute-definitions \ AttributeName=Game,AttributeType=S \ AttributeName=Player,AttributeType=S \ AttributeName=Score,AttributeType=N \ AttributeName=Time,AttributeType=S \ --key-schema AttributeName=Game,KeyType=HASH AttributeName=Player,KeyType=RANGE \ --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \ --local-secondary-indexes \ 'IndexName=local,KeySchema=[{AttributeName=Game,KeyType=HASH},{AttributeName=Score,KeyType=RANGE}],Projection={ProjectionType=ALL}' \ --global-secondary-indexes \ 'IndexName=global,KeySchema=[{AttributeName=Player,KeyType=HASH},{AttributeName=Time,KeyType=RANGE}],Projection={ProjectionType=ALL},ProvisionedThroughput={ReadCapacityUnits=5,WriteCapacityUnits=5}' ================================================ FILE: docstore/awsdynamodb/v2/dynamo.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package awsdynamodb provides a docstore implementation backed by Amazon // DynamoDB. // Use OpenCollection to construct a *docstore.Collection. // // # URLs // // For docstore.OpenCollection, awsdynamodb registers for the scheme // "dynamodb". The default URL opener will use an AWS session with the default // credentials and configuration; see // https://docs.aws.amazon.com/sdk-for-go/v2/developer-guide/configure-gosdk.html for more details. // To customize the URL opener, or for more details on the URL format, see // URLOpener. // See https://gocloud.dev/concepts/urls/ for background information. // // # As // // awsdynamodb exposes the following types for As: // - Collection.As: *dynamodb.DynamoDB // - ActionList.BeforeDo: *dynamodb.BatchGetItemInput or *dynamodb.PutItemInput or *dynamodb.DeleteItemInput // or *dynamodb.UpdateItemInput // - Query.BeforeQuery: *dynamodb.QueryInput or *dynamodb.ScanInput // - DocumentIterator: *dynamodb.QueryOutput or *dynamodb.ScanOutput // - ErrorAs: smithy.OperationError package awsdynamodb import ( "context" "errors" "fmt" "reflect" "strings" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression" dyn "github.com/aws/aws-sdk-go-v2/service/dynamodb" dyn2Types "github.com/aws/aws-sdk-go-v2/service/dynamodb/types" "github.com/aws/smithy-go" "github.com/google/wire" "gocloud.dev/docstore" "gocloud.dev/docstore/driver" "gocloud.dev/gcerrors" "gocloud.dev/internal/gcerr" ) // Set holds Wire providers for this package. var Set = wire.NewSet( wire.Struct(new(URLOpener)), ) type collection struct { db *dyn.Client table string // DynamoDB table name partitionKey string sortKey string description *dyn2Types.TableDescription opts *Options } // FallbackFunc is a function for executing queries that cannot be run by the built-in // awsdynamodb logic. See Options.RunQueryFunc for details. type FallbackFunc func(context.Context, *driver.Query, RunQueryFunc) (driver.DocumentIterator, error) // Options holds various options. type Options struct { // If false, queries that can only be executed by scanning the entire table // return an error instead (with the exception of a query with no filters). AllowScans bool // The name of the field holding the document revision. // Defaults to docstore.DefaultRevisionField. RevisionField string // If set, call this function on queries that we cannot execute at all (for // example, a query with an OrderBy clause that lacks an equality filter on a // partition key). The function should execute the query however it wishes, and // return an iterator over the results. It can use the RunQueryFunc passed as its // third argument to have the DynamoDB driver run a query, for instance a // modified version of the original query. // // If RunQueryFallback is nil, queries that cannot be executed will fail with a // error that has code Unimplemented. RunQueryFallback FallbackFunc // The maximum number of concurrent goroutines started for a single call to // ActionList.Do. If less than 1, there is no limit. MaxOutstandingActionRPCs int // If true, a strongly consistent read is used whenever possible, including // get, query, scan, etc.; default to false, where an eventually consistent // read is used. // // Not all read operations support this mode however, such as querying against // a global secondary index, the operation will return an InvalidArgument error // in such case, please check the official DynamoDB documentation for more // details. // // The native client for DynamoDB uses this option in a per-action basis, if // you need the flexibility to run both modes on the same collection, create // two collections with different mode. ConsistentRead bool } // RunQueryFunc is the type of the function passed to RunQueryFallback. type RunQueryFunc func(context.Context, *driver.Query) (driver.DocumentIterator, error) // OpenCollection creates a *docstore.Collection representing a DynamoDB collection. func OpenCollection(db *dyn.Client, tableName, partitionKey, sortKey string, opts *Options) (*docstore.Collection, error) { c, err := newCollection(db, tableName, partitionKey, sortKey, opts) if err != nil { return nil, err } return docstore.NewCollection(c), nil } func newCollection(db *dyn.Client, tableName, partitionKey, sortKey string, opts *Options) (*collection, error) { out, err := db.DescribeTable(context.Background(), &dyn.DescribeTableInput{TableName: &tableName}) if err != nil { return nil, err } if opts == nil { opts = &Options{} } if opts.RevisionField == "" { opts.RevisionField = docstore.DefaultRevisionField } return &collection{ db: db, table: tableName, partitionKey: partitionKey, sortKey: sortKey, description: out.Table, opts: opts, }, nil } // Key returns a two-element array with the partition key and sort key, if any. func (c *collection) Key(doc driver.Document) (any, error) { pkey, err := doc.GetField(c.partitionKey) if err != nil || pkey == nil || driver.IsEmptyValue(reflect.ValueOf(pkey)) { return nil, nil // missing key is not an error } keys := [2]any{pkey} if c.sortKey != "" { keys[1], _ = doc.GetField(c.sortKey) // ignore error since keys[1] is nil in that case } return keys, nil } func (c *collection) RevisionField() string { return c.opts.RevisionField } func (c *collection) RunActions(ctx context.Context, actions []*driver.Action, opts *driver.RunActionsOptions) driver.ActionListError { errs := make([]error, len(actions)) beforeGets, gets, writes, writesTx, afterGets := driver.GroupActions(actions) c.runGets(ctx, beforeGets, errs, opts) ch := make(chan struct{}) ch2 := make(chan struct{}) go func() { defer close(ch); c.runWrites(ctx, writes, errs, opts) }() go func() { defer close(ch2); c.transactWrite(ctx, writesTx, errs, opts) }() c.runGets(ctx, gets, errs, opts) <-ch <-ch2 c.runGets(ctx, afterGets, errs, opts) return driver.NewActionListError(errs) } func (c *collection) runGets(ctx context.Context, actions []*driver.Action, errs []error, opts *driver.RunActionsOptions) { const batchSize = 100 t := driver.NewThrottle(c.opts.MaxOutstandingActionRPCs) for _, group := range driver.GroupByFieldPath(actions) { n := len(group) / batchSize for i := range n { t.Acquire() go func(group []*driver.Action) { defer t.Release() c.batchGet(ctx, group, errs, opts, batchSize*i, batchSize*(i+1)-1) }(group) } if n*batchSize < len(group) { t.Acquire() go func(group []*driver.Action) { defer t.Release() c.batchGet(ctx, group, errs, opts, batchSize*n, len(group)-1) }(group) } } t.Wait() } func (c *collection) batchGet(ctx context.Context, gets []*driver.Action, errs []error, opts *driver.RunActionsOptions, start, end int) { // errors need to be mapped to the actions' indices. setErr := func(err error) { for i := start; i <= end; i++ { errs[gets[i].Index] = err } } keys := make([]map[string]dyn2Types.AttributeValue, 0, end-start+1) for i := start; i <= end; i++ { av, err := encodeDocKeyFields(gets[i].Doc, c.partitionKey, c.sortKey) if err != nil { errs[gets[i].Index] = err } keys = append(keys, av.Value) } ka := dyn2Types.KeysAndAttributes{ Keys: keys, ConsistentRead: aws.Bool(c.opts.ConsistentRead), } if len(gets[start].FieldPaths) != 0 { // We need to add the key fields if the user doesn't include them. The // BatchGet API doesn't return them otherwise. var hasP, hasS bool var nbs []expression.NameBuilder for _, fp := range gets[start].FieldPaths { p := strings.Join(fp, ".") nbs = append(nbs, expression.Name(p)) if p == c.partitionKey { hasP = true } else if p == c.sortKey { hasS = true } } if !hasP { nbs = append(nbs, expression.Name(c.partitionKey)) } if c.sortKey != "" && !hasS { nbs = append(nbs, expression.Name(c.sortKey)) } expr, err := expression.NewBuilder(). WithProjection(expression.AddNames(expression.ProjectionBuilder{}, nbs...)). Build() if err != nil { setErr(err) return } ka.ProjectionExpression = expr.Projection() ka.ExpressionAttributeNames = expr.Names() } in := &dyn.BatchGetItemInput{RequestItems: map[string]dyn2Types.KeysAndAttributes{c.table: ka}} if opts.BeforeDo != nil { if err := opts.BeforeDo(driver.AsFunc(in)); err != nil { setErr(err) return } } out, err := c.db.BatchGetItem(ctx, in) if err != nil { setErr(err) return } found := make([]bool, end-start+1) am := mapActionIndices(gets, start, end) for _, item := range out.Responses[c.table] { if item != nil { key := map[string]any{c.partitionKey: nil} if c.sortKey != "" { key[c.sortKey] = nil } keysOnly, err := driver.NewDocument(key) if err != nil { panic(err) } err = decodeDoc(&dyn2Types.AttributeValueMemberM{Value: item}, keysOnly) if err != nil { continue } decKey, err := c.Key(keysOnly) if err != nil { continue } i := am[decKey] errs[gets[i].Index] = decodeDoc(&dyn2Types.AttributeValueMemberM{Value: item}, gets[i].Doc) found[i-start] = true } } for delta, f := range found { if !f { errs[gets[start+delta].Index] = gcerr.Newf(gcerr.NotFound, nil, "item %v not found", gets[start+delta].Doc) } } } func mapActionIndices(actions []*driver.Action, start, end int) map[any]int { m := make(map[any]int) for i := start; i <= end; i++ { m[actions[i].Key] = i } return m } // runWrites executes all the writes as separate RPCs, concurrently. func (c *collection) runWrites(ctx context.Context, writes []*driver.Action, errs []error, opts *driver.RunActionsOptions) { var ops []*writeOp for _, w := range writes { op, err := c.newWriteOp(w, opts) if err != nil { errs[w.Index] = err } else { ops = append(ops, op) } } t := driver.NewThrottle(c.opts.MaxOutstandingActionRPCs) for _, op := range ops { t.Acquire() go func() { defer t.Release() err := op.run(ctx) a := op.action if err != nil { errs[a.Index] = err } else { errs[a.Index] = c.onSuccess(op) } }() } t.Wait() } // A writeOp describes a single write to DynamoDB. The write can be executed // on its own, or included as part of a transaction. type writeOp struct { action *driver.Action writeItem dyn2Types.TransactWriteItem // for inclusion in a transaction newPartitionKey string // for a Create on a document without a partition key newRevision string run func(context.Context) error // run as a single RPC } func (c *collection) newWriteOp(a *driver.Action, opts *driver.RunActionsOptions) (*writeOp, error) { switch a.Kind { case driver.Create, driver.Replace, driver.Put: return c.newPut(a, opts) case driver.Update: return c.newUpdate(a, opts) case driver.Delete: return c.newDelete(a, opts) default: panic("bad write kind") } } func (c *collection) newPut(a *driver.Action, opts *driver.RunActionsOptions) (*writeOp, error) { av, err := encodeDoc(a.Doc) if err != nil { return nil, err } avm, ok := av.(*dyn2Types.AttributeValueMemberM) if !ok { // should never happen, but handle return nil, fmt.Errorf("unable to put document, unable to encode to map") } mf := c.missingKeyField(avm.Value) if a.Kind != driver.Create && mf != "" { return nil, fmt.Errorf("missing key field %q", mf) } var newPartitionKey string if mf == c.partitionKey { newPartitionKey = driver.UniqueString() avm.Value[c.partitionKey] = &dyn2Types.AttributeValueMemberS{Value: newPartitionKey} } if c.sortKey != "" && mf == c.sortKey { // It doesn't make sense to generate a random sort key. return nil, fmt.Errorf("missing sort key %q", c.sortKey) } var rev string if a.Doc.HasField(c.opts.RevisionField) { rev = driver.UniqueString() if avm.Value[c.opts.RevisionField], err = encodeValue(rev); err != nil { return nil, err } } dput := &dyn2Types.Put{ TableName: &c.table, Item: avm.Value, } cb, err := c.precondition(a) if err != nil { return nil, err } if cb != nil { ce, err := expression.NewBuilder().WithCondition(*cb).Build() if err != nil { return nil, err } dput.ExpressionAttributeNames = ce.Names() dput.ExpressionAttributeValues = ce.Values() dput.ConditionExpression = ce.Condition() } return &writeOp{ action: a, writeItem: dyn2Types.TransactWriteItem{Put: dput}, newPartitionKey: newPartitionKey, newRevision: rev, run: func(ctx context.Context) error { return c.runPut(ctx, dput, a, opts) }, }, nil } func (c *collection) runPut(ctx context.Context, dput *dyn2Types.Put, a *driver.Action, opts *driver.RunActionsOptions) error { in := &dyn.PutItemInput{ TableName: dput.TableName, Item: dput.Item, ConditionExpression: dput.ConditionExpression, ExpressionAttributeNames: dput.ExpressionAttributeNames, ExpressionAttributeValues: dput.ExpressionAttributeValues, } if opts.BeforeDo != nil { if err := opts.BeforeDo(driver.AsFunc(in)); err != nil { return err } } _, err := c.db.PutItem(ctx, in) var ccf *dyn2Types.ConditionalCheckFailedException if errors.As(err, &ccf) { if a.Kind == driver.Create { err = gcerr.Newf(gcerr.AlreadyExists, err, "document already exists") } if rev, _ := a.Doc.GetField(c.opts.RevisionField); rev == nil && a.Kind == driver.Replace { err = gcerr.Newf(gcerr.NotFound, nil, "document not found") } } return err } func (c *collection) newDelete(a *driver.Action, opts *driver.RunActionsOptions) (*writeOp, error) { av, err := encodeDocKeyFields(a.Doc, c.partitionKey, c.sortKey) if err != nil { return nil, err } del := &dyn2Types.Delete{ TableName: &c.table, Key: av.Value, } cb, err := c.precondition(a) if err != nil { return nil, err } if cb != nil { ce, err := expression.NewBuilder().WithCondition(*cb).Build() if err != nil { return nil, err } del.ExpressionAttributeNames = ce.Names() del.ExpressionAttributeValues = ce.Values() del.ConditionExpression = ce.Condition() } return &writeOp{ action: a, writeItem: dyn2Types.TransactWriteItem{Delete: del}, run: func(ctx context.Context) error { in := &dyn.DeleteItemInput{ TableName: del.TableName, Key: del.Key, ConditionExpression: del.ConditionExpression, ExpressionAttributeNames: del.ExpressionAttributeNames, ExpressionAttributeValues: del.ExpressionAttributeValues, } if opts.BeforeDo != nil { if err := opts.BeforeDo(driver.AsFunc(in)); err != nil { return err } } _, err := c.db.DeleteItem(ctx, in) return err }, }, nil } func (c *collection) newUpdate(a *driver.Action, opts *driver.RunActionsOptions) (*writeOp, error) { av, err := encodeDocKeyFields(a.Doc, c.partitionKey, c.sortKey) if err != nil { return nil, err } var ub expression.UpdateBuilder for _, m := range a.Mods { // TODO(shantuo): check for invalid field paths fp := expression.Name(strings.Join(m.FieldPath, ".")) if inc, ok := m.Value.(driver.IncOp); ok { ub = ub.Add(fp, expression.Value(inc.Amount)) } else if m.Value == nil { ub = ub.Remove(fp) } else { ub = ub.Set(fp, expression.Value(m.Value)) } } var rev string if a.Doc.HasField(c.opts.RevisionField) { rev = driver.UniqueString() ub = ub.Set(expression.Name(c.opts.RevisionField), expression.Value(rev)) } cb, err := c.precondition(a) if err != nil { return nil, err } ce, err := expression.NewBuilder().WithCondition(*cb).WithUpdate(ub).Build() if err != nil { return nil, err } up := &dyn2Types.Update{ TableName: &c.table, Key: av.Value, ConditionExpression: ce.Condition(), UpdateExpression: ce.Update(), ExpressionAttributeNames: ce.Names(), ExpressionAttributeValues: ce.Values(), } return &writeOp{ action: a, writeItem: dyn2Types.TransactWriteItem{Update: up}, newRevision: rev, run: func(ctx context.Context) error { in := &dyn.UpdateItemInput{ TableName: up.TableName, Key: up.Key, ConditionExpression: up.ConditionExpression, UpdateExpression: up.UpdateExpression, ExpressionAttributeNames: up.ExpressionAttributeNames, ExpressionAttributeValues: up.ExpressionAttributeValues, } if opts.BeforeDo != nil { if err := opts.BeforeDo(driver.AsFunc(in)); err != nil { return err } } _, err := c.db.UpdateItem(ctx, in) return err }, }, nil } // Handle the effects of successful execution. func (c *collection) onSuccess(op *writeOp) error { // Set the new partition key (if any) and the new revision into the user's document. if op.newPartitionKey != "" { _ = op.action.Doc.SetField(c.partitionKey, op.newPartitionKey) // cannot fail } if op.newRevision != "" { return op.action.Doc.SetField(c.opts.RevisionField, op.newRevision) } return nil } func (c *collection) missingKeyField(m map[string]dyn2Types.AttributeValue) string { v, ok := m[c.partitionKey] if !ok { return c.partitionKey } if n, ok := v.(*dyn2Types.AttributeValueMemberNULL); ok && n.Value { return c.partitionKey } if c.sortKey != "" { v, ok := m[c.sortKey] if !ok { return c.sortKey } if n, ok := v.(*dyn2Types.AttributeValueMemberNULL); ok && n.Value { return c.sortKey } } return "" } // Construct the precondition for the action. func (c *collection) precondition(a *driver.Action) (*expression.ConditionBuilder, error) { switch a.Kind { case driver.Create: // Precondition: the document doesn't already exist. (Precisely: the partitionKey // field is not on the document.) c := expression.AttributeNotExists(expression.Name(c.partitionKey)) return &c, nil case driver.Replace, driver.Update: // Precondition: the revision matches, or if there is no revision, then // the document exists. cb, err := revisionPrecondition(a.Doc, c.opts.RevisionField) if err != nil { return nil, err } if cb == nil { c := expression.AttributeExists(expression.Name(c.partitionKey)) cb = &c } return cb, nil case driver.Put, driver.Delete: // Precondition: the revision matches, if any. return revisionPrecondition(a.Doc, c.opts.RevisionField) case driver.Get: // No preconditions on a Get. return nil, nil default: panic("bad action kind") } } // revisionPrecondition returns a DynamoDB expression that asserts that the // stored document's revision matches the revision of doc. func revisionPrecondition(doc driver.Document, revField string) (*expression.ConditionBuilder, error) { v, err := doc.GetField(revField) if err != nil { // field not present return nil, nil } if v == nil { // field is present, but nil return nil, nil } rev, ok := v.(string) if !ok { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "%s field contains wrong type: got %T, want string", revField, v) } if rev == "" { return nil, nil } // Value encodes rev to an attribute value. cb := expression.Name(revField).Equal(expression.Value(rev)) return &cb, nil } // transactWrite executes the write actions atomically: either they all succeed or they all fail together. func (c *collection) transactWrite(ctx context.Context, actions []*driver.Action, errs []error, opts *driver.RunActionsOptions) { if len(actions) == 0 { return } // all actions will fail atomically even if a single action fails setErr := func(err error) { for _, a := range actions { errs[a.Index] = err } } tws := make([]dyn2Types.TransactWriteItem, 0, len(actions)) var ops []*writeOp for _, w := range actions { op, err := c.newWriteOp(w, opts) if err != nil { setErr(err) return } else { ops = append(ops, op) tws = append(tws, op.writeItem) } } in := &dyn.TransactWriteItemsInput{ ClientRequestToken: aws.String(driver.UniqueString()), TransactItems: tws, } if opts.BeforeDo != nil { asFunc := func(i any) bool { p, ok := i.(**dyn.TransactWriteItemsInput) if !ok { return false } *p = in return true } if err := opts.BeforeDo(asFunc); err != nil { setErr(err) return } } if _, err := c.db.TransactWriteItems(ctx, in); err != nil { setErr(err) return } for _, op := range ops { errs[op.action.Index] = c.onSuccess(op) } } // RevisionToBytes implements driver.RevisionToBytes. func (c *collection) RevisionToBytes(rev any) ([]byte, error) { s, ok := rev.(string) if !ok { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "revision %v of type %[1]T is not a string", rev) } return []byte(s), nil } // BytesToRevision implements driver.BytesToRevision. func (c *collection) BytesToRevision(b []byte) (any, error) { return string(b), nil } func (c *collection) As(i any) bool { p, ok := i.(**dyn.Client) if !ok { return false } *p = c.db return true } // ErrorAs implements driver.Collection.ErrorAs. func (c *collection) ErrorAs(err error, i any) bool { e, ok := err.(*smithy.OperationError) if !ok { return false } p, ok := i.(*smithy.OperationError) if !ok { return false } *p = *e return true } func (c *collection) ErrorCode(err error) gcerrors.ErrorCode { var ( conditionalCheckFailedException *dyn2Types.ConditionalCheckFailedException idempotentParameterMismatchException *dyn2Types.IdempotentParameterMismatchException internalServerError *dyn2Types.InternalServerError itemCollectionSizeLimitExceededException *dyn2Types.ItemCollectionSizeLimitExceededException provisionedThroughputExceededException *dyn2Types.ProvisionedThroughputExceededException requestLimitExceeded *dyn2Types.RequestLimitExceeded resourceNotFoundException *dyn2Types.ResourceNotFoundException transactionCanceledException *dyn2Types.TransactionCanceledException transactionConflictException *dyn2Types.TransactionConflictException transactionInProgressException *dyn2Types.TransactionInProgressException ) switch { case errors.As(err, &conditionalCheckFailedException): return gcerrors.FailedPrecondition case errors.As(err, &idempotentParameterMismatchException): return gcerrors.InvalidArgument case errors.As(err, &internalServerError): return gcerrors.Internal case errors.As(err, &itemCollectionSizeLimitExceededException): return gcerrors.ResourceExhausted case errors.As(err, &provisionedThroughputExceededException): return gcerrors.ResourceExhausted case errors.As(err, &requestLimitExceeded): return gcerrors.ResourceExhausted case errors.As(err, &resourceNotFoundException): return gcerrors.NotFound case errors.As(err, &transactionCanceledException): return gcerrors.FailedPrecondition case errors.As(err, &transactionConflictException): return gcerrors.Internal case errors.As(err, &transactionInProgressException): return gcerrors.InvalidArgument } for k, errCode := range errorCodeMap { if strings.Contains(err.Error(), k) { return errCode } } return gcerrors.Unknown } var errorCodeMap = map[string]gcerrors.ErrorCode{ // handled by type above // "ConditionalCheckFailedException": gcerrors.FailedPrecondition, // "IdempotentParameterMismatchException": gcerrors.InvalidArgument, // "InternalServerErrorException": gcerrors.Internal, // "ItemCollectionSizeLimitExceededException": gcerrors.ResourceExhausted, // "ProvisionedThroughputExceededException": gcerrors.ResourceExhausted, // "RequestLimitExceededException": gcerrors.ResourceExhausted, // "ResourceNotFoundException": gcerrors.NotFound, // "TransactionCanceledException": gcerrors.FailedPrecondition, // "TransactionConflictException": gcerrors.Internal, // "TransactionInProgressException": gcerrors.InvalidArgument, // V2 doesn't have a type for this, inspect message instead "ValidationException": gcerrors.InvalidArgument, } // Close implements driver.Collection.Close. func (c *collection) Close() error { return nil } ================================================ FILE: docstore/awsdynamodb/v2/dynamo_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package awsdynamodb import ( "context" "errors" "fmt" "io" "testing" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/config" dyn "github.com/aws/aws-sdk-go-v2/service/dynamodb" "github.com/aws/smithy-go" "gocloud.dev/docstore" "gocloud.dev/docstore/driver" "gocloud.dev/docstore/drivertest" "gocloud.dev/gcerrors" "gocloud.dev/internal/testing/setup" ) // To create the tables and indexes needed for these tests, run create_tables.sh in // this directory. // // The docstore-test-2 table is set up to work with queries on the drivertest.HighScore // struct like so: // table: "Game" partition key, "Player" sort key // local index: "Game" partition key, "Score" sort key // global index: "Player" partition key, "Time" sort key // The conformance test queries should exercise all of these. // // The docstore-test-3 table is used for running benchmarks only. To eliminate // the effect of dynamo auto-scaling, run: // aws dynamodb update-table --table-name docstore-test-3 \ // --provisioned-throughput ReadCapacityUnits=1000,WriteCapacityUnits=1000 // Don't forget to change it back when done benchmarking. const ( region = "us-east-2" collectionName1 = "docstore-test-1" collectionName2 = "docstore-test-2" collectionName3 = "docstore-test-3" // for benchmark ) type harness struct { sess aws.Config closer func() } func (h *harness) SupportsAtomicWrites() bool { return true } func newHarness(ctx context.Context, t *testing.T) (drivertest.Harness, error) { t.Helper() // Many POST requests for DynamoDB are JSON maps, and they come in randomized // key order, so strict matching doesn't work. We disable it and count on ordering // and header matching. scrubBody := true sess, _, done, state := setup.NewAWSv2Config(ctx, t, region, scrubBody) drivertest.MakeUniqueStringDeterministicForTesting(state) return &harness{sess: sess, closer: done}, nil } func (*harness) BeforeDoTypes() []any { return []any{ &dyn.BatchGetItemInput{}, &dyn.TransactWriteItemsInput{}, &dyn.PutItemInput{}, &dyn.DeleteItemInput{}, &dyn.UpdateItemInput{}, } } func (*harness) BeforeQueryTypes() []any { return []any{&dyn.QueryInput{}, &dyn.ScanInput{}} } func (*harness) RevisionsEqual(rev1, rev2 any) bool { return rev1 == rev2 } func (h *harness) Close() { h.closer() } func (h *harness) MakeCollection(_ context.Context, kind drivertest.CollectionKind) (driver.Collection, error) { switch kind { case drivertest.SingleKey, drivertest.NoRev: return newCollection(dyn.NewFromConfig(h.sess), collectionName1, drivertest.KeyField, "", &Options{ AllowScans: true, ConsistentRead: true, }) case drivertest.TwoKey: // For query test we don't use strong consistency mode since some tests are // running on global secondary index and it doesn't support ConsistentRead. return newCollection(dyn.NewFromConfig(h.sess), collectionName2, "Game", "Player", &Options{ AllowScans: true, RunQueryFallback: InMemorySortFallback(func() any { return new(drivertest.HighScore) }), }) case drivertest.AltRev: return newCollection(dyn.NewFromConfig(h.sess), collectionName1, drivertest.KeyField, "", &Options{ AllowScans: true, RevisionField: drivertest.AlternateRevisionField, ConsistentRead: true, }) default: panic("bad kind") } } func collectHighScores(ctx context.Context, iter driver.DocumentIterator) ([]*drivertest.HighScore, error) { var hs []*drivertest.HighScore for { var h drivertest.HighScore doc := drivertest.MustDocument(&h) err := iter.Next(ctx, doc) if err == io.EOF { break } if err != nil { return nil, err } hs = append(hs, &h) } return hs, nil } type highScoreSliceIterator struct { hs []*drivertest.HighScore next int } func (it *highScoreSliceIterator) Next(ctx context.Context, doc driver.Document) error { if it.next >= len(it.hs) { return io.EOF } dest, ok := doc.Origin.(*drivertest.HighScore) if !ok { return fmt.Errorf("doc is %T, not HighScore", doc.Origin) } *dest = *it.hs[it.next] it.next++ return nil } func (*highScoreSliceIterator) Stop() {} func (*highScoreSliceIterator) As(any) bool { return false } type verifyAs struct{} func (verifyAs) Name() string { return "verify As" } func (verifyAs) CollectionCheck(coll *docstore.Collection) error { var db *dyn.Client if !coll.As(&db) { return errors.New("Collection.As failed") } return nil } func (verifyAs) QueryCheck(it *docstore.DocumentIterator) error { var so *dyn.ScanOutput var qo *dyn.QueryOutput if !it.As(&so) && !it.As(&qo) { return errors.New("DocumentIterator.As failed") } return nil } func (v verifyAs) ErrorCheck(k *docstore.Collection, err error) error { var e smithy.OperationError if !k.ErrorAs(err, &e) { return errors.New("Collection.ErrorAs failed") } return nil } func TestConformance(t *testing.T) { // Note: when running -record repeatedly in a short time period, change the argument // in the call below to generate unique transaction tokens. drivertest.MakeUniqueStringDeterministicForTesting(1) drivertest.RunConformanceTests(t, newHarness, &codecTester{}, []drivertest.AsTest{verifyAs{}}) } func BenchmarkConformance(b *testing.B) { cfg, err := config.LoadDefaultConfig(context.Background(), config.WithRegion(region)) if err != nil { b.Fatal("Error loading AWS config for benchmark: ", err) } coll, err := newCollection(dyn.NewFromConfig(cfg), collectionName3, drivertest.KeyField, "", &Options{AllowScans: true}) if err != nil { b.Fatal(err) } drivertest.RunBenchmarks(b, docstore.NewCollection(coll)) } // awsdynamodb-specific tests. func TestQueryErrors(t *testing.T) { // Verify that bad queries return the right errors. ctx := context.Background() h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() dc, err := h.MakeCollection(ctx, drivertest.TwoKey) if err != nil { t.Fatal(err) } coll := docstore.NewCollection(dc) defer coll.Close() // Here we are comparing a key field with the wrong type. DynamoDB cares about this // because even though it's a document store and hence schemaless, the key fields // do have a schema (that is, they have known, fixed types). iter := coll.Query().Where("Game", "=", 1).Get(ctx) defer iter.Stop() err = iter.Next(ctx, &h) if c := gcerrors.Code(err); c != gcerrors.InvalidArgument { t.Errorf("got %v (code %s, type %T), want InvalidArgument", err, c, err) } } ================================================ FILE: docstore/awsdynamodb/v2/example_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package awsdynamodb_test import ( "context" "log" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/dynamodb" "gocloud.dev/docstore" awsdynamodb "gocloud.dev/docstore/awsdynamodb/v2" ) func ExampleOpenCollection() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. cfg, err := config.LoadDefaultConfig(context.Background()) if err != nil { log.Fatal(err) } coll, err := awsdynamodb.OpenCollection( dynamodb.NewFromConfig(cfg), "docstore-test", "partitionKeyField", "", nil) if err != nil { log.Fatal(err) } defer coll.Close() } func Example_openCollectionFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/docstore/awsdynamodb" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // docstore.OpenCollection creates a *docstore.Collection from a URL. coll, err := docstore.OpenCollection(ctx, "dynamodb://my-table?partition_key=name") if err != nil { log.Fatal(err) } defer coll.Close() } ================================================ FILE: docstore/awsdynamodb/v2/query.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package awsdynamodb import ( "bytes" "context" "errors" "fmt" "io" "reflect" "sort" "strings" "time" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression" dyn "github.com/aws/aws-sdk-go-v2/service/dynamodb" dyn2Types "github.com/aws/aws-sdk-go-v2/service/dynamodb/types" "gocloud.dev/docstore/driver" "gocloud.dev/gcerrors" "gocloud.dev/internal/gcerr" ) // TODO: support parallel scans (http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Scan.html#Scan.ParallelScan) // TODO(jba): support an empty item slice returned from an RPC: "A Query operation can // return an empty result set and a LastEvaluatedKey if all the items read for the // page of results are filtered out." type avmap = map[string]dyn2Types.AttributeValue func (c *collection) RunGetQuery(ctx context.Context, q *driver.Query) (driver.DocumentIterator, error) { qr, err := c.planQuery(q) if err != nil { if gcerrors.Code(err) == gcerrors.Unimplemented && c.opts.RunQueryFallback != nil { return c.opts.RunQueryFallback(ctx, q, c.RunGetQuery) } return nil, err } if err := c.checkPlan(qr); err != nil { return nil, err } it := &documentIterator{ qr: qr, offset: q.Offset, limit: q.Limit, count: 0, // manually count limit since dynamodb uses "limit" as scan limit before filtering } it.items, it.last, it.asFunc, err = it.qr.run(ctx, nil) if err != nil { return nil, err } return it, nil } func (c *collection) checkPlan(qr *queryRunner) error { if qr.scanIn != nil && qr.scanIn.FilterExpression != nil && !c.opts.AllowScans { return gcerr.Newf(gcerr.InvalidArgument, nil, "query requires a table scan; set Options.AllowScans to true to enable") } return nil } func (c *collection) planQuery(q *driver.Query) (*queryRunner, error) { var cb expression.Builder cbUsed := false // It's an error to build an empty Builder. // Set up the projection expression. if len(q.FieldPaths) > 0 { var pb expression.ProjectionBuilder hasFields := map[string]bool{} for _, fp := range q.FieldPaths { if len(fp) == 1 { hasFields[fp[0]] = true } pb = pb.AddNames(expression.Name(strings.Join(fp, "."))) } // Always include the keys. for _, f := range []string{c.partitionKey, c.sortKey} { if f != "" && !hasFields[f] { pb = pb.AddNames(expression.Name(f)) q.FieldPaths = append(q.FieldPaths, []string{f}) } } cb = cb.WithProjection(pb) cbUsed = true } // Find the best thing to query (table or index). indexName, pkey, skey := c.bestQueryable(q) if indexName == nil && pkey == "" { // No query can be done: fall back to scanning. if q.OrderByField != "" { // Scans are unordered, so we can't run this query. // TODO(jba): If the user specifies all the partition keys, and there is a global // secondary index whose sort key is the order-by field, then we can query that index // for every value of the partition key and merge the results. // TODO(jba): If the query has a reasonable limit N, then we can run a scan and keep // the top N documents in memory. return nil, gcerr.Newf(gcerr.Unimplemented, nil, "query requires a table scan, but has an ordering requirement; add an index or provide Options.RunQueryFallback") } if len(q.Filters) > 0 { cb = cb.WithFilter(filtersToConditionBuilder(q.Filters)) cbUsed = true } in := &dyn.ScanInput{ TableName: &c.table, ConsistentRead: aws.Bool(c.opts.ConsistentRead), } if cbUsed { ce, err := cb.Build() if err != nil { return nil, err } in.ExpressionAttributeNames = ce.Names() in.ExpressionAttributeValues = ce.Values() in.FilterExpression = ce.Filter() in.ProjectionExpression = ce.Projection() } return &queryRunner{c: c, scanIn: in, beforeRun: q.BeforeQuery}, nil } // Do a query. cb = processFilters(cb, q.Filters, pkey, skey) ce, err := cb.Build() if err != nil { return nil, err } qIn := &dyn.QueryInput{ TableName: &c.table, IndexName: indexName, ExpressionAttributeNames: ce.Names(), ExpressionAttributeValues: ce.Values(), KeyConditionExpression: ce.KeyCondition(), FilterExpression: ce.Filter(), ProjectionExpression: ce.Projection(), ConsistentRead: aws.Bool(c.opts.ConsistentRead), } if q.OrderByField != "" && !q.OrderAscending { qIn.ScanIndexForward = &q.OrderAscending } return &queryRunner{ c: c, queryIn: qIn, beforeRun: q.BeforeQuery, }, nil } // Return the best choice of queryable (table or index) for this query. // How to interpret the return values: // - If indexName is nil but pkey is not empty, then use the table. // - If all return values are zero, no query will work: do a scan. func (c *collection) bestQueryable(q *driver.Query) (indexName *string, pkey, skey string) { // If the query has an "=" filter on the table's partition key, look at the table // and local indexes. if hasEqualityFilter(q, c.partitionKey) { // If the table has a sort key that's in the query, and the ordering // constraint works with the sort key, use the table. // (Query results are always ordered by sort key.) if hasFilter(q, c.sortKey) && orderingConsistent(q, c.sortKey) { return nil, c.partitionKey, c.sortKey } // Look at local indexes. They all have the same partition key as the base table. // If one has a sort key in the query, use it. for _, li := range c.description.LocalSecondaryIndexes { pkey, skey := keyAttributes(li.KeySchema) if hasFilter(q, skey) && localFieldsIncluded(q, li) && orderingConsistent(q, skey) { return li.IndexName, pkey, skey } } } // Consider the global indexes: if one has a matching partition and sort key, and // the projected fields of the index include those of the query, use it. for _, gi := range c.description.GlobalSecondaryIndexes { pkey, skey := keyAttributes(gi.KeySchema) if skey == "" { continue // We'll visit global indexes without a sort key later. } if hasEqualityFilter(q, pkey) && hasFilter(q, skey) && c.globalFieldsIncluded(q, gi) && orderingConsistent(q, skey) { return gi.IndexName, pkey, skey } } // There are no matches for both partition and sort key. Now consider matches on partition key only. // That will still be better than a scan. // First, check the table itself. if hasEqualityFilter(q, c.partitionKey) && orderingConsistent(q, c.sortKey) { return nil, c.partitionKey, c.sortKey } // No point checking local indexes: they have the same partition key as the table. // Check the global indexes. for _, gi := range c.description.GlobalSecondaryIndexes { pkey, skey := keyAttributes(gi.KeySchema) if hasEqualityFilter(q, pkey) && c.globalFieldsIncluded(q, gi) && orderingConsistent(q, skey) { return gi.IndexName, pkey, skey } } // We cannot do a query. // TODO: return the reason why we couldn't. At a minimum, distinguish failure due to keys // from failure due to projection (i.e. a global index had the right partition and sort key, // but didn't project the necessary fields). return nil, "", "" } // localFieldsIncluded reports whether a local index supports all the selected fields // of a query. Since DynamoDB will read explicitly provided fields from the table if // they are not projected into the index, the only case where a local index cannot // be used is when the query wants all the fields, and the index projection is not ALL. // See https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LSI.html#LSI.Projections. func localFieldsIncluded(q *driver.Query, li dyn2Types.LocalSecondaryIndexDescription) bool { return len(q.FieldPaths) > 0 || li.Projection.ProjectionType == dyn2Types.ProjectionTypeAll } // orderingConsistent reports whether the ordering constraint is consistent with the sort key field. // That is, either there is no OrderBy clause, or the clause specifies the sort field. func orderingConsistent(q *driver.Query, sortField string) bool { return q.OrderByField == "" || q.OrderByField == sortField } // globalFieldsIncluded reports whether the fields selected by the query are // projected into (that is, contained directly in) the global index. We need this // check before using the index, because if a global index doesn't have all the // desired fields, then a separate RPC for each returned item would be necessary to // retrieve those fields, and we'd rather scan than do that. func (c *collection) globalFieldsIncluded(q *driver.Query, gi dyn2Types.GlobalSecondaryIndexDescription) bool { proj := gi.Projection if proj.ProjectionType == dyn2Types.ProjectionTypeAll { // The index has all the fields of the table: we're good. return true } if len(q.FieldPaths) == 0 { // The query wants all the fields of the table, but we can't be sure that the // index has them. return false } // The table's keys and the index's keys are always in the index. pkey, skey := keyAttributes(gi.KeySchema) indexFields := map[string]bool{c.partitionKey: true, pkey: true} if c.sortKey != "" { indexFields[c.sortKey] = true } if skey != "" { indexFields[skey] = true } for _, nka := range proj.NonKeyAttributes { indexFields[nka] = true } // Every field path in the query must be in the index. for _, fp := range q.FieldPaths { if !indexFields[strings.Join(fp, ".")] { return false } } return true } // Extract the names of the partition and sort key attributes from the schema of a // table or index. func keyAttributes(ks []dyn2Types.KeySchemaElement) (pkey, skey string) { for _, k := range ks { switch k.KeyType { case dyn2Types.KeyTypeHash: pkey = *k.AttributeName case dyn2Types.KeyTypeRange: skey = *k.AttributeName default: panic("bad key type: " + k.KeyType) } } return pkey, skey } // Reports whether q has a filter that mentions the top-level field. func hasFilter(q *driver.Query, field string) bool { if field == "" { return false } for _, f := range q.Filters { if driver.FieldPathEqualsField(f.FieldPath, field) { return true } } return false } // Reports whether q has a filter that checks if the top-level field is equal to something. func hasEqualityFilter(q *driver.Query, field string) bool { for _, f := range q.Filters { if f.Op == driver.EqualOp && driver.FieldPathEqualsField(f.FieldPath, field) { return true } } return false } type queryRunner struct { c *collection scanIn *dyn.ScanInput queryIn *dyn.QueryInput beforeRun func(asFunc func(i any) bool) error } func (qr *queryRunner) run(ctx context.Context, startAfter avmap) (items []avmap, last avmap, asFunc func(i any) bool, err error) { if qr.scanIn != nil { qr.scanIn.ExclusiveStartKey = startAfter if qr.beforeRun != nil { asFunc := func(i any) bool { p, ok := i.(**dyn.ScanInput) if !ok { return false } *p = qr.scanIn return true } if err := qr.beforeRun(asFunc); err != nil { return nil, nil, nil, err } } out, err := qr.c.db.Scan(ctx, qr.scanIn) if err != nil { return nil, nil, nil, err } return out.Items, out.LastEvaluatedKey, func(i any) bool { p, ok := i.(**dyn.ScanOutput) if !ok { return false } *p = out return true }, nil } qr.queryIn.ExclusiveStartKey = startAfter if qr.beforeRun != nil { asFunc := func(i any) bool { p, ok := i.(**dyn.QueryInput) if !ok { return false } *p = qr.queryIn return true } if err := qr.beforeRun(asFunc); err != nil { return nil, nil, nil, err } } out, err := qr.c.db.Query(ctx, qr.queryIn) if err != nil { return nil, nil, nil, err } return out.Items, out.LastEvaluatedKey, func(i any) bool { p, ok := i.(**dyn.QueryOutput) if !ok { return false } *p = out return true }, nil } func processFilters(cb expression.Builder, fs []driver.Filter, pkey, skey string) expression.Builder { var kbs []expression.KeyConditionBuilder var cfs []driver.Filter for _, f := range fs { if kb, ok := toKeyCondition(f, pkey, skey); ok { kbs = append(kbs, kb) continue } cfs = append(cfs, f) } keyBuilder := kbs[0] for i := 1; i < len(kbs); i++ { keyBuilder = keyBuilder.And(kbs[i]) } cb = cb.WithKeyCondition(keyBuilder) if len(cfs) > 0 { cb = cb.WithFilter(filtersToConditionBuilder(cfs)) } return cb } func filtersToConditionBuilder(fs []driver.Filter) expression.ConditionBuilder { if len(fs) == 0 { panic("no filters") } var cb expression.ConditionBuilder cb = toFilter(fs[0]) for _, f := range fs[1:] { cb = cb.And(toFilter(f)) } return cb } func toKeyCondition(f driver.Filter, pkey, skey string) (expression.KeyConditionBuilder, bool) { kp := strings.Join(f.FieldPath, ".") if kp == pkey || kp == skey { key := expression.Key(kp) val := expression.Value(f.Value) switch f.Op { case "<": return expression.KeyLessThan(key, val), true case "<=": return expression.KeyLessThanEqual(key, val), true case driver.EqualOp: return expression.KeyEqual(key, val), true case ">=": return expression.KeyGreaterThanEqual(key, val), true case ">": return expression.KeyGreaterThan(key, val), true default: panic(fmt.Sprint("invalid filter operation:", f.Op)) } } return expression.KeyConditionBuilder{}, false } func toFilter(f driver.Filter) expression.ConditionBuilder { name := expression.Name(strings.Join(f.FieldPath, ".")) val := expression.Value(f.Value) switch f.Op { case "<": return expression.LessThan(name, val) case "<=": return expression.LessThanEqual(name, val) case driver.EqualOp: return expression.Equal(name, val) case ">=": return expression.GreaterThanEqual(name, val) case ">": return expression.GreaterThan(name, val) case "in": return toInCondition(f) case "not-in": return expression.Not(toInCondition(f)) default: panic(fmt.Sprint("invalid filter operation:", f.Op)) } } func toInCondition(f driver.Filter) expression.ConditionBuilder { name := expression.Name(strings.Join(f.FieldPath, ".")) vslice := reflect.ValueOf(f.Value) right := expression.Value(vslice.Index(0).Interface()) other := make([]expression.OperandBuilder, vslice.Len()-1) for i := 1; i < vslice.Len(); i++ { other[i-1] = expression.Value(vslice.Index(i).Interface()) } return expression.In(name, right, other...) } type documentIterator struct { qr *queryRunner // the query runner items []map[string]dyn2Types.AttributeValue // items from the last query curr int // index of the current item in items offset int // number of items to skip limit int // number of items to return count int // number of items returned last map[string]dyn2Types.AttributeValue // lastEvaluatedKey from the last query asFunc func(i any) bool // for As } func (it *documentIterator) Next(ctx context.Context, doc driver.Document) error { // Skip the first 'n' documents where 'n' is the offset. for it.count < it.offset { if err := it.next(ctx, doc, false); err != nil { return err } } return it.next(ctx, doc, true) } func (it *documentIterator) next(ctx context.Context, doc driver.Document, decode bool) error { // Only start counting towards the limit after the offset has been reached. if it.limit > 0 && it.count >= it.offset+it.limit { return io.EOF } // it.items can be empty after a call to it.qr.run, but unless it.last is nil there may be more items. for it.curr >= len(it.items) { // Make a new query request at the end of this page. if it.last == nil { return io.EOF } var err error it.items, it.last, it.asFunc, err = it.qr.run(ctx, it.last) if err != nil { return err } it.curr = 0 } if decode { if err := decodeDoc(&dyn2Types.AttributeValueMemberM{Value: it.items[it.curr]}, doc); err != nil { return err } } it.curr++ it.count++ return nil } func (it *documentIterator) Stop() { it.items = nil it.last = nil } func (it *documentIterator) As(i any) bool { return it.asFunc(i) } func (c *collection) QueryPlan(q *driver.Query) (string, error) { qr, err := c.planQuery(q) if err != nil { return "", err } return qr.queryPlan(), nil } func (qr *queryRunner) queryPlan() string { if qr.scanIn != nil { return "Scan" } if qr.queryIn.IndexName != nil { return fmt.Sprintf("Index: %q", *qr.queryIn.IndexName) } return "Table" } // InMemorySortFallback returns a query fallback function for Options.RunQueryFallback. // The function accepts a query with an OrderBy clause. It runs the query without that clause, // reading all documents into memory, then sorts the documents according to the OrderBy clause. // // Only string, numeric, time and binary ([]byte) fields can be sorted. // // createDocument should create an empty document to be passed to DocumentIterator.Next. // The DocumentIterator returned by the FallbackFunc will also expect the same type of document. // If nil, then a map[string]interface{} will be used. func InMemorySortFallback(createDocument func() any) FallbackFunc { if createDocument == nil { createDocument = func() any { return map[string]any{} } } return func(ctx context.Context, q *driver.Query, run RunQueryFunc) (driver.DocumentIterator, error) { if q.OrderByField == "" { return nil, errors.New("InMemorySortFallback expects an OrderBy query") } // Run the query without the OrderBy. orderByField := q.OrderByField q.OrderByField = "" iter, err := run(ctx, q) if err != nil { return nil, err } defer iter.Stop() // Collect the results into a slice. var docs []driver.Document for { doc, err := driver.NewDocument(createDocument()) if err != nil { return nil, err } err = iter.Next(ctx, doc) if err == io.EOF { break } if err != nil { return nil, err } docs = append(docs, doc) } // Sort the documents. // OrderByField is a single field, not a field path. // First, put the field values in another slice, so we can // return on error. sortValues := make([]any, len(docs)) for i, doc := range docs { v, err := doc.GetField(orderByField) if err != nil { return nil, err } sortValues[i] = v } sort.Sort(docsForSorting{docs, sortValues, q.OrderAscending}) return &sliceIterator{docs: docs}, nil } } type docsForSorting struct { docs []driver.Document vals []any ascending bool } func (d docsForSorting) Len() int { return len(d.docs) } func (d docsForSorting) Swap(i, j int) { d.docs[i], d.docs[j] = d.docs[j], d.docs[i] d.vals[i], d.vals[j] = d.vals[j], d.vals[i] } func (d docsForSorting) Less(i, j int) bool { c := compare(d.vals[i], d.vals[j]) if d.ascending { return c < 0 } return c > 0 } // compare returns -1 if v1 < v2, 0 if v1 == v2 and 1 if v1 > v2. // // Arbitrarily decide that strings < times < []byte < numbers. // TODO(jba): find and use the actual sort order that DynamoDB uses. func compare(v1, v2 any) int { switch v1 := v1.(type) { case string: if v2, ok := v2.(string); ok { return strings.Compare(v1, v2) } return -1 case time.Time: if v2, ok := v2.(time.Time); ok { return driver.CompareTimes(v1, v2) } if _, ok := v2.(string); ok { return 1 } return -1 case []byte: if v2, ok := v2.([]byte); ok { return bytes.Compare(v1, v2) } if _, ok := v2.(string); ok { return 1 } if _, ok := v2.(time.Time); ok { return 1 } return -1 default: cmp, err := driver.CompareNumbers(v1, v2) if err != nil { return -1 } return cmp } } type sliceIterator struct { docs []driver.Document next int } func (it *sliceIterator) Next(ctx context.Context, doc driver.Document) error { if it.next >= len(it.docs) { return io.EOF } it.next++ return copyTopLevel(doc, it.docs[it.next-1]) } // Copy the top-level fields of src into dest. func copyTopLevel(dest, src driver.Document) error { for _, f := range src.FieldNames() { v, err := src.GetField(f) if err != nil { return err } if err := dest.SetField(f, v); err != nil { return err } } return nil } func (*sliceIterator) Stop() {} func (*sliceIterator) As(any) bool { return false } ================================================ FILE: docstore/awsdynamodb/v2/query_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package awsdynamodb import ( "context" "errors" "fmt" "strings" "testing" "time" "github.com/aws/aws-sdk-go-v2/aws" dyn "github.com/aws/aws-sdk-go-v2/service/dynamodb" dyn2Types "github.com/aws/aws-sdk-go-v2/service/dynamodb/types" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "gocloud.dev/docstore/driver" "gocloud.dev/docstore/drivertest" ) func TestPlanQuery(t *testing.T) { c := &collection{ table: "T", partitionKey: "tableP", description: &dyn2Types.TableDescription{}, opts: &Options{AllowScans: true, RevisionField: "rev"}, } // Build an ExpressionAttributeNames map with the given names. eans := func(names ...string) map[string]string { m := map[string]string{} for i, n := range names { m[fmt.Sprintf("#%d", i)] = n } return m } // Build an ExpressionAttributeValues map. Filter values are always the number 1 // and the keys are always :0, :1, ..., so we only need to know how many entries. eavs := func(n int) map[string]dyn2Types.AttributeValue { if n == 0 { return nil } one := &dyn2Types.AttributeValueMemberN{Value: "1"} m := map[string]dyn2Types.AttributeValue{} for i := range n { m[fmt.Sprintf(":%d", i)] = one } return m } // Ignores the ConsistentRead field from both QueryInput and ScanInput. opts := []cmp.Option{ cmpopts.IgnoreFields(dyn.ScanInput{}, "ConsistentRead"), cmpopts.IgnoreFields(dyn.QueryInput{}, "ConsistentRead"), cmpopts.IgnoreUnexported(dyn.ScanInput{}), cmpopts.IgnoreUnexported(dyn.QueryInput{}), compareIgnoreAttributeUnexported, } for _, test := range []struct { desc string // In all cases, the table has a partition key called "tableP". tableSortKey string // if non-empty, the table sort key localIndexSortKey string // if non-empty, there is a local index with this sort key localIndexFields []string // the fields projected into the local index globalIndexPartitionKey string // if non-empty, there is a global index with this partition key globalIndexSortKey string // if non-empty, the global index has this sort key globalIndexFields []string // the fields projected into the global index query *driver.Query want any // either a ScanInput or a QueryInput wantPlan string }{ { desc: "empty query", // A query with no filters requires a scan. query: &driver.Query{}, want: &dyn.ScanInput{TableName: &c.table}, wantPlan: "Scan", }, { desc: "equality filter on table partition field", // A filter that compares the table's partition key for equality is the minimum // requirement for querying the table. query: &driver.Query{Filters: []driver.Filter{{[]string{"tableP"}, "=", 1}}}, want: &dyn.QueryInput{ KeyConditionExpression: aws.String("#0 = :0"), ExpressionAttributeNames: eans("tableP"), ExpressionAttributeValues: eavs(1), }, wantPlan: "Table", }, { desc: "equality filter on table partition field (sort key)", // Same as above, but the table has a sort key; shouldn't make a difference. tableSortKey: "tableS", query: &driver.Query{Filters: []driver.Filter{{[]string{"tableP"}, "=", 1}}}, want: &dyn.QueryInput{ KeyConditionExpression: aws.String("#0 = :0"), ExpressionAttributeNames: eans("tableP"), ExpressionAttributeValues: eavs(1), }, wantPlan: "Table", }, { desc: "equality filter on other field", // This query has an equality filter, but not on the table's partition key. // Since there are no matching indexes, we must scan. query: &driver.Query{Filters: []driver.Filter{{[]string{"other"}, "=", 1}}}, want: &dyn.ScanInput{ FilterExpression: aws.String("#0 = :0"), ExpressionAttributeNames: eans("other"), ExpressionAttributeValues: eavs(1), }, wantPlan: "Scan", }, { desc: "non-equality filter on table partition field", // If the query doesn't have an equality filter on the partition key, and there // are no indexes, we must scan. The filter becomes a FilterExpression, evaluated // on the backend. query: &driver.Query{Filters: []driver.Filter{{[]string{"tableP"}, ">", 1}}}, want: &dyn.ScanInput{ FilterExpression: aws.String("#0 > :0"), ExpressionAttributeNames: eans("tableP"), ExpressionAttributeValues: eavs(1), }, wantPlan: "Scan", }, { desc: "equality filter on partition, filter on other", // The equality filter on the table's partition key lets us query the table. // The other filter is used in the filter expression. query: &driver.Query{Filters: []driver.Filter{ {[]string{"tableP"}, "=", 1}, {[]string{"other"}, "<=", 1}, }}, want: &dyn.QueryInput{ KeyConditionExpression: aws.String("#1 = :1"), FilterExpression: aws.String("#0 <= :0"), ExpressionAttributeNames: eans("other", "tableP"), ExpressionAttributeValues: eavs(2), }, wantPlan: "Table", }, { desc: "equality filter on partition, filter on sort", // If the table has a sort key and the query has a filter on it as well // as an equality filter on the table's partition key, we can query the // table. tableSortKey: "tableS", query: &driver.Query{Filters: []driver.Filter{ {[]string{"tableP"}, "=", 1}, {[]string{"tableS"}, "<=", 1}, }}, want: &dyn.QueryInput{ KeyConditionExpression: aws.String("(#0 = :0) AND (#1 <= :1)"), ExpressionAttributeNames: eans("tableP", "tableS"), ExpressionAttributeValues: eavs(2), }, wantPlan: "Table", }, { desc: "equality filter on table partition, filter on local index sort", // The equality filter on the table's partition key allows us to query // the table, but there is a better choice: a local index with a sort key // that is mentioned in the query. localIndexSortKey: "localS", query: &driver.Query{Filters: []driver.Filter{ {[]string{"tableP"}, "=", 1}, {[]string{"localS"}, "<=", 1}, }}, want: &dyn.QueryInput{ IndexName: aws.String("local"), KeyConditionExpression: aws.String("(#0 = :0) AND (#1 <= :1)"), ExpressionAttributeNames: eans("tableP", "localS"), }, wantPlan: `Index: "local"`, }, { desc: "equality filter on table partition, filter on local index sort, bad projection", // The equality filter on the table's partition key allows us to query // the table. There seems to be a better choice: a local index with a sort key // that is mentioned in the query. But the query wants the entire document, // and the local index only has some fields. localIndexSortKey: "localS", localIndexFields: []string{}, // keys only query: &driver.Query{Filters: []driver.Filter{ {[]string{"tableP"}, "=", 1}, {[]string{"localS"}, "<=", 1}, }}, want: &dyn.QueryInput{ KeyConditionExpression: aws.String("#1 = :1"), FilterExpression: aws.String("#0 <= :0"), ExpressionAttributeNames: eans("localS", "tableP"), }, wantPlan: "Table", }, { desc: "equality filter on table partition, filter on local index sort, good projection", // Same as above, but now the query no longer asks for all fields, so // we will only read the requested fields from the table. localIndexSortKey: "localS", localIndexFields: []string{}, // keys only query: &driver.Query{ FieldPaths: [][]string{{"tableP"}, {"localS"}}, Filters: []driver.Filter{ {[]string{"tableP"}, "=", 1}, {[]string{"localS"}, "<=", 1}, }, }, want: &dyn.QueryInput{ IndexName: aws.String("local"), KeyConditionExpression: aws.String("(#0 = :0) AND (#1 <= :1)"), ExpressionAttributeNames: eans("tableP", "localS"), ExpressionAttributeValues: eavs(2), ProjectionExpression: aws.String("#0, #1"), }, wantPlan: `Index: "local"`, }, { desc: "equality filter on table partition, filters on local index and table sort", // Given the choice of querying the table or a local index, prefer the table. tableSortKey: "tableS", localIndexSortKey: "localS", query: &driver.Query{Filters: []driver.Filter{ {[]string{"tableP"}, "=", 1}, {[]string{"localS"}, "<=", 1}, {[]string{"tableS"}, ">", 1}, }}, want: &dyn.QueryInput{ IndexName: nil, KeyConditionExpression: aws.String("(#1 = :1) AND (#2 > :2)"), FilterExpression: aws.String("#0 <= :0"), ExpressionAttributeNames: eans("localS", "tableP", "tableS"), }, wantPlan: "Table", }, { desc: "equality filter on other field with index", // The query is the same as in "equality filter on other field," but now there // is a global index with that field as partition key, so we can query it. globalIndexPartitionKey: "other", query: &driver.Query{Filters: []driver.Filter{{[]string{"other"}, "=", 1}}}, want: &dyn.QueryInput{ IndexName: aws.String("global"), KeyConditionExpression: aws.String("#0 = :0"), ExpressionAttributeNames: eans("other"), }, wantPlan: `Index: "global"`, }, { desc: "equality filter on table partition, filter on global index sort", // The equality filter on the table's partition key allows us to query // the table, but there is a better choice: a global index with the same // partition key and a sort key that is mentioned in the query. // (In these tests, the global index has all the fields of the table by default.) globalIndexPartitionKey: "tableP", globalIndexSortKey: "globalS", query: &driver.Query{Filters: []driver.Filter{ {[]string{"tableP"}, "=", 1}, {[]string{"globalS"}, "<=", 1}, }}, want: &dyn.QueryInput{ IndexName: aws.String("global"), KeyConditionExpression: aws.String("(#0 = :0) AND (#1 <= :1)"), ExpressionAttributeNames: eans("tableP", "globalS"), }, wantPlan: `Index: "global"`, }, { desc: "equality filter on table partition, filter on global index sort, bad projection", // Although there is a global index that matches the filters best, it doesn't // have the necessary fields. So we query against the table. // The query does not specify FilterPaths, so it retrieves the entire document. // globalIndexFields explicitly lists the fields that the global index has. // Since the global index does not have all the document fields, it can't be used. globalIndexPartitionKey: "tableP", globalIndexSortKey: "globalS", globalIndexFields: []string{"other"}, query: &driver.Query{Filters: []driver.Filter{ {[]string{"tableP"}, "=", 1}, {[]string{"globalS"}, "<=", 1}, }}, want: &dyn.QueryInput{ IndexName: nil, KeyConditionExpression: aws.String("#1 = :1"), FilterExpression: aws.String("#0 <= :0"), ExpressionAttributeNames: eans("globalS", "tableP"), }, wantPlan: "Table", }, { desc: "equality filter on table partition, filter on global index sort, good projection", // The global index matches the filters best and has the necessary // fields. So we query against it. globalIndexPartitionKey: "tableP", globalIndexSortKey: "globalS", globalIndexFields: []string{"other", "rev"}, query: &driver.Query{ FieldPaths: [][]string{{"other"}}, Filters: []driver.Filter{ {[]string{"tableP"}, "=", 1}, {[]string{"globalS"}, "<=", 1}, }, }, want: &dyn.QueryInput{ IndexName: aws.String("global"), KeyConditionExpression: aws.String("(#0 = :0) AND (#1 <= :1)"), ProjectionExpression: aws.String("#2, #0"), ExpressionAttributeNames: eans("tableP", "globalS", "other"), ExpressionAttributeValues: eavs(2), }, wantPlan: `Index: "global"`, }, } { t.Run(test.desc, func(t *testing.T) { c.sortKey = test.tableSortKey if test.localIndexSortKey == "" { c.description.LocalSecondaryIndexes = nil } else { c.description.LocalSecondaryIndexes = []dyn2Types.LocalSecondaryIndexDescription{ { IndexName: aws.String("local"), KeySchema: keySchema("tableP", test.localIndexSortKey), Projection: indexProjection(test.localIndexFields), }, } } if test.globalIndexPartitionKey == "" { c.description.GlobalSecondaryIndexes = nil } else { c.description.GlobalSecondaryIndexes = []dyn2Types.GlobalSecondaryIndexDescription{ { IndexName: aws.String("global"), KeySchema: keySchema(test.globalIndexPartitionKey, test.globalIndexSortKey), Projection: indexProjection(test.globalIndexFields), }, } } gotRunner, err := c.planQuery(test.query) if err != nil { t.Fatal(err) } var got any switch tw := test.want.(type) { case *dyn.ScanInput: got = gotRunner.scanIn tw.TableName = &c.table if tw.ExpressionAttributeValues == nil { tw.ExpressionAttributeValues = eavs(len(tw.ExpressionAttributeNames)) } case *dyn.QueryInput: got = gotRunner.queryIn tw.TableName = &c.table if tw.ExpressionAttributeValues == nil { tw.ExpressionAttributeValues = eavs(len(tw.ExpressionAttributeNames)) } default: t.Fatalf("bad type for test.want: %T", test.want) } if diff := cmp.Diff(got, test.want, opts...); diff != "" { t.Error("input:\n", diff) } gotPlan := gotRunner.queryPlan() if diff := cmp.Diff(gotPlan, test.wantPlan); diff != "" { t.Error("plan:\n", diff) } }) } } func TestQueryNoScans(t *testing.T) { c := &collection{ table: "T", partitionKey: "tableP", description: &dyn2Types.TableDescription{}, opts: &Options{AllowScans: false}, } for _, test := range []struct { q *driver.Query wantErr bool }{ {&driver.Query{}, false}, {&driver.Query{Filters: []driver.Filter{{[]string{"other"}, "=", 1}}}, true}, } { qr, err := c.planQuery(test.q) if err != nil { t.Fatalf("%v: %v", test.q, err) } err = c.checkPlan(qr) if test.wantErr { if err == nil || !strings.Contains(err.Error(), "AllowScans") { t.Errorf("%v: got %v, want an error that mentions the AllowScans option", test.q, err) } } else if err != nil { t.Errorf("%v: got %v, want nil", test.q, err) } } } // Make a key schema from the names of the partition and sort keys. func keySchema(pkey, skey string) []dyn2Types.KeySchemaElement { return []dyn2Types.KeySchemaElement{ {AttributeName: &pkey, KeyType: dyn2Types.KeyTypeHash}, {AttributeName: &skey, KeyType: dyn2Types.KeyTypeRange}, } } func indexProjection(fields []string) *dyn2Types.Projection { var ptype dyn2Types.ProjectionType switch { case fields == nil: ptype = dyn2Types.ProjectionTypeAll case len(fields) == 0: ptype = dyn2Types.ProjectionTypeKeysOnly default: ptype = dyn2Types.ProjectionTypeInclude } proj := &dyn2Types.Projection{ProjectionType: ptype} for _, f := range fields { proj.NonKeyAttributes = append(proj.NonKeyAttributes, f) } return proj } func TestGlobalFieldsIncluded(t *testing.T) { c := &collection{partitionKey: "tableP", sortKey: "tableS"} gi := dyn2Types.GlobalSecondaryIndexDescription{ KeySchema: keySchema("globalP", "globalS"), } for _, test := range []struct { desc string queryFields []string wantKeysOnly bool // when the projection includes only table and index keys wantInclude bool // when the projection includes fields "f" and "g". }{ { desc: "all", queryFields: nil, wantKeysOnly: false, wantInclude: false, }, { desc: "key fields", queryFields: []string{"tableS", "globalP"}, wantKeysOnly: true, wantInclude: true, }, { desc: "included fields", queryFields: []string{"f", "g"}, wantKeysOnly: false, wantInclude: true, }, { desc: "included and key fields", queryFields: []string{"f", "g", "tableP", "globalS"}, wantKeysOnly: false, wantInclude: true, }, { desc: "not included field", queryFields: []string{"f", "g", "h"}, wantKeysOnly: false, wantInclude: false, }, } { t.Run(test.desc, func(t *testing.T) { var fps [][]string for _, qf := range test.queryFields { fps = append(fps, strings.Split(qf, ".")) } q := &driver.Query{FieldPaths: fps} for _, p := range []struct { name string proj *dyn2Types.Projection want bool }{ {"ALL", indexProjection(nil), true}, {"KEYS_ONLY", indexProjection([]string{}), test.wantKeysOnly}, {"INCLUDE", indexProjection([]string{"f", "g"}), test.wantInclude}, } { t.Run(p.name, func(t *testing.T) { gi.Projection = p.proj got := c.globalFieldsIncluded(q, gi) if got != p.want { t.Errorf("got %t, want %t", got, p.want) } }) } }) } } func TestCompare(t *testing.T) { tm := time.Now() for _, test := range []struct { a, b any want int }{ {1, 1, 0}, {1, 2, -1}, {2, 1, 1}, {1.5, 2, -1}, {2.5, 2.1, 1}, {3.8, 3.8, 0}, {"x", "x", 0}, {"x", "xx", -1}, {"x", "a", 1}, {tm, tm, 0}, {tm, tm.Add(1), -1}, {tm, tm.Add(-1), 1}, {[]byte("x"), []byte("x"), 0}, {[]byte("x"), []byte("xx"), -1}, {[]byte("x"), []byte("a"), 1}, } { got := compare(test.a, test.b) if got != test.want { t.Errorf("compare(%v, %v) = %d, want %d", test.a, test.b, got, test.want) } } } func TestCopyTopLevel(t *testing.T) { type E struct{ C int } type S struct { A int B int E } s := &S{A: 1, B: 2, E: E{C: 3}} m := map[string]any{"A": 1, "B": 2, "C": 3} for _, test := range []struct { dest, src any want any }{ { dest: map[string]any{}, src: m, want: m, }, { dest: &S{}, src: s, want: s, }, { dest: map[string]any{}, src: s, want: m, }, { dest: &S{}, src: m, want: s, }, } { dest := drivertest.MustDocument(test.dest) src := drivertest.MustDocument(test.src) if err := copyTopLevel(dest, src); err != nil { t.Fatalf("src=%+v: %v", test.src, err) } if !cmp.Equal(test.dest, test.want) { t.Errorf("src=%+v: got %v, want %v", test.src, test.dest, test.want) } } } func Test_documentIterator_Next(t *testing.T) { type fields struct { qr *queryRunner items []map[string]dyn2Types.AttributeValue curr int offset int limit int count int last map[string]dyn2Types.AttributeValue asFunc func(i any) bool } type args struct { ctx context.Context doc driver.Document } tests := []struct { name string fields fields args args wantErr bool }{ { name: "nextWithNoDecodeError", fields: fields{ qr: &queryRunner{}, items: []map[string]dyn2Types.AttributeValue{ {"key": &dyn2Types.AttributeValueMemberM{Value: map[string]dyn2Types.AttributeValue{"key": &dyn2Types.AttributeValueMemberS{Value: "value"}}}}, }, curr: 0, offset: 0, limit: 0, count: 0, last: map[string]dyn2Types.AttributeValue{}, }, args: args{ ctx: context.Background(), doc: drivertest.MustDocument(map[string]any{}), }, wantErr: false, }, { name: "nextWithDecodeError", fields: fields{ qr: &queryRunner{}, items: []map[string]dyn2Types.AttributeValue{ {"key": nil}, // set M to nil to trigger decode error }, curr: 0, offset: 0, limit: 0, count: 0, last: map[string]dyn2Types.AttributeValue{}, }, args: args{ ctx: context.Background(), doc: drivertest.MustDocument(map[string]any{}), }, wantErr: true, }, { name: "nextWhereCurrIsGreaterThanOrEqualToItemsAndLastIsNotNil", fields: fields{ qr: &queryRunner{ scanIn: &dyn.ScanInput{}, // hack to return error from run beforeRun: func(asFunc func(i any) bool) error { return errors.New("invalid") }, }, items: []map[string]dyn2Types.AttributeValue{{"key": &dyn2Types.AttributeValueMemberM{Value: map[string]dyn2Types.AttributeValue{"key": &dyn2Types.AttributeValueMemberS{Value: "value"}}}}}, curr: 1, offset: 0, limit: 0, count: 0, last: map[string]dyn2Types.AttributeValue{"key": &dyn2Types.AttributeValueMemberS{Value: "value"}}, }, args: args{ ctx: context.Background(), doc: drivertest.MustDocument(map[string]any{}), }, wantErr: true, }, } for i, tt := range tests { t.Run(tt.name, func(t *testing.T) { it := &documentIterator{ qr: tt.fields.qr, items: tt.fields.items, curr: tt.fields.curr, offset: tt.fields.offset, limit: tt.fields.limit, count: tt.fields.count, last: tt.fields.last, asFunc: tt.fields.asFunc, } if err := it.Next(tt.args.ctx, tt.args.doc); (err != nil) != tt.wantErr { t.Errorf("documentIterator.Next() test=%v(%v) error = %v, wantErr %v", i+1, tt.name, err, tt.wantErr) } }) } } ================================================ FILE: docstore/awsdynamodb/v2/testdata/TestConformance/ActionsOnStructNoRev.replay ================================================ { "Initial": "AQAAAA7hTg5cMPjAXAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*", ".*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "753d399f9c478d1c", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DescribeTable" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "599" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:49 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3022004566" ], "X-Amzn-Requestid": [ "CD4DO2BGMIDSGDFBAQI3SU4BKRVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJUYWJsZSI6eyJBdHRyaWJ1dGVEZWZpbml0aW9ucyI6W3siQXR0cmlidXRlTmFtZSI6Im5hbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9XSwiQ3JlYXRpb25EYXRlVGltZSI6MS43MjMwNzYwNzk3OTdFOSwiRGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZCI6ZmFsc2UsIkl0ZW1Db3VudCI6MCwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoibmFtZSIsIktleVR5cGUiOiJIQVNIIn1dLCJQcm92aXNpb25lZFRocm91Z2hwdXQiOnsiTnVtYmVyT2ZEZWNyZWFzZXNUb2RheSI6MCwiUmVhZENhcGFjaXR5VW5pdHMiOjUsIldyaXRlQ2FwYWNpdHlVbml0cyI6NX0sIlRhYmxlQXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMSIsIlRhYmxlSWQiOiI5N2U0OTNmNC1jZjU3LTQ2YmItOTc4Ny1iOGU4ZDk3ZjUwMDciLCJUYWJsZU5hbWUiOiJkb2NzdG9yZS10ZXN0LTEiLCJUYWJsZVNpemVCeXRlcyI6MCwiVGFibGVTdGF0dXMiOiJBQ1RJVkUiLCJXYXJtVGhyb3VnaHB1dCI6eyJSZWFkVW5pdHNQZXJTZWNvbmQiOjUsIlN0YXR1cyI6IkFDVElWRSIsIldyaXRlVW5pdHNQZXJTZWNvbmQiOjV9fX0=" } }, { "ID": "6b639f06176cecf0", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "155" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:49 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "1689561753" ], "X-Amzn-Requestid": [ "B8TIFH31PEALPU3UTMH7G9LAE7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MSwiSXRlbXMiOlt7Im5hbWUiOnsiUyI6InRlc3RTZXJpYWxpemVSZXZpc2lvbiJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiI2YTBmM2U4ZS01OWFiLTRlZDYtODg1Zi04ZTUxZDZiYmY2OWIifSwieCI6eyJOIjoiMSJ9fV0sIlNjYW5uZWRDb3VudCI6MX0=" } }, { "ID": "831f2ad592cefd63", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "241" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:49 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "5RLP9PGUM21FEABTMC5ONVO01VVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "e034137e19ce9f35", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "82" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:49 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "TGA5RJN3I3AE2CJ8F08PL3RJ5VVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "589e26dac0321c3e", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "177" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:49 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "5ELRRQTTJLH2GI7VII3EFKRI97VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "751bea3964a33f16", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "133" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "148" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:49 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "1437423900" ], "X-Amzn-Requestid": [ "TT439C85UT576TTNV47Q595OC3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJJIjp7Ik4iOiIwIn0sIm5hbWUiOnsiUyI6InB1dGFuZHVwZGF0ZSJ9fSx7IkkiOnsiTiI6IjAifSwibmFtZSI6eyJTIjoiY3JlYXRlYW5kcmVwbGFjZSJ9fV19LCJVbnByb2Nlc3NlZEtleXMiOnt9fQ==" } }, { "ID": "4c57d184757810ee", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "173" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:49 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "H849DB3VFV7G60PACBNLQEM5AFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "fa326e6271882d74", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "243" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.UpdateItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:49 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "G9KSQOAH2JAJPVKD8RRSHK238RVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "5ff3c62246985f2e", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "215" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "148" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:49 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "1494456817" ], "X-Amzn-Requestid": [ "RVBEH1GE1VQ9EDE92EJBHK2NINVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJJIjp7Ik4iOiIxIn0sIm5hbWUiOnsiUyI6InB1dGFuZHVwZGF0ZSJ9fSx7IkkiOnsiTiI6IjAifSwibmFtZSI6eyJTIjoiY3JlYXRlYW5kcmVwbGFjZSJ9fV19LCJVbnByb2Nlc3NlZEtleXMiOnt9fQ==" } } ] } ================================================ FILE: docstore/awsdynamodb/v2/testdata/TestConformance/ActionsWithCompositeID.replay ================================================ { "Initial": "AQAAAA7hTg5dH2CMhwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*", ".*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "9cbbf22326ea570b", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DescribeTable" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1609" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:49 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "298093499" ], "X-Amzn-Requestid": [ "PI258HS7I3RLA41UAMP1LBM1TRVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJUYWJsZSI6eyJBdHRyaWJ1dGVEZWZpbml0aW9ucyI6W3siQXR0cmlidXRlTmFtZSI6IkdhbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9LHsiQXR0cmlidXRlTmFtZSI6IlBsYXllciIsIkF0dHJpYnV0ZVR5cGUiOiJTIn0seyJBdHRyaWJ1dGVOYW1lIjoiU2NvcmUiLCJBdHRyaWJ1dGVUeXBlIjoiTiJ9LHsiQXR0cmlidXRlTmFtZSI6IlRpbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9XSwiQ3JlYXRpb25EYXRlVGltZSI6MS43MjMwNzYwODA2OTVFOSwiRGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZCI6ZmFsc2UsIkdsb2JhbFNlY29uZGFyeUluZGV4ZXMiOlt7IkluZGV4QXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMi9pbmRleC9nbG9iYWwiLCJJbmRleE5hbWUiOiJnbG9iYWwiLCJJbmRleFNpemVCeXRlcyI6MTE4LCJJbmRleFN0YXR1cyI6IkFDVElWRSIsIkl0ZW1Db3VudCI6MSwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoiUGxheWVyIiwiS2V5VHlwZSI6IkhBU0gifSx7IkF0dHJpYnV0ZU5hbWUiOiJUaW1lIiwiS2V5VHlwZSI6IlJBTkdFIn1dLCJQcm9qZWN0aW9uIjp7IlByb2plY3Rpb25UeXBlIjoiQUxMIn0sIlByb3Zpc2lvbmVkVGhyb3VnaHB1dCI6eyJOdW1iZXJPZkRlY3JlYXNlc1RvZGF5IjowLCJSZWFkQ2FwYWNpdHlVbml0cyI6NSwiV3JpdGVDYXBhY2l0eVVuaXRzIjo1fSwiV2FybVRocm91Z2hwdXQiOnsiUmVhZFVuaXRzUGVyU2Vjb25kIjo1LCJTdGF0dXMiOiJBQ1RJVkUiLCJXcml0ZVVuaXRzUGVyU2Vjb25kIjo1fX1dLCJJdGVtQ291bnQiOjEsIktleVNjaGVtYSI6W3siQXR0cmlidXRlTmFtZSI6IkdhbWUiLCJLZXlUeXBlIjoiSEFTSCJ9LHsiQXR0cmlidXRlTmFtZSI6IlBsYXllciIsIktleVR5cGUiOiJSQU5HRSJ9XSwiTG9jYWxTZWNvbmRhcnlJbmRleGVzIjpbeyJJbmRleEFybiI6ImFybjphd3M6ZHluYW1vZGI6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3Njp0YWJsZS9kb2NzdG9yZS10ZXN0LTIvaW5kZXgvbG9jYWwiLCJJbmRleE5hbWUiOiJsb2NhbCIsIkluZGV4U2l6ZUJ5dGVzIjoxMTgsIkl0ZW1Db3VudCI6MSwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoiR2FtZSIsIktleVR5cGUiOiJIQVNIIn0seyJBdHRyaWJ1dGVOYW1lIjoiU2NvcmUiLCJLZXlUeXBlIjoiUkFOR0UifV0sIlByb2plY3Rpb24iOnsiUHJvamVjdGlvblR5cGUiOiJBTEwifX1dLCJQcm92aXNpb25lZFRocm91Z2hwdXQiOnsiTnVtYmVyT2ZEZWNyZWFzZXNUb2RheSI6MCwiUmVhZENhcGFjaXR5VW5pdHMiOjUsIldyaXRlQ2FwYWNpdHlVbml0cyI6NX0sIlRhYmxlQXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMiIsIlRhYmxlSWQiOiIwZDRmOTk4My1kOGE5LTRhZjEtYTY0NC05YmE3M2NlMGYyMjciLCJUYWJsZU5hbWUiOiJkb2NzdG9yZS10ZXN0LTIiLCJUYWJsZVNpemVCeXRlcyI6MTE4LCJUYWJsZVN0YXR1cyI6IkFDVElWRSIsIldhcm1UaHJvdWdocHV0Ijp7IlJlYWRVbml0c1BlclNlY29uZCI6NSwiU3RhdHVzIjoiQUNUSVZFIiwiV3JpdGVVbml0c1BlclNlY29uZCI6NX19fQ==" } }, { "ID": "1d3295500d2da029", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "54" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "235" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:49 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "277620058" ], "X-Amzn-Requestid": [ "I9LENFQ36181MIGFVT4IH4HU8VVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MSwiSXRlbXMiOlt7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTI1VDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6InN0ZXBoIn0sIlNjb3JlIjp7Ik4iOiIyNCJ9LCJHYW1lIjp7IlMiOiJEYXlzIEdvbmUifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiNGY4YTcyMTYtOGYwOS00NjVjLThiYjItMDhjOTQxYmFlYmFmIn19XSwiU2Nhbm5lZENvdW50IjoxfQ==" } }, { "ID": "3347c5668f602d5f", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "252" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:49 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "6QOGP04EEF4N49B7PHHLL46VG3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "56a14cbf7ef39f9a", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "352" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "167" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:49 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2041333382" ], "X-Amzn-Requestid": [ "T3F7943FRKJJVLLPK0FEO8RF8VVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uLmNvcmFsLnZhbGlkYXRlI1ZhbGlkYXRpb25FeGNlcHRpb24iLCJtZXNzYWdlIjoiT25lIG9yIG1vcmUgcGFyYW1ldGVyIHZhbHVlcyB3ZXJlIGludmFsaWQ6IFR5cGUgbWlzbWF0Y2ggZm9yIGtleSBQbGF5ZXIgZXhwZWN0ZWQ6IFMgYWN0dWFsOiBOVUxMIn0=" } }, { "ID": "26acec69c8f0db3e", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "235" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:49 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "M9DP5QJ1VSBMJQ0S0RIF568PGBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "6337d8bb713aa271", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "244" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:49 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "CUI66GPOSIT70GU4RUT53R043NVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "32cbaccfa1b5ce2b", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "243" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:49 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "4IQ56V7ONQ1SMMAN7ILLJTI96FVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "c81651c51d50c3a8", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "243" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:50 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "3T0334PCCD4P8PQS6O4M440DL7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "8789dc39215bb9c5", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "244" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:50 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "C6RCPPVP46ALEEE351SKKP874NVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "a9ab50e1ee97f953", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "238" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:49 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "AUVPO78IUJ8OETUD6QNS2202K7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "5602395e37c64523", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "234" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:50 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "SS7KK5D7HPT6QJF0TKNI3HE7LNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "c6dc3d044907170e", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "234" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:50 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "TBMDRMFDM7VB3NNQDH3ANDH9U3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "cdd7b252516ea312", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "504" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1667" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:50 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3464261393" ], "X-Amzn-Requestid": [ "208PBEMO9B1E7OUCFCLD4GSQ2NVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0yIjpbeyJXaXRoR2xpdGNoIjp7IkJPT0wiOmZhbHNlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0xMFQwMDowMDowMFoifSwiU2NvcmUiOnsiTiI6IjExMSJ9LCJHYW1lIjp7IlMiOiJab21iaWUgRE1WIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImUyZjI0MmU2LTQ4MTktNGY4NS1hODJiLTFkNzY1Zjk3NWJiNiJ9LCJQbGF5ZXIiOnsiUyI6ImJpbGxpZSJ9fSx7IldpdGhHbGl0Y2giOnsiQk9PTCI6dHJ1ZX0sIlRpbWUiOnsiUyI6IjIwMTktMDQtMThUMDA6MDA6MDBaIn0sIlNjb3JlIjp7Ik4iOiIxOTAifSwiR2FtZSI6eyJTIjoiWm9tYmllIERNViJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJlZTA2ZWQzYi1iNjVjLTQzZjItODUyMy0wNTdhY2U3OTRmZjMifSwiUGxheWVyIjp7IlMiOiJtZWwifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOmZhbHNlfSwiVGltZSI6eyJTIjoiMjAxOS0wMi0wMVQwMDowMDowMFoifSwiU2NvcmUiOnsiTiI6IjgxIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiOWQ0MTI5NDktNmJjNS00NjU4LWExMTctNTYxYTM2MDc0NmU5In0sIlBsYXllciI6eyJTIjoiYW5keSJ9fSx7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTEwVDAwOjAwOjAwWiJ9LCJTY29yZSI6eyJOIjoiNjAifSwiR2FtZSI6eyJTIjoiUHJhaXNlIEFsbCBNb25zdGVycyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJjMDEzYWQ3YS05NzJiLTRmYmQtYTUyNC00M2U0ZDQyNGZlOWEifSwiUGxheWVyIjp7IlMiOiJtZWwifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOmZhbHNlfSwiVGltZSI6eyJTIjoiMjAxOS0wMy0xM1QwMDowMDowMFoifSwiU2NvcmUiOnsiTiI6IjQ5In0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiY2JiOTZmNmMtZjIwNS00Y2QwLTlhMzctZGQ3Y2E3OTdjYjZiIn0sIlBsYXllciI6eyJTIjoicGF0In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTlUMDA6MDA6MDBaIn0sIlNjb3JlIjp7Ik4iOiIzMyJ9LCJHYW1lIjp7IlMiOiJQcmFpc2UgQWxsIE1vbnN0ZXJzIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6IjY4NTgzMmUwLTMzNGItNGEwMi05OTgwLWFmY2NiN2ExYTJmYiJ9LCJQbGF5ZXIiOnsiUyI6ImZyYW4ifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOmZhbHNlfSwiVGltZSI6eyJTIjoiMjAxOS0wMy0yMFQwMDowMDowMFoifSwiU2NvcmUiOnsiTiI6IjMzIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiODllM2FiYjMtYTg5NC00OWUyLTg2YjYtMGQyMjQ4MWEwMWJjIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9fSx7IldpdGhHbGl0Y2giOnsiQk9PTCI6dHJ1ZX0sIlRpbWUiOnsiUyI6IjIwMTktMDQtMDFUMDA6MDA6MDBaIn0sIlNjb3JlIjp7Ik4iOiIxMjAifSwiR2FtZSI6eyJTIjoiWm9tYmllIERNViJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiI4YzVhNjU2Yy01ODRkLTQ5ZTMtYTVkNy1mMDViYzgzMTFlNDYifSwiUGxheWVyIjp7IlMiOiJwYXQifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } } ] } ================================================ FILE: docstore/awsdynamodb/v2/testdata/TestConformance/As/verify_As.replay ================================================ { "Initial": "AQAAAA7hTg5iOU/VUwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*", ".*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "873e8cb92b5b086a", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DescribeTable" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1609" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:55 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "298093499" ], "X-Amzn-Requestid": [ "9D9KQTR6J9EA9G1R518U5R7BI7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJUYWJsZSI6eyJBdHRyaWJ1dGVEZWZpbml0aW9ucyI6W3siQXR0cmlidXRlTmFtZSI6IkdhbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9LHsiQXR0cmlidXRlTmFtZSI6IlBsYXllciIsIkF0dHJpYnV0ZVR5cGUiOiJTIn0seyJBdHRyaWJ1dGVOYW1lIjoiU2NvcmUiLCJBdHRyaWJ1dGVUeXBlIjoiTiJ9LHsiQXR0cmlidXRlTmFtZSI6IlRpbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9XSwiQ3JlYXRpb25EYXRlVGltZSI6MS43MjMwNzYwODA2OTVFOSwiRGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZCI6ZmFsc2UsIkdsb2JhbFNlY29uZGFyeUluZGV4ZXMiOlt7IkluZGV4QXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMi9pbmRleC9nbG9iYWwiLCJJbmRleE5hbWUiOiJnbG9iYWwiLCJJbmRleFNpemVCeXRlcyI6MTE4LCJJbmRleFN0YXR1cyI6IkFDVElWRSIsIkl0ZW1Db3VudCI6MSwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoiUGxheWVyIiwiS2V5VHlwZSI6IkhBU0gifSx7IkF0dHJpYnV0ZU5hbWUiOiJUaW1lIiwiS2V5VHlwZSI6IlJBTkdFIn1dLCJQcm9qZWN0aW9uIjp7IlByb2plY3Rpb25UeXBlIjoiQUxMIn0sIlByb3Zpc2lvbmVkVGhyb3VnaHB1dCI6eyJOdW1iZXJPZkRlY3JlYXNlc1RvZGF5IjowLCJSZWFkQ2FwYWNpdHlVbml0cyI6NSwiV3JpdGVDYXBhY2l0eVVuaXRzIjo1fSwiV2FybVRocm91Z2hwdXQiOnsiUmVhZFVuaXRzUGVyU2Vjb25kIjo1LCJTdGF0dXMiOiJBQ1RJVkUiLCJXcml0ZVVuaXRzUGVyU2Vjb25kIjo1fX1dLCJJdGVtQ291bnQiOjEsIktleVNjaGVtYSI6W3siQXR0cmlidXRlTmFtZSI6IkdhbWUiLCJLZXlUeXBlIjoiSEFTSCJ9LHsiQXR0cmlidXRlTmFtZSI6IlBsYXllciIsIktleVR5cGUiOiJSQU5HRSJ9XSwiTG9jYWxTZWNvbmRhcnlJbmRleGVzIjpbeyJJbmRleEFybiI6ImFybjphd3M6ZHluYW1vZGI6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3Njp0YWJsZS9kb2NzdG9yZS10ZXN0LTIvaW5kZXgvbG9jYWwiLCJJbmRleE5hbWUiOiJsb2NhbCIsIkluZGV4U2l6ZUJ5dGVzIjoxMTgsIkl0ZW1Db3VudCI6MSwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoiR2FtZSIsIktleVR5cGUiOiJIQVNIIn0seyJBdHRyaWJ1dGVOYW1lIjoiU2NvcmUiLCJLZXlUeXBlIjoiUkFOR0UifV0sIlByb2plY3Rpb24iOnsiUHJvamVjdGlvblR5cGUiOiJBTEwifX1dLCJQcm92aXNpb25lZFRocm91Z2hwdXQiOnsiTnVtYmVyT2ZEZWNyZWFzZXNUb2RheSI6MCwiUmVhZENhcGFjaXR5VW5pdHMiOjUsIldyaXRlQ2FwYWNpdHlVbml0cyI6NX0sIlRhYmxlQXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMiIsIlRhYmxlSWQiOiIwZDRmOTk4My1kOGE5LTRhZjEtYTY0NC05YmE3M2NlMGYyMjciLCJUYWJsZU5hbWUiOiJkb2NzdG9yZS10ZXN0LTIiLCJUYWJsZVNpemVCeXRlcyI6MTE4LCJUYWJsZVN0YXR1cyI6IkFDVElWRSIsIldhcm1UaHJvdWdocHV0Ijp7IlJlYWRVbml0c1BlclNlY29uZCI6NSwiU3RhdHVzIjoiQUNUSVZFIiwiV3JpdGVVbml0c1BlclNlY29uZCI6NX19fQ==" } }, { "ID": "579eb6be8ab9eb31", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "54" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1649" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:55 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3539434770" ], "X-Amzn-Requestid": [ "F2Q83UBHOR9U5HG9GQKHF5740BVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6OCwiSXRlbXMiOlt7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTEwVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImJpbGxpZSJ9LCJTY29yZSI6eyJOIjoiMTExIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiODNlN2MyMzYtOGUzMC00MzFjLWI4ZjQtZTIxN2VjZjgwZDA1In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMjBUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9LCJTY29yZSI6eyJOIjoiMzMifSwiR2FtZSI6eyJTIjoiWm9tYmllIERNViJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiIyZGQ2ZWQ0NC04MzE3LTQ5MjEtYmRiNC0wOTM0YTA4MWRjZDIifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOnRydWV9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTE4VDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6Im1lbCJ9LCJTY29yZSI6eyJOIjoiMTkwIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZDZiZWY4ZjQtNWQzMS00N2VhLThhODQtOGNhZGQ4NjdkNmZkIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjp0cnVlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0wMVQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJwYXQifSwiU2NvcmUiOnsiTiI6IjEyMCJ9LCJHYW1lIjp7IlMiOiJab21iaWUgRE1WIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImViNzFlMmJjLWNlNDEtNGUxYi1hYjA4LTZjNTVlZjBkNTYwOCJ9fSx7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTAyLTAxVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImFuZHkifSwiU2NvcmUiOnsiTiI6IjgxIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZjQ1ZDRhY2ItZmMxNC00ZDhkLTk4Y2UtNzllNWNmNDdkMTVkIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTlUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9LCJTY29yZSI6eyJOIjoiMzMifSwiR2FtZSI6eyJTIjoiUHJhaXNlIEFsbCBNb25zdGVycyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJkZWMzODRjNS03M2MzLTQ5OWEtYTZlZi04MDk5ZGRhYWNmOTAifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOmZhbHNlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0xMFQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJtZWwifSwiU2NvcmUiOnsiTiI6IjYwIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZTY5NGY3NzYtMzJlNC00YzllLTk2MTYtZTQ5YmUxMjlhYmI0In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTNUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoicGF0In0sIlNjb3JlIjp7Ik4iOiI0OSJ9LCJHYW1lIjp7IlMiOiJQcmFpc2UgQWxsIE1vbnN0ZXJzIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6Ijk4NzQ4YWY3LTVmMWItNGE2NC1iZWM5LTdmYzBmMWJmNzQyMSJ9fV0sIlNjYW5uZWRDb3VudCI6OH0=" } }, { "ID": "80eaa98e3909e84e", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "260" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:55 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "HVG691T88NFM9MMS3G0NFSPIVNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "c208ea6b4bf425aa", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "251" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:55 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "0LHGST3UBVGUCKGFTR1KB4B003VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "7c6a1fafb4210e97", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "261" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:55 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "3PM0PNOV8Q7SE7VLNTH71VV2OVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "3be082c555b8fb02", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "261" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:55 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "I9I20B1TRBLP8AABRPIIGHKGTBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "d9d19042c29fd1cf", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "260" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:55 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "GC67NADNN520GD18LG73K26JFFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "523fd7074062e34b", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "254" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:55 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "6QRS6712SAL0RNOQE46I4B9C67VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "6dc5623df3543e6b", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "251" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:55 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "I6GCB2RDUTNNUAFGHRQMSGJNRBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "fef9fc3f94f08d00", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "252" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:55 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "T4I88J30SJR4KODURLHLI8CRMJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "02a6222c0c2f1faa", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "183" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Query" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "39" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:55 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3413411624" ], "X-Amzn-Requestid": [ "VNHSFO16NJ30IJ1ENTUCUJ9RKVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MCwiSXRlbXMiOltdLCJTY2FubmVkQ291bnQiOjB9" } }, { "ID": "cfce12c6a4df51c1", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "171" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "39" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:55 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3413411624" ], "X-Amzn-Requestid": [ "7E65ARNIJG2N77B9RN10JLU9BJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MCwiSXRlbXMiOltdLCJTY2FubmVkQ291bnQiOjB9" } }, { "ID": "e491183d47196bcf", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "326" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:55 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "ID3BDNUF16SK9BKEPOL4A553M7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "75f3c41a6d79556f", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "326" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "120" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:55 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "396270901" ], "X-Amzn-Requestid": [ "3LOVR02S6I5S8VR6SI2OUHANPRVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLmR5bmFtb2RiLnYyMDEyMDgxMCNDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uIiwibWVzc2FnZSI6IlRoZSBjb25kaXRpb25hbCByZXF1ZXN0IGZhaWxlZCJ9" } } ] } ================================================ FILE: docstore/awsdynamodb/v2/testdata/TestConformance/As/verify_As_returns_false_when_passed_nil.replay ================================================ { "Initial": "AQAAAA7hTg5jL2llZgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*", ".*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "c6eac505a50c1ad4", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DescribeTable" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1609" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:55 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "298093499" ], "X-Amzn-Requestid": [ "63QSN6PUHOCHMVA177T0BFN113VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJUYWJsZSI6eyJBdHRyaWJ1dGVEZWZpbml0aW9ucyI6W3siQXR0cmlidXRlTmFtZSI6IkdhbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9LHsiQXR0cmlidXRlTmFtZSI6IlBsYXllciIsIkF0dHJpYnV0ZVR5cGUiOiJTIn0seyJBdHRyaWJ1dGVOYW1lIjoiU2NvcmUiLCJBdHRyaWJ1dGVUeXBlIjoiTiJ9LHsiQXR0cmlidXRlTmFtZSI6IlRpbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9XSwiQ3JlYXRpb25EYXRlVGltZSI6MS43MjMwNzYwODA2OTVFOSwiRGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZCI6ZmFsc2UsIkdsb2JhbFNlY29uZGFyeUluZGV4ZXMiOlt7IkluZGV4QXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMi9pbmRleC9nbG9iYWwiLCJJbmRleE5hbWUiOiJnbG9iYWwiLCJJbmRleFNpemVCeXRlcyI6MTE4LCJJbmRleFN0YXR1cyI6IkFDVElWRSIsIkl0ZW1Db3VudCI6MSwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoiUGxheWVyIiwiS2V5VHlwZSI6IkhBU0gifSx7IkF0dHJpYnV0ZU5hbWUiOiJUaW1lIiwiS2V5VHlwZSI6IlJBTkdFIn1dLCJQcm9qZWN0aW9uIjp7IlByb2plY3Rpb25UeXBlIjoiQUxMIn0sIlByb3Zpc2lvbmVkVGhyb3VnaHB1dCI6eyJOdW1iZXJPZkRlY3JlYXNlc1RvZGF5IjowLCJSZWFkQ2FwYWNpdHlVbml0cyI6NSwiV3JpdGVDYXBhY2l0eVVuaXRzIjo1fSwiV2FybVRocm91Z2hwdXQiOnsiUmVhZFVuaXRzUGVyU2Vjb25kIjo1LCJTdGF0dXMiOiJBQ1RJVkUiLCJXcml0ZVVuaXRzUGVyU2Vjb25kIjo1fX1dLCJJdGVtQ291bnQiOjEsIktleVNjaGVtYSI6W3siQXR0cmlidXRlTmFtZSI6IkdhbWUiLCJLZXlUeXBlIjoiSEFTSCJ9LHsiQXR0cmlidXRlTmFtZSI6IlBsYXllciIsIktleVR5cGUiOiJSQU5HRSJ9XSwiTG9jYWxTZWNvbmRhcnlJbmRleGVzIjpbeyJJbmRleEFybiI6ImFybjphd3M6ZHluYW1vZGI6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3Njp0YWJsZS9kb2NzdG9yZS10ZXN0LTIvaW5kZXgvbG9jYWwiLCJJbmRleE5hbWUiOiJsb2NhbCIsIkluZGV4U2l6ZUJ5dGVzIjoxMTgsIkl0ZW1Db3VudCI6MSwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoiR2FtZSIsIktleVR5cGUiOiJIQVNIIn0seyJBdHRyaWJ1dGVOYW1lIjoiU2NvcmUiLCJLZXlUeXBlIjoiUkFOR0UifV0sIlByb2plY3Rpb24iOnsiUHJvamVjdGlvblR5cGUiOiJBTEwifX1dLCJQcm92aXNpb25lZFRocm91Z2hwdXQiOnsiTnVtYmVyT2ZEZWNyZWFzZXNUb2RheSI6MCwiUmVhZENhcGFjaXR5VW5pdHMiOjUsIldyaXRlQ2FwYWNpdHlVbml0cyI6NX0sIlRhYmxlQXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMiIsIlRhYmxlSWQiOiIwZDRmOTk4My1kOGE5LTRhZjEtYTY0NC05YmE3M2NlMGYyMjciLCJUYWJsZU5hbWUiOiJkb2NzdG9yZS10ZXN0LTIiLCJUYWJsZVNpemVCeXRlcyI6MTE4LCJUYWJsZVN0YXR1cyI6IkFDVElWRSIsIldhcm1UaHJvdWdocHV0Ijp7IlJlYWRVbml0c1BlclNlY29uZCI6NSwiU3RhdHVzIjoiQUNUSVZFIiwiV3JpdGVVbml0c1BlclNlY29uZCI6NX19fQ==" } }, { "ID": "134e692f6dbad9ed", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "54" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "235" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:56 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2313410729" ], "X-Amzn-Requestid": [ "GS6N6VFOP9NAC832GNU5P44ETNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MSwiSXRlbXMiOlt7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTI1VDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6InN0ZXBoIn0sIlNjb3JlIjp7Ik4iOiIyNCJ9LCJHYW1lIjp7IlMiOiJEYXlzIEdvbmUifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiM2I0YTNlYjQtODI4MC00Mjk5LThiNWEtODQ2YTI1MzYyZjI4In19XSwiU2Nhbm5lZENvdW50IjoxfQ==" } }, { "ID": "28011276d39aadd6", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "252" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:56 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "DIMQT0SS9D6PE5IBTVCDV41E5RVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "21687709c0e23be7", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "183" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Query" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "39" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:56 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3413411624" ], "X-Amzn-Requestid": [ "NBI63D2IPL8UHJ04CIA614GVOVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MCwiSXRlbXMiOltdLCJTY2FubmVkQ291bnQiOjB9" } }, { "ID": "363906ce391aa082", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "171" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "39" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:56 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3413411624" ], "X-Amzn-Requestid": [ "EHPPHNDIJ0TM72N74KNDKPRN47VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MCwiSXRlbXMiOltdLCJTY2FubmVkQ291bnQiOjB9" } }, { "ID": "2273746534e044c5", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "326" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:56 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "747CNFG6TK50NBCEG6TFQPTVL3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "df16818ec81b3b14", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "326" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "120" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:56 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "396270901" ], "X-Amzn-Requestid": [ "PH70HR6VLALIPFUGCJGLMIP047VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLmR5bmFtb2RiLnYyMDEyMDgxMCNDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uIiwibWVzc2FnZSI6IlRoZSBjb25kaXRpb25hbCByZXF1ZXN0IGZhaWxlZCJ9" } } ] } ================================================ FILE: docstore/awsdynamodb/v2/testdata/TestConformance/AtomicWrites.replay ================================================ { "Initial": "AQAAAA7hTg5BMVhvdAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*", ".*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "52897ae9a1122928", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DescribeTable" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "599" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:21 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3022004566" ], "X-Amzn-Requestid": [ "EE9GGR45HP1RK1KTHVFDK2MJKBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJUYWJsZSI6eyJBdHRyaWJ1dGVEZWZpbml0aW9ucyI6W3siQXR0cmlidXRlTmFtZSI6Im5hbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9XSwiQ3JlYXRpb25EYXRlVGltZSI6MS43MjMwNzYwNzk3OTdFOSwiRGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZCI6ZmFsc2UsIkl0ZW1Db3VudCI6MCwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoibmFtZSIsIktleVR5cGUiOiJIQVNIIn1dLCJQcm92aXNpb25lZFRocm91Z2hwdXQiOnsiTnVtYmVyT2ZEZWNyZWFzZXNUb2RheSI6MCwiUmVhZENhcGFjaXR5VW5pdHMiOjUsIldyaXRlQ2FwYWNpdHlVbml0cyI6NX0sIlRhYmxlQXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMSIsIlRhYmxlSWQiOiI5N2U0OTNmNC1jZjU3LTQ2YmItOTc4Ny1iOGU4ZDk3ZjUwMDciLCJUYWJsZU5hbWUiOiJkb2NzdG9yZS10ZXN0LTEiLCJUYWJsZVNpemVCeXRlcyI6MCwiVGFibGVTdGF0dXMiOiJBQ1RJVkUiLCJXYXJtVGhyb3VnaHB1dCI6eyJSZWFkVW5pdHNQZXJTZWNvbmQiOjUsIlN0YXR1cyI6IkFDVElWRSIsIldyaXRlVW5pdHNQZXJTZWNvbmQiOjV9fX0=" } }, { "ID": "772e590a59b37b4a", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "951" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:21 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2510641524" ], "X-Amzn-Requestid": [ "DA5FHTNB4NFH30C5FDH7R8D977VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6NSwiSXRlbXMiOlt7IkIiOnsiQk9PTCI6dHJ1ZX0sIlN0Ijp7Ik5VTEwiOnRydWV9LCJVIjp7Ik4iOiIwIn0sIkYiOnsiTiI6IjAifSwiSSI6eyJOIjoiMCJ9LCJFdGFnIjp7IlMiOiI0MmYxZjY5Ni0yNTM0LTRiZTgtODg3OC1lZmVkNzE3NTFjNTcifSwiTSI6eyJOVUxMIjp0cnVlfSwibmFtZSI6eyJTIjoidGVzdENyZWF0ZVN0cnVjdCJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7Ik5VTEwiOnRydWV9fSx7Im5hbWUiOnsiUyI6InRlc3RDcmVhdGVNYXAifSwiRXRhZyI6eyJTIjoiNWVhZDQxMDgtOWNiOC00YmE1LWExYzItNjNkMTQzOGZlODU2In0sImIiOnsiQk9PTCI6dHJ1ZX19LHsiRXRhZyI6eyJTIjoiMDkwYjAxYjUtOTIwOC00YWRlLTk4YWItZjkwMDZhYTE4ZjNjIn0sIm5hbWUiOnsiUyI6ImMxOGRmNDEzLTYyMzMtNGU1MS1hZDg4LTkzZWJjZmRjMzI1NCJ9LCJiIjp7IkJPT0wiOnRydWV9fSx7IkIiOnsiQk9PTCI6dHJ1ZX0sIlN0Ijp7Ik5VTEwiOnRydWV9LCJVIjp7Ik4iOiIwIn0sIkYiOnsiTiI6IjAifSwiSSI6eyJOIjoiMCJ9LCJFdGFnIjp7IlMiOiIwOWRiZTM3Ny0yMzg2LTQzYzktYmEwNi02NjgwYjRjYTI1NzQifSwiTSI6eyJOVUxMIjp0cnVlfSwibmFtZSI6eyJTIjoiY2ZhZDUzM2MtZDJjNy00ZjEzLTg4NDgtYTE5NTg0NzNlZmY4In0sIkRvY3N0b3JlUmV2aXNpb24iOnsiTlVMTCI6dHJ1ZX19LHsiQiI6eyJCT09MIjp0cnVlfSwiU3QiOnsiTlVMTCI6dHJ1ZX0sIlUiOnsiTiI6IjAifSwiRiI6eyJOIjoiMCJ9LCJJIjp7Ik4iOiIwIn0sIkV0YWciOnsiUyI6ImMyMDYyZDI3LWJlMWYtNDZmZC05ZTc2LTk3Njk0YjUxYzMzMCJ9LCJNIjp7Ik5VTEwiOnRydWV9LCJuYW1lIjp7IlMiOiIzMWNjZGU2YS0xZTFiLTRiN2UtYWE0Ni04ZjRmOTIyZjVhNTUifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJOVUxMIjp0cnVlfX1dLCJTY2FubmVkQ291bnQiOjV9" } }, { "ID": "61fbd92cd80fc8c8", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "71" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:21 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "DIKS2DI1LTREK8F8S238M766LJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "4e7589b8910bda2e", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "91" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:22 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "4MSKRJPOI6E1R33O2MCUC08ANNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "34e5b6f18de165dc", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "68" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:22 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "RBLDOMKR3BP0SEF3NJBHINQVRFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "3327e57a92edfca3", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "91" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:22 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "9HDHURD0TV88KNTL3NFSLR88GJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "252f2340397d5b6c", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "91" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:22 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "FMPC0TRN442ECC92R44TVI26KVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "422148d5903fff49", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "242" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:22 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "NUI1419BKFLVH2A3KURVEKOGQVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "55ac689d26edf0ec", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "242" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:22 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "AC36MUOF4JNPQ01VTH9MMPTVANVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "92a86a1140d55361", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "242" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:22 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "QDKH5UB8JG33OBOIACSBLNKJTBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "5d540e46f1dbfba5", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "242" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:22 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "EIJQ5LB7QNNH32K0PC249TEHJNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "ab3f54659f67ff55", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "242" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:22 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "KQEKFJN26FCCA494MFRKITIIKJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "6ee00e56c60169cb", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "242" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:22 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "2JM1RRRKAM5VP6BJVVR059C793VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "e76fbc1fcb79ffca", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "242" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:22 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "PESA7GAVQ2R1689OLG95OIL4NVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "0554d5dd53398317", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "242" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:22 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "98VNJO5TR85DNRGDF7T519H0JVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "8d026322d3b8fd70", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "242" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:22 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "HE8U8J3VTJ1MAH59IA280M7R4NVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "63760f9b09f6888c", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "237" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:22 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "LVO4O94T202IUM4KQ5CJ0AT8A7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "8bf88582919c7ea9", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "174" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "395" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:22 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3192331083" ], "X-Amzn-Requestid": [ "K9709N3E45KD98S5651J9PIR1NVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0QXRvbWljV3JpdGVzNCJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiI3MDMzZmM0MC03NTA3LTRiYzAtYjFjMC04MTIyMmMwMzk0ZjYifSwicyI6eyJTIjoiNCJ9fSx7Im5hbWUiOnsiUyI6InRlc3RBdG9taWNXcml0ZXMzIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6IjRhNGRmZmZlLTZiN2ItNDExOC05YjMzLTQxYzQxNDRmMGZlMiJ9LCJzIjp7IlMiOiIzIn19LHsibmFtZSI6eyJTIjoidGVzdEF0b21pY1dyaXRlczUifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiMjJlMzA5NTctYjExOS00ZjBhLTkyYjgtN2EyOTRmYmVlMTM3In0sInMiOnsiUyI6IjUifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "0298a253a8661ab8", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "237" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:22 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "VH0EQDUC6DPR9HNQO7437BH2BBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "d017d305ce98aa28", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "1183" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.TransactWriteItems" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:22 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "35FJ645LSJLET48TV21PMIMIU7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "175fb4a7388fab2e", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "237" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:22 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "RDOBBON900RCVSUQ1999QREVMBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "495c90e93d808d02", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "104" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "170" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:22 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2981132607" ], "X-Amzn-Requestid": [ "NIBCBTKFL37HT10V99JFQE8BG7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJmNzY3ZTdlYi01MzQ1LTQzMjEtYTM0Ny1hYzQ1ODdiMGNmZGYifSwibmFtZSI6eyJTIjoidGVzdEF0b21pY1dyaXRlczYifSwicyI6eyJTIjoiNjYifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "60c99364c5993756", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "104" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "170" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:22 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2197386901" ], "X-Amzn-Requestid": [ "TLFAVGJCV5QCDRB645BSHOBQHNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJjNGI5YTYyYy1mYzZjLTQ2ZDktOGM3Yi1mYTIyNWEwMTU4YmIifSwibmFtZSI6eyJTIjoidGVzdEF0b21pY1dyaXRlczcifSwicyI6eyJTIjoiNzcifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "b07ee46289ef205f", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "104" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "170" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:22 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "1394891772" ], "X-Amzn-Requestid": [ "6IRSFPQC8B3FEV2SO49VSF42ABVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiI2NjU1MWI0NS1jZWY2LTRmYzEtYTY1OS1jYTQzODcxZDJjYzQifSwicyI6eyJTIjoiODgifSwibmFtZSI6eyJTIjoidGVzdEF0b21pY1dyaXRlczgifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "be126c32f85d8ebd", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DescribeTable" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "599" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:23 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3022004566" ], "X-Amzn-Requestid": [ "0T2HI7HH0TMDV93GRDQHS5G9NJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJUYWJsZSI6eyJBdHRyaWJ1dGVEZWZpbml0aW9ucyI6W3siQXR0cmlidXRlTmFtZSI6Im5hbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9XSwiQ3JlYXRpb25EYXRlVGltZSI6MS43MjMwNzYwNzk3OTdFOSwiRGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZCI6ZmFsc2UsIkl0ZW1Db3VudCI6MCwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoibmFtZSIsIktleVR5cGUiOiJIQVNIIn1dLCJQcm92aXNpb25lZFRocm91Z2hwdXQiOnsiTnVtYmVyT2ZEZWNyZWFzZXNUb2RheSI6MCwiUmVhZENhcGFjaXR5VW5pdHMiOjUsIldyaXRlQ2FwYWNpdHlVbml0cyI6NX0sIlRhYmxlQXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMSIsIlRhYmxlSWQiOiI5N2U0OTNmNC1jZjU3LTQ2YmItOTc4Ny1iOGU4ZDk3ZjUwMDciLCJUYWJsZU5hbWUiOiJkb2NzdG9yZS10ZXN0LTEiLCJUYWJsZVNpemVCeXRlcyI6MCwiVGFibGVTdGF0dXMiOiJBQ1RJVkUiLCJXYXJtVGhyb3VnaHB1dCI6eyJSZWFkVW5pdHNQZXJTZWNvbmQiOjUsIlN0YXR1cyI6IkFDVElWRSIsIldyaXRlVW5pdHNQZXJTZWNvbmQiOjV9fX0=" } }, { "ID": "f991b4ab442cd2ae", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "719" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:23 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "715888603" ], "X-Amzn-Requestid": [ "UFAC0K8DV6BFBJUC4A2Q2E86C7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6NiwiSXRlbXMiOlt7IkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6IjY2NTUxYjQ1LWNlZjYtNGZjMS1hNjU5LWNhNDM4NzFkMmNjNCJ9LCJuYW1lIjp7IlMiOiJ0ZXN0QXRvbWljV3JpdGVzOCJ9LCJzIjp7IlMiOiI4OCJ9fSx7IkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImM0YjlhNjJjLWZjNmMtNDZkOS04YzdiLWZhMjI1YTAxNThiYiJ9LCJuYW1lIjp7IlMiOiJ0ZXN0QXRvbWljV3JpdGVzNyJ9LCJzIjp7IlMiOiI3NyJ9fSx7Im5hbWUiOnsiUyI6InRlc3RBdG9taWNXcml0ZXM0In0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6IjcwMzNmYzQwLTc1MDctNGJjMC1iMWMwLTgxMjIyYzAzOTRmNiJ9LCJzIjp7IlMiOiI0In19LHsibmFtZSI6eyJTIjoidGVzdEF0b21pY1dyaXRlczUifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiMjJlMzA5NTctYjExOS00ZjBhLTkyYjgtN2EyOTRmYmVlMTM3In0sInMiOnsiUyI6IjUifX0seyJuYW1lIjp7IlMiOiJ0ZXN0QXRvbWljV3JpdGVzMyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiI0YTRkZmZmZS02YjdiLTQxMTgtOWIzMy00MWM0MTQ0ZjBmZTIifSwicyI6eyJTIjoiMyJ9fSx7IkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImY3NjdlN2ViLTUzNDUtNDMyMS1hMzQ3LWFjNDU4N2IwY2ZkZiJ9LCJuYW1lIjp7IlMiOiJ0ZXN0QXRvbWljV3JpdGVzNiJ9LCJzIjp7IlMiOiI2NiJ9fV0sIlNjYW5uZWRDb3VudCI6Nn0=" } }, { "ID": "31e2b33c406c5e82", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "72" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:23 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "QN97LVPAE4MJEJLSVNML4QQBCFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "ecbd5a915ab9103d", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "72" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:23 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "OI727N77509RK34MNF7UTBJ2V7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "40f55b1c389a4182", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "72" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:23 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "B48I3AG38PQ90SHQBFPTCT4LTRVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "bbf678e759ff24ff", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "72" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:23 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "957GH3FKQRC1RF00E119FN7GUVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "b067e6e9b3ad91b9", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "72" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:23 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "M4F2B8DIIBURJTCFMM759A8NBVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "d7fe57869bb1c16b", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "72" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:23 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "7QAOI5D8CKU71MQH0869FJDGBFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "e1537be35852280d", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "230" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:23 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "JOQDTDDCT8Q51F4856BAMLHHCBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "f42930d283edc9f7", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "230" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:23 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "H89S0V062C1FVLHU6JTJ0QBC4RVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "2090f2338517ebc2", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "230" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:23 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "H9S8GO2A81DEE0R89B18SASG8JVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "17a69731dcc3595d", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "230" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:23 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "5OQGGQG4L33CPPFNU66VKN6G3JVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "bfed3e0ae19e5453", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "230" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:23 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "07JUC6E901K5JK75KBK1TOLMNBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "94b899fef29d1ad0", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "230" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:23 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "0DB2EE8DMFGNA5B894JNS4HUPFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "ce29bd7eb378c5c1", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "230" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:23 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "3CEPGFSS84EPN6LQ14LNA4QTOJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "c17baef5ad691c46", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "230" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:23 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "J0IVM128HIE26AC7I0CS29511NVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "943773fbd0404b57", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "230" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:23 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "0UHR5K19RBRKC9RQ0EJQATNGHFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "01f1571a655e6bbc", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "174" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "359" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:23 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "4018404801" ], "X-Amzn-Requestid": [ "HF45K77O1KQDVLF2VOA6RVTRTRVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0QXRvbWljV3JpdGVzNSJ9LCJFdGFnIjp7IlMiOiIyYmY0ZTZjNC1mYzlmLTQyMmQtODAxMi0wOTI3MjYyNWI0YzEifSwicyI6eyJTIjoiNSJ9fSx7Im5hbWUiOnsiUyI6InRlc3RBdG9taWNXcml0ZXMzIn0sIkV0YWciOnsiUyI6IjRiZjAxYzVkLWI5NTctNGNhOC04MjYyLTY4ZTk3MWI4NmJmNiJ9LCJzIjp7IlMiOiIzIn19LHsiRXRhZyI6eyJTIjoiN2YwODdiOGUtNjE5YS00MzMwLTk5ZWMtZjJkM2UwMDA1OGM1In0sIm5hbWUiOnsiUyI6InRlc3RBdG9taWNXcml0ZXM0In0sInMiOnsiUyI6IjQifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "5f0afcfc12143de3", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "225" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:23 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "10QDBH9SNENQ606374566839C3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "4432cad6cbd1590d", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "225" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:23 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "8J79I5U6STC0MRGLR0SG1UOQDBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "1b53ab46fb00ab62", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "225" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:23 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "M09LT0N15N3175COGFT5AJ92Q7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "28f6b3e61b6c9d58", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "1147" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.TransactWriteItems" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:23 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "5HJ0T697BSFQNCNNPBL4OCD80RVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "3b4b908e405f7f46", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "104" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "158" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:23 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3988198299" ], "X-Amzn-Requestid": [ "NS6CV587TG4P7G6VMJNIEQRMKFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJFdGFnIjp7IlMiOiJkODQ2M2VkNS05OWNmLTQwNzMtOGM5MC0wMDIzNDBkNGYwMGMifSwibmFtZSI6eyJTIjoidGVzdEF0b21pY1dyaXRlczYifSwicyI6eyJTIjoiNjYifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "932e5c178a4aa53b", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "104" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "158" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:23 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2318731546" ], "X-Amzn-Requestid": [ "5L8TVVFTED38MRD1SHKHIPBTUVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0QXRvbWljV3JpdGVzNyJ9LCJFdGFnIjp7IlMiOiIxNTljNTcxYi03ODkyLTRmOWEtYmEyNC1hNTdlNTU3MWIwZjIifSwicyI6eyJTIjoiNzcifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "4759efd164263190", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "104" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "158" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:23 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2439273515" ], "X-Amzn-Requestid": [ "GK588URJDKAV3L1VPE9RHTBBSBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJzIjp7IlMiOiI4OCJ9LCJFdGFnIjp7IlMiOiJiMWE0NGUxOC03MzE1LTRhYzgtOGM1OS04MGVmNjY4ZDM3OGYifSwibmFtZSI6eyJTIjoidGVzdEF0b21pY1dyaXRlczgifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } } ] } ================================================ FILE: docstore/awsdynamodb/v2/testdata/TestConformance/AtomicWritesFail.replay ================================================ { "Initial": "AQAAAA7hTg5EBMqE3QAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*", ".*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "f678798d5c35dd13", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DescribeTable" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "599" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:24 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3022004566" ], "X-Amzn-Requestid": [ "EU6B5F8LKN7SD6GFHIF58PU9IRVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJUYWJsZSI6eyJBdHRyaWJ1dGVEZWZpbml0aW9ucyI6W3siQXR0cmlidXRlTmFtZSI6Im5hbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9XSwiQ3JlYXRpb25EYXRlVGltZSI6MS43MjMwNzYwNzk3OTdFOSwiRGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZCI6ZmFsc2UsIkl0ZW1Db3VudCI6MCwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoibmFtZSIsIktleVR5cGUiOiJIQVNIIn1dLCJQcm92aXNpb25lZFRocm91Z2hwdXQiOnsiTnVtYmVyT2ZEZWNyZWFzZXNUb2RheSI6MCwiUmVhZENhcGFjaXR5VW5pdHMiOjUsIldyaXRlQ2FwYWNpdHlVbml0cyI6NX0sIlRhYmxlQXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMSIsIlRhYmxlSWQiOiI5N2U0OTNmNC1jZjU3LTQ2YmItOTc4Ny1iOGU4ZDk3ZjUwMDciLCJUYWJsZU5hbWUiOiJkb2NzdG9yZS10ZXN0LTEiLCJUYWJsZVNpemVCeXRlcyI6MCwiVGFibGVTdGF0dXMiOiJBQ1RJVkUiLCJXYXJtVGhyb3VnaHB1dCI6eyJSZWFkVW5pdHNQZXJTZWNvbmQiOjUsIlN0YXR1cyI6IkFDVElWRSIsIldyaXRlVW5pdHNQZXJTZWNvbmQiOjV9fX0=" } }, { "ID": "6ef30997f1005285", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "647" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:24 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2662735603" ], "X-Amzn-Requestid": [ "7H6NPFIO0LR3RD2CNFEPJ1NMEJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6NiwiSXRlbXMiOlt7IkV0YWciOnsiUyI6ImIxYTQ0ZTE4LTczMTUtNGFjOC04YzU5LTgwZWY2NjhkMzc4ZiJ9LCJuYW1lIjp7IlMiOiJ0ZXN0QXRvbWljV3JpdGVzOCJ9LCJzIjp7IlMiOiI4OCJ9fSx7Im5hbWUiOnsiUyI6InRlc3RBdG9taWNXcml0ZXM3In0sIkV0YWciOnsiUyI6IjE1OWM1NzFiLTc4OTItNGY5YS1iYTI0LWE1N2U1NTcxYjBmMiJ9LCJzIjp7IlMiOiI3NyJ9fSx7IkV0YWciOnsiUyI6IjdmMDg3YjhlLTYxOWEtNDMzMC05OWVjLWYyZDNlMDAwNThjNSJ9LCJuYW1lIjp7IlMiOiJ0ZXN0QXRvbWljV3JpdGVzNCJ9LCJzIjp7IlMiOiI0In19LHsibmFtZSI6eyJTIjoidGVzdEF0b21pY1dyaXRlczUifSwiRXRhZyI6eyJTIjoiMmJmNGU2YzQtZmM5Zi00MjJkLTgwMTItMDkyNzI2MjViNGMxIn0sInMiOnsiUyI6IjUifX0seyJuYW1lIjp7IlMiOiJ0ZXN0QXRvbWljV3JpdGVzMyJ9LCJFdGFnIjp7IlMiOiI0YmYwMWM1ZC1iOTU3LTRjYTgtODI2Mi02OGU5NzFiODZiZjYifSwicyI6eyJTIjoiMyJ9fSx7IkV0YWciOnsiUyI6ImQ4NDYzZWQ1LTk5Y2YtNDA3My04YzkwLTAwMjM0MGQ0ZjAwYyJ9LCJuYW1lIjp7IlMiOiJ0ZXN0QXRvbWljV3JpdGVzNiJ9LCJzIjp7IlMiOiI2NiJ9fV0sIlNjYW5uZWRDb3VudCI6Nn0=" } }, { "ID": "e3755cacf848127a", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "72" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:24 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "JB3S0ODATHSDOBIFG3868FB2VFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "5e7af10d4d217bcb", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "72" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:24 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "EGNQ3G5995SCP72JBSV5LH9327VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "15526b2c95ce9de1", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "72" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:24 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "2IP8ADDGFTQOSOFUQGQ628PR5VVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "403074f002b614c6", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "72" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:24 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "13V8M0RVJA6EO2T34KFLMR47OBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "8730c59878f63bc0", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "72" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:24 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "NNPRBBPVVUJANPEAU60S5GMTDNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "3eb94d552daf7f9a", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "72" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:24 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "RISR1RP2QQBU505ETTIKVS6IPFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "1a30ef9d69782e18", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "242" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:24 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "AUQO4NQ78OU90L3U0EG60CAPVBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "364261e212b44e14", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "242" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:24 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "31TUR5RL175SAU19QH11K606QRVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "90890c84a0dc4344", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "242" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:24 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "D0A2CGT2S783FDHSL496J0R5DBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "00dbbfa8b435c768", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "242" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:24 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "0D9TE7LFPAMOQNTJI26J15UGAVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "449a948a01335b46", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "242" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:24 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "02E26EN9V4KD8G6A6F30G8B4H7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "46b494a2ec4b0900", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "242" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:24 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "RN7BJEUFKJRMPFOHPBNR12G5A3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "b43d0632ae9daf41", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "242" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:24 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "RBROOVPJA9GBCIOQSROHAAUABRVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "31503e5a866515e5", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "242" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:24 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "B7T7VJ3P9FF43VFI9EKEOOGE1JVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "e7356f5179b6fe6f", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "174" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "395" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:24 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2863734082" ], "X-Amzn-Requestid": [ "STH1FA1J5HD08BVL82DS4UECQ7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0QXRvbWljV3JpdGVzNSJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiIyMzYwMWQ2ZS1jZTVmLTQ0M2QtYjAxYy03N2YzNTExMmI2ZjgifSwicyI6eyJTIjoiNSJ9fSx7Im5hbWUiOnsiUyI6InRlc3RBdG9taWNXcml0ZXM0In0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6IjBjNDk4Mzc4LWUzNGQtNDEzNy04ZDRhLWQwYjBiNWQ1Y2I4ZSJ9LCJzIjp7IlMiOiI0In19LHsibmFtZSI6eyJTIjoidGVzdEF0b21pY1dyaXRlczMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZTBjOTVkNTgtY2M4ZS00NDRmLTk2YzctMTAzYzdlZWVlM2Y1In0sInMiOnsiUyI6IjMifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "43401216315ae5d8", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "1159" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.TransactWriteItems" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "334" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:25 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2597991568" ], "X-Amzn-Requestid": [ "8ATFI6GQ481K3UCIIM0P4KA4RVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLmR5bmFtb2RiLnYyMDEyMDgxMCNUcmFuc2FjdGlvbkNhbmNlbGVkRXhjZXB0aW9uIiwiQ2FuY2VsbGF0aW9uUmVhc29ucyI6W3siQ29kZSI6Ik5vbmUifSx7IkNvZGUiOiJOb25lIn0seyJDb2RlIjoiQ29uZGl0aW9uYWxDaGVja0ZhaWxlZCIsIk1lc3NhZ2UiOiJUaGUgY29uZGl0aW9uYWwgcmVxdWVzdCBmYWlsZWQifV0sIk1lc3NhZ2UiOiJUcmFuc2FjdGlvbiBjYW5jZWxsZWQsIHBsZWFzZSByZWZlciBjYW5jZWxsYXRpb24gcmVhc29ucyBmb3Igc3BlY2lmaWMgcmVhc29ucyBbTm9uZSwgTm9uZSwgQ29uZGl0aW9uYWxDaGVja0ZhaWxlZF0ifQ==" } }, { "ID": "d6fad06b4db871c4", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "237" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:25 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "CDBD9UGHKS9T1S4FBTP46ECD9JVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "75b3d7a20f2b5920", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "237" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:25 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "PBPQE37GU5Q977458GLHD9O1TJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "49cb3bb9185cd763", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "237" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:25 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "AD5FFERLD8UU6S90BGMVNSU2L3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "bc3a7d5f0e28cdeb", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "104" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "169" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:25 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "1204259765" ], "X-Amzn-Requestid": [ "O83VA0AN8U5PDRH2VOFVPD32HVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0QXRvbWljV3JpdGVzNiJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiIxNWE3YTdhMi01ZTk2LTQ0Y2ItOWJmNC0zZGFmZmIwYzg1ZTEifSwicyI6eyJTIjoiNiJ9fV19LCJVbnByb2Nlc3NlZEtleXMiOnt9fQ==" } }, { "ID": "f4515ff4e3060834", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "104" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "169" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:25 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "328980544" ], "X-Amzn-Requestid": [ "MGU1JJQUNMKKUT5H44TUIBDKERVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJzIjp7IlMiOiI3In0sIm5hbWUiOnsiUyI6InRlc3RBdG9taWNXcml0ZXM3In0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6IjQ5MGM3N2RjLWQ3NGQtNDExYS1hZWIxLTdmNzAyM2Q0OTlkMSJ9fV19LCJVbnByb2Nlc3NlZEtleXMiOnt9fQ==" } }, { "ID": "af55f6f1fc7363e9", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DescribeTable" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "599" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:25 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3022004566" ], "X-Amzn-Requestid": [ "8S16660C2TERBL0UHC6US0KR63VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJUYWJsZSI6eyJBdHRyaWJ1dGVEZWZpbml0aW9ucyI6W3siQXR0cmlidXRlTmFtZSI6Im5hbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9XSwiQ3JlYXRpb25EYXRlVGltZSI6MS43MjMwNzYwNzk3OTdFOSwiRGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZCI6ZmFsc2UsIkl0ZW1Db3VudCI6MCwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoibmFtZSIsIktleVR5cGUiOiJIQVNIIn1dLCJQcm92aXNpb25lZFRocm91Z2hwdXQiOnsiTnVtYmVyT2ZEZWNyZWFzZXNUb2RheSI6MCwiUmVhZENhcGFjaXR5VW5pdHMiOjUsIldyaXRlQ2FwYWNpdHlVbml0cyI6NX0sIlRhYmxlQXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMSIsIlRhYmxlSWQiOiI5N2U0OTNmNC1jZjU3LTQ2YmItOTc4Ny1iOGU4ZDk3ZjUwMDciLCJUYWJsZU5hbWUiOiJkb2NzdG9yZS10ZXN0LTEiLCJUYWJsZVNpemVCeXRlcyI6MCwiVGFibGVTdGF0dXMiOiJBQ1RJVkUiLCJXYXJtVGhyb3VnaHB1dCI6eyJSZWFkVW5pdHNQZXJTZWNvbmQiOjUsIlN0YXR1cyI6IkFDVElWRSIsIldyaXRlVW5pdHNQZXJTZWNvbmQiOjV9fX0=" } }, { "ID": "8aa7f8e184c6890a", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "603" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:25 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "1413983119" ], "X-Amzn-Requestid": [ "SLGCDCFKLU0D303QCBDI1GEEUBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6NSwiSXRlbXMiOlt7Im5hbWUiOnsiUyI6InRlc3RBdG9taWNXcml0ZXM3In0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6IjQ5MGM3N2RjLWQ3NGQtNDExYS1hZWIxLTdmNzAyM2Q0OTlkMSJ9LCJzIjp7IlMiOiI3In19LHsibmFtZSI6eyJTIjoidGVzdEF0b21pY1dyaXRlczQifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiMGM0OTgzNzgtZTM0ZC00MTM3LThkNGEtZDBiMGI1ZDVjYjhlIn0sInMiOnsiUyI6IjQifX0seyJuYW1lIjp7IlMiOiJ0ZXN0QXRvbWljV3JpdGVzNSJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiIyMzYwMWQ2ZS1jZTVmLTQ0M2QtYjAxYy03N2YzNTExMmI2ZjgifSwicyI6eyJTIjoiNSJ9fSx7Im5hbWUiOnsiUyI6InRlc3RBdG9taWNXcml0ZXMzIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImUwYzk1ZDU4LWNjOGUtNDQ0Zi05NmM3LTEwM2M3ZWVlZTNmNSJ9LCJzIjp7IlMiOiIzIn19LHsibmFtZSI6eyJTIjoidGVzdEF0b21pY1dyaXRlczYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiMTVhN2E3YTItNWU5Ni00NGNiLTliZjQtM2RhZmZiMGM4NWUxIn0sInMiOnsiUyI6IjYifX1dLCJTY2FubmVkQ291bnQiOjV9" } }, { "ID": "84454e4f080e75d6", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "72" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:25 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "1FEPCJ5GNGFARFL0E2KCDT6JARVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "cdce89fc17a606ef", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "72" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:25 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "OHNOR8TTNVPRRMU9VNG9PD19TNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "d7a733c0eac3b404", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "72" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:25 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "P5FRMSJA3LSEVGKP1POOHPDR73VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "f6d1c297e12114d4", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "72" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:25 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "PBKTG82AQF9OFQT2MAV62KPC2FVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "cc851ba319e86ea4", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "72" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:25 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "U5MGVGOTTMP2IQ3BPN9PG2IFQJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "1d59b0c3b45bea8e", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "230" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:25 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "CD4A80389BMRKJRI3GJ3NKU2PJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "6345f9e34e4b365f", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "230" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:25 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "JNTE16ET9DPNR1FR2MFU56HISBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "9eca7007c4abfe77", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "230" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:25 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "1I5U71EAQDRK7H14L9VL6N0QDNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "ac78b473f04cec96", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "230" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:25 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "SQR26LIPTUORD6O4FV2M9F3AIBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "f8e593ee2379043d", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "230" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:25 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "1V9MSFQ6V0E7G91FT525NHT7AVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "ada673fbe71d0e19", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "230" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:25 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "ECET9T7P3R4VTK16G8291R6P6FVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "7f01e2f3cd1c3dd4", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "230" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:25 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "VBL5268K8H0T3VHJ874TKA5J27VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "90bab56bfe74d7c0", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "230" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:25 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "SK6DUUV42QPGU7CN8K9JVOMRH7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "52218ef71a6878f0", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "225" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:25 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "4KHHLQSPK8L3LM291Q3MP1DTSNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "26677fa289512fe6", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "174" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "359" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:25 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "4131564618" ], "X-Amzn-Requestid": [ "GBDQVNB5DL5I9UG1DASDEQ4VOBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0QXRvbWljV3JpdGVzNCJ9LCJFdGFnIjp7IlMiOiJlOGVjNjBiYS01MWI4LTRjOTUtODIxNy0yMTYyZGQyNzBlMWEifSwicyI6eyJTIjoiNCJ9fSx7Im5hbWUiOnsiUyI6InRlc3RBdG9taWNXcml0ZXMzIn0sIkV0YWciOnsiUyI6IjlkZWI3NDE2LWFiMTQtNGFkNC1iYTYyLTJhODc0YzQwN2Y2OSJ9LCJzIjp7IlMiOiIzIn19LHsiRXRhZyI6eyJTIjoiNzYyY2RhZWYtZmMzYi00MTdkLTlhMDItYWNhMmJjZjhlYTMyIn0sIm5hbWUiOnsiUyI6InRlc3RBdG9taWNXcml0ZXM1In0sInMiOnsiUyI6IjUifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "9296139596fe0010", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "225" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:26 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "QEAA8IJQKOE9VLHMR39QATLGHFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "a6754e21aa1508aa", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "1123" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.TransactWriteItems" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "334" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:26 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2597991568" ], "X-Amzn-Requestid": [ "B204ENGJLPUU100FNE2JQ3E26JVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLmR5bmFtb2RiLnYyMDEyMDgxMCNUcmFuc2FjdGlvbkNhbmNlbGVkRXhjZXB0aW9uIiwiQ2FuY2VsbGF0aW9uUmVhc29ucyI6W3siQ29kZSI6Ik5vbmUifSx7IkNvZGUiOiJOb25lIn0seyJDb2RlIjoiQ29uZGl0aW9uYWxDaGVja0ZhaWxlZCIsIk1lc3NhZ2UiOiJUaGUgY29uZGl0aW9uYWwgcmVxdWVzdCBmYWlsZWQifV0sIk1lc3NhZ2UiOiJUcmFuc2FjdGlvbiBjYW5jZWxsZWQsIHBsZWFzZSByZWZlciBjYW5jZWxsYXRpb24gcmVhc29ucyBmb3Igc3BlY2lmaWMgcmVhc29ucyBbTm9uZSwgTm9uZSwgQ29uZGl0aW9uYWxDaGVja0ZhaWxlZF0ifQ==" } }, { "ID": "dd6ab1666c45e154", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "225" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:26 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "T2FA0B17HC1IAQJFBOGG8IE3URVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "e9966ca9a559bf3e", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "104" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "157" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:26 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "1409494987" ], "X-Amzn-Requestid": [ "AE1R5UCKOK7FU163UK4AVC5IINVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJFdGFnIjp7IlMiOiI3ODUzZGY5OC1lMDFjLTQ2NTMtYjU2Mi01NjNjNjU4NjM4NmUifSwibmFtZSI6eyJTIjoidGVzdEF0b21pY1dyaXRlczYifSwicyI6eyJTIjoiNiJ9fV19LCJVbnByb2Nlc3NlZEtleXMiOnt9fQ==" } }, { "ID": "62cb3af552c7cefd", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "104" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "157" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:26 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "670681397" ], "X-Amzn-Requestid": [ "JENHNR8P1SOK4MSU42PI4A7AHNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJzIjp7IlMiOiI3In0sIm5hbWUiOnsiUyI6InRlc3RBdG9taWNXcml0ZXM3In0sIkV0YWciOnsiUyI6ImUzYWUwYjQ2LTFjMzgtNGI1OC04YjEwLWI2MjVmM2YwMTBhZCJ9fV19LCJVbnByb2Nlc3NlZEtleXMiOnt9fQ==" } } ] } ================================================ FILE: docstore/awsdynamodb/v2/testdata/TestConformance/BeforeDo.replay ================================================ { "Initial": "AQAAAA7hTg5hNLSZIAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*", ".*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "1e1d4f67263f52e5", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DescribeTable" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "599" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:54 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3022004566" ], "X-Amzn-Requestid": [ "TP3GBRCSBIH0UIOT9E38JM3SEJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJUYWJsZSI6eyJBdHRyaWJ1dGVEZWZpbml0aW9ucyI6W3siQXR0cmlidXRlTmFtZSI6Im5hbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9XSwiQ3JlYXRpb25EYXRlVGltZSI6MS43MjMwNzYwNzk3OTdFOSwiRGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZCI6ZmFsc2UsIkl0ZW1Db3VudCI6MCwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoibmFtZSIsIktleVR5cGUiOiJIQVNIIn1dLCJQcm92aXNpb25lZFRocm91Z2hwdXQiOnsiTnVtYmVyT2ZEZWNyZWFzZXNUb2RheSI6MCwiUmVhZENhcGFjaXR5VW5pdHMiOjUsIldyaXRlQ2FwYWNpdHlVbml0cyI6NX0sIlRhYmxlQXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMSIsIlRhYmxlSWQiOiI5N2U0OTNmNC1jZjU3LTQ2YmItOTc4Ny1iOGU4ZDk3ZjUwMDciLCJUYWJsZU5hbWUiOiJkb2NzdG9yZS10ZXN0LTEiLCJUYWJsZVNpemVCeXRlcyI6MCwiVGFibGVTdGF0dXMiOiJBQ1RJVkUiLCJXYXJtVGhyb3VnaHB1dCI6eyJSZWFkVW5pdHNQZXJTZWNvbmQiOjUsIlN0YXR1cyI6IkFDVElWRSIsIldyaXRlVW5pdHNQZXJTZWNvbmQiOjV9fX0=" } }, { "ID": "dbaf677d3a092a49", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "39" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:54 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3413411624" ], "X-Amzn-Requestid": [ "J6H23V8O6EP41GKFIGCDCRJAARVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MCwiSXRlbXMiOltdLCJTY2FubmVkQ291bnQiOjB9" } }, { "ID": "6840035adabbfe7c", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "159" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:54 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "A4CF6FTCTA3RTIK1PCA2VUF9SBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "42e1e0cc4bb9f3c8", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "155" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:54 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "0JJUQN821FE837JBFJVNQ34UQFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "1ae65e1ff0233f55", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "68" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:54 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "QQHFD1BQF8N7CRMCJDQFRJSCDJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "7e32dc149dcdffa5", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "243" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.UpdateItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:54 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "J277J578TUMI7185OK1K5BV6IRVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "9e6a9a98196b3918", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "99" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "100" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:54 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3495001968" ], "X-Amzn-Requestid": [ "UEP4O4HBI8FF7S8US8LUMDF3FRVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJhIjp7Ik4iOiIxIn0sIm5hbWUiOnsiUyI6InRlc3RCZWZvcmVEbyJ9fV19LCJVbnByb2Nlc3NlZEtleXMiOnt9fQ==" } }, { "ID": "d335a01869d5fa81", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "67" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:54 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "PNCQ5AAIQJGTEQA1E7I6N2AT5VVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } } ] } ================================================ FILE: docstore/awsdynamodb/v2/testdata/TestConformance/BeforeQuery.replay ================================================ { "Initial": "AQAAAA7hTg5iJDOmPQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*", ".*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "46c5b1baa4aca03d", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DescribeTable" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "599" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:54 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3022004566" ], "X-Amzn-Requestid": [ "KONPGJMNR302QLQTJUB20KKPBFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJUYWJsZSI6eyJBdHRyaWJ1dGVEZWZpbml0aW9ucyI6W3siQXR0cmlidXRlTmFtZSI6Im5hbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9XSwiQ3JlYXRpb25EYXRlVGltZSI6MS43MjMwNzYwNzk3OTdFOSwiRGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZCI6ZmFsc2UsIkl0ZW1Db3VudCI6MCwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoibmFtZSIsIktleVR5cGUiOiJIQVNIIn1dLCJQcm92aXNpb25lZFRocm91Z2hwdXQiOnsiTnVtYmVyT2ZEZWNyZWFzZXNUb2RheSI6MCwiUmVhZENhcGFjaXR5VW5pdHMiOjUsIldyaXRlQ2FwYWNpdHlVbml0cyI6NX0sIlRhYmxlQXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMSIsIlRhYmxlSWQiOiI5N2U0OTNmNC1jZjU3LTQ2YmItOTc4Ny1iOGU4ZDk3ZjUwMDciLCJUYWJsZU5hbWUiOiJkb2NzdG9yZS10ZXN0LTEiLCJUYWJsZVNpemVCeXRlcyI6MCwiVGFibGVTdGF0dXMiOiJBQ1RJVkUiLCJXYXJtVGhyb3VnaHB1dCI6eyJSZWFkVW5pdHNQZXJTZWNvbmQiOjUsIlN0YXR1cyI6IkFDVElWRSIsIldyaXRlVW5pdHNQZXJTZWNvbmQiOjV9fX0=" } }, { "ID": "639cd1f02766911e", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "39" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:54 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3413411624" ], "X-Amzn-Requestid": [ "4KFJ2PN36CNACDBICF90CONTMJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MCwiSXRlbXMiOltdLCJTY2FubmVkQ291bnQiOjB9" } }, { "ID": "36625b6a217a6a7d", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "39" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:54 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3413411624" ], "X-Amzn-Requestid": [ "2J860IMC3URN5QBUOBK7LHSV4JVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MCwiSXRlbXMiOltdLCJTY2FubmVkQ291bnQiOjB9" } } ] } ================================================ FILE: docstore/awsdynamodb/v2/testdata/TestConformance/Create.replay ================================================ { "Initial": "AQAAAA7hTg4/Erb5UgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*", ".*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "fa59a73180f40592", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DescribeTable" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "599" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:19 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3022004566" ], "X-Amzn-Requestid": [ "CDC6154RB1VPU7FM8TID133RNFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJUYWJsZSI6eyJBdHRyaWJ1dGVEZWZpbml0aW9ucyI6W3siQXR0cmlidXRlTmFtZSI6Im5hbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9XSwiQ3JlYXRpb25EYXRlVGltZSI6MS43MjMwNzYwNzk3OTdFOSwiRGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZCI6ZmFsc2UsIkl0ZW1Db3VudCI6MCwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoibmFtZSIsIktleVR5cGUiOiJIQVNIIn1dLCJQcm92aXNpb25lZFRocm91Z2hwdXQiOnsiTnVtYmVyT2ZEZWNyZWFzZXNUb2RheSI6MCwiUmVhZENhcGFjaXR5VW5pdHMiOjUsIldyaXRlQ2FwYWNpdHlVbml0cyI6NX0sIlRhYmxlQXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMSIsIlRhYmxlSWQiOiI5N2U0OTNmNC1jZjU3LTQ2YmItOTc4Ny1iOGU4ZDk3ZjUwMDciLCJUYWJsZU5hbWUiOiJkb2NzdG9yZS10ZXN0LTEiLCJUYWJsZVNpemVCeXRlcyI6MCwiVGFibGVTdGF0dXMiOiJBQ1RJVkUiLCJXYXJtVGhyb3VnaHB1dCI6eyJSZWFkVW5pdHNQZXJTZWNvbmQiOjUsIlN0YXR1cyI6IkFDVElWRSIsIldyaXRlVW5pdHNQZXJTZWNvbmQiOjV9fX0=" } }, { "ID": "932b0697c40d40ca", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "39" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:19 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3413411624" ], "X-Amzn-Requestid": [ "43P0J8HB5D9BLPU78L93GN2EAVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MCwiSXRlbXMiOltdLCJTY2FubmVkQ291bnQiOjB9" } }, { "ID": "642b171f590282cc", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "242" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:19 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "IB7LMME5FQS7T8CQBCA85E57RFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "1248fe83145642e1", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "100" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "169" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:20 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2026506556" ], "X-Amzn-Requestid": [ "JGCE83BIDC44HSOILVH4A9VAMNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0Q3JlYXRlTWFwIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImY4NTZlZjkyLWI0YWUtNGNiYS05MGExLTBhZjM2Y2VmMmRiYiJ9LCJiIjp7IkJPT0wiOnRydWV9fV19LCJVbnByb2Nlc3NlZEtleXMiOnt9fQ==" } }, { "ID": "6917535c25906a50", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "224" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "120" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:20 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "396270901" ], "X-Amzn-Requestid": [ "6LNDG2T7H46A35UK6LNL8IP8QFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLmR5bmFtb2RiLnYyMDEyMDgxMCNDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uIiwibWVzc2FnZSI6IlRoZSBjb25kaXRpb25hbCByZXF1ZXN0IGZhaWxlZCJ9" } }, { "ID": "eff26fa3c8fddc65", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "265" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:20 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "KKPEQGTL2UIKMPVPSSOGJGU877VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "c0447457e4f3e81d", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "123" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "192" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:20 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "1511552246" ], "X-Amzn-Requestid": [ "NGBF7O9EGE843RMPLJG665CB8JVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiI1NWZmNGQxZC03YTBiLTQyNDctYWYyZC03NzAzNGE0NzQ4M2EifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZTJiMDM3MTctNjk4Mi00NTNhLWFlYjMtZWI0YjBjMmE3MzBjIn0sImIiOnsiQk9PTCI6dHJ1ZX19XX0sIlVucHJvY2Vzc2VkS2V5cyI6e319" } }, { "ID": "b80383e9a147f7b0", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "345" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:20 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "KBDIHUHPNF0PNTO4UHDPFRIDSFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "b682b90a9414fc27", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "103" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "272" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:20 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2160058582" ], "X-Amzn-Requestid": [ "85HD409A8JISALNKCNCFCNHU73VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJCIjp7IkJPT0wiOnRydWV9LCJTdCI6eyJOVUxMIjp0cnVlfSwiVSI6eyJOIjoiMCJ9LCJGIjp7Ik4iOiIwIn0sIkkiOnsiTiI6IjAifSwiRXRhZyI6eyJOVUxMIjp0cnVlfSwiTSI6eyJOVUxMIjp0cnVlfSwibmFtZSI6eyJTIjoidGVzdENyZWF0ZVN0cnVjdCJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiI4MDNlZDlmYy00YmQ0LTQ4ZDktYWQ0MS0yZTY2YTNlMWFhNzMifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "1e40d04d8994035e", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "365" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:20 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "DO6U8FQQPD13ICH5DE8DDDQUR7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "880aeceab2682cf7", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "123" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "292" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:20 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3912119637" ], "X-Amzn-Requestid": [ "FH21R8GA2K1TO7VK6UFOKKSHT3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJCIjp7IkJPT0wiOnRydWV9LCJTdCI6eyJOVUxMIjp0cnVlfSwiVSI6eyJOIjoiMCJ9LCJGIjp7Ik4iOiIwIn0sIkkiOnsiTiI6IjAifSwiRXRhZyI6eyJOVUxMIjp0cnVlfSwiTSI6eyJOVUxMIjp0cnVlfSwibmFtZSI6eyJTIjoiYmE5M2I0MjItMjE2ZC00MzY3LWI1YTctYmJhY2QxM2EzZWNiIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6IjI0ZTM0MDhhLTgxYzgtNDA1Ny1iMTVmLTQ0OTM5NjljMmY1MyJ9fV19LCJVbnByb2Nlc3NlZEtleXMiOnt9fQ==" } }, { "ID": "33ba224e1bf28b20", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "365" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:20 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "R9V4FI5IRMDV6IT6LQPPUV68RRVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "a3758570355d1951", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "123" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "292" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:20 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3326581663" ], "X-Amzn-Requestid": [ "CK7HECK8RSAB697AT3JRP4Q6S3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJCIjp7IkJPT0wiOnRydWV9LCJTdCI6eyJOVUxMIjp0cnVlfSwiVSI6eyJOIjoiMCJ9LCJGIjp7Ik4iOiIwIn0sIkkiOnsiTiI6IjAifSwiRXRhZyI6eyJOVUxMIjp0cnVlfSwiTSI6eyJOVUxMIjp0cnVlfSwibmFtZSI6eyJTIjoiMGMwOTYyNWEtZjc1NC00Y2IxLTlmNDctNDY0NThjNjM0YTM2In0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImRjM2U2MzRmLWU1MTMtNGFkYS05NjIwLTUyMmM0MmE5N2QxNCJ9fV19LCJVbnByb2Nlc3NlZEtleXMiOnt9fQ==" } }, { "ID": "032e81aa185ff6a8", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DescribeTable" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "599" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:20 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3022004566" ], "X-Amzn-Requestid": [ "AUTIBFMKL0M1L3E0UHD3H5LQGFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJUYWJsZSI6eyJBdHRyaWJ1dGVEZWZpbml0aW9ucyI6W3siQXR0cmlidXRlTmFtZSI6Im5hbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9XSwiQ3JlYXRpb25EYXRlVGltZSI6MS43MjMwNzYwNzk3OTdFOSwiRGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZCI6ZmFsc2UsIkl0ZW1Db3VudCI6MCwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoibmFtZSIsIktleVR5cGUiOiJIQVNIIn1dLCJQcm92aXNpb25lZFRocm91Z2hwdXQiOnsiTnVtYmVyT2ZEZWNyZWFzZXNUb2RheSI6MCwiUmVhZENhcGFjaXR5VW5pdHMiOjUsIldyaXRlQ2FwYWNpdHlVbml0cyI6NX0sIlRhYmxlQXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMSIsIlRhYmxlSWQiOiI5N2U0OTNmNC1jZjU3LTQ2YmItOTc4Ny1iOGU4ZDk3ZjUwMDciLCJUYWJsZU5hbWUiOiJkb2NzdG9yZS10ZXN0LTEiLCJUYWJsZVNpemVCeXRlcyI6MCwiVGFibGVTdGF0dXMiOiJBQ1RJVkUiLCJXYXJtVGhyb3VnaHB1dCI6eyJSZWFkVW5pdHNQZXJTZWNvbmQiOjUsIlN0YXR1cyI6IkFDVElWRSIsIldyaXRlVW5pdHNQZXJTZWNvbmQiOjV9fX0=" } }, { "ID": "505092375256adb3", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "975" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:20 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "499635053" ], "X-Amzn-Requestid": [ "U4UT54SHHSJ4MFVQTJSPR0SCS7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6NSwiSXRlbXMiOlt7IkIiOnsiQk9PTCI6dHJ1ZX0sIlN0Ijp7Ik5VTEwiOnRydWV9LCJVIjp7Ik4iOiIwIn0sIkYiOnsiTiI6IjAifSwiSSI6eyJOIjoiMCJ9LCJFdGFnIjp7Ik5VTEwiOnRydWV9LCJNIjp7Ik5VTEwiOnRydWV9LCJuYW1lIjp7IlMiOiJ0ZXN0Q3JlYXRlU3RydWN0In0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6IjgwM2VkOWZjLTRiZDQtNDhkOS1hZDQxLTJlNjZhM2UxYWE3MyJ9fSx7IkIiOnsiQk9PTCI6dHJ1ZX0sIlN0Ijp7Ik5VTEwiOnRydWV9LCJVIjp7Ik4iOiIwIn0sIkYiOnsiTiI6IjAifSwiSSI6eyJOIjoiMCJ9LCJFdGFnIjp7Ik5VTEwiOnRydWV9LCJNIjp7Ik5VTEwiOnRydWV9LCJuYW1lIjp7IlMiOiJiYTkzYjQyMi0yMTZkLTQzNjctYjVhNy1iYmFjZDEzYTNlY2IifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiMjRlMzQwOGEtODFjOC00MDU3LWIxNWYtNDQ5Mzk2OWMyZjUzIn19LHsiQiI6eyJCT09MIjp0cnVlfSwiU3QiOnsiTlVMTCI6dHJ1ZX0sIlUiOnsiTiI6IjAifSwiRiI6eyJOIjoiMCJ9LCJJIjp7Ik4iOiIwIn0sIkV0YWciOnsiTlVMTCI6dHJ1ZX0sIk0iOnsiTlVMTCI6dHJ1ZX0sIm5hbWUiOnsiUyI6IjBjMDk2MjVhLWY3NTQtNGNiMS05ZjQ3LTQ2NDU4YzYzNGEzNiJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJkYzNlNjM0Zi1lNTEzLTRhZGEtOTYyMC01MjJjNDJhOTdkMTQifX0seyJuYW1lIjp7IlMiOiJ0ZXN0Q3JlYXRlTWFwIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImY4NTZlZjkyLWI0YWUtNGNiYS05MGExLTBhZjM2Y2VmMmRiYiJ9LCJiIjp7IkJPT0wiOnRydWV9fSx7Im5hbWUiOnsiUyI6IjU1ZmY0ZDFkLTdhMGItNDI0Ny1hZjJkLTc3MDM0YTQ3NDgzYSJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJlMmIwMzcxNy02OTgyLTQ1M2EtYWViMy1lYjRiMGMyYTczMGMifSwiYiI6eyJCT09MIjp0cnVlfX1dLCJTY2FubmVkQ291bnQiOjV9" } }, { "ID": "b94c2e3f41b30a06", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "91" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:20 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "8KA3F3SFF7N5KEMQ3RC67I545FVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "7f22f87b9794089d", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "68" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:20 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "T1ULSK2I6IBEV6481GB95LPUG3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "b4fd355e19439a72", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "91" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:20 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "6TAS3CKRFHR1G4PK611027J4GRVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "ef449a29232c619e", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "71" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:21 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "3UBH45V0JBK2MEDAT0CNOC6TFVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "a68c46b5bed44da1", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "91" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:21 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "MDOHSLF9FLNRPG51263D8S1VARVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "f73bf0807ef72b54", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "230" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:21 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "AUVK38IPCN5DVDHIO6V0ROABLFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "0b84cead5d79e4ee", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "100" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "157" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:21 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "56146547" ], "X-Amzn-Requestid": [ "ROR1HJC0B3S8O26R33PV03PRI7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0Q3JlYXRlTWFwIn0sIkV0YWciOnsiUyI6IjVlYWQ0MTA4LTljYjgtNGJhNS1hMWMyLTYzZDE0MzhmZTg1NiJ9LCJiIjp7IkJPT0wiOnRydWV9fV19LCJVbnByb2Nlc3NlZEtleXMiOnt9fQ==" } }, { "ID": "36ca1161218fd64b", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "212" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "120" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:21 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "396270901" ], "X-Amzn-Requestid": [ "S6CG5CQOHQ7LTMNQPCIA1HCQ03VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLmR5bmFtb2RiLnYyMDEyMDgxMCNDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uIiwibWVzc2FnZSI6IlRoZSBjb25kaXRpb25hbCByZXF1ZXN0IGZhaWxlZCJ9" } }, { "ID": "872c8bc7f1b61d8d", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "253" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:21 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "F2GLH7NIJN94DR8KO3P51GOG4NVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "3611c452c08e5eb0", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "123" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "180" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:21 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3848711806" ], "X-Amzn-Requestid": [ "A6V3BBG70UM4FJJ1CTL6QGB2L7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJFdGFnIjp7IlMiOiIwOTBiMDFiNS05MjA4LTRhZGUtOThhYi1mOTAwNmFhMThmM2MifSwibmFtZSI6eyJTIjoiYzE4ZGY0MTMtNjIzMy00ZTUxLWFkODgtOTNlYmNmZGMzMjU0In0sImIiOnsiQk9PTCI6dHJ1ZX19XX0sIlVucHJvY2Vzc2VkS2V5cyI6e319" } }, { "ID": "20ec3a8f82746094", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "345" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:21 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "TRJ8M49ODCCPPSJRSKF0MUKJ9VVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "a050517c2ba16f6b", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "103" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "272" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:21 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3237927692" ], "X-Amzn-Requestid": [ "6K7BH1QAUGF63SG6MKSL0O4UEVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJCIjp7IkJPT0wiOnRydWV9LCJTdCI6eyJOVUxMIjp0cnVlfSwiVSI6eyJOIjoiMCJ9LCJGIjp7Ik4iOiIwIn0sIkkiOnsiTiI6IjAifSwiRXRhZyI6eyJTIjoiNDJmMWY2OTYtMjUzNC00YmU4LTg4NzgtZWZlZDcxNzUxYzU3In0sIk0iOnsiTlVMTCI6dHJ1ZX0sIm5hbWUiOnsiUyI6InRlc3RDcmVhdGVTdHJ1Y3QifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJOVUxMIjp0cnVlfX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "8b4b7dd5327fdc24", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "365" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:21 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "7NUFA9RMD4FV1TSSRSH6NP16ONVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "aceb13b33bafb412", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "123" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "292" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:21 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "1509441268" ], "X-Amzn-Requestid": [ "KH5RDKK5KHVEGK209FRRRLO65RVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJCIjp7IkJPT0wiOnRydWV9LCJTdCI6eyJOVUxMIjp0cnVlfSwiVSI6eyJOIjoiMCJ9LCJGIjp7Ik4iOiIwIn0sIkkiOnsiTiI6IjAifSwiRXRhZyI6eyJTIjoiMDlkYmUzNzctMjM4Ni00M2M5LWJhMDYtNjY4MGI0Y2EyNTc0In0sIk0iOnsiTlVMTCI6dHJ1ZX0sIm5hbWUiOnsiUyI6ImNmYWQ1MzNjLWQyYzctNGYxMy04ODQ4LWExOTU4NDczZWZmOCJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7Ik5VTEwiOnRydWV9fV19LCJVbnByb2Nlc3NlZEtleXMiOnt9fQ==" } }, { "ID": "7b5dd02d4ec789cb", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "365" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:21 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "DHUHOIN8H9O94DMAO9UIKPK3PNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "5dd153c0fd3fb5fc", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "123" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "292" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:21 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2765757098" ], "X-Amzn-Requestid": [ "7SH12E5DBE2QGQFCDTB1B8G1E3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJCIjp7IkJPT0wiOnRydWV9LCJTdCI6eyJOVUxMIjp0cnVlfSwiVSI6eyJOIjoiMCJ9LCJGIjp7Ik4iOiIwIn0sIkkiOnsiTiI6IjAifSwiRXRhZyI6eyJTIjoiYzIwNjJkMjctYmUxZi00NmZkLTllNzYtOTc2OTRiNTFjMzMwIn0sIk0iOnsiTlVMTCI6dHJ1ZX0sIm5hbWUiOnsiUyI6IjMxY2NkZTZhLTFlMWItNGI3ZS1hYTQ2LThmNGY5MjJmNWE1NSJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7Ik5VTEwiOnRydWV9fV19LCJVbnByb2Nlc3NlZEtleXMiOnt9fQ==" } } ] } ================================================ FILE: docstore/awsdynamodb/v2/testdata/TestConformance/Data.replay ================================================ { "Initial": "AQAAAA7hTg5VLcTZoAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*", ".*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "91d9a6195471ceaf", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DescribeTable" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "599" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:42 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3022004566" ], "X-Amzn-Requestid": [ "TBOB3OTC2O0DP2VJRN377Q2CUNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJUYWJsZSI6eyJBdHRyaWJ1dGVEZWZpbml0aW9ucyI6W3siQXR0cmlidXRlTmFtZSI6Im5hbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9XSwiQ3JlYXRpb25EYXRlVGltZSI6MS43MjMwNzYwNzk3OTdFOSwiRGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZCI6ZmFsc2UsIkl0ZW1Db3VudCI6MCwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoibmFtZSIsIktleVR5cGUiOiJIQVNIIn1dLCJQcm92aXNpb25lZFRocm91Z2hwdXQiOnsiTnVtYmVyT2ZEZWNyZWFzZXNUb2RheSI6MCwiUmVhZENhcGFjaXR5VW5pdHMiOjUsIldyaXRlQ2FwYWNpdHlVbml0cyI6NX0sIlRhYmxlQXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMSIsIlRhYmxlSWQiOiI5N2U0OTNmNC1jZjU3LTQ2YmItOTc4Ny1iOGU4ZDk3ZjUwMDciLCJUYWJsZU5hbWUiOiJkb2NzdG9yZS10ZXN0LTEiLCJUYWJsZVNpemVCeXRlcyI6MCwiVGFibGVTdGF0dXMiOiJBQ1RJVkUiLCJXYXJtVGhyb3VnaHB1dCI6eyJSZWFkVW5pdHNQZXJTZWNvbmQiOjUsIlN0YXR1cyI6IkFDVElWRSIsIldyaXRlVW5pdHNQZXJTZWNvbmQiOjV9fX0=" } }, { "ID": "34237c0b8497590b", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1393" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:42 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3803944647" ], "X-Amzn-Requestid": [ "VSRDDISEJ4861AKN1SNBAPR4GNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6OCwiSXRlbXMiOlt7IkIiOnsiQk9PTCI6ZmFsc2V9LCJTdCI6eyJTIjoic3RyIn0sIlUiOnsiTiI6IjQifSwiRiI6eyJOIjoiMC41In0sIkV0YWciOnsiUyI6ImU5NGI0NzQ2LTEwZmYtNGQ2NS05MWYxLTk0NjBmZGZlMGE1MSJ9LCJNIjp7Ik5VTEwiOnRydWV9LCJEb2NzdG9yZVJldmlzaW9uIjp7Ik5VTEwiOnRydWV9LCJuYW1lIjp7IlMiOiJ0ZXN0VXBkYXRlU3RydWN0In19LHsiRXRhZyI6eyJTIjoiYTA0ZTM3Y2MtN2RkNy00ZjZkLWEzYjAtMjA5ZTVhZTI1ZDg0In0sIm5hbWUiOnsiUyI6InRlc3RSZXZpc2lvbk1hcCJ9LCJzIjp7IlMiOiJjIn19LHsiQiI6eyJCT09MIjpmYWxzZX0sIlN0Ijp7IlMiOiJzdHIifSwiVSI6eyJOIjoiNCJ9LCJGIjp7Ik4iOiIwIn0sIkV0YWciOnsiUyI6ImRlNzA5OTFlLTcwYzQtNDRkOS05MWJiLWJhMDRiY2Y4NmU4ZiJ9LCJNIjp7Ik5VTEwiOnRydWV9LCJEb2NzdG9yZVJldmlzaW9uIjp7Ik5VTEwiOnRydWV9LCJuYW1lIjp7IlMiOiJ0ZXN0VXBkYXRlU3RydWN0V3J0In19LHsiQiI6eyJCT09MIjpmYWxzZX0sIlN0Ijp7IlMiOiJzdCJ9LCJVIjp7Ik4iOiI0In0sIkYiOnsiTiI6IjAuNSJ9LCJJIjp7Ik4iOiIxIn0sIkV0YWciOnsiUyI6ImQ0ODZjNjk1LTBiNzYtNDk4OS05NWQ3LWFkYzBlMjliYWRjYSJ9LCJNIjp7Ik5VTEwiOnRydWV9LCJEb2NzdG9yZVJldmlzaW9uIjp7Ik5VTEwiOnRydWV9LCJuYW1lIjp7IlMiOiJ0ZXN0VXBkYXRlU3RydWN0SW5jIn19LHsiYSI6eyJTIjoiQSJ9LCJpIjp7Ik4iOiIzLjUifSwiRXRhZyI6eyJTIjoiZTZjYWEzOGItZTA0ZS00NzQ0LWE5MjItOGJmMWM2MmI1MjdjIn0sIm0iOnsiTiI6IjMifSwibiI6eyJOIjoiMi41In0sIm5hbWUiOnsiUyI6InRlc3RVcGRhdGVNYXBJbmMifX0seyJhIjp7IlMiOiJYIn0sIkV0YWciOnsiUyI6ImZlZWRjNzI0LWJkZTMtNDdjOS1iOGNmLTk2ODgwOWNlZDQzYiJ9LCJjIjp7IlMiOiJDIn0sIm0iOnsiTiI6IjMifSwibiI6eyJOIjoiMi41In0sIm5hbWUiOnsiUyI6InRlc3RVcGRhdGVNYXAifX0seyJCIjp7IkJPT0wiOmZhbHNlfSwiU3QiOnsiUyI6ImEifSwicyI6eyJTIjoiYyJ9LCJVIjp7Ik4iOiIwIn0sIkYiOnsiTiI6IjAifSwiSSI6eyJOIjoiMCJ9LCJFdGFnIjp7IlMiOiJjNzhiOTcyZS0zOWVhLTQxNjgtOTc0NS1hZTZlYTM2ODIzZDEifSwiTSI6eyJOVUxMIjp0cnVlfSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJOVUxMIjp0cnVlfSwibmFtZSI6eyJTIjoidGVzdFJldmlzaW9uU3RydWN0In19LHsiYSI6eyJTIjoiWCJ9LCJFdGFnIjp7IlMiOiI0Yzk5M2VhMy0wOGQxLTQxNzUtYmI0Mi0xMDdlMDkwNzZjZmEifSwibSI6eyJOIjoiMyJ9LCJuYW1lIjp7IlMiOiJ0ZXN0VXBkYXRlTWFwV3J0In19XSwiU2Nhbm5lZENvdW50Ijo4fQ==" } }, { "ID": "ada77c79271d77ee", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "71" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:42 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "DHMKSELGQCMVIBCBFT0OVS8NN7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "f56f6655159f54e8", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "71" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:42 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "O6JURQDO90HQB5NAIJIIL6MHRJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "8098b849ceb7abee", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "70" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:42 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "5JGVBH4LJSER45BGAPHICEDOCVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "83bbfb31111eaa80", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "71" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:42 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "A3EI46I9DF9HLO01DGQRJOFGS7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "726632d6d09e4ef7", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "73" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:42 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "1HGGH04C5I6FMNFJQUVQ6NLHU3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "89f878fb4539e101", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "68" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:42 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "I5SQ3JDG06RNNIHJJJCCJFCVVFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "468fa9190cd8eddb", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "74" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:42 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "DSJTHDP2HF9IIV0BKCMKCP5RNJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "bc4898945f64a59d", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "74" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:42 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "HUQAN4DUUCJKH2SADEL4V5KVPBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "5626d498dc6f9af2", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "81" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:42 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "GQJO84F2N9G74J6DK9STP29MP3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "31600099c3c39690", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "95" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:42 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3054047241" ], "X-Amzn-Requestid": [ "O00G65GMSHNHSJ15IFLMRKPQSNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0RGF0YSJ9LCJ2YWwiOnsiTiI6Ii0xIn19XX0sIlVucHJvY2Vzc2VkS2V5cyI6e319" } }, { "ID": "d61313487cf463ae", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "81" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:42 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "34SSIQM0KJSAS3CP9MLAFFJP73VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "1529010637d3f623", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "95" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:42 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3121808892" ], "X-Amzn-Requestid": [ "44CFU0FEMGI5VPQ1OCV4OK9PJ3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0RGF0YSJ9LCJ2YWwiOnsiTiI6Ii04In19XX0sIlVucHJvY2Vzc2VkS2V5cyI6e319" } }, { "ID": "25426850effefe79", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "82" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:42 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "GTOSG8MKDJ6O2ICE695MVL83BBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "5a79cf19d1c3f962", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "95" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "100" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:42 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2455135972" ], "X-Amzn-Requestid": [ "T583LNQRH406I1GPTQTBS4E9E7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0RGF0YSJ9LCJ2YWwiOnsiTiI6Ii0xNiJ9fV19LCJVbnByb2Nlc3NlZEtleXMiOnt9fQ==" } }, { "ID": "2048829bfbd2d7f4", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "82" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:42 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "HE4L2E8D1DU6FTRD9RIV3HM57BVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "bfd09f21ea0df83b", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "95" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "100" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:42 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "1385046232" ], "X-Amzn-Requestid": [ "LCENVH5E2TRC1M5PJT7G3063IJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0RGF0YSJ9LCJ2YWwiOnsiTiI6Ii0zMiJ9fV19LCJVbnByb2Nlc3NlZEtleXMiOnt9fQ==" } }, { "ID": "90b547b2b5c39f02", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "82" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:42 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "E7BEJQB963GJ1FMF2TGJ1JQHDBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "7f567f207933d499", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "95" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "100" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:42 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "1666946403" ], "X-Amzn-Requestid": [ "QGS8KRVJOAR630KSSOQA4FB7F7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0RGF0YSJ9LCJ2YWwiOnsiTiI6Ii02NCJ9fV19LCJVbnByb2Nlc3NlZEtleXMiOnt9fQ==" } }, { "ID": "8dffcfdf8b307a74", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "80" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:43 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "DRVPB30T6N4D9K14CRDAEAD6MFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "dbb6c3b8ab8258fc", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "95" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "98" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:43 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2670645296" ], "X-Amzn-Requestid": [ "PNFHFGMND9II0J4SFD2H35NIENVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0RGF0YSJ9LCJ2YWwiOnsiTiI6IjEifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "4cb9179acab3bd21", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "80" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:43 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "3KG1ML8GP8H5U06ACHNF9569LJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "0b57347869a8263e", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "95" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "98" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:43 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2469709253" ], "X-Amzn-Requestid": [ "NEQRIB1R40SMDJJ33ONH5S6F83VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0RGF0YSJ9LCJ2YWwiOnsiTiI6IjgifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "9d350948f9cb6984", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "81" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:43 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "CMVUMTKEFS5BIPK22NOF9PI7OJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "e9d0b5ac6a15eba4", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "95" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:43 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3447376172" ], "X-Amzn-Requestid": [ "V22QL19LVQEO2RBLO4O63COE67VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0RGF0YSJ9LCJ2YWwiOnsiTiI6IjE2In19XX0sIlVucHJvY2Vzc2VkS2V5cyI6e319" } }, { "ID": "2f7942be05dc16cd", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "81" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:43 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "4R63IAMU5EEARPGNTPNMRFO6KBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "2fcacb4b87ea664a", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "95" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:43 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "228757264" ], "X-Amzn-Requestid": [ "J3L6R4MN8EPD8PT1N1IL1R6LTBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0RGF0YSJ9LCJ2YWwiOnsiTiI6IjMyIn19XX0sIlVucHJvY2Vzc2VkS2V5cyI6e319" } }, { "ID": "6b8d30ae5090c7dc", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "81" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:43 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "EDU36BSMT5KTRCA4BUJOHCMA8JVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "213a19455620589a", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "95" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:43 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "1014446763" ], "X-Amzn-Requestid": [ "A60PERL8VA4U8JSIMRK3S91BIFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0RGF0YSJ9LCJ2YWwiOnsiTiI6IjY0In19XX0sIlVucHJvY2Vzc2VkS2V5cyI6e319" } }, { "ID": "3e930f4d0f856877", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "82" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:43 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "VGHIH8C3PCH35HMTLTNS2G9PGFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "489a11b1d978de6f", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "95" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "100" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:43 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2334279914" ], "X-Amzn-Requestid": [ "JKO85UJ8F21U6I04SA7GQE6S53VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0RGF0YSJ9LCJ2YWwiOnsiTiI6IjMuNSJ9fV19LCJVbnByb2Nlc3NlZEtleXMiOnt9fQ==" } }, { "ID": "9620cd6999c183de", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "83" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:43 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "OPFDNLD0HEF8REMP2TP317NUAJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "ef051eff8e265b90", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "95" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "101" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:44 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "129752700" ], "X-Amzn-Requestid": [ "S3VA1FDFFO0IB2IS2K57JK4NQFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0RGF0YSJ9LCJ2YWwiOnsiQiI6IkFBRUMifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } } ] } ================================================ FILE: docstore/awsdynamodb/v2/testdata/TestConformance/Delete.replay ================================================ { "Initial": "AQAAAA7hTg5ONqHNVQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*", ".*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "f3be7a0ad084dbdd", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DescribeTable" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "599" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:35 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3022004566" ], "X-Amzn-Requestid": [ "GVS3A55GOUU2FFR70AP127K3DJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJUYWJsZSI6eyJBdHRyaWJ1dGVEZWZpbml0aW9ucyI6W3siQXR0cmlidXRlTmFtZSI6Im5hbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9XSwiQ3JlYXRpb25EYXRlVGltZSI6MS43MjMwNzYwNzk3OTdFOSwiRGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZCI6ZmFsc2UsIkl0ZW1Db3VudCI6MCwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoibmFtZSIsIktleVR5cGUiOiJIQVNIIn1dLCJQcm92aXNpb25lZFRocm91Z2hwdXQiOnsiTnVtYmVyT2ZEZWNyZWFzZXNUb2RheSI6MCwiUmVhZENhcGFjaXR5VW5pdHMiOjUsIldyaXRlQ2FwYWNpdHlVbml0cyI6NX0sIlRhYmxlQXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMSIsIlRhYmxlSWQiOiI5N2U0OTNmNC1jZjU3LTQ2YmItOTc4Ny1iOGU4ZDk3ZjUwMDciLCJUYWJsZU5hbWUiOiJkb2NzdG9yZS10ZXN0LTEiLCJUYWJsZVNpemVCeXRlcyI6MCwiVGFibGVTdGF0dXMiOiJBQ1RJVkUiLCJXYXJtVGhyb3VnaHB1dCI6eyJSZWFkVW5pdHNQZXJTZWNvbmQiOjUsIlN0YXR1cyI6IkFDVElWRSIsIldyaXRlVW5pdHNQZXJTZWNvbmQiOjV9fX0=" } }, { "ID": "b8d1ad90c4aa8255", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1139" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:35 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2146937234" ], "X-Amzn-Requestid": [ "COKNVS57BANRATHDBSFG44HOSJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6NSwiSXRlbXMiOlt7ImkiOnsiTiI6Ijk1In0sIkV0YWciOnsiUyI6ImJlMGQyNDMzLTUyMzItNGZlYy1iZDk2LWQ4NDk5MmFmMTg1OSJ9LCJzIjp7IlMiOiJhIHN0cmluZyJ9LCJtIjp7Ik0iOnsiYSI6eyJTIjoib25lIn0sImIiOnsiUyI6InR3byJ9fX0sIm5hbWUiOnsiUyI6InRlc3RHZXRNYXBGUCJ9LCJmIjp7Ik4iOiIzMi4zIn19LHsiQiI6eyJCT09MIjpmYWxzZX0sIlN0Ijp7IlMiOiJhIHN0cmluZyJ9LCJVIjp7Ik4iOiIwIn0sIkYiOnsiTiI6IjMyLjMifSwiSSI6eyJOIjoiOTUifSwiRXRhZyI6eyJTIjoiOTU4Zjc5NjktZGM4OS00ZjMxLWI1MjktMTE1NGM2MmFhMDA2In0sIk0iOnsiTSI6eyJhIjp7IlMiOiJvbmUifSwiYiI6eyJTIjoidHdvIn19fSwibmFtZSI6eyJTIjoidGVzdEdldFN0cnVjdCJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7Ik5VTEwiOnRydWV9fSx7IkIiOnsiQk9PTCI6ZmFsc2V9LCJTdCI6eyJTIjoiYSBzdHJpbmcifSwiVSI6eyJOIjoiMCJ9LCJGIjp7Ik4iOiIzMi4zIn0sIkkiOnsiTiI6Ijk1In0sIkV0YWciOnsiUyI6IjM0ZmUyYzVmLWQzY2YtNDM0MS1iZjFjLTM3M2JlMmI4OTc0OCJ9LCJNIjp7Ik0iOnsiYSI6eyJTIjoib25lIn0sImIiOnsiUyI6InR3byJ9fX0sIm5hbWUiOnsiUyI6InRlc3RHZXRTdHJ1Y3RXQyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7Ik5VTEwiOnRydWV9fSx7ImkiOnsiTiI6Ijk1In0sIkV0YWciOnsiUyI6ImY3NDk4NDRmLTAyMDMtNDY0NS1iYTViLWMyOWY2YTlhZjdiYSJ9LCJzIjp7IlMiOiJhIHN0cmluZyJ9LCJtIjp7Ik0iOnsiYSI6eyJTIjoib25lIn0sImIiOnsiUyI6InR3byJ9fX0sIm5hbWUiOnsiUyI6InRlc3RHZXRNYXAifSwiZiI6eyJOIjoiMzIuMyJ9fSx7IkIiOnsiQk9PTCI6ZmFsc2V9LCJTdCI6eyJTIjoiYSBzdHJpbmcifSwiVSI6eyJOIjoiMCJ9LCJGIjp7Ik4iOiIzMi4zIn0sIkkiOnsiTiI6Ijk1In0sIkV0YWciOnsiUyI6ImNmM2IzN2ZhLWI1NDYtNGY2Zi05MTUxLTZjOTk0NzZjZWE1ZSJ9LCJNIjp7Ik0iOnsiYSI6eyJTIjoib25lIn0sImIiOnsiUyI6InR3byJ9fX0sIm5hbWUiOnsiUyI6InRlc3RHZXRTdHJ1Y3RGUCJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7Ik5VTEwiOnRydWV9fV0sIlNjYW5uZWRDb3VudCI6NX0=" } }, { "ID": "594add21a6b542b8", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "70" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:35 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "IEP7RHVAS0GNAIC69R05DSFA9JVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "c341e50d0d3c1e5b", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "67" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:35 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "ATKBA0EORMPIBCBTMGDR61HF9BVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "af19f1651a1138d9", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "68" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:35 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "TOGSUP435FLMHO9I7TAPADUF3JVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "9859a41e568f12e7", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "70" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:35 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "UV4BBQ0ISCMVT3U4CEBJ0QE65RVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "60ac04f42dec5d1f", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "65" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:35 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "AGJLQR0C1SS7DK7AID1S30H167VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "fe3e33ac1dbc4582", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "133" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:35 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "1O88575N5ATVL981SMGRBE0CD7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "f8f73558b4e4c33d", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "233" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:35 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "P6KRMIAER1S1GCR230K9EM0RHRVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "3544d1628745b481", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "100" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "57" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:35 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "289144682" ], "X-Amzn-Requestid": [ "I1ATQ7KHD6F4LLD9AU8VRHG76NVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbXX0sIlVucHJvY2Vzc2VkS2V5cyI6e319" } }, { "ID": "254711bfaf8b1938", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "151" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:35 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "9QET8PC6J3NA97B09GPV1N658NVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "e830c3ba90d2d374", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "233" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "120" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:35 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "396270901" ], "X-Amzn-Requestid": [ "RLMK6VNB6VJU98LEU46C1QUU1BVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLmR5bmFtb2RiLnYyMDEyMDgxMCNDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uIiwibWVzc2FnZSI6IlRoZSBjb25kaXRpb25hbCByZXF1ZXN0IGZhaWxlZCJ9" } }, { "ID": "91e75abaec8f60c6", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "255" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:35 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "A98N0LHSSCJ6R7J3G2K4SETRQFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "8b76bb5177baeb70", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "236" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:36 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "9A8IUCFP33JHR3F5J75PC7ES93VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "4bde8649cebf46de", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "103" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "57" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:36 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "289144682" ], "X-Amzn-Requestid": [ "RU7VUPM4BRKTOU6BMFIOFHB8SBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbXX0sIlVucHJvY2Vzc2VkS2V5cyI6e319" } }, { "ID": "a05a46710dd51c8c", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "254" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:36 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "UQ47C4SET9K87ILD47U46MEH83VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "121d477f87b820c2", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "236" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "120" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:36 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "396270901" ], "X-Amzn-Requestid": [ "PUBN5O12GBD4E0BQ8EA3T5FP4FVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLmR5bmFtb2RiLnYyMDEyMDgxMCNDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uIiwibWVzc2FnZSI6IlRoZSBjb25kaXRpb25hbCByZXF1ZXN0IGZhaWxlZCJ9" } }, { "ID": "dd738d8d6a31b8a9", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "67" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:36 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "BK6P53BKAEQ4IBTCM0EG4CHBPJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "a19029f2653ddb07", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DescribeTable" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "599" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:36 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3022004566" ], "X-Amzn-Requestid": [ "A1E658P00IP19TGMCIJ3JA990BVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJUYWJsZSI6eyJBdHRyaWJ1dGVEZWZpbml0aW9ucyI6W3siQXR0cmlidXRlTmFtZSI6Im5hbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9XSwiQ3JlYXRpb25EYXRlVGltZSI6MS43MjMwNzYwNzk3OTdFOSwiRGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZCI6ZmFsc2UsIkl0ZW1Db3VudCI6MCwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoibmFtZSIsIktleVR5cGUiOiJIQVNIIn1dLCJQcm92aXNpb25lZFRocm91Z2hwdXQiOnsiTnVtYmVyT2ZEZWNyZWFzZXNUb2RheSI6MCwiUmVhZENhcGFjaXR5VW5pdHMiOjUsIldyaXRlQ2FwYWNpdHlVbml0cyI6NX0sIlRhYmxlQXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMSIsIlRhYmxlSWQiOiI5N2U0OTNmNC1jZjU3LTQ2YmItOTc4Ny1iOGU4ZDk3ZjUwMDciLCJUYWJsZU5hbWUiOiJkb2NzdG9yZS10ZXN0LTEiLCJUYWJsZVNpemVCeXRlcyI6MCwiVGFibGVTdGF0dXMiOiJBQ1RJVkUiLCJXYXJtVGhyb3VnaHB1dCI6eyJSZWFkVW5pdHNQZXJTZWNvbmQiOjUsIlN0YXR1cyI6IkFDVElWRSIsIldyaXRlVW5pdHNQZXJTZWNvbmQiOjV9fX0=" } }, { "ID": "decc0a1d3051e2fb", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "367" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:36 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "540518252" ], "X-Amzn-Requestid": [ "9JONF7RS9KN3A9Q24NN52357OJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MiwiSXRlbXMiOlt7Im5hbWUiOnsiUyI6InRlc3REZWxldGVNYXAifSwiYiI6eyJCT09MIjp0cnVlfSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiMGI3Yjk1NjctN2FiNC00NGI1LWFjZmItZDFmZmRmMjJmY2VmIn19LHsiQiI6eyJCT09MIjp0cnVlfSwiU3QiOnsiTlVMTCI6dHJ1ZX0sIlUiOnsiTiI6IjAifSwiRiI6eyJOIjoiMCJ9LCJJIjp7Ik4iOiIwIn0sIkV0YWciOnsiTlVMTCI6dHJ1ZX0sIk0iOnsiTlVMTCI6dHJ1ZX0sIm5hbWUiOnsiUyI6InRlc3REZWxldGVTdHJ1Y3QifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiMGIyYTc4NmQtNzg1NS00MDVmLTg0ZjktYjZkZGQ2OTQ5OWU4In19XSwiU2Nhbm5lZENvdW50IjoyfQ==" } }, { "ID": "ec8352b0e42272b0", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "68" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:36 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "N5RI02DNNKRUI3TF0EK55SCVPJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "19b9e883423fa7b5", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "71" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:36 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "LEAIPDQJTJGUU619M2VT2KOU1FVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "61f4562bd1fe0cd6", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "121" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:36 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "48BUBAS78VAU51C3N1VMTD85CNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "b6a56693bfea8ecd", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "221" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:36 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "0RKJS0I03TQ8E3SVQK81FB0MPBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "8f9bc0c589bcdf6a", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "100" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "57" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:36 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "289144682" ], "X-Amzn-Requestid": [ "4EV0J2N3FAT2HV7JS8CIFFMA17VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbXX0sIlVucHJvY2Vzc2VkS2V5cyI6e319" } }, { "ID": "046ad86a84e5ee74", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "139" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:36 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "HVJ6079DUKB3QSVQ56VOV74N2VVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "0ddf15134a171a01", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "221" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "120" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:36 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "396270901" ], "X-Amzn-Requestid": [ "GE71B4LV5VFGKRJTIT6QE2MUIBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLmR5bmFtb2RiLnYyMDEyMDgxMCNDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uIiwibWVzc2FnZSI6IlRoZSBjb25kaXRpb25hbCByZXF1ZXN0IGZhaWxlZCJ9" } }, { "ID": "5dcee72fe5dbcb11", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "255" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:36 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "O77O4KC7EBBAN92VH04FSR73K7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "2ede07b147ebaa2c", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "224" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:36 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "ON1MNV17590IC1VVQOEE6AAC4RVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "41495072024fd219", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "103" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "57" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:37 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "289144682" ], "X-Amzn-Requestid": [ "BGHLE3Q6V4IJ3NQ3MD5R1HEHHFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbXX0sIlVucHJvY2Vzc2VkS2V5cyI6e319" } }, { "ID": "d80af00e3a35353f", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "254" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:37 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "FR2FUS2EUBS2GMR67VVQ7ROGFVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "87ba4b8a2a163908", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "224" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "120" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:37 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "396270901" ], "X-Amzn-Requestid": [ "IK1NDS2FLDORI8LCJSPUCE139BVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLmR5bmFtb2RiLnYyMDEyMDgxMCNDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uIiwibWVzc2FnZSI6IlRoZSBjb25kaXRpb25hbCByZXF1ZXN0IGZhaWxlZCJ9" } }, { "ID": "d66c440066b70cdc", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "67" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:37 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "SPF2KSF0FSMH0AI24O4PENDGHJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } } ] } ================================================ FILE: docstore/awsdynamodb/v2/testdata/TestConformance/ExampleInDoc.replay ================================================ { "Initial": "AQAAAA7hTg5hAtoolAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*", ".*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "cb20e4d94841e2d1", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DescribeTable" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "599" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:53 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3022004566" ], "X-Amzn-Requestid": [ "TLCQPQ8EPJSLAO249B1ISPLO1VVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJUYWJsZSI6eyJBdHRyaWJ1dGVEZWZpbml0aW9ucyI6W3siQXR0cmlidXRlTmFtZSI6Im5hbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9XSwiQ3JlYXRpb25EYXRlVGltZSI6MS43MjMwNzYwNzk3OTdFOSwiRGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZCI6ZmFsc2UsIkl0ZW1Db3VudCI6MCwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoibmFtZSIsIktleVR5cGUiOiJIQVNIIn1dLCJQcm92aXNpb25lZFRocm91Z2hwdXQiOnsiTnVtYmVyT2ZEZWNyZWFzZXNUb2RheSI6MCwiUmVhZENhcGFjaXR5VW5pdHMiOjUsIldyaXRlQ2FwYWNpdHlVbml0cyI6NX0sIlRhYmxlQXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMSIsIlRhYmxlSWQiOiI5N2U0OTNmNC1jZjU3LTQ2YmItOTc4Ny1iOGU4ZDk3ZjUwMDciLCJUYWJsZU5hbWUiOiJkb2NzdG9yZS10ZXN0LTEiLCJUYWJsZVNpemVCeXRlcyI6MCwiVGFibGVTdGF0dXMiOiJBQ1RJVkUiLCJXYXJtVGhyb3VnaHB1dCI6eyJSZWFkVW5pdHNQZXJTZWNvbmQiOjUsIlN0YXR1cyI6IkFDVElWRSIsIldyaXRlVW5pdHNQZXJTZWNvbmQiOjV9fX0=" } }, { "ID": "5354f6f482859b86", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "130" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:53 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2772784065" ], "X-Amzn-Requestid": [ "SI8L2L3QK5MM29MK4OI3O0911VVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MiwiSXRlbXMiOlt7IkkiOnsiTiI6IjEifSwibmFtZSI6eyJTIjoicHV0YW5kdXBkYXRlIn19LHsiSSI6eyJOIjoiMCJ9LCJuYW1lIjp7IlMiOiJjcmVhdGVhbmRyZXBsYWNlIn19XSwiU2Nhbm5lZENvdW50IjoyfQ==" } }, { "ID": "0e14dd74962de63d", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "71" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:53 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "I1Q1RD7NS1OTFDS759NLQ9QBL7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "2bbd9be649c57cd8", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "67" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:53 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "HI9ENVCSQJ176CL3ORQAS0V2C7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "177b0ac5391c12eb", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "185" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:53 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "4LO1DCC7G9RJ53UDOFE4VP5GTRVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "bfcc5f4de61cb37c", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "282" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:53 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "HBK1HA3VP6H6GJBI5C20T6S8JNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "b1ca8e4e0aa16747", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "147" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "356" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:53 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "704779417" ], "X-Amzn-Requestid": [ "NPMAD4E2LBQ61DLUCCN9DJ5JQFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJwdWJfeWVhcnMiOnsiTCI6W3siTiI6IjE5NjcifSx7Ik4iOiIxOTczIn1dfSwibmFtZSI6eyJTIjoiVGhlIE1hc3RlciBhbmQgTWFyZ2FyaXRhIn0sImF1dGhvciI6eyJNIjp7Ikxhc3QiOnsiUyI6IkJ1bGdha292In0sIkZpcnN0Ijp7IlMiOiJNaWtoYWlsIn19fX0seyJwdWJfeWVhcnMiOnsiTCI6W3siTiI6IjE5NjgifSx7Ik4iOiIxOTg3In1dfSwibmFtZSI6eyJTIjoiVGhlIEhlYXJ0IG9mIGEgRG9nIn0sImF1dGhvciI6eyJNIjp7Ikxhc3QiOnsiUyI6IkJ1bGdha292In0sIkZpcnN0Ijp7IlMiOiJNaWtoYWlsIn19fX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "91f54b235a28665a", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "192" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "338" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:53 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2286982984" ], "X-Amzn-Requestid": [ "5ME8HBH9MJ354EMKA16FKCLI43VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MiwiSXRlbXMiOlt7InB1Yl95ZWFycyI6eyJMIjpbeyJOIjoiMTk2OCJ9LHsiTiI6IjE5ODcifV19LCJuYW1lIjp7IlMiOiJUaGUgSGVhcnQgb2YgYSBEb2cifSwiYXV0aG9yIjp7Ik0iOnsiTGFzdCI6eyJTIjoiQnVsZ2Frb3YifSwiRmlyc3QiOnsiUyI6Ik1pa2hhaWwifX19fSx7InB1Yl95ZWFycyI6eyJMIjpbeyJOIjoiMTk2NyJ9LHsiTiI6IjE5NzMifV19LCJuYW1lIjp7IlMiOiJUaGUgTWFzdGVyIGFuZCBNYXJnYXJpdGEifSwiYXV0aG9yIjp7Ik0iOnsiTGFzdCI6eyJTIjoiQnVsZ2Frb3YifSwiRmlyc3QiOnsiUyI6Ik1pa2hhaWwifX19fV0sIlNjYW5uZWRDb3VudCI6Mn0=" } }, { "ID": "d0d973fa70dc86d8", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "73" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:53 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "P4RKEDST1T9QUHDTS39V6H829VVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "d23a192dd34a1ca1", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "79" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:53 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "2PUIHT9EH1RHCBRC4ROCMGE32JVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } } ] } ================================================ FILE: docstore/awsdynamodb/v2/testdata/TestConformance/Get.replay ================================================ { "Initial": "AQAAAA7hTg5MIO46RAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*", ".*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "4039759f598bf73f", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DescribeTable" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "599" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:32 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3022004566" ], "X-Amzn-Requestid": [ "FTLD9SDRVDJ58I1UL90VQM2GGJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJUYWJsZSI6eyJBdHRyaWJ1dGVEZWZpbml0aW9ucyI6W3siQXR0cmlidXRlTmFtZSI6Im5hbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9XSwiQ3JlYXRpb25EYXRlVGltZSI6MS43MjMwNzYwNzk3OTdFOSwiRGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZCI6ZmFsc2UsIkl0ZW1Db3VudCI6MCwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoibmFtZSIsIktleVR5cGUiOiJIQVNIIn1dLCJQcm92aXNpb25lZFRocm91Z2hwdXQiOnsiTnVtYmVyT2ZEZWNyZWFzZXNUb2RheSI6MCwiUmVhZENhcGFjaXR5VW5pdHMiOjUsIldyaXRlQ2FwYWNpdHlVbml0cyI6NX0sIlRhYmxlQXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMSIsIlRhYmxlSWQiOiI5N2U0OTNmNC1jZjU3LTQ2YmItOTc4Ny1iOGU4ZDk3ZjUwMDciLCJUYWJsZU5hbWUiOiJkb2NzdG9yZS10ZXN0LTEiLCJUYWJsZVNpemVCeXRlcyI6MCwiVGFibGVTdGF0dXMiOiJBQ1RJVkUiLCJXYXJtVGhyb3VnaHB1dCI6eyJSZWFkVW5pdHNQZXJTZWNvbmQiOjUsIlN0YXR1cyI6IkFDVElWRSIsIldyaXRlVW5pdHNQZXJTZWNvbmQiOjV9fX0=" } }, { "ID": "075d50e7833afbf7", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "664" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:32 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2923777292" ], "X-Amzn-Requestid": [ "HPSQF0CAO2BE3U58E9A9J45PGBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6NCwiSXRlbXMiOlt7IkV0YWciOnsiUyI6ImUyMjJjOTI2LTRjYmQtNDMwOC1iNDc2LTY3YjkxNjIyYTM5ZiJ9LCJuYW1lIjp7IlMiOiJ0ZXN0UmVwbGFjZU1hcCJ9LCJzIjp7IlMiOiJiIn19LHsibmFtZSI6eyJTIjoidGVzdFJldmlzaW9uTWFwIn0sIkV0YWciOnsiUyI6ImNiZDgyMTBkLWVhMGItNDA3OS1iMTFjLTg1YTlkNzFiZmRmZiJ9LCJzIjp7IlMiOiJhIn19LHsiQiI6eyJCT09MIjpmYWxzZX0sIlN0Ijp7IlMiOiJiIn0sIlUiOnsiTiI6IjAifSwiRiI6eyJOIjoiMCJ9LCJJIjp7Ik4iOiIwIn0sIkV0YWciOnsiUyI6IjAyMGNjMzg1LTljOTMtNDFlZi1iOTUzLTFjMDUyYmEzZGNjMSJ9LCJNIjp7Ik5VTEwiOnRydWV9LCJuYW1lIjp7IlMiOiJ0ZXN0UmVwbGFjZVN0cnVjdCJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7Ik5VTEwiOnRydWV9fSx7IkIiOnsiQk9PTCI6ZmFsc2V9LCJTdCI6eyJTIjoiYSJ9LCJVIjp7Ik4iOiIwIn0sIkYiOnsiTiI6IjAifSwiSSI6eyJOIjoiMCJ9LCJFdGFnIjp7IlMiOiI0OGQxYThmZC00NWU1LTQ2M2MtOTNkOC04NWI1MDFmYjY0NmIifSwiTSI6eyJOVUxMIjp0cnVlfSwibmFtZSI6eyJTIjoidGVzdFJldmlzaW9uU3RydWN0In0sIkRvY3N0b3JlUmV2aXNpb24iOnsiTlVMTCI6dHJ1ZX19XSwiU2Nhbm5lZENvdW50Ijo0fQ==" } }, { "ID": "02a35c7208d5b871", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "70" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:32 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "M4J2SEG2BFH3V1DKUCL84HDSQBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "2f7983b4ff2b7775", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "69" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:32 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "NTJA49QUOT5FT92Q86IROC6RGJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "60b0112086b67629", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "73" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:32 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "3NAFUIODPQUUALPT3SE2KA9DVFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "8f8745788c474ee9", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "72" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:32 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "Q9FMON8P93KM011G2MM2SUIGQJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "cddfc659336a16ff", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "227" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:33 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "DQBALSI2P2P45KEIVGEC68ERBNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "8665dae76d84c8c8", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "97" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "245" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:33 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "1497641603" ], "X-Amzn-Requestid": [ "KMR0TANDAD42KR5RQ6PJ01PIGBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJpIjp7Ik4iOiI5NSJ9LCJzIjp7IlMiOiJhIHN0cmluZyJ9LCJtIjp7Ik0iOnsiYSI6eyJTIjoib25lIn0sImIiOnsiUyI6InR3byJ9fX0sIm5hbWUiOnsiUyI6InRlc3RHZXRNYXAifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZjRiZWJlZjEtOWM3NC00OWYwLTg4MWMtNGY3ODFhMzUzOWZiIn0sImYiOnsiTiI6IjMyLjMifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "04d22949802dec83", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "285" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:33 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "AO0TR6GPKPK1AS09ONG82CCVK3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "e25dc3a0ee480ce2", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "100" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:33 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "790745304" ], "X-Amzn-Requestid": [ "O842SCNJ00HMLM7505IUGSQ6VVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJCIjp7IkJPT0wiOmZhbHNlfSwiU3QiOnsiUyI6ImEgc3RyaW5nIn0sIlUiOnsiTiI6IjAifSwiRiI6eyJOIjoiMzIuMyJ9LCJJIjp7Ik4iOiI5NSJ9LCJFdGFnIjp7Ik5VTEwiOnRydWV9LCJNIjp7Ik0iOnsiYSI6eyJTIjoib25lIn0sImIiOnsiUyI6InR3byJ9fX0sIm5hbWUiOnsiUyI6InRlc3RHZXRTdHJ1Y3QifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZmIyNjE4YjQtOTNiZi00NDFmLWExY2UtZjJiYzFkYzM0ODFmIn19XX0sIlVucHJvY2Vzc2VkS2V5cyI6e319" } }, { "ID": "98d2cbb4cf49c1d4", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "229" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:33 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "QP4RNSM22LVVPR4JM835TT9LOJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "caa0537bf2cf202b", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "234" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "195" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:33 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "4095829345" ], "X-Amzn-Requestid": [ "6U78HV8MCJ85SUCMHVA68F09I7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJmMWJjYTNjMS02M2I5LTQ2NGMtYWVlMS0wN2JmOGRiMDEzNWIifSwiZiI6eyJOIjoiMzIuMyJ9LCJtIjp7Ik0iOnsiYiI6eyJTIjoidHdvIn19fSwibmFtZSI6eyJTIjoidGVzdEdldE1hcEZQIn19XX0sIlVucHJvY2Vzc2VkS2V5cyI6e319" } }, { "ID": "6c95fba341d158b3", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "287" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:33 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "D4QQ7H67SN01P558KRDVJKR75BVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "45b9b872aa930612", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "238" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "203" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:33 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "1881215191" ], "X-Amzn-Requestid": [ "EM5LNIC33U5DG8BBK04FI7TMCNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiIzZDYyNDgyYS1lNjA3LTRmYTMtOWIwZi1lY2UzMWJiODJmNzQifSwiTSI6eyJNIjp7ImEiOnsiUyI6Im9uZSJ9fX0sIlN0Ijp7IlMiOiJhIHN0cmluZyJ9LCJuYW1lIjp7IlMiOiJ0ZXN0R2V0U3RydWN0RlAifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "2b510ef93d35942f", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "287" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:33 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "PPQM3RNE5NRDSQ6PGLAC41T2HRVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "2b4b9897bc49cc80", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "210" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "89" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:33 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2845408016" ], "X-Amzn-Requestid": [ "64TUQPB1TK5CB57TIANLCKDUNNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0R2V0U3RydWN0V0MifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "6c88f1a945742fad", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "99" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "57" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:33 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "289144682" ], "X-Amzn-Requestid": [ "01Q0HG47IVEL69M71F26HKTV97VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbXX0sIlVucHJvY2Vzc2VkS2V5cyI6e319" } }, { "ID": "fc74793625a0b456", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DescribeTable" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "599" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:33 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3022004566" ], "X-Amzn-Requestid": [ "AOAMOFL526H10TND7HLIA9QP03VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJUYWJsZSI6eyJBdHRyaWJ1dGVEZWZpbml0aW9ucyI6W3siQXR0cmlidXRlTmFtZSI6Im5hbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9XSwiQ3JlYXRpb25EYXRlVGltZSI6MS43MjMwNzYwNzk3OTdFOSwiRGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZCI6ZmFsc2UsIkl0ZW1Db3VudCI6MCwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoibmFtZSIsIktleVR5cGUiOiJIQVNIIn1dLCJQcm92aXNpb25lZFRocm91Z2hwdXQiOnsiTnVtYmVyT2ZEZWNyZWFzZXNUb2RheSI6MCwiUmVhZENhcGFjaXR5VW5pdHMiOjUsIldyaXRlQ2FwYWNpdHlVbml0cyI6NX0sIlRhYmxlQXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMSIsIlRhYmxlSWQiOiI5N2U0OTNmNC1jZjU3LTQ2YmItOTc4Ny1iOGU4ZDk3ZjUwMDciLCJUYWJsZU5hbWUiOiJkb2NzdG9yZS10ZXN0LTEiLCJUYWJsZVNpemVCeXRlcyI6MCwiVGFibGVTdGF0dXMiOiJBQ1RJVkUiLCJXYXJtVGhyb3VnaHB1dCI6eyJSZWFkVW5pdHNQZXJTZWNvbmQiOjUsIlN0YXR1cyI6IkFDVElWRSIsIldyaXRlVW5pdHNQZXJTZWNvbmQiOjV9fX0=" } }, { "ID": "ab67ddaff37412b3", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1163" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:33 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2248801167" ], "X-Amzn-Requestid": [ "J6VA38MUSDME0QNGU5AS3KD4CVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6NSwiSXRlbXMiOlt7ImkiOnsiTiI6Ijk1In0sInMiOnsiUyI6ImEgc3RyaW5nIn0sIm0iOnsiTSI6eyJhIjp7IlMiOiJvbmUifSwiYiI6eyJTIjoidHdvIn19fSwibmFtZSI6eyJTIjoidGVzdEdldE1hcEZQIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImYxYmNhM2MxLTYzYjktNDY0Yy1hZWUxLTA3YmY4ZGIwMTM1YiJ9LCJmIjp7Ik4iOiIzMi4zIn19LHsiQiI6eyJCT09MIjpmYWxzZX0sIlN0Ijp7IlMiOiJhIHN0cmluZyJ9LCJVIjp7Ik4iOiIwIn0sIkYiOnsiTiI6IjMyLjMifSwiSSI6eyJOIjoiOTUifSwiRXRhZyI6eyJOVUxMIjp0cnVlfSwiTSI6eyJNIjp7ImEiOnsiUyI6Im9uZSJ9LCJiIjp7IlMiOiJ0d28ifX19LCJuYW1lIjp7IlMiOiJ0ZXN0R2V0U3RydWN0In0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImZiMjYxOGI0LTkzYmYtNDQxZi1hMWNlLWYyYmMxZGMzNDgxZiJ9fSx7IkIiOnsiQk9PTCI6ZmFsc2V9LCJTdCI6eyJTIjoiYSBzdHJpbmcifSwiVSI6eyJOIjoiMCJ9LCJGIjp7Ik4iOiIzMi4zIn0sIkkiOnsiTiI6Ijk1In0sIkV0YWciOnsiTlVMTCI6dHJ1ZX0sIk0iOnsiTSI6eyJhIjp7IlMiOiJvbmUifSwiYiI6eyJTIjoidHdvIn19fSwibmFtZSI6eyJTIjoidGVzdEdldFN0cnVjdFdDIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6IjgyZDJjMzNmLTBmODYtNDE0NS04YmQyLThlMWI0YjdhZjlmMCJ9fSx7ImkiOnsiTiI6Ijk1In0sInMiOnsiUyI6ImEgc3RyaW5nIn0sIm0iOnsiTSI6eyJhIjp7IlMiOiJvbmUifSwiYiI6eyJTIjoidHdvIn19fSwibmFtZSI6eyJTIjoidGVzdEdldE1hcCJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJmNGJlYmVmMS05Yzc0LTQ5ZjAtODgxYy00Zjc4MWEzNTM5ZmIifSwiZiI6eyJOIjoiMzIuMyJ9fSx7IkIiOnsiQk9PTCI6ZmFsc2V9LCJTdCI6eyJTIjoiYSBzdHJpbmcifSwiVSI6eyJOIjoiMCJ9LCJGIjp7Ik4iOiIzMi4zIn0sIkkiOnsiTiI6Ijk1In0sIkV0YWciOnsiTlVMTCI6dHJ1ZX0sIk0iOnsiTSI6eyJhIjp7IlMiOiJvbmUifSwiYiI6eyJTIjoidHdvIn19fSwibmFtZSI6eyJTIjoidGVzdEdldFN0cnVjdEZQIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6IjNkNjI0ODJhLWU2MDctNGZhMy05YjBmLWVjZTMxYmI4MmY3NCJ9fV0sIlNjYW5uZWRDb3VudCI6NX0=" } }, { "ID": "f36e79316cb45207", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "68" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:33 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "444RPP51JKG02MBC05SCP6JJ23VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "5c5ce0f122aaaaa8", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "70" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:33 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "N71THINQIGF7NV4NLDJ5T1B8VJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "58bbf75fd7ae5d1b", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "70" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:34 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "2OL4SU64NTNF5NG33755FKJBOVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "5958d9610f4d51f8", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "67" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:33 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "34CAIRUD7BBH1A2P7TSG6HVG2VVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "a553bd80af3a112b", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "65" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:34 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "AGQHSF2UH6FMBIV8ILS7C8LHRNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "0c4a5d1aa9c3cf73", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "215" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:34 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "8NI3075844VSK46G4OV8QQ454FVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "a6830d5d3d01eeac", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "97" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "233" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:34 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "435471445" ], "X-Amzn-Requestid": [ "8D37CNK3PU9RE1RRN4BCEMKHGBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJpIjp7Ik4iOiI5NSJ9LCJFdGFnIjp7IlMiOiJmNzQ5ODQ0Zi0wMjAzLTQ2NDUtYmE1Yi1jMjlmNmE5YWY3YmEifSwicyI6eyJTIjoiYSBzdHJpbmcifSwibSI6eyJNIjp7ImEiOnsiUyI6Im9uZSJ9LCJiIjp7IlMiOiJ0d28ifX19LCJuYW1lIjp7IlMiOiJ0ZXN0R2V0TWFwIn0sImYiOnsiTiI6IjMyLjMifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "4cc0065f5a1d93e7", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "285" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:34 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "GICM5ECS05DFM5UK5C3A5I4B6BVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "bd7f4f526a2ee694", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "100" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "303" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:34 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "1655920843" ], "X-Amzn-Requestid": [ "MJM4N5K80T4H91PS8UKB2TTLJ7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJCIjp7IkJPT0wiOmZhbHNlfSwiU3QiOnsiUyI6ImEgc3RyaW5nIn0sIlUiOnsiTiI6IjAifSwiRiI6eyJOIjoiMzIuMyJ9LCJJIjp7Ik4iOiI5NSJ9LCJFdGFnIjp7IlMiOiI5NThmNzk2OS1kYzg5LTRmMzEtYjUyOS0xMTU0YzYyYWEwMDYifSwiTSI6eyJNIjp7ImEiOnsiUyI6Im9uZSJ9LCJiIjp7IlMiOiJ0d28ifX19LCJuYW1lIjp7IlMiOiJ0ZXN0R2V0U3RydWN0In0sIkRvY3N0b3JlUmV2aXNpb24iOnsiTlVMTCI6dHJ1ZX19XX0sIlVucHJvY2Vzc2VkS2V5cyI6e319" } }, { "ID": "59f0f5c0dbcc9b46", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "217" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:34 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "O4MMP0GUA3RMVFNH2NV4V4M6M7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "1a08625b5b48b6ea", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "222" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "183" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:34 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3237943276" ], "X-Amzn-Requestid": [ "C4R8MCCDRD1ASU2HBMMCVSNOPNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJFdGFnIjp7IlMiOiJiZTBkMjQzMy01MjMyLTRmZWMtYmQ5Ni1kODQ5OTJhZjE4NTkifSwiZiI6eyJOIjoiMzIuMyJ9LCJtIjp7Ik0iOnsiYiI6eyJTIjoidHdvIn19fSwibmFtZSI6eyJTIjoidGVzdEdldE1hcEZQIn19XX0sIlVucHJvY2Vzc2VkS2V5cyI6e319" } }, { "ID": "c0900181266758b4", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "287" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:34 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "A6C6G6M2LS8L6FF8FS2531FQMRVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "bb7dfc539d160deb", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "226" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "191" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:34 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "1521370912" ], "X-Amzn-Requestid": [ "UT2E84R9B9I604JLO7S9QRU8Q3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJFdGFnIjp7IlMiOiJjZjNiMzdmYS1iNTQ2LTRmNmYtOTE1MS02Yzk5NDc2Y2VhNWUifSwiTSI6eyJNIjp7ImEiOnsiUyI6Im9uZSJ9fX0sIlN0Ijp7IlMiOiJhIHN0cmluZyJ9LCJuYW1lIjp7IlMiOiJ0ZXN0R2V0U3RydWN0RlAifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "a5a9b8a39cdc5543", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "287" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:34 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "GACBN81U91KA74HUHUEMRD4K57VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "0277d516961ea9e2", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "210" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "89" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:34 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2845408016" ], "X-Amzn-Requestid": [ "2EAF17SQ5NFHB55SPO3I8CIRERVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0R2V0U3RydWN0V0MifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "acbfcb27fc9a4f2d", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "99" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "57" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:34 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "289144682" ], "X-Amzn-Requestid": [ "TKRVLOKDDJ3BUSRB22BAS6MJBBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbXX0sIlVucHJvY2Vzc2VkS2V5cyI6e319" } } ] } ================================================ FILE: docstore/awsdynamodb/v2/testdata/TestConformance/GetQuery.replay ================================================ { "Initial": "AQAAAA7hTg5eDy18HgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*", ".*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "2789f4a0b190ea5b", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DescribeTable" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1609" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:50 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "298093499" ], "X-Amzn-Requestid": [ "2B49R92DU1HVLQR0K0EMN4RG0RVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJUYWJsZSI6eyJBdHRyaWJ1dGVEZWZpbml0aW9ucyI6W3siQXR0cmlidXRlTmFtZSI6IkdhbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9LHsiQXR0cmlidXRlTmFtZSI6IlBsYXllciIsIkF0dHJpYnV0ZVR5cGUiOiJTIn0seyJBdHRyaWJ1dGVOYW1lIjoiU2NvcmUiLCJBdHRyaWJ1dGVUeXBlIjoiTiJ9LHsiQXR0cmlidXRlTmFtZSI6IlRpbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9XSwiQ3JlYXRpb25EYXRlVGltZSI6MS43MjMwNzYwODA2OTVFOSwiRGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZCI6ZmFsc2UsIkdsb2JhbFNlY29uZGFyeUluZGV4ZXMiOlt7IkluZGV4QXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMi9pbmRleC9nbG9iYWwiLCJJbmRleE5hbWUiOiJnbG9iYWwiLCJJbmRleFNpemVCeXRlcyI6MTE4LCJJbmRleFN0YXR1cyI6IkFDVElWRSIsIkl0ZW1Db3VudCI6MSwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoiUGxheWVyIiwiS2V5VHlwZSI6IkhBU0gifSx7IkF0dHJpYnV0ZU5hbWUiOiJUaW1lIiwiS2V5VHlwZSI6IlJBTkdFIn1dLCJQcm9qZWN0aW9uIjp7IlByb2plY3Rpb25UeXBlIjoiQUxMIn0sIlByb3Zpc2lvbmVkVGhyb3VnaHB1dCI6eyJOdW1iZXJPZkRlY3JlYXNlc1RvZGF5IjowLCJSZWFkQ2FwYWNpdHlVbml0cyI6NSwiV3JpdGVDYXBhY2l0eVVuaXRzIjo1fSwiV2FybVRocm91Z2hwdXQiOnsiUmVhZFVuaXRzUGVyU2Vjb25kIjo1LCJTdGF0dXMiOiJBQ1RJVkUiLCJXcml0ZVVuaXRzUGVyU2Vjb25kIjo1fX1dLCJJdGVtQ291bnQiOjEsIktleVNjaGVtYSI6W3siQXR0cmlidXRlTmFtZSI6IkdhbWUiLCJLZXlUeXBlIjoiSEFTSCJ9LHsiQXR0cmlidXRlTmFtZSI6IlBsYXllciIsIktleVR5cGUiOiJSQU5HRSJ9XSwiTG9jYWxTZWNvbmRhcnlJbmRleGVzIjpbeyJJbmRleEFybiI6ImFybjphd3M6ZHluYW1vZGI6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3Njp0YWJsZS9kb2NzdG9yZS10ZXN0LTIvaW5kZXgvbG9jYWwiLCJJbmRleE5hbWUiOiJsb2NhbCIsIkluZGV4U2l6ZUJ5dGVzIjoxMTgsIkl0ZW1Db3VudCI6MSwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoiR2FtZSIsIktleVR5cGUiOiJIQVNIIn0seyJBdHRyaWJ1dGVOYW1lIjoiU2NvcmUiLCJLZXlUeXBlIjoiUkFOR0UifV0sIlByb2plY3Rpb24iOnsiUHJvamVjdGlvblR5cGUiOiJBTEwifX1dLCJQcm92aXNpb25lZFRocm91Z2hwdXQiOnsiTnVtYmVyT2ZEZWNyZWFzZXNUb2RheSI6MCwiUmVhZENhcGFjaXR5VW5pdHMiOjUsIldyaXRlQ2FwYWNpdHlVbml0cyI6NX0sIlRhYmxlQXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMiIsIlRhYmxlSWQiOiIwZDRmOTk4My1kOGE5LTRhZjEtYTY0NC05YmE3M2NlMGYyMjciLCJUYWJsZU5hbWUiOiJkb2NzdG9yZS10ZXN0LTIiLCJUYWJsZVNpemVCeXRlcyI6MTE4LCJUYWJsZVN0YXR1cyI6IkFDVElWRSIsIldhcm1UaHJvdWdocHV0Ijp7IlJlYWRVbml0c1BlclNlY29uZCI6NSwiU3RhdHVzIjoiQUNUSVZFIiwiV3JpdGVVbml0c1BlclNlY29uZCI6NX19fQ==" } }, { "ID": "58482e063d05bf04", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "54" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1649" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:50 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2784120019" ], "X-Amzn-Requestid": [ "503K4PDBK907S6MIFTGHKJ0AL3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6OCwiSXRlbXMiOlt7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTEwVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImJpbGxpZSJ9LCJTY29yZSI6eyJOIjoiMTExIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZTJmMjQyZTYtNDgxOS00Zjg1LWE4MmItMWQ3NjVmOTc1YmI2In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMjBUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9LCJTY29yZSI6eyJOIjoiMzMifSwiR2FtZSI6eyJTIjoiWm9tYmllIERNViJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiI4OWUzYWJiMy1hODk0LTQ5ZTItODZiNi0wZDIyNDgxYTAxYmMifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOnRydWV9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTE4VDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6Im1lbCJ9LCJTY29yZSI6eyJOIjoiMTkwIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZWUwNmVkM2ItYjY1Yy00M2YyLTg1MjMtMDU3YWNlNzk0ZmYzIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjp0cnVlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0wMVQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJwYXQifSwiU2NvcmUiOnsiTiI6IjEyMCJ9LCJHYW1lIjp7IlMiOiJab21iaWUgRE1WIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6IjhjNWE2NTZjLTU4NGQtNDllMy1hNWQ3LWYwNWJjODMxMWU0NiJ9fSx7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTAyLTAxVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImFuZHkifSwiU2NvcmUiOnsiTiI6IjgxIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiOWQ0MTI5NDktNmJjNS00NjU4LWExMTctNTYxYTM2MDc0NmU5In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTlUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9LCJTY29yZSI6eyJOIjoiMzMifSwiR2FtZSI6eyJTIjoiUHJhaXNlIEFsbCBNb25zdGVycyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiI2ODU4MzJlMC0zMzRiLTRhMDItOTk4MC1hZmNjYjdhMWEyZmIifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOmZhbHNlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0xMFQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJtZWwifSwiU2NvcmUiOnsiTiI6IjYwIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiYzAxM2FkN2EtOTcyYi00ZmJkLWE1MjQtNDNlNGQ0MjRmZTlhIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTNUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoicGF0In0sIlNjb3JlIjp7Ik4iOiI0OSJ9LCJHYW1lIjp7IlMiOiJQcmFpc2UgQWxsIE1vbnN0ZXJzIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImNiYjk2ZjZjLWYyMDUtNGNkMC05YTM3LWRkN2NhNzk3Y2I2YiJ9fV0sIlNjYW5uZWRDb3VudCI6OH0=" } }, { "ID": "bfa6cdc4e1dadf9e", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "260" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:50 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "OTUD1HD8JS2NA13836TD4TJGIVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "488ce5a7ccb0568c", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "251" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:50 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "QEO4RBHDDMK3MGEVNONM11N2VFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "db18e5a87acc5ff8", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "252" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:50 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "0F60DJEF3QNA4DQREKLAH73E2FVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "d86bd08fb2003402", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "261" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:50 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "1LUNPCHP80KI805T5AURARUHJFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "a5deeea32d46f1ae", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "254" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:50 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "2555OM3VVU8IP19BHQHAURTMHRVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "55220892e4079400", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "260" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:50 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "5QPGCHIGAV2DBGUUBB9PIEI98JVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "e6e1d60a3ac2b18d", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "251" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:50 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "4KAOCUHI5FF7BLLJS11LK3GU4RVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "dc750acd78c5256c", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "261" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:50 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "D313IQV3GL8O9EK5JI32TB9C2JVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "1b73ffae98780814", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "235" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:50 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "3TA49BEUUQJO7HQJ2BIN8VU9JBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "8b95d47984002619", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "238" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:50 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "7AUDN92G0HR8DH4D4J2MMO28U7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "2b3602183d0a950b", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "243" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:50 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "NJ4740TNEO5JD8P3TD067TT7AJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "3225c0531e8c0ff0", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "244" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:50 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "64N2UQVCKRKBTEL46H2VDTMD5BVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "31581fe3d4a85e7f", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "234" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:50 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "F69UUTUVK42Q47CJVR45MJF4QFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "ea0b3c25040446df", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "244" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:50 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "MP99KVB27VM93Q12F894I2239NVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "a428152df6a2842f", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "243" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:50 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "IV9JH2IJ0068772M9F6IQND2L3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "8a6ea78f6b2c5f90", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "234" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:50 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "DJ2BLCPMNC98C5SDSVPPV5ENGRVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "d0afb03c2fb1db06", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "54" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1649" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:50 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3539434770" ], "X-Amzn-Requestid": [ "OE37F52NPTQNL0IC2251N33NEVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6OCwiSXRlbXMiOlt7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTEwVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImJpbGxpZSJ9LCJTY29yZSI6eyJOIjoiMTExIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiODNlN2MyMzYtOGUzMC00MzFjLWI4ZjQtZTIxN2VjZjgwZDA1In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMjBUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9LCJTY29yZSI6eyJOIjoiMzMifSwiR2FtZSI6eyJTIjoiWm9tYmllIERNViJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiIyZGQ2ZWQ0NC04MzE3LTQ5MjEtYmRiNC0wOTM0YTA4MWRjZDIifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOnRydWV9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTE4VDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6Im1lbCJ9LCJTY29yZSI6eyJOIjoiMTkwIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZDZiZWY4ZjQtNWQzMS00N2VhLThhODQtOGNhZGQ4NjdkNmZkIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjp0cnVlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0wMVQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJwYXQifSwiU2NvcmUiOnsiTiI6IjEyMCJ9LCJHYW1lIjp7IlMiOiJab21iaWUgRE1WIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImViNzFlMmJjLWNlNDEtNGUxYi1hYjA4LTZjNTVlZjBkNTYwOCJ9fSx7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTAyLTAxVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImFuZHkifSwiU2NvcmUiOnsiTiI6IjgxIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZjQ1ZDRhY2ItZmMxNC00ZDhkLTk4Y2UtNzllNWNmNDdkMTVkIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTlUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9LCJTY29yZSI6eyJOIjoiMzMifSwiR2FtZSI6eyJTIjoiUHJhaXNlIEFsbCBNb25zdGVycyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJkZWMzODRjNS03M2MzLTQ5OWEtYTZlZi04MDk5ZGRhYWNmOTAifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOmZhbHNlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0xMFQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJtZWwifSwiU2NvcmUiOnsiTiI6IjYwIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZTY5NGY3NzYtMzJlNC00YzllLTk2MTYtZTQ5YmUxMjlhYmI0In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTNUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoicGF0In0sIlNjb3JlIjp7Ik4iOiI0OSJ9LCJHYW1lIjp7IlMiOiJQcmFpc2UgQWxsIE1vbnN0ZXJzIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6Ijk4NzQ4YWY3LTVmMWItNGE2NC1iZWM5LTdmYzBmMWJmNzQyMSJ9fV0sIlNjYW5uZWRDb3VudCI6OH0=" } }, { "ID": "84e886faf9196e66", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "184" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Query" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "827" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:51 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "860481882" ], "X-Amzn-Requestid": [ "OB58IIJVTTBL28C1UJ4GLVLQCBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6NCwiSXRlbXMiOlt7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTEwVDAwOjAwOjAwWiJ9LCJTY29yZSI6eyJOIjoiMTExIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiODNlN2MyMzYtOGUzMC00MzFjLWI4ZjQtZTIxN2VjZjgwZDA1In0sIlBsYXllciI6eyJTIjoiYmlsbGllIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMjBUMDA6MDA6MDBaIn0sIlNjb3JlIjp7Ik4iOiIzMyJ9LCJHYW1lIjp7IlMiOiJab21iaWUgRE1WIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6IjJkZDZlZDQ0LTgzMTctNDkyMS1iZGI0LTA5MzRhMDgxZGNkMiJ9LCJQbGF5ZXIiOnsiUyI6ImZyYW4ifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOnRydWV9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTE4VDAwOjAwOjAwWiJ9LCJTY29yZSI6eyJOIjoiMTkwIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZDZiZWY4ZjQtNWQzMS00N2VhLThhODQtOGNhZGQ4NjdkNmZkIn0sIlBsYXllciI6eyJTIjoibWVsIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjp0cnVlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0wMVQwMDowMDowMFoifSwiU2NvcmUiOnsiTiI6IjEyMCJ9LCJHYW1lIjp7IlMiOiJab21iaWUgRE1WIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImViNzFlMmJjLWNlNDEtNGUxYi1hYjA4LTZjNTVlZjBkNTYwOCJ9LCJQbGF5ZXIiOnsiUyI6InBhdCJ9fV0sIlNjYW5uZWRDb3VudCI6NH0=" } }, { "ID": "c8eaca8515b9e708", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "172" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "630" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:51 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3761128761" ], "X-Amzn-Requestid": [ "AOH1IC0U52Q6APEVELGLU3UBGVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MywiSXRlbXMiOlt7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTEwVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImJpbGxpZSJ9LCJTY29yZSI6eyJOIjoiMTExIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiODNlN2MyMzYtOGUzMC00MzFjLWI4ZjQtZTIxN2VjZjgwZDA1In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjp0cnVlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0xOFQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJtZWwifSwiU2NvcmUiOnsiTiI6IjE5MCJ9LCJHYW1lIjp7IlMiOiJab21iaWUgRE1WIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImQ2YmVmOGY0LTVkMzEtNDdlYS04YTg0LThjYWRkODY3ZDZmZCJ9fSx7IldpdGhHbGl0Y2giOnsiQk9PTCI6dHJ1ZX0sIlRpbWUiOnsiUyI6IjIwMTktMDQtMDFUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoicGF0In0sIlNjb3JlIjp7Ik4iOiIxMjAifSwiR2FtZSI6eyJTIjoiWm9tYmllIERNViJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJlYjcxZTJiYy1jZTQxLTRlMWItYWIwOC02YzU1ZWYwZDU2MDgifX1dLCJTY2FubmVkQ291bnQiOjh9" } }, { "ID": "8cdafd3b54f721a5", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "203" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Query" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "238" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:51 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2372657991" ], "X-Amzn-Requestid": [ "G1KMUGRAGU6KNIVGE3GUJ4GSVBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MSwiSXRlbXMiOlt7IlRpbWUiOnsiUyI6IjIwMTktMDQtMTBUMDA6MDA6MDBaIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiU2NvcmUiOnsiTiI6IjExMSJ9LCJQbGF5ZXIiOnsiUyI6ImJpbGxpZSJ9LCJXaXRoR2xpdGNoIjp7IkJPT0wiOmZhbHNlfSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiODNlN2MyMzYtOGUzMC00MzFjLWI4ZjQtZTIxN2VjZjgwZDA1In19XSwiU2Nhbm5lZENvdW50IjoxfQ==" } }, { "ID": "d111ede4b7441771", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "241" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Query" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "244" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:51 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2573443467" ], "X-Amzn-Requestid": [ "C5DTKPOTCB40B13NB0TKA20JARVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MSwiSXRlbXMiOlt7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTAyLTAxVDAwOjAwOjAwWiJ9LCJTY29yZSI6eyJOIjoiODEifSwiR2FtZSI6eyJTIjoiUHJhaXNlIEFsbCBNb25zdGVycyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJmNDVkNGFjYi1mYzE0LTRkOGQtOThjZS03OWU1Y2Y0N2QxNWQifSwiUGxheWVyIjp7IlMiOiJhbmR5In19XSwiU2Nhbm5lZENvdW50IjoxfQ==" } }, { "ID": "431139b32027344d", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "259" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Query" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "243" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:51 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "64767550" ], "X-Amzn-Requestid": [ "1A4T11078MPCEK3DJEL5C4UCABVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MSwiSXRlbXMiOlt7IkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiU2NvcmUiOnsiTiI6IjQ5In0sIlBsYXllciI6eyJTIjoicGF0In0sIldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiI5ODc0OGFmNy01ZjFiLTRhNjQtYmVjOS03ZmMwZjFiZjc0MjEifSwiVGltZSI6eyJTIjoiMjAxOS0wMy0xM1QwMDowMDowMFoifX1dLCJTY2FubmVkQ291bnQiOjJ9" } }, { "ID": "ac811cf7325aeb18", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "259" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Query" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "449" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:51 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "45676198" ], "X-Amzn-Requestid": [ "DM08QH5BINDDPSVQAV0G09K0NFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MiwiSXRlbXMiOlt7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJQbGF5ZXIiOnsiUyI6Im1lbCJ9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTEwVDAwOjAwOjAwWiJ9LCJHYW1lIjp7IlMiOiJQcmFpc2UgQWxsIE1vbnN0ZXJzIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImU2OTRmNzc2LTMyZTQtNGM5ZS05NjE2LWU0OWJlMTI5YWJiNCJ9LCJTY29yZSI6eyJOIjoiNjAifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOmZhbHNlfSwiUGxheWVyIjp7IlMiOiJhbmR5In0sIlRpbWUiOnsiUyI6IjIwMTktMDItMDFUMDA6MDA6MDBaIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZjQ1ZDRhY2ItZmMxNC00ZDhkLTk4Y2UtNzllNWNmNDdkMTVkIn0sIlNjb3JlIjp7Ik4iOiI4MSJ9fV0sIlNjYW5uZWRDb3VudCI6Mn0=" } }, { "ID": "c09c1a6a578c58b7", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "262" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Query" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "439" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:51 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3791427149" ], "X-Amzn-Requestid": [ "0ROL24946HCBU16R2DQHUDG587VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MiwiSXRlbXMiOlt7IkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImU2OTRmNzc2LTMyZTQtNGM5ZS05NjE2LWU0OWJlMTI5YWJiNCJ9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTEwVDAwOjAwOjAwWiJ9LCJTY29yZSI6eyJOIjoiNjAifSwiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlBsYXllciI6eyJTIjoibWVsIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifX0seyJUaW1lIjp7IlMiOiIyMDE5LTA0LTE4VDAwOjAwOjAwWiJ9LCJXaXRoR2xpdGNoIjp7IkJPT0wiOnRydWV9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJkNmJlZjhmNC01ZDMxLTQ3ZWEtOGE4NC04Y2FkZDg2N2Q2ZmQifSwiU2NvcmUiOnsiTiI6IjE5MCJ9LCJQbGF5ZXIiOnsiUyI6Im1lbCJ9LCJHYW1lIjp7IlMiOiJab21iaWUgRE1WIn19XSwiU2Nhbm5lZENvdW50IjoyfQ==" } }, { "ID": "20a8c08cd0a34546", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "234" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "639" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:51 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2062909809" ], "X-Amzn-Requestid": [ "BKTUA231H8JKE2K7KTSV8JK847VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MywiSXRlbXMiOlt7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTEwVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImJpbGxpZSJ9LCJTY29yZSI6eyJOIjoiMTExIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiODNlN2MyMzYtOGUzMC00MzFjLWI4ZjQtZTIxN2VjZjgwZDA1In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjp0cnVlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0xOFQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJtZWwifSwiU2NvcmUiOnsiTiI6IjE5MCJ9LCJHYW1lIjp7IlMiOiJab21iaWUgRE1WIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImQ2YmVmOGY0LTVkMzEtNDdlYS04YTg0LThjYWRkODY3ZDZmZCJ9fSx7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTEwVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6Im1lbCJ9LCJTY29yZSI6eyJOIjoiNjAifSwiR2FtZSI6eyJTIjoiUHJhaXNlIEFsbCBNb25zdGVycyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJlNjk0Zjc3Ni0zMmU0LTRjOWUtOTYxNi1lNDliZTEyOWFiYjQifX1dLCJTY2FubmVkQ291bnQiOjh9" } }, { "ID": "15907f563a347df5", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "200" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "639" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:51 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2249627460" ], "X-Amzn-Requestid": [ "HPMAG1F0PL37R2KGENGMCL3PABVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MywiSXRlbXMiOlt7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTEwVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImJpbGxpZSJ9LCJTY29yZSI6eyJOIjoiMTExIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiODNlN2MyMzYtOGUzMC00MzFjLWI4ZjQtZTIxN2VjZjgwZDA1In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjp0cnVlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0wMVQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJwYXQifSwiU2NvcmUiOnsiTiI6IjEyMCJ9LCJHYW1lIjp7IlMiOiJab21iaWUgRE1WIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImViNzFlMmJjLWNlNDEtNGUxYi1hYjA4LTZjNTVlZjBkNTYwOCJ9fSx7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTAzLTEzVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6InBhdCJ9LCJTY29yZSI6eyJOIjoiNDkifSwiR2FtZSI6eyJTIjoiUHJhaXNlIEFsbCBNb25zdGVycyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiI5ODc0OGFmNy01ZjFiLTRhNjQtYmVjOS03ZmMwZjFiZjc0MjEifX1dLCJTY2FubmVkQ291bnQiOjh9" } }, { "ID": "e6169ff768291ad0", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "206" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1048" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:51 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3759705245" ], "X-Amzn-Requestid": [ "RGU7J1QOK3MM77C6LDON64P7BBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6NSwiSXRlbXMiOlt7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTAzLTIwVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImZyYW4ifSwiU2NvcmUiOnsiTiI6IjMzIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiMmRkNmVkNDQtODMxNy00OTIxLWJkYjQtMDkzNGEwODFkY2QyIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjp0cnVlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0xOFQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJtZWwifSwiU2NvcmUiOnsiTiI6IjE5MCJ9LCJHYW1lIjp7IlMiOiJab21iaWUgRE1WIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImQ2YmVmOGY0LTVkMzEtNDdlYS04YTg0LThjYWRkODY3ZDZmZCJ9fSx7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTAyLTAxVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImFuZHkifSwiU2NvcmUiOnsiTiI6IjgxIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZjQ1ZDRhY2ItZmMxNC00ZDhkLTk4Y2UtNzllNWNmNDdkMTVkIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTlUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9LCJTY29yZSI6eyJOIjoiMzMifSwiR2FtZSI6eyJTIjoiUHJhaXNlIEFsbCBNb25zdGVycyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJkZWMzODRjNS03M2MzLTQ5OWEtYTZlZi04MDk5ZGRhYWNmOTAifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOmZhbHNlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0xMFQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJtZWwifSwiU2NvcmUiOnsiTiI6IjYwIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZTY5NGY3NzYtMzJlNC00YzllLTk2MTYtZTQ5YmUxMjlhYmI0In19XSwiU2Nhbm5lZENvdW50Ijo4fQ==" } }, { "ID": "e67d20f9bcb8373d", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "179" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "430" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:51 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "799139171" ], "X-Amzn-Requestid": [ "O40FVRN7HISA17H35AQ6H2I3UBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MiwiSXRlbXMiOlt7IldpdGhHbGl0Y2giOnsiQk9PTCI6dHJ1ZX0sIlRpbWUiOnsiUyI6IjIwMTktMDQtMThUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoibWVsIn0sIlNjb3JlIjp7Ik4iOiIxOTAifSwiR2FtZSI6eyJTIjoiWm9tYmllIERNViJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJkNmJlZjhmNC01ZDMxLTQ3ZWEtOGE4NC04Y2FkZDg2N2Q2ZmQifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOnRydWV9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTAxVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6InBhdCJ9LCJTY29yZSI6eyJOIjoiMTIwIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZWI3MWUyYmMtY2U0MS00ZTFiLWFiMDgtNmM1NWVmMGQ1NjA4In19XSwiU2Nhbm5lZENvdW50Ijo4fQ==" } }, { "ID": "23902c46a067285a", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "182" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "430" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:51 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "799139171" ], "X-Amzn-Requestid": [ "FBQL44UACD4V99V8GVCEQKD5TJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MiwiSXRlbXMiOlt7IldpdGhHbGl0Y2giOnsiQk9PTCI6dHJ1ZX0sIlRpbWUiOnsiUyI6IjIwMTktMDQtMThUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoibWVsIn0sIlNjb3JlIjp7Ik4iOiIxOTAifSwiR2FtZSI6eyJTIjoiWm9tYmllIERNViJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJkNmJlZjhmNC01ZDMxLTQ3ZWEtOGE4NC04Y2FkZDg2N2Q2ZmQifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOnRydWV9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTAxVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6InBhdCJ9LCJTY29yZSI6eyJOIjoiMTIwIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZWI3MWUyYmMtY2U0MS00ZTFiLWFiMDgtNmM1NWVmMGQ1NjA4In19XSwiU2Nhbm5lZENvdW50Ijo4fQ==" } }, { "ID": "ddc6bec22f496f65", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "188" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1257" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:51 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2261849388" ], "X-Amzn-Requestid": [ "Q0N5UMMKK8KO5VIUDJCAJLOC6FVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6NiwiSXRlbXMiOlt7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTEwVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImJpbGxpZSJ9LCJTY29yZSI6eyJOIjoiMTExIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiODNlN2MyMzYtOGUzMC00MzFjLWI4ZjQtZTIxN2VjZjgwZDA1In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMjBUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9LCJTY29yZSI6eyJOIjoiMzMifSwiR2FtZSI6eyJTIjoiWm9tYmllIERNViJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiIyZGQ2ZWQ0NC04MzE3LTQ5MjEtYmRiNC0wOTM0YTA4MWRjZDIifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOmZhbHNlfSwiVGltZSI6eyJTIjoiMjAxOS0wMi0wMVQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJhbmR5In0sIlNjb3JlIjp7Ik4iOiI4MSJ9LCJHYW1lIjp7IlMiOiJQcmFpc2UgQWxsIE1vbnN0ZXJzIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImY0NWQ0YWNiLWZjMTQtNGQ4ZC05OGNlLTc5ZTVjZjQ3ZDE1ZCJ9fSx7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTAzLTE5VDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImZyYW4ifSwiU2NvcmUiOnsiTiI6IjMzIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZGVjMzg0YzUtNzNjMy00OTlhLWE2ZWYtODA5OWRkYWFjZjkwIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDQtMTBUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoibWVsIn0sIlNjb3JlIjp7Ik4iOiI2MCJ9LCJHYW1lIjp7IlMiOiJQcmFpc2UgQWxsIE1vbnN0ZXJzIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImU2OTRmNzc2LTMyZTQtNGM5ZS05NjE2LWU0OWJlMTI5YWJiNCJ9fSx7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTAzLTEzVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6InBhdCJ9LCJTY29yZSI6eyJOIjoiNDkifSwiR2FtZSI6eyJTIjoiUHJhaXNlIEFsbCBNb25zdGVycyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiI5ODc0OGFmNy01ZjFiLTRhNjQtYmVjOS03ZmMwZjFiZjc0MjEifX1dLCJTY2FubmVkQ291bnQiOjh9" } }, { "ID": "ed63c05ca881954c", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "54" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1649" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:51 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3539434770" ], "X-Amzn-Requestid": [ "JFO0KO9VG06G2DVP0829BMK847VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6OCwiSXRlbXMiOlt7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTEwVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImJpbGxpZSJ9LCJTY29yZSI6eyJOIjoiMTExIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiODNlN2MyMzYtOGUzMC00MzFjLWI4ZjQtZTIxN2VjZjgwZDA1In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMjBUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9LCJTY29yZSI6eyJOIjoiMzMifSwiR2FtZSI6eyJTIjoiWm9tYmllIERNViJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiIyZGQ2ZWQ0NC04MzE3LTQ5MjEtYmRiNC0wOTM0YTA4MWRjZDIifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOnRydWV9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTE4VDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6Im1lbCJ9LCJTY29yZSI6eyJOIjoiMTkwIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZDZiZWY4ZjQtNWQzMS00N2VhLThhODQtOGNhZGQ4NjdkNmZkIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjp0cnVlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0wMVQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJwYXQifSwiU2NvcmUiOnsiTiI6IjEyMCJ9LCJHYW1lIjp7IlMiOiJab21iaWUgRE1WIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImViNzFlMmJjLWNlNDEtNGUxYi1hYjA4LTZjNTVlZjBkNTYwOCJ9fSx7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTAyLTAxVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImFuZHkifSwiU2NvcmUiOnsiTiI6IjgxIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZjQ1ZDRhY2ItZmMxNC00ZDhkLTk4Y2UtNzllNWNmNDdkMTVkIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTlUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9LCJTY29yZSI6eyJOIjoiMzMifSwiR2FtZSI6eyJTIjoiUHJhaXNlIEFsbCBNb25zdGVycyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJkZWMzODRjNS03M2MzLTQ5OWEtYTZlZi04MDk5ZGRhYWNmOTAifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOmZhbHNlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0xMFQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJtZWwifSwiU2NvcmUiOnsiTiI6IjYwIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZTY5NGY3NzYtMzJlNC00YzllLTk2MTYtZTQ5YmUxMjlhYmI0In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTNUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoicGF0In0sIlNjb3JlIjp7Ik4iOiI0OSJ9LCJHYW1lIjp7IlMiOiJQcmFpc2UgQWxsIE1vbnN0ZXJzIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6Ijk4NzQ4YWY3LTVmMWItNGE2NC1iZWM5LTdmYzBmMWJmNzQyMSJ9fV0sIlNjYW5uZWRDb3VudCI6OH0=" } }, { "ID": "bbf4aad0621bb2e9", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "54" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1649" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:52 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3539434770" ], "X-Amzn-Requestid": [ "9DM9DF5QTLUACVJS75MRAEOM0RVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6OCwiSXRlbXMiOlt7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTEwVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImJpbGxpZSJ9LCJTY29yZSI6eyJOIjoiMTExIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiODNlN2MyMzYtOGUzMC00MzFjLWI4ZjQtZTIxN2VjZjgwZDA1In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMjBUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9LCJTY29yZSI6eyJOIjoiMzMifSwiR2FtZSI6eyJTIjoiWm9tYmllIERNViJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiIyZGQ2ZWQ0NC04MzE3LTQ5MjEtYmRiNC0wOTM0YTA4MWRjZDIifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOnRydWV9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTE4VDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6Im1lbCJ9LCJTY29yZSI6eyJOIjoiMTkwIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZDZiZWY4ZjQtNWQzMS00N2VhLThhODQtOGNhZGQ4NjdkNmZkIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjp0cnVlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0wMVQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJwYXQifSwiU2NvcmUiOnsiTiI6IjEyMCJ9LCJHYW1lIjp7IlMiOiJab21iaWUgRE1WIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImViNzFlMmJjLWNlNDEtNGUxYi1hYjA4LTZjNTVlZjBkNTYwOCJ9fSx7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTAyLTAxVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImFuZHkifSwiU2NvcmUiOnsiTiI6IjgxIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZjQ1ZDRhY2ItZmMxNC00ZDhkLTk4Y2UtNzllNWNmNDdkMTVkIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTlUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9LCJTY29yZSI6eyJOIjoiMzMifSwiR2FtZSI6eyJTIjoiUHJhaXNlIEFsbCBNb25zdGVycyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJkZWMzODRjNS03M2MzLTQ5OWEtYTZlZi04MDk5ZGRhYWNmOTAifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOmZhbHNlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0xMFQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJtZWwifSwiU2NvcmUiOnsiTiI6IjYwIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZTY5NGY3NzYtMzJlNC00YzllLTk2MTYtZTQ5YmUxMjlhYmI0In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTNUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoicGF0In0sIlNjb3JlIjp7Ik4iOiI0OSJ9LCJHYW1lIjp7IlMiOiJQcmFpc2UgQWxsIE1vbnN0ZXJzIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6Ijk4NzQ4YWY3LTVmMWItNGE2NC1iZWM5LTdmYzBmMWJmNzQyMSJ9fV0sIlNjYW5uZWRDb3VudCI6OH0=" } }, { "ID": "141060cb793fcdd5", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "238" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Query" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "860" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:52 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2228028579" ], "X-Amzn-Requestid": [ "P68UD06THQGS1GKLTQQL3PQK7RVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6NCwiSXRlbXMiOlt7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTAyLTAxVDAwOjAwOjAwWiJ9LCJTY29yZSI6eyJOIjoiODEifSwiR2FtZSI6eyJTIjoiUHJhaXNlIEFsbCBNb25zdGVycyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJmNDVkNGFjYi1mYzE0LTRkOGQtOThjZS03OWU1Y2Y0N2QxNWQifSwiUGxheWVyIjp7IlMiOiJhbmR5In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTlUMDA6MDA6MDBaIn0sIlNjb3JlIjp7Ik4iOiIzMyJ9LCJHYW1lIjp7IlMiOiJQcmFpc2UgQWxsIE1vbnN0ZXJzIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImRlYzM4NGM1LTczYzMtNDk5YS1hNmVmLTgwOTlkZGFhY2Y5MCJ9LCJQbGF5ZXIiOnsiUyI6ImZyYW4ifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOmZhbHNlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0xMFQwMDowMDowMFoifSwiU2NvcmUiOnsiTiI6IjYwIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZTY5NGY3NzYtMzJlNC00YzllLTk2MTYtZTQ5YmUxMjlhYmI0In0sIlBsYXllciI6eyJTIjoibWVsIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTNUMDA6MDA6MDBaIn0sIlNjb3JlIjp7Ik4iOiI0OSJ9LCJHYW1lIjp7IlMiOiJQcmFpc2UgQWxsIE1vbnN0ZXJzIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6Ijk4NzQ4YWY3LTVmMWItNGE2NC1iZWM5LTdmYzBmMWJmNzQyMSJ9LCJQbGF5ZXIiOnsiUyI6InBhdCJ9fV0sIlNjYW5uZWRDb3VudCI6NH0=" } }, { "ID": "597a69e94fb51e76", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "263" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Query" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "860" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:52 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "559360798" ], "X-Amzn-Requestid": [ "P6PQKLT3PNNI0GM4IBF65FPRJ7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6NCwiSXRlbXMiOlt7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTAzLTEzVDAwOjAwOjAwWiJ9LCJTY29yZSI6eyJOIjoiNDkifSwiR2FtZSI6eyJTIjoiUHJhaXNlIEFsbCBNb25zdGVycyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiI5ODc0OGFmNy01ZjFiLTRhNjQtYmVjOS03ZmMwZjFiZjc0MjEifSwiUGxheWVyIjp7IlMiOiJwYXQifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOmZhbHNlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0xMFQwMDowMDowMFoifSwiU2NvcmUiOnsiTiI6IjYwIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZTY5NGY3NzYtMzJlNC00YzllLTk2MTYtZTQ5YmUxMjlhYmI0In0sIlBsYXllciI6eyJTIjoibWVsIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTlUMDA6MDA6MDBaIn0sIlNjb3JlIjp7Ik4iOiIzMyJ9LCJHYW1lIjp7IlMiOiJQcmFpc2UgQWxsIE1vbnN0ZXJzIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImRlYzM4NGM1LTczYzMtNDk5YS1hNmVmLTgwOTlkZGFhY2Y5MCJ9LCJQbGF5ZXIiOnsiUyI6ImZyYW4ifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOmZhbHNlfSwiVGltZSI6eyJTIjoiMjAxOS0wMi0wMVQwMDowMDowMFoifSwiU2NvcmUiOnsiTiI6IjgxIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZjQ1ZDRhY2ItZmMxNC00ZDhkLTk4Y2UtNzllNWNmNDdkMTVkIn0sIlBsYXllciI6eyJTIjoiYW5keSJ9fV0sIlNjYW5uZWRDb3VudCI6NH0=" } }, { "ID": "ce6fc8b5582c1498", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "169" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "984" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:52 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2654593510" ], "X-Amzn-Requestid": [ "FR2QI000G85K3GRLL8THKD1AUJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6OCwiSXRlbXMiOlt7IkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiODNlN2MyMzYtOGUzMC00MzFjLWI4ZjQtZTIxN2VjZjgwZDA1In0sIlBsYXllciI6eyJTIjoiYmlsbGllIn19LHsiR2FtZSI6eyJTIjoiWm9tYmllIERNViJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiIyZGQ2ZWQ0NC04MzE3LTQ5MjEtYmRiNC0wOTM0YTA4MWRjZDIifSwiUGxheWVyIjp7IlMiOiJmcmFuIn19LHsiR2FtZSI6eyJTIjoiWm9tYmllIERNViJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJkNmJlZjhmNC01ZDMxLTQ3ZWEtOGE4NC04Y2FkZDg2N2Q2ZmQifSwiUGxheWVyIjp7IlMiOiJtZWwifX0seyJHYW1lIjp7IlMiOiJab21iaWUgRE1WIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImViNzFlMmJjLWNlNDEtNGUxYi1hYjA4LTZjNTVlZjBkNTYwOCJ9LCJQbGF5ZXIiOnsiUyI6InBhdCJ9fSx7IkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZjQ1ZDRhY2ItZmMxNC00ZDhkLTk4Y2UtNzllNWNmNDdkMTVkIn0sIlBsYXllciI6eyJTIjoiYW5keSJ9fSx7IkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZGVjMzg0YzUtNzNjMy00OTlhLWE2ZWYtODA5OWRkYWFjZjkwIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9fSx7IkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZTY5NGY3NzYtMzJlNC00YzllLTk2MTYtZTQ5YmUxMjlhYmI0In0sIlBsYXllciI6eyJTIjoibWVsIn19LHsiR2FtZSI6eyJTIjoiUHJhaXNlIEFsbCBNb25zdGVycyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiI5ODc0OGFmNy01ZjFiLTRhNjQtYmVjOS03ZmMwZjFiZjc0MjEifSwiUGxheWVyIjp7IlMiOiJwYXQifX1dLCJTY2FubmVkQ291bnQiOjh9" } }, { "ID": "6f49a076201be36e", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "208" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1361" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:52 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2414249154" ], "X-Amzn-Requestid": [ "GLOGL72KS5VJSVLRCGCE9KNKCBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6OCwiSXRlbXMiOlt7IlBsYXllciI6eyJTIjoiYmlsbGllIn0sIldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJHYW1lIjp7IlMiOiJab21iaWUgRE1WIn0sIlNjb3JlIjp7Ik4iOiIxMTEifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiODNlN2MyMzYtOGUzMC00MzFjLWI4ZjQtZTIxN2VjZjgwZDA1In19LHsiUGxheWVyIjp7IlMiOiJmcmFuIn0sIldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJHYW1lIjp7IlMiOiJab21iaWUgRE1WIn0sIlNjb3JlIjp7Ik4iOiIzMyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiIyZGQ2ZWQ0NC04MzE3LTQ5MjEtYmRiNC0wOTM0YTA4MWRjZDIifX0seyJQbGF5ZXIiOnsiUyI6Im1lbCJ9LCJXaXRoR2xpdGNoIjp7IkJPT0wiOnRydWV9LCJHYW1lIjp7IlMiOiJab21iaWUgRE1WIn0sIlNjb3JlIjp7Ik4iOiIxOTAifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZDZiZWY4ZjQtNWQzMS00N2VhLThhODQtOGNhZGQ4NjdkNmZkIn19LHsiUGxheWVyIjp7IlMiOiJwYXQifSwiV2l0aEdsaXRjaCI6eyJCT09MIjp0cnVlfSwiR2FtZSI6eyJTIjoiWm9tYmllIERNViJ9LCJTY29yZSI6eyJOIjoiMTIwIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImViNzFlMmJjLWNlNDEtNGUxYi1hYjA4LTZjNTVlZjBkNTYwOCJ9fSx7IlBsYXllciI6eyJTIjoiYW5keSJ9LCJXaXRoR2xpdGNoIjp7IkJPT0wiOmZhbHNlfSwiR2FtZSI6eyJTIjoiUHJhaXNlIEFsbCBNb25zdGVycyJ9LCJTY29yZSI6eyJOIjoiODEifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZjQ1ZDRhY2ItZmMxNC00ZDhkLTk4Y2UtNzllNWNmNDdkMTVkIn19LHsiUGxheWVyIjp7IlMiOiJmcmFuIn0sIldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJHYW1lIjp7IlMiOiJQcmFpc2UgQWxsIE1vbnN0ZXJzIn0sIlNjb3JlIjp7Ik4iOiIzMyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJkZWMzODRjNS03M2MzLTQ5OWEtYTZlZi04MDk5ZGRhYWNmOTAifX0seyJQbGF5ZXIiOnsiUyI6Im1lbCJ9LCJXaXRoR2xpdGNoIjp7IkJPT0wiOmZhbHNlfSwiR2FtZSI6eyJTIjoiUHJhaXNlIEFsbCBNb25zdGVycyJ9LCJTY29yZSI6eyJOIjoiNjAifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZTY5NGY3NzYtMzJlNC00YzllLTk2MTYtZTQ5YmUxMjlhYmI0In19LHsiUGxheWVyIjp7IlMiOiJwYXQifSwiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiU2NvcmUiOnsiTiI6IjQ5In0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6Ijk4NzQ4YWY3LTVmMWItNGE2NC1iZWM5LTdmYzBmMWJmNzQyMSJ9fV0sIlNjYW5uZWRDb3VudCI6OH0=" } }, { "ID": "20c97503d256948e", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "54" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1649" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:52 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3539434770" ], "X-Amzn-Requestid": [ "PJNVLKMFJ5R1SC87P2BGB5HVGJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6OCwiSXRlbXMiOlt7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTEwVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImJpbGxpZSJ9LCJTY29yZSI6eyJOIjoiMTExIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiODNlN2MyMzYtOGUzMC00MzFjLWI4ZjQtZTIxN2VjZjgwZDA1In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMjBUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9LCJTY29yZSI6eyJOIjoiMzMifSwiR2FtZSI6eyJTIjoiWm9tYmllIERNViJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiIyZGQ2ZWQ0NC04MzE3LTQ5MjEtYmRiNC0wOTM0YTA4MWRjZDIifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOnRydWV9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTE4VDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6Im1lbCJ9LCJTY29yZSI6eyJOIjoiMTkwIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZDZiZWY4ZjQtNWQzMS00N2VhLThhODQtOGNhZGQ4NjdkNmZkIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjp0cnVlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0wMVQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJwYXQifSwiU2NvcmUiOnsiTiI6IjEyMCJ9LCJHYW1lIjp7IlMiOiJab21iaWUgRE1WIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImViNzFlMmJjLWNlNDEtNGUxYi1hYjA4LTZjNTVlZjBkNTYwOCJ9fSx7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTAyLTAxVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImFuZHkifSwiU2NvcmUiOnsiTiI6IjgxIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZjQ1ZDRhY2ItZmMxNC00ZDhkLTk4Y2UtNzllNWNmNDdkMTVkIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTlUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9LCJTY29yZSI6eyJOIjoiMzMifSwiR2FtZSI6eyJTIjoiUHJhaXNlIEFsbCBNb25zdGVycyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJkZWMzODRjNS03M2MzLTQ5OWEtYTZlZi04MDk5ZGRhYWNmOTAifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOmZhbHNlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0xMFQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJtZWwifSwiU2NvcmUiOnsiTiI6IjYwIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZTY5NGY3NzYtMzJlNC00YzllLTk2MTYtZTQ5YmUxMjlhYmI0In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTNUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoicGF0In0sIlNjb3JlIjp7Ik4iOiI0OSJ9LCJHYW1lIjp7IlMiOiJQcmFpc2UgQWxsIE1vbnN0ZXJzIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6Ijk4NzQ4YWY3LTVmMWItNGE2NC1iZWM5LTdmYzBmMWJmNzQyMSJ9fV0sIlNjYW5uZWRDb3VudCI6OH0=" } }, { "ID": "bd20f8b40a988f6c", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "54" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1649" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:52 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3539434770" ], "X-Amzn-Requestid": [ "UGV29VNR6SVRTLESGV0PUE37U7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6OCwiSXRlbXMiOlt7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTEwVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImJpbGxpZSJ9LCJTY29yZSI6eyJOIjoiMTExIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiODNlN2MyMzYtOGUzMC00MzFjLWI4ZjQtZTIxN2VjZjgwZDA1In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMjBUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9LCJTY29yZSI6eyJOIjoiMzMifSwiR2FtZSI6eyJTIjoiWm9tYmllIERNViJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiIyZGQ2ZWQ0NC04MzE3LTQ5MjEtYmRiNC0wOTM0YTA4MWRjZDIifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOnRydWV9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTE4VDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6Im1lbCJ9LCJTY29yZSI6eyJOIjoiMTkwIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZDZiZWY4ZjQtNWQzMS00N2VhLThhODQtOGNhZGQ4NjdkNmZkIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjp0cnVlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0wMVQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJwYXQifSwiU2NvcmUiOnsiTiI6IjEyMCJ9LCJHYW1lIjp7IlMiOiJab21iaWUgRE1WIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImViNzFlMmJjLWNlNDEtNGUxYi1hYjA4LTZjNTVlZjBkNTYwOCJ9fSx7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTAyLTAxVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImFuZHkifSwiU2NvcmUiOnsiTiI6IjgxIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZjQ1ZDRhY2ItZmMxNC00ZDhkLTk4Y2UtNzllNWNmNDdkMTVkIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTlUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9LCJTY29yZSI6eyJOIjoiMzMifSwiR2FtZSI6eyJTIjoiUHJhaXNlIEFsbCBNb25zdGVycyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJkZWMzODRjNS03M2MzLTQ5OWEtYTZlZi04MDk5ZGRhYWNmOTAifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOmZhbHNlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0xMFQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJtZWwifSwiU2NvcmUiOnsiTiI6IjYwIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZTY5NGY3NzYtMzJlNC00YzllLTk2MTYtZTQ5YmUxMjlhYmI0In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTNUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoicGF0In0sIlNjb3JlIjp7Ik4iOiI0OSJ9LCJHYW1lIjp7IlMiOiJQcmFpc2UgQWxsIE1vbnN0ZXJzIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6Ijk4NzQ4YWY3LTVmMWItNGE2NC1iZWM5LTdmYzBmMWJmNzQyMSJ9fV0sIlNjYW5uZWRDb3VudCI6OH0=" } }, { "ID": "90af4ae4b9f2210f", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "54" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1649" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:52 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3539434770" ], "X-Amzn-Requestid": [ "ELIK0LO336B7JA7ON33LSJV5TBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6OCwiSXRlbXMiOlt7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTEwVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImJpbGxpZSJ9LCJTY29yZSI6eyJOIjoiMTExIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiODNlN2MyMzYtOGUzMC00MzFjLWI4ZjQtZTIxN2VjZjgwZDA1In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMjBUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9LCJTY29yZSI6eyJOIjoiMzMifSwiR2FtZSI6eyJTIjoiWm9tYmllIERNViJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiIyZGQ2ZWQ0NC04MzE3LTQ5MjEtYmRiNC0wOTM0YTA4MWRjZDIifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOnRydWV9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTE4VDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6Im1lbCJ9LCJTY29yZSI6eyJOIjoiMTkwIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZDZiZWY4ZjQtNWQzMS00N2VhLThhODQtOGNhZGQ4NjdkNmZkIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjp0cnVlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0wMVQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJwYXQifSwiU2NvcmUiOnsiTiI6IjEyMCJ9LCJHYW1lIjp7IlMiOiJab21iaWUgRE1WIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImViNzFlMmJjLWNlNDEtNGUxYi1hYjA4LTZjNTVlZjBkNTYwOCJ9fSx7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTAyLTAxVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImFuZHkifSwiU2NvcmUiOnsiTiI6IjgxIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZjQ1ZDRhY2ItZmMxNC00ZDhkLTk4Y2UtNzllNWNmNDdkMTVkIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTlUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9LCJTY29yZSI6eyJOIjoiMzMifSwiR2FtZSI6eyJTIjoiUHJhaXNlIEFsbCBNb25zdGVycyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJkZWMzODRjNS03M2MzLTQ5OWEtYTZlZi04MDk5ZGRhYWNmOTAifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOmZhbHNlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0xMFQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJtZWwifSwiU2NvcmUiOnsiTiI6IjYwIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZTY5NGY3NzYtMzJlNC00YzllLTk2MTYtZTQ5YmUxMjlhYmI0In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTNUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoicGF0In0sIlNjb3JlIjp7Ik4iOiI0OSJ9LCJHYW1lIjp7IlMiOiJQcmFpc2UgQWxsIE1vbnN0ZXJzIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6Ijk4NzQ4YWY3LTVmMWItNGE2NC1iZWM5LTdmYzBmMWJmNzQyMSJ9fV0sIlNjYW5uZWRDb3VudCI6OH0=" } }, { "ID": "cea54f0118c49e66", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "54" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1649" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:52 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3539434770" ], "X-Amzn-Requestid": [ "J7M8BM83S3O3F4N01G71LFQ4JNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6OCwiSXRlbXMiOlt7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTEwVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImJpbGxpZSJ9LCJTY29yZSI6eyJOIjoiMTExIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiODNlN2MyMzYtOGUzMC00MzFjLWI4ZjQtZTIxN2VjZjgwZDA1In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMjBUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9LCJTY29yZSI6eyJOIjoiMzMifSwiR2FtZSI6eyJTIjoiWm9tYmllIERNViJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiIyZGQ2ZWQ0NC04MzE3LTQ5MjEtYmRiNC0wOTM0YTA4MWRjZDIifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOnRydWV9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTE4VDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6Im1lbCJ9LCJTY29yZSI6eyJOIjoiMTkwIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZDZiZWY4ZjQtNWQzMS00N2VhLThhODQtOGNhZGQ4NjdkNmZkIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjp0cnVlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0wMVQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJwYXQifSwiU2NvcmUiOnsiTiI6IjEyMCJ9LCJHYW1lIjp7IlMiOiJab21iaWUgRE1WIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImViNzFlMmJjLWNlNDEtNGUxYi1hYjA4LTZjNTVlZjBkNTYwOCJ9fSx7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTAyLTAxVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImFuZHkifSwiU2NvcmUiOnsiTiI6IjgxIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZjQ1ZDRhY2ItZmMxNC00ZDhkLTk4Y2UtNzllNWNmNDdkMTVkIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTlUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9LCJTY29yZSI6eyJOIjoiMzMifSwiR2FtZSI6eyJTIjoiUHJhaXNlIEFsbCBNb25zdGVycyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJkZWMzODRjNS03M2MzLTQ5OWEtYTZlZi04MDk5ZGRhYWNmOTAifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOmZhbHNlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0xMFQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJtZWwifSwiU2NvcmUiOnsiTiI6IjYwIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZTY5NGY3NzYtMzJlNC00YzllLTk2MTYtZTQ5YmUxMjlhYmI0In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTNUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoicGF0In0sIlNjb3JlIjp7Ik4iOiI0OSJ9LCJHYW1lIjp7IlMiOiJQcmFpc2UgQWxsIE1vbnN0ZXJzIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6Ijk4NzQ4YWY3LTVmMWItNGE2NC1iZWM5LTdmYzBmMWJmNzQyMSJ9fV0sIlNjYW5uZWRDb3VudCI6OH0=" } }, { "ID": "46884b3028233115", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "54" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1649" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:52 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3539434770" ], "X-Amzn-Requestid": [ "QH7R1RCH92B5AU2S6P8N6OKJ03VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6OCwiSXRlbXMiOlt7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTEwVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImJpbGxpZSJ9LCJTY29yZSI6eyJOIjoiMTExIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiODNlN2MyMzYtOGUzMC00MzFjLWI4ZjQtZTIxN2VjZjgwZDA1In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMjBUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9LCJTY29yZSI6eyJOIjoiMzMifSwiR2FtZSI6eyJTIjoiWm9tYmllIERNViJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiIyZGQ2ZWQ0NC04MzE3LTQ5MjEtYmRiNC0wOTM0YTA4MWRjZDIifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOnRydWV9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTE4VDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6Im1lbCJ9LCJTY29yZSI6eyJOIjoiMTkwIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZDZiZWY4ZjQtNWQzMS00N2VhLThhODQtOGNhZGQ4NjdkNmZkIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjp0cnVlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0wMVQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJwYXQifSwiU2NvcmUiOnsiTiI6IjEyMCJ9LCJHYW1lIjp7IlMiOiJab21iaWUgRE1WIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImViNzFlMmJjLWNlNDEtNGUxYi1hYjA4LTZjNTVlZjBkNTYwOCJ9fSx7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTAyLTAxVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImFuZHkifSwiU2NvcmUiOnsiTiI6IjgxIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZjQ1ZDRhY2ItZmMxNC00ZDhkLTk4Y2UtNzllNWNmNDdkMTVkIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTlUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9LCJTY29yZSI6eyJOIjoiMzMifSwiR2FtZSI6eyJTIjoiUHJhaXNlIEFsbCBNb25zdGVycyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJkZWMzODRjNS03M2MzLTQ5OWEtYTZlZi04MDk5ZGRhYWNmOTAifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOmZhbHNlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0xMFQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJtZWwifSwiU2NvcmUiOnsiTiI6IjYwIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZTY5NGY3NzYtMzJlNC00YzllLTk2MTYtZTQ5YmUxMjlhYmI0In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTNUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoicGF0In0sIlNjb3JlIjp7Ik4iOiI0OSJ9LCJHYW1lIjp7IlMiOiJQcmFpc2UgQWxsIE1vbnN0ZXJzIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6Ijk4NzQ4YWY3LTVmMWItNGE2NC1iZWM5LTdmYzBmMWJmNzQyMSJ9fV0sIlNjYW5uZWRDb3VudCI6OH0=" } }, { "ID": "43a93f9d309bdde8", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "54" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1649" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:52 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3539434770" ], "X-Amzn-Requestid": [ "D4QS4TI3CVN7KJBHD16PDTQTKFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6OCwiSXRlbXMiOlt7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTEwVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImJpbGxpZSJ9LCJTY29yZSI6eyJOIjoiMTExIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiODNlN2MyMzYtOGUzMC00MzFjLWI4ZjQtZTIxN2VjZjgwZDA1In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMjBUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9LCJTY29yZSI6eyJOIjoiMzMifSwiR2FtZSI6eyJTIjoiWm9tYmllIERNViJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiIyZGQ2ZWQ0NC04MzE3LTQ5MjEtYmRiNC0wOTM0YTA4MWRjZDIifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOnRydWV9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTE4VDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6Im1lbCJ9LCJTY29yZSI6eyJOIjoiMTkwIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZDZiZWY4ZjQtNWQzMS00N2VhLThhODQtOGNhZGQ4NjdkNmZkIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjp0cnVlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0wMVQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJwYXQifSwiU2NvcmUiOnsiTiI6IjEyMCJ9LCJHYW1lIjp7IlMiOiJab21iaWUgRE1WIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImViNzFlMmJjLWNlNDEtNGUxYi1hYjA4LTZjNTVlZjBkNTYwOCJ9fSx7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTAyLTAxVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImFuZHkifSwiU2NvcmUiOnsiTiI6IjgxIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZjQ1ZDRhY2ItZmMxNC00ZDhkLTk4Y2UtNzllNWNmNDdkMTVkIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTlUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9LCJTY29yZSI6eyJOIjoiMzMifSwiR2FtZSI6eyJTIjoiUHJhaXNlIEFsbCBNb25zdGVycyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJkZWMzODRjNS03M2MzLTQ5OWEtYTZlZi04MDk5ZGRhYWNmOTAifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOmZhbHNlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0xMFQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJtZWwifSwiU2NvcmUiOnsiTiI6IjYwIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZTY5NGY3NzYtMzJlNC00YzllLTk2MTYtZTQ5YmUxMjlhYmI0In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTNUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoicGF0In0sIlNjb3JlIjp7Ik4iOiI0OSJ9LCJHYW1lIjp7IlMiOiJQcmFpc2UgQWxsIE1vbnN0ZXJzIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6Ijk4NzQ4YWY3LTVmMWItNGE2NC1iZWM5LTdmYzBmMWJmNzQyMSJ9fV0sIlNjYW5uZWRDb3VudCI6OH0=" } }, { "ID": "b91f820a8c034688", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "54" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1649" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:52 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3539434770" ], "X-Amzn-Requestid": [ "U2VQUJ9RL9FS5V1FI5QR9PV6ENVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6OCwiSXRlbXMiOlt7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTEwVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImJpbGxpZSJ9LCJTY29yZSI6eyJOIjoiMTExIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiODNlN2MyMzYtOGUzMC00MzFjLWI4ZjQtZTIxN2VjZjgwZDA1In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMjBUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9LCJTY29yZSI6eyJOIjoiMzMifSwiR2FtZSI6eyJTIjoiWm9tYmllIERNViJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiIyZGQ2ZWQ0NC04MzE3LTQ5MjEtYmRiNC0wOTM0YTA4MWRjZDIifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOnRydWV9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTE4VDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6Im1lbCJ9LCJTY29yZSI6eyJOIjoiMTkwIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZDZiZWY4ZjQtNWQzMS00N2VhLThhODQtOGNhZGQ4NjdkNmZkIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjp0cnVlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0wMVQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJwYXQifSwiU2NvcmUiOnsiTiI6IjEyMCJ9LCJHYW1lIjp7IlMiOiJab21iaWUgRE1WIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImViNzFlMmJjLWNlNDEtNGUxYi1hYjA4LTZjNTVlZjBkNTYwOCJ9fSx7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTAyLTAxVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImFuZHkifSwiU2NvcmUiOnsiTiI6IjgxIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZjQ1ZDRhY2ItZmMxNC00ZDhkLTk4Y2UtNzllNWNmNDdkMTVkIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTlUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9LCJTY29yZSI6eyJOIjoiMzMifSwiR2FtZSI6eyJTIjoiUHJhaXNlIEFsbCBNb25zdGVycyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJkZWMzODRjNS03M2MzLTQ5OWEtYTZlZi04MDk5ZGRhYWNmOTAifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOmZhbHNlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0xMFQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJtZWwifSwiU2NvcmUiOnsiTiI6IjYwIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZTY5NGY3NzYtMzJlNC00YzllLTk2MTYtZTQ5YmUxMjlhYmI0In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTNUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoicGF0In0sIlNjb3JlIjp7Ik4iOiI0OSJ9LCJHYW1lIjp7IlMiOiJQcmFpc2UgQWxsIE1vbnN0ZXJzIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6Ijk4NzQ4YWY3LTVmMWItNGE2NC1iZWM5LTdmYzBmMWJmNzQyMSJ9fV0sIlNjYW5uZWRDb3VudCI6OH0=" } }, { "ID": "6cb9a46aa22a6ae1", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "54" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1649" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:52 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3539434770" ], "X-Amzn-Requestid": [ "E6DLMCFB9RQCQ1UESJHQSAM55RVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6OCwiSXRlbXMiOlt7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTEwVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImJpbGxpZSJ9LCJTY29yZSI6eyJOIjoiMTExIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiODNlN2MyMzYtOGUzMC00MzFjLWI4ZjQtZTIxN2VjZjgwZDA1In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMjBUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9LCJTY29yZSI6eyJOIjoiMzMifSwiR2FtZSI6eyJTIjoiWm9tYmllIERNViJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiIyZGQ2ZWQ0NC04MzE3LTQ5MjEtYmRiNC0wOTM0YTA4MWRjZDIifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOnRydWV9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTE4VDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6Im1lbCJ9LCJTY29yZSI6eyJOIjoiMTkwIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZDZiZWY4ZjQtNWQzMS00N2VhLThhODQtOGNhZGQ4NjdkNmZkIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjp0cnVlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0wMVQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJwYXQifSwiU2NvcmUiOnsiTiI6IjEyMCJ9LCJHYW1lIjp7IlMiOiJab21iaWUgRE1WIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImViNzFlMmJjLWNlNDEtNGUxYi1hYjA4LTZjNTVlZjBkNTYwOCJ9fSx7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTAyLTAxVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImFuZHkifSwiU2NvcmUiOnsiTiI6IjgxIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZjQ1ZDRhY2ItZmMxNC00ZDhkLTk4Y2UtNzllNWNmNDdkMTVkIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTlUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9LCJTY29yZSI6eyJOIjoiMzMifSwiR2FtZSI6eyJTIjoiUHJhaXNlIEFsbCBNb25zdGVycyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJkZWMzODRjNS03M2MzLTQ5OWEtYTZlZi04MDk5ZGRhYWNmOTAifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOmZhbHNlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0xMFQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJtZWwifSwiU2NvcmUiOnsiTiI6IjYwIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZTY5NGY3NzYtMzJlNC00YzllLTk2MTYtZTQ5YmUxMjlhYmI0In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTNUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoicGF0In0sIlNjb3JlIjp7Ik4iOiI0OSJ9LCJHYW1lIjp7IlMiOiJQcmFpc2UgQWxsIE1vbnN0ZXJzIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6Ijk4NzQ4YWY3LTVmMWItNGE2NC1iZWM5LTdmYzBmMWJmNzQyMSJ9fV0sIlNjYW5uZWRDb3VudCI6OH0=" } }, { "ID": "260e0a4e115f77af", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "54" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1649" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:52 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3539434770" ], "X-Amzn-Requestid": [ "MU3OTKN5S4502JCAH21QAKJTORVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6OCwiSXRlbXMiOlt7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTEwVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImJpbGxpZSJ9LCJTY29yZSI6eyJOIjoiMTExIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiODNlN2MyMzYtOGUzMC00MzFjLWI4ZjQtZTIxN2VjZjgwZDA1In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMjBUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9LCJTY29yZSI6eyJOIjoiMzMifSwiR2FtZSI6eyJTIjoiWm9tYmllIERNViJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiIyZGQ2ZWQ0NC04MzE3LTQ5MjEtYmRiNC0wOTM0YTA4MWRjZDIifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOnRydWV9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTE4VDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6Im1lbCJ9LCJTY29yZSI6eyJOIjoiMTkwIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZDZiZWY4ZjQtNWQzMS00N2VhLThhODQtOGNhZGQ4NjdkNmZkIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjp0cnVlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0wMVQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJwYXQifSwiU2NvcmUiOnsiTiI6IjEyMCJ9LCJHYW1lIjp7IlMiOiJab21iaWUgRE1WIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImViNzFlMmJjLWNlNDEtNGUxYi1hYjA4LTZjNTVlZjBkNTYwOCJ9fSx7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTAyLTAxVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImFuZHkifSwiU2NvcmUiOnsiTiI6IjgxIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZjQ1ZDRhY2ItZmMxNC00ZDhkLTk4Y2UtNzllNWNmNDdkMTVkIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTlUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9LCJTY29yZSI6eyJOIjoiMzMifSwiR2FtZSI6eyJTIjoiUHJhaXNlIEFsbCBNb25zdGVycyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJkZWMzODRjNS03M2MzLTQ5OWEtYTZlZi04MDk5ZGRhYWNmOTAifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOmZhbHNlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0xMFQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJtZWwifSwiU2NvcmUiOnsiTiI6IjYwIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZTY5NGY3NzYtMzJlNC00YzllLTk2MTYtZTQ5YmUxMjlhYmI0In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTNUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoicGF0In0sIlNjb3JlIjp7Ik4iOiI0OSJ9LCJHYW1lIjp7IlMiOiJQcmFpc2UgQWxsIE1vbnN0ZXJzIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6Ijk4NzQ4YWY3LTVmMWItNGE2NC1iZWM5LTdmYzBmMWJmNzQyMSJ9fV0sIlNjYW5uZWRDb3VudCI6OH0=" } }, { "ID": "79cc8f543adad74e", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "54" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1649" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:53 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3539434770" ], "X-Amzn-Requestid": [ "7B683E4AR03N0055BQ2PR9VR6NVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6OCwiSXRlbXMiOlt7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTEwVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImJpbGxpZSJ9LCJTY29yZSI6eyJOIjoiMTExIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiODNlN2MyMzYtOGUzMC00MzFjLWI4ZjQtZTIxN2VjZjgwZDA1In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMjBUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9LCJTY29yZSI6eyJOIjoiMzMifSwiR2FtZSI6eyJTIjoiWm9tYmllIERNViJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiIyZGQ2ZWQ0NC04MzE3LTQ5MjEtYmRiNC0wOTM0YTA4MWRjZDIifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOnRydWV9LCJUaW1lIjp7IlMiOiIyMDE5LTA0LTE4VDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6Im1lbCJ9LCJTY29yZSI6eyJOIjoiMTkwIn0sIkdhbWUiOnsiUyI6IlpvbWJpZSBETVYifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZDZiZWY4ZjQtNWQzMS00N2VhLThhODQtOGNhZGQ4NjdkNmZkIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjp0cnVlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0wMVQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJwYXQifSwiU2NvcmUiOnsiTiI6IjEyMCJ9LCJHYW1lIjp7IlMiOiJab21iaWUgRE1WIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImViNzFlMmJjLWNlNDEtNGUxYi1hYjA4LTZjNTVlZjBkNTYwOCJ9fSx7IldpdGhHbGl0Y2giOnsiQk9PTCI6ZmFsc2V9LCJUaW1lIjp7IlMiOiIyMDE5LTAyLTAxVDAwOjAwOjAwWiJ9LCJQbGF5ZXIiOnsiUyI6ImFuZHkifSwiU2NvcmUiOnsiTiI6IjgxIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZjQ1ZDRhY2ItZmMxNC00ZDhkLTk4Y2UtNzllNWNmNDdkMTVkIn19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTlUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoiZnJhbiJ9LCJTY29yZSI6eyJOIjoiMzMifSwiR2FtZSI6eyJTIjoiUHJhaXNlIEFsbCBNb25zdGVycyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJkZWMzODRjNS03M2MzLTQ5OWEtYTZlZi04MDk5ZGRhYWNmOTAifX0seyJXaXRoR2xpdGNoIjp7IkJPT0wiOmZhbHNlfSwiVGltZSI6eyJTIjoiMjAxOS0wNC0xMFQwMDowMDowMFoifSwiUGxheWVyIjp7IlMiOiJtZWwifSwiU2NvcmUiOnsiTiI6IjYwIn0sIkdhbWUiOnsiUyI6IlByYWlzZSBBbGwgTW9uc3RlcnMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZTY5NGY3NzYtMzJlNC00YzllLTk2MTYtZTQ5YmUxMjlhYmI0In19LHsiV2l0aEdsaXRjaCI6eyJCT09MIjpmYWxzZX0sIlRpbWUiOnsiUyI6IjIwMTktMDMtMTNUMDA6MDA6MDBaIn0sIlBsYXllciI6eyJTIjoicGF0In0sIlNjb3JlIjp7Ik4iOiI0OSJ9LCJHYW1lIjp7IlMiOiJQcmFpc2UgQWxsIE1vbnN0ZXJzIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6Ijk4NzQ4YWY3LTVmMWItNGE2NC1iZWM5LTdmYzBmMWJmNzQyMSJ9fV0sIlNjYW5uZWRDb3VudCI6OH0=" } } ] } ================================================ FILE: docstore/awsdynamodb/v2/testdata/TestConformance/GetQueryKeyField.replay ================================================ { "Initial": "AQAAAA7hTg5aNIWsTwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*", ".*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "5ab4137211134bf5", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DescribeTable" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "599" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:47 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3022004566" ], "X-Amzn-Requestid": [ "V8KKCL8JQNKM61OQFROH8T2USBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJUYWJsZSI6eyJBdHRyaWJ1dGVEZWZpbml0aW9ucyI6W3siQXR0cmlidXRlTmFtZSI6Im5hbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9XSwiQ3JlYXRpb25EYXRlVGltZSI6MS43MjMwNzYwNzk3OTdFOSwiRGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZCI6ZmFsc2UsIkl0ZW1Db3VudCI6MCwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoibmFtZSIsIktleVR5cGUiOiJIQVNIIn1dLCJQcm92aXNpb25lZFRocm91Z2hwdXQiOnsiTnVtYmVyT2ZEZWNyZWFzZXNUb2RheSI6MCwiUmVhZENhcGFjaXR5VW5pdHMiOjUsIldyaXRlQ2FwYWNpdHlVbml0cyI6NX0sIlRhYmxlQXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMSIsIlRhYmxlSWQiOiI5N2U0OTNmNC1jZjU3LTQ2YmItOTc4Ny1iOGU4ZDk3ZjUwMDciLCJUYWJsZU5hbWUiOiJkb2NzdG9yZS10ZXN0LTEiLCJUYWJsZVNpemVCeXRlcyI6MCwiVGFibGVTdGF0dXMiOiJBQ1RJVkUiLCJXYXJtVGhyb3VnaHB1dCI6eyJSZWFkVW5pdHNQZXJTZWNvbmQiOjUsIlN0YXR1cyI6IkFDVElWRSIsIldyaXRlVW5pdHNQZXJTZWNvbmQiOjV9fX0=" } }, { "ID": "ea4f9505de5dae3c", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "699" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:47 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "148649085" ], "X-Amzn-Requestid": [ "IQHVIN5PKJRTMV0J6TC4HBB39RVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6NiwiSXRlbXMiOlt7Im5hbWUiOnsiUyI6InRlc3RVbm9yZGVyZWRBY3Rpb25zMyJ9LCJFdGFnIjp7IlMiOiI3ODc2OThmMC0xMTA2LTQwYzUtODkyMS1iZDJkMGMyNTQzY2YifSwicyI6eyJTIjoiMyJ9fSx7IkV0YWciOnsiUyI6ImM2YTAwMTIxLTFhNGEtNGU5NC05MTFhLWU5OTYwZDQ2MGRkZiJ9LCJzIjp7IlMiOiI4In0sIm4iOnsiTiI6Ii0xIn0sIm5hbWUiOnsiUyI6InRlc3RVbm9yZGVyZWRBY3Rpb25zOCJ9fSx7Im5hbWUiOnsiUyI6InRlc3RVbm9yZGVyZWRBY3Rpb25zNCJ9LCJFdGFnIjp7IlMiOiI1OTgyOTkzMC1lODBlLTRjNjEtOWIzNy0zYmM1NDcyYjMwMDQifSwicyI6eyJTIjoiNCJ9fSx7IkV0YWciOnsiUyI6ImU1NzczYWM0LWIxNzMtNDk0NS05YTQ0LTczYmZiNjAxYmQxOCJ9LCJuYW1lIjp7IlMiOiJ0ZXN0VW5vcmRlcmVkQWN0aW9uczcifSwicyI6eyJTIjoiNycifX0seyJFdGFnIjp7IlMiOiI4ZWYxMWUwMy1iNzgyLTQzM2QtOTYwYi0xYzc2MzgzZDVjYWEifSwicyI6eyJTIjoiNicifSwibiI6eyJOIjoiMSJ9LCJuYW1lIjp7IlMiOiJ0ZXN0VW5vcmRlcmVkQWN0aW9uczYifX0seyJFdGFnIjp7IlMiOiI5NzZjNDA0Ny1kZjg5LTQzNDYtYmI5MC1iYjA1YTk0NzA4MWUifSwibmFtZSI6eyJTIjoidGVzdFVub3JkZXJlZEFjdGlvbnM1In0sInMiOnsiUyI6IjUifX1dLCJTY2FubmVkQ291bnQiOjZ9" } }, { "ID": "80cdfdc49d015771", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "76" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:47 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "U0P4B5BPON9ROTGJHEKPTJII67VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "3da44ef8dd617527", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "76" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:47 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "Q27AG2DJBHDHB0SS06ABFB1M5BVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "215120a4b12b9a11", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "76" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:47 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "6TC0CJNE4511PU1163R8A39TL3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "77aae39ba8209c03", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "76" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:47 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "I3FCKKO1RT96Q89IGV75E07DJVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "8f8dc14c20125edc", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "76" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:47 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "DQHCC55Q32B0POK6SFE12PTKR3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "8f58f4e74547f2c4", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "76" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:47 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "0H3MEE0R4AD5P6PG7P6SDNQNDRVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "c539ffbcf0dc742b", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "140" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:47 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "DFMNFCHUSODVU57A85Q8ORTNVVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "a695fe6821000136", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "142" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:47 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "1G53IN00U2HOPU5CGDBD36CBL3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "7c519d2763ad2f03", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "140" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:47 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "5IS5KCNJPN39CI1SNTHNQMM6CVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "05a644bdf7860077", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "171" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "242" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:47 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "714858241" ], "X-Amzn-Requestid": [ "C6L8IUF16IBBJI1H102BLL13TBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MiwiSXRlbXMiOlt7ImEiOnsiUyI6Im9uZSJ9LCJuYW1lIjp7IlMiOiJxa2YxIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6IjA2MTM3MmQyLTc2MWEtNDQ2ZS05NzM3LWVhMTE0MTYwZTFiMCJ9fSx7ImEiOnsiUyI6InR3byJ9LCJuYW1lIjp7IlMiOiJxa2YyIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImYyMzA1ZTA5LTQ3YmYtNGIyOC1iNWU5LTMzYjVmNGUzZjBhOSJ9fV0sIlNjYW5uZWRDb3VudCI6M30=" } }, { "ID": "289d065ed614ec7b", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "163" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "346" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:47 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "66401451" ], "X-Amzn-Requestid": [ "L99A8JEK11POBF3T8BC7J9587JVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MywiSXRlbXMiOlt7ImEiOnsiUyI6Im9uZSJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiIwNjEzNzJkMi03NjFhLTQ0NmUtOTczNy1lYTExNDE2MGUxYjAifSwibmFtZSI6eyJTIjoicWtmMSJ9fSx7ImEiOnsiUyI6InRocmVlIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImNjMzI0ZjQ1LWM0OGQtNDdjMy1iNWEyLTk2NjhlMjBlNzYxNSJ9LCJuYW1lIjp7IlMiOiJxa2YzIn19LHsiYSI6eyJTIjoidHdvIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImYyMzA1ZTA5LTQ3YmYtNGIyOC1iNWU5LTMzYjVmNGUzZjBhOSJ9LCJuYW1lIjp7IlMiOiJxa2YyIn19XSwiU2Nhbm5lZENvdW50IjozfQ==" } }, { "ID": "588bd5f4385c1346", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DescribeTable" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "599" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:47 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3022004566" ], "X-Amzn-Requestid": [ "MM7G32RGII52R0PBBFMIOBU06VVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJUYWJsZSI6eyJBdHRyaWJ1dGVEZWZpbml0aW9ucyI6W3siQXR0cmlidXRlTmFtZSI6Im5hbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9XSwiQ3JlYXRpb25EYXRlVGltZSI6MS43MjMwNzYwNzk3OTdFOSwiRGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZCI6ZmFsc2UsIkl0ZW1Db3VudCI6MCwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoibmFtZSIsIktleVR5cGUiOiJIQVNIIn1dLCJQcm92aXNpb25lZFRocm91Z2hwdXQiOnsiTnVtYmVyT2ZEZWNyZWFzZXNUb2RheSI6MCwiUmVhZENhcGFjaXR5VW5pdHMiOjUsIldyaXRlQ2FwYWNpdHlVbml0cyI6NX0sIlRhYmxlQXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMSIsIlRhYmxlSWQiOiI5N2U0OTNmNC1jZjU3LTQ2YmItOTc4Ny1iOGU4ZDk3ZjUwMDciLCJUYWJsZU5hbWUiOiJkb2NzdG9yZS10ZXN0LTEiLCJUYWJsZVNpemVCeXRlcyI6MCwiVGFibGVTdGF0dXMiOiJBQ1RJVkUiLCJXYXJtVGhyb3VnaHB1dCI6eyJSZWFkVW5pdHNQZXJTZWNvbmQiOjUsIlN0YXR1cyI6IkFDVElWRSIsIldyaXRlVW5pdHNQZXJTZWNvbmQiOjV9fX0=" } }, { "ID": "774c6305374f82cc", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "346" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:47 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2665486194" ], "X-Amzn-Requestid": [ "684N7KO28QKCA36R8J2EG3BPTRVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MywiSXRlbXMiOlt7ImEiOnsiUyI6Im9uZSJ9LCJuYW1lIjp7IlMiOiJxa2YxIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6IjA2MTM3MmQyLTc2MWEtNDQ2ZS05NzM3LWVhMTE0MTYwZTFiMCJ9fSx7ImEiOnsiUyI6InRocmVlIn0sIm5hbWUiOnsiUyI6InFrZjMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiY2MzMjRmNDUtYzQ4ZC00N2MzLWI1YTItOTY2OGUyMGU3NjE1In19LHsiYSI6eyJTIjoidHdvIn0sIm5hbWUiOnsiUyI6InFrZjIifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZjIzMDVlMDktNDdiZi00YjI4LWI1ZTktMzNiNWY0ZTNmMGE5In19XSwiU2Nhbm5lZENvdW50IjozfQ==" } }, { "ID": "acfff54c76695b10", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "59" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:47 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "2JP1SB92MBCKR35KGGE606NV1JVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "a132ed2850f92af5", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "59" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:47 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "H7FH76FLLT1B3EELFLTFQ8U63JVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "9a9802db2d193b5f", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "59" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:47 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "0SFQNMM8J3UC9PT24Q6EB4QH5JVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "ba95855d369f69a3", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "130" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:48 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "C13CT4UP2E43QRUUE6IPN8JRJ3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "6301bc24b18626f7", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "128" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:47 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "PV475TCV5BFIBU9PUKCGCH6O3VVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "6424f819a1cf416b", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "128" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:48 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "6400CDVRM4NE92D6QJ2HG48A7FVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "dfb912942e82e745", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "171" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "218" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:48 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2971846369" ], "X-Amzn-Requestid": [ "RQP4M8RIOTJ3HFP8JP9DVAJT3NVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MiwiSXRlbXMiOlt7ImEiOnsiUyI6Im9uZSJ9LCJuYW1lIjp7IlMiOiJxa2YxIn0sIkV0YWciOnsiUyI6ImNjMGM2MzhiLTI0ZDAtNDQ5Zi05OGY1LTIyYzkzMzFhMjE1ZiJ9fSx7ImEiOnsiUyI6InR3byJ9LCJuYW1lIjp7IlMiOiJxa2YyIn0sIkV0YWciOnsiUyI6IjQ2MDY2M2NjLWY2ZGYtNGM3Ny04MTViLWI2MzNlNzEzNDE1OCJ9fV0sIlNjYW5uZWRDb3VudCI6M30=" } }, { "ID": "27b6a8d707b25d51", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "151" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "310" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:48 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "218945175" ], "X-Amzn-Requestid": [ "N35AN2PHBVNVP4IL76D7I4LE9JVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MywiSXRlbXMiOlt7ImEiOnsiUyI6Im9uZSJ9LCJFdGFnIjp7IlMiOiJjYzBjNjM4Yi0yNGQwLTQ0OWYtOThmNS0yMmM5MzMxYTIxNWYifSwibmFtZSI6eyJTIjoicWtmMSJ9fSx7ImEiOnsiUyI6InRocmVlIn0sIkV0YWciOnsiUyI6IjUzZWIzMmIyLWYwMDktNGFmMy1iYzQ2LWQwYTdmZjY3NDdlYyJ9LCJuYW1lIjp7IlMiOiJxa2YzIn19LHsiYSI6eyJTIjoidHdvIn0sIkV0YWciOnsiUyI6IjQ2MDY2M2NjLWY2ZGYtNGM3Ny04MTViLWI2MzNlNzEzNDE1OCJ9LCJuYW1lIjp7IlMiOiJxa2YyIn19XSwiU2Nhbm5lZENvdW50IjozfQ==" } } ] } ================================================ FILE: docstore/awsdynamodb/v2/testdata/TestConformance/MultipleActions.replay ================================================ { "Initial": "AQAAAA7hTg5YIHECJwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*", ".*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "74bbe0f0d441112b", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DescribeTable" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "599" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:44 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3022004566" ], "X-Amzn-Requestid": [ "I3QJ8G9B3RMBD65LTEOGJI9IGVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJUYWJsZSI6eyJBdHRyaWJ1dGVEZWZpbml0aW9ucyI6W3siQXR0cmlidXRlTmFtZSI6Im5hbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9XSwiQ3JlYXRpb25EYXRlVGltZSI6MS43MjMwNzYwNzk3OTdFOSwiRGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZCI6ZmFsc2UsIkl0ZW1Db3VudCI6MCwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoibmFtZSIsIktleVR5cGUiOiJIQVNIIn1dLCJQcm92aXNpb25lZFRocm91Z2hwdXQiOnsiTnVtYmVyT2ZEZWNyZWFzZXNUb2RheSI6MCwiUmVhZENhcGFjaXR5VW5pdHMiOjUsIldyaXRlQ2FwYWNpdHlVbml0cyI6NX0sIlRhYmxlQXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMSIsIlRhYmxlSWQiOiI5N2U0OTNmNC1jZjU3LTQ2YmItOTc4Ny1iOGU4ZDk3ZjUwMDciLCJUYWJsZU5hbWUiOiJkb2NzdG9yZS10ZXN0LTEiLCJUYWJsZVNpemVCeXRlcyI6MCwiVGFibGVTdGF0dXMiOiJBQ1RJVkUiLCJXYXJtVGhyb3VnaHB1dCI6eyJSZWFkVW5pdHNQZXJTZWNvbmQiOjUsIlN0YXR1cyI6IkFDVElWRSIsIldyaXRlVW5pdHNQZXJTZWNvbmQiOjV9fX0=" } }, { "ID": "7cb2cc3af38754a8", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "174" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:44 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "4219194470" ], "X-Amzn-Requestid": [ "U77SF9CDJ5R2JIHBLTUT2I8I8NVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MSwiSXRlbXMiOlt7IlB0clRvUHJvdG8iOnsiQiI6IkNDcz0ifSwibmFtZSI6eyJTIjoidGVzdGluZyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiI5N2E0NDZmZi0yZWE3LTQ1ZTUtYjJjMi0wMjVkYWMzOTUyYjIifSwiUHJvdG8iOnsiQiI6IkNDbz0ifX1dLCJTY2FubmVkQ291bnQiOjF9" } }, { "ID": "9da1c5e82b5b8379", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "227" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:44 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "AHDSGIHGPJ8O7KKJ1LEHJ3S0E7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "9eafac0c26f093e5", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "246" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:44 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "QLBBI88QC27AO8QE13T9IK3GDNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "c56b0bbbc600d55a", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "246" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:44 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "0ACLFQODL7N7CE5N3H6O4NR1RFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "fb337fb3943f888c", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "246" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:45 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "1OKB843QD7C8IOFAJC11GK8RGJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "b9b85353f3ace821", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "246" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:45 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "H9TC5O4CBB9REBN5PAMD5ITSKNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "f7eb06052edd85c4", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "246" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:45 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "TKO7GOIVD44K7UC5M6215LHBP3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "0b5a15a376222ef5", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "246" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:44 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "HC9F6LT2CL380PKLSAFQA9S73NVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "4bf29a5dfe4ccfb0", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "155" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:45 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "5KISMABRNEEISECLDD1OHSJGKJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "0d69953620df3486", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "320" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:45 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "6H2HPM8PIN7B849C77PN6R6GIVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "95ebc9e3c4ba6288", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "320" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:45 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "5TG9N01K3KM8DTUND2OQVCUV7FVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "57d9811535daa587", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "320" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:45 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "A23HM9TPA7FV1DOA2LOKB66BMVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "0737818cd8943c7c", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "321" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:45 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "CQBMCOVGCGST5LTSKCAMBV5OD7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "4efebcd9a282f7e8", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "321" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:45 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "EB8E96170BPNQ67OVOB9Q5DVJRVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "cd8da3dc5cbc9c2b", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "155" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:45 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "DRH6739965CH8QC68C7FQ16I1VVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "b3d0c940dfe998e4", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "155" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:45 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "OHFMB2OUP80UGQV8LDE8S2QTAJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "6ed74f1244042597", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "321" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:45 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "4DJF977B63UJ67UQF3BHOJIPPJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "7acc3ac989840b34", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "362" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.UpdateItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:45 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "U5KGLH74MA9AOUHUR6RRG8JIUJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "bbd0a69b07d0bc3d", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "186" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "407" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:45 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3654482066" ], "X-Amzn-Requestid": [ "V8UCRAGBQ07OGONOHE0FQ21J77VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0VW5vcmRlcmVkQWN0aW9uczMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiMDEyODIyYmUtY2E4Ny00ZTJmLThiZmEtOTVlNzRmZjU5OGE3In0sInMiOnsiUyI6IjMifX0seyJuYW1lIjp7IlMiOiJ0ZXN0VW5vcmRlcmVkQWN0aW9uczUifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiODdlMmFkNTctYmNmYS00ZDQxLWJlNjEtNWIwMjVjMDJiM2IxIn0sInMiOnsiUyI6IjUifX0seyJuYW1lIjp7IlMiOiJ0ZXN0VW5vcmRlcmVkQWN0aW9uczQifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiNzVjMDhiZjYtY2U4Ny00N2ZmLWE5NjItZTdiMjY5YjU0MTcwIn0sInMiOnsiUyI6IjQifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "92ab9f349467d4d2", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "360" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.UpdateItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:45 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "R6V8E3K9ADKDRUDA6PKMK0OVERVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "83026d6dfde67d28", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "241" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:45 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "T5Q97DTR62C4PS1K0P102BA9ANVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "32aae811138f1a69", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "241" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:45 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "L3OCC5O1715943DKIBJIBE7R4NVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "fe7b824af3e7bf05", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "241" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:45 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "8IT670RTKIKGDHPN6RGRRHM5AJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "dff0966738651a95", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "395" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.UpdateItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:45 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "UHSC0K7JIH5Q3G1VU6638CUCUBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "f07bb9b313a9a202", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "108" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "57" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:45 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "289144682" ], "X-Amzn-Requestid": [ "3C018QK0C46NA0O8VGK579VODFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbXX0sIlVucHJvY2Vzc2VkS2V5cyI6e319" } }, { "ID": "34ba5aa95994bcce", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "186" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "173" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:45 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3418236683" ], "X-Amzn-Requestid": [ "9Q27TMCJ14MB0AKKVIS9RHO60BVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0VW5vcmRlcmVkQWN0aW9uczMifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiMDEyODIyYmUtY2E4Ny00ZTJmLThiZmEtOTVlNzRmZjU5OGE3In0sInMiOnsiUyI6IjMifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "28fc9ffaeddee068", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "246" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "120" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:45 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "396270901" ], "X-Amzn-Requestid": [ "RGBKKC4C4QD6IT1FVM04J1E287VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLmR5bmFtb2RiLnYyMDEyMDgxMCNDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uIiwibWVzc2FnZSI6IlRoZSBjb25kaXRpb25hbCByZXF1ZXN0IGZhaWxlZCJ9" } }, { "ID": "0f6599850c405b5b", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "320" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:45 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "V2LG8JCKAIR9V9PQPQ8PKDVCTBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "15d650adf7aae93b", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "76" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:45 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "PR9OBDRFIGC1EMIUL6IJUPA68RVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "afaebdc88c3c8ddf", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DescribeTable" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "599" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:45 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3022004566" ], "X-Amzn-Requestid": [ "A15G5Q2L1QQ8LK1L26O8KAGRG3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJUYWJsZSI6eyJBdHRyaWJ1dGVEZWZpbml0aW9ucyI6W3siQXR0cmlidXRlTmFtZSI6Im5hbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9XSwiQ3JlYXRpb25EYXRlVGltZSI6MS43MjMwNzYwNzk3OTdFOSwiRGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZCI6ZmFsc2UsIkl0ZW1Db3VudCI6MCwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoibmFtZSIsIktleVR5cGUiOiJIQVNIIn1dLCJQcm92aXNpb25lZFRocm91Z2hwdXQiOnsiTnVtYmVyT2ZEZWNyZWFzZXNUb2RheSI6MCwiUmVhZENhcGFjaXR5VW5pdHMiOjUsIldyaXRlQ2FwYWNpdHlVbml0cyI6NX0sIlRhYmxlQXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMSIsIlRhYmxlSWQiOiI5N2U0OTNmNC1jZjU3LTQ2YmItOTc4Ny1iOGU4ZDk3ZjUwMDciLCJUYWJsZU5hbWUiOiJkb2NzdG9yZS10ZXN0LTEiLCJUYWJsZVNpemVCeXRlcyI6MCwiVGFibGVTdGF0dXMiOiJBQ1RJVkUiLCJXYXJtVGhyb3VnaHB1dCI6eyJSZWFkVW5pdHNQZXJTZWNvbmQiOjUsIlN0YXR1cyI6IkFDVElWRSIsIldyaXRlVW5pdHNQZXJTZWNvbmQiOjV9fX0=" } }, { "ID": "0520767707599e7c", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "771" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:45 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3930045769" ], "X-Amzn-Requestid": [ "55LT4SV88DP94MO3KR4GN8NFURVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6NiwiSXRlbXMiOlt7Im5hbWUiOnsiUyI6InRlc3RVbm9yZGVyZWRBY3Rpb25zMyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiIwMTI4MjJiZS1jYTg3LTRlMmYtOGJmYS05NWU3NGZmNTk4YTcifSwicyI6eyJTIjoiMyJ9fSx7InMiOnsiUyI6IjgifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiYTNiNzc5N2EtMDZkNC00MGZiLWI2NDktOGRjMDVlNjVlOGY2In0sIm4iOnsiTiI6Ii0xIn0sIm5hbWUiOnsiUyI6InRlc3RVbm9yZGVyZWRBY3Rpb25zOCJ9fSx7Im5hbWUiOnsiUyI6InRlc3RVbm9yZGVyZWRBY3Rpb25zNCJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiI3NWMwOGJmNi1jZTg3LTQ3ZmYtYTk2Mi1lN2IyNjliNTQxNzAifSwicyI6eyJTIjoiNCJ9fSx7IkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6IjcwZjZhMzg4LTM3ZmItNDQyNC05NmFkLTczNjMzMTI0MmY4MSJ9LCJuYW1lIjp7IlMiOiJ0ZXN0VW5vcmRlcmVkQWN0aW9uczcifSwicyI6eyJTIjoiNycifX0seyJzIjp7IlMiOiI2JyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJlYTZmNGQ1YS03MjEwLTRmM2ItODM0MC0xN2YyYjllNTI3ZWEifSwibiI6eyJOIjoiMSJ9LCJuYW1lIjp7IlMiOiJ0ZXN0VW5vcmRlcmVkQWN0aW9uczYifX0seyJuYW1lIjp7IlMiOiJ0ZXN0VW5vcmRlcmVkQWN0aW9uczUifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiNTRiZDcyMjItODJiOC00Nzg4LThlZjMtODM0MzllZTBhNGM0In0sInMiOnsiUyI6IjUifX1dLCJTY2FubmVkQ291bnQiOjZ9" } }, { "ID": "b122d25d68e32143", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "76" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:45 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "ST1KSMU17O58GRTBEIVVEE42N7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "7847cbdd68b2bf20", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "76" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:45 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "II5LLOMC6IOLMP6QTDE4OUVHPBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "19d7e5433431d01d", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "76" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:45 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "MINU0V8B999BV2C3B3NOMOM0QNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "9b0c14c7eb56606a", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "76" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:46 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "KD30N7J44CH7GUVB0BUDSE7I1NVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "08ffbe91da36b2d4", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "76" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:46 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "88V5CLKKMCHQH49FUHQ147VQCRVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "bace5902ec40c2fc", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "76" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:46 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "76P40JBFDRL5H9NTHHTB4ST2B3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "7cd266cd0d176efa", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "234" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:46 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "NPKJ5BG0T80R7J0I3FCECAVHOJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "f8afd1a1f2df845d", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "234" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:46 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "6QV07K826MH7RMCR53QMN3TU5JVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "e27ed62340045970", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "234" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:46 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "UKCGEI7L13DE7AF2S3D67K1CSJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "7e8dec346d7c16fd", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "234" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:46 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "5J6P37OD9TBE1CNJICQKLEDCURVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "4293ab76231ac012", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "234" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:46 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "32V2I5H5TFPIGBOSGQOIHFRAQNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "da91b1c3982652e8", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "234" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:46 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "URJ24HG6GVAEHI4D4CU4K2N40FVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "9e833c3200a95f8c", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "297" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:46 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "5D2DDT6197OTOEUQQ7E1DTRADFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "02c7c1ac950c972a", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "143" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:46 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "9U1CJ758KQFAFANNUDMAKE02JNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "d1f8f8c03752578d", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "296" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:46 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "U26GK6084VK78BQBQ8MKE7PD33VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "c6435cf2a2ff1741", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "297" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:46 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "TJN894NU21THPBQS8NGEGACE0VVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "6fd86dd9d3d5a018", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "143" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:46 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "Q26047IL713UIET5H86A207DG7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "64fe2458a90f2989", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "143" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:46 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "UUOB9SM2ND44INRV65MF46KS6NVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "1f22340a53133a2c", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "296" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:46 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "7SACVHBH8VMU2007SNEVH7T7GNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "4c935168c03c86d1", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "296" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:46 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "SVPDUGA0QQ7H5I9CV6HB5HFIO7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "e0e8522780a22130", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "297" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:46 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "12R9F1EKA5VK66NTNOA49ERHM3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "5db2580cebe108f3", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "186" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "371" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:46 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2376893110" ], "X-Amzn-Requestid": [ "A966SBFO1PUIU3PUFODG4MBI67VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJFdGFnIjp7IlMiOiIyYzBmMWFmNy05YjM2LTRmZTItOWVkMC00N2QyZWFmZTM1ZTMifSwibmFtZSI6eyJTIjoidGVzdFVub3JkZXJlZEFjdGlvbnM1In0sInMiOnsiUyI6IjUifX0seyJuYW1lIjp7IlMiOiJ0ZXN0VW5vcmRlcmVkQWN0aW9uczMifSwiRXRhZyI6eyJTIjoiNzg3Njk4ZjAtMTEwNi00MGM1LTg5MjEtYmQyZDBjMjU0M2NmIn0sInMiOnsiUyI6IjMifX0seyJuYW1lIjp7IlMiOiJ0ZXN0VW5vcmRlcmVkQWN0aW9uczQifSwiRXRhZyI6eyJTIjoiNTk4Mjk5MzAtZTgwZS00YzYxLTliMzctM2JjNTQ3MmIzMDA0In0sInMiOnsiUyI6IjQifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "e8fdd6ec075a2374", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "350" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.UpdateItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:46 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "FJV7AEFJRTS4986SLD3FV4G9OJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "ba1eb1d912f999ca", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "229" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:46 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "3SHTT54I1DELSECO9Q5SM9SBE3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "4eb218d197f3dd16", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "229" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:46 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "7K8531UGND2RJSEK70NMGSAF0FVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "1d434e7d3e30801b", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "229" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:46 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "FVFJ5P2BJTGEKC58504DBN00EFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "b8d68dd43a6ddbde", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "383" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.UpdateItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:46 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "SMC15UCC3ON6I01NB78SKTV5TNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "35d2d7b33f76a47f", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "348" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.UpdateItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:46 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "0V7UQR7C3LTP61HC4V37N39U93VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "4b2fe7ff68e184b8", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "108" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "57" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:46 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "289144682" ], "X-Amzn-Requestid": [ "035UUPS4MGFRHVCLOE99PDS07JVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbXX0sIlVucHJvY2Vzc2VkS2V5cyI6e319" } }, { "ID": "cf3cd5806fb536c8", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "186" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "161" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:46 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3663147691" ], "X-Amzn-Requestid": [ "BUOD82PUVMAV2T1EG6C1CLO3R3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0VW5vcmRlcmVkQWN0aW9uczMifSwiRXRhZyI6eyJTIjoiNzg3Njk4ZjAtMTEwNi00MGM1LTg5MjEtYmQyZDBjMjU0M2NmIn0sInMiOnsiUyI6IjMifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "cf7a283e6123b220", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "296" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:46 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "GFBRI4A9KH9H42S7C4BGK7DS1NVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "0d6381d5699b08b9", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "234" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "120" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:46 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "396270901" ], "X-Amzn-Requestid": [ "B076IVGLNRF88LVUJFOFVUD0D3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLmR5bmFtb2RiLnYyMDEyMDgxMCNDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uIiwibWVzc2FnZSI6IlRoZSBjb25kaXRpb25hbCByZXF1ZXN0IGZhaWxlZCJ9" } }, { "ID": "648befef19cc4ce3", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "76" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:46 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "3IFCHM6J1OFNGJO7OCTG8GPQ7RVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } } ] } ================================================ FILE: docstore/awsdynamodb/v2/testdata/TestConformance/Proto.replay ================================================ { "Initial": "AQAAAA7hTg5YAwiTkwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*", ".*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "656cd1c5192fce09", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DescribeTable" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "599" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:44 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3022004566" ], "X-Amzn-Requestid": [ "RS06DTIU5P17CT1BERD3VEAO0RVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJUYWJsZSI6eyJBdHRyaWJ1dGVEZWZpbml0aW9ucyI6W3siQXR0cmlidXRlTmFtZSI6Im5hbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9XSwiQ3JlYXRpb25EYXRlVGltZSI6MS43MjMwNzYwNzk3OTdFOSwiRGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZCI6ZmFsc2UsIkl0ZW1Db3VudCI6MCwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoibmFtZSIsIktleVR5cGUiOiJIQVNIIn1dLCJQcm92aXNpb25lZFRocm91Z2hwdXQiOnsiTnVtYmVyT2ZEZWNyZWFzZXNUb2RheSI6MCwiUmVhZENhcGFjaXR5VW5pdHMiOjUsIldyaXRlQ2FwYWNpdHlVbml0cyI6NX0sIlRhYmxlQXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMSIsIlRhYmxlSWQiOiI5N2U0OTNmNC1jZjU3LTQ2YmItOTc4Ny1iOGU4ZDk3ZjUwMDciLCJUYWJsZU5hbWUiOiJkb2NzdG9yZS10ZXN0LTEiLCJUYWJsZVNpemVCeXRlcyI6MCwiVGFibGVTdGF0dXMiOiJBQ1RJVkUiLCJXYXJtVGhyb3VnaHB1dCI6eyJSZWFkVW5pdHNQZXJTZWNvbmQiOjUsIlN0YXR1cyI6IkFDVElWRSIsIldyaXRlVW5pdHNQZXJTZWNvbmQiOjV9fX0=" } }, { "ID": "06323819984e5a76", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "83" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:44 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "1006067942" ], "X-Amzn-Requestid": [ "P5GB099DMLF11SG41M3GALB8HRVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MSwiSXRlbXMiOlt7Im5hbWUiOnsiUyI6InRlc3REYXRhIn0sInZhbCI6eyJCIjoiQUFFQyJ9fV0sIlNjYW5uZWRDb3VudCI6MX0=" } }, { "ID": "7f56f365b103ea8c", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "63" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:44 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "BI4QMKHG8MFDPDUML9S03HFFLJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "f9b2e5493d6771bb", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "265" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:44 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "6T9AC8PPSJT3V3RTB1R16505V3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "29c51cdaecea6d1b", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "174" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:44 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "4219194470" ], "X-Amzn-Requestid": [ "77H4CPM5K05KE22KRSQ0G90B3NVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MSwiSXRlbXMiOlt7IlB0clRvUHJvdG8iOnsiQiI6IkNDcz0ifSwibmFtZSI6eyJTIjoidGVzdGluZyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiI5N2E0NDZmZi0yZWE3LTQ1ZTUtYjJjMi0wMjVkYWMzOTUyYjIifSwiUHJvdG8iOnsiQiI6IkNDbz0ifX1dLCJTY2FubmVkQ291bnQiOjF9" } } ] } ================================================ FILE: docstore/awsdynamodb/v2/testdata/TestConformance/Put.replay ================================================ { "Initial": "AQAAAA7hTg5GDv7krQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*", ".*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "b2455ac12931cdd6", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DescribeTable" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "599" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:26 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3022004566" ], "X-Amzn-Requestid": [ "0NPEQMG92UOCB1AFTJSQS3RIJJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJUYWJsZSI6eyJBdHRyaWJ1dGVEZWZpbml0aW9ucyI6W3siQXR0cmlidXRlTmFtZSI6Im5hbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9XSwiQ3JlYXRpb25EYXRlVGltZSI6MS43MjMwNzYwNzk3OTdFOSwiRGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZCI6ZmFsc2UsIkl0ZW1Db3VudCI6MCwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoibmFtZSIsIktleVR5cGUiOiJIQVNIIn1dLCJQcm92aXNpb25lZFRocm91Z2hwdXQiOnsiTnVtYmVyT2ZEZWNyZWFzZXNUb2RheSI6MCwiUmVhZENhcGFjaXR5VW5pdHMiOjUsIldyaXRlQ2FwYWNpdHlVbml0cyI6NX0sIlRhYmxlQXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMSIsIlRhYmxlSWQiOiI5N2U0OTNmNC1jZjU3LTQ2YmItOTc4Ny1iOGU4ZDk3ZjUwMDciLCJUYWJsZU5hbWUiOiJkb2NzdG9yZS10ZXN0LTEiLCJUYWJsZVNpemVCeXRlcyI6MCwiVGFibGVTdGF0dXMiOiJBQ1RJVkUiLCJXYXJtVGhyb3VnaHB1dCI6eyJSZWFkVW5pdHNQZXJTZWNvbmQiOjUsIlN0YXR1cyI6IkFDVElWRSIsIldyaXRlVW5pdHNQZXJTZWNvbmQiOjV9fX0=" } }, { "ID": "25acf4f57bd7dc52", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "543" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:26 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2464606679" ], "X-Amzn-Requestid": [ "TPSQUHNLR8NH85H87MOB3R45SBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6NSwiSXRlbXMiOlt7Im5hbWUiOnsiUyI6InRlc3RBdG9taWNXcml0ZXM3In0sIkV0YWciOnsiUyI6ImUzYWUwYjQ2LTFjMzgtNGI1OC04YjEwLWI2MjVmM2YwMTBhZCJ9LCJzIjp7IlMiOiI3In19LHsibmFtZSI6eyJTIjoidGVzdEF0b21pY1dyaXRlczQifSwiRXRhZyI6eyJTIjoiZThlYzYwYmEtNTFiOC00Yzk1LTgyMTctMjE2MmRkMjcwZTFhIn0sInMiOnsiUyI6IjQifX0seyJFdGFnIjp7IlMiOiI3NjJjZGFlZi1mYzNiLTQxN2QtOWEwMi1hY2EyYmNmOGVhMzIifSwibmFtZSI6eyJTIjoidGVzdEF0b21pY1dyaXRlczUifSwicyI6eyJTIjoiNSJ9fSx7Im5hbWUiOnsiUyI6InRlc3RBdG9taWNXcml0ZXMzIn0sIkV0YWciOnsiUyI6IjlkZWI3NDE2LWFiMTQtNGFkNC1iYTYyLTJhODc0YzQwN2Y2OSJ9LCJzIjp7IlMiOiIzIn19LHsiRXRhZyI6eyJTIjoiNzg1M2RmOTgtZTAxYy00NjUzLWI1NjItNTYzYzY1ODYzODZlIn0sIm5hbWUiOnsiUyI6InRlc3RBdG9taWNXcml0ZXM2In0sInMiOnsiUyI6IjYifX1dLCJTY2FubmVkQ291bnQiOjV9" } }, { "ID": "18aa11c6c6583a6b", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "72" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:26 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "T2EEBFVABAQNHPEJKN6BHO68I3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "ef478295803853fa", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "72" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:26 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "KNLD2F2RNFEUSB71VG028000A3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "f9e5b59da0ddd915", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "72" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:26 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "6MKCBRVNJ1VTHH41TO1LD4EL5RVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "aa1770eb5ac33557", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "72" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:26 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "T93TC3TRPI7V5S4SNJ7AP2ATT7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "3ace23b52c8c507c", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "72" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:26 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "VP6OE0JG4QK3O5VKJBAS3JMM27VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "14572ef80de8155e", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "148" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:26 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "AE4H1IPK89L44ND3NBHL9RMHLJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "7327cf51735ce635", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "97" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "166" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:26 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "249884785" ], "X-Amzn-Requestid": [ "0L6RUHK2TVN8NUIC3C248GB2GFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0UHV0TWFwIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6IjlkNDM0MTRkLTYzOWEtNDZkMy1iYjlmLTgxMDdiMjJhYzBjNCJ9LCJiIjp7IkJPT0wiOnRydWV9fV19LCJVbnByb2Nlc3NlZEtleXMiOnt9fQ==" } }, { "ID": "694a4e453f603f43", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "251" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:26 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "OOKO2A5VH42KJ0UQ56EV0KQQEJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "b0378858c12865ff", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "100" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "269" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:27 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3040759825" ], "X-Amzn-Requestid": [ "LTSQ0UIOFMRUN962Q4R0L43HPNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJCIjp7IkJPT0wiOnRydWV9LCJTdCI6eyJOVUxMIjp0cnVlfSwiVSI6eyJOIjoiMCJ9LCJGIjp7Ik4iOiIwIn0sIkkiOnsiTiI6IjAifSwiRXRhZyI6eyJOVUxMIjp0cnVlfSwiTSI6eyJOVUxMIjp0cnVlfSwibmFtZSI6eyJTIjoidGVzdFB1dFN0cnVjdCJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiI4NmU2YzgwOC01MWVjLTQ1MjUtODE0MS04NzJlYzdlMzJlZTIifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "b083c4727a9d23fb", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "149" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:27 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "PA11BMJ5P8PNU1G5GU5S2AIOBBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "10c4a590cc04a183", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "97" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "167" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:27 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3826599646" ], "X-Amzn-Requestid": [ "UTEJAVFEN1JUIME3NT8229DB3VVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0UHV0TWFwIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6IjY1ODlkNzQ0LTU2ZWMtNDVjZC05OTM5LTBmNTM3MjkyZWEyNiJ9LCJiIjp7IkJPT0wiOmZhbHNlfX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "d69ccbb716b80ee5", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "252" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:27 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "4JLRPLO9MKI9QNM9JKQKD9ORFFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "ced650ba06484837", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "100" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "270" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:27 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3232736" ], "X-Amzn-Requestid": [ "BKV0543U9P578A8I3J1T8LC15FVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJCIjp7IkJPT0wiOmZhbHNlfSwiU3QiOnsiTlVMTCI6dHJ1ZX0sIlUiOnsiTiI6IjAifSwiRiI6eyJOIjoiMCJ9LCJJIjp7Ik4iOiIwIn0sIkV0YWciOnsiTlVMTCI6dHJ1ZX0sIk0iOnsiTlVMTCI6dHJ1ZX0sIm5hbWUiOnsiUyI6InRlc3RQdXRTdHJ1Y3QifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiNjE3MzNlYmEtMTBjOS00Mzg2LWIzZTgtNDEzYWE2Yzk5ZjEyIn19XX0sIlVucHJvY2Vzc2VkS2V5cyI6e319" } }, { "ID": "7e011c54e0969702", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "296" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "120" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:27 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "396270901" ], "X-Amzn-Requestid": [ "AGR6G6BTLA82MEC0JO66PT2P7NVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLmR5bmFtb2RiLnYyMDEyMDgxMCNDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uIiwibWVzc2FnZSI6IlRoZSBjb25kaXRpb25hbCByZXF1ZXN0IGZhaWxlZCJ9" } }, { "ID": "45312ed6e8a719da", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "449" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "120" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:27 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "396270901" ], "X-Amzn-Requestid": [ "GA6EE1CCIMNB8Q0OCVMJ2PU7FJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLmR5bmFtb2RiLnYyMDEyMDgxMCNDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uIiwibWVzc2FnZSI6IlRoZSBjb25kaXRpb25hbCByZXF1ZXN0IGZhaWxlZCJ9" } }, { "ID": "f803d7077947d7bc", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "149" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:27 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "INSE56DC25OSOQ5HMLCQ70CQF7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "5e742ef1bdb367cd", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "102" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "167" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:27 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2364481117" ], "X-Amzn-Requestid": [ "QT3CI79QIVGELQ117GF3QPMG5JVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0UmV2aXNpb25NYXAifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiYjUyNThiYzEtNWU1Mi00OWVmLThiYWQtNjYxNTBjY2ZmNmU3In0sInMiOnsiUyI6ImEifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "1643a571ae5d6d93", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "314" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:27 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "MU28JIE3LO2GA8T0550JHQV96JVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "88b854ac3ecb3898", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "314" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "120" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:27 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "396270901" ], "X-Amzn-Requestid": [ "M48CRLE07SPEK94M3IKR7ATS0RVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLmR5bmFtb2RiLnYyMDEyMDgxMCNDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uIiwibWVzc2FnZSI6IlRoZSBjb25kaXRpb25hbCByZXF1ZXN0IGZhaWxlZCJ9" } }, { "ID": "8dbb49fe68de5f15", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "253" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:27 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "NUDGI1E3531SE1SHBP8Q6VR3SJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "482dd71d20116fcd", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "105" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "271" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:27 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "1943678074" ], "X-Amzn-Requestid": [ "KAUJ3J3VGGTN63QRF51N556V0VVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJCIjp7IkJPT0wiOmZhbHNlfSwiU3QiOnsiUyI6ImEifSwiVSI6eyJOIjoiMCJ9LCJGIjp7Ik4iOiIwIn0sIkkiOnsiTiI6IjAifSwiRXRhZyI6eyJOVUxMIjp0cnVlfSwiTSI6eyJOVUxMIjp0cnVlfSwibmFtZSI6eyJTIjoidGVzdFJldmlzaW9uU3RydWN0In0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImMyODRlNWY4LWIxNjMtNDk1NS05YTIxLTNhMjAzYTI3ODI1NiJ9fV19LCJVbnByb2Nlc3NlZEtleXMiOnt9fQ==" } }, { "ID": "31744d9f9ab58942", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "418" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:27 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "LJLPURHIT4CFNGF3S4795EUUGRVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "1ad717467cc576f6", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "418" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "120" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:27 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "396270901" ], "X-Amzn-Requestid": [ "UDO6SLVMR2PPLCSNJ0Q93VS1EFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLmR5bmFtb2RiLnYyMDEyMDgxMCNDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uIiwibWVzc2FnZSI6IlRoZSBjb25kaXRpb25hbCByZXF1ZXN0IGZhaWxlZCJ9" } }, { "ID": "03fb14bc7325f8bf", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DescribeTable" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "599" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:28 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3022004566" ], "X-Amzn-Requestid": [ "M7O0M5VVL901JNF4BTR3OVHPPBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJUYWJsZSI6eyJBdHRyaWJ1dGVEZWZpbml0aW9ucyI6W3siQXR0cmlidXRlTmFtZSI6Im5hbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9XSwiQ3JlYXRpb25EYXRlVGltZSI6MS43MjMwNzYwNzk3OTdFOSwiRGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZCI6ZmFsc2UsIkl0ZW1Db3VudCI6MCwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoibmFtZSIsIktleVR5cGUiOiJIQVNIIn1dLCJQcm92aXNpb25lZFRocm91Z2hwdXQiOnsiTnVtYmVyT2ZEZWNyZWFzZXNUb2RheSI6MCwiUmVhZENhcGFjaXR5VW5pdHMiOjUsIldyaXRlQ2FwYWNpdHlVbml0cyI6NX0sIlRhYmxlQXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMSIsIlRhYmxlSWQiOiI5N2U0OTNmNC1jZjU3LTQ2YmItOTc4Ny1iOGU4ZDk3ZjUwMDciLCJUYWJsZU5hbWUiOiJkb2NzdG9yZS10ZXN0LTEiLCJUYWJsZVNpemVCeXRlcyI6MCwiVGFibGVTdGF0dXMiOiJBQ1RJVkUiLCJXYXJtVGhyb3VnaHB1dCI6eyJSZWFkVW5pdHNQZXJTZWNvbmQiOjUsIlN0YXR1cyI6IkFDVElWRSIsIldyaXRlVW5pdHNQZXJTZWNvbmQiOjV9fX0=" } }, { "ID": "eb6631035c551ce0", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "689" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:28 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3916281896" ], "X-Amzn-Requestid": [ "JCKGABAD2V13V0USF336B54MSFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6NCwiSXRlbXMiOlt7Im5hbWUiOnsiUyI6InRlc3RSZXZpc2lvbk1hcCJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJmMTI1ZDczYy1kODZiLTQ4NmEtOGE2OS1kYjkzMTFjZTU0MTcifSwicyI6eyJTIjoiYSJ9fSx7Im5hbWUiOnsiUyI6InRlc3RQdXRNYXAifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiNjU4OWQ3NDQtNTZlYy00NWNkLTk5MzktMGY1MzcyOTJlYTI2In0sImIiOnsiQk9PTCI6ZmFsc2V9fSx7IkIiOnsiQk9PTCI6ZmFsc2V9LCJTdCI6eyJTIjoiYSJ9LCJVIjp7Ik4iOiIwIn0sIkYiOnsiTiI6IjAifSwiSSI6eyJOIjoiMCJ9LCJFdGFnIjp7Ik5VTEwiOnRydWV9LCJNIjp7Ik5VTEwiOnRydWV9LCJuYW1lIjp7IlMiOiJ0ZXN0UmV2aXNpb25TdHJ1Y3QifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiYjQzMGNhMzktZTM3OS00OWZhLTllNmQtN2M1YTA5OGNmNWRhIn19LHsiQiI6eyJCT09MIjpmYWxzZX0sIlN0Ijp7Ik5VTEwiOnRydWV9LCJVIjp7Ik4iOiIwIn0sIkYiOnsiTiI6IjAifSwiSSI6eyJOIjoiMCJ9LCJFdGFnIjp7Ik5VTEwiOnRydWV9LCJNIjp7Ik5VTEwiOnRydWV9LCJuYW1lIjp7IlMiOiJ0ZXN0UHV0U3RydWN0In0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6IjYxNzMzZWJhLTEwYzktNDM4Ni1iM2U4LTQxM2FhNmM5OWYxMiJ9fV0sIlNjYW5uZWRDb3VudCI6NH0=" } }, { "ID": "2cb4f4a115723431", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "68" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:28 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "VIC1N6G50Q938GCEA57B30T8E3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "6b02fe666e0500eb", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "65" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:28 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "0M87D4878IDLU93QEVNUKIAUONVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "2c6300b319031870", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "70" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:28 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "1C9P66TJJ629B6MAPV9QV49RN7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "fcb634b30af447e8", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "73" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:28 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "BLFTQ95AGN7EP4DFVD2E2DSS6NVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "3d2a5f7eb2027e12", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "136" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:28 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "UUD89KLNV6B4UU80O6ALAH05TNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "b7ae0a550e7dfd7e", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "97" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "154" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:28 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "1989041707" ], "X-Amzn-Requestid": [ "PHNVM4M6OE01J3IQ5CG9ONKB1RVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0UHV0TWFwIn0sIkV0YWciOnsiUyI6ImViYzE0Y2M4LTliMjUtNGJiNS04NmY4LTA2MmYwZDQyNDY4ZSJ9LCJiIjp7IkJPT0wiOnRydWV9fV19LCJVbnByb2Nlc3NlZEtleXMiOnt9fQ==" } }, { "ID": "857fd7e10875d7f3", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "251" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:28 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "7NE70MM0713R72NVU8H698ON1VVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "a8aff42eff54fc31", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "100" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "269" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:28 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2542374577" ], "X-Amzn-Requestid": [ "KMEJ2455QC0ODLUG9RRG67DTU7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJCIjp7IkJPT0wiOnRydWV9LCJTdCI6eyJOVUxMIjp0cnVlfSwiVSI6eyJOIjoiMCJ9LCJGIjp7Ik4iOiIwIn0sIkkiOnsiTiI6IjAifSwiRXRhZyI6eyJTIjoiOWE2MjRlMjItYWQzNy00YzE1LTk4MWUtODY0YjFkNGVkNzI2In0sIk0iOnsiTlVMTCI6dHJ1ZX0sIm5hbWUiOnsiUyI6InRlc3RQdXRTdHJ1Y3QifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJOVUxMIjp0cnVlfX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "4cf8eb02b7f97031", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "137" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:28 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "TK75C3UJRLS8E9M7PR3OATO2UVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "d9ede524ade1743f", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "97" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "155" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:28 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2888745477" ], "X-Amzn-Requestid": [ "6DQLSI2NDPUBCLDU4P717EJM17VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0UHV0TWFwIn0sIkV0YWciOnsiUyI6Ijg1YWE2OWVlLTdkM2YtNGY1Zi04NmRmLTlmNzNjNjg1NWFiYyJ9LCJiIjp7IkJPT0wiOmZhbHNlfX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "13d9ba96613a2b0f", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "252" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:28 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "DJ183HM9OHK0M7SV1ER6VS7RM3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "76bd1ac55a041ca4", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "100" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "270" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:28 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "1552192523" ], "X-Amzn-Requestid": [ "DM7CUHSI2NH99U3VLJU6FEA5UNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJCIjp7IkJPT0wiOmZhbHNlfSwiU3QiOnsiTlVMTCI6dHJ1ZX0sIlUiOnsiTiI6IjAifSwiRiI6eyJOIjoiMCJ9LCJJIjp7Ik4iOiIwIn0sIkV0YWciOnsiUyI6IjJmYTcyNDExLWI0ODUtNDMxNy1hOGE1LWMzN2UxNDhiNzQ0ZSJ9LCJNIjp7Ik5VTEwiOnRydWV9LCJuYW1lIjp7IlMiOiJ0ZXN0UHV0U3RydWN0In0sIkRvY3N0b3JlUmV2aXNpb24iOnsiTlVMTCI6dHJ1ZX19XX0sIlVucHJvY2Vzc2VkS2V5cyI6e319" } }, { "ID": "a0acd22c886a0066", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "272" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "120" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:28 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "396270901" ], "X-Amzn-Requestid": [ "RHCN729VB42BV4M7HC6JKBKBRNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLmR5bmFtb2RiLnYyMDEyMDgxMCNDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uIiwibWVzc2FnZSI6IlRoZSBjb25kaXRpb25hbCByZXF1ZXN0IGZhaWxlZCJ9" } }, { "ID": "cdf7c93515f252f3", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "437" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "120" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:28 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "396270901" ], "X-Amzn-Requestid": [ "NPD2V13L51N3I7663DVIVQ5TM7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLmR5bmFtb2RiLnYyMDEyMDgxMCNDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uIiwibWVzc2FnZSI6IlRoZSBjb25kaXRpb25hbCByZXF1ZXN0IGZhaWxlZCJ9" } }, { "ID": "e460efc99a3cb6b0", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "137" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:29 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "10MV3Q2RQS5LL83NME217SJ4RRVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "b974e08d5577427a", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "102" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "155" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:29 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "596753964" ], "X-Amzn-Requestid": [ "AQUFJ4LRIV65LAQTMDIPKVGO8NVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJFdGFnIjp7IlMiOiJmMDU2YTA1My0zMGQ4LTQ0MjEtYjcwNC0wZWZkMDhjNzc1NWMifSwibmFtZSI6eyJTIjoidGVzdFJldmlzaW9uTWFwIn0sInMiOnsiUyI6ImEifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "c75fd2c9c8a44082", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "290" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:29 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "1AKU21A3ONNGG782PFATI44VS7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "74f7c15e543e2522", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "290" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "120" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:29 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "396270901" ], "X-Amzn-Requestid": [ "NITGE1CN55UCUHPVC0LK11HUGNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLmR5bmFtb2RiLnYyMDEyMDgxMCNDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uIiwibWVzc2FnZSI6IlRoZSBjb25kaXRpb25hbCByZXF1ZXN0IGZhaWxlZCJ9" } }, { "ID": "3c6a8e72241cbf79", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "253" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:29 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "4KH0HGIKH61TQA2N3F6AE1B9Q3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "02c749427f027db7", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "105" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "271" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:29 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2498238133" ], "X-Amzn-Requestid": [ "QI3VB95CVURO071KNVTO8FERDVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJCIjp7IkJPT0wiOmZhbHNlfSwiU3QiOnsiUyI6ImEifSwiVSI6eyJOIjoiMCJ9LCJGIjp7Ik4iOiIwIn0sIkkiOnsiTiI6IjAifSwiRXRhZyI6eyJTIjoiMmI0YjY2NWItMTkyOS00ZWU4LThhM2ItYzg3ODRkOTc5ZjkzIn0sIk0iOnsiTlVMTCI6dHJ1ZX0sIm5hbWUiOnsiUyI6InRlc3RSZXZpc2lvblN0cnVjdCJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7Ik5VTEwiOnRydWV9fV19LCJVbnByb2Nlc3NlZEtleXMiOnt9fQ==" } }, { "ID": "831c8aed579152f5", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "406" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:29 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "OENN3EL8DR33TQDEQ3P9RETP7JVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "e0d34c669f98706d", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "406" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "120" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:29 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "396270901" ], "X-Amzn-Requestid": [ "93PGJU80KSTOACVGE42OQ5M60BVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLmR5bmFtb2RiLnYyMDEyMDgxMCNDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uIiwibWVzc2FnZSI6IlRoZSBjb25kaXRpb25hbCByZXF1ZXN0IGZhaWxlZCJ9" } } ] } ================================================ FILE: docstore/awsdynamodb/v2/testdata/TestConformance/Replace.replay ================================================ { "Initial": "AQAAAA7hTg5JIoa+DwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*", ".*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "b242f7cc66bf1a26", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DescribeTable" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "599" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:29 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3022004566" ], "X-Amzn-Requestid": [ "09NSJ080720Q9BE8PLD85LJP93VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJUYWJsZSI6eyJBdHRyaWJ1dGVEZWZpbml0aW9ucyI6W3siQXR0cmlidXRlTmFtZSI6Im5hbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9XSwiQ3JlYXRpb25EYXRlVGltZSI6MS43MjMwNzYwNzk3OTdFOSwiRGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZCI6ZmFsc2UsIkl0ZW1Db3VudCI6MCwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoibmFtZSIsIktleVR5cGUiOiJIQVNIIn1dLCJQcm92aXNpb25lZFRocm91Z2hwdXQiOnsiTnVtYmVyT2ZEZWNyZWFzZXNUb2RheSI6MCwiUmVhZENhcGFjaXR5VW5pdHMiOjUsIldyaXRlQ2FwYWNpdHlVbml0cyI6NX0sIlRhYmxlQXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMSIsIlRhYmxlSWQiOiI5N2U0OTNmNC1jZjU3LTQ2YmItOTc4Ny1iOGU4ZDk3ZjUwMDciLCJUYWJsZU5hbWUiOiJkb2NzdG9yZS10ZXN0LTEiLCJUYWJsZVNpemVCeXRlcyI6MCwiVGFibGVTdGF0dXMiOiJBQ1RJVkUiLCJXYXJtVGhyb3VnaHB1dCI6eyJSZWFkVW5pdHNQZXJTZWNvbmQiOjUsIlN0YXR1cyI6IkFDVElWRSIsIldyaXRlVW5pdHNQZXJTZWNvbmQiOjV9fX0=" } }, { "ID": "50a7c849b4dd46d0", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "665" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:29 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "1639290065" ], "X-Amzn-Requestid": [ "BIMITSE6AGUCAC21JO27UD4O73VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6NCwiSXRlbXMiOlt7IkV0YWciOnsiUyI6IjljMWI2NzBjLTUzZGEtNDJhNS1hOGNjLWM1ZGU2YmM5MGZkNiJ9LCJuYW1lIjp7IlMiOiJ0ZXN0UmV2aXNpb25NYXAifSwicyI6eyJTIjoiYSJ9fSx7Im5hbWUiOnsiUyI6InRlc3RQdXRNYXAifSwiRXRhZyI6eyJTIjoiODVhYTY5ZWUtN2QzZi00ZjVmLTg2ZGYtOWY3M2M2ODU1YWJjIn0sImIiOnsiQk9PTCI6ZmFsc2V9fSx7IkIiOnsiQk9PTCI6ZmFsc2V9LCJTdCI6eyJTIjoiYSJ9LCJVIjp7Ik4iOiIwIn0sIkYiOnsiTiI6IjAifSwiSSI6eyJOIjoiMCJ9LCJFdGFnIjp7IlMiOiJiNDVhM2M2Mi01N2I1LTQ0MWYtOGYyZS00YTQxNjQxNzlmZWMifSwiTSI6eyJOVUxMIjp0cnVlfSwibmFtZSI6eyJTIjoidGVzdFJldmlzaW9uU3RydWN0In0sIkRvY3N0b3JlUmV2aXNpb24iOnsiTlVMTCI6dHJ1ZX19LHsiQiI6eyJCT09MIjpmYWxzZX0sIlN0Ijp7Ik5VTEwiOnRydWV9LCJVIjp7Ik4iOiIwIn0sIkYiOnsiTiI6IjAifSwiSSI6eyJOIjoiMCJ9LCJFdGFnIjp7IlMiOiIyZmE3MjQxMS1iNDg1LTQzMTctYThhNS1jMzdlMTQ4Yjc0NGUifSwiTSI6eyJOVUxMIjp0cnVlfSwibmFtZSI6eyJTIjoidGVzdFB1dFN0cnVjdCJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7Ik5VTEwiOnRydWV9fV0sIlNjYW5uZWRDb3VudCI6NH0=" } }, { "ID": "413ef4a4c0cd2d0a", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "68" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:29 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "R0A96HODLPL9GE7IKUINOSA14RVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "7e6f4e248f901aa4", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "73" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:29 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "QBQLD8QQDQIV9SC0RBUTBSAONRVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "8400e6cb857626e4", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "65" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:30 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "H9J7PBOS9EH7F86V2D62D8HK6RVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "c9e91db79133089c", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "70" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:30 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "76IFNENG1TGOHMH0OC622GA7JJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "16c99d11cb404514", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "148" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:30 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "BOIS3RUR38S93E0LC06M0E58E3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "0fb7b840cde7b193", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "235" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:30 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "CQ0QTD473OHEG4IV7BK55K22PNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "9b71b3d400404951", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "101" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "166" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:30 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2661063232" ], "X-Amzn-Requestid": [ "316R8LP93M1IPCQEBOV0UHCVK3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0UmVwbGFjZU1hcCJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiJiOTJjYzVkYy01MmY3LTQ2NjAtYjFkOS0xY2M5M2M1MjVhOTYifSwicyI6eyJTIjoiYiJ9fV19LCJVbnByb2Nlc3NlZEtleXMiOnt9fQ==" } }, { "ID": "ebad217fa43e716d", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "252" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:30 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "AKT93G0RI4B06KIKRT073EJESFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "2b061830d4b9ef16", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "339" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:30 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "982DOJPVP65KPV4BTQ1Q7M7S3BVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "e5145ad1c7693d48", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "104" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "270" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:30 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "1915621502" ], "X-Amzn-Requestid": [ "I5PCBT1C4SCPNUQC2OBGE9CEFRVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJCIjp7IkJPT0wiOmZhbHNlfSwiU3QiOnsiUyI6ImIifSwiVSI6eyJOIjoiMCJ9LCJGIjp7Ik4iOiIwIn0sIkkiOnsiTiI6IjAifSwiRXRhZyI6eyJOVUxMIjp0cnVlfSwiTSI6eyJOVUxMIjp0cnVlfSwibmFtZSI6eyJTIjoidGVzdFJlcGxhY2VTdHJ1Y3QifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiZjUyYzczM2ItOWI5Yi00ZTk0LTllMGItMjBmMDFlYjhhZDlkIn19XX0sIlVucHJvY2Vzc2VkS2V5cyI6e319" } }, { "ID": "f103dc37dd6a8bdc", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "155" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "120" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:30 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "396270901" ], "X-Amzn-Requestid": [ "7PRS9B05B2V2OBDR83QCV0P06VVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLmR5bmFtb2RiLnYyMDEyMDgxMCNDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uIiwibWVzc2FnZSI6IlRoZSBjb25kaXRpb25hbCByZXF1ZXN0IGZhaWxlZCJ9" } }, { "ID": "9180ee4e6487bc6f", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "149" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:30 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "MF9G83B5GG19VLUM2SRM99GTI3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "9f051ba4afb88952", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "102" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "167" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:30 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2928140717" ], "X-Amzn-Requestid": [ "NQLM66M3TMIL31MKDFLMTQJ42FVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0UmV2aXNpb25NYXAifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiNTlhMzk2NTItNzQ5Ny00NGFiLWFjYTQtNGVmZTFjZTgyNWIyIn0sInMiOnsiUyI6ImEifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "0ca46660f32ff5dd", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "314" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:30 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "5SR2AEUK9OA3ALC1JQ7OKTOT2JVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "f654ad47d47f6695", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "314" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "120" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:30 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "396270901" ], "X-Amzn-Requestid": [ "DKBMAGR3ENL82B75B3M53QDMKJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLmR5bmFtb2RiLnYyMDEyMDgxMCNDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uIiwibWVzc2FnZSI6IlRoZSBjb25kaXRpb25hbCByZXF1ZXN0IGZhaWxlZCJ9" } }, { "ID": "973314d958356bc1", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "253" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:30 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "DQ6OJH0U4JMDRK3S433UPT01R7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "4dbba57b99daa9a1", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "105" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "271" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:30 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "957767178" ], "X-Amzn-Requestid": [ "SPIJJB4M0HBJKSA49Q8U2AB38FVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJCIjp7IkJPT0wiOmZhbHNlfSwiU3QiOnsiUyI6ImEifSwiVSI6eyJOIjoiMCJ9LCJGIjp7Ik4iOiIwIn0sIkkiOnsiTiI6IjAifSwiRXRhZyI6eyJOVUxMIjp0cnVlfSwiTSI6eyJOVUxMIjp0cnVlfSwibmFtZSI6eyJTIjoidGVzdFJldmlzaW9uU3RydWN0In0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6IjE4MDRmZGNkLTNhZDQtNDU3ZS04MjBiLThlNDQ3YTM3NWVhNyJ9fV19LCJVbnByb2Nlc3NlZEtleXMiOnt9fQ==" } }, { "ID": "b4aa261bd591cd83", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "418" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:30 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "GDPPIKE83H2O9RV4G1J2U5P667VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "2a1d9ed2635f95b0", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "418" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "120" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:31 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "396270901" ], "X-Amzn-Requestid": [ "VGFGMVH83PVUV44D3D80MKEU73VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLmR5bmFtb2RiLnYyMDEyMDgxMCNDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uIiwibWVzc2FnZSI6IlRoZSBjb25kaXRpb25hbCByZXF1ZXN0IGZhaWxlZCJ9" } }, { "ID": "0f0a7d3dfe3eaec3", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DescribeTable" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "599" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:31 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3022004566" ], "X-Amzn-Requestid": [ "94P1NIA9T189SGOHOHCIPMNJPVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJUYWJsZSI6eyJBdHRyaWJ1dGVEZWZpbml0aW9ucyI6W3siQXR0cmlidXRlTmFtZSI6Im5hbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9XSwiQ3JlYXRpb25EYXRlVGltZSI6MS43MjMwNzYwNzk3OTdFOSwiRGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZCI6ZmFsc2UsIkl0ZW1Db3VudCI6MCwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoibmFtZSIsIktleVR5cGUiOiJIQVNIIn1dLCJQcm92aXNpb25lZFRocm91Z2hwdXQiOnsiTnVtYmVyT2ZEZWNyZWFzZXNUb2RheSI6MCwiUmVhZENhcGFjaXR5VW5pdHMiOjUsIldyaXRlQ2FwYWNpdHlVbml0cyI6NX0sIlRhYmxlQXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMSIsIlRhYmxlSWQiOiI5N2U0OTNmNC1jZjU3LTQ2YmItOTc4Ny1iOGU4ZDk3ZjUwMDciLCJUYWJsZU5hbWUiOiJkb2NzdG9yZS10ZXN0LTEiLCJUYWJsZVNpemVCeXRlcyI6MCwiVGFibGVTdGF0dXMiOiJBQ1RJVkUiLCJXYXJtVGhyb3VnaHB1dCI6eyJSZWFkVW5pdHNQZXJTZWNvbmQiOjUsIlN0YXR1cyI6IkFDVElWRSIsIldyaXRlVW5pdHNQZXJTZWNvbmQiOjV9fX0=" } }, { "ID": "2f49535f2ae65323", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "688" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:31 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "649338559" ], "X-Amzn-Requestid": [ "DOLCJGMP43JEJDIMKOL5JVGRLVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6NCwiSXRlbXMiOlt7Im5hbWUiOnsiUyI6InRlc3RSZXBsYWNlTWFwIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImI5MmNjNWRjLTUyZjctNDY2MC1iMWQ5LTFjYzkzYzUyNWE5NiJ9LCJzIjp7IlMiOiJiIn19LHsibmFtZSI6eyJTIjoidGVzdFJldmlzaW9uTWFwIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImY4YTA1N2NmLWE1OTMtNGNhNi1iMTUzLTg1MjRjNzU5MjdiZSJ9LCJzIjp7IlMiOiJhIn19LHsiQiI6eyJCT09MIjpmYWxzZX0sIlN0Ijp7IlMiOiJiIn0sIlUiOnsiTiI6IjAifSwiRiI6eyJOIjoiMCJ9LCJJIjp7Ik4iOiIwIn0sIkV0YWciOnsiTlVMTCI6dHJ1ZX0sIk0iOnsiTlVMTCI6dHJ1ZX0sIm5hbWUiOnsiUyI6InRlc3RSZXBsYWNlU3RydWN0In0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6ImY1MmM3MzNiLTliOWItNGU5NC05ZTBiLTIwZjAxZWI4YWQ5ZCJ9fSx7IkIiOnsiQk9PTCI6ZmFsc2V9LCJTdCI6eyJTIjoiYSJ9LCJVIjp7Ik4iOiIwIn0sIkYiOnsiTiI6IjAifSwiSSI6eyJOIjoiMCJ9LCJFdGFnIjp7Ik5VTEwiOnRydWV9LCJNIjp7Ik5VTEwiOnRydWV9LCJuYW1lIjp7IlMiOiJ0ZXN0UmV2aXNpb25TdHJ1Y3QifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiMWNhMjRhZGYtNjE5My00NGU5LWI3MmMtMDc1M2U4NWYwOGE3In19XSwiU2Nhbm5lZENvdW50Ijo0fQ==" } }, { "ID": "fded72eee26f7462", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "73" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:31 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "09P8T162CKOQSNT7SEISQVDTKFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "c65ecb97237fbc3e", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "69" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:31 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "5C1M3V2HVK9C67E7R0H0OGDJ0BVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "b10b7ad0f7a23310", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "70" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:31 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "CBPJHI3RI90Q5ULDHV6BLTQ3HVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "a3963b13ebb81b2b", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "72" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:31 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "T635BBST99D2UCPNTTMBTBERD3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "65e3a31f16e46723", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "136" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:31 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "IF8GOFV98HE2IFEGIP0B2JEUANVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "3f7c6e37f4852336", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "223" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:31 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "6QR7IR10UNNBMHOBI5FCA0MULNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "3eb37ba1a56e2028", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "101" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "154" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:31 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3035621950" ], "X-Amzn-Requestid": [ "QRTQO16CPCCV9RSQLAR20EP05RVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJFdGFnIjp7IlMiOiJlMjIyYzkyNi00Y2JkLTQzMDgtYjQ3Ni02N2I5MTYyMmEzOWYifSwibmFtZSI6eyJTIjoidGVzdFJlcGxhY2VNYXAifSwicyI6eyJTIjoiYiJ9fV19LCJVbnByb2Nlc3NlZEtleXMiOnt9fQ==" } }, { "ID": "d3c526004d45ede2", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "252" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:31 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "60JORGPO478TDE2U5UFVGG8M37VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "ee53248b667122d3", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "339" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:31 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "79M0TKVFDJVCCL44OOLJ71UBIBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "962550842e3d317d", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "104" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "270" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:31 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "240382745" ], "X-Amzn-Requestid": [ "VAI2UK75M040351STJ708VV4EVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJCIjp7IkJPT0wiOmZhbHNlfSwiU3QiOnsiUyI6ImIifSwiVSI6eyJOIjoiMCJ9LCJGIjp7Ik4iOiIwIn0sIkkiOnsiTiI6IjAifSwiRXRhZyI6eyJTIjoiMDIwY2MzODUtOWM5My00MWVmLWI5NTMtMWMwNTJiYTNkY2MxIn0sIk0iOnsiTlVMTCI6dHJ1ZX0sIm5hbWUiOnsiUyI6InRlc3RSZXBsYWNlU3RydWN0In0sIkRvY3N0b3JlUmV2aXNpb24iOnsiTlVMTCI6dHJ1ZX19XX0sIlVucHJvY2Vzc2VkS2V5cyI6e319" } }, { "ID": "70cbc5645bc5c73a", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "155" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "120" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:31 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "396270901" ], "X-Amzn-Requestid": [ "RND6PRSPG81G7GDCALE8EOAMVJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLmR5bmFtb2RiLnYyMDEyMDgxMCNDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uIiwibWVzc2FnZSI6IlRoZSBjb25kaXRpb25hbCByZXF1ZXN0IGZhaWxlZCJ9" } }, { "ID": "5df318f681d2bcdc", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "137" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:32 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "09DTHKLEIRN8ESSEBT2C3O5VPVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "57b9fe45cc489063", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "102" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "155" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:32 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3252174522" ], "X-Amzn-Requestid": [ "P30CH30M49NRVNQ66AR5UM2L1JVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0UmV2aXNpb25NYXAifSwiRXRhZyI6eyJTIjoiYmE0ODA5MGQtOGUyMy00ODU5LTg5ZDMtNGNhMDJmYTUyMGM3In0sInMiOnsiUyI6ImEifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "9c50ede85d177289", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "290" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:32 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "OTRAMJQF3C6T8687HPP6C5C83VVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "cbcb218022b82664", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "290" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "120" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:32 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "396270901" ], "X-Amzn-Requestid": [ "FP2QLNBBIU01O1RUUQET77CSSBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLmR5bmFtb2RiLnYyMDEyMDgxMCNDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uIiwibWVzc2FnZSI6IlRoZSBjb25kaXRpb25hbCByZXF1ZXN0IGZhaWxlZCJ9" } }, { "ID": "f80951303dfec4c0", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "253" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:32 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "FI6OSTR740ICURH2OEO6DKFOQ7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "7672328cb15513f7", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "105" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "271" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:32 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2698108496" ], "X-Amzn-Requestid": [ "9U33QS6N4TN6E64MRA873J31VRVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJCIjp7IkJPT0wiOmZhbHNlfSwiU3QiOnsiUyI6ImEifSwiVSI6eyJOIjoiMCJ9LCJGIjp7Ik4iOiIwIn0sIkkiOnsiTiI6IjAifSwiRXRhZyI6eyJTIjoiMmJjMjg5MGUtMTE4OC00MThmLWI5MTUtMWIzOWRjYmVjMzZjIn0sIk0iOnsiTlVMTCI6dHJ1ZX0sIm5hbWUiOnsiUyI6InRlc3RSZXZpc2lvblN0cnVjdCJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7Ik5VTEwiOnRydWV9fV19LCJVbnByb2Nlc3NlZEtleXMiOnt9fQ==" } }, { "ID": "b1bf3763c1888fe4", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "406" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:32 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "B9FFPOLLVPK787K4BPKQO7FT5JVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "f45b946f916a4d74", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "406" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "120" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:32 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "396270901" ], "X-Amzn-Requestid": [ "FKQUK8KUAM9JBJ2EQI9GL7RMSJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLmR5bmFtb2RiLnYyMDEyMDgxMCNDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uIiwibWVzc2FnZSI6IlRoZSBjb25kaXRpb25hbCByZXF1ZXN0IGZhaWxlZCJ9" } } ] } ================================================ FILE: docstore/awsdynamodb/v2/testdata/TestConformance/SerializeRevision.replay ================================================ { "Initial": "AQAAAA7hTg5cDtnpQwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*", ".*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "ff1d858cc1f884b6", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DescribeTable" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "599" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:48 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3022004566" ], "X-Amzn-Requestid": [ "0S65EM704HO5SH5FLQ8BUF9617VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJUYWJsZSI6eyJBdHRyaWJ1dGVEZWZpbml0aW9ucyI6W3siQXR0cmlidXRlTmFtZSI6Im5hbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9XSwiQ3JlYXRpb25EYXRlVGltZSI6MS43MjMwNzYwNzk3OTdFOSwiRGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZCI6ZmFsc2UsIkl0ZW1Db3VudCI6MCwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoibmFtZSIsIktleVR5cGUiOiJIQVNIIn1dLCJQcm92aXNpb25lZFRocm91Z2hwdXQiOnsiTnVtYmVyT2ZEZWNyZWFzZXNUb2RheSI6MCwiUmVhZENhcGFjaXR5VW5pdHMiOjUsIldyaXRlQ2FwYWNpdHlVbml0cyI6NX0sIlRhYmxlQXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMSIsIlRhYmxlSWQiOiI5N2U0OTNmNC1jZjU3LTQ2YmItOTc4Ny1iOGU4ZDk3ZjUwMDciLCJUYWJsZU5hbWUiOiJkb2NzdG9yZS10ZXN0LTEiLCJUYWJsZVNpemVCeXRlcyI6MCwiVGFibGVTdGF0dXMiOiJBQ1RJVkUiLCJXYXJtVGhyb3VnaHB1dCI6eyJSZWFkVW5pdHNQZXJTZWNvbmQiOjUsIlN0YXR1cyI6IkFDVElWRSIsIldyaXRlVW5pdHNQZXJTZWNvbmQiOjV9fX0=" } }, { "ID": "a93fd8cfdc0a00f0", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "310" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:48 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2791681388" ], "X-Amzn-Requestid": [ "422LSCC6UHL5CGA7PPUHHVQTBFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MywiSXRlbXMiOlt7ImEiOnsiUyI6Im9uZSJ9LCJuYW1lIjp7IlMiOiJxa2YxIn0sIkV0YWciOnsiUyI6ImNjMGM2MzhiLTI0ZDAtNDQ5Zi05OGY1LTIyYzkzMzFhMjE1ZiJ9fSx7ImEiOnsiUyI6InRocmVlIn0sIm5hbWUiOnsiUyI6InFrZjMifSwiRXRhZyI6eyJTIjoiNTNlYjMyYjItZjAwOS00YWYzLWJjNDYtZDBhN2ZmNjc0N2VjIn19LHsiYSI6eyJTIjoidHdvIn0sIm5hbWUiOnsiUyI6InFrZjIifSwiRXRhZyI6eyJTIjoiNDYwNjYzY2MtZjZkZi00Yzc3LTgxNWItYjYzM2U3MTM0MTU4In19XSwiU2Nhbm5lZENvdW50IjozfQ==" } }, { "ID": "13c25f72a6e2e6e8", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "59" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:48 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "MAL4B3KTBRUB9PRAHE4QKRHIFBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "24145eda66a0abd4", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "59" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:48 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "U0U68LRBQUBTSMQQVP6O13TP4NVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "25c9a6750b601ca5", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "59" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:48 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "QS47HNJ4LC0C9T0LII31IU9H37VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "a1c5e3d18ba145aa", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "246" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:48 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "5297C0V3D61JJH2P56VSN8SCVNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } } ] } ================================================ FILE: docstore/awsdynamodb/v2/testdata/TestConformance/Update.replay ================================================ { "Initial": "AQAAAA7hTg5REYcV+gAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*", ".*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "97279fcbd071a539", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DescribeTable" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "599" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:37 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3022004566" ], "X-Amzn-Requestid": [ "DNIIFR1F0R74LKP6SQB2NPT1AVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJUYWJsZSI6eyJBdHRyaWJ1dGVEZWZpbml0aW9ucyI6W3siQXR0cmlidXRlTmFtZSI6Im5hbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9XSwiQ3JlYXRpb25EYXRlVGltZSI6MS43MjMwNzYwNzk3OTdFOSwiRGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZCI6ZmFsc2UsIkl0ZW1Db3VudCI6MCwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoibmFtZSIsIktleVR5cGUiOiJIQVNIIn1dLCJQcm92aXNpb25lZFRocm91Z2hwdXQiOnsiTnVtYmVyT2ZEZWNyZWFzZXNUb2RheSI6MCwiUmVhZENhcGFjaXR5VW5pdHMiOjUsIldyaXRlQ2FwYWNpdHlVbml0cyI6NX0sIlRhYmxlQXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMSIsIlRhYmxlSWQiOiI5N2U0OTNmNC1jZjU3LTQ2YmItOTc4Ny1iOGU4ZDk3ZjUwMDciLCJUYWJsZU5hbWUiOiJkb2NzdG9yZS10ZXN0LTEiLCJUYWJsZVNpemVCeXRlcyI6MCwiVGFibGVTdGF0dXMiOiJBQ1RJVkUiLCJXYXJtVGhyb3VnaHB1dCI6eyJSZWFkVW5pdHNQZXJTZWNvbmQiOjUsIlN0YXR1cyI6IkFDVElWRSIsIldyaXRlVW5pdHNQZXJTZWNvbmQiOjV9fX0=" } }, { "ID": "f1e5eb88932f73e4", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "355" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:37 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "4081904767" ], "X-Amzn-Requestid": [ "CTTBUTHUE9MJAKDM8GH92D47J3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6MiwiSXRlbXMiOlt7Im5hbWUiOnsiUyI6InRlc3REZWxldGVNYXAifSwiRXRhZyI6eyJTIjoiY2Q4OGQ4OWItOTQyZi00NDg5LWI0YzAtY2U2NTY5MDYwOWUxIn0sImIiOnsiQk9PTCI6dHJ1ZX19LHsiQiI6eyJCT09MIjp0cnVlfSwiU3QiOnsiTlVMTCI6dHJ1ZX0sIlUiOnsiTiI6IjAifSwiRiI6eyJOIjoiMCJ9LCJJIjp7Ik4iOiIwIn0sIkV0YWciOnsiUyI6ImE0ZDU1MzdlLTRlN2EtNGIxZC04YmE5LTUzZWZjNzAzZjU1YSJ9LCJNIjp7Ik5VTEwiOnRydWV9LCJuYW1lIjp7IlMiOiJ0ZXN0RGVsZXRlU3RydWN0In0sIkRvY3N0b3JlUmV2aXNpb24iOnsiTlVMTCI6dHJ1ZX19XSwiU2Nhbm5lZENvdW50IjoyfQ==" } }, { "ID": "ae589cf6f89555f1", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "71" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:37 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "OP78N0KQUGPRU4LB9IB0P6ILLNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "199b350291954a59", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "68" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:37 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "E5EGF74TSLFHEGAUAED4IOOAPVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "f67da1a759f8c508", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "191" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:37 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "Q0ODKPG4BG7J217OGGLTRU0NI3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "cbea9d30690790b5", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "462" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.UpdateItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:37 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "CH2LBJ3JVL67VJKR7U91RPS5GJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "9f81c8a56e312774", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "100" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "209" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:37 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "4012359614" ], "X-Amzn-Requestid": [ "0J48EIHL2HJ35B8C2BJT7IDN97VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiI0ZWUyYTVmYS1mYWIzLTRmOWItYmM3ZC1kNDA2ODVhMWJmNjkifSwiYSI6eyJTIjoiWCJ9LCJjIjp7IlMiOiJDIn0sIm0iOnsiTiI6IjMifSwibiI6eyJOIjoiMi41In0sIm5hbWUiOnsiUyI6InRlc3RVcGRhdGVNYXAifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "09a1dd720d28857b", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "150" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:37 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "3ON7FR8B26H0AKSE0UFUKFMC47VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "e13a18d08b5c18f3", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "383" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.UpdateItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:38 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "3DPDC3U22OHRJS9CBJU5O4CJKVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "aae1070246e52a94", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "103" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "182" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:38 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2349206789" ], "X-Amzn-Requestid": [ "0I9FVIC2FDRUN301T025QG6V8BVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiIzODVhMjFhMi1hNDdkLTRmMDQtOGJkOS1mNjgyZjFiZGJhZDQifSwiYSI6eyJTIjoiWCJ9LCJtIjp7Ik4iOiIzIn0sIm5hbWUiOnsiUyI6InRlc3RVcGRhdGVNYXBXcnQifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "b3a7a7df54d723a3", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "180" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:38 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "H96RKPD30NQCLPSTM9TBV1PAGVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "75be5207f44a9c20", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "397" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.UpdateItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:38 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "MHR6JMREF9MBAG3PIGQS45RT9BVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "83d51865dc606bf1", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "103" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "214" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:38 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "750229251" ], "X-Amzn-Requestid": [ "IF3O4AOVPGTIDSGUBA88F5VOP7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiI3OTg3N2RiZi1mMThjLTQwNjEtYTZhMy0wYWIxMDBkYzI1NTYifSwiYSI6eyJTIjoiQSJ9LCJpIjp7Ik4iOiIzLjUifSwibSI6eyJOIjoiMyJ9LCJuIjp7Ik4iOiIyLjUifSwibmFtZSI6eyJTIjoidGVzdFVwZGF0ZU1hcEluYyJ9fV19LCJVbnByb2Nlc3NlZEtleXMiOnt9fQ==" } }, { "ID": "2347c0c6e091fab7", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "254" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:38 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "FTQKHU6RVADSIE59VKVD7R80ENVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "8e252afe48a12f3f", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "422" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.UpdateItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:38 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "21FN5JQ095IS88F11H3VMQATIRVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "b337b590bb162ac1", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "103" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "259" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:38 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2874543979" ], "X-Amzn-Requestid": [ "UPR72LSNCO5HKGD3LOHF8G5IGNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJCIjp7IkJPT0wiOmZhbHNlfSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiMDVhODYwZGUtZGI2NC00ZTVkLTg2YmEtYjNiMjRjOGZmZmIwIn0sIkV0YWciOnsiTlVMTCI6dHJ1ZX0sIkYiOnsiTiI6IjAuNSJ9LCJNIjp7Ik5VTEwiOnRydWV9LCJTdCI6eyJTIjoic3RyIn0sIlUiOnsiTiI6IjQifSwibmFtZSI6eyJTIjoidGVzdFVwZGF0ZVN0cnVjdCJ9fV19LCJVbnByb2Nlc3NlZEtleXMiOnt9fQ==" } }, { "ID": "fed31fd06c4abb8e", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "255" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:38 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "SQ28KKT679784GQJANLTPKC11FVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "a37c27a2afd2274f", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "389" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.UpdateItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:38 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "HMVQ8VU22P844K6I9TFIE2FQJFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "2b7ce5dbe35c6939", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "106" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "260" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:38 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "220372503" ], "X-Amzn-Requestid": [ "JNTH4AQMHTGJ5I3LQDRE7L7BLNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJCIjp7IkJPT0wiOmZhbHNlfSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiOTYzZDNjY2QtOGVkMy00ZDQxLWI4ZjctN2IwYzIzZTBkMzA1In0sIkV0YWciOnsiTlVMTCI6dHJ1ZX0sIkYiOnsiTiI6IjAifSwiTSI6eyJOVUxMIjp0cnVlfSwiU3QiOnsiUyI6InN0ciJ9LCJVIjp7Ik4iOiI0In0sIm5hbWUiOnsiUyI6InRlc3RVcGRhdGVTdHJ1Y3RXcnQifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "721d0b30c85a0a38", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "257" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:38 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "IHCT27E6K5I8T7C6B8R6LN379VVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "3b202b1f9f85ace0", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "367" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.UpdateItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:38 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "FTF0DOQUR9T68FBCCG7DDKRI8RVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "9a604deda43777c1", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "106" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "275" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:38 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "1046705730" ], "X-Amzn-Requestid": [ "00G90PP2AAPS6DHO8QI8TU3G1NVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJCIjp7IkJPT0wiOmZhbHNlfSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiN2U3Y2M2OTQtNWNjMy00OWJhLTkwZGMtNjYwNmUyOWIzOTlmIn0sIkV0YWciOnsiTlVMTCI6dHJ1ZX0sIkYiOnsiTiI6IjAuNSJ9LCJJIjp7Ik4iOiIxIn0sIk0iOnsiTlVMTCI6dHJ1ZX0sIlN0Ijp7IlMiOiJzdCJ9LCJVIjp7Ik4iOiI0In0sIm5hbWUiOnsiUyI6InRlc3RVcGRhdGVTdHJ1Y3RJbmMifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "809d543f4aef0c84", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "243" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.UpdateItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "120" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:38 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "396270901" ], "X-Amzn-Requestid": [ "QDMI07J27535QLID9VGK84GJ7NVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLmR5bmFtb2RiLnYyMDEyMDgxMCNDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uIiwibWVzc2FnZSI6IlRoZSBjb25kaXRpb25hbCByZXF1ZXN0IGZhaWxlZCJ9" } }, { "ID": "fa7e9b0b1d09e119", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "149" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:39 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "7RCEFVOECTJ8VPCIE7KHL6B2I7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "b4d740acc8204ea1", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "102" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "167" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:39 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "1233382474" ], "X-Amzn-Requestid": [ "7RPIAEE93JU93G1NASSRL5QJR7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0UmV2aXNpb25NYXAifSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiN2VmZTkzMjItZjYzYi00YzQwLWIzNWMtMjQwMmM3ZWI2ZWY3In0sInMiOnsiUyI6ImEifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "7c657e6e45f87898", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "353" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.UpdateItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:39 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "TGMIVG516F77IS5GSU8VE3QO6NVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "5121a20ec0f3e8e3", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "353" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.UpdateItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "120" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:39 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "396270901" ], "X-Amzn-Requestid": [ "SH8CM23ODQO1QC6NDNFS3S92SFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLmR5bmFtb2RiLnYyMDEyMDgxMCNDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uIiwibWVzc2FnZSI6IlRoZSBjb25kaXRpb25hbCByZXF1ZXN0IGZhaWxlZCJ9" } }, { "ID": "69981adaf57776c8", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "253" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:39 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "NTBPJCUG5E94S8F5ISTM4E121JVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "216f8b6b0cb494e9", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "105" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "271" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:39 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "4117684440" ], "X-Amzn-Requestid": [ "LAGVS6B6Q265O0KEGRA7KPBFHFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJCIjp7IkJPT0wiOmZhbHNlfSwiU3QiOnsiUyI6ImEifSwiVSI6eyJOIjoiMCJ9LCJGIjp7Ik4iOiIwIn0sIkkiOnsiTiI6IjAifSwiRXRhZyI6eyJOVUxMIjp0cnVlfSwiTSI6eyJOVUxMIjp0cnVlfSwibmFtZSI6eyJTIjoidGVzdFJldmlzaW9uU3RydWN0In0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6IjE2YWRkMjRmLTkwMjEtNDdmZC1iYzAyLTE2MTM4ODg2M2ZjMiJ9fV19LCJVbnByb2Nlc3NlZEtleXMiOnt9fQ==" } }, { "ID": "f2e08498b245d0b1", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "356" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.UpdateItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:39 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "PE993LS4VQ1OUNP1TT0CRA196BVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "d0eec23ba918de24", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "356" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.UpdateItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "120" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:39 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "396270901" ], "X-Amzn-Requestid": [ "JU6JQHD2BVRV9056UPG73JGHOJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLmR5bmFtb2RiLnYyMDEyMDgxMCNDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uIiwibWVzc2FnZSI6IlRoZSBjb25kaXRpb25hbCByZXF1ZXN0IGZhaWxlZCJ9" } }, { "ID": "01d0804138d25f9a", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DescribeTable" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "599" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:39 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3022004566" ], "X-Amzn-Requestid": [ "29U4DSKPCPLUKO3IO98TL2H82JVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJUYWJsZSI6eyJBdHRyaWJ1dGVEZWZpbml0aW9ucyI6W3siQXR0cmlidXRlTmFtZSI6Im5hbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9XSwiQ3JlYXRpb25EYXRlVGltZSI6MS43MjMwNzYwNzk3OTdFOSwiRGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZCI6ZmFsc2UsIkl0ZW1Db3VudCI6MCwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoibmFtZSIsIktleVR5cGUiOiJIQVNIIn1dLCJQcm92aXNpb25lZFRocm91Z2hwdXQiOnsiTnVtYmVyT2ZEZWNyZWFzZXNUb2RheSI6MCwiUmVhZENhcGFjaXR5VW5pdHMiOjUsIldyaXRlQ2FwYWNpdHlVbml0cyI6NX0sIlRhYmxlQXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMSIsIlRhYmxlSWQiOiI5N2U0OTNmNC1jZjU3LTQ2YmItOTc4Ny1iOGU4ZDk3ZjUwMDciLCJUYWJsZU5hbWUiOiJkb2NzdG9yZS10ZXN0LTEiLCJUYWJsZVNpemVCeXRlcyI6MCwiVGFibGVTdGF0dXMiOiJBQ1RJVkUiLCJXYXJtVGhyb3VnaHB1dCI6eyJSZWFkVW5pdHNQZXJTZWNvbmQiOjUsIlN0YXR1cyI6IkFDVElWRSIsIldyaXRlVW5pdHNQZXJTZWNvbmQiOjV9fX0=" } }, { "ID": "9ec8cd105e739fe5", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Scan" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1441" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:39 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "3140913616" ], "X-Amzn-Requestid": [ "CJ4M1QPVDQ44B9B9MCCI5GNOV7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJDb3VudCI6OCwiSXRlbXMiOlt7IkIiOnsiQk9PTCI6ZmFsc2V9LCJTdCI6eyJTIjoic3RyIn0sIlUiOnsiTiI6IjQifSwiRiI6eyJOIjoiMC41In0sIkV0YWciOnsiTlVMTCI6dHJ1ZX0sIk0iOnsiTlVMTCI6dHJ1ZX0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6IjA1YTg2MGRlLWRiNjQtNGU1ZC04NmJhLWIzYjI0YzhmZmZiMCJ9LCJuYW1lIjp7IlMiOiJ0ZXN0VXBkYXRlU3RydWN0In19LHsiRG9jc3RvcmVSZXZpc2lvbiI6eyJTIjoiOTE2ZmZjZmItMGMxYS00YWRiLWJmZWYtYTY4MDc3MDA1MWNkIn0sIm5hbWUiOnsiUyI6InRlc3RSZXZpc2lvbk1hcCJ9LCJzIjp7IlMiOiJjIn19LHsiQiI6eyJCT09MIjpmYWxzZX0sIlN0Ijp7IlMiOiJzdHIifSwiVSI6eyJOIjoiNCJ9LCJGIjp7Ik4iOiIwIn0sIkV0YWciOnsiTlVMTCI6dHJ1ZX0sIk0iOnsiTlVMTCI6dHJ1ZX0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6Ijk2M2QzY2NkLThlZDMtNGQ0MS1iOGY3LTdiMGMyM2UwZDMwNSJ9LCJuYW1lIjp7IlMiOiJ0ZXN0VXBkYXRlU3RydWN0V3J0In19LHsiQiI6eyJCT09MIjpmYWxzZX0sIlN0Ijp7IlMiOiJzdCJ9LCJVIjp7Ik4iOiI0In0sIkYiOnsiTiI6IjAuNSJ9LCJJIjp7Ik4iOiIxIn0sIkV0YWciOnsiTlVMTCI6dHJ1ZX0sIk0iOnsiTlVMTCI6dHJ1ZX0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6IjdlN2NjNjk0LTVjYzMtNDliYS05MGRjLTY2MDZlMjliMzk5ZiJ9LCJuYW1lIjp7IlMiOiJ0ZXN0VXBkYXRlU3RydWN0SW5jIn19LHsiYSI6eyJTIjoiQSJ9LCJpIjp7Ik4iOiIzLjUifSwibSI6eyJOIjoiMyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiI3OTg3N2RiZi1mMThjLTQwNjEtYTZhMy0wYWIxMDBkYzI1NTYifSwibiI6eyJOIjoiMi41In0sIm5hbWUiOnsiUyI6InRlc3RVcGRhdGVNYXBJbmMifX0seyJhIjp7IlMiOiJYIn0sImMiOnsiUyI6IkMifSwibSI6eyJOIjoiMyJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiI0ZWUyYTVmYS1mYWIzLTRmOWItYmM3ZC1kNDA2ODVhMWJmNjkifSwibiI6eyJOIjoiMi41In0sIm5hbWUiOnsiUyI6InRlc3RVcGRhdGVNYXAifX0seyJCIjp7IkJPT0wiOmZhbHNlfSwiU3QiOnsiUyI6ImEifSwicyI6eyJTIjoiYyJ9LCJVIjp7Ik4iOiIwIn0sIkYiOnsiTiI6IjAifSwiSSI6eyJOIjoiMCJ9LCJFdGFnIjp7Ik5VTEwiOnRydWV9LCJNIjp7Ik5VTEwiOnRydWV9LCJEb2NzdG9yZVJldmlzaW9uIjp7IlMiOiIxOGU3OTU4YS05Mzk0LTQ0NmEtYTY3OS0wYjljNjZlNjEzZmMifSwibmFtZSI6eyJTIjoidGVzdFJldmlzaW9uU3RydWN0In19LHsiYSI6eyJTIjoiWCJ9LCJtIjp7Ik4iOiIzIn0sIkRvY3N0b3JlUmV2aXNpb24iOnsiUyI6IjM4NWEyMWEyLWE0N2QtNGYwNC04YmQ5LWY2ODJmMWJkYmFkNCJ9LCJuYW1lIjp7IlMiOiJ0ZXN0VXBkYXRlTWFwV3J0In19XSwiU2Nhbm5lZENvdW50Ijo4fQ==" } }, { "ID": "04823cda9610a4b0", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "71" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:39 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "4EAOUL7NI2C66H9D027VBLGMP3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "c67fc44827956491", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "74" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:39 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "P808M641HOS532G0CJDIO306T7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "c1f37175871e158f", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "74" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:39 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "VQ9NLVU0IOA2B62EDP6EUJEQ9JVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "d56e30890e00e785", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "71" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:39 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "S47VIH3FOSCUCA98JT223PNS0FVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "320cf7f1cd5c1731", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "68" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:39 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "MF2MD1JD2M4BLV6QDR8GI0560FVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "2c0036f49a0bd440", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "73" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:39 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "MIDUVBD4F0L9A7KRFDVATIF8RFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "3c337fae16e9b5a4", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "70" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:39 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "MJNACBI9D4R1S8IU7A3CQKKFNVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "65383197e204595f", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "71" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DeleteItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:39 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "R8ECN7AINV90MB8LJRLJ4VN5LVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "6332ee0828e56bd3", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "179" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:39 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "QRHG6JAGVEG3A177K8PE6JTFLBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "2c93e8a118a126b2", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "450" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.UpdateItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:40 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "5QHP6EG1NG3NGASJNLAJB4NI8RVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "151a06df2e66315f", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "100" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "197" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:40 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2863006192" ], "X-Amzn-Requestid": [ "Q7QVOR8SFEFIFL5GL0966GMUANVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJFdGFnIjp7IlMiOiJmZWVkYzcyNC1iZGUzLTQ3YzktYjhjZi05Njg4MDljZWQ0M2IifSwiYSI6eyJTIjoiWCJ9LCJjIjp7IlMiOiJDIn0sIm0iOnsiTiI6IjMifSwibiI6eyJOIjoiMi41In0sIm5hbWUiOnsiUyI6InRlc3RVcGRhdGVNYXAifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "a651f34624d316a4", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "138" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:40 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "6TI9DVC5L9694F166DOU2726GBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "d08674e9c1c9312a", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "371" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.UpdateItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:40 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "8NNISI7R2OGJKK2GVUBLQOM2ERVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "531aa7f1a121a437", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "103" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "170" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:40 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2152499647" ], "X-Amzn-Requestid": [ "ODPSKSUMR20NMEEBRJAL9AIDDVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJFdGFnIjp7IlMiOiI0Yzk5M2VhMy0wOGQxLTQxNzUtYmI0Mi0xMDdlMDkwNzZjZmEifSwiYSI6eyJTIjoiWCJ9LCJtIjp7Ik4iOiIzIn0sIm5hbWUiOnsiUyI6InRlc3RVcGRhdGVNYXBXcnQifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "93e81c09ca96d9d8", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "168" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:40 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "4NU3O39SNGPIT3C7IQT0A1EIM7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "c532c8059040ad65", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "385" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.UpdateItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:40 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "9H84KB22LSCJJG6VKUCV1HNTL7VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "c637bc0391ccc8ce", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "103" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "202" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:40 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "1415525352" ], "X-Amzn-Requestid": [ "3UK71FU2TODVHP051M9RK8M927VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJFdGFnIjp7IlMiOiJlNmNhYTM4Yi1lMDRlLTQ3NDQtYTkyMi04YmYxYzYyYjUyN2MifSwiYSI6eyJTIjoiQSJ9LCJpIjp7Ik4iOiIzLjUifSwibSI6eyJOIjoiMyJ9LCJuIjp7Ik4iOiIyLjUifSwibmFtZSI6eyJTIjoidGVzdFVwZGF0ZU1hcEluYyJ9fV19LCJVbnByb2Nlc3NlZEtleXMiOnt9fQ==" } }, { "ID": "a6df211ab7dd1057", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "254" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:40 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "BEMP1P2GRDIR580S84TDI3DAA3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "0af5bcff6cfd0d4d", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "410" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.UpdateItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:40 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "FF3A9NGBFI3OUICOK4U9PHB7GJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "deb5482eac198b20", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "103" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "259" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:40 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "1129413683" ], "X-Amzn-Requestid": [ "JI48CTG6JI9JO4FSB0K92F79NVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJCIjp7IkJPT0wiOmZhbHNlfSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJOVUxMIjp0cnVlfSwiRXRhZyI6eyJTIjoiZTk0YjQ3NDYtMTBmZi00ZDY1LTkxZjEtOTQ2MGZkZmUwYTUxIn0sIkYiOnsiTiI6IjAuNSJ9LCJNIjp7Ik5VTEwiOnRydWV9LCJTdCI6eyJTIjoic3RyIn0sIlUiOnsiTiI6IjQifSwibmFtZSI6eyJTIjoidGVzdFVwZGF0ZVN0cnVjdCJ9fV19LCJVbnByb2Nlc3NlZEtleXMiOnt9fQ==" } }, { "ID": "4a92e614eb293cfb", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "255" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:40 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "BFEE381LGPDO9FV356UMQKDR2BVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "0fc7619324d1174a", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "377" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.UpdateItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:40 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "7J5E8A1S5QEK0G58CSRJIB9BPRVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "8ac07b634c424827", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "106" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "260" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:40 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "4055684817" ], "X-Amzn-Requestid": [ "N434122O9B9DP4EMULDN3T95AJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJCIjp7IkJPT0wiOmZhbHNlfSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJOVUxMIjp0cnVlfSwiRXRhZyI6eyJTIjoiZGU3MDk5MWUtNzBjNC00NGQ5LTkxYmItYmEwNGJjZjg2ZThmIn0sIkYiOnsiTiI6IjAifSwiTSI6eyJOVUxMIjp0cnVlfSwiU3QiOnsiUyI6InN0ciJ9LCJVIjp7Ik4iOiI0In0sIm5hbWUiOnsiUyI6InRlc3RVcGRhdGVTdHJ1Y3RXcnQifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "9f906309fed965f6", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "257" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:40 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "5Q00A2PTS2SQ1DTGI4646JI9GBVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "39a442ecf7b765a1", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "355" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.UpdateItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:40 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "M8FBIBOCL8RSQPEABE4GQ28HMJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "46578f41290c70a2", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "106" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "275" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:41 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "82536726" ], "X-Amzn-Requestid": [ "USSI7S9HQ0RVAG078MGG3723FNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJCIjp7IkJPT0wiOmZhbHNlfSwiRG9jc3RvcmVSZXZpc2lvbiI6eyJOVUxMIjp0cnVlfSwiRXRhZyI6eyJTIjoiZDQ4NmM2OTUtMGI3Ni00OTg5LTk1ZDctYWRjMGUyOWJhZGNhIn0sIkYiOnsiTiI6IjAuNSJ9LCJJIjp7Ik4iOiIxIn0sIk0iOnsiTlVMTCI6dHJ1ZX0sIlN0Ijp7IlMiOiJzdCJ9LCJVIjp7Ik4iOiI0In0sIm5hbWUiOnsiUyI6InRlc3RVcGRhdGVTdHJ1Y3RJbmMifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "e886f9a55918ab14", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "243" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.UpdateItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "120" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:41 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "396270901" ], "X-Amzn-Requestid": [ "RIKP8LBOT84KLQSGTR3A3AG75NVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLmR5bmFtb2RiLnYyMDEyMDgxMCNDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uIiwibWVzc2FnZSI6IlRoZSBjb25kaXRpb25hbCByZXF1ZXN0IGZhaWxlZCJ9" } }, { "ID": "28c43344f230595e", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "137" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:41 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "1U6C74MCVI545GK3HEPAQRDL87VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "16639f48158a5aba", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "102" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "155" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:41 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "589922104" ], "X-Amzn-Requestid": [ "JOU7NJB8891FK46Q2LSR8DQ3IRVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJuYW1lIjp7IlMiOiJ0ZXN0UmV2aXNpb25NYXAifSwiRXRhZyI6eyJTIjoiMDhmNDI3MjMtODg0MS00MjUxLWI4YmYtYTgxYTNiNDVlMjk3In0sInMiOnsiUyI6ImEifX1dfSwiVW5wcm9jZXNzZWRLZXlzIjp7fX0=" } }, { "ID": "a4c60fdc9c1f13fd", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "341" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.UpdateItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:41 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "R418JBFCVH0A1OUK2AG00F86UVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "d9f272e1038051ba", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "341" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.UpdateItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "120" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:41 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "396270901" ], "X-Amzn-Requestid": [ "MQMS1KHE904D141UEUUS4E7IKVVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLmR5bmFtb2RiLnYyMDEyMDgxMCNDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uIiwibWVzc2FnZSI6IlRoZSBjb25kaXRpb25hbCByZXF1ZXN0IGZhaWxlZCJ9" } }, { "ID": "95271555cd17a729", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "253" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.PutItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:41 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "VB3QCQT10CU6PP37LFLMMSRUL3VV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "ba14e2c29d315535", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "105" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.BatchGetItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "271" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:41 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2956891473" ], "X-Amzn-Requestid": [ "P6E102D6AQF4IVCH0F1R11FE4NVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJSZXNwb25zZXMiOnsiZG9jc3RvcmUtdGVzdC0xIjpbeyJCIjp7IkJPT0wiOmZhbHNlfSwiU3QiOnsiUyI6ImEifSwiVSI6eyJOIjoiMCJ9LCJGIjp7Ik4iOiIwIn0sIkkiOnsiTiI6IjAifSwiRXRhZyI6eyJTIjoiZmQ1ZWI1ZjktNTEyYS00NjlkLTg0MjMtOTk1ZDlmYTAyY2VjIn0sIk0iOnsiTlVMTCI6dHJ1ZX0sIm5hbWUiOnsiUyI6InRlc3RSZXZpc2lvblN0cnVjdCJ9LCJEb2NzdG9yZVJldmlzaW9uIjp7Ik5VTEwiOnRydWV9fV19LCJVbnByb2Nlc3NlZEtleXMiOnt9fQ==" } }, { "ID": "4360702b0312d691", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "344" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.UpdateItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:41 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "2745614147" ], "X-Amzn-Requestid": [ "V18MM5CCUA64GREFNT8I7M7L7RVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "e30=" } }, { "ID": "a83a5cc4fc01b8d3", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "344" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.UpdateItem" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "120" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:41 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "396270901" ], "X-Amzn-Requestid": [ "B7LVQDKKA68IRTG7F0S4P27TNJVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLmR5bmFtb2RiLnYyMDEyMDgxMCNDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uIiwibWVzc2FnZSI6IlRoZSBjb25kaXRpb25hbCByZXF1ZXN0IGZhaWxlZCJ9" } } ] } ================================================ FILE: docstore/awsdynamodb/v2/testdata/TestQueryErrors.replay ================================================ { "Initial": "AQAAAA7hTg5kGwV5zgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*", ".*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "b6e124d6ee8313a8", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.DescribeTable" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1609" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:56 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "298093499" ], "X-Amzn-Requestid": [ "2688U2MR89VKRQTT5E8LPN81PFVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJUYWJsZSI6eyJBdHRyaWJ1dGVEZWZpbml0aW9ucyI6W3siQXR0cmlidXRlTmFtZSI6IkdhbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9LHsiQXR0cmlidXRlTmFtZSI6IlBsYXllciIsIkF0dHJpYnV0ZVR5cGUiOiJTIn0seyJBdHRyaWJ1dGVOYW1lIjoiU2NvcmUiLCJBdHRyaWJ1dGVUeXBlIjoiTiJ9LHsiQXR0cmlidXRlTmFtZSI6IlRpbWUiLCJBdHRyaWJ1dGVUeXBlIjoiUyJ9XSwiQ3JlYXRpb25EYXRlVGltZSI6MS43MjMwNzYwODA2OTVFOSwiRGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZCI6ZmFsc2UsIkdsb2JhbFNlY29uZGFyeUluZGV4ZXMiOlt7IkluZGV4QXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMi9pbmRleC9nbG9iYWwiLCJJbmRleE5hbWUiOiJnbG9iYWwiLCJJbmRleFNpemVCeXRlcyI6MTE4LCJJbmRleFN0YXR1cyI6IkFDVElWRSIsIkl0ZW1Db3VudCI6MSwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoiUGxheWVyIiwiS2V5VHlwZSI6IkhBU0gifSx7IkF0dHJpYnV0ZU5hbWUiOiJUaW1lIiwiS2V5VHlwZSI6IlJBTkdFIn1dLCJQcm9qZWN0aW9uIjp7IlByb2plY3Rpb25UeXBlIjoiQUxMIn0sIlByb3Zpc2lvbmVkVGhyb3VnaHB1dCI6eyJOdW1iZXJPZkRlY3JlYXNlc1RvZGF5IjowLCJSZWFkQ2FwYWNpdHlVbml0cyI6NSwiV3JpdGVDYXBhY2l0eVVuaXRzIjo1fSwiV2FybVRocm91Z2hwdXQiOnsiUmVhZFVuaXRzUGVyU2Vjb25kIjo1LCJTdGF0dXMiOiJBQ1RJVkUiLCJXcml0ZVVuaXRzUGVyU2Vjb25kIjo1fX1dLCJJdGVtQ291bnQiOjEsIktleVNjaGVtYSI6W3siQXR0cmlidXRlTmFtZSI6IkdhbWUiLCJLZXlUeXBlIjoiSEFTSCJ9LHsiQXR0cmlidXRlTmFtZSI6IlBsYXllciIsIktleVR5cGUiOiJSQU5HRSJ9XSwiTG9jYWxTZWNvbmRhcnlJbmRleGVzIjpbeyJJbmRleEFybiI6ImFybjphd3M6ZHluYW1vZGI6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3Njp0YWJsZS9kb2NzdG9yZS10ZXN0LTIvaW5kZXgvbG9jYWwiLCJJbmRleE5hbWUiOiJsb2NhbCIsIkluZGV4U2l6ZUJ5dGVzIjoxMTgsIkl0ZW1Db3VudCI6MSwiS2V5U2NoZW1hIjpbeyJBdHRyaWJ1dGVOYW1lIjoiR2FtZSIsIktleVR5cGUiOiJIQVNIIn0seyJBdHRyaWJ1dGVOYW1lIjoiU2NvcmUiLCJLZXlUeXBlIjoiUkFOR0UifV0sIlByb2plY3Rpb24iOnsiUHJvamVjdGlvblR5cGUiOiJBTEwifX1dLCJQcm92aXNpb25lZFRocm91Z2hwdXQiOnsiTnVtYmVyT2ZEZWNyZWFzZXNUb2RheSI6MCwiUmVhZENhcGFjaXR5VW5pdHMiOjUsIldyaXRlQ2FwYWNpdHlVbml0cyI6NX0sIlRhYmxlQXJuIjoiYXJuOmF3czpkeW5hbW9kYjp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OnRhYmxlL2RvY3N0b3JlLXRlc3QtMiIsIlRhYmxlSWQiOiIwZDRmOTk4My1kOGE5LTRhZjEtYTY0NC05YmE3M2NlMGYyMjciLCJUYWJsZU5hbWUiOiJkb2NzdG9yZS10ZXN0LTIiLCJUYWJsZVNpemVCeXRlcyI6MTE4LCJUYWJsZVN0YXR1cyI6IkFDVElWRSIsIldhcm1UaHJvdWdocHV0Ijp7IlJlYWRVbml0c1BlclNlY29uZCI6NSwiU3RhdHVzIjoiQUNUSVZFIiwiV3JpdGVVbml0c1BlclNlY29uZCI6NX19fQ==" } }, { "ID": "74a2d2a9b2d37c7b", "Request": { "Method": "POST", "URL": "https://dynamodb.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "identity" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "175" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "DynamoDB_20120810.Query" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "Q0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "165" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:33:56 GMT" ], "Server": [ "Server" ], "X-Amz-Crc32": [ "1880536678" ], "X-Amzn-Requestid": [ "LMQR06C1F1OC7T8K8QPGD6JIDNVV4KQNSO5AEMVJF66Q9ASUAAJG" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uLmNvcmFsLnZhbGlkYXRlI1ZhbGlkYXRpb25FeGNlcHRpb24iLCJtZXNzYWdlIjoiT25lIG9yIG1vcmUgcGFyYW1ldGVyIHZhbHVlcyB3ZXJlIGludmFsaWQ6IENvbmRpdGlvbiBwYXJhbWV0ZXIgdHlwZSBkb2VzIG5vdCBtYXRjaCBzY2hlbWEgdHlwZSJ9" } } ] } ================================================ FILE: docstore/awsdynamodb/v2/urls.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package awsdynamodb import ( "context" "errors" "fmt" "net/url" "sync" "github.com/aws/aws-sdk-go-v2/aws" dyn "github.com/aws/aws-sdk-go-v2/service/dynamodb" gcaws "gocloud.dev/aws" "gocloud.dev/docstore" ) func init() { docstore.DefaultURLMux().RegisterCollection(Scheme, new(lazySessionOpener)) } type lazySessionOpener struct { init sync.Once opener *URLOpener err error } func (o *lazySessionOpener) OpenCollectionURL(ctx context.Context, u *url.URL) (*docstore.Collection, error) { o.init.Do(func() { o.opener = &URLOpener{} }) if o.err != nil { return nil, fmt.Errorf("open collection %s: %v", u, o.err) } return o.opener.OpenCollectionURL(ctx, u) } // Scheme is the URL scheme dynamodb registers its URLOpener under on // docstore.DefaultMux. const Scheme = "dynamodb" // URLOpener opens dynamodb URLs like // "dynamodb://mytable?partition_key=partkey&sort_key=sortkey". // // The URL Host is used as the table name. See // https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html // for more details. // // The following query parameters are supported: // // - partition_key (required): the path to the partition key of a table or an index. // - sort_key: the path to the sort key of a table or an index. // - allow_scans: if "true", allow table scans to be used for queries // - consistent_read: if "true", a strongly consistent read is used whenever possible. // // See https://godoc.org/gocloud.dev/aws#V2ConfigFromURLParams for supported query // parameters for overriding the aws.Session from the URL. type URLOpener struct { } // OpenCollectionURL opens the collection at the URL's path. See the package doc for more details. func (o *URLOpener) OpenCollectionURL(_ context.Context, u *url.URL) (*docstore.Collection, error) { db, tableName, partitionKey, sortKey, opts, err := o.processURL(u) if err != nil { return nil, err } return OpenCollection(db, tableName, partitionKey, sortKey, opts) } func (o *URLOpener) processURL(u *url.URL) (db *dyn.Client, tableName, partitionKey, sortKey string, opts *Options, err error) { q := u.Query() partitionKey = q.Get("partition_key") if partitionKey == "" { return nil, "", "", "", nil, fmt.Errorf("open collection %s: partition_key is required to open a table", u) } q.Del("partition_key") sortKey = q.Get("sort_key") q.Del("sort_key") opts = &Options{ AllowScans: q.Get("allow_scans") == "true", RevisionField: q.Get("revision_field"), ConsistentRead: q.Get("consistent_read") == "true", } q.Del("allow_scans") q.Del("revision_field") q.Del("consistent_read") tableName = u.Host if tableName == "" { return nil, "", "", "", nil, fmt.Errorf("open collection %s: URL's host cannot be empty (the table name)", u) } if u.Path != "" { return nil, "", "", "", nil, fmt.Errorf("open collection %s: URL path must be empty, only the host is needed", u) } cfg, err := gcaws.V2ConfigFromURLParams(context.Background(), q) if err != nil { return nil, "", "", "", nil, fmt.Errorf("open collection %s: %v", u, err) } db, err = Dial(cfg) if err != nil { return nil, "", "", "", nil, fmt.Errorf("open collection %s: %v", u, err) } return db, tableName, partitionKey, sortKey, opts, nil } // Dial gets an AWS DynamoDB service client. func Dial(p aws.Config) (*dyn.Client, error) { if p.Credentials == nil { return nil, errors.New("getting Dynamo service: no AWS session provided") } return dyn.NewFromConfig(p), nil } ================================================ FILE: docstore/awsdynamodb/v2/urls_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package awsdynamodb import ( "net/url" "testing" ) func TestProcessURL(t *testing.T) { tests := []struct { URL string WantErr bool }{ // OK. {"dynamodb://docstore-test?partition_key=_kind", false}, // OK. {"dynamodb://docstore-test?partition_key=_kind&sort_key=_id", false}, // OK, overriding region. {"dynamodb://docstore-test?partition_key=_kind®ion=" + region, false}, // OK, allow_scans. {"dynamodb://docstore-test?partition_key=_kind&allow_scans=true" + region, false}, // Passing revision field. {"dynamodb://docstore-test?partition_key=_kind&revision_field=123", false}, // Passing consistent read field. {"dynamodb://docstore-test?partition_key=_kind&consistent_read=true", false}, // Unknown parameter. {"dynamodb://docstore-test?partition_key=_kind¶m=value", true}, // With path. {"dynamodb://docstore-test/subcoll?partition_key=_kind", true}, // Missing partition_key. {"dynamodb://docstore-test?sort_key=_id", true}, } o := &URLOpener{} for _, test := range tests { u, err := url.Parse(test.URL) if err != nil { t.Fatal(err) } _, _, _, _, _, err = o.processURL(u) if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } } } ================================================ FILE: docstore/doc.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package docstore provides a portable way of interacting with a document store. // Subpackages contain driver implementations of docstore for supported // services. // // See https://gocloud.dev/howto/docstore/ for a detailed how-to guide. // // # Collections // // In docstore, documents are grouped into collections, and each document has a key // that is unique in its collection. You can add, retrieve, modify and delete // documents by key, and you can query a collection to retrieve documents that match // certain criteria. // // # Representing Documents // // A document is a set of named fields, each with a value. A field's value can be a scalar, // a list, or a nested document. // // Docstore allows you to represent documents as either map[string]interface{} or // struct pointers. When you represent a document as a map, the fields are map keys // and the values are map values. Lists are represented with slices. For example, // here is a document about a book described as a map: // // doc := map[string]interface{}{ // "Title": "The Master and Margarita", // "Author": map[string]interface{}{ // "First": "Mikhail", // "Last": "Bulgakov", // }, // "PublicationYears": []int{1967, 1973}, // } // // Note that the value of "PublicationYears" is a list, and the value of "Author" is // itself a document. // // Here is the same document represented with structs: // // type Book struct { // Title string // Author Name // PublicationYears []int // } // // type Name struct { // First, Last string // } // // doc := &Book{ // Title: "The Master and Margarita", // Author: Name{ // First: "Mikhail", // Last: "Bulgakov", // }, // PublicationYears: []int{1967, 1973}, // } // // You must use a pointer to a struct to represent a document, although structs // nested inside a document, like the Name struct above, need not be pointers. // // Maps are best for applications where you don't know the structure of the // documents. Using structs is preferred because it enforces some structure on your // data. // // By default, Docstore treats a struct's exported fields as the fields of the // document. You can alter this default mapping by using a struct tag beginning // with "docstore:". Docstore struct tags support renaming, omitting fields // unconditionally, or omitting them only when they are empty, exactly like // encoding/json. For example, this is the Book struct with different field // names: // // type Book struct { // Title string `docstore:"title"` // Author Name `docstore:"author"` // PublicationYears []int `docstore:"pub_years,omitempty"` // NumPublications int `docstore:"-"` // } // // This struct describes a document with field names "title", "author" and // "pub_years". The pub_years field is omitted from the stored document if it has // length zero. The NumPublications field is never stored because it can easily be // computed from the PublicationYears field. // // Given a document field "Foo" and a struct type document, Docstore's decoder // will look through the destination struct's field to find (in order of // preference): // - An exported field with a tag of "Foo"; // - An exported field named "Foo". // // Note that unlike encoding/json, Docstore does case-sensitive matching during // decoding to match the behavior of decoders in most docstore services. // // # Representing Data // // Values stored in document fields can be any of a wide range of types. All // primitive types except for complex numbers are supported, as well as slices and // maps (the map key type must be a string, an integer, or a type that implements // encoding.TextMarshaler). In addition, any type that implements // encoding.BinaryMarshaler or encoding.TextMarshaler is permitted. This set of types // closely matches the encoding/json package (see https://golang.org/pkg/encoding/json). // // Times deserve special mention. Docstore can store and retrieve values of type // time.Time, with two caveats. First, the timezone will not be preserved. Second, // Docstore guarantees only that time.Time values are represented to millisecond // precision. Many services will do better, but if you need to be sure that times // are stored with nanosecond precision, convert the time.Time to another type before // storing and re-create when you retrieve it. For instance, if you store Unix // time in nanoseconds using time's UnixNano method, you can get the original // time back (in the local timezone) with the time.Unix function. // // # Representing Keys // // The key of a docstore document is its unique identifier, usually a field. // Keys never appear alone in the docstore API, only as part of a document. For // instance, to retrieve a document by key, you pass the Collection.Get method // a document as a struct pointer or map with the key field populated, and docstore // populates the rest of that argument with the stored contents. Docstore // doesn't take zero-value key. // // When you open a collection using an OpenCollection method of the // service-specific driver or a URL, you specify how to extract the key from a // document. // Usually, you provide the name of the key field, as in the example below: // // coll, err := memdocstore.OpenCollection("SSN", nil) // // Here, the "SSN" field of the document is used as the key. Some drivers let you // supply a function to extract the key from the document, which can be useful if the // key is composed of more than one field. // // # Actions // // Docstore supports six actions on documents as methods on the Collection type: // - Get retrieves a document. // - Create creates a new document. // - Replace replaces an existing document. // - Put puts a document into a collection, replacing it if it is already present. // - Update applies a set of modifications to a document. // - Delete deletes a document. // // Each action acts atomically on a single document. You can execute actions // individually or you can group them into an action list, like so: // // err := coll.Actions().Put(doc1).Replace(doc2).Get(doc3).Do(ctx) // // When you use an action list, docstore will try to optimize the execution of the // actions. For example, multiple Get actions may be combined into a single "batch // get" RPC. For the most part, actions in a list execute in an undefined order // (perhaps concurrently) and independently, but read and write operations on the same // document are executed in the user-specified order. See the documentation of // ActionList for details. // // # Revisions // // Docstore supports document revisions to distinguish different versions of a // document and enable optimistic locking. By default, Docstore stores the // revision in the field named "DocstoreRevision" (stored in the constant // DefaultRevisionField). Providers give you the option of changing that field // name. // // When you pass a document with a revision field to a write action, Docstore // will give it a revision at creation time or update the revision value when // modifying the document. If you don't want Docstore to handle any revision // logic, simply do not have the revision field in your document. // // When you pass a document with a non-nil revision to Put, Replace, Update or // Delete, Docstore will also compare the revision of the stored document to // that of the given document before making the change. It returns an error with // code FailedPrecondition on mismatch. (See https://gocloud.dev/gcerrors for // information about error codes.) If modification methods are called on a // document struct or map a nil revision field, then no revision checks are // performed, and changes are forced blindly, but a new revision will still be // given for the document. For example, if you call Get to retrieve a document // with a revision, then later perform a write action with that same document, // it will fail if the document was changed since the Get. // // Since different services use different types for revisions, revision fields // of unspecified type must be handled. When defining a document struct, // define the field to be of type interface{}. For example, // // type User { // Name string // DocstoreRevision interface{} // } // // # Queries // // Docstore supports querying within a collection. Call the Query method on // Collection to obtain a Query value, then build your query by calling Query methods // like Where, Limit and so on. Finally, call the Get method on the query to execute it. // The result is an iterator, whose use is described below. // // iter := coll.Query().Where("size", ">", 10).Limit(5).Get(ctx) // // The Where method defines a filter condition, much like a WHERE clause in SQL. // Conditions are of the form "field op value", where field is any document field // path (including dot-separated paths), op is one of "=", ">", "<", ">=" or "<=", // and value can be any value. // // iter := coll.Query().Where("Author.Last", "=", "Bulgakov").Limit(3).Get(ctx) // // Dot-separated paths work as you'd expect for nested structs and maps, addressing // the nested struct field or map key. For nested slices, some providers (notably // MongoDB) treat s.f, where s is a sequence, as the slice of e.f for each e in s. // However, others do not support field selectors inside slices, so docstore does // not support them -- while you may find that they work with some providers, you // cannot rely on that if you need fully portable code. // // You can make multiple Where calls. In some cases, parts of a Where clause may be // processed in the driver rather than natively by the backing service, which may have // performance implications for large result sets. See the driver package // documentation for details. // // Use the DocumentIterator returned from Query.Get by repeatedly calling its Next // method until it returns io.EOF. Always call Stop when you are finished with an // iterator. It is wise to use a defer statement for this. // // iter := coll.Query().Where("size", ">", 10).Limit(5).Get(ctx) // defer iter.Stop() // for { // m := map[string]interface{}{} // err := iter.Next(ctx, m) // if err == io.EOF { // break // } // if err != nil { // return err // } // fmt.Println(m) // } // // # Errors // // The errors returned from this package can be inspected in several ways: // // The Code function from https://gocloud.dev/gcerrors will return an error code, also // defined in that package, when invoked on an error. // // The Collection.ErrorAs method can retrieve the underlying driver error from // the returned error. See the specific driver's package doc for the supported // types. // // # OpenTelemetry Integration // // OpenTelemetry supports tracing, metrics, and logs collection for multiple languages and // backend providers. See https://opentelemetry.io. // // This API collects OpenTelemetry traces and metrics for the following methods: // - ActionList.Do // - Query.Get (for the first query only; drivers may make additional calls while iterating over results) // // All trace and metric names begin with the package import path. // The traces add the method name. // For example, "gocloud.dev/docstore/ActionList.Do". // The metrics are "completed_calls", a count of completed method calls by driver, // method and status (error code); and "latency", a distribution of method latency // by driver and method. // For example, "gocloud.dev/docstore/latency". // // To enable trace collection in your application, see the documentation at // https://opentelemetry.io/docs/instrumentation/go/getting-started/. // To enable metric collection in your application, see the documentation at // https://opentelemetry.io/docs/instrumentation/go/manual/. // // # GORM-like Code Generation // // You may find https://github.com/bartventer/docstore-gen useful. package docstore // import "gocloud.dev/docstore" ================================================ FILE: docstore/docstore.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package docstore import ( "context" "encoding/base64" "fmt" "log" "reflect" "runtime" "slices" "sort" "strings" "sync" "unicode/utf8" "go.opentelemetry.io/otel/trace" "gocloud.dev/docstore/driver" "gocloud.dev/gcerrors" "gocloud.dev/internal/gcerr" gcdkotel "gocloud.dev/internal/otel" ) // A Document is a set of field-value pairs. One or more fields, called the key // fields, must uniquely identify the document in the collection. You specify the key // fields when you open a collection. // A field name must be a valid UTF-8 string that does not contain a '.'. // // A Document can be represented as a map[string]int or a pointer to a struct. For // structs, the exported fields are the document fields. type Document = any // A Collection represents a set of documents. It provides an easy and portable // way to interact with document stores. // To create a Collection, use constructors found in driver subpackages. type Collection struct { driver driver.Collection tracer *gcdkotel.Tracer mu sync.Mutex closed bool } const pkgName = "gocloud.dev/docstore" var ( // OpenTelemetryViews are predefined views for OpenTelemetry metrics. // The views include counts and latency distributions for API method calls. // See the explanations at https://opentelemetry.io/docs/specs/otel/metrics/data-model/ for usage. OpenTelemetryViews = gcdkotel.Views(pkgName) ) // NewCollection is intended for use by drivers only. Do not use in application code. var NewCollection = newCollection // newCollection makes a Collection. func newCollection(d driver.Collection) *Collection { providerName := gcdkotel.ProviderName(d) c := &Collection{ driver: d, tracer: gcdkotel.NewTracer(pkgName, providerName), } _, file, lineno, ok := runtime.Caller(1) runtime.SetFinalizer(c, func(c *Collection) { c.mu.Lock() closed := c.closed c.mu.Unlock() if !closed { var caller string if ok { caller = fmt.Sprintf(" (%s:%d)", file, lineno) } log.Printf("A docstore.Collection was never closed%s", caller) } }) return c } // DefaultRevisionField is the default name of the document field used for document revision // information, to implement optimistic locking. // See the Revisions section of the package documentation. const DefaultRevisionField = "DocstoreRevision" func (c *Collection) revisionField() string { if r := c.driver.RevisionField(); r != "" { return r } return DefaultRevisionField } // A FieldPath is a dot-separated sequence of UTF-8 field names. Examples: // // room // room.size // room.size.width // // A FieldPath can be used select top-level fields or elements of sub-documents. // There is no way to select a single list element. type FieldPath string // Actions returns an ActionList that can be used to perform // actions on the collection's documents. func (c *Collection) Actions() *ActionList { return &ActionList{coll: c} } // An ActionList is a group of actions that affect a single collection. // // The writes in an action list (Put, Create, Replace, Update and Delete actions) // must refer to distinct documents and are unordered with respect to each other. // Each write happens independently of the others: all actions will be executed, even // if some fail. // // The Gets in an action list must also refer to distinct documents and are unordered // and independent of each other. // // A Get and a write may refer to the same document. Each write may be paired with // only one Get in this way. The Get and write will be executed in the order // specified in the list: a Get before a write will see the old value of the // document; a Get after the write will see the new value if the service is strongly // consistent, but may see the old value if the service is eventually consistent. type ActionList struct { coll *Collection actions []*Action enableAtomicWrites bool beforeDo func(asFunc func(any) bool) error } // An Action is a read or write on a single document. // Use the methods of ActionList to create and execute Actions. type Action struct { kind driver.ActionKind doc Document fieldpaths []FieldPath // paths to retrieve, for Get mods Mods // modifications to make, for Update inAtomicWrite bool // if this action is a part of atomic writes } func (l *ActionList) add(a *Action) *ActionList { l.actions = append(l.actions, a) return l } // Create adds an action that creates a new document to the given ActionList, and // returns the ActionList. The document must not already exist; an error with code // AlreadyExists is returned if it does. (See gocloud.dev/gcerrors for more on error // codes.) // // If the document doesn't have key fields, or the key fields are empty, meaning // 0, a nil interface value, or any empty array or string, key fields with // unique values will be created and doc will be populated with them if there is // a way to assign those keys, see each driver for details on the requirement of // generating keys. // // The revision field of the document must be absent or nil. // // Except for setting the revision field and possibly setting the key fields, the doc // argument is not modified. func (l *ActionList) Create(doc Document) *ActionList { return l.add(&Action{kind: driver.Create, doc: doc, inAtomicWrite: l.enableAtomicWrites}) } // Replace adds an action that replaces a document to the given ActionList, and // returns the ActionList. The key fields of the doc argument must be set. The // document must already exist; an error with code NotFound is returned if it does // not (or possibly FailedPrecondition, if the doc argument has a non-nil revision). // (See gocloud.dev/gcerrors for more on error codes.) // // See the Revisions section of the package documentation for how revisions are // handled. func (l *ActionList) Replace(doc Document) *ActionList { return l.add(&Action{kind: driver.Replace, doc: doc, inAtomicWrite: l.enableAtomicWrites}) } // Put adds an action that adds or replaces a document to the given ActionList, and returns the ActionList. // The key fields must be set. // // If the revision field is non-nil, then Put behaves exactly like Replace, returning // an error if the document does not exist. Otherwise, Put will create the document // if it does not exist. // // See the Revisions section of the package documentation for how revisions are // handled. func (l *ActionList) Put(doc Document) *ActionList { return l.add(&Action{kind: driver.Put, doc: doc, inAtomicWrite: l.enableAtomicWrites}) } // Delete adds an action that deletes a document to the given ActionList, and returns // the ActionList. Only the key and revision fields of doc are used. // See the Revisions section of the package documentation for how revisions are // handled. // If doc has no revision and the document doesn't exist, nothing happens and no // error is returned. func (l *ActionList) Delete(doc Document) *ActionList { // Rationale for not returning an error if the document does not exist: // Returning an error might be informative and could be ignored, but if the // semantics of an action list are to stop at first error, then we might abort a // list of Deletes just because one of the docs was not present, and that seems // wrong, or at least something you'd want to turn off. return l.add(&Action{kind: driver.Delete, doc: doc, inAtomicWrite: l.enableAtomicWrites}) } // Get adds an action that retrieves a document to the given ActionList, and // returns the ActionList. // Only the key fields of doc are used. // If fps is omitted, doc will contain all the fields of the retrieved document. // If fps is present, only the given field paths are retrieved. It is undefined // whether other fields of doc at the time of the call are removed, unchanged, // or zeroed, so for portable behavior doc should contain only the key fields. // If you plan to write the document back and let Docstore to perform optimistic // locking, include the revision field in fps. See more about revision at // https://godoc.org/gocloud.dev/docstore#hdr-Revisions. func (l *ActionList) Get(doc Document, fps ...FieldPath) *ActionList { return l.add(&Action{ kind: driver.Get, doc: doc, fieldpaths: fps, }) } // Update atomically applies Mods to doc, which must exist. // Only the key and revision fields of doc are used. // It is an error to pass an empty Mods to Update. // // A modification will create a field if it doesn't exist. // // No field path in mods can be a prefix of another. (It makes no sense // to, say, set foo but increment foo.bar.) // // See the Revisions section of the package documentation for how revisions are // handled. // // It is undefined whether updating a sub-field of a non-map field will succeed. // For instance, if the current document is {a: 1} and Update is called with the // mod "a.b": 2, then either Update will fail, or it will succeed with the result // {a: {b: 2}}. // // Update does not modify its doc argument, except to set the new revision. To obtain // the updated document, call Get after calling Update. func (l *ActionList) Update(doc Document, mods Mods) *ActionList { return l.add(&Action{ kind: driver.Update, doc: doc, mods: mods, inAtomicWrite: l.enableAtomicWrites, }) } // Mods is a map from field paths to modifications. // At present, a modification is one of: // - nil, to delete the field // - an Increment value, to add a number to the field // - any other value, to set the field to that value // // See ActionList.Update. type Mods map[FieldPath]any // Increment returns a modification that results in a field being incremented. It // should only be used as a value in a Mods map, like so: // // docstore.Mods{"count": docstore.Increment(1)} // // The amount must be an integer or floating-point value. func Increment(amount any) any { return driver.IncOp{amount} } // An ActionListError is returned by ActionList.Do. It contains all the errors // encountered while executing the ActionList, and the positions of the corresponding // actions. type ActionListError []struct { Index int Err error } // TODO(jba): use xerrors formatting. func (e ActionListError) Error() string { var s []string for _, x := range e { s = append(s, fmt.Sprintf("at %d: %v", x.Index, x.Err)) } return strings.Join(s, "; ") } // Unwrap returns the error in e, if there is exactly one. If there is more than one // error, Unwrap returns nil, since there is no way to determine which should be // returned. func (e ActionListError) Unwrap() error { if len(e) == 1 { return e[0].Err } // Return nil when e is nil, or has more than one error. // When there are multiple errors, it doesn't make sense to return any of them. return nil } // BeforeDo takes a callback function that will be called before the ActionList is // executed by the underlying service. It may be invoked multiple times for a single // call to ActionList.Do, because the driver may split the action list into several // service calls. If any callback invocation returns an error, ActionList.Do returns // an error. // // The callback takes a parameter, asFunc, that converts its argument to // driver-specific types. See https://gocloud.dev/concepts/as for background // information. func (l *ActionList) BeforeDo(f func(asFunc func(any) bool) error) *ActionList { l.beforeDo = f return l } // Do executes the action list. // // If Do returns a non-nil error, it will be of type ActionListError. If any action // fails, the returned error will contain the position in the ActionList of each // failed action. // // All the actions will be executed. Docstore tries to execute the actions as // efficiently as possible. Sometimes this makes it impossible to attribute failures // to specific actions; in such cases, the returned ActionListError will have entries // whose Index field is negative. func (l *ActionList) Do(ctx context.Context) error { return l.do(ctx, true) } // do implements Do with optional OpenTelemetry tracing, so it can be used internally. func (l *ActionList) do(ctx context.Context, withTracing bool) (err error) { if err := l.coll.checkClosed(); err != nil { return ActionListError{{-1, errClosed}} } if withTracing { var span trace.Span ctx, span = l.coll.tracer.Start(ctx, "ActionList.Do") defer func() { l.coll.tracer.End(ctx, span, err) }() } das, err := l.toDriverActions() if err != nil { return err } dopts := &driver.RunActionsOptions{BeforeDo: l.beforeDo} alerr := ActionListError(l.coll.driver.RunActions(ctx, das, dopts)) if len(alerr) == 0 { return nil // Explicitly return nil, because alerr is not of type error. } for i := range alerr { alerr[i].Err = wrapError(l.coll.driver, alerr[i].Err) } return alerr } func (l *ActionList) toDriverActions() ([]*driver.Action, error) { var das []*driver.Action var alerr ActionListError // Create a set of (document key, is Get action) pairs for detecting duplicates: // an action list can have at most one get and at most one write for each key. type keyAndKind struct { key any isGet bool } seen := map[keyAndKind]bool{} for i, a := range l.actions { d, err := l.coll.toDriverAction(a) // Check for duplicate key. if err == nil && d.Key != nil { kk := keyAndKind{d.Key, d.Kind == driver.Get} if seen[kk] { err = gcerr.Newf(gcerr.InvalidArgument, nil, "duplicate key in action list: %v", d.Key) } else { seen[kk] = true } } if err != nil { alerr = append(alerr, struct { Index int Err error }{i, wrapError(l.coll.driver, err)}) } else { d.Index = i das = append(das, d) } } if len(alerr) > 0 { return nil, alerr } return das, nil } func (c *Collection) toDriverAction(a *Action) (*driver.Action, error) { ddoc, err := driver.NewDocument(a.doc) if err != nil { return nil, err } key, err := c.driver.Key(ddoc) if err != nil { if gcerrors.Code(err) != gcerr.InvalidArgument { err = gcerr.Newf(gcerr.InvalidArgument, err, "bad document key") } return nil, err } if key == nil || driver.IsEmptyValue(reflect.ValueOf(key)) { if a.kind != driver.Create { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "missing document key") } // set the key to nil so that the following code does not need to check for // empty. key = nil } if reflect.ValueOf(key).Kind() == reflect.Pointer { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "keys cannot be pointers") } rev, _ := ddoc.GetField(c.revisionField()) if a.kind == driver.Create && rev != nil { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "cannot create a document with a revision field") } kind := a.kind if kind == driver.Put && rev != nil { // A Put with a revision field is equivalent to a Replace. kind = driver.Replace } d := &driver.Action{Kind: kind, Doc: ddoc, Key: key, InAtomicWrite: a.inAtomicWrite} if a.fieldpaths != nil { d.FieldPaths, err = parseFieldPaths(a.fieldpaths) if err != nil { return nil, err } } if a.kind == driver.Update { d.Mods, err = toDriverMods(a.mods) if err != nil { return nil, err } } return d, nil } func parseFieldPaths(fps []FieldPath) ([][]string, error) { res := make([][]string, len(fps)) for i, s := range fps { fp, err := parseFieldPath(s) if err != nil { return nil, err } res[i] = fp } return res, nil } func toDriverMods(mods Mods) ([]driver.Mod, error) { // Convert mods from a map to a slice of (fieldPath, value) pairs. // The map is easier for users to write, but the slice is easier // to process. if len(mods) == 0 { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "no mods passed to Update") } // Sort keys so tests are deterministic. // After sorting, a key might not immediately follow its prefix. Consider the // sorted list of keys "a", "a+b", "a.b". "a" is prefix of "a.b", but since '+' // sorts before '.', it is not adjacent to it. All we can assume is that the // prefix is before the key. var keys []string for k := range mods { keys = append(keys, string(k)) } sort.Strings(keys) var dmods []driver.Mod for _, k := range keys { k := FieldPath(k) v := mods[k] fp, err := parseFieldPath(k) if err != nil { return nil, err } for _, d := range dmods { if fpHasPrefix(fp, d.FieldPath) { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "field path %q is a prefix of %q", strings.Join(d.FieldPath, "."), k) } } if inc, ok := v.(driver.IncOp); ok && !isIncNumber(inc.Amount) { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "Increment amount %v of type %[1]T must be an integer or floating-point number", inc.Amount) } dmods = append(dmods, driver.Mod{FieldPath: fp, Value: v}) } return dmods, nil } // fpHasPrefix reports whether the field path fp begins with prefix. func fpHasPrefix(fp, prefix []string) bool { if len(fp) < len(prefix) { return false } for i, p := range prefix { if fp[i] != p { return false } } return true } func isIncNumber(x any) bool { switch reflect.TypeOf(x).Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: return true case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: return true case reflect.Float32, reflect.Float64: return true default: return false } } func (l *ActionList) String() string { var as []string for _, a := range l.actions { as = append(as, a.String()) } return "[" + strings.Join(as, ", ") + "]" } // AtomicWrites causes all following writes in the list to execute as a single atomic operation. func (l *ActionList) AtomicWrites() *ActionList { l.enableAtomicWrites = true return l } func (a *Action) String() string { buf := &strings.Builder{} fmt.Fprintf(buf, "%s(%v", a.kind, a.doc) for _, fp := range a.fieldpaths { fmt.Fprintf(buf, ", %s", fp) } for _, m := range a.mods { fmt.Fprintf(buf, ", %v", m) } fmt.Fprint(buf, ")") return buf.String() } // Create is a convenience for building and running a single-element action list. // See ActionList.Create. func (c *Collection) Create(ctx context.Context, doc Document) error { if err := c.Actions().Create(doc).Do(ctx); err != nil { return err.(ActionListError).Unwrap() } return nil } // Replace is a convenience for building and running a single-element action list. // See ActionList.Replace. func (c *Collection) Replace(ctx context.Context, doc Document) error { if err := c.Actions().Replace(doc).Do(ctx); err != nil { return err.(ActionListError).Unwrap() } return nil } // Put is a convenience for building and running a single-element action list. // See ActionList.Put. func (c *Collection) Put(ctx context.Context, doc Document) error { if err := c.Actions().Put(doc).Do(ctx); err != nil { return err.(ActionListError).Unwrap() } return nil } // Delete is a convenience for building and running a single-element action list. // See ActionList.Delete. func (c *Collection) Delete(ctx context.Context, doc Document) error { if err := c.Actions().Delete(doc).Do(ctx); err != nil { return err.(ActionListError).Unwrap() } return nil } // Get is a convenience for building and running a single-element action list. // See ActionList.Get. func (c *Collection) Get(ctx context.Context, doc Document, fps ...FieldPath) error { if err := c.Actions().Get(doc, fps...).Do(ctx); err != nil { return err.(ActionListError).Unwrap() } return nil } // Update is a convenience for building and running a single-element action list. // See ActionList.Update. func (c *Collection) Update(ctx context.Context, doc Document, mods Mods) error { if err := c.Actions().Update(doc, mods).Do(ctx); err != nil { return err.(ActionListError).Unwrap() } return nil } func parseFieldPath(fp FieldPath) ([]string, error) { if len(fp) == 0 { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "empty field path") } if !utf8.ValidString(string(fp)) { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "invalid UTF-8 field path %q", fp) } parts := strings.Split(string(fp), ".") if slices.Contains(parts, "") { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "empty component in field path %q", fp) } return parts, nil } // RevisionToString converts a document revision to a string. The returned // string should be treated as opaque; its only use is to provide a serialized // form that can be passed around (e.g., as a hidden field on a web form) // and then turned back into a revision using StringToRevision. The string is safe // for use in URLs and HTTP forms. func (c *Collection) RevisionToString(rev any) (string, error) { if rev == nil { return "", gcerr.Newf(gcerr.InvalidArgument, nil, "RevisionToString: nil revision") } bytes, err := c.driver.RevisionToBytes(rev) if err != nil { return "", wrapError(c.driver, err) } return base64.RawURLEncoding.EncodeToString(bytes), nil } // StringToRevision converts a string obtained with RevisionToString // to a revision. func (c *Collection) StringToRevision(s string) (any, error) { if s == "" { return "", gcerr.Newf(gcerr.InvalidArgument, nil, "StringToRevision: empty string") } bytes, err := base64.RawURLEncoding.DecodeString(s) if err != nil { return nil, err } rev, err := c.driver.BytesToRevision(bytes) if err != nil { return "", wrapError(c.driver, err) } return rev, nil } // As converts i to driver-specific types. // See https://gocloud.dev/concepts/as/ for background information, the "As" // examples in this package for examples, and the driver package // documentation for the specific types supported for that driver. func (c *Collection) As(i any) bool { if i == nil { return false } return c.driver.As(i) } var errClosed = gcerr.Newf(gcerr.FailedPrecondition, nil, "docstore: Collection has been closed") // Close releases any resources used for the collection. func (c *Collection) Close() error { c.mu.Lock() prev := c.closed c.closed = true c.mu.Unlock() if prev { return errClosed } return wrapError(c.driver, c.driver.Close()) } func (c *Collection) checkClosed() error { c.mu.Lock() defer c.mu.Unlock() if c.closed { return errClosed } return nil } func wrapError(c driver.Collection, err error) error { if err == nil { return nil } if gcerr.DoNotWrap(err) { return err } if _, ok := err.(*gcerr.Error); ok { return err } return gcerr.New(c.ErrorCode(err), err, 2, "docstore") } // ErrorAs converts i to driver-specific types. See // https://gocloud.dev/concepts/as/ for background information and the // driver package documentation for the specific types supported for // that driver. // // When the error is an ActionListError, ErrorAs works on individual errors in // the slice, not the slice itself. // // ErrorAs panics if i is nil or not a pointer. // ErrorAs returns false if err == nil. func (c *Collection) ErrorAs(err error, i any) bool { return gcerr.ErrorAs(err, i, c.driver.ErrorAs) } ================================================ FILE: docstore/docstore_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package docstore import ( "context" "reflect" "testing" "time" "github.com/google/go-cmp/cmp" "gocloud.dev/docstore/driver" "gocloud.dev/gcerrors" ) type Book struct { Title string `docstore:"key"` Author Name `docstore:"author"` PublicationYears []int `docstore:"pub_years,omitempty"` NumPublications int `docstore:"-"` } type Name struct { First, Last string } func TestIsIncNumber(t *testing.T) { for _, x := range []any{int(1), 'x', uint(1), byte(1), float32(1), float64(1), time.Duration(1)} { if !isIncNumber(x) { t.Errorf("%v: got false, want true", x) } } for _, x := range []any{1 + 1i, "3", time.Time{}} { if isIncNumber(x) { t.Errorf("%v: got true, want false", x) } } } func TestActionsDo(t *testing.T) { c := newCollection(fakeDriverCollection{}) defer c.Close() dn := map[string]any{"key": nil} d1 := map[string]any{"key": 1} d2 := map[string]any{"key": 2} dsn := &Book{} ds1 := &Book{Title: "The Master and Margarita"} ds2 := &Book{Title: "The Martian"} for _, test := range []struct { alist *ActionList want []int // error indexes; nil if no error }{ {c.Actions().Get(d1).Get(d2).Get(ds1).Get(ds2), nil}, {c.Actions().Get(d1).Put(d1).Put(ds1).Get(ds1), nil}, {c.Actions().Get(d2).Replace(d1).Put(d2).Get(d1), nil}, {c.Actions().Get(ds2).Replace(ds1).Put(ds2).Get(ds1), nil}, // Missing keys. {c.Actions().Put(dn).Put(dsn), []int{0, 1}}, {c.Actions().Get(dn).Replace(dn).Create(dn).Update(dn, Mods{"a": 1}), []int{0, 1, 3}}, {c.Actions().Get(dsn).Replace(dsn).Create(dsn).Update(dsn, Mods{"a": 1}), []int{0, 1, 3}}, // Duplicate documents. {c.Actions().Create(dn).Create(dn).Create(dsn).Create(dsn), nil}, // each Create without a key is a separate document {c.Actions().Create(d2).Create(ds2).Get(d2).Get(ds2).Create(d2).Put(ds2), []int{4, 5}}, {c.Actions().Get(d1).Get(ds1).Get(d1).Get(ds1), []int{2, 3}}, {c.Actions().Put(d1).Put(ds1).Get(d1).Get(ds1).Get(d1).Get(ds1), []int{4, 5}}, {c.Actions().Get(d1).Get(ds1).Put(d1).Put(d2).Put(ds1).Put(ds2).Put(d1).Replace(ds1), []int{6, 7}}, {c.Actions().Create(dn).Create(d1).Create(dsn).Create(ds1).Get(d1).Get(ds1), nil}, // Get with field paths. {c.Actions().Get(d1, "a.b", "c"), nil}, {c.Actions().Get(ds1, "name.Last", "pub_years"), nil}, {c.Actions().Get(d1, ".c").Get(ds1, "").Get(ds2, "\xa0\xa1"), []int{0, 1, 2}}, // bad field path // Mods. {c.Actions().Update(d1, nil).Update(ds1, nil), []int{0, 1}}, // empty mod {c.Actions().Update(d1, Mods{"a.b.c": 1, "a.b": 2, "a.b+c": 3}), []int{0}}, // a.b is a prefix of a.b.c {c.Actions().Update(d1, Mods{"": 1}).Update(ds1, Mods{".f": 2}), []int{0, 1}}, // invalid field path {c.Actions().Update(d1, Mods{"a": Increment(true)}).Update(ds1, Mods{"name": Increment("b")}), []int{0, 1}}, // invalid incOp } { err := test.alist.Do(context.Background()) if err == nil { if len(test.want) > 0 { t.Errorf("%s: got nil, want error", test.alist) } continue } var got []int for _, e := range err.(ActionListError) { if gcerrors.Code(e.Err) != gcerrors.InvalidArgument { t.Errorf("%s: got %v, want InvalidArgument", test.alist, e.Err) } got = append(got, e.Index) } if !cmp.Equal(got, test.want) { t.Errorf("%s: got %v, want %v", test.alist, got, test.want) } } } func TestClosedErrors(t *testing.T) { // Check that all collection methods return errClosed if the collection is closed. ctx := context.Background() c := NewCollection(fakeDriverCollection{}) if err := c.Close(); err != nil { t.Fatalf("got %v, want nil", err) } check := func(err error) { t.Helper() if alerr, ok := err.(ActionListError); ok { err = alerr.Unwrap() } if err != errClosed { t.Errorf("got %v, want errClosed", err) } } doc := map[string]any{"key": "k"} check(c.Close()) check(c.Actions().Create(doc).Do(ctx)) check(c.Create(ctx, doc)) check(c.Replace(ctx, doc)) check(c.Put(ctx, doc)) check(c.Get(ctx, doc)) check(c.Delete(ctx, doc)) check(c.Update(ctx, doc, Mods{"a": 1})) iter := c.Query().Get(ctx) check(iter.Next(ctx, doc)) // Check that DocumentIterator.Next returns errClosed if Close is called // in the middle of the iteration. c = NewCollection(fakeDriverCollection{}) iter = c.Query().Get(ctx) c.Close() check(iter.Next(ctx, doc)) } func TestSerializeRevisionErrors(t *testing.T) { c := NewCollection(fakeDriverCollection{}) _, err := c.RevisionToString(nil) if got := gcerrors.Code(err); got != gcerrors.InvalidArgument { t.Errorf("got %v, want InvalidArgument", got) } _, err = c.StringToRevision("") if got := gcerrors.Code(err); got != gcerrors.InvalidArgument { t.Errorf("got %v, want InvalidArgument", got) } } type fakeDriverCollection struct { driver.Collection } func (fakeDriverCollection) Key(doc driver.Document) (any, error) { key, err := doc.GetField("key") // TODO(#2589): remove this check once we check for empty key. if err != nil || driver.IsEmptyValue(reflect.ValueOf(key)) { return nil, err } return key, nil } func (fakeDriverCollection) RevisionField() string { return DefaultRevisionField } func (fakeDriverCollection) Close() error { return nil } func (fakeDriverCollection) RunActions(ctx context.Context, actions []*driver.Action, opts *driver.RunActionsOptions) driver.ActionListError { return nil } func (fakeDriverCollection) RunGetQuery(context.Context, *driver.Query) (driver.DocumentIterator, error) { return fakeDriverDocumentIterator{}, nil } type fakeDriverDocumentIterator struct { driver.DocumentIterator } func (fakeDriverDocumentIterator) Next(context.Context, driver.Document) error { return nil } ================================================ FILE: docstore/driver/actionkind_string.go ================================================ // Code generated by "stringer -type=ActionKind"; DO NOT EDIT. package driver import "strconv" func _() { // An "invalid array index" compiler error signifies that the constant values have changed. // Re-run the stringer command to generate them again. var x [1]struct{} _ = x[Create-0] _ = x[Replace-1] _ = x[Put-2] _ = x[Get-3] _ = x[Delete-4] _ = x[Update-5] } const _ActionKind_name = "CreateReplacePutGetDeleteUpdate" var _ActionKind_index = [...]uint8{0, 6, 13, 16, 19, 25, 31} func (i ActionKind) String() string { if i < 0 || i >= ActionKind(len(_ActionKind_index)-1) { return "ActionKind(" + strconv.FormatInt(int64(i), 10) + ")" } return _ActionKind_name[_ActionKind_index[i]:_ActionKind_index[i+1]] } ================================================ FILE: docstore/driver/codec.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // TODO(jba): support struct tags. // TODO(jba): for efficiency, enable encoding of only a subset of field paths. package driver import ( "encoding" "fmt" "reflect" "strconv" "gocloud.dev/docstore/internal/fields" "gocloud.dev/internal/gcerr" "google.golang.org/protobuf/proto" ) var ( binaryMarshalerType = reflect.TypeFor[encoding.BinaryMarshaler]() binaryUnmarshalerType = reflect.TypeFor[encoding.BinaryUnmarshaler]() textMarshalerType = reflect.TypeFor[encoding.TextMarshaler]() textUnmarshalerType = reflect.TypeFor[encoding.TextUnmarshaler]() protoMessageType = reflect.TypeFor[proto.Message]() ) // An Encoder encodes Go values in some other form (e.g. JSON, protocol buffers). // The encoding protocol is designed to avoid losing type information by passing // values using interface{}. An Encoder is responsible for storing the value // it is encoding. // // Because all drivers must support the same set of values, the encoding methods // (with the exception of EncodeStruct) do not return errors. EncodeStruct is special // because it is an escape hatch for arbitrary structs, not all of which may be // encodable. type Encoder interface { // These methods all encode and store a single Go value. EncodeNil() EncodeBool(bool) EncodeString(string) EncodeInt(int64) EncodeUint(uint64) EncodeFloat(float64) EncodeBytes([]byte) // EncodeList is called when a slice or array is encountered (except for a // []byte, which is handled by EncodeBytes). Its argument is the length of the // slice or array. The encoding algorithm will call the returned Encoder that // many times to encode the successive values of the list. After each such call, // ListIndex will be called with the index of the element just encoded. // // For example, []string{"a", "b"} will result in these calls: // enc2 := enc.EncodeList(2) // enc2.EncodeString("a") // enc2.ListIndex(0) // enc2.EncodeString("b") // enc2.ListIndex(1) EncodeList(n int) Encoder ListIndex(i int) // EncodeMap is called when a map is encountered. Its argument is the number of // fields in the map. The encoding algorithm will call the returned Encoder that // many times to encode the successive values of the map. After each such call, // MapKey will be called with the key of the element just encoded. // // For example, map[string}int{"A": 1, "B": 2} will result in these calls: // enc2 := enc.EncodeMap(2) // enc2.EncodeInt(1) // enc2.MapKey("A") // enc2.EncodeInt(2) // enc2.MapKey("B") // // EncodeMap is also called for structs. The map then consists of the exported // fields of the struct. For struct{A, B int}{1, 2}, if EncodeStruct returns // false, the same sequence of calls as above will occur. EncodeMap(n int) Encoder MapKey(string) // If the encoder wants to encode a value in a special way it should do so here // and return true along with any error from the encoding. Otherwise, it should // return false. EncodeSpecial(v reflect.Value) (bool, error) } // Encode encodes the value using the given Encoder. It traverses the value, // iterating over arrays, slices, maps and the exported fields of structs. If it // encounters a non-nil pointer, it encodes the value that it points to. // Encode treats a few interfaces specially: // // If the value implements encoding.BinaryMarshaler, Encode invokes MarshalBinary // on it and encodes the resulting byte slice. // // If the value implements encoding.TextMarshaler, Encode invokes MarshalText on it // and encodes the resulting string. // // If the value implements proto.Message, Encode invokes proto.Marshal on it and encodes // the resulting byte slice. Here proto is the package "google.golang.org/protobuf/proto". // // Not every map key type can be encoded. Only strings, integers (signed or // unsigned), and types that implement encoding.TextMarshaler are permitted as map // keys. These restrictions match exactly those of the encoding/json package. func Encode(v reflect.Value, e Encoder) error { return wrap(encode(v, e), gcerr.InvalidArgument) } func encode(v reflect.Value, enc Encoder) error { if !v.IsValid() { enc.EncodeNil() return nil } done, err := enc.EncodeSpecial(v) if done { return err } if v.Type().Implements(binaryMarshalerType) { bytes, err := v.Interface().(encoding.BinaryMarshaler).MarshalBinary() if err != nil { return err } enc.EncodeBytes(bytes) return nil } if v.Type().Implements(protoMessageType) { if v.IsNil() { enc.EncodeNil() } else { bytes, err := proto.Marshal(v.Interface().(proto.Message)) if err != nil { return err } enc.EncodeBytes(bytes) } return nil } if reflect.PtrTo(v.Type()).Implements(protoMessageType) { bytes, err := proto.Marshal(v.Addr().Interface().(proto.Message)) if err != nil { return err } enc.EncodeBytes(bytes) return nil } if v.Type().Implements(textMarshalerType) { bytes, err := v.Interface().(encoding.TextMarshaler).MarshalText() if err != nil { return err } enc.EncodeString(string(bytes)) return nil } switch v.Kind() { case reflect.Bool: enc.EncodeBool(v.Bool()) case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: enc.EncodeInt(v.Int()) case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: enc.EncodeUint(v.Uint()) case reflect.Float32, reflect.Float64: enc.EncodeFloat(v.Float()) case reflect.String: enc.EncodeString(v.String()) case reflect.Slice: if v.IsNil() { enc.EncodeNil() return nil } fallthrough case reflect.Array: return encodeList(v, enc) case reflect.Map: return encodeMap(v, enc) case reflect.Pointer: if v.IsNil() { enc.EncodeNil() return nil } return encode(v.Elem(), enc) case reflect.Interface: if v.IsNil() { enc.EncodeNil() return nil } return encode(v.Elem(), enc) case reflect.Struct: fields, err := fieldCache.Fields(v.Type()) if err != nil { return err } return encodeStructWithFields(v, fields, enc) default: return gcerr.Newf(gcerr.InvalidArgument, nil, "cannot encode type %s", v.Type()) } return nil } // Encode an array or non-nil slice. func encodeList(v reflect.Value, enc Encoder) error { // Byte slices encode specially. if v.Type().Kind() == reflect.Slice && v.Type().Elem().Kind() == reflect.Uint8 { enc.EncodeBytes(v.Bytes()) return nil } n := v.Len() enc2 := enc.EncodeList(n) for i := range n { if err := encode(v.Index(i), enc2); err != nil { return err } enc2.ListIndex(i) } return nil } // Encode a map. func encodeMap(v reflect.Value, enc Encoder) error { if v.IsNil() { enc.EncodeNil() return nil } keys := v.MapKeys() enc2 := enc.EncodeMap(len(keys)) for _, k := range keys { sk, err := stringifyMapKey(k) if err != nil { return err } if err := encode(v.MapIndex(k), enc2); err != nil { return err } enc2.MapKey(sk) } return nil } // k is the key of a map. Encode it as a string. // Only strings, integers (signed or unsigned), and types that implement // encoding.TextMarshaler are supported. func stringifyMapKey(k reflect.Value) (string, error) { // This is basically reflectWithString.resolve, from encoding/json/encode.go. if k.Kind() == reflect.String { return k.String(), nil } if tm, ok := k.Interface().(encoding.TextMarshaler); ok { b, err := tm.MarshalText() if err != nil { return "", err } return string(b), nil } switch k.Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: return strconv.FormatInt(k.Int(), 10), nil case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: return strconv.FormatUint(k.Uint(), 10), nil default: return "", gcerr.Newf(gcerr.InvalidArgument, nil, "cannot encode key %v of type %s", k, k.Type()) } } func encodeStructWithFields(v reflect.Value, fields fields.List, e Encoder) error { e2 := e.EncodeMap(len(fields)) for _, f := range fields { fv, ok := fieldByIndex(v, f.Index) if !ok { // if !ok, then f is a field in an embedded pointer to struct, and that embedded pointer // is nil in v. In other words, the field exists in the struct type, but not this particular // struct value. So we just ignore it. continue } if f.ParsedTag.(tagOptions).omitEmpty && IsEmptyValue(fv) { continue } if err := encode(fv, e2); err != nil { return err } e2.MapKey(f.Name) } return nil } // fieldByIndex retrieves the field of v at the given index if present. // v must be a struct. index must refer to a valid field of v's type. // The second return value is false if there is a nil embedded pointer // along the path denoted by index. // // From encoding/json/encode.go. func fieldByIndex(v reflect.Value, index []int) (reflect.Value, bool) { for _, i := range index { if v.Kind() == reflect.Pointer { if v.IsNil() { return reflect.Value{}, false } v = v.Elem() } v = v.Field(i) } return v, true } //////////////////////////////////////////////////////////////// // TODO(jba): consider a fast path: if we are decoding into a struct, assume the same struct // was used to encode. Then we can build a map from field names to functions, where each // function avoids all the tests of Decode and contains just the code for setting the field. // TODO(jba): provide a way to override the check on missing fields. // A Decoder decodes data that was produced by Encode back into Go values. // Each Decoder instance is responsible for decoding one value. type Decoder interface { // The AsXXX methods each report whether the value being decoded can be represented as // a particular Go type. If so, the method should return the value as that type, and true; // otherwise it should return the zero value and false. AsString() (string, bool) AsInt() (int64, bool) AsUint() (uint64, bool) AsFloat() (float64, bool) AsBytes() ([]byte, bool) AsBool() (bool, bool) AsNull() bool // ListLen should return the length of the value being decoded and true, if the // value can be decoded into a slice or array. Otherwise, ListLen should return // (0, false). ListLen() (int, bool) // If ListLen returned true, then DecodeList will be called. It should iterate // over the value being decoded in sequence from index 0, invoking the callback // for each element with the element's index and a Decoder for the element. // If the callback returns false, DecodeList should return immediately. DecodeList(func(int, Decoder) bool) // MapLen should return the number of fields of the value being decoded and true, // if the value can be decoded into a map or struct. Otherwise, it should return // (0, false). MapLen() (int, bool) // DecodeMap iterates over the fields of the value being decoded, invoke the // callback on each with field name, a Decoder for the field value, and a bool // to indicate whether or not to use exact match for the field names. It will // be called when MapLen returns true or decoding a struct. If the callback // returns false, DecodeMap should return immediately. DecodeMap(func(string, Decoder, bool) bool) // AsInterface should decode the value into the Go value that best represents it. AsInterface() (any, error) // If the decoder wants to decode a value in a special way it should do so here // and return true, the decoded value, and any error from the decoding. // Otherwise, it should return false. AsSpecial(reflect.Value) (bool, any, error) // String should return a human-readable representation of the Decoder, for error messages. String() string } // Decode decodes the value held in the Decoder d into v. // Decode creates slices, maps and pointer elements as needed. // It treats values that implement encoding.BinaryUnmarshaler, // encoding.TextUnmarshaler and proto.Message specially; see Encode. func Decode(v reflect.Value, d Decoder) error { return wrap(decode(v, d), gcerr.InvalidArgument) } func decode(v reflect.Value, d Decoder) error { if !v.CanSet() { return fmt.Errorf("while decoding: cannot set %+v", v) } // A Null value sets anything nullable to nil. // If the value isn't nullable, we keep going. // TODO(jba): should we treat decoding a null into a non-nullable as an error, or // ignore it like encoding/json does? if d.AsNull() { switch v.Kind() { case reflect.Interface, reflect.Pointer, reflect.Map, reflect.Slice: v.Set(reflect.Zero(v.Type())) return nil } } if done, val, err := d.AsSpecial(v); done { if err != nil { return err } if reflect.TypeOf(val).AssignableTo(v.Type()) { v.Set(reflect.ValueOf(val)) return nil } return decodingError(v, d) } // Handle implemented interfaces first. if reflect.PtrTo(v.Type()).Implements(binaryUnmarshalerType) { if b, ok := d.AsBytes(); ok { return v.Addr().Interface().(encoding.BinaryUnmarshaler).UnmarshalBinary(b) } return decodingError(v, d) } if reflect.PtrTo(v.Type()).Implements(protoMessageType) { if b, ok := d.AsBytes(); ok { return proto.Unmarshal(b, v.Addr().Interface().(proto.Message)) } return decodingError(v, d) } if reflect.PtrTo(v.Type()).Implements(textUnmarshalerType) { if s, ok := d.AsString(); ok { return v.Addr().Interface().(encoding.TextUnmarshaler).UnmarshalText([]byte(s)) } return decodingError(v, d) } switch v.Kind() { case reflect.Bool: if b, ok := d.AsBool(); ok { v.SetBool(b) return nil } case reflect.String: if s, ok := d.AsString(); ok { v.SetString(s) return nil } case reflect.Float32, reflect.Float64: if f, ok := d.AsFloat(); ok { v.SetFloat(f) return nil } case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: i, ok := d.AsInt() if !ok { // Accept a floating-point number with integral value. f, ok := d.AsFloat() if !ok { return decodingError(v, d) } i = int64(f) if float64(i) != f { return gcerr.Newf(gcerr.InvalidArgument, nil, "float %f does not fit into %s", f, v.Type()) } } if v.OverflowInt(i) { return overflowError(i, v.Type()) } v.SetInt(i) return nil case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: u, ok := d.AsUint() if !ok { // Accept a floating-point number with integral value. f, ok := d.AsFloat() if !ok { return decodingError(v, d) } u = uint64(f) if float64(u) != f { return gcerr.Newf(gcerr.InvalidArgument, nil, "float %f does not fit into %s", f, v.Type()) } } if v.OverflowUint(u) { return overflowError(u, v.Type()) } v.SetUint(u) return nil case reflect.Slice, reflect.Array: return decodeList(v, d) case reflect.Map: return decodeMap(v, d) case reflect.Pointer: // If the pointer is nil, set it to a zero value. if v.IsNil() { v.Set(reflect.New(v.Type().Elem())) } return decode(v.Elem(), d) case reflect.Struct: return decodeStruct(v, d) case reflect.Interface: if v.NumMethod() == 0 { // empty interface // If v holds a pointer, set the pointer. if !v.IsNil() && v.Elem().Kind() == reflect.Pointer { return decode(v.Elem(), d) } // Otherwise, create a fresh value. x, err := d.AsInterface() if err != nil { return err } v.Set(reflect.ValueOf(x)) return nil } // Any other kind of interface is an error??? } return decodingError(v, d) } func decodeList(v reflect.Value, d Decoder) error { // If we're decoding into a byte slice or array, and the decoded value // supports that, then do the decoding. if v.Type().Elem().Kind() == reflect.Uint8 { if b, ok := d.AsBytes(); ok { if v.Kind() == reflect.Slice { v.SetBytes(b) return nil } // It's an array; copy the data in. err := prepareLength(v, len(b)) if err != nil { return err } reflect.Copy(v, reflect.ValueOf(b)) return nil } // Fall through to decode the []byte as an ordinary slice. } dlen, ok := d.ListLen() if !ok { return decodingError(v, d) } err := prepareLength(v, dlen) if err != nil { return err } d.DecodeList(func(i int, vd Decoder) bool { if err != nil || i >= dlen { return false } err = decode(v.Index(i), vd) return err == nil }) return err } // v must be a slice or array. We want it to be of length wantLen. Prepare it as // necessary (details described in the code below), and return its resulting length. // If an array is too short, return an error. This behavior differs from // encoding/json, which just populates a short array with whatever it can and drops // the rest. That can lose data. func prepareLength(v reflect.Value, wantLen int) error { vLen := v.Len() if v.Kind() == reflect.Slice { // Construct a slice of the right size, avoiding allocation if possible. switch { case vLen < wantLen: // v too short if v.Cap() >= wantLen { // extend its length if there's room v.SetLen(wantLen) } else { // else make a new one v.Set(reflect.MakeSlice(v.Type(), wantLen, wantLen)) } case vLen > wantLen: // v too long; truncate it v.SetLen(wantLen) } } else { // array switch { case vLen < wantLen: // v too short return gcerr.Newf(gcerr.InvalidArgument, nil, "array length %d is too short for incoming list of length %d", vLen, wantLen) case vLen > wantLen: // v too long; set extra elements to zero z := reflect.Zero(v.Type().Elem()) for i := wantLen; i < vLen; i++ { v.Index(i).Set(z) } } } return nil } // Since a map value is not settable via reflection, this function always creates a // new element for each corresponding map key. Existing values of v are overwritten. // This happens even if the map value is something like a pointer to a struct, where // we could in theory populate the existing struct value instead of discarding it. // This behavior matches encoding/json. func decodeMap(v reflect.Value, d Decoder) error { mapLen, ok := d.MapLen() if !ok { return decodingError(v, d) } t := v.Type() if v.IsNil() { v.Set(reflect.MakeMapWithSize(t, mapLen)) } et := t.Elem() var err error kt := v.Type().Key() d.DecodeMap(func(key string, vd Decoder, _ bool) bool { if err != nil { return false } el := reflect.New(et).Elem() err = decode(el, vd) if err != nil { return false } vk, e := unstringifyMapKey(key, kt) if e != nil { err = e return false } v.SetMapIndex(vk, el) return err == nil }) return err } // Given a map key encoded as a string, and the type of the map key, convert the key // into the type. // For example, if we are decoding the key "3" for a map[int]interface{}, then key is "3" // and keyType is reflect.Int. func unstringifyMapKey(key string, keyType reflect.Type) (reflect.Value, error) { // This code is mostly from the middle of decodeState.object in encoding/json/decode.go. // Except for literalStore, which I don't understand. // TODO(jba): understand literalStore. switch { case keyType.Kind() == reflect.String: return reflect.ValueOf(key).Convert(keyType), nil case reflect.PtrTo(keyType).Implements(textUnmarshalerType): tu := reflect.New(keyType) if err := tu.Interface().(encoding.TextUnmarshaler).UnmarshalText([]byte(key)); err != nil { return reflect.Value{}, err } return tu.Elem(), nil case keyType.Kind() == reflect.Interface && keyType.NumMethod() == 0: // TODO: remove this case? encoding/json doesn't support it. return reflect.ValueOf(key), nil default: switch keyType.Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: n, err := strconv.ParseInt(key, 10, 64) if err != nil { return reflect.Value{}, err } if reflect.Zero(keyType).OverflowInt(n) { return reflect.Value{}, overflowError(n, keyType) } return reflect.ValueOf(n).Convert(keyType), nil case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: n, err := strconv.ParseUint(key, 10, 64) if err != nil { return reflect.Value{}, err } if reflect.Zero(keyType).OverflowUint(n) { return reflect.Value{}, overflowError(n, keyType) } return reflect.ValueOf(n).Convert(keyType), nil default: return reflect.Value{}, gcerr.Newf(gcerr.InvalidArgument, nil, "invalid key type %s", keyType) } } } func decodeStruct(v reflect.Value, d Decoder) error { fs, err := fieldCache.Fields(v.Type()) if err != nil { return err } d.DecodeMap(func(key string, d2 Decoder, exactMatch bool) bool { if err != nil { return false } var f *fields.Field if exactMatch { f = fs.MatchExact(key) } else { f = fs.MatchFold(key) } if f == nil { err = gcerr.Newf(gcerr.InvalidArgument, nil, "no field matching %q in %s", key, v.Type()) return false } fv, ok := fieldByIndexCreate(v, f.Index) if !ok { err = gcerr.Newf(gcerr.InvalidArgument, nil, "setting field %q in %s: cannot create embedded pointer field of unexported type", key, v.Type()) return false } err = decode(fv, d2) return err == nil }) return err } // fieldByIndexCreate retrieves the the field of v at the given index if present, // creating embedded struct pointers where necessary. // v must be a struct. index must refer to a valid field of v's type. // The second return value is false If there is a nil embedded pointer of unexported // type along the path denoted by index. (We cannot create such pointers.) func fieldByIndexCreate(v reflect.Value, index []int) (reflect.Value, bool) { for _, i := range index { if v.Kind() == reflect.Pointer { if v.IsNil() { if !v.CanSet() { return reflect.Value{}, false } v.Set(reflect.New(v.Type().Elem())) } v = v.Elem() } v = v.Field(i) } return v, true } func decodingError(v reflect.Value, d Decoder) error { return gcerr.New(gcerr.InvalidArgument, nil, 2, fmt.Sprintf("cannot set type %s to %v", v.Type(), d)) } func overflowError(x any, t reflect.Type) error { return gcerr.New(gcerr.InvalidArgument, nil, 2, fmt.Sprintf("value %v overflows type %s", x, t)) } func wrap(err error, code gcerr.ErrorCode) error { if _, ok := err.(*gcerr.Error); !ok && err != nil { err = gcerr.New(code, err, 2, err.Error()) } return err } var fieldCache = fields.NewCache(parseTag, nil, nil) // IsEmptyValue returns whether or not v is a zero value of its type. // Copied from encoding/json, go 1.12. func IsEmptyValue(v reflect.Value) bool { switch k := v.Kind(); k { case reflect.Array, reflect.Map, reflect.Slice, reflect.String: return v.Len() == 0 case reflect.Bool: return !v.Bool() case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: return v.Int() == 0 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: return v.Uint() == 0 case reflect.Float32, reflect.Float64: return v.Float() == 0 case reflect.Interface, reflect.Pointer: return v.IsNil() } return false } // Options for struct tags. type tagOptions struct { omitEmpty bool // do not encode value if empty } // parseTag interprets docstore struct field tags. func parseTag(t reflect.StructTag) (name string, keep bool, other any, err error) { var opts []string name, keep, opts = fields.ParseStandardTag("docstore", t) tagOpts := tagOptions{} for _, opt := range opts { switch opt { case "omitempty": tagOpts.omitEmpty = true default: return "", false, nil, gcerr.Newf(gcerr.InvalidArgument, nil, "unknown tag option: %q", opt) } } return name, keep, tagOpts, nil } ================================================ FILE: docstore/driver/codec_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package driver import ( "errors" "fmt" "reflect" "testing" "time" "github.com/google/go-cmp/cmp" "gocloud.dev/gcerrors" "gocloud.dev/internal/gcerr" "google.golang.org/protobuf/proto" tspb "google.golang.org/protobuf/types/known/timestamppb" ) type myString string type te struct{ X byte } func (e te) MarshalText() ([]byte, error) { return []byte{e.X}, nil } func (e *te) UnmarshalText(b []byte) error { if len(b) != 1 { return errors.New("te.UnmarshalText: need exactly 1 byte") } e.X = b[0] return nil } type special int func (special) MarshalBinary() ([]byte, error) { panic("should never be called") } func (*special) UnmarshalBinary([]byte) error { panic("should never be called") } type badSpecial int type Embed1 struct { E1 string } type Embed2 struct { E2 string } type embed3 struct { E3 string } type embed4 struct { E4 string } type MyStruct struct { A int B *bool C []*te D []time.Time T *tspb.Timestamp Embed1 *Embed2 embed3 *embed4 Omit int `docstore:"-"` OmitEmpty int `docstore:",omitempty"` Rename int `docstore:"rename"` } func TestEncode(t *testing.T) { var seven int32 = 7 var nullptr *int tm := time.Now() tmb, err := tm.MarshalBinary() if err != nil { t.Fatal(err) } tru := true ts := &tspb.Timestamp{Seconds: 25, Nanos: 300} tsb, err := proto.Marshal(ts) if err != nil { t.Fatal(err) } for _, test := range []struct { in, want any }{ {nil, nil}, {0, int64(0)}, {uint64(999), uint64(999)}, {float32(3.5), float64(3.5)}, {"", ""}, {"x", "x"}, {true, true}, {nullptr, nil}, {seven, int64(seven)}, {&seven, int64(seven)}, {[]byte{1, 2}, []byte{1, 2}}, {[2]byte{3, 4}, []any{uint64(3), uint64(4)}}, {[]int(nil), nil}, {[]int{}, []any{}}, {[]int{1, 2}, []any{int64(1), int64(2)}}, { [][]string{{"a", "b"}, {"c", "d"}}, []any{ []any{"a", "b"}, []any{"c", "d"}, }, }, {[...]int{1, 2}, []any{int64(1), int64(2)}}, {[]any{nil, false}, []any{nil, false}}, {map[string]int(nil), nil}, {map[string]int{}, map[string]any{}}, { map[string]int{"a": 1, "b": 2}, map[string]any{"a": int64(1), "b": int64(2)}, }, {tm, tmb}, {ts, tsb}, {te{'A'}, "A"}, {special(17), 17}, {myString("x"), "x"}, {[]myString{"x"}, []any{"x"}}, {map[myString]myString{"a": "x"}, map[string]any{"a": "x"}}, { map[int]bool{17: true}, map[string]any{"17": true}, }, { map[uint]bool{18: true}, map[string]any{"18": true}, }, { map[te]bool{{'B'}: true}, map[string]any{"B": true}, }, { MyStruct{ A: 1, B: &tru, C: []*te{{'T'}}, D: []time.Time{tm}, T: ts, Embed1: Embed1{E1: "E1"}, Embed2: &Embed2{E2: "E2"}, embed3: embed3{E3: "E3"}, embed4: &embed4{E4: "E4"}, Omit: 3, OmitEmpty: 4, Rename: 5, }, map[string]any{ "A": int64(1), "B": true, "C": []any{"T"}, "D": []any{tmb}, "T": tsb, "E1": "E1", "E2": "E2", "E3": "E3", "E4": "E4", "OmitEmpty": int64(4), "rename": int64(5), }, }, { MyStruct{}, map[string]any{ "A": int64(0), "B": nil, "C": nil, "D": nil, "T": nil, "E1": "", "E3": "", "rename": int64(0), }, }, } { enc := &testEncoder{} if err := Encode(reflect.ValueOf(test.in), enc); err != nil { t.Fatal(err) } got := enc.val if diff := cmp.Diff(got, test.want); diff != "" { t.Errorf("%#v (got=-, want=+):\n%s", test.in, diff) } } } type badBinaryMarshaler struct{} func (badBinaryMarshaler) MarshalBinary() ([]byte, error) { return nil, errors.New("bad") } func (*badBinaryMarshaler) UnmarshalBinary([]byte) error { return errors.New("bad") } type badTextMarshaler struct{} func (badTextMarshaler) MarshalText() ([]byte, error) { return nil, errors.New("bad") } func (*badTextMarshaler) UnmarshalText([]byte) error { return errors.New("bad") } func TestEncodeErrors(t *testing.T) { for _, test := range []struct { desc string val any }{ {"MarshalBinary fails", badBinaryMarshaler{}}, {"MarshalText fails", badTextMarshaler{}}, {"bad type", make(chan int)}, {"bad type in list", []any{func() {}}}, {"bad type in map", map[string]any{"a": func() {}}}, {"bad type in struct", &struct{ C chan int }{}}, {"bad map key type", map[float32]int{1: 1}}, {"MarshalText for map key fails", map[badTextMarshaler]int{{}: 1}}, } { enc := &testEncoder{} if err := Encode(reflect.ValueOf(test.val), enc); err == nil { t.Errorf("%s: got nil, want error", test.desc) } else if c := gcerrors.Code(err); c != gcerrors.InvalidArgument { t.Errorf("%s: got code %s, want InvalidArgument", test.desc, c) } } } type testEncoder struct { val any } func (e *testEncoder) EncodeNil() { e.val = nil } func (e *testEncoder) EncodeBool(x bool) { e.val = x } func (e *testEncoder) EncodeString(x string) { e.val = x } func (e *testEncoder) EncodeInt(x int64) { e.val = x } func (e *testEncoder) EncodeUint(x uint64) { e.val = x } func (e *testEncoder) EncodeFloat(x float64) { e.val = x } func (e *testEncoder) EncodeBytes(x []byte) { e.val = x } var ( typeOfSpecial = reflect.TypeFor[special]() typeOfBadSpecial = reflect.TypeFor[badSpecial]() ) func (e *testEncoder) EncodeSpecial(v reflect.Value) (bool, error) { // special would normally encode as a []byte, because it implements BinaryMarshaler. // Encode it as an int instead. if v.Type() == typeOfSpecial { e.val = int(v.Interface().(special)) return true, nil } return false, nil } func (e *testEncoder) ListIndex(int) { panic("impossible") } func (e *testEncoder) MapKey(string) { panic("impossible") } func (e *testEncoder) EncodeList(n int) Encoder { s := make([]any, n) e.val = s return &listEncoder{s: s} } func (e *testEncoder) EncodeMap(n int) Encoder { m := make(map[string]any, n) e.val = m return &mapEncoder{m: m} } type listEncoder struct { s []any testEncoder } func (e *listEncoder) ListIndex(i int) { e.s[i] = e.val } type mapEncoder struct { m map[string]any testEncoder } func (e *mapEncoder) MapKey(k string) { e.m[k] = e.val } func TestDecode(t *testing.T) { two := 2 tru := true fa := false ptru := &tru pfa := &fa tm := time.Now() tmb, err := tm.MarshalBinary() if err != nil { t.Fatal(err) } ts := &tspb.Timestamp{Seconds: 25, Nanos: 300} tsb, err := proto.Marshal(ts) if err != nil { t.Fatal(err) } for _, test := range []struct { in any // pointer that will be set val any // value to set it to want any exactMatch bool }{ {new(any), nil, nil, true}, {new(int), int64(7), int(7), true}, {new(uint8), uint64(250), uint8(250), true}, {new(bool), true, true, true}, {new(string), "x", "x", true}, {new(float32), 4.25, float32(4.25), true}, {new(*int), int64(2), &two, true}, {new(*int), nil, (*int)(nil), true}, {new([]byte), []byte("foo"), []byte("foo"), true}, {new([]string), []any{"a", "b"}, []string{"a", "b"}, true}, {new([]**bool), []any{true, false}, []**bool{&ptru, &pfa}, true}, {&[1]int{1}, []any{2}, [1]int{2}, true}, {&[2]int{1, 2}, []any{3}, [2]int{3, 0}, true}, // zero extra elements {&[]int{1, 2}, []any{3}, []int{3}, true}, // truncate slice { // extend slice func() *[]int { s := make([]int, 1, 2); return &s }(), []any{5, 6}, []int{5, 6}, true, }, { new(map[string]string), map[string]any{"a": "b"}, map[string]string{"a": "b"}, true, }, { new(map[int]bool), map[string]any{"17": true}, map[int]bool{17: true}, true, }, { new(map[te]bool), map[string]any{"B": true}, map[te]bool{{'B'}: true}, true, }, { new(map[any]bool), map[string]any{"B": true}, map[any]bool{"B": true}, true, }, { new(map[string][]bool), map[string]any{ "a": []any{true, false}, "b": []any{false, true}, }, map[string][]bool{ "a": {true, false}, "b": {false, true}, }, true, }, {new(special), 17, special(17), true}, {new(myString), "x", myString("x"), true}, {new([]myString), []any{"x"}, []myString{"x"}, true}, {new(time.Time), tmb, tm, true}, {new(*time.Time), tmb, &tm, true}, {new(*tspb.Timestamp), tsb, ts, true}, {new([]time.Time), []any{tmb}, []time.Time{tm}, true}, {new([]*time.Time), []any{tmb}, []*time.Time{&tm}, true}, { new(map[myString]myString), map[string]any{"a": "x"}, map[myString]myString{"a": "x"}, true, }, { new(map[string]time.Time), map[string]any{"t": tmb}, map[string]time.Time{"t": tm}, true, }, { new(map[string]*time.Time), map[string]any{"t": tmb}, map[string]*time.Time{"t": &tm}, true, }, {new(te), "A", te{'A'}, true}, {new(**te), "B", func() **te { x := &te{'B'}; return &x }(), true}, { &MyStruct{embed4: &embed4{}}, map[string]any{ "A": int64(1), "B": true, "C": []any{"T"}, "D": []any{tmb}, "T": tsb, "E1": "E1", "E2": "E2", "E3": "E3", "E4": "E4", }, MyStruct{ A: 1, B: &tru, C: []*te{{'T'}}, D: []time.Time{tm}, T: ts, Embed1: Embed1{E1: "E1"}, Embed2: &Embed2{E2: "E2"}, embed3: embed3{E3: "E3"}, embed4: &embed4{E4: "E4"}, }, true, }, { &MyStruct{embed4: &embed4{}}, map[string]any{ "a": int64(1), "b": true, "c": []any{"T"}, "d": []any{tmb}, "t": tsb, "e1": "E1", "e2": "E2", "e3": "E3", "e4": "E4", }, MyStruct{ A: 1, B: &tru, C: []*te{{'T'}}, D: []time.Time{tm}, T: ts, Embed1: Embed1{E1: "E1"}, Embed2: &Embed2{E2: "E2"}, embed3: embed3{E3: "E3"}, embed4: &embed4{E4: "E4"}, }, false, }, } { dec := &testDecoder{test.val, test.exactMatch} if err := Decode(reflect.ValueOf(test.in).Elem(), dec); err != nil { t.Fatalf("%T: %v", test.in, err) } got := reflect.ValueOf(test.in).Elem().Interface() diff := cmp.Diff(got, test.want, cmp.Comparer(proto.Equal), cmp.AllowUnexported(MyStruct{})) if diff != "" { t.Errorf("%T (got=-, want=+): %s", test.in, diff) } } } func TestDecodeErrors(t *testing.T) { for _, test := range []struct { desc string in, val any }{ { "bad type", new(int), "foo", }, { "bad type in list", new([]int), []any{1, "foo"}, }, { "array too short", new([1]bool), []any{true, false}, }, { "bad map key type", new(map[float64]any), map[string]any{"a": 1}, }, { "unknown struct field", new(MyStruct), map[string]any{"bad": 1}, }, { "nil embedded, unexported pointer to struct", new(MyStruct), map[string]any{"E4": "E4"}, }, { "int overflow", new(int8), 257, }, { "uint overflow", new(uint8), uint(257), }, { "non-integral float (int)", new(int), 1.5, }, { "non-integral float (uint)", new(uint), 1.5, }, { "bad special", new(badSpecial), badSpecial(0), }, { "bad binary unmarshal", new(badBinaryMarshaler), []byte{1}, }, { "binary unmarshal with non-byte slice", new(time.Time), 1, }, { "bad text unmarshal", new(badTextMarshaler), "foo", }, { "text unmarshal with non-string", new(badTextMarshaler), 1, }, { "bad text unmarshal in map key", new(map[badTextMarshaler]int), map[string]any{"a": 1}, }, { "bad int map key", new(map[int]int), map[string]any{"a": 1}, }, { "overflow in int map key", new(map[int8]int), map[string]any{"256": 1}, }, { "bad uint map key", new(map[uint]int), map[string]any{"a": 1}, }, { "overflow in uint map key", new(map[uint8]int), map[string]any{"256": 1}, }, { "case mismatch when decoding with exact match", &MyStruct{embed4: &embed4{}}, map[string]any{ "a": int64(1), "b": true, "e1": "E1", "e2": "E2", }, }, } { dec := &testDecoder{test.val, true} err := Decode(reflect.ValueOf(test.in).Elem(), dec) if e, ok := err.(*gcerr.Error); !ok || err == nil || e.Code != gcerr.InvalidArgument { t.Errorf("%s: got %v, want InvalidArgument Error", test.desc, err) } } } func TestDecodeFail(t *testing.T) { // Verify that failure to decode a value results in an error. for _, in := range []any{ new(any), new(bool), new(string), new(int), new(uint), new(float32), new([]byte), new([]int), new(map[string]any), } { dec := &failDecoder{} err := Decode(reflect.ValueOf(in).Elem(), dec) if e, ok := err.(*gcerr.Error); !ok || err == nil || e.Code != gcerr.InvalidArgument { t.Errorf("%T: got %v, want InvalidArgument Error", in, err) } } } type testDecoder struct { val any // assume encoded by testEncoder. exactMatch bool } func (d testDecoder) String() string { return fmt.Sprintf("%+v of type %T", d.val, d.val) } func (d testDecoder) AsNull() bool { return d.val == nil } func (d testDecoder) AsBool() (bool, bool) { x, ok := d.val.(bool); return x, ok } func (d testDecoder) AsString() (string, bool) { x, ok := d.val.(string); return x, ok } func (d testDecoder) AsInt() (int64, bool) { switch v := d.val.(type) { case int64: return v, true case int: return int64(v), true default: return 0, false } } func (d testDecoder) AsUint() (uint64, bool) { switch v := d.val.(type) { case uint64: return v, true case uint: return uint64(v), true default: return 0, false } } func (d testDecoder) AsFloat() (float64, bool) { x, ok := d.val.(float64); return x, ok } func (d testDecoder) AsBytes() ([]byte, bool) { x, ok := d.val.([]byte); return x, ok } func (d testDecoder) ListLen() (int, bool) { l, ok := d.val.([]any) if !ok { return 0, false } return len(l), true } func (d testDecoder) DecodeList(f func(i int, vd Decoder) bool) { for i, v := range d.val.([]any) { if !f(i, testDecoder{v, d.exactMatch}) { break } } } func (d testDecoder) MapLen() (int, bool) { if m, ok := d.val.(map[string]any); ok { return len(m), true } return 0, false } func (d testDecoder) DecodeMap(f func(key string, vd Decoder, exactMatch bool) bool) { for k, v := range d.val.(map[string]any) { if !f(k, testDecoder{v, d.exactMatch}, d.exactMatch) { break } } } func (d testDecoder) AsInterface() (any, error) { return d.val, nil } func (d testDecoder) AsSpecial(v reflect.Value) (bool, any, error) { switch v.Type() { case typeOfSpecial: return true, special(d.val.(int)), nil case typeOfBadSpecial: return true, nil, errors.New("bad special") default: return false, nil, nil } } // All of failDecoder's methods return failure. type failDecoder struct{} func (failDecoder) String() string { return "failDecoder" } func (failDecoder) AsNull() bool { return false } func (failDecoder) AsBool() (bool, bool) { return false, false } func (failDecoder) AsString() (string, bool) { return "", false } func (failDecoder) AsInt() (int64, bool) { return 0, false } func (failDecoder) AsUint() (uint64, bool) { return 0, false } func (failDecoder) AsFloat() (float64, bool) { return 0, false } func (failDecoder) AsBytes() ([]byte, bool) { return nil, false } func (failDecoder) ListLen() (int, bool) { return 0, false } func (failDecoder) DecodeList(func(i int, vd Decoder) bool) { panic("impossible") } func (failDecoder) MapLen() (int, bool) { return 0, false } func (failDecoder) DecodeMap(func(string, Decoder, bool) bool) { panic("impossible") } func (failDecoder) AsSpecial(v reflect.Value) (bool, any, error) { return false, nil, nil } func (failDecoder) AsInterface() (any, error) { return nil, errors.New("fail") } ================================================ FILE: docstore/driver/compare.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Useful comparison functions. package driver import ( "fmt" "math/big" "reflect" "time" ) // CompareTimes returns -1, 1 or 0 depending on whether t1 is before, after or // equal to t2. func CompareTimes(t1, t2 time.Time) int { switch { case t1.Before(t2): return -1 case t1.After(t2): return 1 default: return 0 } } // CompareNumbers returns -1, 1 or 0 depending on whether n1 is less than, // greater than or equal to n2. n1 and n2 must be signed integer, unsigned // integer, or floating-point values, but they need not be the same type. // // If both types are integers or both floating-point, CompareNumbers behaves // like Go comparisons on those types. If one operand is integer and the other // is floating-point, CompareNumbers correctly compares the mathematical values // of the numbers, without loss of precision. func CompareNumbers(n1, n2 any) (int, error) { v1, ok := n1.(reflect.Value) if !ok { v1 = reflect.ValueOf(n1) } v2, ok := n2.(reflect.Value) if !ok { v2 = reflect.ValueOf(n2) } f1, err := toBigFloat(v1) if err != nil { return 0, err } f2, err := toBigFloat(v2) if err != nil { return 0, err } return f1.Cmp(f2), nil } func toBigFloat(x reflect.Value) (*big.Float, error) { var f big.Float switch x.Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: f.SetInt64(x.Int()) case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: f.SetUint64(x.Uint()) case reflect.Float32, reflect.Float64: f.SetFloat64(x.Float()) default: typ := "nil" if x.IsValid() { typ = fmt.Sprint(x.Type()) } return nil, fmt.Errorf("%v of type %s is not a number", x, typ) } return &f, nil } ================================================ FILE: docstore/driver/compare_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package driver import ( "math" "testing" "time" ) func TestCompareTimes(t *testing.T) { t1 := time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC) t2 := t1.Add(1) for _, test := range []struct { in1, in2 time.Time want int }{ {t1, t2, -1}, {t2, t1, 1}, {t1, t1, 0}, } { got := CompareTimes(test.in1, test.in2) if got != test.want { t.Errorf("CompareTimes(%v, %v) == %d, want %d", test.in1, test.in2, got, test.want) } } } func TestCompareNumbers(t *testing.T) { check := func(n1, n2 any, want int) { t.Helper() got, err := CompareNumbers(n1, n2) if err != nil { t.Fatalf("CompareNumbers(%T(%[1]v), %T(%[2]v)): %v", n1, n2, err) } if got != want { t.Errorf("CompareNumbers(%T(%[1]v), %T(%[2]v)) = %d, want %d", n1, n2, got, want) } } for _, test := range []struct { in1, in2 any want int }{ // simple cases {1, 1, 0}, {1, 2, -1}, {1.0, 1.0, 0}, {1.0, 2.0, -1}, // mixed int types {int8(1), int64(1), 0}, {int8(2), int64(1), 1}, {uint(1), int(1), 0}, {uint(2), int(1), 1}, // mixed int and float {1, 1.0, 0}, {1, 1.1, -1}, {2, 1.1, 1}, // large numbers {int64(math.MaxInt64), int64(math.MaxInt64), 0}, {uint64(math.MaxUint64), uint64(math.MaxUint64), 0}, {float64(math.MaxFloat64), float64(math.MaxFloat64), 0}, {int64(math.MaxInt64), int64(math.MaxInt64 - 1), 1}, {int64(math.MaxInt64), float64(math.MaxInt64 - 1), -1}, // float is bigger because it gets rounded up {int64(math.MaxInt64), uint64(math.MaxUint64), -1}, // special floats {int64(math.MaxInt64), math.Inf(1), -1}, {int64(math.MinInt64), math.Inf(-1), 1}, } { check(test.in1, test.in2, test.want) if test.want != 0 { check(test.in2, test.in1, -test.want) } } } ================================================ FILE: docstore/driver/document.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package driver import ( "reflect" "gocloud.dev/docstore/internal/fields" "gocloud.dev/gcerrors" "gocloud.dev/internal/gcerr" ) // A Document is a lightweight wrapper around either a map[string]interface{} or a // struct pointer. It provides operations to get and set fields and field paths. type Document struct { Origin any // the argument to NewDocument m map[string]any // nil if it's a *struct s reflect.Value // the struct reflected fields fields.List // for structs } // NewDocument creates a new document from doc, which must be a non-nil // map[string]interface{} or struct pointer. func NewDocument(doc any) (Document, error) { if doc == nil { return Document{}, gcerr.Newf(gcerr.InvalidArgument, nil, "document cannot be nil") } if m, ok := doc.(map[string]any); ok { if m == nil { return Document{}, gcerr.Newf(gcerr.InvalidArgument, nil, "document map cannot be nil") } return Document{Origin: doc, m: m}, nil } v := reflect.ValueOf(doc) t := v.Type() if t.Kind() != reflect.Pointer || t.Elem().Kind() != reflect.Struct { return Document{}, gcerr.Newf(gcerr.InvalidArgument, nil, "expecting *struct or map[string]interface{}, got %s", t) } t = t.Elem() if v.IsNil() { return Document{}, gcerr.Newf(gcerr.InvalidArgument, nil, "document struct pointer cannot be nil") } fields, err := fieldCache.Fields(t) if err != nil { return Document{}, err } return Document{Origin: doc, s: v.Elem(), fields: fields}, nil } // GetField returns the value of the named document field. func (d Document) GetField(field string) (any, error) { if d.m != nil { x, ok := d.m[field] if !ok { return nil, gcerr.Newf(gcerr.NotFound, nil, "field %q not found in map", field) } return x, nil } v, err := d.structField(field) if err != nil { return nil, err } return v.Interface(), nil } // getDocument gets the value of the given field path, which must be a document. // If create is true, it creates intermediate documents as needed. func (d Document) getDocument(fp []string, create bool) (Document, error) { if len(fp) == 0 { return d, nil } x, err := d.GetField(fp[0]) if err != nil { if create && gcerrors.Code(err) == gcerrors.NotFound { // TODO(jba): create the right type for the struct field. x = map[string]any{} if err := d.SetField(fp[0], x); err != nil { return Document{}, err } } else { return Document{}, err } } d2, err := NewDocument(x) if err != nil { return Document{}, err } return d2.getDocument(fp[1:], create) } // Get returns the value of the given field path in the document. func (d Document) Get(fp []string) (any, error) { d2, err := d.getDocument(fp[:len(fp)-1], false) if err != nil { return nil, err } return d2.GetField(fp[len(fp)-1]) } func (d Document) structField(name string) (reflect.Value, error) { // We do case-insensitive match here to cover the MongoDB's lowercaseFields // option. f := d.fields.MatchFold(name) if f == nil { return reflect.Value{}, gcerr.Newf(gcerr.NotFound, nil, "field %q not found in struct type %s", name, d.s.Type()) } fv, ok := fieldByIndex(d.s, f.Index) if !ok { return reflect.Value{}, gcerr.Newf(gcerr.InvalidArgument, nil, "nil embedded pointer; cannot get field %q from %s", name, d.s.Type()) } return fv, nil } // Set sets the value of the field path in the document. // This creates sub-maps as necessary, if possible. func (d Document) Set(fp []string, val any) error { d2, err := d.getDocument(fp[:len(fp)-1], true) if err != nil { return err } return d2.SetField(fp[len(fp)-1], val) } // SetField sets the field to value in the document. func (d Document) SetField(field string, value any) error { if d.m != nil { d.m[field] = value return nil } v, err := d.structField(field) if err != nil { return err } if !v.CanSet() { return gcerr.Newf(gcerr.InvalidArgument, nil, "cannot set field %s in struct of type %s: not addressable", field, d.s.Type()) } v.Set(reflect.ValueOf(value)) return nil } // FieldNames returns names of the top-level fields of d. func (d Document) FieldNames() []string { var names []string if d.m != nil { for k := range d.m { names = append(names, k) } } else { for _, f := range d.fields { names = append(names, f.Name) } } return names } // Encode encodes the document using the given Encoder. func (d Document) Encode(e Encoder) error { if d.m != nil { return encodeMap(reflect.ValueOf(d.m), e) } return encodeStructWithFields(d.s, d.fields, e) } // Decode decodes the document using the given Decoder. func (d Document) Decode(dec Decoder) error { if d.m != nil { return decodeMap(reflect.ValueOf(d.m), dec) } return decodeStruct(d.s, dec) } // HasField returns whether or not d has a certain field. func (d Document) HasField(field string) bool { return d.hasField(field, true) } // HasFieldFold is like HasField but matches case-insensitively for struct // field. func (d Document) HasFieldFold(field string) bool { return d.hasField(field, false) } func (d Document) hasField(field string, exactMatch bool) bool { if d.m != nil { _, ok := d.m[field] return ok } if exactMatch { return d.fields.MatchExact(field) != nil } return d.fields.MatchFold(field) != nil } ================================================ FILE: docstore/driver/document_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package driver import ( "fmt" "sort" "strings" "testing" "github.com/google/go-cmp/cmp" "gocloud.dev/gcerrors" ) type S struct { I int M map[string]any } func TestNewDocument(t *testing.T) { for _, test := range []struct { in any wantErr bool wantMap bool }{ {in: nil, wantErr: true}, {in: map[string]any{}, wantMap: true}, {in: map[string]any(nil), wantErr: true}, {in: S{}, wantErr: true}, {in: &S{}, wantMap: false}, {in: (*S)(nil), wantErr: true}, {in: map[string]bool{}, wantErr: true}, } { got, err := NewDocument(test.in) if err != nil { if !test.wantErr { t.Errorf("%#v: got %v, did not want error", test.in, err) } if c := gcerrors.Code(err); c != gcerrors.InvalidArgument { t.Errorf("%#v: got error code %s, want InvalidArgument", test.in, c) } continue } if test.wantErr { t.Errorf("%#v: got nil, want error", test.in) continue } if g := (got.m != nil); g != test.wantMap { t.Errorf("%#v: got map: %t, want map: %t", test.in, g, test.wantMap) } } } func TestGet(t *testing.T) { in := map[string]any{ "S": &S{ I: 2, M: map[string]any{ "J": 3, "T": &S{I: 4}, }, }, } doc, err := NewDocument(in) if err != nil { t.Fatal(err) } for _, test := range []struct { fp string want any }{ {"S.I", 2}, {"S.i", 2}, {"S.M.J", 3}, {"S.m.J", 3}, {"S.M.T.I", 4}, {"S.m.T.i", 4}, } { fp := strings.Split(test.fp, ".") got, err := doc.Get(fp) if err != nil { t.Fatal(err) } if !cmp.Equal(got, test.want) { t.Errorf("%s: got %v, want %v", got, test.fp, test.want) } } } func TestSet(t *testing.T) { in := map[string]any{ "S": &S{ I: 2, M: map[string]any{ "J": 3, "T": &S{I: 4}, }, }, } doc, err := NewDocument(in) if err != nil { t.Fatal(err) } for _, test := range []struct { fp string val any }{ {"S.I", -1}, {"S.i", -2}, {"S.M.J", -3}, {"S.m.J", -4}, {"S.M.T.I", -5}, {"S.m.T.i", -6}, {"new.field", -7}, } { fp := strings.Split(test.fp, ".") if err := doc.Set(fp, test.val); err != nil { t.Fatalf("%q: %v", test.fp, err) } got, err := doc.Get(fp) if err != nil { t.Fatalf("%s: %v", test.fp, err) } if !cmp.Equal(got, test.val) { t.Errorf("got %v, want %v", got, test.val) } } } func TestGetField(t *testing.T) { type S struct { A int `docstore:"a"` B any `docstore:"b"` } want := 1 for _, in := range []any{ map[string]any{"a": want, "b": nil}, &S{A: want, B: nil}, } { t.Run(fmt.Sprint(in), func(t *testing.T) { doc, err := NewDocument(in) if err != nil { t.Fatal(err) } got, err := doc.GetField("a") if err != nil { t.Fatal(err) } if got != want { t.Errorf("got %v, want %v", got, want) } got, err = doc.GetField("b") if err != nil { t.Fatal(err) } if got != nil { t.Errorf("got %v, want nil", got) } _, err = doc.GetField("c") if gcerrors.Code(err) != gcerrors.NotFound { t.Fatalf("got %v, want NotFound", err) } }) } } func TestFieldNames(t *testing.T) { type E struct { C int } type S struct { A int `docstore:"a"` B int E } for _, test := range []struct { in any want []string }{ { map[string]any{"a": 1, "b": map[string]any{"c": 2}}, []string{"a", "b"}, }, { &S{}, []string{"B", "C", "a"}, }, } { doc, err := NewDocument(test.in) if err != nil { t.Fatal(err) } got := doc.FieldNames() sort.Strings(got) if !cmp.Equal(got, test.want) { t.Errorf("%v: got %v, want %v", test.in, got, test.want) } } } func TestHasField(t *testing.T) { type withRev struct { Rev any } type withoutRev struct { W withRev } for _, tc := range []struct { in any want bool }{ { in: &withRev{}, want: true, }, { in: &withoutRev{}, want: false, }, { in: map[string]any{"Rev": nil}, want: true, }, { in: map[string]any{}, want: false, }, } { doc, err := NewDocument(tc.in) if err != nil { t.Fatal(err) } on := doc.HasField("Rev") if on != tc.want { t.Errorf("%v: got %v want %v", tc.in, on, tc.want) } } } func TestHasFieldFold(t *testing.T) { type withRev struct { Rev any } type withoutRev struct { W withRev } for _, tc := range []struct { in any want bool }{ { in: &withRev{}, want: true, }, { in: &withoutRev{}, want: false, }, } { doc, err := NewDocument(tc.in) if err != nil { t.Fatal(err) } for _, f := range []string{"Rev", "rev", "REV"} { on := doc.HasFieldFold(f) if on != tc.want { t.Errorf("%v: got %v want %v", tc.in, on, tc.want) } } } } ================================================ FILE: docstore/driver/driver.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package driver defines interfaces to be implemented by docstore drivers, which // will be used by the docstore package to interact with the underlying services. // Application code should use package docstore. package driver // import "gocloud.dev/docstore/driver" import ( "context" "gocloud.dev/gcerrors" ) // A Collection is a set of documents. type Collection interface { // Key returns the document key, or nil if the document doesn't have one, which // means it is absent or zero value, such as 0, a nil interface value, and any // empty array or string. // // If the collection is able to generate a key for a Create action, then // it should not return an error if the key is missing. If the collection // can't generate a missing key, it should return an error. // // The returned key must be comparable. // // The returned key should not be encoded with the driver's codec; it should // be the user-supplied Go value. Key(Document) (any, error) // RevisionField returns the name of the field used to hold revisions. // If the empty string is returned, docstore.DefaultRevisionField will be used. RevisionField() string // RunActions executes a slice of actions. // // If unordered is false, it must appear as if the actions were executed in the // order they appear in the slice, from the client's point of view. The actions // need not happen atomically, nor does eventual consistency in the service // need to be taken into account. For example, after a write returns // successfully, the driver can immediately perform a read on the same document, // even though the service's semantics does not guarantee that the read will see // the write. RunActions should return immediately after the first action that fails. // The returned slice should have a single element. // // opts controls the behavior of RunActions and is guaranteed to be non-nil. RunActions(ctx context.Context, actions []*Action, opts *RunActionsOptions) ActionListError // RunGetQuery executes a Query. // // Implementations can choose to execute the Query as one single request or // multiple ones, depending on their service offerings. The portable type // exposes OpenTelemetry metrics for the call to RunGetQuery (but not for // subsequent calls to DocumentIterator.Next), so drivers should prefer to // make at least one RPC during RunGetQuery itself instead of lazily waiting // for the first call to Next. RunGetQuery(context.Context, *Query) (DocumentIterator, error) // QueryPlan returns the plan for the query. QueryPlan(*Query) (string, error) // RevisionToBytes converts a revision to a byte slice. RevisionToBytes(any) ([]byte, error) // BytesToRevision converts a []byte to a revision. BytesToRevision([]byte) (any, error) // As converts i to driver-specific types. // See https://gocloud.dev/concepts/as/ for background information. As(i any) bool // ErrorAs allows drivers to expose driver-specific types for returned // errors. // // See https://gocloud.dev/concepts/as/ for background information. ErrorAs(err error, i any) bool // ErrorCode should return a code that describes the error, which was returned by // one of the other methods in this interface. ErrorCode(error) gcerrors.ErrorCode // Close cleans up any resources used by the Collection. Once Close is called, // there will be no method calls to the Collection other than As, ErrorAs, and // ErrorCode. Close() error } // DeleteQueryer should be implemented by Collections that can handle Query.Delete // efficiently. If a Collection does not implement this interface, then Query.Delete // will be implemented by calling RunGetQuery and deleting the returned documents. type DeleteQueryer interface { RunDeleteQuery(context.Context, *Query) error } // UpdateQueryer should be implemented by Collections that can handle Query.Update // efficiently. If a Collection does not implement this interface, then Query.Update // will be implemented by calling RunGetQuery and updating the returned documents. type UpdateQueryer interface { RunUpdateQuery(context.Context, *Query, []Mod) error } // ActionKind describes the type of an action. type ActionKind int // Values for ActionKind. const ( Create ActionKind = iota Replace Put Get Delete Update ) //go:generate stringer -type=ActionKind type Action struct { Kind ActionKind // the kind of action Doc Document // the document on which to perform the action Key any // the document key returned by Collection.Key, to avoid recomputing it FieldPaths [][]string // field paths to retrieve, for Get only Mods []Mod // modifications to make, for Update only Index int // the index of the action in the original action list InAtomicWrite bool // if this action is a part of transaction } // A Mod is a modification to a field path in a document. // At present, the only modifications supported are: // - set the value at the field path, or create the field path if it doesn't exist // - delete the field path (when Value is nil) type Mod struct { FieldPath []string Value any } // IncOp is a value representing an increment modification. type IncOp struct { Amount any } // An ActionListError contains all the errors encountered from a call to RunActions, // and the positions of the corresponding actions. type ActionListError []struct { Index int Err error } // NewActionListError creates an ActionListError from a slice of errors. // If the ith element err of the slice is non-nil, the resulting ActionListError // will have an item {i, err}. func NewActionListError(errs []error) ActionListError { var alerr ActionListError for i, err := range errs { if err != nil { alerr = append(alerr, struct { Index int Err error }{i, err}) } } return alerr } // RunActionsOptions controls the behavior of RunActions. type RunActionsOptions struct { // BeforeDo is a callback that must be called once, sequentially, before each one // or group of the underlying service's actions is executed. asFunc allows // drivers to expose driver-specific types. BeforeDo func(asFunc func(any) bool) error } // A Query defines a query operation to find documents within a collection based // on a set of requirements. type Query struct { // FieldPaths contain a list of field paths the user selects to return in the // query results. The returned documents should only have these fields // populated. FieldPaths [][]string // Filters contain a list of filters for the query. If there are more than one // filter, they should be combined with AND. Filters []Filter // Offset (also commonly referred to as `Skip`) sets the number of results to skip // before returning results. When Offset <= 0, the driver implementation should // return all possible results. Offset int // Limit sets the maximum number of results returned by running the query. When // Limit <= 0, the driver implementation should return all possible results. Limit int // OrderByField is the field to use for sorting the results. OrderByField string // OrderAscending specifies the sort direction. OrderAscending bool // BeforeQuery is a callback that must be called exactly once before the // underlying service's query is executed. asFunc allows drivers to expose // driver-specific types. BeforeQuery func(asFunc func(any) bool) error } // A Filter defines a filter expression used to filter the query result. // If the value is a number type, the filter uses numeric comparison. // If the value is a string type, the filter uses UTF-8 string comparison. // TODO(#1762): support comparison of other types. type Filter struct { FieldPath []string // the field path to filter Op string // the operation, supports `=`, `>`, `>=`, `<`, `<=`, `in`, `not-in` Value any // the value to compare using the operation } // A DocumentIterator iterates through the results (for Get action). type DocumentIterator interface { // Next tries to get the next item in the query result and decodes into Document // with the driver's codec. // When there are no more results, it should return io.EOF. // Once Next returns a non-nil error, it will never be called again. Next(context.Context, Document) error // Stop terminates the iterator before Next return io.EOF, allowing any cleanup // needed. Stop() // As converts i to driver-specific types. // See https://gocloud.dev/concepts/as/ for background information. As(i any) bool } // EqualOp is the name of the equality operator. // It is defined here to avoid confusion between "=" and "==". const EqualOp = "=" ================================================ FILE: docstore/driver/util.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package driver import ( "reflect" "sort" "sync" "github.com/google/uuid" ) // UniqueString generates a string that is unique with high probability. // Driver implementations can use it to generate keys for Create actions. func UniqueString() string { return uuid.New().String() } // SplitActions divides the actions slice into sub-slices much like strings.Split. // The split function should report whether two consecutive actions should be split, // that is, should be in different sub-slices. The first argument to split is the // last action of the sub-slice currently under construction; the second argument is // the action being considered for addition to that sub-slice. // SplitActions doesn't change the order of the input slice. func SplitActions(actions []*Action, split func(a, b *Action) bool) [][]*Action { var ( groups [][]*Action // the actions, split; the return value cur []*Action // the group currently being constructed ) collect := func() { // called when the current group is known to be finished if len(cur) > 0 { groups = append(groups, cur) cur = nil } } for _, a := range actions { if len(cur) > 0 && split(cur[len(cur)-1], a) { collect() } cur = append(cur, a) } collect() return groups } // GroupActions separates actions into four sets: writes, gets that must happen before the writes, // gets that must happen after the writes, and gets that can happen concurrently with the writes. func GroupActions(actions []*Action) (beforeGets, getList, writeList, writesTxList, afterGets []*Action) { // maps from key to action bgets := map[any]*Action{} agets := map[any]*Action{} cgets := map[any]*Action{} writes := map[any]*Action{} writesTx := map[any]*Action{} var nilkeys []*Action for _, a := range actions { if a.Key == nil { // Probably a Create. nilkeys = append(nilkeys, a) } else if a.Kind == Get { // If there was a prior write with this key, make sure this get // happens after the writes. if _, ok := writes[a.Key]; ok { agets[a.Key] = a } else if _, ok := writesTx[a.Key]; ok { agets[a.Key] = a } else { cgets[a.Key] = a } } else { // This is a write. A prior get on the same key was put into cgets; move // it to bgets because it has to happen before writes. if g, ok := cgets[a.Key]; ok { delete(cgets, a.Key) bgets[a.Key] = g } if a.InAtomicWrite { writesTx[a.Key] = a } else { writes[a.Key] = a } } } vals := func(m map[any]*Action) []*Action { var as []*Action for _, v := range m { as = append(as, v) } // Sort so the order is always the same for replay. sort.Slice(as, func(i, j int) bool { return as[i].Index < as[j].Index }) return as } return vals(bgets), vals(cgets), append(vals(writes), nilkeys...), vals(writesTx), vals(agets) } // AsFunc creates and returns an "as function" that behaves as follows: // If its argument is a pointer to the same type as val, the argument is set to val // and the function returns true. Otherwise, the function returns false. func AsFunc(val any) func(any) bool { rval := reflect.ValueOf(val) wantType := reflect.PtrTo(rval.Type()) return func(i any) bool { if i == nil { return false } ri := reflect.ValueOf(i) if ri.Type() != wantType { return false } ri.Elem().Set(rval) return true } } // GroupByFieldPath collect the Get actions into groups with the same set of // field paths. func GroupByFieldPath(gets []*Action) [][]*Action { // This is quadratic in the worst case, but it's unlikely that there would be // many Gets with different field paths. var groups [][]*Action seen := map[*Action]bool{} for len(seen) < len(gets) { var g []*Action for _, a := range gets { if !seen[a] { if len(g) == 0 || fpsEqual(g[0].FieldPaths, a.FieldPaths) { g = append(g, a) seen[a] = true } } } groups = append(groups, g) } return groups } // Report whether two lists of field paths are equal. func fpsEqual(fps1, fps2 [][]string) bool { // TODO?: We really care about sets of field paths, but that's too tedious to determine. if len(fps1) != len(fps2) { return false } for i, fp1 := range fps1 { if !FieldPathsEqual(fp1, fps2[i]) { return false } } return true } // FieldPathsEqual reports whether two field paths are equal. func FieldPathsEqual(fp1, fp2 []string) bool { if len(fp1) != len(fp2) { return false } for i, s1 := range fp1 { if s1 != fp2[i] { return false } } return true } // FieldPathEqualsField reports whether a field path equals a field. // This is a convenience for FieldPathsEqual(fp, []string{s}). func FieldPathEqualsField(fp []string, s string) bool { return len(fp) == 1 && fp[0] == s } // Throttle is used to limit the number of outstanding activities, like RPCs. // It acts like a combination of a semaphore and a WaitGroup. type Throttle struct { c chan struct{} // token semaphore wg sync.WaitGroup } // NewThrottle returns a Throttle that will allow max calls to Acquire that // are not matched with Release calls before blocking. // If max is <= 0, there is no throttling: Acquire always returns immediately. func NewThrottle(max int) *Throttle { t := &Throttle{} if max > 0 { t.c = make(chan struct{}, max) } return t } // Acquire blocks until a token is available, then acquires it and returns. // Acquire is deliberately not sensitive to context.Context, because it assumes // that whatever acquires a token will be context-sensitive, and thus will release // the token when the context is done. func (t *Throttle) Acquire() { t.wg.Add(1) if t.c != nil { t.c <- struct{}{} } } // Release releases a token obtained by Acquire. func (t *Throttle) Release() { if t.c != nil { <-t.c } t.wg.Done() } // Wait blocks goroutine until the number of calls to Release matches the number of // calls to Acquire. func (t *Throttle) Wait() { t.wg.Wait() } ================================================ FILE: docstore/driver/util_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package driver import ( "fmt" "testing" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" ) func TestSplitActions(t *testing.T) { in := []*Action{ {Kind: Get}, {Kind: Get}, {Kind: Put}, {Kind: Update}, {Kind: Get}, {Kind: Create}, } for _, test := range []struct { desc string split func(a, b *Action) bool want [][]*Action }{ { "always false", func(a, b *Action) bool { return false }, [][]*Action{in}, }, { "always true", func(a, b *Action) bool { return true }, [][]*Action{ {{Kind: Get}}, {{Kind: Get}}, {{Kind: Put}}, {{Kind: Update}}, {{Kind: Get}}, {{Kind: Create}}, }, }, { "Get vs. other", func(a, b *Action) bool { return (a.Kind == Get) != (b.Kind == Get) }, [][]*Action{ {{Kind: Get}, {Kind: Get}}, {{Kind: Put}, {Kind: Update}}, {{Kind: Get}}, {{Kind: Create}}, }, }, } { got := SplitActions(in, test.split) if diff := cmp.Diff(got, test.want, cmpopts.IgnoreFields(Action{}, "Doc")); diff != "" { t.Errorf("%s: %s", test.desc, diff) } } } func TestGroupActions(t *testing.T) { for _, test := range []struct { in []*Action want [][]int // in the same order as the return args }{ { in: []*Action{{Kind: Get, Key: 1}}, want: [][]int{nil, {0}, nil, nil, nil}, }, { in: []*Action{ {Kind: Get, Key: 1}, {Kind: Get, Key: 3}, {Kind: Put, Key: 1}, {Kind: Replace, Key: 2}, {Kind: Get, Key: 2}, }, want: [][]int{{0}, {1}, {2, 3}, nil, {4}}, }, { in: []*Action{{Kind: Create}, {Kind: Create}, {Kind: Create}}, want: [][]int{nil, nil, {0, 1, 2}, nil, nil}, }, { in: []*Action{ {Kind: Get, Key: 1}, {Kind: Get, Key: 3}, {Kind: Put, Key: 1, InAtomicWrite: true}, {Kind: Replace, Key: 2, InAtomicWrite: true}, {Kind: Get, Key: 2}, }, want: [][]int{{0}, {1}, nil, {2, 3}, {4}}, }, { in: []*Action{ {Kind: Get, Key: 1}, {Kind: Get, Key: 3}, {Kind: Put, Key: 1, InAtomicWrite: true}, {Kind: Replace, Key: 2}, {Kind: Put, Key: 2, InAtomicWrite: true}, {Kind: Get, Key: 2}, }, want: [][]int{{0}, {1}, {3}, {2, 4}, {5}}, }, { in: []*Action{ {Kind: Get, Key: 1}, {Kind: Get, Key: 3}, {Kind: Put, Key: 1, InAtomicWrite: true}, {Kind: Replace, Key: 2, InAtomicWrite: true}, {Kind: Put, Key: 2, InAtomicWrite: true}, {Kind: Get, Key: 2}, }, want: [][]int{{0}, {1}, nil, {2, 4}, {5}}, }, } { got := make([][]*Action, 5) got[0], got[1], got[2], got[3], got[4] = GroupActions(test.in) want := make([][]*Action, 5) for i, s := range test.want { for _, x := range s { want[i] = append(want[i], test.in[x]) } } diff := cmp.Diff(got, want, cmpopts.IgnoreUnexported(Document{}), cmpopts.SortSlices(func(a1, a2 *Action) bool { if a1.Kind != a2.Kind { return a1.Kind < a2.Kind } a1k, _ := a1.Key.(int) a2k, _ := a2.Key.(int) return a1k < a2k })) if diff != "" { t.Errorf("%v: %s", test.in, diff) } } } func (a *Action) String() string { // for TestGroupActions return fmt.Sprintf("<%s %v>", a.Kind, a.Key) } func TestAsFunc(t *testing.T) { x := 1 as := AsFunc(x) var y int if !as(&y) || y != 1 { t.Errorf("*int: returned false or wrong value %d", y) } var z float64 for _, arg := range []any{nil, y, &z} { if as(arg) { t.Errorf("%#v: got true, want false", arg) } } } func TestGroupByFieldPath(t *testing.T) { for i, test := range []struct { in []*Action want [][]int // indexes into test.in }{ { in: []*Action{{Index: 0}, {Index: 1}, {Index: 2}}, want: [][]int{{0, 1, 2}}, }, { in: []*Action{{Index: 0}, {Index: 1, FieldPaths: [][]string{{"a"}}}, {Index: 2}}, want: [][]int{{0, 2}, {1}}, }, { in: []*Action{ {Index: 0, FieldPaths: [][]string{{"a", "b"}}}, {Index: 1, FieldPaths: [][]string{{"a"}}}, {Index: 2}, {Index: 3, FieldPaths: [][]string{{"a"}, {"b"}}}, }, want: [][]int{{0}, {1}, {2}, {3}}, }, } { got := GroupByFieldPath(test.in) want := make([][]*Action, len(test.want)) for i, s := range test.want { want[i] = make([]*Action, len(s)) for j, x := range s { want[i][j] = test.in[x] } } if diff := cmp.Diff(got, want, cmpopts.IgnoreUnexported(Document{})); diff != "" { t.Errorf("#%d: %s", i, diff) } } } ================================================ FILE: docstore/drivertest/driverbenchmark.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package drivertest import ( "context" "fmt" "strconv" "sync/atomic" "testing" "gocloud.dev/docstore" ) // RunBenchmarks runs benchmarks for docstore drivers. func RunBenchmarks(b *testing.B, coll *docstore.Collection) { b.Helper() defer coll.Close() ClearCollection(b, coll) b.Run("BenchmarkSingleActionPut", func(b *testing.B) { benchmarkSingleActionPut(b, 10, coll) }) b.Run("BenchmarkSingleActionGet", func(b *testing.B) { benchmarkSingleActionGet(b, 10, coll) }) b.Run("BenchmarkActionListPut", func(b *testing.B) { benchmarkActionListPut(b, 50, coll) }) b.Run("BenchmarkActionListGet", func(b *testing.B) { benchmarkActionListGet(b, 100, coll) }) ClearCollection(b, coll) } func benchmarkSingleActionPut(b *testing.B, n int, coll *docstore.Collection) { b.Helper() ctx := context.Background() const baseKey = "benchmarksingleaction-put-" var nextID uint32 b.ResetTimer() b.RunParallel(func(pb *testing.PB) { for pb.Next() { for range n { key := fmt.Sprintf("%s%d", baseKey, atomic.AddUint32(&nextID, 1)) doc := docmap{KeyField: key, "S": key} if err := coll.Put(ctx, doc); err != nil { b.Error(err) } } } }) } func benchmarkSingleActionGet(b *testing.B, n int, coll *docstore.Collection) { b.Helper() ctx := context.Background() const baseKey = "benchmarksingleaction-get-" docs := make([]docmap, n) puts := coll.Actions() for i := range n { docs[i] = docmap{KeyField: baseKey + strconv.Itoa(i), "n": i} puts.Put(docs[i]) } if err := puts.Do(ctx); err != nil { b.Fatal(err) } b.ResetTimer() b.RunParallel(func(pb *testing.PB) { for pb.Next() { for _, doc := range docs { got := docmap{KeyField: doc[KeyField]} if err := coll.Get(ctx, got); err != nil { b.Fatal(err) } } } }) } func benchmarkActionListPut(b *testing.B, n int, coll *docstore.Collection) { b.Helper() ctx := context.Background() const baseKey = "benchmarkactionlist-put-" var nextID uint32 b.ResetTimer() b.RunParallel(func(pb *testing.PB) { for pb.Next() { actions := coll.Actions() for range n { key := fmt.Sprintf("%s%d", baseKey, atomic.AddUint32(&nextID, 1)) doc := docmap{KeyField: key, "S": key} actions.Put(doc) } if err := actions.Do(ctx); err != nil { b.Error(err) } } }) } func benchmarkActionListGet(b *testing.B, n int, coll *docstore.Collection) { b.Helper() ctx := context.Background() const baseKey = "benchmarkactionlist-get-" docs := make([]docmap, n) puts := coll.Actions() for i := range n { docs[i] = docmap{KeyField: baseKey + strconv.Itoa(i), "n": i} puts.Put(docs[i]) } if err := puts.Do(ctx); err != nil { b.Fatal(err) } b.ResetTimer() b.RunParallel(func(pb *testing.PB) { for pb.Next() { gets := coll.Actions() for _, doc := range docs { got := docmap{KeyField: doc[KeyField]} gets.Get(got) } if err := gets.Do(ctx); err != nil { b.Fatal(err) } } }) } ================================================ FILE: docstore/drivertest/drivertest.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package drivertest provides a conformance test for implementations of // driver. package drivertest // import "gocloud.dev/docstore/drivertest" import ( "context" "errors" "fmt" "io" "maps" "math" "reflect" "strings" "testing" "time" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "gocloud.dev/docstore" "gocloud.dev/docstore/driver" "gocloud.dev/gcerrors" "google.golang.org/protobuf/proto" tspb "google.golang.org/protobuf/types/known/timestamppb" ) // ByteArray is an array of 2 bytes. type ByteArray [2]byte // CollectionKind describes the kind of testing collection to create. type CollectionKind int const ( // SingleKey is collection with a single primary key field of type string named // drivertest.KeyField. SingleKey CollectionKind = iota // TwoKey is a collection that will consist entirely of HighScore structs (see below), // whose two primary key fields are "Game" and "Player", both strings. Use // drivertest.HighScoreKey as the key function. TwoKey // AltRev is a collection that behaves like a SingleKey collection, except // that the revision field should be drivertest.AlternateRevisionField. AltRev // NoRev is a collection whose documents will not have a revision field. NoRev ) // Harness descibes the functionality test harnesses must provide to run // conformance tests. type Harness interface { // MakeCollection makes a driver.Collection for testing. MakeCollection(context.Context, CollectionKind) (driver.Collection, error) // BeforeDoTypes should return a list of values whose types are valid for the as // function given to BeforeDo. For example, if the driver converts Get actions // to *GetRequests and write actions to *WriteRequests, then BeforeDoTypes should // return []interface{}{&GetRequest{}, &WriteRequest{}}. // TODO(jba): consider splitting these by action kind. BeforeDoTypes() []any // BeforeQueryTypes should return a list of values whose types are valid for the as // function given to BeforeQuery. BeforeQueryTypes() []any // RevisionsEqual reports whether two revisions are equal. RevisionsEqual(rev1, rev2 any) bool // SupportsAtomicWrites should report if a collection supports atomic writes SupportsAtomicWrites() bool // Close closes resources used by the harness. Close() } // HarnessMaker describes functions that construct a harness for running tests. // It is called exactly once per test; Harness.Close() will be called when the test is complete. type HarnessMaker func(ctx context.Context, t *testing.T) (Harness, error) // UnsupportedType is an enum for types not supported by native codecs. We chose // to describe this negatively (types that aren't supported rather than types // that are) to make the more inclusive cases easier to write. A driver can // return nil for CodecTester.UnsupportedTypes, then add values from this enum // one by one until all tests pass. type UnsupportedType int // These are known unsupported types by one or more driver. Each of them // corresponses to an unsupported type specific test which if the driver // actually supports. const ( // Native codec doesn't support any unsigned integer type Uint UnsupportedType = iota // Native codec doesn't support arrays Arrays // Native codec doesn't support full time precision NanosecondTimes // Native codec doesn't support [][]byte BinarySet ) // CodecTester describes functions that encode and decode values using both the // docstore codec for a driver, and that driver's own "native" codec. type CodecTester interface { UnsupportedTypes() []UnsupportedType NativeEncode(any) (any, error) NativeDecode(value, dest any) error DocstoreEncode(any) (any, error) DocstoreDecode(value, dest any) error } // AsTest represents a test of As functionality. type AsTest interface { // Name should return a descriptive name for the test. Name() string // CollectionCheck will be called to allow verification of Collection.As. CollectionCheck(coll *docstore.Collection) error // QueryCheck will be called after calling Query. It should call it.As and // verify the results. QueryCheck(it *docstore.DocumentIterator) error // ErrorCheck is called to allow verification of Collection.ErrorAs. ErrorCheck(c *docstore.Collection, err error) error } type verifyAsFailsOnNil struct{} func (verifyAsFailsOnNil) Name() string { return "verify As returns false when passed nil" } func (verifyAsFailsOnNil) CollectionCheck(coll *docstore.Collection) error { if coll.As(nil) { return errors.New("want Collection.As to return false when passed nil") } return nil } func (verifyAsFailsOnNil) QueryCheck(it *docstore.DocumentIterator) error { if it.As(nil) { return errors.New("want DocumentIterator.As to return false when passed nil") } return nil } func (v verifyAsFailsOnNil) ErrorCheck(c *docstore.Collection, err error) (ret error) { defer func() { if recover() == nil { ret = errors.New("want ErrorAs to panic when passed nil") } }() c.ErrorAs(err, nil) return nil } // RunConformanceTests runs conformance tests for driver implementations of docstore. func RunConformanceTests(t *testing.T, newHarness HarnessMaker, ct CodecTester, asTests []AsTest) { t.Helper() t.Run("TypeDrivenCodec", func(t *testing.T) { testTypeDrivenDecode(t, ct) }) t.Run("BlindCodec", func(t *testing.T) { testBlindDecode(t, ct) }) t.Run("Create", func(t *testing.T) { withRevCollections(t, newHarness, testCreate) }) t.Run("AtomicWrites", func(t *testing.T) { withRevCollections(t, newHarness, testAtomicWrites) }) t.Run("AtomicWritesFail", func(t *testing.T) { withRevCollections(t, newHarness, testAtomicWritesFail) }) t.Run("Put", func(t *testing.T) { withRevCollections(t, newHarness, testPut) }) t.Run("Replace", func(t *testing.T) { withRevCollections(t, newHarness, testReplace) }) t.Run("Get", func(t *testing.T) { withRevCollections(t, newHarness, testGet) }) t.Run("Delete", func(t *testing.T) { withRevCollections(t, newHarness, testDelete) }) t.Run("Update", func(t *testing.T) { withRevCollections(t, newHarness, testUpdate) }) t.Run("Data", func(t *testing.T) { withCollection(t, newHarness, SingleKey, testData) }) t.Run("Proto", func(t *testing.T) { withCollection(t, newHarness, SingleKey, testProto) }) t.Run("MultipleActions", func(t *testing.T) { withRevCollections(t, newHarness, testMultipleActions) }) t.Run("GetQueryKeyField", func(t *testing.T) { withRevCollections(t, newHarness, testGetQueryKeyField) }) t.Run("SerializeRevision", func(t *testing.T) { withCollection(t, newHarness, SingleKey, testSerializeRevision) }) t.Run("ActionsOnStructNoRev", func(t *testing.T) { withCollection(t, newHarness, NoRev, testActionsOnStructNoRev) }) t.Run("ActionsWithCompositeID", func(t *testing.T) { withCollection(t, newHarness, TwoKey, testActionsWithCompositeID) }) t.Run("GetQuery", func(t *testing.T) { withCollection(t, newHarness, TwoKey, testGetQuery) }) t.Run("ExampleInDoc", func(t *testing.T) { withCollection(t, newHarness, NoRev, testExampleInDoc) }) t.Run("BeforeDo", func(t *testing.T) { testBeforeDo(t, newHarness) }) t.Run("BeforeQuery", func(t *testing.T) { testBeforeQuery(t, newHarness) }) asTests = append(asTests, verifyAsFailsOnNil{}) t.Run("As", func(t *testing.T) { for _, st := range asTests { if st.Name() == "" { t.Fatalf("AsTest.Name is required") } t.Run(st.Name(), func(t *testing.T) { withCollection(t, newHarness, TwoKey, func(t *testing.T, _ Harness, coll *docstore.Collection) { t.Helper() testAs(t, coll, st) }) }) } }) } // withCollection calls f with a fresh harness and an empty collection of the given kind. func withCollection(t *testing.T, newHarness HarnessMaker, kind CollectionKind, f func(*testing.T, Harness, *docstore.Collection)) { t.Helper() ctx := context.Background() h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() withColl(t, h, kind, f) } // withRevCollections calls f twice: once with the SingleKey collection, using documents and code that expect // the standard revision field; and once with the AltRev collection, that uses an alternative revisionf field // name. func withRevCollections(t *testing.T, newHarness HarnessMaker, f func(*testing.T, *docstore.Collection, string)) { t.Helper() ctx := context.Background() h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() if strings.Contains(t.Name(), "AtomicWrites") && !h.SupportsAtomicWrites() { t.Skip() } t.Run("StdRev", func(t *testing.T) { withColl(t, h, SingleKey, func(t *testing.T, _ Harness, coll *docstore.Collection) { t.Helper() f(t, coll, docstore.DefaultRevisionField) }) }) t.Run("AltRev", func(t *testing.T) { withColl(t, h, AltRev, func(t *testing.T, _ Harness, coll *docstore.Collection) { t.Helper() f(t, coll, AlternateRevisionField) }) }) } // withColl calls f with h and an empty collection of the given kind. It takes care of closing // the collection after f returns. func withColl(t *testing.T, h Harness, kind CollectionKind, f func(*testing.T, Harness, *docstore.Collection)) { t.Helper() ctx := context.Background() dc, err := h.MakeCollection(ctx, kind) if err != nil { t.Fatal(err) } coll := docstore.NewCollection(dc) defer coll.Close() ClearCollection(t, coll) f(t, h, coll) } // KeyField is the primary key field for the main test collection. const KeyField = "name" // AlternateRevisionField is used for testing the option to provide a different // name for the revision field. const AlternateRevisionField = "Etag" type docmap = map[string]any func newDoc(doc any) any { switch v := doc.(type) { case docmap: return docmap{KeyField: v[KeyField]} case *docstruct: return &docstruct{Name: v.Name} } return nil } func key(doc any) any { switch d := doc.(type) { case docmap: return d[KeyField] case *docstruct: return d.Name } return nil } func setKey(doc, key any) { switch d := doc.(type) { case docmap: d[KeyField] = key case *docstruct: d.Name = key } } func revision(doc any, revField string) any { switch d := doc.(type) { case docmap: return d[revField] case *docstruct: if revField == docstore.DefaultRevisionField { return d.DocstoreRevision } return d.Etag } return nil } func setRevision(doc, rev any, revField string) { switch d := doc.(type) { case docmap: d[revField] = rev case *docstruct: if revField == docstore.DefaultRevisionField { d.DocstoreRevision = rev } else { d.Etag = rev } } } type docstruct struct { Name any `docstore:"name"` DocstoreRevision any Etag any I int U uint F float64 St string B bool M map[string]any } func nonexistentDoc() docmap { return docmap{KeyField: "doesNotExist"} } func testCreate(t *testing.T, coll *docstore.Collection, revField string) { t.Helper() ctx := context.Background() for _, tc := range []struct { name string doc any wantErr gcerrors.ErrorCode }{ { name: "named map", doc: docmap{KeyField: "testCreateMap", "b": true, revField: nil}, }, { name: "existing", doc: docmap{KeyField: "testCreateMap", revField: nil}, wantErr: gcerrors.AlreadyExists, }, { name: "unnamed map", doc: docmap{"b": true, revField: nil}, }, { name: "named struct", doc: &docstruct{Name: "testCreateStruct", B: true}, }, { name: "unnamed struct", doc: &docstruct{B: true}, }, { name: "empty named struct", doc: &docstruct{Name: "", B: true}, }, { name: "with non-nil revision", doc: docmap{KeyField: "testCreate2", revField: 0}, wantErr: gcerrors.InvalidArgument, }, } { t.Run(tc.name, func(t *testing.T) { if tc.wantErr == gcerrors.OK { checkNoRevisionField(t, tc.doc, revField) if err := coll.Create(ctx, tc.doc); err != nil { t.Fatalf("Create: %v", err) } checkHasRevisionField(t, tc.doc, revField) got := newDoc(tc.doc) if err := coll.Get(ctx, got); err != nil { t.Fatalf("Get: %v", err) } if diff := cmpDiff(got, tc.doc); diff != "" { t.Fatal(diff) } } else { err := coll.Create(ctx, tc.doc) checkCode(t, err, tc.wantErr) } }) } } func testPut(t *testing.T, coll *docstore.Collection, revField string) { t.Helper() ctx := context.Background() must := func(err error) { t.Helper() if err != nil { t.Fatal(err) } } var maprev, strmap any for _, tc := range []struct { name string doc any rev bool }{ { name: "create map", doc: docmap{KeyField: "testPutMap", "b": true, revField: nil}, }, { name: "create struct", doc: &docstruct{Name: "testPutStruct", B: true}, }, { name: "replace map", doc: docmap{KeyField: "testPutMap", "b": false, revField: nil}, rev: true, }, { name: "replace struct", doc: &docstruct{Name: "testPutStruct", B: false}, rev: true, }, } { t.Run(tc.name, func(t *testing.T) { checkNoRevisionField(t, tc.doc, revField) must(coll.Put(ctx, tc.doc)) checkHasRevisionField(t, tc.doc, revField) got := newDoc(tc.doc) must(coll.Get(ctx, got)) if diff := cmpDiff(got, tc.doc); diff != "" { t.Fatal(diff) } if tc.rev { switch v := tc.doc.(type) { case docmap: maprev = v[revField] case *docstruct: if revField == docstore.DefaultRevisionField { strmap = v.DocstoreRevision } else { strmap = v.Etag } } } }) } // Putting a doc with a revision field is the same as replace, meaning // it will fail if the document doesn't exist. for _, tc := range []struct { name string doc any }{ { name: "replace map wrong key", doc: docmap{KeyField: "testPutMap2", revField: maprev}, }, { name: "replace struct wrong key", doc: &docstruct{Name: "testPutStruct2", DocstoreRevision: strmap, Etag: strmap}, }, } { t.Run(tc.name, func(t *testing.T) { err := coll.Put(ctx, tc.doc) if c := gcerrors.Code(err); c != gcerrors.NotFound && c != gcerrors.FailedPrecondition { t.Errorf("got %v, want NotFound or FailedPrecondition", err) } }) } t.Run("revision", func(t *testing.T) { testRevisionField(t, coll, revField, func(doc any) error { return coll.Put(ctx, doc) }) }) err := coll.Put(ctx, &docstruct{Name: ""}) checkCode(t, err, gcerrors.InvalidArgument) } func testReplace(t *testing.T, coll *docstore.Collection, revField string) { t.Helper() ctx := context.Background() must := func(err error) { t.Helper() if err != nil { t.Fatal(err) } } for _, tc := range []struct { name string doc1, doc2 any }{ { name: "replace map", doc1: docmap{KeyField: "testReplaceMap", "s": "a", revField: nil}, doc2: docmap{KeyField: "testReplaceMap", "s": "b", revField: nil}, }, { name: "replace struct", doc1: &docstruct{Name: "testReplaceStruct", St: "a"}, doc2: &docstruct{Name: "testReplaceStruct", St: "b"}, }, } { t.Run(tc.name, func(t *testing.T) { must(coll.Put(ctx, tc.doc1)) checkNoRevisionField(t, tc.doc2, revField) must(coll.Replace(ctx, tc.doc2)) checkHasRevisionField(t, tc.doc2, revField) got := newDoc(tc.doc2) must(coll.Get(ctx, got)) if diff := cmpDiff(got, tc.doc2); diff != "" { t.Fatal(diff) } }) } // Can't replace a nonexistent doc. checkCode(t, coll.Replace(ctx, nonexistentDoc()), gcerrors.NotFound) t.Run("revision", func(t *testing.T) { testRevisionField(t, coll, revField, func(doc any) error { return coll.Replace(ctx, doc) }) }) } // Check that doc does not have a revision field (or has a nil one). func checkNoRevisionField(t *testing.T, doc any, revField string) { t.Helper() ddoc, err := driver.NewDocument(doc) if err != nil { t.Fatal(err) } if rev, _ := ddoc.GetField(revField); rev != nil { t.Fatal("doc has revision field") } } // Check that doc has a non-nil revision field. func checkHasRevisionField(t *testing.T, doc any, revField string) { t.Helper() ddoc, err := driver.NewDocument(doc) if err != nil { t.Fatal(err) } if rev, err := ddoc.GetField(revField); err != nil || rev == nil { t.Fatalf("doc missing revision field (error = %v)", err) } } func testGet(t *testing.T, coll *docstore.Collection, revField string) { t.Helper() ctx := context.Background() must := func(err error) { t.Helper() if err != nil { t.Fatal(err) } } for _, tc := range []struct { name string doc any fps []docstore.FieldPath want any }{ // If Get is called with no field paths, the full document is populated. { name: "get map", doc: docmap{ KeyField: "testGetMap", "s": "a string", "i": int64(95), "f": 32.3, "m": map[string]any{"a": "one", "b": "two"}, revField: nil, }, }, { name: "get struct", doc: &docstruct{ Name: "testGetStruct", St: "a string", I: 95, F: 32.3, M: map[string]any{"a": "one", "b": "two"}, }, }, // If Get is called with field paths, the resulting document has only those fields. { name: "get map with field path", doc: docmap{ KeyField: "testGetMapFP", "s": "a string", "i": int64(95), "f": 32.3, "m": map[string]any{"a": "one", "b": "two"}, revField: nil, }, fps: []docstore.FieldPath{"f", "m.b", docstore.FieldPath(revField)}, want: docmap{ KeyField: "testGetMapFP", "f": 32.3, "m": map[string]any{"b": "two"}, }, }, { name: "get struct with field path", doc: &docstruct{ Name: "testGetStructFP", St: "a string", I: 95, F: 32.3, M: map[string]any{"a": "one", "b": "two"}, }, fps: []docstore.FieldPath{"St", "M.a", docstore.FieldPath(revField)}, want: &docstruct{ Name: "testGetStructFP", St: "a string", M: map[string]any{"a": "one"}, }, }, { name: "get struct wrong case", doc: &docstruct{ Name: "testGetStructWC", St: "a string", I: 95, F: 32.3, M: map[string]any{"a": "one", "b": "two"}, }, fps: []docstore.FieldPath{"st", "m.a"}, want: &docstruct{ Name: "testGetStructWC", }, }, } { t.Run(tc.name, func(t *testing.T) { must(coll.Put(ctx, tc.doc)) got := newDoc(tc.doc) must(coll.Get(ctx, got, tc.fps...)) if tc.want == nil { tc.want = tc.doc } setRevision(tc.want, revision(got, revField), revField) if diff := cmpDiff(got, tc.want); diff != "" { t.Error("Get with field paths:\n", diff) } }) } err := coll.Get(ctx, nonexistentDoc()) checkCode(t, err, gcerrors.NotFound) err = coll.Get(ctx, &docstruct{Name: ""}) checkCode(t, err, gcerrors.InvalidArgument) } func testDelete(t *testing.T, coll *docstore.Collection, revField string) { t.Helper() ctx := context.Background() var rev any for _, tc := range []struct { name string doc any wantErr gcerrors.ErrorCode }{ { name: "delete map", doc: docmap{KeyField: "testDeleteMap", revField: nil}, }, { name: "delete map wrong rev", doc: docmap{KeyField: "testDeleteMap", "b": true, revField: nil}, wantErr: gcerrors.FailedPrecondition, }, { name: "delete struct", doc: &docstruct{Name: "testDeleteStruct"}, }, { name: "delete struct wrong rev", doc: &docstruct{Name: "testDeleteStruct", B: true}, wantErr: gcerrors.FailedPrecondition, }, } { t.Run(tc.name, func(t *testing.T) { if err := coll.Put(ctx, tc.doc); err != nil { t.Fatal(err) } if tc.wantErr == gcerrors.OK { rev = revision(tc.doc, revField) if err := coll.Delete(ctx, tc.doc); err != nil { t.Fatal(err) } // The document should no longer exist. if err := coll.Get(ctx, tc.doc); err == nil { t.Error("want error, got nil") } } else { setRevision(tc.doc, rev, revField) checkCode(t, coll.Delete(ctx, tc.doc), gcerrors.FailedPrecondition) } }) } // Delete doesn't fail if the doc doesn't exist. if err := coll.Delete(ctx, nonexistentDoc()); err != nil { t.Errorf("delete nonexistent doc: want nil, got %v", err) } err := coll.Delete(ctx, &docstruct{Name: ""}) checkCode(t, err, gcerrors.InvalidArgument) } func testUpdate(t *testing.T, coll *docstore.Collection, revField string) { t.Helper() ctx := context.Background() for _, tc := range []struct { name string doc any mods docstore.Mods want any }{ { name: "update map", doc: docmap{KeyField: "testUpdateMap", "a": "A", "b": "B", "n": 3.5, "i": 1, revField: nil}, mods: docstore.Mods{ "a": "X", "b": nil, "c": "C", "n": docstore.Increment(-1), "i": nil, "m": 3, }, want: docmap{KeyField: "testUpdateMap", "a": "X", "c": "C", "n": 2.5, "m": int64(3)}, }, { name: "update map overwrite only", doc: docmap{KeyField: "testUpdateMapWrt", "a": "A", revField: nil}, mods: docstore.Mods{ "a": "X", "b": nil, "m": 3, }, want: docmap{KeyField: "testUpdateMapWrt", "a": "X", "m": int64(3)}, }, { name: "update map increment only", doc: docmap{KeyField: "testUpdateMapInc", "a": "A", "n": 3.5, "i": 1, revField: nil}, mods: docstore.Mods{ "n": docstore.Increment(-1), "i": docstore.Increment(2.5), "m": docstore.Increment(3), }, want: docmap{KeyField: "testUpdateMapInc", "a": "A", "n": 2.5, "i": 3.5, "m": int64(3)}, }, { name: "update struct", doc: &docstruct{Name: "testUpdateStruct", St: "st", I: 1, F: 3.5}, mods: docstore.Mods{ "St": "str", "I": nil, "U": 4, "F": docstore.Increment(-3), }, want: &docstruct{Name: "testUpdateStruct", St: "str", U: 4, F: 0.5}, }, { name: "update struct overwrite only", doc: &docstruct{Name: "testUpdateStructWrt", St: "st", I: 1}, mods: docstore.Mods{ "St": "str", "I": nil, "U": 4, }, want: &docstruct{Name: "testUpdateStructWrt", St: "str", U: 4}, }, { name: "update struct increment only", doc: &docstruct{Name: "testUpdateStructInc", St: "st", I: 1, F: 3.5}, mods: docstore.Mods{ "U": docstore.Increment(4), "F": docstore.Increment(-3), }, want: &docstruct{Name: "testUpdateStructInc", St: "st", U: 4, I: 1, F: 0.5}, }, } { t.Run(tc.name, func(t *testing.T) { if err := coll.Put(ctx, tc.doc); err != nil { t.Fatal(err) } setRevision(tc.doc, nil, revField) got := newDoc(tc.doc) checkNoRevisionField(t, tc.doc, revField) errs := coll.Actions().Update(tc.doc, tc.mods).Get(got).Do(ctx) if errs != nil { t.Fatal(errs) } checkHasRevisionField(t, tc.doc, revField) setRevision(tc.want, revision(got, revField), revField) if diff := cmp.Diff(got, tc.want, cmpopts.IgnoreUnexported(tspb.Timestamp{})); diff != "" { t.Error(diff) } }) } // Can't update a nonexistent doc. if err := coll.Update(ctx, nonexistentDoc(), docstore.Mods{"x": "y"}); err == nil { t.Error("nonexistent document: got nil, want error") } // Bad increment value. err := coll.Update(ctx, docmap{KeyField: "update invalid"}, docstore.Mods{"x": docstore.Increment("3")}) checkCode(t, err, gcerrors.InvalidArgument) t.Run("revision", func(t *testing.T) { testRevisionField(t, coll, revField, func(doc any) error { return coll.Update(ctx, doc, docstore.Mods{"s": "c"}) }) }) } // Test that: // - Writing a document with a revision field succeeds if the document hasn't changed. // - Writing a document with a revision field fails if the document has changed. func testRevisionField(t *testing.T, coll *docstore.Collection, revField string, write func(any) error) { t.Helper() ctx := context.Background() must := func(err error) { t.Helper() if err != nil { t.Fatal(err) } } for _, tc := range []struct { name string doc any }{ { name: "map revision", doc: docmap{KeyField: "testRevisionMap", "s": "a", revField: nil}, }, { name: "struct revision", doc: &docstruct{Name: "testRevisionStruct", St: "a"}, }, } { t.Run(tc.name, func(t *testing.T) { must(coll.Put(ctx, tc.doc)) got := newDoc(tc.doc) must(coll.Get(ctx, got)) rev := revision(got, revField) if rev == nil { t.Fatal("missing revision field") } // A write should succeed, because the document hasn't changed since it was gotten. if err := write(tc.doc); err != nil { t.Fatalf("write with revision field got %v, want nil", err) } // This write should fail: got's revision field hasn't changed, but the stored document has. err := write(got) if c := gcerrors.Code(err); c != gcerrors.FailedPrecondition && c != gcerrors.NotFound { t.Errorf("write with old revision field: got %v, wanted FailedPrecondition or NotFound", err) } }) } } // Verify that the driver can serialize and deserialize revisions. func testSerializeRevision(t *testing.T, h Harness, coll *docstore.Collection) { t.Helper() ctx := context.Background() doc := docmap{KeyField: "testSerializeRevision", "x": 1, docstore.DefaultRevisionField: nil} if err := coll.Create(ctx, doc); err != nil { t.Fatal(err) } want := doc[docstore.DefaultRevisionField] if want == nil { t.Fatal("nil revision") } s, err := coll.RevisionToString(want) if err != nil { t.Fatal(err) } got, err := coll.StringToRevision(s) if err != nil { t.Fatal(err) } if !h.RevisionsEqual(got, want) { t.Fatalf("got %v, want %v", got, want) } } // Test all Go integer types are supported, and they all come back as int64. func testData(t *testing.T, _ Harness, coll *docstore.Collection) { t.Helper() ctx := context.Background() for _, test := range []struct { in, want any }{ {int(-1), int64(-1)}, {int8(-8), int64(-8)}, {int16(-16), int64(-16)}, {int32(-32), int64(-32)}, {int64(-64), int64(-64)}, {uint(1), int64(1)}, {uint8(8), int64(8)}, {uint16(16), int64(16)}, {uint32(32), int64(32)}, {uint64(64), int64(64)}, {float32(3.5), float64(3.5)}, {[]byte{0, 1, 2}, []byte{0, 1, 2}}, } { doc := docmap{KeyField: "testData", "val": test.in} got := docmap{KeyField: doc[KeyField]} if errs := coll.Actions().Put(doc).Get(got).Do(ctx); errs != nil { t.Fatal(errs) } want := docmap{ "val": test.want, KeyField: doc[KeyField], } if len(got) != len(want) { t.Errorf("%v: got %v, want %v", test.in, got, want) } else if g := got["val"]; !cmp.Equal(g, test.want) { t.Errorf("%v: got %v (%T), want %v (%T)", test.in, g, g, test.want, test.want) } } // TODO: strings: valid vs. invalid unicode } var ( // A time with non-zero milliseconds, but zero nanoseconds. milliTime = time.Date(2019, time.March, 27, 0, 0, 0, 5*1e6, time.UTC) // A time with non-zero nanoseconds. nanoTime = time.Date(2019, time.March, 27, 0, 0, 0, 5*1e6+7, time.UTC) ) // Test that encoding from a struct and then decoding into the same struct works properly. // The decoding is "type-driven" because the decoder knows the expected type of the value // it is decoding--it is the type of a struct field. func testTypeDrivenDecode(t *testing.T, ct CodecTester) { t.Helper() if ct == nil { t.Skip("no CodecTester") } check := func(in, dec any, encode func(any) (any, error), decode func(any, any) error) { t.Helper() enc, err := encode(in) if err != nil { t.Fatalf("%+v", err) } if err := decode(enc, dec); err != nil { t.Fatalf("%+v", err) } if diff := cmp.Diff(in, dec); diff != "" { t.Error(diff) } } s := "bar" dsrt := &docstoreRoundTrip{ N: nil, I: 1, U: 2, F: 2.5, St: "foo", B: true, L: []int{3, 4, 5}, A: [2]int{6, 7}, A2: [2]int8{1, 2}, At: ByteArray{1, 2}, Uu: uuid.NameSpaceDNS, M: map[string]bool{"a": true, "b": false}, By: []byte{6, 7, 8}, P: &s, T: milliTime, } check(dsrt, &docstoreRoundTrip{}, ct.DocstoreEncode, ct.DocstoreDecode) // Test native-to-docstore and docstore-to-native round trips with a smaller set // of types. nm := &nativeMinimal{ N: nil, I: 1, F: 2.5, St: "foo", B: true, L: []int{3, 4, 5}, A: [2]int{6, 7}, A2: [2]int8{6, 7}, At: ByteArray{1, 2}, M: map[string]bool{"a": true, "b": false}, By: []byte{6, 7, 8}, P: &s, T: milliTime, LF: []float64{18.8, -19.9, 20}, LS: []string{"foo", "bar"}, } check(nm, &nativeMinimal{}, ct.DocstoreEncode, ct.NativeDecode) check(nm, &nativeMinimal{}, ct.NativeEncode, ct.DocstoreDecode) // Test various other types, unless they are unsupported. unsupported := map[UnsupportedType]bool{} for _, u := range ct.UnsupportedTypes() { unsupported[u] = true } // Unsigned integers. if !unsupported[Uint] { type Uint struct { U uint } u := &Uint{10} check(u, &Uint{}, ct.DocstoreEncode, ct.NativeDecode) check(u, &Uint{}, ct.NativeEncode, ct.DocstoreDecode) } // Arrays. if !unsupported[Arrays] { type Arrays struct { A [2]int } a := &Arrays{[2]int{13, 14}} check(a, &Arrays{}, ct.DocstoreEncode, ct.NativeDecode) check(a, &Arrays{}, ct.NativeEncode, ct.DocstoreDecode) } // Nanosecond-precision time. type NT struct { T time.Time } nt := &NT{nanoTime} if unsupported[NanosecondTimes] { // Expect rounding to the nearest millisecond. check := func(encode func(any) (any, error), decode func(any, any) error) { enc, err := encode(nt) if err != nil { t.Fatalf("%+v", err) } var got NT if err := decode(enc, &got); err != nil { t.Fatalf("%+v", err) } want := nt.T.Round(time.Millisecond) if !got.T.Equal(want) { t.Errorf("got %v, want %v", got.T, want) } } check(ct.DocstoreEncode, ct.NativeDecode) check(ct.NativeEncode, ct.DocstoreDecode) } else { // Expect perfect round-tripping of nanosecond times. check(nt, &NT{}, ct.DocstoreEncode, ct.NativeDecode) check(nt, &NT{}, ct.NativeEncode, ct.DocstoreDecode) } // Binary sets. if !unsupported[BinarySet] { type BinarySet struct { B [][]byte } b := &BinarySet{[][]byte{{15}, {16}, {17}}} check(b, &BinarySet{}, ct.DocstoreEncode, ct.NativeDecode) check(b, &BinarySet{}, ct.NativeEncode, ct.DocstoreDecode) } } // Test decoding into an interface{}, where the decoder doesn't know the type of the // result and must return some Go type that accurately represents the value. // This is implemented by the AsInterface method of driver.Decoder. // Since it's fine for different drivers to return different types in this case, // each test case compares against a list of possible values. func testBlindDecode(t *testing.T, ct CodecTester) { t.Helper() if ct == nil { t.Skip("no CodecTester") } t.Run("DocstoreEncode", func(t *testing.T) { testBlindDecode1(t, ct.DocstoreEncode, ct.DocstoreDecode) }) t.Run("NativeEncode", func(t *testing.T) { testBlindDecode1(t, ct.NativeEncode, ct.DocstoreDecode) }) } func testBlindDecode1(t *testing.T, encode func(any) (any, error), decode func(_, _ any) error) { t.Helper() // Encode and decode expect a document, so use this struct to hold the values. type S struct{ X any } for _, test := range []struct { in any // the value to be encoded want any // one possibility want2 any // a second possibility }{ {in: nil, want: nil}, {in: true, want: true}, {in: "foo", want: "foo"}, {in: 'c', want: 'c', want2: int64('c')}, {in: int(3), want: int32(3), want2: int64(3)}, {in: int8(3), want: int32(3), want2: int64(3)}, {in: int(-3), want: int32(-3), want2: int64(-3)}, {in: int64(math.MaxInt32 + 1), want: int64(math.MaxInt32 + 1)}, {in: float32(1.5), want: float64(1.5)}, {in: float64(1.5), want: float64(1.5)}, {in: []byte{1, 2}, want: []byte{1, 2}}, { in: []int{1, 2}, want: []any{int32(1), int32(2)}, want2: []any{int64(1), int64(2)}, }, {in: []float32{1.5, 2.5}, want: []any{float64(1.5), float64(2.5)}}, {in: []float64{1.5, 2.5}, want: []any{float64(1.5), float64(2.5)}}, {in: milliTime, want: milliTime, want2: "2019-03-27T00:00:00.005Z"}, { in: []time.Time{milliTime}, want: []any{milliTime}, want2: []any{"2019-03-27T00:00:00.005Z"}, }, { in: map[string]int{"a": 1}, want: map[string]any{"a": int64(1)}, want2: map[string]any{"a": int32(1)}, }, {in: map[string][]byte{"a": {1, 2}}, want: map[string]any{"a": []byte{1, 2}}}, } { enc, err := encode(&S{test.in}) if err != nil { t.Fatalf("encoding %T: %v", test.in, err) } var got S if err := decode(enc, &got); err != nil { t.Fatalf("decoding %T: %v", test.in, err) } matched := false wants := []any{test.want} if test.want2 != nil { wants = append(wants, test.want2) } for _, w := range wants { if cmp.Equal(got.X, w) { matched = true break } } if !matched { t.Errorf("%T: got %#v (%T), not equal to %#v or %#v", test.in, got.X, got.X, test.want, test.want2) } } } // A round trip with the docstore codec should work for all docstore-supported types, // regardless of native driver support. type docstoreRoundTrip struct { N *int I int U uint F float64 St string B bool By []byte L []int A [2]int A2 [2]int8 At ByteArray Uu uuid.UUID M map[string]bool P *string T time.Time } // TODO(jba): add more fields: structs; embedding. // All native codecs should support these types. If one doesn't, remove it from this // struct and make a new single-field struct for it. type nativeMinimal struct { N *int I int F float64 St string B bool By []byte L []int A [2]int A2 [2]int8 At ByteArray M map[string]bool P *string T time.Time LF []float64 LS []string } // testProto tests encoding/decoding of a document with protocol buffer // and pointer-to-protocol-buffer fields. func testProto(t *testing.T, _ Harness, coll *docstore.Collection) { t.Helper() ctx := context.Background() type protoStruct struct { Name string `docstore:"name"` Proto tspb.Timestamp PtrToProto *tspb.Timestamp DocstoreRevision any } doc := &protoStruct{ Name: "testing", Proto: tspb.Timestamp{Seconds: 42}, PtrToProto: &tspb.Timestamp{Seconds: 43}, } err := coll.Create(ctx, doc) if err != nil { t.Fatal(err) } got := &protoStruct{} err = coll.Query().Get(ctx).Next(ctx, got) if err != nil { t.Fatal(err) } if diff := cmp.Diff(got, doc, cmpopts.IgnoreUnexported(tspb.Timestamp{})); diff != "" { t.Error(diff) } } // The following is the schema for the collection where the ID is composed from // multiple fields instead of one. It can be used for query testing. // It is loosely borrowed from the DynamoDB documentation. // It is rich enough to require indexes for some drivers. // A HighScore records one user's high score in a particular game. // The primary key fields are Game and Player. type HighScore struct { Game string Player string Score int Time time.Time WithGlitch bool DocstoreRevision any } func newHighScore() any { return &HighScore{} } // HighScoreKey constructs a single primary key from a HighScore struct or a map // with the same fields by concatenating the Game and Player fields. func HighScoreKey(doc docstore.Document) any { switch d := doc.(type) { case *HighScore: return d.key() case map[string]any: return barConcat(d["Game"], d["Player"]) default: panic("bad arg") } } func (h *HighScore) key() string { if h.Game == "" || h.Player == "" { return "" } return barConcat(h.Game, h.Player) } func barConcat(a, b any) string { return fmt.Sprintf("%v|%v", a, b) } func highScoreLess(h1, h2 *HighScore) bool { return h1.key() < h2.key() } func (h *HighScore) String() string { return fmt.Sprintf("%s=%d@%s", h.key(), h.Score, h.Time.Format("01/02")) } func date(month, day int) time.Time { return time.Date(2019, time.Month(month), day, 0, 0, 0, 0, time.UTC) } const ( game1 = "Praise All Monsters" game2 = "Zombie DMV" game3 = "Days Gone" ) var highScores = []*HighScore{ {game1, "pat", 49, date(3, 13), false, nil}, {game1, "mel", 60, date(4, 10), false, nil}, {game1, "andy", 81, date(2, 1), false, nil}, {game1, "fran", 33, date(3, 19), false, nil}, {game2, "pat", 120, date(4, 1), true, nil}, {game2, "billie", 111, date(4, 10), false, nil}, {game2, "mel", 190, date(4, 18), true, nil}, {game2, "fran", 33, date(3, 20), false, nil}, } func addHighScores(t *testing.T, coll *docstore.Collection) { t.Helper() alist := coll.Actions() for _, doc := range highScores { d := *doc alist.Put(&d) } if err := alist.Do(context.Background()); err != nil { t.Fatalf("%+v", err) } } func testGetQueryKeyField(t *testing.T, coll *docstore.Collection, revField string) { t.Helper() // Query the key field of a collection that has one. // (The collection used for testGetQuery uses a key function rather than a key field.) ctx := context.Background() docs := []docmap{ {KeyField: "qkf1", "a": "one", revField: nil}, {KeyField: "qkf2", "a": "two", revField: nil}, {KeyField: "qkf3", "a": "three", revField: nil}, } al := coll.Actions() for _, d := range docs { al.Put(d) } if err := al.Do(ctx); err != nil { t.Fatal(err) } iter := coll.Query().Where(KeyField, "<", "qkf3").Get(ctx) defer iter.Stop() got := mustCollect(ctx, t, iter) want := docs[:2] diff := cmpDiff(got, want, cmpopts.SortSlices(sortByKeyField)) if diff != "" { t.Error(diff) } // Test that queries with selected fields always return the key. iter = coll.Query().Get(ctx, "a", docstore.FieldPath(revField)) defer iter.Stop() got = mustCollect(ctx, t, iter) for _, d := range docs { checkHasRevisionField(t, d, revField) } diff = cmpDiff(got, docs, cmpopts.SortSlices(sortByKeyField)) if diff != "" { t.Error(diff) } } func sortByKeyField(d1, d2 docmap) bool { return d1[KeyField].(string) < d2[KeyField].(string) } // TODO(shantuo): consider add this test to all action tests, like the AltRev // ones. func testActionsWithCompositeID(t *testing.T, _ Harness, coll *docstore.Collection) { t.Helper() ctx := context.Background() // Create cannot generate an ID for the document when using IDFunc. checkCode(t, coll.Create(ctx, &HighScore{}), gcerrors.InvalidArgument) checkCode(t, coll.Get(ctx, &HighScore{}), gcerrors.InvalidArgument) // Put addHighScores(t, coll) // Get gots := make([]*HighScore, len(highScores)) actions := coll.Actions() for i, doc := range highScores { gots[i] = &HighScore{Game: doc.Game, Player: doc.Player} actions.Get(gots[i]) } if err := actions.Do(ctx); err != nil { t.Fatal(err) } for i, got := range gots { if got.DocstoreRevision == nil { t.Errorf("%v missing DocstoreRevision", got) } else { got.DocstoreRevision = nil } if diff := cmp.Diff(got, highScores[i]); diff != "" { t.Error(diff) } } } func testGetQuery(t *testing.T, _ Harness, coll *docstore.Collection) { t.Helper() ctx := context.Background() addHighScores(t, coll) // Query filters should have the same behavior when doing string and number // comparison. tests := []struct { name string q *docstore.Query fields []docstore.FieldPath // fields to get want func(*HighScore) bool // filters highScores before func(x, y *HighScore) bool // if present, checks result order }{ { name: "All", q: coll.Query(), want: func(*HighScore) bool { return true }, }, { name: "Game", q: coll.Query().Where("Game", "=", game2), want: func(h *HighScore) bool { return h.Game == game2 }, }, { name: "Score", q: coll.Query().Where("Score", ">", 100), want: func(h *HighScore) bool { return h.Score > 100 }, }, { name: "Player", q: coll.Query().Where("Player", "=", "billie"), want: func(h *HighScore) bool { return h.Player == "billie" }, }, { name: "GamePlayer", q: coll.Query().Where("Player", "=", "andy").Where("Game", "=", game1), want: func(h *HighScore) bool { return h.Player == "andy" && h.Game == game1 }, }, { name: "PlayerScore", q: coll.Query().Where("Player", "=", "pat").Where("Score", "<", 100), want: func(h *HighScore) bool { return h.Player == "pat" && h.Score < 100 }, }, { name: "GameScore", q: coll.Query().Where("Game", "=", game1).Where("Score", ">=", 50), want: func(h *HighScore) bool { return h.Game == game1 && h.Score >= 50 }, }, { name: "PlayerTime", q: coll.Query().Where("Player", "=", "mel").Where("Time", ">", date(4, 1)), want: func(h *HighScore) bool { return h.Player == "mel" && h.Time.After(date(4, 1)) }, }, { name: "ScoreTime", q: coll.Query().Where("Score", ">=", 50).Where("Time", ">", date(4, 1)), want: func(h *HighScore) bool { return h.Score >= 50 && h.Time.After(date(4, 1)) }, }, { name: "PlayerIn", q: coll.Query().Where("Player", "in", []string{"pat", "billie"}), want: func(h *HighScore) bool { return h.Player == "pat" || h.Player == "billie" }, }, { name: "PlayerNotIn", q: coll.Query().Where("Player", "not-in", []string{"pat", "billie"}), want: func(h *HighScore) bool { return h.Player != "pat" && h.Player != "billie" }, }, { name: "WithGlitch", q: coll.Query().Where("WithGlitch", "=", true), want: func(h *HighScore) bool { return h.WithGlitch }, }, { name: "WithGlitchIn", q: coll.Query().Where("WithGlitch", "in", []bool{true}), want: func(h *HighScore) bool { return h.WithGlitch }, }, { name: "WithGlitchNotIn", q: coll.Query().Where("WithGlitch", "not-in", []bool{true}), want: func(h *HighScore) bool { return !h.WithGlitch }, }, { name: "AllByPlayerAsc", q: coll.Query().OrderBy("Player", docstore.Ascending), want: func(h *HighScore) bool { return true }, before: func(h1, h2 *HighScore) bool { return h1.Player < h2.Player }, }, { name: "AllByPlayerDesc", q: coll.Query().OrderBy("Player", docstore.Descending), want: func(h *HighScore) bool { return true }, before: func(h1, h2 *HighScore) bool { return h1.Player > h2.Player }, }, { name: "GameByPlayerAsc", // We need a filter on Player, and it can't be the empty string (DynamoDB limitation). // So pick any string that sorts less than all valid player names. q: coll.Query().Where("Game", "=", game1).Where("Player", ">", "."). OrderBy("Player", docstore.Ascending), want: func(h *HighScore) bool { return h.Game == game1 }, before: func(h1, h2 *HighScore) bool { return h1.Player < h2.Player }, }, { // Same as above, but descending. name: "GameByPlayerDesc", q: coll.Query().Where("Game", "=", game1).Where("Player", ">", "."). OrderBy("Player", docstore.Descending), want: func(h *HighScore) bool { return h.Game == game1 }, before: func(h1, h2 *HighScore) bool { return h1.Player > h2.Player }, }, // TODO(jba): add more OrderBy tests. { name: "AllWithKeyFields", q: coll.Query(), fields: []docstore.FieldPath{"Game", "Player", docstore.FieldPath(docstore.DefaultRevisionField)}, want: func(h *HighScore) bool { h.Score = 0 h.Time = time.Time{} h.WithGlitch = false return true }, }, { name: "AllWithScore", q: coll.Query(), fields: []docstore.FieldPath{"Game", "Player", "Score", "WithGlitch", docstore.FieldPath(docstore.DefaultRevisionField)}, want: func(h *HighScore) bool { h.Time = time.Time{} return true }, }, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { got, err := collectHighScores(ctx, tc.q.Get(ctx, tc.fields...)) if err != nil { t.Fatal(err) } for _, g := range got { if g.DocstoreRevision == nil { t.Errorf("%v missing DocstoreRevision", g) } else { g.DocstoreRevision = nil } } want := filterHighScores(highScores, tc.want) _, err = tc.q.Plan() if err != nil { t.Fatal(err) } diff := cmp.Diff(got, want, cmpopts.SortSlices(highScoreLess)) if diff != "" { t.Fatal(diff) } if tc.before != nil { // Verify that the results are sorted according to tc.less. for i := 1; i < len(got); i++ { if tc.before(got[i], got[i-1]) { t.Errorf("%s at %d sorts before previous %s", got[i], i, got[i-1]) } } } // We can't assume anything about the query plan. Just verify that Plan returns // successfully. if _, err := tc.q.Plan(KeyField); err != nil { t.Fatal(err) } }) } t.Run("OffsetAndLimitCounts", func(t *testing.T) { nDocs := len(highScores) // 8 tests := []struct { name string offset int limit int expected int }{ { name: "LimitOnly", offset: 0, limit: 2, expected: 2, }, { name: "OffsetOnly", offset: 2, limit: nDocs, expected: nDocs - 2, }, { name: "OffsetAndLimit", offset: 2, limit: 2, expected: 2, }, { name: "OffsetEqualToFirstPage", offset: nDocs, limit: 2, expected: 0, }, { name: "OffsetLessThanFirstPage", offset: nDocs - 1, limit: 2, expected: 1, }, { name: "OffsetGreaterThanFirstPage", offset: nDocs + 1, limit: 2, expected: 0, }, { name: "OffsetIsZero", offset: 0, limit: 2, expected: 2, }, { name: "OffsetAndLimitGreaterThanPageSize", offset: nDocs + 1, limit: nDocs + 1, expected: 0, }, { name: "OffsetLessThanPageSizeAndLimitGreaterThanPageSize", offset: nDocs - 1, limit: nDocs + 1, expected: 1, }, // Scenarios covered elsewhere: // - /go-cloud/docstore/query_test.go#TestInvalidQuery: // - NegativeLimit // - ZeroLimit // - TwoLimits // - NegativeOffset // - TwoOffsets // - ZeroOffsetAndLimit // - NegativeOffsetAndLimit // - ZeroOffsetAndNegativeLimit } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { offsetLimitQ := coll.Query().Offset(tt.offset).Limit(tt.limit) got := mustCollectHighScores(ctx, t, offsetLimitQ.Get(ctx)) if len(got) != tt.expected { t.Errorf("got %v, wanted %v documents", len(got), tt.expected) } }) } }) t.Run("EOF", func(t *testing.T) { // To address this issue https://github.com/google/go-cloud/issues/3405#issue-2193025645 q := coll.Query() it := q.Get(context.Background()) defer it.Stop() h := &HighScore{} for { err := it.Next(context.Background(), h) if err == io.EOF { break } if err != nil { t.Errorf("unexpected error: %v", err) return } } // Call Next again to trigger io.EOF err := it.Next(context.Background(), h) if err != io.EOF { t.Errorf("expected io.EOF, got %v", err) } }) } func filterHighScores(hs []*HighScore, f func(*HighScore) bool) []*HighScore { var res []*HighScore for _, h := range hs { c := *h // Copy in case f modifies its argument. if f(&c) { res = append(res, &c) } } return res } // ClearCollection delete all documents from this collection after test. func ClearCollection(fataler interface { Helper() Fatalf(string, ...any) }, coll *docstore.Collection, ) { fataler.Helper() ctx := context.Background() iter := coll.Query().Get(ctx) dels := coll.Actions() for { doc := map[string]any{} err := iter.Next(ctx, doc) if err == io.EOF { break } if err != nil { fataler.Fatalf("%+v", err) } dels.Delete(doc) } if err := dels.Do(ctx); err != nil { fataler.Fatalf("%+v", err) } } func forEach(ctx context.Context, iter *docstore.DocumentIterator, create func() any, handle func(any) error) error { for { doc := create() err := iter.Next(ctx, doc) if err == io.EOF { break } if err != nil { return err } if err := handle(doc); err != nil { return err } } return nil } func mustCollect(ctx context.Context, t *testing.T, iter *docstore.DocumentIterator) []docmap { t.Helper() var ms []docmap newDocmap := func() any { return docmap{} } collect := func(m any) error { ms = append(ms, m.(docmap)); return nil } if err := forEach(ctx, iter, newDocmap, collect); err != nil { t.Fatal(err) } return ms } func mustCollectHighScores(ctx context.Context, t *testing.T, iter *docstore.DocumentIterator) []*HighScore { t.Helper() hs, err := collectHighScores(ctx, iter) if err != nil { t.Fatal(err) } return hs } func collectHighScores(ctx context.Context, iter *docstore.DocumentIterator) ([]*HighScore, error) { var hs []*HighScore collect := func(h any) error { hs = append(hs, h.(*HighScore)); return nil } if err := forEach(ctx, iter, newHighScore, collect); err != nil { return nil, err } return hs, nil } func testMultipleActions(t *testing.T, coll *docstore.Collection, revField string) { t.Helper() ctx := context.Background() must := func(err error) { t.Helper() if err != nil { t.Fatal(err) } } var docs []docmap for i := range 9 { docs = append(docs, docmap{ KeyField: fmt.Sprintf("testUnorderedActions%d", i), "s": fmt.Sprint(i), revField: nil, }) } compare := func(gots, wants []docmap) { t.Helper() for i := range gots { got := gots[i] want := clone(wants[i]) want[revField] = got[revField] if !cmp.Equal(got, want, cmpopts.IgnoreUnexported(tspb.Timestamp{})) { t.Errorf("index #%d:\ngot %v\nwant %v", i, got, want) } } } // Put the first three docs. actions := coll.Actions() for i := range 6 { actions.Create(docs[i]) } must(actions.Do(ctx)) // Replace the first three and put six more. actions = coll.Actions() for i := range 3 { docs[i]["s"] = fmt.Sprintf("%d'", i) actions.Replace(docs[i]) } for i := 3; i < 9; i++ { actions.Put(docs[i]) } must(actions.Do(ctx)) // Delete the first three, get the second three, and put three more. gdocs := []docmap{ {KeyField: docs[3][KeyField]}, {KeyField: docs[4][KeyField]}, {KeyField: docs[5][KeyField]}, } actions = coll.Actions() actions.Update(docs[6], docstore.Mods{"s": "6'", "n": docstore.Increment(1)}) actions.Get(gdocs[0]) actions.Delete(docs[0]) actions.Delete(docs[1]) actions.Update(docs[7], docstore.Mods{"s": "7'"}) actions.Get(gdocs[1]) actions.Delete(docs[2]) actions.Get(gdocs[2]) actions.Update(docs[8], docstore.Mods{"n": docstore.Increment(-1)}) must(actions.Do(ctx)) compare(gdocs, docs[3:6]) // At this point, the existing documents are 3 - 9. // Get the first four, try to create one that already exists, delete a // nonexistent doc, and put one. Only the Get of #3, the Delete and the Put // should succeed. actions = coll.Actions() for _, doc := range []docmap{ {KeyField: docs[0][KeyField]}, {KeyField: docs[1][KeyField]}, {KeyField: docs[2][KeyField]}, {KeyField: docs[3][KeyField]}, } { actions.Get(doc) } docs[4][revField] = nil actions.Create(docs[4]) // create existing doc actions.Put(docs[5]) // TODO(jba): Understand why the following line is necessary for dynamo but not the others. docs[0][revField] = nil actions.Delete(docs[0]) // delete nonexistent doc err := actions.Do(ctx) if err == nil { t.Fatal("want error, got nil") } alerr, ok := err.(docstore.ActionListError) if !ok { t.Fatalf("got %v (%T), want ActionListError", alerr, alerr) } for _, e := range alerr { switch i := e.Index; i { case 3, 5, 6: t.Errorf("index %d: got %v, want nil", i, e.Err) case 4, -1: // -1 for mongodb issue, see https://jira.mongodb.org/browse/GODRIVER-1028 if ec := gcerrors.Code(e.Err); ec != gcerrors.AlreadyExists && ec != gcerrors.FailedPrecondition { // TODO(shantuo): distinguish this case for dyanmo t.Errorf("index 4: create an existing document: got %v, want error", e.Err) } default: if gcerrors.Code(e.Err) != gcerrors.NotFound { t.Errorf("index %d: got %v, want NotFound", i, e.Err) } } } } func testAtomicWrites(t *testing.T, coll *docstore.Collection, revField string) { t.Helper() ctx := context.Background() must := func(err error) { t.Helper() if err != nil { t.Fatal(err) } } var docs []docmap for i := range 9 { docs = append(docs, docmap{ KeyField: fmt.Sprintf("testAtomicWrites%d", i), "s": fmt.Sprint(i), revField: nil, }) } compare := func(gots, wants []docmap) { t.Helper() for i := range gots { got := gots[i] want := clone(wants[i]) want[revField] = got[revField] if !cmp.Equal(got, want, cmpopts.IgnoreUnexported(tspb.Timestamp{})) { t.Errorf("index #%d:\ngot %v\nwant %v", i, got, want) } } } // Put the nine docs. actions := coll.Actions() for i := range 9 { actions.Create(docs[i]) } must(actions.Do(ctx)) // Delete the first three, get the second three, and update last three in transaction. gdocs := []docmap{ {KeyField: docs[3][KeyField]}, {KeyField: docs[4][KeyField]}, {KeyField: docs[5][KeyField]}, } actions = coll.Actions() actions.Get(gdocs[0]) actions.Delete(docs[0]) actions.Delete(docs[1]) actions.Get(gdocs[1]) actions.Delete(docs[2]) actions.Get(gdocs[2]) actions.AtomicWrites() actions.Update(docs[6], docstore.Mods{"s": "66"}) actions.Update(docs[7], docstore.Mods{"s": "77"}) actions.Update(docs[8], docstore.Mods{"s": "88"}) must(actions.Do(ctx)) compare(gdocs, docs[3:6]) // Get the docs updated as part of atomic writes and verify that the values were updated successfully. actions = coll.Actions() doc := docmap{KeyField: docs[6][KeyField]} _ = coll.Get(ctx, doc) if diff := cmpDiff("66", doc["s"]); diff != "" { t.Fatal(diff) } doc = docmap{KeyField: docs[7][KeyField]} _ = coll.Get(ctx, doc) if diff := cmpDiff("77", doc["s"]); diff != "" { t.Fatal(diff) } doc = docmap{KeyField: docs[8][KeyField]} _ = coll.Get(ctx, doc) if diff := cmpDiff("88", doc["s"]); diff != "" { t.Fatal(diff) } } func testAtomicWritesFail(t *testing.T, coll *docstore.Collection, revField string) { t.Helper() ctx := context.Background() must := func(err error) { t.Helper() if err != nil { t.Fatal(err) } } var docs []docmap for i := range 9 { docs = append(docs, docmap{ KeyField: fmt.Sprintf("testAtomicWrites%d", i), "s": fmt.Sprint(i), revField: nil, }) } compare := func(gots, wants []docmap) { t.Helper() for i := range gots { got := gots[i] want := clone(wants[i]) want[revField] = got[revField] if !cmp.Equal(got, want, cmpopts.IgnoreUnexported(tspb.Timestamp{})) { t.Errorf("index #%d:\ngot %v\nwant %v", i, got, want) } } } // Put the first eight docs. actions := coll.Actions() for i := range 8 { actions.Create(docs[i]) } must(actions.Do(ctx)) // Delete the first three, get the second three, and update last three in transaction. gdocs := []docmap{ {KeyField: docs[3][KeyField]}, {KeyField: docs[4][KeyField]}, {KeyField: docs[5][KeyField]}, } actions = coll.Actions() actions.Get(gdocs[0]) actions.Delete(docs[0]) actions.Delete(docs[1]) actions.Get(gdocs[1]) actions.Delete(docs[2]) actions.Get(gdocs[2]) actions.AtomicWrites() actions.Update(docs[6], docstore.Mods{"s": "66"}) actions.Update(docs[7], docstore.Mods{"s": "77"}) // this document doesn't exist so it will fail the transaction actions.Update(docs[8], docstore.Mods{"s": "88"}) err := actions.Do(ctx) if err == nil { t.Fatal("want transaction to fail") } compare(gdocs, docs[3:6]) // validate that the values still remains the original doc := docmap{KeyField: docs[6][KeyField]} _ = coll.Get(ctx, doc) if diff := cmpDiff("6", doc["s"]); diff != "" { t.Fatal(diff) } doc = docmap{KeyField: docs[7][KeyField]} _ = coll.Get(ctx, doc) if diff := cmpDiff("7", doc["s"]); diff != "" { t.Fatal(diff) } } func testActionsOnStructNoRev(t *testing.T, _ Harness, coll *docstore.Collection) { t.Helper() type item struct { Name string `docstore:"name"` I int } doc1 := item{Name: "createandreplace"} doc2 := item{Name: "putandupdate"} ctx := context.Background() got1 := item{Name: doc1.Name} got2 := map[string]any{"name": doc2.Name} if err := coll.Actions(). Create(&doc1).Put(&doc2). Get(&got1).Get(got2). Do(ctx); err != nil { t.Fatal(err) } checkNoRevisionField(t, got2, docstore.DefaultRevisionField) got3 := map[string]any{"name": doc1.Name} got4 := item{Name: doc2.Name} if err := coll.Actions(). Replace(&doc1).Update(&item{Name: doc2.Name}, docstore.Mods{"I": 1}). Get(got3, "I").Get(&got4, "I"). Do(ctx); err != nil { t.Fatal(err) } checkNoRevisionField(t, got3, docstore.DefaultRevisionField) } func testExampleInDoc(t *testing.T, _ Harness, coll *docstore.Collection) { t.Helper() type Name struct { First, Last string } type Book struct { Title string `docstore:"name"` Author Name `docstore:"author"` PublicationYears []int `docstore:"pub_years,omitempty"` NumPublications int `docstore:"-"` } must := func(err error) { t.Helper() if err != nil { t.Fatal(err) } } checkFieldEqual := func(got, want any, field string) { t.Helper() fvg, err := MustDocument(got).GetField(field) must(err) fvw, err := MustDocument(want).GetField(field) must(err) if !cmp.Equal(fvg, fvw) { t.Errorf("%s: got %v want %v", field, fvg, fvw) } } doc1 := &Book{ Title: "The Master and Margarita", Author: Name{ First: "Mikhail", Last: "Bulgakov", }, PublicationYears: []int{1967, 1973}, NumPublications: 2, } doc2 := map[string]any{ KeyField: "The Heart of a Dog", "author": map[string]any{ "First": "Mikhail", "Last": "Bulgakov", }, "pub_years": []int{1968, 1987}, } ctx := context.Background() must(coll.Actions().Create(doc1).Put(doc2).Do(ctx)) got1 := &Book{Title: doc1.Title} got2 := &Book{Title: doc2[KeyField].(string)} must(coll.Actions().Get(got1).Get(got2).Do(ctx)) if got1.NumPublications != 0 { t.Errorf("docstore:\"-\" tagged field isn't ignored") } checkFieldEqual(got1, doc1, "author") checkFieldEqual(got2, doc2, "pub_years") gots := mustCollect(ctx, t, coll.Query().Where("author.Last", "=", "Bulgakov").Get(ctx)) if len(gots) != 2 { t.Errorf("got %v want all two results", gots) } must(coll.Actions().Delete(doc1).Delete(doc2).Do(ctx)) } // Verify that BeforeDo is invoked, and its as function behaves as expected. func testBeforeDo(t *testing.T, newHarness HarnessMaker) { t.Helper() ctx := context.Background() withCollection(t, newHarness, SingleKey, func(t *testing.T, h Harness, coll *docstore.Collection) { t.Helper() var called bool beforeDo := func(asFunc func(any) bool) error { called = true if asFunc(nil) { return errors.New("asFunc returned true when called with nil, want false") } // At least one of the expected types must return true. Special case: if // there are no types, then the as function never returns true, so skip the // check. if len(h.BeforeDoTypes()) > 0 { found := false for _, b := range h.BeforeDoTypes() { v := reflect.New(reflect.TypeOf(b)).Interface() if asFunc(v) { found = true break } } if !found { return errors.New("none of the BeforeDoTypes works with the as function") } } return nil } check := func(f func(*docstore.ActionList)) { t.Helper() // First, verify that if a BeforeDo function returns an error, so does ActionList.Do. // We depend on that for the rest of the test. al := coll.Actions().BeforeDo(func(func(any) bool) error { return errors.New("") }) f(al) if err := al.Do(ctx); err == nil { t.Error("beforeDo returning error: got nil from Do, want error") return } called = false al = coll.Actions().BeforeDo(beforeDo) f(al) if err := al.Do(ctx); err != nil { t.Error(err) return } if !called { t.Error("BeforeDo function never called") } } doc := docmap{KeyField: "testBeforeDo"} check(func(l *docstore.ActionList) { l.Create(doc) }) check(func(l *docstore.ActionList) { l.Replace(doc) }) check(func(l *docstore.ActionList) { l.Put(doc) }) check(func(l *docstore.ActionList) { l.Update(doc, docstore.Mods{"a": 1}) }) check(func(l *docstore.ActionList) { l.Get(doc) }) check(func(l *docstore.ActionList) { l.Delete(doc) }) }) } // Verify that BeforeQuery is invoked, and its as function behaves as expected. func testBeforeQuery(t *testing.T, newHarness HarnessMaker) { t.Helper() ctx := context.Background() withCollection(t, newHarness, SingleKey, func(t *testing.T, h Harness, coll *docstore.Collection) { t.Helper() var called bool beforeQuery := func(asFunc func(any) bool) error { called = true if asFunc(nil) { return errors.New("asFunc returned true when called with nil, want false") } // At least one of the expected types must return true. Special case: if // there are no types, then the as function never returns true, so skip the // check. if len(h.BeforeQueryTypes()) > 0 { found := false for _, b := range h.BeforeQueryTypes() { v := reflect.New(reflect.TypeOf(b)).Interface() if asFunc(v) { found = true break } } if !found { return errors.New("none of the BeforeQueryTypes works with the as function") } } return nil } iter := coll.Query().BeforeQuery(beforeQuery).Get(ctx) if err := iter.Next(ctx, docmap{}); err != io.EOF { t.Fatalf("got %v, wanted io.EOF", err) } if !called { t.Error("BeforeQuery function never called for Get") } }) } func testAs(t *testing.T, coll *docstore.Collection, st AsTest) { t.Helper() // Verify Collection.As if err := st.CollectionCheck(coll); err != nil { t.Error(err) } ctx := context.Background() // Query qs := []*docstore.Query{ coll.Query().Where("Game", "=", game3), // Note: don't use filter on Player, the test table has Player as the // partition key of a Global Secondary Index, which doesn't support // ConsistentRead mode, which is what the As test does in its BeforeQuery // function. coll.Query().Where("Score", ">", 50), } for _, q := range qs { iter := q.Get(ctx) if err := st.QueryCheck(iter); err != nil { t.Error(err) } } // ErrorCheck doc := &HighScore{game3, "steph", 24, date(4, 25), false, nil} if err := coll.Create(ctx, doc); err != nil { t.Fatal(err) } doc.DocstoreRevision = nil if err := coll.Create(ctx, doc); err == nil { t.Fatal("got nil error from creating an existing item, want an error") } else { if alerr, ok := err.(docstore.ActionListError); ok { for _, aerr := range alerr { if checkerr := st.ErrorCheck(coll, aerr.Err); checkerr != nil { t.Error(checkerr) } } } else if checkerr := st.ErrorCheck(coll, err); checkerr != nil { t.Error(checkerr) } } } func clone(m docmap) docmap { r := docmap{} maps.Copy(r, m) return r } func cmpDiff(a, b any, opts ...cmp.Option) string { // Firestore revisions can be protos. return cmp.Diff(a, b, append([]cmp.Option{cmp.Comparer(proto.Equal)}, opts...)...) } func checkCode(t *testing.T, err error, code gcerrors.ErrorCode) { t.Helper() if gcerrors.Code(err) != code { t.Errorf("got %v, want %s", err, code) } } ================================================ FILE: docstore/drivertest/util.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package drivertest import ( "math/rand" "sync" "github.com/google/uuid" "gocloud.dev/docstore/driver" ) // MakeUniqueStringDeterministicForTesting uses a specified seed value to // produce the same sequence of values in driver.UniqueString for testing. // // Call when running tests that will be replayed. func MakeUniqueStringDeterministicForTesting(seed int64) { r := &randReader{r: rand.New(rand.NewSource(seed))} uuid.SetRand(r) } type randReader struct { mu sync.Mutex r *rand.Rand } func (r *randReader) Read(buf []byte) (int, error) { r.mu.Lock() defer r.mu.Unlock() return r.r.Read(buf) } // MustDocument is like driver.NewDocument, but panics on error. func MustDocument(doc any) driver.Document { dd, err := driver.NewDocument(doc) if err != nil { panic(err) } return dd } ================================================ FILE: docstore/example_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package docstore_test import ( "context" "fmt" "io" "log" "time" firestore "cloud.google.com/go/firestore/apiv1" "github.com/aws/smithy-go" "gocloud.dev/docstore" _ "gocloud.dev/docstore/awsdynamodb/v2" _ "gocloud.dev/docstore/gcpfirestore" "gocloud.dev/docstore/memdocstore" "gocloud.dev/gcerrors" ) type Player struct { Name string Score int DocstoreRevision any } func ExampleCollection_Actions_bulkWrite() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() var coll *docstore.Collection // Build an ActionList to create several new players, then execute it. // The actions may happen in any order. newPlayers := []string{"Pat", "Mel", "Fran"} actionList := coll.Actions() for _, p := range newPlayers { actionList.Create(&Player{Name: p, Score: 0}) } if err := actionList.Do(ctx); err != nil { log.Fatal(err) } } func ExampleCollection_Actions_getAfterWrite() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() var coll *docstore.Collection // Add a document to the collection, then retrieve it. // Because both the Put and the Get refer to the same document, // they happen in order. got := Player{Name: "Pat"} err := coll.Actions().Put(&Player{Name: "Pat", Score: 88}).Get(&got).Do(ctx) if err != nil { log.Fatal(err) } fmt.Println(got.Name, got.Score) } func ExampleCollection_Update() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() var coll *docstore.Collection // Create a player. pat := &Player{Name: "Pat", Score: 0} if err := coll.Create(ctx, pat); err != nil { log.Fatal(err) } // Set the score to a new value. pat2 := &Player{Name: "Pat"} err := coll.Actions().Update(pat, docstore.Mods{"Score": 15}).Get(pat2).Do(ctx) if err != nil { log.Fatal(err) } // Increment the score. err = coll.Actions().Update(pat, docstore.Mods{"Score": docstore.Increment(5)}).Get(pat2).Do(ctx) if err != nil { log.Fatal(err) } } func ExampleOpenCollection() { ctx := context.Background() // Open a collection using the gcpfirestore package. // You will need to blank-import the package for this to work: // import _ "gocloud.dev/docstore/gcpfirestore" coll, err := docstore.OpenCollection(ctx, "firestore://my-collection") if err != nil { log.Fatal(err) } defer coll.Close() _ = coll // Use the collection. } func ExampleCollection_As() { // This example is specific to the gcpfirestore implementation; it demonstrates // access to the underlying *cloud.google.com/go/firestore/apiv1.Client. // You will need to blank-import the package for this to work: // import _ "gocloud.dev/docstore/gcpfirestore" // The types exposed for As by gcpfirestore are documented in // https://godoc.org/gocloud.dev/docstore/gcpfirestore#hdr-As // This URL will open the collection using default credentials. ctx := context.Background() coll, err := docstore.OpenCollection(ctx, "firestore://projects/myproject/databases/(default)/documents/mycollection?name_field=myID") if err != nil { log.Fatal(err) } defer coll.Close() // Try to access and use the underlying mongo.Collection. var fsClient *firestore.Client if coll.As(&fsClient) { _ = fsClient // TODO: Use the client. } else { log.Println("Unable to access firestore.Client through Collection.As") } } func ExampleCollection_ErrorAs() { // This example is specific to the awsdynamodb implementation. // You will need to blank-import the package for this to work: // import _ "gocloud.dev/docstore/awsdynamodb/v2" // The types exposed for As by mongodocstore are documented in // https://godoc.org/gocloud.dev/docstore/mongodocstore#hdr-As // This URL will open the collection using default credentials. ctx := context.Background() coll, err := docstore.OpenCollection(ctx, "dynamodb://mytable?partition_key=partkey") if err != nil { log.Fatal(err) } defer coll.Close() doc := map[string]any{"_id": "a"} if err := coll.Create(ctx, doc); err != nil { var aerr smithy.APIError if coll.ErrorAs(err, &aerr) { fmt.Println("got", aerr) } else { fmt.Println("could not convert error") } } } func ExampleQuery_Get() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() var coll *docstore.Collection // Ask for all players with scores at least 20. iter := coll.Query().Where("Score", ">=", 20).OrderBy("Score", docstore.Descending).Get(ctx) defer iter.Stop() // Query.Get returns an iterator. Call Next on it until io.EOF. for { var p Player err := iter.Next(ctx, &p) if err == io.EOF { break } else if err != nil { log.Fatal(err) } else { fmt.Printf("%s: %d\n", p.Name, p.Score) } } } func ExampleQuery_Get_full() { ctx := context.Background() coll, err := memdocstore.OpenCollection("Name", nil) if err != nil { log.Fatal(err) } defer coll.Close() // Add some documents to the collection. err = coll.Actions(). Put(&Player{Name: "Pat", Score: 10}). Put(&Player{Name: "Mel", Score: 20}). Put(&Player{Name: "Fran", Score: 30}). Do(ctx) if err != nil { log.Fatal(err) } // Ask for all players with scores at least 20. iter := coll.Query().Where("Score", ">=", 20).OrderBy("Score", docstore.Descending).Get(ctx) defer iter.Stop() // Query.Get returns an iterator. Call Next on it until io.EOF. for { var p Player err := iter.Next(ctx, &p) if err == io.EOF { break } else if err != nil { log.Fatal(err) } else { fmt.Printf("%s: %d\n", p.Name, p.Score) } } // Output: // Fran: 30 // Mel: 20 } func Example_optimisticLocking() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() coll, err := memdocstore.OpenCollection("Name", nil) if err != nil { log.Fatal(err) } defer coll.Close() // Create a player. pat := &Player{Name: "Pat", Score: 7} if err := coll.Create(ctx, pat); err != nil { log.Fatal(err) } fmt.Println(pat) // memdocstore revisions are deterministic, so we can check the output. // Double a player's score. We cannot use Update to multiply, so we use optimistic // locking instead. // We may have to retry a few times; put a time limit on that. ctx, cancel := context.WithTimeout(ctx, 30*time.Second) defer cancel() for { // Get the document. player := &Player{Name: "Pat"} if err := coll.Get(ctx, player); err != nil { log.Fatal(err) } // player.DocstoreRevision is set to the document's revision. // Modify the document locally. player.Score *= 2 // Replace the document. player.DocstoreRevision will be checked against // the stored document's revision. err := coll.Replace(ctx, player) if err != nil { code := gcerrors.Code(err) // On FailedPrecondition or NotFound, try again. if code == gcerrors.FailedPrecondition || code == gcerrors.NotFound { continue } log.Fatal(err) } fmt.Println(player) break } // Output: // &{Pat 7 1} // &{Pat 14 2} } ================================================ FILE: docstore/gcpfirestore/codec.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcpfirestore // Encoding and decoding between supported docstore types and Firestore protos. import ( "errors" "fmt" "path" "reflect" "time" pb "cloud.google.com/go/firestore/apiv1/firestorepb" "gocloud.dev/docstore/driver" "google.golang.org/genproto/googleapis/type/latlng" tspb "google.golang.org/protobuf/types/known/timestamppb" ) // encodeDoc encodes a driver.Document into Firestore's representation. // A Firestore document (*pb.Document) is just a Go map from strings to *pb.Values. func encodeDoc(doc driver.Document, nameField string) (*pb.Document, error) { var e encoder if err := doc.Encode(&e); err != nil { return nil, err } fields := e.pv.GetMapValue().Fields // Do not put the name field in the document itself. if nameField != "" { delete(fields, nameField) } return &pb.Document{Fields: fields}, nil } // encodeValue encodes a Go value as a Firestore Value. // The Firestore proto definition for Value is a oneof of various types, // including basic types like string as well as lists and maps. func encodeValue(x any) (*pb.Value, error) { var e encoder if err := driver.Encode(reflect.ValueOf(x), &e); err != nil { return nil, err } return e.pv, nil } // encoder implements driver.Encoder. Its job is to encode a single Firestore value. type encoder struct { pv *pb.Value } var nullValue = &pb.Value{ValueType: &pb.Value_NullValue{}} func (e *encoder) EncodeNil() { e.pv = nullValue } func (e *encoder) EncodeBool(x bool) { e.pv = &pb.Value{ValueType: &pb.Value_BooleanValue{x}} } func (e *encoder) EncodeInt(x int64) { e.pv = &pb.Value{ValueType: &pb.Value_IntegerValue{x}} } func (e *encoder) EncodeUint(x uint64) { e.pv = &pb.Value{ValueType: &pb.Value_IntegerValue{int64(x)}} } func (e *encoder) EncodeBytes(x []byte) { e.pv = &pb.Value{ValueType: &pb.Value_BytesValue{x}} } func (e *encoder) EncodeFloat(x float64) { e.pv = floatval(x) } func (e *encoder) EncodeString(x string) { e.pv = &pb.Value{ValueType: &pb.Value_StringValue{x}} } func (e *encoder) ListIndex(int) { panic("impossible") } func (e *encoder) MapKey(string) { panic("impossible") } func (e *encoder) EncodeList(n int) driver.Encoder { s := make([]*pb.Value, n) e.pv = &pb.Value{ValueType: &pb.Value_ArrayValue{&pb.ArrayValue{Values: s}}} return &listEncoder{s: s} } func (e *encoder) EncodeMap(n int) driver.Encoder { m := make(map[string]*pb.Value, n) e.pv = &pb.Value{ValueType: &pb.Value_MapValue{&pb.MapValue{Fields: m}}} return &mapEncoder{m: m} } var ( typeOfGoTime = reflect.TypeFor[time.Time]() typeOfProtoTimestamp = reflect.TypeFor[*tspb.Timestamp]() typeOfLatLng = reflect.TypeFor[*latlng.LatLng]() ) // Encode time.Time, latlng.LatLng, and ts.Timestamp specially, because the Go Firestore // client does. func (e *encoder) EncodeSpecial(v reflect.Value) (bool, error) { switch v.Type() { case typeOfGoTime: ts := tspb.New(v.Interface().(time.Time)) e.pv = &pb.Value{ValueType: &pb.Value_TimestampValue{ts}} return true, nil case typeOfProtoTimestamp: if v.IsNil() { e.pv = nullValue } else { e.pv = &pb.Value{ValueType: &pb.Value_TimestampValue{v.Interface().(*tspb.Timestamp)}} } return true, nil case typeOfLatLng: if v.IsNil() { e.pv = nullValue } else { e.pv = &pb.Value{ValueType: &pb.Value_GeoPointValue{v.Interface().(*latlng.LatLng)}} } return true, nil default: return false, nil } } type listEncoder struct { s []*pb.Value encoder } func (e *listEncoder) ListIndex(i int) { e.s[i] = e.pv } type mapEncoder struct { m map[string]*pb.Value encoder } func (e *mapEncoder) MapKey(k string) { e.m[k] = e.pv } func floatval(x float64) *pb.Value { return &pb.Value{ValueType: &pb.Value_DoubleValue{x}} } //////////////////////////////////////////////////////////////// // decodeDoc decodes a Firestore document into a driver.Document. func decodeDoc(pdoc *pb.Document, ddoc driver.Document, nameField, revField string) error { if pdoc.Fields == nil { pdoc.Fields = map[string]*pb.Value{} } if nameField != "" { pdoc.Fields[nameField] = &pb.Value{ValueType: &pb.Value_StringValue{StringValue: path.Base(pdoc.Name)}} } mv := &pb.Value{ValueType: &pb.Value_MapValue{&pb.MapValue{Fields: pdoc.Fields}}} if err := ddoc.Decode(decoder{mv}); err != nil { return err } // Set the revision field in the document, if it exists, to the update time. if ddoc.HasField(revField) && pdoc.UpdateTime != nil { return ddoc.SetField(revField, pdoc.UpdateTime) } return nil } type decoder struct { pv *pb.Value } func (d decoder) String() string { // for debugging return fmt.Sprint(d.pv) } func (d decoder) AsNull() bool { _, ok := d.pv.ValueType.(*pb.Value_NullValue) return ok } func (d decoder) AsBool() (bool, bool) { if b, ok := d.pv.ValueType.(*pb.Value_BooleanValue); ok { return b.BooleanValue, true } return false, false } func (d decoder) AsString() (string, bool) { if s, ok := d.pv.ValueType.(*pb.Value_StringValue); ok { return s.StringValue, true } return "", false } func (d decoder) AsInt() (int64, bool) { if i, ok := d.pv.ValueType.(*pb.Value_IntegerValue); ok { return i.IntegerValue, true } return 0, false } func (d decoder) AsUint() (uint64, bool) { if i, ok := d.pv.ValueType.(*pb.Value_IntegerValue); ok { return uint64(i.IntegerValue), true } return 0, false } func (d decoder) AsFloat() (float64, bool) { if f, ok := d.pv.ValueType.(*pb.Value_DoubleValue); ok { return f.DoubleValue, true } return 0, false } func (d decoder) AsBytes() ([]byte, bool) { if bs, ok := d.pv.ValueType.(*pb.Value_BytesValue); ok { return bs.BytesValue, true } return nil, false } // AsInterface decodes the value in d into the most appropriate Go type. func (d decoder) AsInterface() (any, error) { return decodeValue(d.pv) } func decodeValue(v *pb.Value) (any, error) { switch v := v.ValueType.(type) { case *pb.Value_NullValue: return nil, nil case *pb.Value_BooleanValue: return v.BooleanValue, nil case *pb.Value_IntegerValue: return v.IntegerValue, nil case *pb.Value_DoubleValue: return v.DoubleValue, nil case *pb.Value_StringValue: return v.StringValue, nil case *pb.Value_BytesValue: return v.BytesValue, nil case *pb.Value_TimestampValue: // Return TimestampValue as time.Time. return v.TimestampValue.AsTime(), nil case *pb.Value_ReferenceValue: // TODO(jba): support references return nil, errors.New("references are not currently supported") case *pb.Value_GeoPointValue: // Return GeoPointValue as *latlng.LatLng. return v.GeoPointValue, nil case *pb.Value_ArrayValue: s := make([]any, len(v.ArrayValue.Values)) for i, pv := range v.ArrayValue.Values { e, err := decodeValue(pv) if err != nil { return nil, err } s[i] = e } return s, nil case *pb.Value_MapValue: m := make(map[string]any, len(v.MapValue.Fields)) for k, pv := range v.MapValue.Fields { e, err := decodeValue(pv) if err != nil { return nil, err } m[k] = e } return m, nil } return nil, fmt.Errorf("unknown firestore value type %T", v) } func (d decoder) ListLen() (int, bool) { a := d.pv.GetArrayValue() if a == nil { return 0, false } return len(a.Values), true } func (d decoder) DecodeList(f func(int, driver.Decoder) bool) { for i, e := range d.pv.GetArrayValue().Values { if !f(i, decoder{e}) { return } } } func (d decoder) MapLen() (int, bool) { m := d.pv.GetMapValue() if m == nil { return 0, false } return len(m.Fields), true } func (d decoder) DecodeMap(f func(string, driver.Decoder, bool) bool) { for k, v := range d.pv.GetMapValue().Fields { if !f(k, decoder{v}, true) { return } } } func (d decoder) AsSpecial(v reflect.Value) (bool, any, error) { switch v.Type() { case typeOfGoTime: if ts, ok := d.pv.ValueType.(*pb.Value_TimestampValue); ok { if ts.TimestampValue == nil { return true, time.Time{}, nil } return true, ts.TimestampValue.AsTime(), nil } return true, nil, fmt.Errorf("expected TimestampValue for time.Time, got %+v", d.pv.ValueType) case typeOfProtoTimestamp: if ts, ok := d.pv.ValueType.(*pb.Value_TimestampValue); ok { return true, ts.TimestampValue, nil } return true, nil, fmt.Errorf("expected TimestampValue for *ts.Timestamp, got %+v", d.pv.ValueType) case typeOfLatLng: if ll, ok := d.pv.ValueType.(*pb.Value_GeoPointValue); ok { return true, ll.GeoPointValue, nil } return true, nil, fmt.Errorf("expected GeoPointValue for *latlng.LatLng, got %+v", d.pv.ValueType) default: return false, nil, nil } } ================================================ FILE: docstore/gcpfirestore/codec_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcpfirestore import ( "testing" "time" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "gocloud.dev/docstore" "gocloud.dev/docstore/drivertest" "google.golang.org/genproto/googleapis/type/latlng" tspb "google.golang.org/protobuf/types/known/timestamppb" ) // Test that special types round-trip. // These aren't tested in the docstore-wide conformance tests. func TestCodecSpecial(t *testing.T) { const nameField = "Name" type S struct { Name string T time.Time TS, TSn *tspb.Timestamp LL, LLn *latlng.LatLng } tm := time.Date(2019, 3, 14, 0, 0, 0, 0, time.UTC) ts := tspb.New(tm) in := &S{ Name: "name", T: tm, TS: ts, TSn: nil, LL: &latlng.LatLng{Latitude: 3, Longitude: 4}, LLn: nil, } var got S enc, err := encodeDoc(drivertest.MustDocument(in), nameField) if err != nil { t.Fatal(err) } enc.Name = "collPath/" + in.Name gotdoc := drivertest.MustDocument(&got) // Test type-driven decoding (where the types of the struct fields are available). if err := decodeDoc(enc, gotdoc, nameField, docstore.DefaultRevisionField); err != nil { t.Fatal(err) } if diff := cmp.Diff(&got, in, cmpopts.IgnoreUnexported(tspb.Timestamp{}, latlng.LatLng{})); diff != "" { t.Error(diff) } // Test type-blind decoding. gotmap := map[string]any{} gotmapdoc := drivertest.MustDocument(gotmap) if err := decodeDoc(enc, gotmapdoc, nameField, docstore.DefaultRevisionField); err != nil { t.Fatal(err) } wantmap := map[string]any{ "Name": "name", "T": in.T, "TS": in.T, // timestamps always decode as time.Time "TSn": nil, "LL": in.LL, "LLn": nil, } if diff := cmp.Diff(gotmap, wantmap, cmpopts.IgnoreUnexported(latlng.LatLng{})); diff != "" { t.Error(diff) } } ================================================ FILE: docstore/gcpfirestore/create_indexes.sh ================================================ #!/usr/bin/env bash # Copyright 2019 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Creates the Firestore indexes needed for tests. # Takes one argument: the GCP project ID. # # If an index already exists, this script will fail. To re-create the index, delete # it from the UI at https://firebase.corp.google.com/project/$project_id/database/firestore/indexes. # https://coderwall.com/p/fkfaqq/safer-bash-scripts-with-set-euxo-pipefail # Except we want to keep going if there is a failure, and x is too verbose. set -uo pipefail project_id="${1:-}" if [[ -z "$project_id" ]]; then echo "usage: create_indexes.sh PROJECT" 1>&2 exit 64 fi echo "Creating indexes for $project_id" echo "UI at https://firebase.corp.google.com/project/$project_id/database/firestore/indexes" collection=docstore-test-2 function create_index() { gcloud --project "$project_id" beta firestore indexes composite create --collection-group "$collection" \ --field-config field-path=$1,order=$2 --field-config field-path=$3,order=$4 } set -x create_index Player ascending Score ascending create_index Game ascending Score ascending create_index Player ascending Time ascending create_index Game ascending Player ascending create_index Game ascending Player descending ================================================ FILE: docstore/gcpfirestore/example_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcpfirestore_test import ( "context" "log" "gocloud.dev/docstore" "gocloud.dev/docstore/gcpfirestore" "gocloud.dev/gcp" ) func ExampleOpenCollection() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() creds, err := gcp.DefaultCredentials(ctx) if err != nil { log.Fatal(err) } client, _, err := gcpfirestore.Dial(ctx, creds.TokenSource) if err != nil { log.Fatal(err) } resourceID := gcpfirestore.CollectionResourceID("my-project", "my-collection") coll, err := gcpfirestore.OpenCollection(client, resourceID, "userID", nil) if err != nil { log.Fatal(err) } defer coll.Close() } func ExampleOpenCollectionWithNameFunc() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() type HighScore struct { Game string Player string } creds, err := gcp.DefaultCredentials(ctx) if err != nil { log.Fatal(err) } client, _, err := gcpfirestore.Dial(ctx, creds.TokenSource) if err != nil { log.Fatal(err) } // The name of a document is constructed from the Game and Player fields. nameFromDocument := func(doc docstore.Document) string { hs := doc.(*HighScore) return hs.Game + "|" + hs.Player } resourceID := gcpfirestore.CollectionResourceID("my-project", "my-collection") coll, err := gcpfirestore.OpenCollectionWithNameFunc(client, resourceID, nameFromDocument, nil) if err != nil { log.Fatal(err) } defer coll.Close() } func Example_openCollectionFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/docstore/gcpfirestore" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // docstore.OpenCollection creates a *docstore.Collection from a URL. const url = "firestore://projects/my-project/databases/(default)/documents/my-collection?name_field=userID" coll, err := docstore.OpenCollection(ctx, url) if err != nil { log.Fatal(err) } defer coll.Close() } ================================================ FILE: docstore/gcpfirestore/fs.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package gcpfirestore provides a docstore implementation backed by Google Cloud // Firestore. // Use OpenCollection to construct a *docstore.Collection. // // Docstore types not supported by the Go firestore client, cloud.google.com/go/firestore: // - unsigned integers: encoded is int64s // - arrays: encoded as Firestore array values // // Firestore types not supported by Docstore: // - Document reference (a pointer to another Firestore document) // // # URLs // // For docstore.OpenCollection, gcpfirestore registers for the scheme // "firestore". // The default URL opener will create a connection using default credentials // from the environment, as described in // https://cloud.google.com/docs/authentication/production. // To customize the URL opener, or for more details on the URL format, // see URLOpener. // See https://gocloud.dev/concepts/urls/ for background information. // // # As // // gcpfirestore exposes the following types for as functions. // The pb package is google.golang.org/genproto/googleapis/firestore/v1. // The firestore package is cloud.google.com/go/firestore/apiv1. // - Collection.As: *firestore.Client // - ActionList.BeforeDo: *pb.BatchGetDocumentsRequest or *pb.CommitRequest. // - Query.BeforeQuery: *pb.RunQueryRequest // - DocumentIterator: firestore.Firestore_RunQueryClient // - Error: *google.golang.org/grpc/status.Status // // # Queries // // Firestore allows only one field in a query to be compared with an inequality // operator (one other than "="). This driver selects the first field in a Where // clause with an inequality to pass to Firestore and handles the rest locally. For // example, if the query specifies the three clauses A > 1, B > 2 and A < 3, then // A > 1 and A < 3 will be sent to Firestore, and the results will be filtered by // B > 2 in this driver. // // Firestore requires a composite index if a query contains both an equality and an // inequality comparison. This driver returns an error if the necessary index does // not exist. You must create the index manually. See // https://cloud.google.com/firestore/docs/query-data/indexing for details. // // See https://cloud.google.com/firestore/docs/query-data/queries for more information on Firestore queries. package gcpfirestore // import "gocloud.dev/docstore/gcpfirestore" import ( "bytes" "context" "fmt" "io" "os" "reflect" "regexp" "strings" vkit "cloud.google.com/go/firestore/apiv1" pb "cloud.google.com/go/firestore/apiv1/firestorepb" "github.com/google/wire" "gocloud.dev/docstore" "gocloud.dev/docstore/driver" "gocloud.dev/gcerrors" "gocloud.dev/gcp" "gocloud.dev/internal/gcerr" "gocloud.dev/internal/useragent" "google.golang.org/api/option" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" "google.golang.org/protobuf/proto" tspb "google.golang.org/protobuf/types/known/timestamppb" ) // Dial returns a client to use with Firestore and a clean-up function to close // the client after used. // If the 'FIRESTORE_EMULATOR_HOST' environment variable is set the client connects // to the GCP firestore emulator by overriding the default endpoint. func Dial(ctx context.Context, ts gcp.TokenSource) (*vkit.Client, func(), error) { opts := []option.ClientOption{ useragent.ClientOption("docstore"), } if host := os.Getenv("FIRESTORE_EMULATOR_HOST"); host != "" { conn, err := grpc.DialContext(ctx, host, grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { return nil, nil, err } opts = append(opts, option.WithEndpoint(host), option.WithGRPCConn(conn), ) } else { opts = append(opts, option.WithTokenSource(ts)) } c, err := vkit.NewClient(ctx, opts...) return c, func() { c.Close() }, err } // Set holds Wire providers for this package. var Set = wire.NewSet( Dial, wire.Struct(new(URLOpener), "Client"), ) type collection struct { nameField string nameFunc func(docstore.Document) string client *vkit.Client dbPath string // e.g. "projects/P/databases/(default)" collPath string // e.g. "projects/P/databases/(default)/documents/States/Wisconsin/cities" opts *Options } // Options contains optional arguments to the OpenCollection functions. type Options struct { // If true, allow queries that require client-side evaluation of filters (Where clauses) // to run. AllowLocalFilters bool // The name of the field holding the document revision. // Defaults to docstore.DefaultRevisionField. RevisionField string // The maximum number of RPCs that can be in progress for a single call to // ActionList.Do. // If less than 1, there is no limit. MaxOutstandingActionRPCs int } // CollectionResourceID constructs a resource ID for a collection from the project ID and the collection path. // See the OpenCollection example for use. func CollectionResourceID(projectID, collPath string) string { return fmt.Sprintf("projects/%s/databases/(default)/documents/%s", projectID, collPath) } // CollectResoureceIDWithDatabase constructs a resource ID for a collection from the project ID, database ID, and the collection path. // See the OpenCollection example for use. func CollectionResourceIDWithDatabase(projectID, databaseID, collPath string) string { return fmt.Sprintf("projects/%s/databases/%s/documents/%s", projectID, databaseID, collPath) } // OpenCollection creates a *docstore.Collection representing a Firestore collection. // // collResourceID must be of the form "project//databases/(default)/documents/". // may be a top-level collection, like "States", or it may be a path to a nested // collection, like "States/Wisconsin/Cities". // See https://cloud.google.com/firestore/docs/reference/rest/ for more detail. // // gcpfirestore requires that a single field, nameField, be designated the primary // key. Its values must be strings, and must be unique over all documents in the // collection. The primary key must be provided to retrieve a document. func OpenCollection(client *vkit.Client, collResourceID, nameField string, opts *Options) (*docstore.Collection, error) { c, err := newCollection(client, collResourceID, nameField, nil, opts) if err != nil { return nil, err } return docstore.NewCollection(c), nil } // OpenCollectionWithNameFunc creates a *docstore.Collection representing a Firestore collection. // // collResourceID must be of the form "project//databases/(default)/documents/". // may be a top-level collection, like "States", or it may be a path to a nested // collection, like "States/Wisconsin/Cities". // // The nameFunc argument is function that accepts a document and returns the value to // be used for the document's primary key. It should return the empty string if the // document is missing the information to construct a name. This will cause all // actions, even Create, to fail. // // Providing a function to construct the primary key is useful in two situations: if // your desired primary key field is not a string, or if there is more than one field // you want to use as a primary key. // // For the collection to be usable with Query.Delete and Query.Update, nameFunc // must work with both map and struct types representing the same underlying // data structure. See gocloud.dev/docstore/drivertest.HighScoreKey for an example. func OpenCollectionWithNameFunc(client *vkit.Client, collResourceID string, nameFunc func(docstore.Document) string, opts *Options) (*docstore.Collection, error) { c, err := newCollection(client, collResourceID, "", nameFunc, opts) if err != nil { return nil, err } return docstore.NewCollection(c), nil } var resourceIDRE = regexp.MustCompile(`^(projects/[^/]+/databases/[^/]+)/documents/.+`) func newCollection(client *vkit.Client, collResourceID, nameField string, nameFunc func(docstore.Document) string, opts *Options) (*collection, error) { if nameField == "" && nameFunc == nil { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "one of nameField or nameFunc must be provided") } matches := resourceIDRE.FindStringSubmatch(collResourceID) if matches == nil { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "bad collection resource ID %q; must match %v", collResourceID, resourceIDRE) } dbPath := matches[1] if opts == nil { opts = &Options{} } if opts.RevisionField == "" { opts.RevisionField = docstore.DefaultRevisionField } return &collection{ client: client, nameField: nameField, nameFunc: nameFunc, dbPath: dbPath, collPath: collResourceID, opts: opts, }, nil } // Key returns the document key, if present. This is either the value of the field // called c.nameField, or the result of calling c.nameFunc. func (c *collection) Key(doc driver.Document) (any, error) { if c.nameField != "" { name, err := doc.GetField(c.nameField) vn := reflect.ValueOf(name) if err != nil || name == nil || driver.IsEmptyValue(vn) { // missing field is not an error return nil, nil } // Check that the reflect kind is String so we can support any type whose underlying type // is string. E.g. "type DocName string". if vn.Kind() != reflect.String { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "key field %q with value %v is not a string", c.nameField, name) } sname := vn.String() if sname == "" { // empty string is the same as missing return nil, nil } return sname, nil } sname := c.nameFunc(doc.Origin) if sname == "" { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "missing document key") } return sname, nil } func (c *collection) RevisionField() string { return c.opts.RevisionField } // RunActions implements driver.RunActions. func (c *collection) RunActions(ctx context.Context, actions []*driver.Action, opts *driver.RunActionsOptions) driver.ActionListError { errs := make([]error, len(actions)) beforeGets, gets, writes, writesTx, afterGets := driver.GroupActions(actions) calls := c.buildCommitCalls(writes, errs) atomicWritesCall := c.buildAtomicWritesCommitCall(writesTx, errs) // runGets does not issue concurrent RPCs, so it doesn't need a throttle. c.runGets(ctx, beforeGets, errs, opts) t := driver.NewThrottle(c.opts.MaxOutstandingActionRPCs) for _, call := range calls { t.Acquire() go func() { defer t.Release() c.doCommitCall(ctx, call, errs, opts) }() } // commit the atomic writes if atomicWritesCall != nil && len(atomicWritesCall.actions) > 0 { t.Acquire() go func() { defer t.Release() c.doCommitCall(ctx, atomicWritesCall, errs, opts) }() } t.Acquire() c.runGets(ctx, gets, errs, opts) t.Release() t.Wait() c.runGets(ctx, afterGets, errs, opts) return driver.NewActionListError(errs) } // runGets executes a group of Get actions by calling the BatchGetDocuments RPC. // It may make several calls, because all gets in a single RPC must have the same set of field paths. func (c *collection) runGets(ctx context.Context, actions []*driver.Action, errs []error, opts *driver.RunActionsOptions) { for _, group := range driver.GroupByFieldPath(actions) { c.batchGet(ctx, group, errs, opts) } } // Run a single BatchGet RPC with the given Get actions, all of which have the same set of field paths. // Populate errs, a slice of per-action errors indexed by the original action list position. func (c *collection) batchGet(ctx context.Context, gets []*driver.Action, errs []error, opts *driver.RunActionsOptions) { setErr := func(err error) { for _, g := range gets { errs[g.Index] = err } } req, err := c.newGetRequest(gets) if err != nil { setErr(err) return } indexByPath := map[string]int{} // from document path to index in gets for i, path := range req.Documents { indexByPath[path] = i } if opts.BeforeDo != nil { if err := opts.BeforeDo(driver.AsFunc(req)); err != nil { setErr(err) return } } streamClient, err := c.client.BatchGetDocuments(withResourceHeader(ctx, req.Database), req) if err != nil { setErr(err) return } for { resp, err := streamClient.Recv() if err == io.EOF { break } if err != nil { setErr(err) return } switch r := resp.Result.(type) { case *pb.BatchGetDocumentsResponse_Found: pdoc := r.Found i, ok := indexByPath[pdoc.Name] if !ok { setErr(gcerr.Newf(gcerr.Internal, nil, "no index for path %s", pdoc.Name)) } else { errs[gets[i].Index] = decodeDoc(pdoc, gets[i].Doc, c.nameField, c.opts.RevisionField) } case *pb.BatchGetDocumentsResponse_Missing: i := indexByPath[r.Missing] errs[gets[i].Index] = gcerr.Newf(gcerr.NotFound, nil, "document at path %q is missing", r.Missing) default: setErr(gcerr.Newf(gcerr.Internal, nil, "unknown BatchGetDocumentsResponse result type")) return } } } func (c *collection) newGetRequest(gets []*driver.Action) (*pb.BatchGetDocumentsRequest, error) { req := &pb.BatchGetDocumentsRequest{Database: c.dbPath} for _, a := range gets { req.Documents = append(req.Documents, c.collPath+"/"+a.Key.(string)) } // groupActions has already made sure that all the actions have the same field paths, // so just use the first one. var fps []string // field paths that will go in the mask for _, fp := range gets[0].FieldPaths { fps = append(fps, toServiceFieldPath(fp)) } if fps != nil { req.Mask = &pb.DocumentMask{FieldPaths: fps} } return req, nil } // commitCall holds information needed to make a Commit RPC and to follow up after it is done. type commitCall struct { writes []*pb.Write // writes to commit actions []*driver.Action // actions corresponding to those writes newNames []string // new names for Create; parallel to actions } // Construct a set of concurrently runnable calls to Commit. func (c *collection) buildCommitCalls(actions []*driver.Action, errs []error) []*commitCall { // Convert each action to one or more writes, collecting names for newly created // documents along the way. Divide writes into those with preconditions and those without. // Writes without preconditions can't fail, so we can execute them all in one Commit RPC. // All other writes must be run as separate Commits. var ( nCall = &commitCall{} // for writes without preconditions pCalls []*commitCall // for writes with preconditions ) for _, a := range actions { ws, nn, err := c.actionToWrites(a) if err != nil { errs[a.Index] = err } else if ws[0].CurrentDocument == nil { // no precondition nCall.writes = append(nCall.writes, ws...) nCall.actions = append(nCall.actions, a) nCall.newNames = append(nCall.newNames, nn) } else { // writes have a precondition pCalls = append(pCalls, &commitCall{ writes: ws, actions: []*driver.Action{a}, newNames: []string{nn}, }) } } if len(nCall.writes) == 0 { return pCalls } return append(pCalls, nCall) } // Construct a commit call with all the atomic writes func (c *collection) buildAtomicWritesCommitCall(actions []*driver.Action, errs []error) *commitCall { atomicWritesCommitCall := &commitCall{} for _, a := range actions { ws, nn, err := c.actionToWrites(a) if err != nil { errs[a.Index] = err return nil } else { atomicWritesCommitCall.writes = append(atomicWritesCommitCall.writes, ws...) atomicWritesCommitCall.actions = append(atomicWritesCommitCall.actions, a) atomicWritesCommitCall.newNames = append(atomicWritesCommitCall.newNames, nn) } } return atomicWritesCommitCall } // Convert an action to one or more Firestore Write protos. func (c *collection) actionToWrites(a *driver.Action) ([]*pb.Write, string, error) { var ( w *pb.Write ws []*pb.Write err error docName string newName string // for Create with no name ) if a.Key != nil { docName = a.Key.(string) } switch a.Kind { case driver.Create: // Make a name for this document if it doesn't have one. if a.Key == nil { docName = driver.UniqueString() newName = docName } w, err = c.putWrite(a.Doc, docName, &pb.Precondition{ConditionType: &pb.Precondition_Exists{Exists: false}}) case driver.Replace: // If the given document has a revision, use it as the precondition (it implies existence). pc, perr := c.revisionPrecondition(a.Doc) if perr != nil { return nil, "", perr } // Otherwise, just require that the document exists. if pc == nil { pc = &pb.Precondition{ConditionType: &pb.Precondition_Exists{Exists: true}} } w, err = c.putWrite(a.Doc, docName, pc) case driver.Put: pc, perr := c.revisionPrecondition(a.Doc) if perr != nil { return nil, "", perr } w, err = c.putWrite(a.Doc, docName, pc) case driver.Update: ws, err = c.updateWrites(a.Doc, docName, a.Mods) case driver.Delete: w, err = c.deleteWrite(a.Doc, docName) default: err = gcerr.Newf(gcerr.Internal, nil, "bad action %+v", a) } if err != nil { return nil, "", err } if ws == nil { ws = []*pb.Write{w} } return ws, newName, nil } func (c *collection) putWrite(doc driver.Document, docName string, pc *pb.Precondition) (*pb.Write, error) { pdoc, err := encodeDoc(doc, c.nameField) if err != nil { return nil, err } pdoc.Name = c.collPath + "/" + docName return &pb.Write{ Operation: &pb.Write_Update{Update: pdoc}, CurrentDocument: pc, }, nil } func (c *collection) deleteWrite(doc driver.Document, docName string) (*pb.Write, error) { pc, err := c.revisionPrecondition(doc) if err != nil { return nil, err } return &pb.Write{ Operation: &pb.Write_Delete{Delete: c.collPath + "/" + docName}, CurrentDocument: pc, }, nil } // updateWrites returns a slice of writes because we may need two: one for setting // and deleting values, the other for transforms. func (c *collection) updateWrites(doc driver.Document, docName string, mods []driver.Mod) ([]*pb.Write, error) { ts, err := c.revisionTimestamp(doc) if err != nil { return nil, err } fields, paths, transforms, err := processMods(mods) if err != nil { return nil, err } return newUpdateWrites(c.collPath+"/"+docName, ts, fields, paths, transforms) } func newUpdateWrites(docPath string, ts *tspb.Timestamp, fields map[string]*pb.Value, paths []string, transforms []*pb.DocumentTransform_FieldTransform) ([]*pb.Write, error) { pc := preconditionFromTimestamp(ts) // If there is no revision in the document, add a precondition that the document exists. if pc == nil { pc = &pb.Precondition{ConditionType: &pb.Precondition_Exists{Exists: true}} } var ws []*pb.Write if len(fields) > 0 || len(paths) > 0 { ws = []*pb.Write{{ Operation: &pb.Write_Update{Update: &pb.Document{ Name: docPath, Fields: fields, }}, UpdateMask: &pb.DocumentMask{FieldPaths: paths}, CurrentDocument: pc, }} pc = nil // If the precondition is in the write, we don't need it in the transform. } if len(transforms) > 0 { ws = append(ws, &pb.Write{ Operation: &pb.Write_Transform{ Transform: &pb.DocumentTransform{ Document: docPath, FieldTransforms: transforms, }, }, CurrentDocument: pc, }) } return ws, nil } // To update a document, we need to send: // - A document with all the fields we want to add or change. // - A mask with the field paths of all the fields we want to add, change or delete. // processMods converts the mods into the fields for the document, and a list of // valid Firestore field paths for the mask. func processMods(mods []driver.Mod) (fields map[string]*pb.Value, maskPaths []string, transforms []*pb.DocumentTransform_FieldTransform, err error) { fields = map[string]*pb.Value{} for _, m := range mods { sfp := toServiceFieldPath(m.FieldPath) // If m.Value is nil, we want to delete it. In that case, we put the field in // the mask but not in the doc. if inc, ok := m.Value.(driver.IncOp); ok { pv, err := encodeValue(inc.Amount) if err != nil { return nil, nil, nil, err } transforms = append(transforms, &pb.DocumentTransform_FieldTransform{ FieldPath: sfp, TransformType: &pb.DocumentTransform_FieldTransform_Increment{ Increment: pv, }, }) } else { // The field path of every other mod belongs in the mask. maskPaths = append(maskPaths, sfp) if m.Value != nil { pv, err := encodeValue(m.Value) if err != nil { return nil, nil, nil, err } if err := setAtFieldPath(fields, m.FieldPath, pv); err != nil { return nil, nil, nil, err } } } } return fields, maskPaths, transforms, nil } // doCommitCall Calls the Commit RPC with a list of writes, and handles the results. func (c *collection) doCommitCall(ctx context.Context, call *commitCall, errs []error, opts *driver.RunActionsOptions) { wrs, err := c.commit(ctx, call.writes, opts) if err != nil { for _, a := range call.actions { errs[a.Index] = err } return } // Set the revision fields of the documents. // The actions and writes may not correspond, because Update actions may require // two writes. We can tell which writes correspond to actions by the type of write. j := 0 for i, a := range call.actions { wr := wrs[j] if a.Doc.HasField(c.opts.RevisionField) { if err := a.Doc.SetField(c.opts.RevisionField, wr.UpdateTime); err != nil { errs[a.Index] = err } } if call.newNames[i] != "" { // c.nameField should not be empty since we only create new names when there // is a nameField. _ = a.Doc.SetField(c.nameField, call.newNames[i]) } if hasFollowingTransform(call.writes, j) { j = j + 2 } else { j++ } } } func hasFollowingTransform(writes []*pb.Write, i int) bool { if i >= len(writes)-1 { return false } curr, ok := writes[i].Operation.(*pb.Write_Update) if !ok { return false } next, ok := writes[i+1].Operation.(*pb.Write_Transform) if !ok { return false } return curr.Update.Name == next.Transform.Document } func (c *collection) commit(ctx context.Context, ws []*pb.Write, opts *driver.RunActionsOptions) ([]*pb.WriteResult, error) { req := &pb.CommitRequest{ Database: c.dbPath, Writes: ws, } if opts.BeforeDo != nil { if err := opts.BeforeDo(driver.AsFunc(req)); err != nil { return nil, err } } res, err := c.client.Commit(withResourceHeader(ctx, req.Database), req) if err != nil { return nil, err } if len(res.WriteResults) != len(ws) { return nil, gcerr.Newf(gcerr.Internal, nil, "wrong number of WriteResults from firestore commit") } return res.WriteResults, nil } /////////////// // From memdocstore/mem.go. // setAtFieldPath sets m's value at fp to val. It creates intermediate maps as // needed. It returns an error if a non-final component of fp does not denote a map. func setAtFieldPath(m map[string]*pb.Value, fp []string, val *pb.Value) error { m2, err := getParentMap(m, fp, true) if err != nil { return err } m2[fp[len(fp)-1]] = val return nil } // getParentMap returns the map that directly contains the given field path; // that is, the value of m at the field path that excludes the last component // of fp. If a non-map is encountered along the way, an InvalidArgument error is // returned. If nil is encountered, nil is returned unless create is true, in // which case a map is added at that point. func getParentMap(m map[string]*pb.Value, fp []string, create bool) (map[string]*pb.Value, error) { for _, k := range fp[:len(fp)-1] { if m[k] == nil { if !create { return nil, nil } m[k] = &pb.Value{ValueType: &pb.Value_MapValue{&pb.MapValue{Fields: map[string]*pb.Value{}}}} } mv := m[k].GetMapValue() if mv == nil { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "invalid field path %q at %q", strings.Join(fp, "."), k) } m = mv.Fields } return m, nil } //////////////// // From fieldpath.go in cloud.google.com/go/firestore. // Convert a docstore field path, which is a []string, into the kind of field path // that the Firestore service expects: a string of dot-separated components, some of // which may be quoted. func toServiceFieldPath(fp []string) string { cs := make([]string, len(fp)) for i, c := range fp { cs[i] = toServiceFieldPathComponent(c) } return strings.Join(cs, ".") } // Google SQL syntax for an unquoted field. var unquotedFieldRE = regexp.MustCompile("^[A-Za-z_][A-Za-z_0-9]*$") // toServiceFieldPathComponent returns a string that represents key and is a valid // Firestore field path component. Components must be quoted with backticks if // they don't match the above regexp. func toServiceFieldPathComponent(key string) string { if unquotedFieldRE.MatchString(key) { return key } var buf bytes.Buffer buf.WriteRune('`') for _, r := range key { if r == '`' || r == '\\' { buf.WriteRune('\\') } buf.WriteRune(r) } buf.WriteRune('`') return buf.String() } // revisionPrecondition returns a Firestore precondition that asserts that the stored document's // revision matches the revision of doc. func (c *collection) revisionPrecondition(doc driver.Document) (*pb.Precondition, error) { rev, err := c.revisionTimestamp(doc) if err != nil { return nil, err } return preconditionFromTimestamp(rev), nil } // revisionTimestamp extracts the timestamp from the revision field of doc, if there is one. // It only returns an error if the revision field is present and does not contain the right type. func (c *collection) revisionTimestamp(doc driver.Document) (*tspb.Timestamp, error) { v, err := doc.GetField(c.opts.RevisionField) if err != nil { // revision field not present return nil, nil } if v == nil { // revision field is present, but nil return nil, nil } rev, ok := v.(*tspb.Timestamp) if !ok { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "%s field contains wrong type: got %T, want proto Timestamp", c.opts.RevisionField, v) } return rev, nil } func preconditionFromTimestamp(ts *tspb.Timestamp) *pb.Precondition { if ts == nil || (ts.Seconds == 0 && ts.Nanos == 0) { // ignore a missing or zero revision return nil } return &pb.Precondition{ConditionType: &pb.Precondition_UpdateTime{ts}} } func (c *collection) ErrorCode(err error) gcerrors.ErrorCode { return gcerr.GRPCCode(err) } // resourcePrefixHeader is the name of the metadata header used to indicate // the resource being operated on. const resourcePrefixHeader = "google-cloud-resource-prefix" // withResourceHeader returns a new context that includes resource in a special header. // Firestore uses the resource header for routing. func withResourceHeader(ctx context.Context, resource string) context.Context { md, _ := metadata.FromOutgoingContext(ctx) md = md.Copy() md[resourcePrefixHeader] = []string{resource} return metadata.NewOutgoingContext(ctx, md) } // RevisionToBytes implements driver.RevisionToBytes. func (c *collection) RevisionToBytes(rev any) ([]byte, error) { r, ok := rev.(*tspb.Timestamp) if !ok { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "revision %v of type %[1]T is not a proto Timestamp", rev) } return proto.Marshal(r) } // BytesToRevision implements driver.BytesToRevision. func (c *collection) BytesToRevision(b []byte) (any, error) { var ts tspb.Timestamp if err := proto.Unmarshal(b, &ts); err != nil { return nil, err } return &ts, nil } func (c *collection) As(i any) bool { p, ok := i.(**vkit.Client) if !ok { return false } *p = c.client return true } // ErrorAs implements driver.Collection.ErrorAs. func (c *collection) ErrorAs(err error, i any) bool { s, ok := status.FromError(err) if !ok { return false } p, ok := i.(**status.Status) if !ok { return false } *p = s return true } // Close implements driver.Collection.Close. func (c *collection) Close() error { return nil } ================================================ FILE: docstore/gcpfirestore/fs_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcpfirestore import ( "context" "errors" "testing" vkit "cloud.google.com/go/firestore/apiv1" pb "cloud.google.com/go/firestore/apiv1/firestorepb" "gocloud.dev/docstore" "gocloud.dev/docstore/driver" "gocloud.dev/docstore/drivertest" "gocloud.dev/internal/testing/setup" "google.golang.org/api/option" "google.golang.org/grpc/status" "google.golang.org/protobuf/proto" tspb "google.golang.org/protobuf/types/known/timestamppb" ) const ( // projectID is the project ID that was used during the last test run using --record. projectID = "go-cloud-test-216917" collectionName1 = "docstore-test-1" collectionName2 = "docstore-test-2" collectionName3 = "docstore-test-3" endPoint = "firestore.googleapis.com:443" ) type harness struct { client *vkit.Client done func() } func (h *harness) SupportsAtomicWrites() bool { return true } func newHarness(ctx context.Context, t *testing.T) (drivertest.Harness, error) { t.Helper() conn, done := setup.NewGCPgRPCConn(ctx, t, endPoint, "docstore") client, err := vkit.NewClient(ctx, option.WithGRPCConn(conn)) if err != nil { done() return nil, err } return &harness{client, done}, nil } func (h *harness) MakeCollection(_ context.Context, kind drivertest.CollectionKind) (driver.Collection, error) { switch kind { case drivertest.SingleKey, drivertest.NoRev: return newCollection(h.client, CollectionResourceID(projectID, collectionName1), drivertest.KeyField, nil, nil) case drivertest.TwoKey: return newCollection(h.client, CollectionResourceID(projectID, collectionName2), "", func(doc docstore.Document) string { return drivertest.HighScoreKey(doc).(string) }, &Options{AllowLocalFilters: true}) case drivertest.AltRev: return newCollection(h.client, CollectionResourceID(projectID, collectionName1), drivertest.KeyField, nil, &Options{RevisionField: drivertest.AlternateRevisionField}) default: panic("bad kind") } } func (*harness) BeforeDoTypes() []any { return []any{&pb.BatchGetDocumentsRequest{}, &pb.CommitRequest{}} } func (*harness) BeforeQueryTypes() []any { return []any{&pb.RunQueryRequest{}} } func (*harness) RevisionsEqual(rev1, rev2 any) bool { return proto.Equal(rev1.(*tspb.Timestamp), rev2.(*tspb.Timestamp)) } func (h *harness) Close() { _ = h.client.Close() h.done() } // codecTester implements drivertest.CodecTester. type codecTester struct { nc *nativeCodec } func (*codecTester) UnsupportedTypes() []drivertest.UnsupportedType { return []drivertest.UnsupportedType{drivertest.Uint, drivertest.Arrays} } func (c *codecTester) NativeEncode(x any) (any, error) { return c.nc.Encode(x) } func (c *codecTester) NativeDecode(value, dest any) error { return c.nc.Decode(value.(*pb.Document), dest) } func (c *codecTester) DocstoreEncode(x any) (any, error) { var e encoder if err := drivertest.MustDocument(x).Encode(&e); err != nil { return nil, err } return &pb.Document{ Name: "projects/P/databases/(default)/documents/C/D", Fields: e.pv.GetMapValue().Fields, }, nil } func (c *codecTester) DocstoreDecode(value, dest any) error { mv := &pb.Value{ValueType: &pb.Value_MapValue{MapValue: &pb.MapValue{ Fields: value.(*pb.Document).Fields, }}} return drivertest.MustDocument(dest).Decode(decoder{mv}) } type verifyAs struct{} func (verifyAs) Name() string { return "verify As" } func (verifyAs) CollectionCheck(coll *docstore.Collection) error { var fc *vkit.Client if !coll.As(&fc) { return errors.New("Collection.As failed") } return nil } func (verifyAs) QueryCheck(it *docstore.DocumentIterator) error { var c pb.Firestore_RunQueryClient if !it.As(&c) { return errors.New("DocumentIterator.As failed") } _, err := c.Header() return err } func (v verifyAs) ErrorCheck(c *docstore.Collection, err error) error { var s *status.Status if !c.ErrorAs(err, &s) { return errors.New("Collection.ErrorAs failed") } return nil } func TestConformance(t *testing.T) { drivertest.MakeUniqueStringDeterministicForTesting(1) nc, err := newNativeCodec() if err != nil { t.Fatal(err) } drivertest.RunConformanceTests(t, newHarness, &codecTester{nc}, []drivertest.AsTest{verifyAs{}}) } func BenchmarkConformance(b *testing.B) { ctx := context.Background() client, err := vkit.NewClient(ctx) if err != nil { b.Fatal(err) } coll, err := newCollection(client, CollectionResourceID(projectID, collectionName3), drivertest.KeyField, nil, nil) if err != nil { b.Fatal(err) } drivertest.RunBenchmarks(b, docstore.NewCollection(coll)) } // gcpfirestore-specific tests. func TestResourceIDRegexp(t *testing.T) { for _, good := range []string{ "projects/abc-_.309/databases/(default)/documents/C", "projects/P/databases/(default)/documents/C/D/E", "projects/P/databases/mydb/documents/E/F/G", } { if !resourceIDRE.MatchString(good) { t.Errorf("%q did not match but should have", good) } } for _, bad := range []string{ "", "Projects/P/databases/(default)/documents/C", "P/databases/(default)/documents/C", "projects/P/Q/databases/(default)/documents/C", "projects/P/databases/(default)/C", "projects/P/databases/(default)/documents/", "projects/P/databases/(default)", } { if resourceIDRE.MatchString(bad) { t.Errorf("%q matched but should not have", bad) } } } ================================================ FILE: docstore/gcpfirestore/native_codec_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcpfirestore import ( "context" "io" "net" "testing" "cloud.google.com/go/firestore" pb "cloud.google.com/go/firestore/apiv1/firestorepb" "github.com/google/go-cmp/cmp" "google.golang.org/api/option" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/metadata" tspb "google.golang.org/protobuf/types/known/timestamppb" ) // A nativeCodec encodes and decodes structs using the cloud.google.com/go/firestore // client. Since that package doesn't export its codec, we have to go behind the // scenes and intercept traffic at the gRPC level. We use interceptors to do that. (A // mock server would have worked too.) type nativeCodec struct { client *firestore.Client doc *pb.Document } func newNativeCodec() (*nativeCodec, error) { // Establish a gRPC server, just so we have a connection to hang the interceptors on. srv := grpc.NewServer() l, err := net.Listen("tcp", "127.0.0.1:0") if err != nil { return nil, err } go func() { if err := srv.Serve(l); err != nil { panic(err) // we should never get an error because we just connect and stop } }() nc := &nativeCodec{} conn, err := grpc.Dial(l.Addr().String(), grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithBlock(), grpc.WithUnaryInterceptor(nc.interceptUnary), grpc.WithStreamInterceptor(nc.interceptStream)) if err != nil { return nil, err } conn.Close() srv.Stop() nc.client, err = firestore.NewClient(context.Background(), "P", option.WithGRPCConn(conn)) if err != nil { return nil, err } return nc, nil } // Intercept all unary (non-streaming) RPCs. The only one we should ever get is a Commit, for // the Create call in Encode. // If this completes successfully, the encoded *pb.Document will be in c.doc. func (c *nativeCodec) interceptUnary(_ context.Context, method string, req, res any, _ *grpc.ClientConn, _ grpc.UnaryInvoker, _ ...grpc.CallOption) error { c.doc = req.(*pb.CommitRequest).Writes[0].GetUpdate() res.(*pb.CommitResponse).WriteResults = []*pb.WriteResult{{}} return nil } // Intercept all streaming RPCs. The only one we should ever get is a BatchGet, for the Get // call in Decode. // Before this is called, c.doc must be set to the *pb.Document to be returned from the call. func (c *nativeCodec) interceptStream(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn, method string, streamer grpc.Streamer, opts ...grpc.CallOption) (grpc.ClientStream, error) { return &clientStream{ctx: ctx, doc: c.doc}, nil } // clientStream is a fake client stream. It returns a single document, then terminates. type clientStream struct { ctx context.Context doc *pb.Document } func (cs *clientStream) RecvMsg(m any) error { if cs.doc != nil { cs.doc.CreateTime = &tspb.Timestamp{} cs.doc.UpdateTime = &tspb.Timestamp{} m.(*pb.BatchGetDocumentsResponse).Result = &pb.BatchGetDocumentsResponse_Found{Found: cs.doc} cs.doc = nil return nil } return io.EOF } func (cs *clientStream) Context() context.Context { return cs.ctx } func (cs *clientStream) SendMsg(m any) error { return nil } func (cs *clientStream) Header() (metadata.MD, error) { return nil, nil } func (cs *clientStream) Trailer() metadata.MD { return nil } func (cs *clientStream) CloseSend() error { return nil } // Encode a Go value into a Firestore proto document. func (c *nativeCodec) Encode(x any) (*pb.Document, error) { _, err := c.client.Collection("C").Doc("D").Create(context.Background(), x) if err != nil { return nil, err } return c.doc, nil } // Decode value, which must be a *pb.Document, into dest. func (c *nativeCodec) Decode(value *pb.Document, dest any) error { c.doc = value docsnap, err := c.client.Collection("C").Doc("D").Get(context.Background()) if err != nil { return err } return docsnap.DataTo(dest) } func TestNativeCodec(t *testing.T) { nc, err := newNativeCodec() if err != nil { t.Fatal(err) } type S struct { A int } want := S{3} fields, err := nc.Encode(&want) if err != nil { t.Fatal(err) } var got S if err := nc.Decode(fields, &got); err != nil { t.Fatal(err) } if !cmp.Equal(got, want) { t.Errorf("got %+v, want %+v", got, want) } } ================================================ FILE: docstore/gcpfirestore/query.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // TODO(jba): figure out how to get filters with uints to work: since they are represented as // int64s, the sign is wrong. package gcpfirestore import ( "context" "fmt" "math" "path" "reflect" "strings" "time" pb "cloud.google.com/go/firestore/apiv1/firestorepb" "gocloud.dev/docstore/driver" "gocloud.dev/internal/gcerr" "google.golang.org/protobuf/types/known/wrapperspb" ) func (c *collection) RunGetQuery(ctx context.Context, q *driver.Query) (driver.DocumentIterator, error) { return c.newDocIterator(ctx, q) } func (c *collection) newDocIterator(ctx context.Context, q *driver.Query) (*docIterator, error) { sq, localFilters, err := c.queryToProto(q) if err != nil { return nil, err } req := &pb.RunQueryRequest{ Parent: path.Dir(c.collPath), QueryType: &pb.RunQueryRequest_StructuredQuery{sq}, } if q.BeforeQuery != nil { if err := q.BeforeQuery(driver.AsFunc(req)); err != nil { return nil, err } } ctx, cancel := context.WithCancel(ctx) sc, err := c.client.RunQuery(withResourceHeader(ctx, c.dbPath), req) if err != nil { cancel() return nil, err } return &docIterator{ streamClient: sc, nameField: c.nameField, revField: c.opts.RevisionField, localFilters: localFilters, cancel: cancel, }, nil } // ////////////////////////////////////////////////////////////// // The code below is adapted from cloud.google.com/go/firestore. type docIterator struct { streamClient pb.Firestore_RunQueryClient nameField, revField string localFilters []driver.Filter // We call cancel to make sure the stream client doesn't leak resources. // We don't need to call it if Recv() returns a non-nil error. // See https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. cancel func() } func (it *docIterator) Next(ctx context.Context, doc driver.Document) error { res, err := it.nextResponse(ctx) if err != nil { return err } return decodeDoc(res.Document, doc, it.nameField, it.revField) } func (it *docIterator) nextResponse(ctx context.Context) (*pb.RunQueryResponse, error) { for { res, err := it.streamClient.Recv() if err != nil { return nil, err } // No document => partial progress; keep receiving. if res.Document == nil { continue } match, err := it.evaluateLocalFilters(res.Document) if err != nil { return nil, err } if match { return res, nil } } } // Report whether the filters are true of the document. func (it *docIterator) evaluateLocalFilters(pdoc *pb.Document) (bool, error) { if len(it.localFilters) == 0 { return true, nil } // TODO(jba): optimization: evaluate the filter directly on the proto document, without decoding. m := map[string]any{} doc, err := driver.NewDocument(m) if err != nil { return false, err } if err := decodeDoc(pdoc, doc, it.nameField, it.revField); err != nil { return false, err } for _, f := range it.localFilters { if !evaluateFilter(f, doc) { return false, nil } } return true, nil } func evaluateFilter(f driver.Filter, doc driver.Document) bool { val, err := doc.Get(f.FieldPath) if err != nil { // Treat a missing field as false. return false } // Compare times. if t1, ok := val.(time.Time); ok { if t2, ok := f.Value.(time.Time); ok { return applyComparison(f.Op, driver.CompareTimes(t1, t2)) } return false } lhs := reflect.ValueOf(val) rhs := reflect.ValueOf(f.Value) if lhs.Kind() == reflect.String { if rhs.Kind() != reflect.String { return false } return applyComparison(f.Op, strings.Compare(lhs.String(), rhs.String())) } if lhs.Kind() == reflect.Bool { if rhs.Kind() != reflect.Bool { return false } cmp := 0 if lhs.Bool() != rhs.Bool() { cmp = -1 } return applyComparison(f.Op, cmp) } cmp, err := driver.CompareNumbers(lhs, rhs) if err != nil { return false } return applyComparison(f.Op, cmp) } // op is one of the five permitted docstore operators ("=", "<", etc.) // c is the result of strings.Compare or the like. func applyComparison(op string, c int) bool { switch op { case driver.EqualOp: return c == 0 case ">": return c > 0 case "<": return c < 0 case ">=": return c >= 0 case "<=": return c <= 0 default: panic("bad op") } } func (it *docIterator) Stop() { it.cancel() } func (it *docIterator) As(i any) bool { p, ok := i.(*pb.Firestore_RunQueryClient) if !ok { return false } *p = it.streamClient return true } // Converts the query to a Firestore proto. Also returns filters that need to be // evaluated on the client. func (c *collection) queryToProto(q *driver.Query) (*pb.StructuredQuery, []driver.Filter, error) { // The collection ID is the last component of the collection path. collID := path.Base(c.collPath) p := &pb.StructuredQuery{ From: []*pb.StructuredQuery_CollectionSelector{{CollectionId: collID}}, } if len(q.FieldPaths) > 0 { p.Select = &pb.StructuredQuery_Projection{} for _, fp := range q.FieldPaths { p.Select.Fields = append(p.Select.Fields, fieldRef(fp)) } } // Apply offset. if q.Offset > 0 { p.Offset = int32(q.Offset) } // Apply limit. if q.Limit > 0 { p.Limit = &wrapperspb.Int32Value{Value: int32(q.Limit)} } // TODO(jba): make sure we retrieve the fields needed for local filters. sendFilters, localFilters := splitFilters(q.Filters) if len(localFilters) > 0 && !c.opts.AllowLocalFilters { return nil, nil, gcerr.Newf(gcerr.InvalidArgument, nil, "query requires local filters; set Options.AllowLocalFilters to true to enable") } // If there is only one filter, use it directly. Otherwise, construct // a CompositeFilter. var pfs []*pb.StructuredQuery_Filter for _, f := range sendFilters { pf, err := c.filterToProto(f) if err != nil { return nil, nil, err } pfs = append(pfs, pf) } if len(pfs) == 1 { p.Where = pfs[0] } else if len(pfs) > 1 { p.Where = &pb.StructuredQuery_Filter{ FilterType: &pb.StructuredQuery_Filter_CompositeFilter{&pb.StructuredQuery_CompositeFilter{ Op: pb.StructuredQuery_CompositeFilter_AND, Filters: pfs, }}, } } if q.OrderByField != "" { // TODO(jba): reorder filters so order-by one is first of inequalities? // TODO(jba): see if it's OK if filter inequality direction differs from sort direction. fref := []string{q.OrderByField} if q.OrderByField == c.nameField { fref[0] = "__name__" } var dir pb.StructuredQuery_Direction if q.OrderAscending { dir = pb.StructuredQuery_ASCENDING } else { dir = pb.StructuredQuery_DESCENDING } p.OrderBy = []*pb.StructuredQuery_Order{{Field: fieldRef(fref), Direction: dir}} } // TODO(jba): cursors (start/end) return p, localFilters, nil } // splitFilters separates the list of query filters into those we can send to the Firestore service, // and those we must evaluate here on the client. func splitFilters(fs []driver.Filter) (sendToFirestore, evaluateLocally []driver.Filter) { // Enforce that only one field can have an inequality. var rangeFP []string for _, f := range fs { if f.Op == driver.EqualOp { sendToFirestore = append(sendToFirestore, f) } else { if rangeFP == nil || driver.FieldPathsEqual(rangeFP, f.FieldPath) { // Multiple inequality filters on the same field are OK. rangeFP = f.FieldPath sendToFirestore = append(sendToFirestore, f) } else { evaluateLocally = append(evaluateLocally, f) } } } return sendToFirestore, evaluateLocally } func (c *collection) filterToProto(f driver.Filter) (*pb.StructuredQuery_Filter, error) { // Treat filters on the name field specially. if c.nameField != "" && driver.FieldPathEqualsField(f.FieldPath, c.nameField) { v := reflect.ValueOf(f.Value) if v.Kind() != reflect.String { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "name field filter value %v of type %[1]T is not a string", f.Value) } return newFieldFilter([]string{"__name__"}, f.Op, &pb.Value{ValueType: &pb.Value_ReferenceValue{c.collPath + "/" + v.String()}}) } // "= nil" and "= NaN" are handled specially. if uop, ok := unaryOpFor(f.Value); ok { if f.Op != driver.EqualOp { return nil, fmt.Errorf("firestore: must use '=' when comparing %v", f.Value) } return &pb.StructuredQuery_Filter{ FilterType: &pb.StructuredQuery_Filter_UnaryFilter{ UnaryFilter: &pb.StructuredQuery_UnaryFilter{ OperandType: &pb.StructuredQuery_UnaryFilter_Field{ Field: fieldRef(f.FieldPath), }, Op: uop, }, }, }, nil } pv, err := encodeValue(f.Value) if err != nil { return nil, err } return newFieldFilter(f.FieldPath, f.Op, pv) } func unaryOpFor(value any) (pb.StructuredQuery_UnaryFilter_Operator, bool) { switch { case value == nil: return pb.StructuredQuery_UnaryFilter_IS_NULL, true case isNaN(value): return pb.StructuredQuery_UnaryFilter_IS_NAN, true default: return pb.StructuredQuery_UnaryFilter_OPERATOR_UNSPECIFIED, false } } func isNaN(x any) bool { switch x := x.(type) { case float32: return math.IsNaN(float64(x)) case float64: return math.IsNaN(x) default: return false } } func fieldRef(fp []string) *pb.StructuredQuery_FieldReference { return &pb.StructuredQuery_FieldReference{FieldPath: toServiceFieldPath(fp)} } func newFieldFilter(fp []string, op string, val *pb.Value) (*pb.StructuredQuery_Filter, error) { var fop pb.StructuredQuery_FieldFilter_Operator switch op { case "<": fop = pb.StructuredQuery_FieldFilter_LESS_THAN case "<=": fop = pb.StructuredQuery_FieldFilter_LESS_THAN_OR_EQUAL case ">": fop = pb.StructuredQuery_FieldFilter_GREATER_THAN case ">=": fop = pb.StructuredQuery_FieldFilter_GREATER_THAN_OR_EQUAL case driver.EqualOp: fop = pb.StructuredQuery_FieldFilter_EQUAL case "in": fop = pb.StructuredQuery_FieldFilter_IN case "not-in": fop = pb.StructuredQuery_FieldFilter_NOT_IN // TODO(jba): can we support array-contains portably? // case "array-contains": // fop = pb.StructuredQuery_FieldFilter_ARRAY_CONTAINS default: return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "invalid operator: %q", op) } return &pb.StructuredQuery_Filter{ FilterType: &pb.StructuredQuery_Filter_FieldFilter{ FieldFilter: &pb.StructuredQuery_FieldFilter{ Field: fieldRef(fp), Op: fop, Value: val, }, }, }, nil } func (c *collection) QueryPlan(q *driver.Query) (string, error) { return "unknown", nil } ================================================ FILE: docstore/gcpfirestore/query_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcpfirestore import ( "math" "testing" "time" pb "cloud.google.com/go/firestore/apiv1/firestorepb" "github.com/google/go-cmp/cmp" "gocloud.dev/docstore/driver" "gocloud.dev/docstore/drivertest" "google.golang.org/protobuf/proto" ) func TestFilterToProto(t *testing.T) { c := &collection{nameField: "name", collPath: "collPath"} for _, test := range []struct { in driver.Filter want *pb.StructuredQuery_Filter }{ { driver.Filter{[]string{"a"}, ">", 1}, &pb.StructuredQuery_Filter{FilterType: &pb.StructuredQuery_Filter_FieldFilter{ FieldFilter: &pb.StructuredQuery_FieldFilter{ Field: &pb.StructuredQuery_FieldReference{FieldPath: "a"}, Op: pb.StructuredQuery_FieldFilter_GREATER_THAN, Value: &pb.Value{ValueType: &pb.Value_IntegerValue{1}}, }, }}, }, { driver.Filter{[]string{"a"}, driver.EqualOp, nil}, &pb.StructuredQuery_Filter{FilterType: &pb.StructuredQuery_Filter_UnaryFilter{ UnaryFilter: &pb.StructuredQuery_UnaryFilter{ OperandType: &pb.StructuredQuery_UnaryFilter_Field{ Field: &pb.StructuredQuery_FieldReference{FieldPath: "a"}, }, Op: pb.StructuredQuery_UnaryFilter_IS_NULL, }, }}, }, { driver.Filter{[]string{"a"}, driver.EqualOp, math.NaN()}, &pb.StructuredQuery_Filter{FilterType: &pb.StructuredQuery_Filter_UnaryFilter{ UnaryFilter: &pb.StructuredQuery_UnaryFilter{ OperandType: &pb.StructuredQuery_UnaryFilter_Field{ Field: &pb.StructuredQuery_FieldReference{FieldPath: "a"}, }, Op: pb.StructuredQuery_UnaryFilter_IS_NAN, }, }}, }, { driver.Filter{[]string{"name"}, "<", "foo"}, &pb.StructuredQuery_Filter{FilterType: &pb.StructuredQuery_Filter_FieldFilter{ FieldFilter: &pb.StructuredQuery_FieldFilter{ Field: &pb.StructuredQuery_FieldReference{FieldPath: "__name__"}, Op: pb.StructuredQuery_FieldFilter_LESS_THAN, Value: &pb.Value{ValueType: &pb.Value_ReferenceValue{"collPath/foo"}}, }, }}, }, } { got, err := c.filterToProto(test.in) if err != nil { t.Fatal(err) } if diff := cmp.Diff(got, test.want, cmp.Comparer(proto.Equal)); diff != "" { t.Errorf("%+v: %s", test.in, diff) } } } func TestSplitFilters(t *testing.T) { aEqual := driver.Filter{[]string{"a"}, "=", 1} aLess := driver.Filter{[]string{"a"}, "<", 1} aGreater := driver.Filter{[]string{"a"}, ">", 1} bEqual := driver.Filter{[]string{"b"}, "=", 1} bLess := driver.Filter{[]string{"b"}, "<", 1} for _, test := range []struct { in []driver.Filter wantSend, wantLocal []driver.Filter }{ { in: nil, wantSend: nil, wantLocal: nil, }, { in: []driver.Filter{aEqual}, wantSend: []driver.Filter{aEqual}, wantLocal: nil, }, { in: []driver.Filter{aLess}, wantSend: []driver.Filter{aLess}, wantLocal: nil, }, { in: []driver.Filter{aLess, aGreater}, wantSend: []driver.Filter{aLess, aGreater}, wantLocal: nil, }, { in: []driver.Filter{aLess, bEqual, aGreater}, wantSend: []driver.Filter{aLess, bEqual, aGreater}, wantLocal: nil, }, { in: []driver.Filter{aLess, bLess, aGreater}, wantSend: []driver.Filter{aLess, aGreater}, wantLocal: []driver.Filter{bLess}, }, { in: []driver.Filter{aEqual, aLess, bLess, aGreater, bEqual}, wantSend: []driver.Filter{aEqual, aLess, aGreater, bEqual}, wantLocal: []driver.Filter{bLess}, }, } { gotSend, gotLocal := splitFilters(test.in) if diff := cmp.Diff(gotSend, test.wantSend); diff != "" { t.Errorf("%v, send:\n%s", test.in, diff) } if diff := cmp.Diff(gotLocal, test.wantLocal); diff != "" { t.Errorf("%v, local:\n%s", test.in, diff) } } } func TestEvaluateFilter(t *testing.T) { m := map[string]any{ "i": 32, "f": 5.5, "f2": 5.0, "s": "32", "t": time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC), "b": true, "mi": int64(math.MaxInt64), } doc := drivertest.MustDocument(m) for _, test := range []struct { field, op string value any want bool }{ // Firestore compares numbers to each other ignoring type (int vs. float). // Just a few simple tests here; see driver.TestCompareNumbers for more. {"i", "=", 32, true}, {"i", ">", 32, false}, {"i", "<", 32, false}, {"i", "=", 32.0, true}, {"i", ">", 32.0, false}, {"i", "<", 32.0, false}, {"f", "=", 5.5, true}, {"f", "<", 5.5, false}, {"f2", "=", 5, true}, {"f2", ">", 5, false}, // Firestore compares strings to each other, but not to numbers. {"s", "=", "32", true}, {"s", ">", "32", false}, {"s", "<", "32", false}, {"s", ">", "3", true}, {"i", "=", "32", false}, {"i", ">", "32", false}, {"i", "<", "32", false}, {"f", "=", "5.5", false}, {"f", ">", "5.5", false}, {"f", "<", "5.5", false}, // Firestore compares times to each other. {"t", "<", time.Date(2014, 1, 1, 0, 0, 0, 0, time.UTC), true}, // Comparisons with other types fail. {"b", "=", "true", false}, {"b", ">", "true", false}, {"b", "<", "true", false}, {"t", "=", 0, false}, {"t", ">", 0, false}, {"t", "<", 0, false}, } { f := driver.Filter{FieldPath: []string{test.field}, Op: test.op, Value: test.value} got := evaluateFilter(f, doc) if got != test.want { t.Errorf("%s %s %v: got %t, want %t", test.field, test.op, test.value, got, test.want) } } } ================================================ FILE: docstore/gcpfirestore/urls.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcpfirestore import ( "context" "errors" "fmt" "net/url" "os" "path" "sync" vkit "cloud.google.com/go/firestore/apiv1" "gocloud.dev/docstore" "gocloud.dev/gcp" ) func init() { docstore.DefaultURLMux().RegisterCollection(Scheme, &lazyCredsOpener{}) } type lazyCredsOpener struct { init sync.Once opener *URLOpener err error } func (o *lazyCredsOpener) OpenCollectionURL(ctx context.Context, u *url.URL) (*docstore.Collection, error) { o.init.Do(func() { var tokenSource gcp.TokenSource if e := os.Getenv("FIRESTORE_EMULATOR_HOST"); e == "" { // Connect to the GCP default endpoint if the 'FIRESTORE_EMULATOR_HOST' environment variable is not set. creds, err := gcp.DefaultCredentials(ctx) if err != nil { o.err = err return } tokenSource = creds.TokenSource } client, _, err := Dial(ctx, tokenSource) if err != nil { o.err = err return } o.opener = &URLOpener{Client: client} }) if o.err != nil { return nil, fmt.Errorf("open collection %s: %v", u, o.err) } return o.opener.OpenCollectionURL(ctx, u) } // Scheme is the URL scheme firestore registers its URLOpener under on // docstore.DefaultMux. const Scheme = "firestore" // URLOpener opens firestore URLs like // "firestore://projects/myproject/databases/(default)/documents/mycollection?name_field=myID". // // See https://firebase.google.com/docs/firestore/data-model for more details. // // The following query parameters are supported: // // - name_field (required): gcpfirestore requires that a single string field, // // name_field, be designated the primary key. Its values must be unique over all // documents in the collection, and the primary key must be provided to retrieve // a document. type URLOpener struct { // Client must be set to a non-nil client authenticated with Cloud Firestore // scope or equivalent. Client *vkit.Client } // OpenCollectionURL opens a docstore.Collection based on u. func (o *URLOpener) OpenCollectionURL(ctx context.Context, u *url.URL) (*docstore.Collection, error) { q := u.Query() options := &Options{ RevisionField: q.Get("revision_field"), } nameField := q.Get("name_field") if nameField == "" { return nil, errors.New("open collection %s: name_field is required to open a collection") } q.Del("name_field") q.Del("revision_field") for param := range q { return nil, fmt.Errorf("open collection %s: invalid query parameter %q", u, param) } collResourceID := path.Join(u.Host, u.Path) return OpenCollection(o.Client, collResourceID, nameField, options) } ================================================ FILE: docstore/gcpfirestore/urls_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcpfirestore import ( "context" "testing" "gocloud.dev/docstore" "gocloud.dev/internal/testing/setup" ) func TestOpenCollectionFromURL(t *testing.T) { cleanup := setup.FakeGCPDefaultCredentials(t) defer cleanup() tests := []struct { URL string WantErr bool }{ // OK. {"firestore://projects/myproject/databases/(default)/documents/mycoll?name_field=_id", false}, // OK, hierarchical collection. {"firestore://projects/myproject/databases/(default)/documents/mycoll/mydoc/subcoll?name_field=_id", false}, // Missing project ID. {"firestore:///mycoll?name_field=_id", true}, // Empty collection. {"firestore://projects/myproject/", true}, // Missing name field. {"firestore://projects/myproject/databases/(default)/documents/mycoll", true}, // Passing revision field. {"firestore://projects/myproject/databases/(default)/documents/mycoll?name_field=_id&revision_field=123", false}, // Invalid param. {"firestore://projects/myproject/databases/(default)/documents/mycoll?name_field=_id¶m=value", true}, } ctx := context.Background() for _, test := range tests { d, err := docstore.OpenCollection(ctx, test.URL) if d != nil { defer d.Close() } if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } } } ================================================ FILE: docstore/internal/fields/README.md ================================================ This package is copied from cloud.google.com/go/internal/fields. ================================================ FILE: docstore/internal/fields/fields.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package fields provides a view of the fields of a struct that follows the Go // rules, amended to consider tags and case insensitivity. // // # Usage // // First define a function that interprets tags: // // func parseTag(st reflect.StructTag) (name string, keep bool, other interface{}, err error) { ... } // // The function's return values describe whether to ignore the field // completely or provide an alternate name, as well as other data from the // parse that is stored to avoid re-parsing. // // Then define a function to validate the type: // // func validate(t reflect.Type) error { ... } // // Then, if necessary, define a function to specify leaf types - types // which should be considered one field and not be recursed into: // // func isLeafType(t reflect.Type) bool { ... } // // eg: // // func isLeafType(t reflect.Type) bool { // return t == reflect.TypeOf(time.Time{}) // } // // Next, construct a Cache, passing your functions. As its name suggests, a // Cache remembers validation and field information for a type, so subsequent // calls with the same type are very fast. // // cache := fields.NewCache(parseTag, validate, isLeafType) // // To get the fields of a struct type as determined by the above rules, call // the Fields method: // // fields, err := cache.Fields(reflect.TypeOf(MyStruct{})) // // The return value can be treated as a slice of Fields. // // Given a string, such as a key or column name obtained during unmarshalling, // call Match on the list of fields to find a field whose name is the best // match: // // field := fields.Match(name) // // Match looks for an exact match first, then falls back to a case-insensitive // comparison. package fields import ( "bytes" "reflect" "sort" "strings" "sync" ) // A Field records information about a struct field. type Field struct { Name string // effective field name NameFromTag bool // did Name come from a tag? Type reflect.Type // field type Index []int // index sequence, for reflect.Value.FieldByIndex ParsedTag any // third return value of the parseTag function nameBytes []byte equalFold func(s, t []byte) bool } // ParseTagFunc is a function that accepts a struct tag and returns four values: an alternative name for the field // extracted from the tag, a boolean saying whether to keep the field or ignore it, additional data that is stored // with the field information to avoid having to parse the tag again, and an error. type ParseTagFunc func(reflect.StructTag) (name string, keep bool, other any, err error) // ValidateFunc is a function that accepts a reflect.Type and returns an error if the struct type is invalid in any // way. type ValidateFunc func(reflect.Type) error // LeafTypesFunc is a function that accepts a reflect.Type and returns true if the struct type a leaf, or false if not. // TODO(deklerk) is this description accurate? type LeafTypesFunc func(reflect.Type) bool // A Cache records information about the fields of struct types. // // A Cache is safe for use by multiple goroutines. type Cache struct { parseTag ParseTagFunc validate ValidateFunc leafTypes LeafTypesFunc cache sync.Map // from reflect.Type to cacheValue } // NewCache constructs a Cache. // // Its first argument should be a function that accepts // a struct tag and returns four values: an alternative name for the field // extracted from the tag, a boolean saying whether to keep the field or ignore // it, additional data that is stored with the field information to avoid // having to parse the tag again, and an error. // // Its second argument should be a function that accepts a reflect.Type and // returns an error if the struct type is invalid in any way. For example, it // may check that all of the struct field tags are valid, or that all fields // are of an appropriate type. func NewCache(parseTag ParseTagFunc, validate ValidateFunc, leafTypes LeafTypesFunc) *Cache { if parseTag == nil { parseTag = func(reflect.StructTag) (string, bool, any, error) { return "", true, nil, nil } } if validate == nil { validate = func(reflect.Type) error { return nil } } if leafTypes == nil { leafTypes = func(reflect.Type) bool { return false } } return &Cache{ parseTag: parseTag, validate: validate, leafTypes: leafTypes, } } // A fieldScan represents an item on the fieldByNameFunc scan work list. type fieldScan struct { typ reflect.Type index []int } // Fields returns all the exported fields of t, which must be a struct type. It // follows the standard Go rules for embedded fields, modified by the presence // of tags. The result is sorted lexicographically by index. // // These rules apply in the absence of tags: // Anonymous struct fields are treated as if their inner exported fields were // fields in the outer struct (embedding). The result includes all fields that // aren't shadowed by fields at higher level of embedding. If more than one // field with the same name exists at the same level of embedding, it is // excluded. An anonymous field that is not of struct type is treated as having // its type as its name. // // Tags modify these rules as follows: // A field's tag is used as its name. // An anonymous struct field with a name given in its tag is treated as // a field having that name, rather than an embedded struct (the struct's // fields will not be returned). // If more than one field with the same name exists at the same level of embedding, // but exactly one of them is tagged, then the tagged field is reported and the others // are ignored. func (c *Cache) Fields(t reflect.Type) (List, error) { if t.Kind() != reflect.Struct { panic("fields: Fields of non-struct type") } return c.cachedTypeFields(t) } // A List is a list of Fields. type List []Field // MatchExact returns the field in the list with the given name, or nil if there is // none. func (l List) MatchExact(name string) *Field { return l.MatchExactBytes([]byte(name)) } // MatchExactBytes is identical to MatchExact, except that the argument is a byte slice. func (l List) MatchExactBytes(name []byte) *Field { for _, f := range l { if bytes.Equal(f.nameBytes, name) { return &f } } return nil } // MatchFold returns the field in the list whose name best matches the supplied // name, nor nil if no field does. If there is a field with the exact name, it // is returned. Otherwise the first field (sorted by index) whose name matches // case-insensitively is returned. func (l List) MatchFold(name string) *Field { return l.MatchFoldBytes([]byte(name)) } // MatchFoldBytes is identical to MatchFold, except that the argument is a byte slice. func (l List) MatchFoldBytes(name []byte) *Field { var f *Field for i := range l { ff := &l[i] if bytes.Equal(ff.nameBytes, name) { return ff } if f == nil && ff.equalFold(ff.nameBytes, name) { f = ff } } return f } type cacheValue struct { fields List err error } // cachedTypeFields is like typeFields but uses a cache to avoid repeated work. // This code has been copied and modified from // https://go.googlesource.com/go/+/go1.7.3/src/encoding/json/encode.go. func (c *Cache) cachedTypeFields(t reflect.Type) (List, error) { var cv cacheValue x, ok := c.cache.Load(t) if ok { cv = x.(cacheValue) } else { if err := c.validate(t); err != nil { cv = cacheValue{nil, err} } else { f, err := c.typeFields(t) cv = cacheValue{List(f), err} } c.cache.Store(t, cv) } return cv.fields, cv.err } func (c *Cache) typeFields(t reflect.Type) ([]Field, error) { fields, err := c.listFields(t) if err != nil { return nil, err } sort.Sort(byName(fields)) // Delete all fields that are hidden by the Go rules for embedded fields. // The fields are sorted in primary order of name, secondary order of field // index length. So the first field with a given name is the dominant one. var out []Field for advance, i := 0, 0; i < len(fields); i += advance { // One iteration per name. // Find the sequence of fields with the name of this first field. fi := fields[i] name := fi.Name for advance = 1; i+advance < len(fields); advance++ { fj := fields[i+advance] if fj.Name != name { break } } // Find the dominant field, if any, out of all fields that have the same name. dominant, ok := dominantField(fields[i : i+advance]) if ok { out = append(out, dominant) } } sort.Sort(byIndex(out)) return out, nil } func (c *Cache) listFields(t reflect.Type) ([]Field, error) { // This uses the same condition that the Go language does: there must be a unique instance // of the match at a given depth level. If there are multiple instances of a match at the // same depth, they annihilate each other and inhibit any possible match at a lower level. // The algorithm is breadth first search, one depth level at a time. // The current and next slices are work queues: // current lists the fields to visit on this depth level, // and next lists the fields on the next lower level. current := []fieldScan{} next := []fieldScan{{typ: t}} // nextCount records the number of times an embedded type has been // encountered and considered for queueing in the 'next' slice. // We only queue the first one, but we increment the count on each. // If a struct type T can be reached more than once at a given depth level, // then it annihilates itself and need not be considered at all when we // process that next depth level. var nextCount map[reflect.Type]int // visited records the structs that have been considered already. // Embedded pointer fields can create cycles in the graph of // reachable embedded types; visited avoids following those cycles. // It also avoids duplicated effort: if we didn't find the field in an // embedded type T at level 2, we won't find it in one at level 4 either. visited := map[reflect.Type]bool{} var fields []Field // Fields found. for len(next) > 0 { current, next = next, current[:0] count := nextCount nextCount = nil // Process all the fields at this depth, now listed in 'current'. // The loop queues embedded fields found in 'next', for processing during the next // iteration. The multiplicity of the 'current' field counts is recorded // in 'count'; the multiplicity of the 'next' field counts is recorded in 'nextCount'. for _, scan := range current { t := scan.typ if visited[t] { // We've looked through this type before, at a higher level. // That higher level would shadow the lower level we're now at, // so this one can't be useful to us. Ignore it. continue } visited[t] = true for i := 0; i < t.NumField(); i++ { f := t.Field(i) exported := (f.PkgPath == "") // If a named field is unexported, ignore it. An anonymous // unexported field is processed, because it may contain // exported fields, which are visible. if !exported && !f.Anonymous { continue } // Examine the tag. tagName, keep, other, err := c.parseTag(f.Tag) if err != nil { return nil, err } if !keep { continue } if c.leafTypes(f.Type) { fields = append(fields, newField(f, tagName, other, scan.index, i)) continue } var ntyp reflect.Type if f.Anonymous { // Anonymous field of type T or *T. ntyp = f.Type if ntyp.Kind() == reflect.Pointer { ntyp = ntyp.Elem() } } // Record fields with a tag name, non-anonymous fields, or // anonymous non-struct fields. if tagName != "" || ntyp == nil || ntyp.Kind() != reflect.Struct { if !exported { continue } fields = append(fields, newField(f, tagName, other, scan.index, i)) if count[t] > 1 { // If there were multiple instances, add a second, // so that the annihilation code will see a duplicate. fields = append(fields, fields[len(fields)-1]) } continue } // Queue embedded struct fields for processing with next level, // but only if the embedded types haven't already been queued. if nextCount[ntyp] > 0 { nextCount[ntyp] = 2 // exact multiple doesn't matter continue } if nextCount == nil { nextCount = map[reflect.Type]int{} } nextCount[ntyp] = 1 if count[t] > 1 { nextCount[ntyp] = 2 // exact multiple doesn't matter } var index []int index = append(index, scan.index...) index = append(index, i) next = append(next, fieldScan{ntyp, index}) } } } return fields, nil } func newField(f reflect.StructField, tagName string, other any, index []int, i int) Field { name := tagName if name == "" { name = f.Name } sf := Field{ Name: name, NameFromTag: tagName != "", Type: f.Type, ParsedTag: other, nameBytes: []byte(name), } sf.equalFold = foldFunc(sf.nameBytes) sf.Index = append(sf.Index, index...) sf.Index = append(sf.Index, i) return sf } // byName sorts fields using the following criteria, in order: // 1. name // 2. embedding depth // 3. tag presence (preferring a tagged field) // 4. index sequence. type byName []Field func (x byName) Len() int { return len(x) } func (x byName) Swap(i, j int) { x[i], x[j] = x[j], x[i] } func (x byName) Less(i, j int) bool { if x[i].Name != x[j].Name { return x[i].Name < x[j].Name } if len(x[i].Index) != len(x[j].Index) { return len(x[i].Index) < len(x[j].Index) } if x[i].NameFromTag != x[j].NameFromTag { return x[i].NameFromTag } return byIndex(x).Less(i, j) } // byIndex sorts field by index sequence. type byIndex []Field func (x byIndex) Len() int { return len(x) } func (x byIndex) Swap(i, j int) { x[i], x[j] = x[j], x[i] } func (x byIndex) Less(i, j int) bool { xi := x[i].Index xj := x[j].Index ln := len(xi) if l := len(xj); l < ln { ln = l } for k := 0; k < ln; k++ { if xi[k] != xj[k] { return xi[k] < xj[k] } } return len(xi) < len(xj) } // dominantField looks through the fields, all of which are known to have the // same name, to find the single field that dominates the others using Go's // embedding rules, modified by the presence of tags. If there are multiple // top-level fields, the boolean will be false: This condition is an error in // Go and we skip all the fields. func dominantField(fs []Field) (Field, bool) { // The fields are sorted in increasing index-length order, then by presence of tag. // That means that the first field is the dominant one. We need only check // for error cases: two fields at top level, either both tagged or neither tagged. if len(fs) > 1 && len(fs[0].Index) == len(fs[1].Index) && fs[0].NameFromTag == fs[1].NameFromTag { return Field{}, false } return fs[0], true } // ParseStandardTag extracts the sub-tag named by key, then parses it using the // de facto standard format introduced in encoding/json: // // "-" means "ignore this tag", unless it has options (that is, is followed by a comma), // in which case it is treated a name. // "" provides an alternative name for the field // ",opt1,opt2,..." specifies options after the name. // // The options are returned as a []string. func ParseStandardTag(key string, t reflect.StructTag) (name string, keep bool, options []string) { s := t.Get(key) parts := strings.Split(s, ",") if parts[0] == "-" && len(parts) == 1 { return "", false, nil } if len(parts) > 1 { options = parts[1:] } return parts[0], true, options } ================================================ FILE: docstore/internal/fields/fields_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package fields import ( "encoding/json" "errors" "fmt" "reflect" "testing" "time" "github.com/google/go-cmp/cmp" ) type embed1 struct { Em1 int Dup int // annihilates with embed2.Dup Shadow int embed3 } type embed2 struct { Dup int embed3 embed4 } type embed3 struct { Em3 int // annihilated because embed3 is in both embed1 and embed2 embed5 } type embed4 struct { Em4 int Dup int // annihilation of Dup in embed1, embed2 hides this Dup *embed1 // ignored because it occurs at a higher level } type embed5 struct { x int } type Anonymous int type S1 struct { Exported int unexported int Shadow int // shadows S1.Shadow embed1 *embed2 Anonymous } type Time struct { time.Time } var intType = reflect.TypeFor[int]() func field(name string, tval any, index ...int) *Field { return &Field{ Name: name, Type: reflect.TypeOf(tval), Index: index, ParsedTag: []string(nil), } } func tfield(name string, tval any, index ...int) *Field { return &Field{ Name: name, Type: reflect.TypeOf(tval), Index: index, NameFromTag: true, ParsedTag: []string(nil), } } func TestFieldsNoTags(t *testing.T) { c := NewCache(nil, nil, nil) got, err := c.Fields(reflect.TypeFor[S1]()) if err != nil { t.Fatal(err) } want := []*Field{ field("Exported", int(0), 0), field("Shadow", int(0), 2), field("Em1", int(0), 3, 0), field("Em4", int(0), 4, 2, 0), field("Anonymous", Anonymous(0), 5), } for _, f := range want { f.ParsedTag = nil } if msg, ok := compareFields(got, want); !ok { t.Error(msg) } } func TestAgainstJSONEncodingNoTags(t *testing.T) { // Demonstrates that this package produces the same set of fields as encoding/json. s1 := S1{ Exported: 1, unexported: 2, Shadow: 3, embed1: embed1{ Em1: 4, Dup: 5, Shadow: 6, embed3: embed3{ Em3: 7, embed5: embed5{x: 8}, }, }, embed2: &embed2{ Dup: 9, embed3: embed3{ Em3: 10, embed5: embed5{x: 11}, }, embed4: embed4{ Em4: 12, Dup: 13, embed1: &embed1{Em1: 14}, }, }, Anonymous: Anonymous(15), } var want S1 want.embed2 = &embed2{} // need this because reflection won't create it jsonRoundTrip(t, s1, &want) var got S1 got.embed2 = &embed2{} fields, err := NewCache(nil, nil, nil).Fields(reflect.TypeFor[S1]()) if err != nil { t.Fatal(err) } setFields(fields, &got, s1) if !cmp.Equal(got, want, cmp.AllowUnexported(S1{}, embed1{}, embed2{}, embed3{}, embed4{}, embed5{})) { t.Errorf("got\n%+v\nwant\n%+v", got, want) } } // Tests use of LeafTypes parameter to NewCache func TestAgainstJSONEncodingEmbeddedTime(t *testing.T) { timeLeafFn := func(t reflect.Type) bool { return t == reflect.TypeFor[time.Time]() } // Demonstrates that this package can produce the same set of // fields as encoding/json for a struct with an embedded time.Time. now := time.Now().UTC() myt := Time{ now, } var want Time jsonRoundTrip(t, myt, &want) var got Time fields, err := NewCache(nil, nil, timeLeafFn).Fields(reflect.TypeFor[Time]()) if err != nil { t.Fatal(err) } setFields(fields, &got, myt) if !cmp.Equal(got, want) { t.Errorf("got\n%+v\nwant\n%+v", got, want) } } type S2 struct { NoTag int XXX int `json:"tag"` // tag name takes precedence Anonymous `json:"anon"` // anonymous non-structs also get their name from the tag unexported int `json:"tag"` Embed `json:"em"` // embedded structs with tags become fields Tag int YYY int `json:"Tag"` // tag takes precedence over untagged field of the same name Empty int `json:""` // empty tag is noop tEmbed1 tEmbed2 } type Embed struct { Em int } type tEmbed1 struct { Dup int X int `json:"Dup2"` } type tEmbed2 struct { Y int `json:"Dup"` // takes precedence over tEmbed1.Dup because it is tagged Z int `json:"Dup2"` // same name as tEmbed1.X and both tagged, so ignored } func jsonTagParser(t reflect.StructTag) (name string, keep bool, other any, err error) { n, k, o := ParseStandardTag("json", t) return n, k, o, nil } func validateFunc(t reflect.Type) (err error) { if t.Kind() != reflect.Struct { return errors.New("non-struct type used") } for i := 0; i < t.NumField(); i++ { if t.Field(i).Type.Kind() == reflect.Slice { return fmt.Errorf("slice field found at field %s on struct %s", t.Field(i).Name, t.Name()) } } return nil } func TestFieldsWithTags(t *testing.T) { got, err := NewCache(jsonTagParser, nil, nil).Fields(reflect.TypeFor[S2]()) if err != nil { t.Fatal(err) } want := []*Field{ field("NoTag", int(0), 0), tfield("tag", int(0), 1), tfield("anon", Anonymous(0), 2), tfield("em", Embed{}, 4), tfield("Tag", int(0), 6), field("Empty", int(0), 7), tfield("Dup", int(0), 8, 0), } if msg, ok := compareFields(got, want); !ok { t.Error(msg) } } func TestAgainstJSONEncodingWithTags(t *testing.T) { // Demonstrates that this package produces the same set of fields as encoding/json. s2 := S2{ NoTag: 1, XXX: 2, Anonymous: 3, Embed: Embed{ Em: 4, }, tEmbed1: tEmbed1{ Dup: 5, X: 6, }, tEmbed2: tEmbed2{ Y: 7, Z: 8, }, } var want S2 jsonRoundTrip(t, s2, &want) var got S2 fields, err := NewCache(jsonTagParser, nil, nil).Fields(reflect.TypeFor[S2]()) if err != nil { t.Fatal(err) } setFields(fields, &got, s2) if !cmp.Equal(got, want, cmp.AllowUnexported(S2{})) { t.Errorf("got\n%+v\nwant\n%+v", got, want) } } func TestUnexportedAnonymousNonStruct(t *testing.T) { // An unexported anonymous non-struct field should not be recorded. // This is currently a bug in encoding/json. // https://github.com/golang/go/issues/18009 type ( u int v int S struct { u v `json:"x"` int } ) got, err := NewCache(jsonTagParser, nil, nil).Fields(reflect.TypeFor[S]()) if err != nil { t.Fatal(err) } if len(got) != 0 { t.Errorf("got %d fields, want 0", len(got)) } } func TestUnexportedAnonymousStruct(t *testing.T) { // An unexported anonymous struct with a tag is ignored. // This is currently a bug in encoding/json. // https://github.com/golang/go/issues/18009 type ( s1 struct{ X int } S2 struct { s1 `json:"Y"` } ) got, err := NewCache(jsonTagParser, nil, nil).Fields(reflect.TypeFor[S2]()) if err != nil { t.Fatal(err) } if len(got) != 0 { t.Errorf("got %d fields, want 0", len(got)) } } func TestDominantField(t *testing.T) { // With fields sorted by index length and then by tag presence, // the dominant field is always the first. Make sure all error // cases are caught. for _, test := range []struct { fields []Field wantOK bool }{ // A single field is OK. {[]Field{{Index: []int{0}}}, true}, {[]Field{{Index: []int{0}, NameFromTag: true}}, true}, // A single field at top level is OK. {[]Field{{Index: []int{0}}, {Index: []int{1, 0}}}, true}, {[]Field{{Index: []int{0}}, {Index: []int{1, 0}, NameFromTag: true}}, true}, {[]Field{{Index: []int{0}, NameFromTag: true}, {Index: []int{1, 0}, NameFromTag: true}}, true}, // A single tagged field is OK. {[]Field{{Index: []int{0}, NameFromTag: true}, {Index: []int{1}}}, true}, // Two untagged fields at the same level is an error. {[]Field{{Index: []int{0}}, {Index: []int{1}}}, false}, // Two tagged fields at the same level is an error. {[]Field{{Index: []int{0}, NameFromTag: true}, {Index: []int{1}, NameFromTag: true}}, false}, } { _, gotOK := dominantField(test.fields) if gotOK != test.wantOK { t.Errorf("%v: got %t, want %t", test.fields, gotOK, test.wantOK) } } } func TestIgnore(t *testing.T) { type S struct { X int `json:"-"` Y int `json:"-,"` // field with name "-" } got, err := NewCache(jsonTagParser, nil, nil).Fields(reflect.TypeFor[S]()) if err != nil { t.Fatal(err) } if len(got) != 1 { t.Errorf("got %d fields, want 1", len(got)) } } func TestParsedTag(t *testing.T) { type S struct { X int `json:"name,omitempty"` } got, err := NewCache(jsonTagParser, nil, nil).Fields(reflect.TypeFor[S]()) if err != nil { t.Fatal(err) } want := []*Field{ { Name: "name", NameFromTag: true, Type: intType, Index: []int{0}, ParsedTag: []string{"omitempty"}, }, } if msg, ok := compareFields(got, want); !ok { t.Error(msg) } } func TestValidateFunc(t *testing.T) { type MyInvalidStruct struct { A string B []int } _, err := NewCache(nil, validateFunc, nil).Fields(reflect.TypeFor[MyInvalidStruct]()) if err == nil { t.Fatal("expected error, got nil") } type MyValidStruct struct { A string B int } _, err = NewCache(nil, validateFunc, nil).Fields(reflect.TypeFor[MyValidStruct]()) if err != nil { t.Fatalf("expected nil, got error: %s\n", err) } } func compareFields(got []Field, want []*Field) (msg string, ok bool) { if len(got) != len(want) { return fmt.Sprintf("got %d fields, want %d", len(got), len(want)), false } for i, g := range got { w := *want[i] if !fieldsEqual(&g, &w) { return fmt.Sprintf("got\n%+v\nwant\n%+v", g, w), false } } return "", true } // Need this because Field contains a function, which cannot be compared. func fieldsEqual(f1, f2 *Field) bool { if f1 == nil || f2 == nil { return f1 == f2 } return f1.Name == f2.Name && f1.NameFromTag == f2.NameFromTag && f1.Type == f2.Type && cmp.Equal(f1.ParsedTag, f2.ParsedTag) } // Set the fields of dst from those of src. // dst must be a pointer to a struct value. // src must be a struct value. func setFields(fields []Field, dst, src any) { vsrc := reflect.ValueOf(src) vdst := reflect.ValueOf(dst).Elem() for _, f := range fields { fdst := vdst.FieldByIndex(f.Index) fsrc := vsrc.FieldByIndex(f.Index) fdst.Set(fsrc) } } func jsonRoundTrip(t *testing.T, in, out any) { t.Helper() bytes, err := json.Marshal(in) if err != nil { t.Fatal(err) } if err := json.Unmarshal(bytes, out); err != nil { t.Fatal(err) } } type S3 struct { S4 Abc int AbC int Tag int X int `json:"Tag"` unexported int } type S4 struct { ABc int Y int `json:"Abc"` // ignored because of top-level Abc } func TestMatchExact(t *testing.T) { fields, err := NewCache(jsonTagParser, nil, nil).Fields(reflect.TypeFor[S3]()) if err != nil { t.Fatal(err) } for _, test := range []struct { name string want *Field }{ // Exact match wins. {"Abc", field("Abc", int(0), 1)}, {"AbC", field("AbC", int(0), 2)}, {"ABc", field("ABc", int(0), 0, 0)}, // Matches must be exact. {"abc", nil}, // Tag name takes precedence over untagged field of the same name. {"Tag", tfield("Tag", int(0), 4)}, // Unexported fields disappear. {"unexported", nil}, // Untagged embedded structs disappear. {"S4", nil}, } { if got := fields.MatchExact(test.name); !fieldsEqual(got, test.want) { t.Errorf("match %q:\ngot %+v\nwant %+v", test.name, got, test.want) } } } func TestMatchFold(t *testing.T) { fields, err := NewCache(jsonTagParser, nil, nil).Fields(reflect.TypeFor[S3]()) if err != nil { t.Fatal(err) } for _, test := range []struct { name string want *Field }{ // Exact match wins. {"Abc", field("Abc", int(0), 1)}, {"AbC", field("AbC", int(0), 2)}, {"ABc", field("ABc", int(0), 0, 0)}, // If there are multiple matches but no exact match or tag, // the first field wins, lexicographically by index. // Here, "ABc" is at a deeper embedding level, but since S4 appears // first in S3, its index precedes the other fields of S3. {"abc", field("ABc", int(0), 0, 0)}, // Tag name takes precedence over untagged field of the same name. {"Tag", tfield("Tag", int(0), 4)}, // Unexported fields disappear. {"unexported", nil}, // Untagged embedded structs disappear. {"S4", nil}, } { if got := fields.MatchFold(test.name); !fieldsEqual(got, test.want) { t.Errorf("match %q:\ngot %+v\nwant %+v", test.name, got, test.want) } } } func TestAgainstJSONMatchingField(t *testing.T) { s3 := S3{ S4: S4{ABc: 1, Y: 2}, Abc: 3, AbC: 4, Tag: 5, X: 6, unexported: 7, } var want S3 jsonRoundTrip(t, s3, &want) v := reflect.ValueOf(want) fields, err := NewCache(jsonTagParser, nil, nil).Fields(reflect.TypeFor[S3]()) if err != nil { t.Fatal(err) } for _, test := range []struct { name string got int }{ {"Abc", 3}, {"AbC", 4}, {"ABc", 1}, {"abc", 1}, {"Tag", 6}, } { f := fields.MatchFold(test.name) if f == nil { t.Fatalf("%s: no match", test.name) } w := v.FieldByIndex(f.Index).Interface() if test.got != w { t.Errorf("%s: got %d, want %d", test.name, test.got, w) } } } func TestTagErrors(t *testing.T) { called := false c := NewCache(func(t reflect.StructTag) (string, bool, any, error) { called = true s := t.Get("f") if s == "bad" { return "", false, nil, errors.New("error") } return s, true, nil, nil }, nil, nil) type T struct { X int `f:"ok"` Y int `f:"bad"` } _, err := c.Fields(reflect.TypeFor[T]()) if !called { t.Fatal("tag parser not called") } if err == nil { t.Error("want error, got nil") } // Second time, we should cache the error. called = false _, err = c.Fields(reflect.TypeFor[T]()) if called { t.Fatal("tag parser called on second time") } if err == nil { t.Error("want error, got nil") } } ================================================ FILE: docstore/internal/fields/fold.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package fields // This file was copied from https://go.googlesource.com/go/+/go1.7.3/src/encoding/json/fold.go. // Only the license and package were changed. import ( "bytes" "unicode/utf8" ) const ( caseMask = ^byte(0x20) // Mask to ignore case in ASCII. kelvin = '\u212a' smallLongEss = '\u017f' ) // foldFunc returns one of four different case folding equivalence // functions, from most general (and slow) to fastest: // // 1) bytes.EqualFold, if the key s contains any non-ASCII UTF-8 // 2) equalFoldRight, if s contains special folding ASCII ('k', 'K', 's', 'S') // 3) asciiEqualFold, no special, but includes non-letters (including _) // 4) simpleLetterEqualFold, no specials, no non-letters. // // The letters S and K are special because they map to 3 runes, not just 2: // - S maps to s and to U+017F 'ſ' Latin small letter long s // - k maps to K and to U+212A 'K' Kelvin sign // // See https://play.golang.org/p/tTxjOc0OGo // // The returned function is specialized for matching against s and // should only be given s. It's not curried for performance reasons. func foldFunc(s []byte) func(s, t []byte) bool { nonLetter := false special := false // special letter for _, b := range s { if b >= utf8.RuneSelf { return bytes.EqualFold } upper := b & caseMask if upper < 'A' || upper > 'Z' { nonLetter = true } else if upper == 'K' || upper == 'S' { // See above for why these letters are special. special = true } } if special { return equalFoldRight } if nonLetter { return asciiEqualFold } return simpleLetterEqualFold } // equalFoldRight is a specialization of bytes.EqualFold when s is // known to be all ASCII (including punctuation), but contains an 's', // 'S', 'k', or 'K', requiring a Unicode fold on the bytes in t. // See comments on foldFunc. func equalFoldRight(s, t []byte) bool { for _, sb := range s { if len(t) == 0 { return false } tb := t[0] if tb < utf8.RuneSelf { if sb != tb { sbUpper := sb & caseMask if 'A' <= sbUpper && sbUpper <= 'Z' { if sbUpper != tb&caseMask { return false } } else { return false } } t = t[1:] continue } // sb is ASCII and t is not. t must be either kelvin // sign or long s; sb must be s, S, k, or K. tr, size := utf8.DecodeRune(t) switch sb { case 's', 'S': if tr != smallLongEss { return false } case 'k', 'K': if tr != kelvin { return false } default: return false } t = t[size:] } return len(t) <= 0 } // asciiEqualFold is a specialization of bytes.EqualFold for use when // s is all ASCII (but may contain non-letters) and contains no // special-folding letters. // See comments on foldFunc. func asciiEqualFold(s, t []byte) bool { if len(s) != len(t) { return false } for i, sb := range s { tb := t[i] if sb == tb { continue } if ('a' <= sb && sb <= 'z') || ('A' <= sb && sb <= 'Z') { if sb&caseMask != tb&caseMask { return false } } else { return false } } return true } // simpleLetterEqualFold is a specialization of bytes.EqualFold for // use when s is all ASCII letters (no underscores, etc) and also // doesn't contain 'k', 'K', 's', or 'S'. // See comments on foldFunc. func simpleLetterEqualFold(s, t []byte) bool { if len(s) != len(t) { return false } for i, b := range s { if b&caseMask != t[i]&caseMask { return false } } return true } ================================================ FILE: docstore/internal/fields/fold_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package fields // This file was copied from https://go.googlesource.com/go/+/go1.7.3/src/encoding/json/fold_test.go. // Only the license and package were changed. import ( "bytes" "strings" "testing" "unicode/utf8" ) var foldTests = []struct { fn func(s, t []byte) bool s, t string want bool }{ {equalFoldRight, "", "", true}, {equalFoldRight, "a", "a", true}, {equalFoldRight, "", "a", false}, {equalFoldRight, "a", "", false}, {equalFoldRight, "a", "A", true}, {equalFoldRight, "AB", "ab", true}, {equalFoldRight, "AB", "ac", false}, {equalFoldRight, "sbkKc", "ſbKKc", true}, {equalFoldRight, "SbKkc", "ſbKKc", true}, {equalFoldRight, "SbKkc", "ſbKK", false}, {equalFoldRight, "e", "é", false}, {equalFoldRight, "s", "S", true}, {simpleLetterEqualFold, "", "", true}, {simpleLetterEqualFold, "abc", "abc", true}, {simpleLetterEqualFold, "abc", "ABC", true}, {simpleLetterEqualFold, "abc", "ABCD", false}, {simpleLetterEqualFold, "abc", "xxx", false}, {asciiEqualFold, "a_B", "A_b", true}, {asciiEqualFold, "aa@", "aa`", false}, // verify 0x40 and 0x60 aren't case-equivalent } func TestFold(t *testing.T) { for i, tt := range foldTests { if got := tt.fn([]byte(tt.s), []byte(tt.t)); got != tt.want { t.Errorf("%d. %q, %q = %v; want %v", i, tt.s, tt.t, got, tt.want) } truth := strings.EqualFold(tt.s, tt.t) if truth != tt.want { t.Errorf("strings.EqualFold doesn't agree with case %d", i) } } } func TestFoldAgainstUnicode(t *testing.T) { const bufSize = 5 buf1 := make([]byte, 0, bufSize) buf2 := make([]byte, 0, bufSize) var runes []rune for i := 0x20; i <= 0x7f; i++ { runes = append(runes, rune(i)) } runes = append(runes, kelvin, smallLongEss) funcs := []struct { name string fold func(s, t []byte) bool letter bool // must be ASCII letter simple bool // must be simple ASCII letter (not 'S' or 'K') }{ { name: "equalFoldRight", fold: equalFoldRight, }, { name: "asciiEqualFold", fold: asciiEqualFold, simple: true, }, { name: "simpleLetterEqualFold", fold: simpleLetterEqualFold, simple: true, letter: true, }, } for _, ff := range funcs { for _, r := range runes { if r >= utf8.RuneSelf { continue } if ff.letter && !isASCIILetter(byte(r)) { continue } if ff.simple && (r == 's' || r == 'S' || r == 'k' || r == 'K') { continue } for _, r2 := range runes { buf1 := append(buf1[:0], 'x') buf2 := append(buf2[:0], 'x') buf1 = buf1[:1+utf8.EncodeRune(buf1[1:bufSize], r)] buf2 = buf2[:1+utf8.EncodeRune(buf2[1:bufSize], r2)] buf1 = append(buf1, 'x') buf2 = append(buf2, 'x') want := bytes.EqualFold(buf1, buf2) if got := ff.fold(buf1, buf2); got != want { t.Errorf("%s(%q, %q) = %v; want %v", ff.name, buf1, buf2, got, want) } } } } } func isASCIILetter(b byte) bool { return ('A' <= b && b <= 'Z') || ('a' <= b && b <= 'z') } ================================================ FILE: docstore/memdocstore/codec.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package memdocstore import ( "fmt" "reflect" "time" "gocloud.dev/gcerrors" "gocloud.dev/docstore/driver" ) // encodeDoc encodes a driver.Document as a storedDoc. func encodeDoc(doc driver.Document) (storedDoc, error) { var e encoder if err := doc.Encode(&e); err != nil { return nil, err } return storedDoc(e.val.(map[string]any)), nil } func encodeValue(v any) (any, error) { var e encoder if err := driver.Encode(reflect.ValueOf(v), &e); err != nil { return nil, err } return e.val, nil } type encoder struct { val any } func (e *encoder) EncodeNil() { e.val = nil } func (e *encoder) EncodeBool(x bool) { e.val = x } func (e *encoder) EncodeInt(x int64) { e.val = x } func (e *encoder) EncodeUint(x uint64) { e.val = int64(x) } func (e *encoder) EncodeBytes(x []byte) { e.val = x } func (e *encoder) EncodeFloat(x float64) { e.val = x } func (e *encoder) EncodeString(x string) { e.val = x } func (e *encoder) ListIndex(int) { panic("impossible") } func (e *encoder) MapKey(string) { panic("impossible") } var typeOfGoTime = reflect.TypeFor[time.Time]() func (e *encoder) EncodeSpecial(v reflect.Value) (bool, error) { if v.Type() == typeOfGoTime { e.val = v.Interface() return true, nil } return false, nil } func (e *encoder) EncodeList(n int) driver.Encoder { // All slices and arrays are encoded as []interface{} s := make([]any, n) e.val = s return &listEncoder{s: s} } type listEncoder struct { s []any encoder } func (e *listEncoder) ListIndex(i int) { e.s[i] = e.val } type mapEncoder struct { m map[string]any encoder } func (e *encoder) EncodeMap(n int) driver.Encoder { m := make(map[string]any, n) e.val = m return &mapEncoder{m: m} } func (e *mapEncoder) MapKey(k string) { e.m[k] = e.val } //////////////////////////////////////////////////////////////// // decodeDoc decodes m into ddoc. func decodeDoc(m storedDoc, ddoc driver.Document, fps [][]string) error { var m2 map[string]any if len(fps) == 0 { m2 = m } else { // Make a document to decode from that has only the field paths. // (We don't need the key field because ddoc must already have it.) m2 = map[string]any{} for _, fp := range fps { val, err := getAtFieldPath(m, fp, false) if err != nil { if gcerrors.Code(err) == gcerrors.NotFound { continue } return err } if err := setAtFieldPath(m2, fp, val); err != nil { return err } } } return ddoc.Decode(decoder{m2}) } type decoder struct { val any } func (d decoder) String() string { return fmt.Sprint(d.val) } func (d decoder) AsNull() bool { return d.val == nil } func (d decoder) AsBool() (bool, bool) { b, ok := d.val.(bool) return b, ok } func (d decoder) AsString() (string, bool) { s, ok := d.val.(string) return s, ok } func (d decoder) AsInt() (int64, bool) { i, ok := d.val.(int64) return i, ok } func (d decoder) AsUint() (uint64, bool) { i, ok := d.val.(int64) return uint64(i), ok } func (d decoder) AsFloat() (float64, bool) { f, ok := d.val.(float64) return f, ok } func (d decoder) AsBytes() ([]byte, bool) { bs, ok := d.val.([]byte) return bs, ok } func (d decoder) AsInterface() (any, error) { return d.val, nil } func (d decoder) ListLen() (int, bool) { if s, ok := d.val.([]any); ok { return len(s), true } return 0, false } func (d decoder) DecodeList(f func(i int, d2 driver.Decoder) bool) { for i, e := range d.val.([]any) { if !f(i, decoder{e}) { return } } } func (d decoder) MapLen() (int, bool) { if m, ok := d.val.(map[string]any); ok { return len(m), true } return 0, false } func (d decoder) DecodeMap(f func(key string, d2 driver.Decoder, _ bool) bool) { for k, v := range d.val.(map[string]any) { if !f(k, decoder{v}, true) { return } } } func (d decoder) AsSpecial(v reflect.Value) (bool, any, error) { if v.Type() == typeOfGoTime { return true, d.val, nil } return false, nil, nil } ================================================ FILE: docstore/memdocstore/codec_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package memdocstore import ( "testing" "time" "github.com/google/go-cmp/cmp" "gocloud.dev/docstore/drivertest" ) type aStruct struct { X int embed Z *bool W uint T time.Time L []int F float32 B []byte } type embed struct { Y string } func TestEncodeDoc(t *testing.T) { var b bool = true tm := time.Now() for _, test := range []struct { in any want storedDoc }{ { in: map[string]any{ "x": map[int]any{ 1: "a", 2: 17, 3: []float32{1.0, 2.5}, 4: map[string]bool{"false": false, "true": true}, }, }, want: storedDoc{ "x": map[string]any{ "1": "a", "2": int64(17), "3": []any{float64(1.0), float64(2.5)}, "4": map[string]any{"false": false, "true": true}, }, }, }, { in: &aStruct{ X: 3, embed: embed{Y: "y"}, Z: &b, W: 33, T: tm, L: []int{4, 5}, F: 2.5, B: []byte("abc"), }, want: storedDoc{ "X": int64(3), "Y": "y", "Z": true, "W": int64(33), "T": tm, "L": []any{int64(4), int64(5)}, "F": 2.5, "B": []byte("abc"), }, }, } { doc := drivertest.MustDocument(test.in) got, err := encodeDoc(doc) if err != nil { t.Fatal(err) } if diff := cmp.Diff(got, test.want); diff != "" { t.Errorf("%+v: %s", test.in, diff) } } } func TestDecodeDoc(t *testing.T) { var b bool = true tm := time.Now() for _, test := range []struct { in storedDoc val any want any }{ { storedDoc{ "x": map[string]any{ "1": "a", "2": int64(17), "3": []any{float64(1.0), float64(2.5)}, "4": map[string]any{"false": false, "true": true}, }, }, map[string]any{}, map[string]any{ "x": map[string]any{ "1": "a", "2": int64(17), "3": []any{1.0, 2.5}, "4": map[string]any{"false": false, "true": true}, }, }, }, { storedDoc{ "X": int64(3), "Y": "y", "Z": true, "W": int64(33), "T": tm, "L": []any{int64(4), int64(5)}, "F": 2.5, "B": []byte("abc"), }, &aStruct{}, &aStruct{ X: 3, embed: embed{Y: "y"}, Z: &b, W: 33, T: tm, L: []int{4, 5}, F: 2.5, B: []byte("abc"), }, }, } { got := test.val doc := drivertest.MustDocument(test.val) if err := decodeDoc(test.in, doc, nil); err != nil { t.Fatal(err) } if diff := cmp.Diff(got, test.want, cmp.AllowUnexported(aStruct{})); diff != "" { t.Errorf("%+v: %s", test.in, diff) } } } ================================================ FILE: docstore/memdocstore/example_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package memdocstore_test import ( "context" "log" "gocloud.dev/docstore" "gocloud.dev/docstore/memdocstore" ) func ExampleOpenCollection() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. coll, err := memdocstore.OpenCollection("keyField", nil) if err != nil { log.Fatal(err) } defer coll.Close() // PRAGMA: On gocloud.dev, hide lines until the next blank line. // Output: } func ExampleOpenCollectionWithKeyFunc() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. type HighScore struct { Game string Player string } // The name of a document is constructed from the Game and Player fields. nameFromDocument := func(doc docstore.Document) any { hs := doc.(*HighScore) return hs.Game + "|" + hs.Player } coll, err := memdocstore.OpenCollectionWithKeyFunc(nameFromDocument, nil) if err != nil { log.Fatal(err) } defer coll.Close() // PRAGMA: On gocloud.dev, hide lines until the next blank line. // Output: } func Example_openCollectionFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/docstore/memdocstore" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // docstore.OpenCollection creates a *docstore.Collection from a URL. coll, err := docstore.OpenCollection(ctx, "mem://collection/keyField") if err != nil { log.Fatal(err) } defer coll.Close() // PRAGMA: On gocloud.dev, hide lines until the next blank line. // Output: } ================================================ FILE: docstore/memdocstore/mem.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package memdocstore provides an in-process in-memory implementation of the docstore // API. It is suitable for local development and testing. // // Every document in a memdocstore collection has a unique primary key. The primary // key values need not be strings; they may be any comparable Go value. // // # Action Lists // // Action lists are executed concurrently. Each action in an action list is executed // in a separate goroutine. // // memdocstore supports atomic writes. When using AtomicWrites(), all write actions // in the action list are executed atomically - either all succeed or all fail together. // // memdocstore calls the BeforeDo function of an ActionList once before executing the // actions. Its As function never returns true. // // # URLs // // For docstore.OpenCollection, memdocstore registers for the scheme // "mem". // To customize the URL opener, or for more details on the URL format, // see URLOpener. // See https://gocloud.dev/concepts/urls/ for background information. package memdocstore // import "gocloud.dev/docstore/memdocstore" import ( "context" "encoding/gob" "fmt" "os" "reflect" "sort" "strconv" "strings" "sync" "gocloud.dev/docstore" "gocloud.dev/docstore/driver" "gocloud.dev/gcerrors" "gocloud.dev/internal/gcerr" ) // Options are optional arguments to the OpenCollection functions. type Options struct { // The name of the field holding the document revision. // Defaults to docstore.DefaultRevisionField. RevisionField string // The maximum number of concurrent goroutines started for a single call to // ActionList.Do. If less than 1, there is no limit. MaxOutstandingActions int // The filename associated with this collection. // When a collection is opened with a non-nil filename, the collection // is loaded from the file if it exists. Otherwise, an empty collection is created. // When the collection is closed, its contents are saved to the file. Filename string // AllowNestedSliceQueries allows querying into nested slices. // If true queries for a field path which points to a slice will return // true if any element of the slice has a value that validates with the operator. // This makes the memdocstore more compatible with MongoDB, // but other providers may not support this feature. AllowNestedSliceQueries bool // Call this function when the collection is closed. // For internal use only. onClose func() } // TODO(jba): make this package thread-safe. // OpenCollection creates a *docstore.Collection backed by memory. keyField is the // document field holding the primary key of the collection. func OpenCollection(keyField string, opts *Options) (*docstore.Collection, error) { c, err := newCollection(keyField, nil, opts) if err != nil { return nil, err } return docstore.NewCollection(c), nil } // OpenCollectionWithKeyFunc creates a *docstore.Collection backed by memory. keyFunc takes // a document and returns the document's primary key. It should return nil if the // document is missing the information to construct a key. This will cause all // actions, even Create, to fail. // // For the collection to be usable with Query.Delete and Query.Update, // keyFunc must work with map[string]interface{} as well as whatever // struct type the collection normally uses (if any). func OpenCollectionWithKeyFunc(keyFunc func(docstore.Document) any, opts *Options) (*docstore.Collection, error) { c, err := newCollection("", keyFunc, opts) if err != nil { return nil, err } return docstore.NewCollection(c), nil } func newCollection(keyField string, keyFunc func(docstore.Document) any, opts *Options) (driver.Collection, error) { if keyField == "" && keyFunc == nil { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "must provide either keyField or keyFunc") } if opts == nil { opts = &Options{} } if opts.RevisionField == "" { opts.RevisionField = docstore.DefaultRevisionField } docs, err := loadDocs(opts.Filename) if err != nil { return nil, err } return &collection{ keyField: keyField, keyFunc: keyFunc, docs: docs, opts: opts, curRevision: 0, }, nil } // A storedDoc is a document that is stored in a collection. // // We store documents as maps from keys to values. Even if the user is using // map[string]interface{}, we make our own copy. // // Using a separate helps distinguish documents coming from a user (those "on // the client," in a more typical driver that acts as a network client) from // those stored in a collection (those "on the server"). type storedDoc map[string]any type collection struct { keyField string keyFunc func(docstore.Document) any opts *Options mu sync.Mutex docs map[any]storedDoc curRevision int64 // incremented on each write } func (c *collection) Key(doc driver.Document) (any, error) { if c.keyField != "" { key, _ := doc.GetField(c.keyField) // no error on missing key, and it will be nil return key, nil } key := c.keyFunc(doc.Origin) if key == nil || driver.IsEmptyValue(reflect.ValueOf(key)) { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "missing document key") } return key, nil } func (c *collection) RevisionField() string { return c.opts.RevisionField } // ErrorCode implements driver.ErrorCode. func (c *collection) ErrorCode(err error) gcerrors.ErrorCode { return gcerrors.Code(err) } // RunActions implements driver.RunActions. func (c *collection) RunActions(ctx context.Context, actions []*driver.Action, opts *driver.RunActionsOptions) driver.ActionListError { errs := make([]error, len(actions)) // Run the actions concurrently with each other. run := func(as []*driver.Action) { t := driver.NewThrottle(c.opts.MaxOutstandingActions) for _, a := range as { t.Acquire() go func() { defer t.Release() errs[a.Index] = c.runAction(ctx, a) }() } t.Wait() } if opts.BeforeDo != nil { if err := opts.BeforeDo(func(any) bool { return false }); err != nil { for i := range errs { errs[i] = err } return driver.NewActionListError(errs) } } beforeGets, gets, writes, writesTx, afterGets := driver.GroupActions(actions) run(beforeGets) run(gets) run(writes) // Handle atomic writes separately to ensure they are truly atomic if len(writesTx) > 0 { c.runAtomicWrites(ctx, writesTx, errs) } run(afterGets) return driver.NewActionListError(errs) } // runAtomicWrites executes multiple write actions atomically. // All writes either succeed or all fail together. func (c *collection) runAtomicWrites(ctx context.Context, actions []*driver.Action, errs []error) { // Stop if the context is done. if ctx.Err() != nil { for _, a := range actions { errs[a.Index] = ctx.Err() } return } c.mu.Lock() defer c.mu.Unlock() // First, validate all actions and collect current documents type actionInfo struct { action *driver.Action current storedDoc exists bool } actionInfos := make([]actionInfo, len(actions)) for i, a := range actions { info := &actionInfos[i] info.action = a if a.Key != nil { info.current, info.exists = c.docs[a.Key] } // Check for NotFound errors if !info.exists && (a.Kind == driver.Replace || a.Kind == driver.Update || a.Kind == driver.Get) { for _, a2 := range actions { errs[a2.Index] = gcerr.Newf(gcerr.NotFound, nil, "document with key %v does not exist", a.Key) } return } // Check revision conflicts if err := c.checkRevision(a.Doc, info.current); err != nil { for _, a2 := range actions { errs[a2.Index] = err } return } } // Now execute all actions atomically for _, info := range actionInfos { if err := c.executeAction(info.action, info.current, info.exists); err != nil { // If any action fails, mark all actions as failed for _, a2 := range actions { errs[a2.Index] = err } return } } } // runAction executes a single action. func (c *collection) runAction(ctx context.Context, a *driver.Action) error { // Stop if the context is done. if ctx.Err() != nil { return ctx.Err() } // Get the key from the doc so we can look it up in the map. c.mu.Lock() defer c.mu.Unlock() // If there is a key, get the current document with that key. var ( current storedDoc exists bool ) if a.Key != nil { current, exists = c.docs[a.Key] } // Check for a NotFound error. if !exists && (a.Kind == driver.Replace || a.Kind == driver.Update || a.Kind == driver.Get) { return gcerr.Newf(gcerr.NotFound, nil, "document with key %v does not exist", a.Key) } // Check revision conflicts if a.Kind != driver.Get && a.Kind != driver.Create { if err := c.checkRevision(a.Doc, current); err != nil { return err } } // Execute the action for Get if a.Kind == driver.Get { // Handle Get separately since it doesn't modify the document. // We've already retrieved the document into current, above. // Now we copy its fields into the user-provided document. return decodeDoc(current, a.Doc, a.FieldPaths) } return c.executeAction(a, current, exists) } // executeAction executes a single action. Must be called with the lock held. // This method is shared between runAction and runAtomicWrites to eliminate code duplication. func (c *collection) executeAction(a *driver.Action, current storedDoc, exists bool) error { switch a.Kind { case driver.Create: // It is an error to attempt to create an existing document. if exists { return gcerr.Newf(gcerr.AlreadyExists, nil, "Create: document with key %v exists", a.Key) } // If the user didn't supply a value for the key field, create a new one. if a.Key == nil { a.Key = driver.UniqueString() // Set the new key in the document. if err := a.Doc.SetField(c.keyField, a.Key); err != nil { return gcerr.Newf(gcerr.InvalidArgument, nil, "cannot set key field %q", c.keyField) } } fallthrough case driver.Replace, driver.Put: doc, err := encodeDoc(a.Doc) if err != nil { return err } if a.Doc.HasField(c.opts.RevisionField) { c.changeRevision(doc) if err := a.Doc.SetField(c.opts.RevisionField, doc[c.opts.RevisionField]); err != nil { return err } } c.docs[a.Key] = doc case driver.Delete: delete(c.docs, a.Key) case driver.Update: if err := c.update(current, a.Mods); err != nil { return err } if a.Doc.HasField(c.opts.RevisionField) { c.changeRevision(current) if err := a.Doc.SetField(c.opts.RevisionField, current[c.opts.RevisionField]); err != nil { return err } } default: return gcerr.Newf(gcerr.Internal, nil, "unknown kind %v", a.Kind) } return nil } // Must be called with the lock held. // Does not change the stored doc's revision field; that is up to the caller. func (c *collection) update(doc storedDoc, mods []driver.Mod) error { // Sort mods by first field path element so tests are deterministic. sort.Slice(mods, func(i, j int) bool { return mods[i].FieldPath[0] < mods[j].FieldPath[0] }) // To make update atomic, we first convert the actions into a form that can't // fail. type guaranteedMod struct { parentMap map[string]any // the map holding the key to be modified key string encodedValue any // the value after encoding } gmods := make([]guaranteedMod, len(mods)) var err error for i, mod := range mods { gmod := &gmods[i] // Check that the field path is valid. That is, every component of the path // but the last refers to a map, and no component along the way is nil. if gmod.parentMap, err = getParentMap(doc, mod.FieldPath, false); err != nil { return err } gmod.key = mod.FieldPath[len(mod.FieldPath)-1] if inc, ok := mod.Value.(driver.IncOp); ok { amt, err := encodeValue(inc.Amount) if err != nil { return err } if gmod.encodedValue, err = add(gmod.parentMap[gmod.key], amt); err != nil { return err } } else if mod.Value != nil { // Make sure the value encodes successfully. if gmod.encodedValue, err = encodeValue(mod.Value); err != nil { return err } } } // Now execute the guaranteed mods. for _, m := range gmods { if m.encodedValue == nil { delete(m.parentMap, m.key) } else { m.parentMap[m.key] = m.encodedValue } } return nil } // Add two encoded numbers. // Since they're encoded, they are either int64 or float64. // Allow adding a float to an int, producing a float. // TODO(jba): see how other drivers handle that. func add(x, y any) (any, error) { if x == nil { return y, nil } switch x := x.(type) { case int64: switch y := y.(type) { case int64: return x + y, nil case float64: return float64(x) + y, nil default: // This shouldn't happen because it should be checked by docstore. return nil, gcerr.Newf(gcerr.Internal, nil, "bad increment aount type %T", y) } case float64: switch y := y.(type) { case int64: return x + float64(y), nil case float64: return x + y, nil default: // This shouldn't happen because it should be checked by docstore. return nil, gcerr.Newf(gcerr.Internal, nil, "bad increment aount type %T", y) } default: return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "value %v being incremented not int64 or float64", x) } } // Must be called with the lock held. func (c *collection) changeRevision(doc storedDoc) { c.curRevision++ doc[c.opts.RevisionField] = c.curRevision } func (c *collection) checkRevision(arg driver.Document, current storedDoc) error { if current == nil { return nil // no existing document or the incoming doc has no revision } curRev, ok := current[c.opts.RevisionField] if !ok { return nil // there is no revision to check } curRev = curRev.(int64) r, err := arg.GetField(c.opts.RevisionField) if err != nil || r == nil { return nil // no incoming revision information: nothing to check } wantRev, ok := r.(int64) if !ok { return gcerr.Newf(gcerr.InvalidArgument, nil, "revision field %s is not an int64", c.opts.RevisionField) } if wantRev != curRev { return gcerr.Newf(gcerr.FailedPrecondition, nil, "mismatched revisions: want %d, current %d", wantRev, curRev) } return nil } // getAtFieldPath gets the value of m at fp. It returns an error if fp is invalid. // If nested is true compare against all elements of a slice, see AllowNestedSliceQueries // (see getParentMap). func getAtFieldPath(m map[string]any, fp []string, nested bool) (result any, err error) { var get func(m any, name string) any get = func(m any, name string) any { switch m := m.(type) { case map[string]any: return m[name] case []any: if !nested { return nil } var result []any for _, e := range m { next := get(e, name) // If we have slices within slices the compare function does not see the nested slices. // Changing the compare function to be recursive would be more effort than flattening the slices here. sliced, ok := next.([]any) if ok { result = append(result, sliced...) } else { result = append(result, next) } } return result } return nil } result = m for _, k := range fp { next := get(result, k) if next == nil { return nil, gcerr.Newf(gcerr.NotFound, nil, "field %s not found", strings.Join(fp, ".")) } result = next } return result, nil } // setAtFieldPath sets m's value at fp to val. It creates intermediate maps as // needed. It returns an error if a non-final component of fp does not denote a map. func setAtFieldPath(m map[string]any, fp []string, val any) error { m2, err := getParentMap(m, fp, true) if err != nil { return err } m2[fp[len(fp)-1]] = val return nil } // getParentMap returns the map that directly contains the given field path; // that is, the value of m at the field path that excludes the last component // of fp. If a non-map is encountered along the way, an InvalidArgument error is // returned. If nil is encountered, nil is returned unless create is true, in // which case a map is added at that point. func getParentMap(m map[string]any, fp []string, create bool) (map[string]any, error) { var ok bool for _, k := range fp[:len(fp)-1] { if m[k] == nil { if !create { return nil, nil } m[k] = map[string]any{} } m, ok = m[k].(map[string]any) if !ok { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "invalid field path %q at %q", strings.Join(fp, "."), k) } } return m, nil } // RevisionToBytes implements driver.RevisionToBytes. func (c *collection) RevisionToBytes(rev any) ([]byte, error) { r, ok := rev.(int64) if !ok { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "revision %v of type %[1]T is not an int64", rev) } return strconv.AppendInt(nil, r, 10), nil } // BytesToRevision implements driver.BytesToRevision. func (c *collection) BytesToRevision(b []byte) (any, error) { return strconv.ParseInt(string(b), 10, 64) } // As implements driver.As. func (c *collection) As(i any) bool { return false } // As implements driver.Collection.ErrorAs. func (c *collection) ErrorAs(err error, i any) bool { return false } // Close implements driver.Collection.Close. // If the collection was created with a Filename option, Close writes the // collection's documents to the file. func (c *collection) Close() error { if c.opts.onClose != nil { c.opts.onClose() } return saveDocs(c.opts.Filename, c.docs) } type mapOfDocs = map[any]storedDoc // Read a map from the filename if is is not empty and the file exists. // Otherwise return an empty (not nil) map. func loadDocs(filename string) (mapOfDocs, error) { if filename == "" { return mapOfDocs{}, nil } f, err := os.Open(filename) if err != nil { if !os.IsNotExist(err) { return nil, err } // If the file doesn't exist, return an empty map without error. return mapOfDocs{}, nil } defer f.Close() var m mapOfDocs if err := gob.NewDecoder(f).Decode(&m); err != nil { return nil, fmt.Errorf("failed to decode from %q: %v", filename, err) } return m, nil } // saveDocs saves m to filename if filename is not empty. func saveDocs(filename string, m mapOfDocs) error { if filename == "" { return nil } f, err := os.Create(filename) if err != nil { return err } if err := gob.NewEncoder(f).Encode(m); err != nil { _ = f.Close() return fmt.Errorf("failed to encode to %q: %v", filename, err) } return f.Close() } ================================================ FILE: docstore/memdocstore/mem_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package memdocstore import ( "context" "io" "os" "path/filepath" "slices" "testing" "github.com/google/go-cmp/cmp" "gocloud.dev/docstore" "gocloud.dev/docstore/driver" "gocloud.dev/docstore/drivertest" ) type harness struct{} func newHarness(ctx context.Context, t *testing.T) (drivertest.Harness, error) { t.Helper() return &harness{}, nil } func (h *harness) MakeCollection(_ context.Context, kind drivertest.CollectionKind) (driver.Collection, error) { switch kind { case drivertest.SingleKey, drivertest.NoRev: return newCollection(drivertest.KeyField, nil, nil) case drivertest.TwoKey: return newCollection("", drivertest.HighScoreKey, nil) case drivertest.AltRev: return newCollection(drivertest.KeyField, nil, &Options{RevisionField: drivertest.AlternateRevisionField}) default: panic("bad kind") } } func (*harness) BeforeDoTypes() []any { return nil } func (*harness) BeforeQueryTypes() []any { return nil } func (*harness) RevisionsEqual(rev1, rev2 any) bool { return rev1 == rev2 } func (*harness) SupportsAtomicWrites() bool { return true } func (*harness) Close() {} func TestConformance(t *testing.T) { // CodecTester is nil because memdocstore has no native representation. drivertest.RunConformanceTests(t, newHarness, nil, nil) } type docmap = map[string]any // memdocstore-specific tests. // The following tests test memdocstore's backend implementation. func TestUpdateEncodesValues(t *testing.T) { // Check that update encodes the values in mods. ctx := context.Background() dc, err := newCollection(drivertest.KeyField, nil, nil) if err != nil { t.Fatal(err) } coll := docstore.NewCollection(dc) defer coll.Close() doc := docmap{drivertest.KeyField: "testUpdateEncodes", "a": 1, dc.RevisionField(): nil} if err := coll.Put(ctx, doc); err != nil { t.Fatal(err) } if err := coll.Update(ctx, doc, docstore.Mods{"a": 2}); err != nil { t.Fatal(err) } got := docmap{drivertest.KeyField: doc[drivertest.KeyField]} // This Get will fail if the int value 2 in the above mod was not encoded to an int64. if err := coll.Get(ctx, got); err != nil { t.Fatal(err) } want := docmap{ drivertest.KeyField: doc[drivertest.KeyField], "a": int64(2), dc.RevisionField(): got[dc.RevisionField()], } if !cmp.Equal(got, want) { t.Errorf("got %v, want %v", got, want) } } func TestUpdateAtomic(t *testing.T) { // Check that update is atomic. ctx := context.Background() dc, err := newCollection(drivertest.KeyField, nil, nil) if err != nil { t.Fatal(err) } coll := docstore.NewCollection(dc) defer coll.Close() doc := docmap{drivertest.KeyField: "testUpdateAtomic", "a": "A", "b": "B", dc.RevisionField(): nil} mods := docstore.Mods{"a": "Y", "b.c": "Z"} // "b" is not a map, so "b.c" is an error if err := coll.Put(ctx, doc); err != nil { t.Fatal(err) } if errs := coll.Actions().Update(doc, mods).Do(ctx); errs == nil { t.Fatal("got nil, want errors") } got := docmap{drivertest.KeyField: doc[drivertest.KeyField]} if err := coll.Get(ctx, got); err != nil { t.Fatal(err) } want := docmap{ drivertest.KeyField: doc[drivertest.KeyField], dc.RevisionField(): got[dc.RevisionField()], "a": "A", "b": "B", } if !cmp.Equal(got, want) { t.Errorf("got %v, want %v", got, want) } } func TestQueryNested(t *testing.T) { ctx := context.Background() dc, err := newCollection(drivertest.KeyField, nil, &Options{AllowNestedSliceQueries: true}) if err != nil { t.Fatal(err) } coll := docstore.NewCollection(dc) defer coll.Close() // Set up test documents testDocs := []docmap{{ drivertest.KeyField: "TestQueryNested", "list": []any{docmap{"a": "A"}}, "map": docmap{"b": "B"}, "listOfMaps": []any{docmap{"id": "1"}, docmap{"id": "2"}, docmap{"id": "3"}}, "mapOfLists": docmap{"ids": []any{"1", "2", "3"}}, "deep": []any{docmap{"nesting": []any{docmap{"of": docmap{"elements": "yes"}}}}}, "listOfLists": []any{docmap{"items": []any{docmap{"price": 10}, docmap{"price": 20}}}}, dc.RevisionField(): nil, }, { drivertest.KeyField: "CheapItems", "items": []any{docmap{"price": 10}, docmap{"price": 1}}, dc.RevisionField(): nil, }, { drivertest.KeyField: "ExpensiveItems", "items": []any{docmap{"price": 50}, docmap{"price": 100}}, dc.RevisionField(): nil, }} for _, testDoc := range testDocs { err = coll.Put(ctx, testDoc) if err != nil { t.Fatal(err) } } tests := []struct { name string where []any wantKeys []string }{ { name: "list field match", where: []any{"list.a", "=", "A"}, wantKeys: []string{"TestQueryNested"}, }, { name: "list field no match", where: []any{"list.a", "=", "missing"}, }, { name: "map field match", where: []any{"map.b", "=", "B"}, wantKeys: []string{"TestQueryNested"}, }, { name: "list of maps field match", where: []any{"listOfMaps.id", "=", "2"}, wantKeys: []string{"TestQueryNested"}, }, { name: "map of lists field match", where: []any{"mapOfLists.ids", "=", "1"}, wantKeys: []string{"TestQueryNested"}, }, { name: "deep nested field match", where: []any{"deep.nesting.of.elements", "=", "yes"}, wantKeys: []string{"TestQueryNested"}, }, { name: "list of lists exact price 10", where: []any{"listOfLists.items.price", "=", 10}, wantKeys: []string{"TestQueryNested"}, }, { name: "list of lists exact price 20", where: []any{"listOfLists.items.price", "=", 20}, wantKeys: []string{"TestQueryNested"}, }, { name: "list of lists price less than or equal to 20", where: []any{"listOfLists.items.price", "<=", 20}, wantKeys: []string{"TestQueryNested"}, }, { name: "items price equals 1", where: []any{"items.price", "=", 1}, wantKeys: []string{"CheapItems"}, }, { name: "items price equals 5 (no match)", where: []any{"items.price", "=", 5}, }, { name: "items price greater than or equal to 1", where: []any{"items.price", ">=", 1}, wantKeys: []string{"CheapItems", "ExpensiveItems"}, }, { name: "items price greater than or equal to 5", where: []any{"items.price", ">=", 5}, wantKeys: []string{"CheapItems", "ExpensiveItems"}, }, { name: "items price greater than or equal to 10", where: []any{"items.price", ">=", 10}, wantKeys: []string{"CheapItems", "ExpensiveItems"}, }, { name: "items price less than or equal to 50", where: []any{"items.price", "<=", 50}, wantKeys: []string{"CheapItems", "ExpensiveItems"}, }, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { iter := coll.Query().Where(docstore.FieldPath(tc.where[0].(string)), tc.where[1].(string), tc.where[2]).Get(ctx) var got []docmap for { doc := docmap{} err := iter.Next(ctx, doc) if err != nil { if err == io.EOF { break } t.Fatal(err) } got = append(got, doc) } // Extract keys from results var gotKeys []string for _, d := range got { if key, ok := d[drivertest.KeyField].(string); ok { gotKeys = append(gotKeys, key) } } slices.Sort(gotKeys) diff := cmp.Diff(gotKeys, tc.wantKeys) if diff != "" { t.Errorf("query results mismatch (-got +want):\n%s", diff) } }) } } func TestSortDocs(t *testing.T) { newDocs := func() []storedDoc { return []storedDoc{ {"a": int64(1), "b": "1", "c": 3.0}, {"a": int64(2), "b": "2", "c": 4.0}, {"a": int64(3), "b": "3"}, // missing "c" } } inorder := newDocs() reversed := newDocs() for i := 0; i < len(reversed)/2; i++ { j := len(reversed) - i - 1 reversed[i], reversed[j] = reversed[j], reversed[i] } for _, test := range []struct { field string ascending bool want []storedDoc }{ {"a", true, inorder}, {"a", false, reversed}, {"b", true, inorder}, {"b", false, reversed}, {"c", true, inorder}, {"c", false, []storedDoc{inorder[1], inorder[0], inorder[2]}}, } { got := newDocs() sortDocs(got, test.field, test.ascending) if diff := cmp.Diff(got, test.want); diff != "" { t.Errorf("%q, asc=%t:\n%s", test.field, test.ascending, diff) } } } func TestSaveAndLoad(t *testing.T) { dir := t.TempDir() // Load from nonexistent file should return empty data. f := filepath.Join(dir, "saveAndLoad") got, err := loadDocs(f) if err != nil { t.Fatalf("loading from nonexistent file, got %v, want nil", err) } if len(got) != 0 { t.Fatalf("loading from nonexistent file, got %v, want empty map", got) } // Save some data into the file. docs := map[any]storedDoc{ "k1": {"key": "k1", "a": 1}, "k2": {"key": "k2", "b": 2}, } if err := saveDocs(f, docs); err != nil { t.Fatal(err) } // File should exist now. if _, err := os.Lstat(f); err != nil { t.Fatal(err) } // Reload the data. got, err = loadDocs(f) if err != nil { t.Fatal(err) } if !cmp.Equal(got, docs) { t.Errorf("\ngot %v\nwant %v", got, docs) } } ================================================ FILE: docstore/memdocstore/query.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package memdocstore import ( "context" "io" "reflect" "sort" "strings" "time" "gocloud.dev/docstore/driver" ) func (c *collection) RunGetQuery(_ context.Context, q *driver.Query) (driver.DocumentIterator, error) { if q.BeforeQuery != nil { if err := q.BeforeQuery(func(any) bool { return false }); err != nil { return nil, err } } c.mu.Lock() defer c.mu.Unlock() var resultDocs []storedDoc for _, doc := range c.docs { if filtersMatch(q.Filters, doc, c.opts.AllowNestedSliceQueries) { resultDocs = append(resultDocs, doc) } } if q.OrderByField != "" { sortDocs(resultDocs, q.OrderByField, q.OrderAscending) } // Apply offset if q.Offset > 0 { if q.Offset >= len(resultDocs) { resultDocs = []storedDoc{} // If offset is larger than or equal to the length, result should be an empty slice } else { resultDocs = resultDocs[q.Offset:] } } // Apply limit if q.Limit > 0 && len(resultDocs) > q.Limit { resultDocs = resultDocs[:q.Limit] } // Include the key field in the field paths if there is one. var fps [][]string if len(q.FieldPaths) > 0 && c.keyField != "" { fps = append([][]string{{c.keyField}}, q.FieldPaths...) } else { fps = q.FieldPaths } return &docIterator{ docs: resultDocs, fieldPaths: fps, revField: c.opts.RevisionField, }, nil } func filtersMatch(fs []driver.Filter, doc storedDoc, nested bool) bool { for _, f := range fs { if !filterMatches(f, doc, nested) { return false } } return true } func filterMatches(f driver.Filter, doc storedDoc, nested bool) bool { docval, err := getAtFieldPath(doc, f.FieldPath, nested) // missing or bad field path => no match if err != nil { return false } c, ok := compare(docval, f.Value, f.Op) if !ok { return false } return applyComparison(f.Op, c) } // op is one of the permitted docstore operators ("=", "<", etc.) // c is the result of strings.Compare or the like. // TODO(jba): dedup from gcpfirestore/query? func applyComparison(op string, c int) bool { switch op { case driver.EqualOp: return c == 0 case ">": return c > 0 case "<": return c < 0 case ">=": return c >= 0 case "<=": return c <= 0 case "in": return c == 0 case "not-in": return c != 0 default: panic("bad op") } } func compare(x1, x2 any, op string) (int, bool) { v1 := reflect.ValueOf(x1) v2 := reflect.ValueOf(x2) // For in/not-in queries. Otherwise this should only be reached with AllowNestedSliceQueries set. // Return 0 if x1 is in slice x2, -1 if not. if v2.Kind() == reflect.Slice { for i := range v2.Len() { if c, ok := compare(x1, v2.Index(i).Interface(), op); ok { if c == 0 { return 0, true } if op != "in" && op != "not-in" { return c, true } } } return -1, true } // See Options.AllowNestedSliceQueries // When querying for x2 in the document and x1 is a list of values we only need one value to match // the comparison value depends on the operator. if v1.Kind() == reflect.Slice { v2Greater := false v2Less := false for i := range v1.Len() { if c, ok := compare(x2, v1.Index(i).Interface(), op); ok { if c == 0 { return 0, true } v2Greater = v2Greater || c > 0 v2Less = v2Less || c < 0 } } if op[0] == '>' && v2Less { return 1, true } else if op[0] == '<' && v2Greater { return -1, true } return 0, false } if v1.Kind() == reflect.String && v2.Kind() == reflect.String { return strings.Compare(v1.String(), v2.String()), true } if cmp, err := driver.CompareNumbers(v1, v2); err == nil { return cmp, true } if t1, ok := x1.(time.Time); ok { if t2, ok := x2.(time.Time); ok { return driver.CompareTimes(t1, t2), true } } if v1.Kind() == reflect.Bool && v2.Kind() == reflect.Bool { if v1.Bool() == v2.Bool() { return 0, true } return -1, true } return 0, false } func sortDocs(docs []storedDoc, field string, asc bool) { sort.Slice(docs, func(i, j int) bool { c, ok := compare(docs[i][field], docs[j][field], ">") if !ok { return false } if asc { return c < 0 } return c > 0 }) } type docIterator struct { docs []storedDoc fieldPaths [][]string revField string err error } func (it *docIterator) Next(ctx context.Context, doc driver.Document) error { if it.err != nil { return it.err } if len(it.docs) == 0 { it.err = io.EOF return it.err } if err := decodeDoc(it.docs[0], doc, it.fieldPaths); err != nil { it.err = err return it.err } it.docs = it.docs[1:] return nil } func (it *docIterator) Stop() { it.err = io.EOF } func (it *docIterator) As(i any) bool { return false } func (c *collection) QueryPlan(q *driver.Query) (string, error) { return "", nil } ================================================ FILE: docstore/memdocstore/urls.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package memdocstore import ( "context" "fmt" "net/url" "strings" "sync" "gocloud.dev/docstore" ) func init() { docstore.DefaultURLMux().RegisterCollection(Scheme, &URLOpener{}) } // Scheme is the URL scheme memdocstore registers its URLOpener under on // docstore.DefaultMux. const Scheme = "mem" // URLOpener opens URLs like "mem://collection/_id". // // The URL's host is the name of the collection. // The URL's path is used as the keyField. // // The following query parameters are supported: // // - revision_field (optional): the name of the revision field. // - filename (optional): the filename to store the collection in. type URLOpener struct { mu sync.Mutex collections map[string]urlColl } type urlColl struct { keyName string coll *docstore.Collection } // OpenCollectionURL opens a docstore.Collection based on u. func (o *URLOpener) OpenCollectionURL(ctx context.Context, u *url.URL) (*docstore.Collection, error) { q := u.Query() collName := u.Host if collName == "" { return nil, fmt.Errorf("open collection %v: empty collection name", u) } keyName := u.Path keyName = strings.TrimPrefix(keyName, "/") if keyName == "" || strings.ContainsRune(keyName, '/') { return nil, fmt.Errorf("open collection %v: invalid key name %q (must be non-empty and have no slashes)", u, keyName) } options := &Options{ RevisionField: q.Get("revision_field"), Filename: q.Get("filename"), AllowNestedSliceQueries: q.Get("allow_nested_slice_queries") == "true", onClose: func() { o.mu.Lock() delete(o.collections, collName) o.mu.Unlock() }, } q.Del("revision_field") q.Del("filename") q.Del("allow_nested_slice_queries") for param := range q { return nil, fmt.Errorf("open collection %v: invalid query parameter %q", u, param) } o.mu.Lock() defer o.mu.Unlock() if o.collections == nil { o.collections = map[string]urlColl{} } ucoll, ok := o.collections[collName] if !ok { coll, err := OpenCollection(keyName, options) if err != nil { return nil, err } o.collections[collName] = urlColl{keyName, coll} return coll, nil } if ucoll.keyName != keyName { return nil, fmt.Errorf("open collection %v: key name %q does not equal existing key name %q", u, keyName, ucoll.keyName) } return ucoll.coll, nil } ================================================ FILE: docstore/memdocstore/urls_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package memdocstore import ( "context" "testing" "gocloud.dev/docstore" ) func TestOpenCollectionFromURL(t *testing.T) { tests := []struct { URL string wantErr bool }{ // OK. {"mem://coll/_id", false}, // "coll" already has key "_id". {"mem://coll/foo.bar", true}, {"mem://coll2/foo.bar", false}, // Missing collection. {"mem://", true}, // Missing key. {"mem://coll", true}, // Key with slash. {"mem://coll/my/key", true}, // Passing revision field. {"mem://coll/_id?revision_field=123", false}, // Passing filename. {"mem://coll/_id?filename=foo.out", false}, // Invalid parameter. {"mem://coll/key?param=value", true}, } ctx := context.Background() for _, test := range tests { d, err := docstore.OpenCollection(ctx, test.URL) if d != nil { defer d.Close() } if (err != nil) != test.wantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.wantErr) } } } ================================================ FILE: docstore/mongodocstore/awsdocdb/main.tf ================================================ # Specify the provider and access details provider "aws" { version = "~> 2.0" region = "${var.aws_region}" } resource "aws_security_group" "docdbtest" { name_prefix = "docdbtest" description = "Test mongo driver on docdb" vpc_id = "${var.vpc_id}" ingress { from_port = 22 to_port = 22 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] description = "Public SSH access" } ingress { from_port = 0 to_port = 0 protocol = "-1" self = true description = "Allow traffic within the security group for port forwarding" } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } } # Provisioning a DocumentDB cluster with an instance. resource "aws_docdb_cluster_instance" "docdbtest" { cluster_identifier = "${aws_docdb_cluster.docdbtest.id}" identifier_prefix = "${aws_docdb_cluster.docdbtest.id}" instance_class = "db.r5.large" apply_immediately = true } resource "aws_docdb_cluster" "docdbtest" { cluster_identifier = "docstore-test-cluster" master_username = "${var.db_username}" master_password = "${var.db_password}" db_cluster_parameter_group_name = "docstore-test-pg" vpc_security_group_ids = ["${aws_security_group.docdbtest.id}"] skip_final_snapshot = true } # Provisioning an EC2 instance within the same VPC group for port forwarding. resource "aws_key_pair" "docdbtest" { key_name_prefix = "docdbtest" public_key = "${var.ssh_public_key}" } data "aws_ami" "ubuntu" { most_recent = true filter { name = "name" values = ["ubuntu/images/hvm-ssd/ubuntu-bionic-18.04-amd64-server-*"] } filter { name = "virtualization-type" values = ["hvm"] } owners = ["099720109477"] } resource "aws_instance" "docdbtest" { ami = "${data.aws_ami.ubuntu.id}" instance_type = "t2.micro" vpc_security_group_ids = ["${aws_security_group.docdbtest.id}"] key_name = "${aws_key_pair.docdbtest.key_name}" associate_public_ip_address = true } ================================================ FILE: docstore/mongodocstore/awsdocdb/outputs.tf ================================================ output "setup_ssh_tunnel" { value = "ssh -L 27019:${aws_docdb_cluster.docdbtest.endpoint}:27017 ubuntu@${aws_instance.docdbtest.public_dns} -N" } ================================================ FILE: docstore/mongodocstore/awsdocdb/variables.tf ================================================ variable "aws_region" { description = "The AWS region to create docdb cluster and ec2 instance in." default = "us-east-2" } variable "vpc_id" { description = "The ID of the default VPC used by docdb cluster and ec2 instance." } variable "ssh_public_key" { description = "A public key line in .ssh/authorized_keys format to use to authenticate to your instance. This must be added to your SSH agent for provisioning to succeed." } variable "db_username" { description = "The master username to login docdb" } variable "db_password" { description = "The master password to login docdb" } ================================================ FILE: docstore/mongodocstore/codec.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package mongodocstore import ( "fmt" "reflect" "strings" "time" "go.mongodb.org/mongo-driver/bson/primitive" "gocloud.dev/docstore/driver" ) // Encode and decode to map[string]interface{}. // This isn't ideal, because the mongo client encodes/decodes a second time. // TODO(jba): Benchmark the double decode to see if it's worth trying to avoid it. // This code is copied from memdocstore/codec.go, except for special treatment of // primitive.Binary. func encodeDoc(doc driver.Document, lowercaseFields bool) (map[string]interface{}, error) { e := encoder{lowercaseFields: lowercaseFields} if err := doc.Encode(&e); err != nil { return nil, err } return e.val.(map[string]interface{}), nil } func encodeValue(x interface{}) (interface{}, error) { var e encoder if err := driver.Encode(reflect.ValueOf(x), &e); err != nil { return nil, err } return e.val, nil } type encoder struct { val interface{} lowercaseFields bool } func (e *encoder) EncodeNil() { e.val = nil } func (e *encoder) EncodeBool(x bool) { e.val = x } func (e *encoder) EncodeInt(x int64) { e.val = x } func (e *encoder) EncodeUint(x uint64) { e.val = int64(x) } func (e *encoder) EncodeBytes(x []byte) { e.val = x } func (e *encoder) EncodeFloat(x float64) { e.val = x } func (e *encoder) EncodeString(x string) { e.val = x } func (e *encoder) ListIndex(int) { panic("impossible") } func (e *encoder) MapKey(string) { panic("impossible") } var ( typeOfGoTime = reflect.TypeOf(time.Time{}) typeOfObjectID = reflect.TypeOf(primitive.ObjectID{}) ) func (e *encoder) EncodeSpecial(v reflect.Value) (bool, error) { // Treat time specially as itself (otherwise its BinaryMarshal method will be called). // Also, ObjectIDs are already encoded. if v.Type() == typeOfGoTime || v.Type() == typeOfObjectID { e.val = v.Interface() return true, nil } return false, nil } func (e *encoder) EncodeList(n int) driver.Encoder { // All slices and arrays are encoded as []interface{} s := make([]interface{}, n) e.val = s return &listEncoder{s: s, encoder: encoder{lowercaseFields: e.lowercaseFields}} } type listEncoder struct { s []interface{} encoder } func (e *listEncoder) ListIndex(i int) { e.s[i] = e.val } type mapEncoder struct { m map[string]interface{} isStruct bool encoder } func (e *encoder) EncodeMap(n int) driver.Encoder { m := make(map[string]interface{}, n) e.val = m return &mapEncoder{m: m, encoder: encoder{lowercaseFields: e.lowercaseFields}} } func (e *mapEncoder) MapKey(k string) { if e.lowercaseFields { k = strings.ToLower(k) } e.m[k] = e.val } //////////////////////////////////////////////////////////////// // decodeDoc decodes m into ddoc. func decodeDoc(m map[string]interface{}, ddoc driver.Document, idField string, lowercaseFields bool) error { switch idField { case mongoIDField: // do nothing case "": // user uses idFunc delete(m, mongoIDField) default: // user documents have a different ID field m[idField] = m[mongoIDField] delete(m, mongoIDField) } return ddoc.Decode(decoder{val: m, lowercaseFields: lowercaseFields}) } type decoder struct { val interface{} lowercaseFields bool } func (d decoder) String() string { return fmt.Sprint(d.val) } func (d decoder) AsNull() bool { return d.val == nil } func (d decoder) AsBool() (bool, bool) { b, ok := d.val.(bool) return b, ok } func (d decoder) AsString() (string, bool) { s, ok := d.val.(string) return s, ok } func (d decoder) AsInt() (int64, bool) { switch v := d.val.(type) { case int64: return v, true case int32: return int64(v), true default: return 0, false } } func (d decoder) AsUint() (uint64, bool) { i, ok := d.val.(int64) return uint64(i), ok } func (d decoder) AsFloat() (float64, bool) { f, ok := d.val.(float64) return f, ok } func (d decoder) AsBytes() ([]byte, bool) { switch v := d.val.(type) { case []byte: return v, true case primitive.Binary: return v.Data, true default: return nil, false } } func (d decoder) AsInterface() (interface{}, error) { return toGoValue(d.val) } func toGoValue(v interface{}) (interface{}, error) { switch v := v.(type) { case primitive.A: r := make([]interface{}, len(v)) for i, e := range v { d, err := toGoValue(e) if err != nil { return nil, err } r[i] = d } return r, nil case primitive.Binary: return v.Data, nil case primitive.DateTime: return bsonDateTimeToTime(v), nil case map[string]interface{}: r := map[string]interface{}{} for k, e := range v { d, err := toGoValue(e) if err != nil { return nil, err } r[k] = d } return r, nil default: return v, nil } } func (d decoder) ListLen() (int, bool) { if s, ok := d.val.(primitive.A); ok { return len(s), true } return 0, false } func (d decoder) DecodeList(f func(i int, d2 driver.Decoder) bool) { for i, e := range d.val.(primitive.A) { if !f(i, decoder{e, d.lowercaseFields}) { return } } } func (d decoder) MapLen() (int, bool) { if m, ok := d.val.(map[string]interface{}); ok { return len(m), true } return 0, false } func (d decoder) DecodeMap(f func(key string, d2 driver.Decoder, exactMatch bool) bool) { for k, v := range d.val.(map[string]interface{}) { if !f(k, decoder{v, d.lowercaseFields}, !d.lowercaseFields) { return } } } func (d decoder) AsSpecial(v reflect.Value) (bool, interface{}, error) { switch v := d.val.(type) { case primitive.DateTime: // A DateTime represents milliseconds since the Unix epoch. return true, bsonDateTimeToTime(v), nil default: return false, nil, nil } } func bsonDateTimeToTime(dt primitive.DateTime) time.Time { return time.Unix(int64(dt)/1000, int64(dt)%1000*1e6) } ================================================ FILE: docstore/mongodocstore/cosmos_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package mongodocstore import ( "context" "os" "testing" "gocloud.dev/docstore/drivertest" "gocloud.dev/internal/testing/setup" ) // Run conformance tests on Azure Cosmos. // See https://docs.microsoft.com/en-us/azure/cosmos-db/connect-mongodb-account // on how to get a MongoDB connection string for Azure Cosmos. var cosmosConnString = os.Getenv("COSMOS_CONNECTION_STRING") func TestConformanceCosmos(t *testing.T) { if !*setup.Record { t.Skip("replaying is not yet supported for Azure Cosmos") } if cosmosConnString == "" { t.Fatal("test harness requires COSMOS_CONNECTION_STRING environment variable to run") } ctx := context.Background() client, err := Dial(ctx, cosmosConnString) if err != nil { t.Fatalf("dialing to %s: %v", cosmosConnString, err) } if err := client.Ping(ctx, nil); err != nil { t.Fatalf("connecting to %s: %v", cosmosConnString, err) } defer func() { // Cleanup any resource to avoid wastes. client.Database(dbName).Drop(ctx) client.Disconnect(ctx) }() newHarness := func(context.Context, *testing.T) (drivertest.Harness, error) { return &harness{client.Database(dbName), true}, nil } drivertest.RunConformanceTests(t, newHarness, codecTester{}, []drivertest.AsTest{verifyAs{}}) } ================================================ FILE: docstore/mongodocstore/docdb_test.go ================================================ package mongodocstore import ( "context" "fmt" "os" "testing" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" "gocloud.dev/docstore/drivertest" "gocloud.dev/internal/testing/setup" ) const connectionStringTemplate = "mongodb://%s:%s@%s/?connect=direct&connectTimeoutMS=3000" // To run the conformance tests against Amazon DocumentDB: // // 1. Run `terraform apply` in awsdocdb directory to provision a docdb cluster and an EC2 instance. // 2. Run the command provided by the terraform output string to setup port-forwarding. // 3. Set the following environment variables and run this test with `-record` flag. var ( username = os.Getenv("AWSDOCDB_USERNAME") password = os.Getenv("AWSDOCDB_PASSWORD") endpoint = os.Getenv("AWSDOCDB_ENDPOINT") // optional, default to localhost:27019 ) func TestConformanceDocDB(t *testing.T) { if !*setup.Record { t.Skip("replaying is not yet supported for Amazon DocumentDB") } if username == "" || password == "" { t.Fatal("environment not setup to run DocDB test") } client := newDocDBTestClient(t) defer client.Disconnect(context.Background()) newHarness := func(context.Context, *testing.T) (drivertest.Harness, error) { return &harness{db: client.Database(dbName)}, nil } drivertest.RunConformanceTests(t, newHarness, codecTester{}, []drivertest.AsTest{verifyAs{}}) } func newDocDBTestClient(t *testing.T) *mongo.Client { ctx := context.Background() if endpoint == "" { endpoint = "localhost:27019" } connectionURI := fmt.Sprintf(connectionStringTemplate, username, password, endpoint) o := options.Client().ApplyURI(connectionURI) if err := o.Validate(); err != nil { t.Fatal(err) } client, err := mongo.NewClient(o) if err != nil { t.Fatalf("Failed to create client: %v", err) } err = client.Connect(ctx) if err != nil { t.Fatalf("Failed to connect to cluster: %v", err) } // Force a connection to verify our connection string err = client.Ping(ctx, nil) if err != nil { t.Fatalf("Failed to ping cluster: %v", err) } return client } ================================================ FILE: docstore/mongodocstore/docker-compose.yml ================================================ version: '3.8' services: mongo: image: mongo:4.4 container_name: mongo restart: always volumes: - mongo_data:/data/db ports: - "27017:27017" command: ["--replSet", "dbrs", "--bind_ip_all"] mongosetup: image: mongo:4.4 container_name: mongosetup depends_on: - mongo entrypoint: > bash -c "sleep 5 && mongo --host mongo:27017 --eval ' rs.initiate({ _id: \"dbrs\", members: [ { _id: 0, host: \"mongo:27017\"} ] }) '" volumes: mongo_data: ================================================ FILE: docstore/mongodocstore/example_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package mongodocstore_test import ( "context" "log" "gocloud.dev/docstore" "gocloud.dev/docstore/mongodocstore" ) func ExampleOpenCollection() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() client, err := mongodocstore.Dial(ctx, "mongodb://my-host") if err != nil { log.Fatal(err) } mcoll := client.Database("my-db").Collection("my-coll") coll, err := mongodocstore.OpenCollection(mcoll, "userID", nil) if err != nil { log.Fatal(err) } defer coll.Close() } func ExampleOpenCollectionWithIDFunc() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() type HighScore struct { Game string Player string } client, err := mongodocstore.Dial(ctx, "mongodb://my-host") if err != nil { log.Fatal(err) } mcoll := client.Database("my-db").Collection("my-coll") // The name of a document is constructed from the Game and Player fields. nameFromDocument := func(doc docstore.Document) interface{} { hs := doc.(*HighScore) return hs.Game + "|" + hs.Player } coll, err := mongodocstore.OpenCollectionWithIDFunc(mcoll, nameFromDocument, nil) if err != nil { log.Fatal(err) } defer coll.Close() } func Example_openCollectionFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/docstore/mongodocstore" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // docstore.OpenCollection creates a *docstore.Collection from a URL. coll, err := docstore.OpenCollection(ctx, "mongo://my-db/my-collection?id_field=userID") if err != nil { log.Fatal(err) } defer coll.Close() } ================================================ FILE: docstore/mongodocstore/go.mod ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. module gocloud.dev/docstore/mongodocstore go 1.25.0 require ( github.com/google/go-cmp v0.7.0 github.com/google/wire v0.7.0 go.mongodb.org/mongo-driver v1.17.9 gocloud.dev v0.45.0 ) require ( cloud.google.com/go/auth v0.18.2 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect github.com/aws/aws-sdk-go-v2 v1.41.4 // indirect github.com/aws/aws-sdk-go-v2/config v1.32.12 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.19.12 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 // indirect github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 // indirect github.com/aws/smithy-go v1.24.2 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/golang/snappy v1.0.0 // indirect github.com/google/go-replayers/grpcreplay v1.3.0 // indirect github.com/google/go-replayers/httpreplay v1.2.0 // indirect github.com/google/martian/v3 v3.3.3 // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/google/uuid v1.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.14 // indirect github.com/googleapis/gax-go/v2 v2.19.0 // indirect github.com/klauspost/compress v1.18.4 // indirect github.com/montanaflynn/stats v0.8.2 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect github.com/xdg-go/scram v1.2.0 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 // indirect go.opentelemetry.io/otel v1.42.0 // indirect go.opentelemetry.io/otel/metric v1.42.0 // indirect go.opentelemetry.io/otel/sdk v1.42.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.42.0 // indirect go.opentelemetry.io/otel/trace v1.42.0 // indirect golang.org/x/crypto v0.49.0 // indirect golang.org/x/net v0.52.0 // indirect golang.org/x/oauth2 v0.36.0 // indirect golang.org/x/sync v0.20.0 // indirect golang.org/x/sys v0.42.0 // indirect golang.org/x/text v0.35.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect google.golang.org/api v0.272.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260316180232-0b37fe3546d5 // indirect google.golang.org/grpc v1.79.3 // indirect google.golang.org/protobuf v1.36.11 // indirect ) replace gocloud.dev => ../../ ================================================ FILE: docstore/mongodocstore/go.sum ================================================ cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= cloud.google.com/go/auth v0.18.2 h1:+Nbt5Ev0xEqxlNjd6c+yYUeosQ5TtEUaNcN/3FozlaM= cloud.google.com/go/auth v0.18.2/go.mod h1:xD+oY7gcahcu7G2SG2DsBerfFxgPAJz17zz2joOFF3M= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.21.0 h1:BhopUsx7kh6NFx77ccRsHhrtkbJUmDAxNY3uapWdjcM= cloud.google.com/go/firestore v1.21.0/go.mod h1:1xH6HNcnkf/gGyR8udd6pFO4Z7GWJSwLKQMx/u6UrP4= cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= cloud.google.com/go/longrunning v0.8.0 h1:LiKK77J3bx5gDLi4SMViHixjD2ohlkwBi+mKA7EhfW8= cloud.google.com/go/longrunning v0.8.0/go.mod h1:UmErU2Onzi+fKDg2gR7dusz11Pe26aknR4kHmJJqIfk= cloud.google.com/go/monitoring v1.24.3 h1:dde+gMNc0UhPZD1Azu6at2e79bfdztVDS5lvhOdsgaE= cloud.google.com/go/monitoring v1.24.3/go.mod h1:nYP6W0tm3N9H/bOw8am7t62YTzZY+zUeQ+Bi6+2eonI= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.61.3 h1:VS//ZfBuPGDvakfD9xyPW1RGF1Vy3BWUoVZXgW1KMOg= cloud.google.com/go/storage v1.61.3/go.mod h1:JtqK8BBB7TWv0HVGHubtUdzYYrakOQIsMLffZ2Z/HWk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0 h1:DHa2U07rk8syqvCge0QIGMCE1WxGj9njT44GH7zNJLQ= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 h1:UnDZ/zFfG1JhH/DqxIZYU/1CUAlTUScoXD/LcM2Ykk8= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0/go.mod h1:IA1C1U7jO/ENqm/vhi7V9YYpBsp+IMyqNrEN94N7tVc= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 h1:0s6TxfCu2KHkkZPnBfsQ2y5qia0jl3MMrmBhu3nCOYk= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0/go.mod h1:Mf6O40IAyB9zR/1J8nGDDPirZQQPbYJni8Yisy7NTMc= github.com/aws/aws-sdk-go-v2 v1.41.4 h1:10f50G7WyU02T56ox1wWXq+zTX9I1zxG46HYuG1hH/k= github.com/aws/aws-sdk-go-v2 v1.41.4/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o= github.com/aws/aws-sdk-go-v2/config v1.32.12 h1:O3csC7HUGn2895eNrLytOJQdoL2xyJy0iYXhoZ1OmP0= github.com/aws/aws-sdk-go-v2/config v1.32.12/go.mod h1:96zTvoOFR4FURjI+/5wY1vc1ABceROO4lWgWJuxgy0g= github.com/aws/aws-sdk-go-v2/credentials v1.19.12 h1:oqtA6v+y5fZg//tcTWahyN9PEn5eDU/Wpvc2+kJ4aY8= github.com/aws/aws-sdk-go-v2/credentials v1.19.12/go.mod h1:U3R1RtSHx6NB0DvEQFGyf/0sbrpJrluENHdPy1j/3TE= github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.20.35 h1:CQ2kB9Q4xQ2PDBmn+KCr/pw1DvK7pH6NkR2nl2KV7ng= github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.20.35/go.mod h1:ypTMB9nZhpqfMeRVesGj4dEknIg0YS+aXGtLMidw/Ek= github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.8.35 h1:qxsbiWRtwChp/rrSHMfYoosVDVWRICoYXoDdczaLFiI= github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.8.35/go.mod h1:SomvXQRUKYBML53k4LqIgszKJKz8TdUwi/Zwig7JhfU= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 h1:zOgq3uezl5nznfoK3ODuqbhVg1JzAGDUhXOsU0IDCAo= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20/go.mod h1:z/MVwUARehy6GAg/yQ1GO2IMl0k++cu1ohP9zo887wE= github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 h1:CNXO7mvgThFGqOFgbNAP2nol2qAWBOGfqR/7tQlvLmc= github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20/go.mod h1:oydPDJKcfMhgfcgBUZaG+toBbwy8yPWubJXBVERtI4o= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 h1:tN6W/hg+pkM+tf9XDkWUbDEjGLb+raoBMFsTodcoYKw= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20/go.mod h1:YJ898MhD067hSHA6xYCx5ts/jEd8BSOLtQDL3iZsvbc= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 h1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY= github.com/aws/aws-sdk-go-v2/service/dynamodb v1.56.2 h1:xi/ECwajy2mixviBD7bKAlGGSwzEaFKX2wIhrZt9NGw= github.com/aws/aws-sdk-go-v2/service/dynamodb v1.56.2/go.mod h1:dLREOeW66eVaaGIOi2ZlLHDgkR3nuJ02rd00j0YSlBE= github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.32.13 h1:xQ9dX2jxVm14uNVe0WomcCSza832ytYWt1ZBu2LrBLM= github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.32.13/go.mod h1:D5up2/CMSP4sF8ESBWla6gJvIMySJi8dYYAaED4oTCc= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 h1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI= github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.11.20 h1:ru+seMuylHiNZlvgZei83eD8h37hRjm1XIMOEmcV0BU= github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.11.20/go.mod h1:ihZMtPTKoX/ugQRHbui6zNdSgVYN1KY2Dgwb2d3hXlc= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 h1:2HvVAIq+YqgGotK6EkMf+KIEqTISmTYh5zLpYyeTo1Y= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20/go.mod h1:V4X406Y666khGa8ghKmphma/7C0DAtEQYhkq9z4vpbk= github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 h1:0GFOLzEbOyZABS3PhYfBIx2rNBACYcKty+XGkTgw1ow= github.com/aws/aws-sdk-go-v2/service/signin v1.0.8/go.mod h1:LXypKvk85AROkKhOG6/YEcHFPoX+prKTowKnVdcaIxE= github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 h1:kiIDLZ005EcKomYYITtfsjn7dtOwHDOFy7IbPXKek2o= github.com/aws/aws-sdk-go-v2/service/sso v1.30.13/go.mod h1:2h/xGEowcW/g38g06g3KpRWDlT+OTfxxI0o1KqayAB8= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 h1:jzKAXIlhZhJbnYwHbvUQZEB8KfgAEuG0dc08Bkda7NU= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17/go.mod h1:Al9fFsXjv4KfbzQHGe6V4NZSZQXecFcvaIF4e70FoRA= github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 h1:Cng+OOwCHmFljXIxpEVXAGMnBia8MSU6Ch5i9PgBkcU= github.com/aws/aws-sdk-go-v2/service/sts v1.41.9/go.mod h1:LrlIndBDdjA/EeXeyNBle+gyCwTlizzW5ycgWnvIxkk= github.com/aws/smithy-go v1.24.2 h1:FzA3bu/nt/vDvmnkg+R8Xl46gmzEDam6mZ1hzmwXFng= github.com/aws/smithy-go v1.24.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os8IaYg++6uMOdKK83QtkkvJik= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= github.com/envoyproxy/go-control-plane/envoy v1.37.0 h1:u3riX6BoYRfF4Dr7dwSOroNfdSbEPe9Yyl09/B6wBrQ= github.com/envoyproxy/go-control-plane/envoy v1.37.0/go.mod h1:DReE9MMrmecPy+YvQOAOHNYMALuowAnbjjEMkkWOi6A= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds= github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/go-replayers/grpcreplay v1.3.0 h1:1Keyy0m1sIpqstQmgz307zhiJ1pV4uIlFds5weTmxbo= github.com/google/go-replayers/grpcreplay v1.3.0/go.mod h1:v6NgKtkijC0d3e3RW8il6Sy5sqRVUwoQa4mHOGEy8DI= github.com/google/go-replayers/httpreplay v1.2.0 h1:VM1wEyyjaoU53BwrOnaf9VhAyQQEEioJvFYxYcLRKzk= github.com/google/go-replayers/httpreplay v1.2.0/go.mod h1:WahEFFZZ7a1P4VM1qEeHy+tME4bwyqPcwWbNlUI1Mcg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/wire v0.7.0 h1:JxUKI6+CVBgCO2WToKy/nQk0sS+amI9z9EjVmdaocj4= github.com/google/wire v0.7.0/go.mod h1:n6YbUQD9cPKTnHXEBN2DXlOp/mVADhVErcMFb0v3J18= github.com/googleapis/enterprise-certificate-proxy v0.3.14 h1:yh8ncqsbUY4shRD5dA6RlzjJaT4hi3kII+zYw8wmLb8= github.com/googleapis/enterprise-certificate-proxy v0.3.14/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.19.0 h1:fYQaUOiGwll0cGj7jmHT/0nPlcrZDFPrZRhTsoCr8hE= github.com/googleapis/gax-go/v2 v2.19.0/go.mod h1:w2ROXVdfGEVFXzmlciUU4EdjHgWvB5h2n6x/8XSTTJA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.18.4 h1:RPhnKRAQ4Fh8zU2FY/6ZFDwTVTxgJ/EMydqSTzE9a2c= github.com/klauspost/compress v1.18.4/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/montanaflynn/stats v0.8.2 h1:52wnefTJnPI5FoHif1DQh2soKRw0yYs+4AVyvtcZCH0= github.com/montanaflynn/stats v0.8.2/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.2.0 h1:bYKF2AEwG5rqd1BumT4gAnvwU/M9nBp2pTSxeZw7Wvs= github.com/xdg-go/scram v1.2.0/go.mod h1:3dlrS0iBaWKYVt2ZfA4cj48umJZ+cAEbR6/SjLA88I8= github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.mongodb.org/mongo-driver v1.17.9 h1:IexDdCuuNJ3BHrELgBlyaH9p60JXAvdzWR128q+U5tU= go.mongodb.org/mongo-driver v1.17.9/go.mod h1:LlOhpH5NUEfhxcAwG0UEkMqwYcc4JU18gtCdGudk/tQ= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/detectors/gcp v1.42.0 h1:kpt2PEJuOuqYkPcktfJqWWDjTEd/FNgrxcniL7kQrXQ= go.opentelemetry.io/contrib/detectors/gcp v1.42.0/go.mod h1:W9zQ439utxymRrXsUOzZbFX4JhLxXU4+ZnCt8GG7yA8= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0 h1:yI1/OhfEPy7J9eoa6Sj051C7n5dvpj0QX8g4sRchg04= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0/go.mod h1:NoUCKYWK+3ecatC4HjkRktREheMeEtrXoQxrqYFeHSc= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 h1:OyrsyzuttWTSur2qN/Lm0m2a8yqyIjUVBZcxFPuXq2o= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0/go.mod h1:C2NGBr+kAB4bk3xtMXfZ94gqFDtg/GkI7e9zqGh5Beg= go.opentelemetry.io/otel v1.42.0 h1:lSQGzTgVR3+sgJDAU/7/ZMjN9Z+vUip7leaqBKy4sho= go.opentelemetry.io/otel v1.42.0/go.mod h1:lJNsdRMxCUIWuMlVJWzecSMuNjE7dOYyWlqOXWkdqCc= go.opentelemetry.io/otel/metric v1.42.0 h1:2jXG+3oZLNXEPfNmnpxKDeZsFI5o4J+nz6xUlaFdF/4= go.opentelemetry.io/otel/metric v1.42.0/go.mod h1:RlUN/7vTU7Ao/diDkEpQpnz3/92J9ko05BIwxYa2SSI= go.opentelemetry.io/otel/sdk v1.42.0 h1:LyC8+jqk6UJwdrI/8VydAq/hvkFKNHZVIWuslJXYsDo= go.opentelemetry.io/otel/sdk v1.42.0/go.mod h1:rGHCAxd9DAph0joO4W6OPwxjNTYWghRWmkHuGbayMts= go.opentelemetry.io/otel/sdk/metric v1.42.0 h1:D/1QR46Clz6ajyZ3G8SgNlTJKBdGp84q9RKCAZ3YGuA= go.opentelemetry.io/otel/sdk/metric v1.42.0/go.mod h1:Ua6AAlDKdZ7tdvaQKfSmnFTdHx37+J4ba8MwVCYM5hc= go.opentelemetry.io/otel/trace v1.42.0 h1:OUCgIPt+mzOnaUTpOQcBiM/PLQ/Op7oq6g4LenLmOYY= go.opentelemetry.io/otel/trace v1.42.0/go.mod h1:f3K9S+IFqnumBkKhRJMeaZeNk9epyhnCmQh/EysQCdc= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= google.golang.org/api v0.272.0 h1:eLUQZGnAS3OHn31URRf9sAmRk3w2JjMx37d2k8AjJmA= google.golang.org/api v0.272.0/go.mod h1:wKjowi5LNJc5qarNvDCvNQBn3rVK8nSy6jg2SwRwzIA= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20260316180232-0b37fe3546d5 h1:JNfk58HZ8lfmXbYK2vx/UvsqIL59TzByCxPIX4TDmsE= google.golang.org/genproto v0.0.0-20260316180232-0b37fe3546d5/go.mod h1:x5julN69+ED4PcFk/XWayw35O0lf/nGa4aNgODCmNmw= google.golang.org/genproto/googleapis/api v0.0.0-20260316180232-0b37fe3546d5 h1:CogIeEXn4qWYzzQU0QqvYBM8yDF9cFYzDq9ojSpv0Js= google.golang.org/genproto/googleapis/api v0.0.0-20260316180232-0b37fe3546d5/go.mod h1:EIQZ5bFCfRQDV4MhRle7+OgjNtZ6P1PiZBgAKuxXu/Y= google.golang.org/genproto/googleapis/rpc v0.0.0-20260316180232-0b37fe3546d5 h1:aJmi6DVGGIStN9Mobk/tZOOQUBbj0BPjZjjnOdoZKts= google.golang.org/genproto/googleapis/rpc v0.0.0-20260316180232-0b37fe3546d5/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= ================================================ FILE: docstore/mongodocstore/localmongo.sh ================================================ #!/usr/bin/env bash # Copyright 2019 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Starts two local MongoDB instances (v3 and v4) via Docker listening on two # different ports. # https://coderwall.com/p/fkfaqq/safer-bash-scripts-with-set-euxo-pipefail set -euo pipefail echo "Starting MongoDB v4 listening on 27017..." docker rm -f mongo4 mongosetup &> /dev/null || : docker compose -f ./docstore/mongodocstore/docker-compose.yml up --wait &> /dev/null sleep 3 echo "...done. Run \"docker rm -f mongo4 mongosetup\" to clean up the container." echo echo "Starting MongoDB v3 listening on 27020..." docker rm -f mongo3 &> /dev/null || : docker run -d --name mongo3 -p 27020:27017 mongo:3 &> /dev/null echo "...done. Run \"docker rm -f mongo3\" to clean up the container." echo ================================================ FILE: docstore/mongodocstore/mongo.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package mongodocstore provides a docstore implementation for MongoDB // and MongoDB-compatible services hosted on-premise or by cloud providers, // including Amazon DocumentDB and Azure Cosmos DB. // // # URLs // // For docstore.OpenCollection, mongodocstore registers for the scheme "mongo". // The default URL opener will dial a Mongo server using the environment // variable "MONGO_SERVER_URL". // To customize the URL opener, or for more details on the URL format, // see URLOpener. // See https://gocloud.dev/concepts/urls/ for background information. // // # Action Lists // // mongodocstore uses the unordered BulkWrite call of the underlying driver for writes, and uses Find with a list of document IDs for Get. // (These implementation choices are subject to change.) // It calls the BeforeDo function once before each call to the underlying driver. The as function passed // to the BeforeDo function exposes the following types: // - Gets: *options.FindOptions // - writes: []mongo.WriteModel and *options.BulkWriteOptions // // # As // // mongodocstore exposes the following types for As: // - Collection: *mongo.Collection // - Query.BeforeQuery: *options.FindOptions or bson.D (the filter for Delete and Update queries) // - DocumentIterator: *mongo.Cursor // - Error: mongo.CommandError, mongo.BulkWriteError, mongo.BulkWriteException // // # Special Considerations // // MongoDB represents times to millisecond precision, while Go's time.Time type has // nanosecond precision. To save time.Times to MongoDB without loss of precision, // save the result of calling UnixNano on the time. // // The official Go driver for MongoDB, go.mongodb.org/mongo-driver/mongo, lowercases // struct field names; other docstore drivers do not. This means that you have to choose // between interoperating with the MongoDB driver and interoperating with other docstore drivers. // See Options.LowercaseFields for more information. package mongodocstore // import "gocloud.dev/docstore/mongodocstore" // MongoDB reference manual: https://docs.mongodb.com/manual // Client documentation: https://godoc.org/go.mongodb.org/mongo-driver/mongo // // The client methods accept a document of type interface{}, // which is marshaled by the go.mongodb.org/mongo-driver/bson package. import ( "context" "reflect" "strings" "github.com/google/wire" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" "gocloud.dev/docstore" "gocloud.dev/docstore/driver" "gocloud.dev/gcerrors" "gocloud.dev/internal/gcerr" ) // Dial returns a new mongoDB client that is connected to the server URI. func Dial(ctx context.Context, uri string) (*mongo.Client, error) { opts := options.Client().ApplyURI(uri) if err := opts.Validate(); err != nil { return nil, err } client, err := mongo.NewClient(opts) if err != nil { return nil, err } if err := client.Connect(ctx); err != nil { return nil, err } return client, nil } // Set holds Wire providers for this package. var Set = wire.NewSet( Dial, wire.Struct(new(URLOpener), "Client"), ) type collection struct { coll *mongo.Collection idField string idFunc func(docstore.Document) interface{} revisionField string opts *Options } // Options holds various options. type Options struct { // Lowercase all field names for document encoding, field selection, update // modifications and queries. // // If false (the default), then struct fields and MongoDB document fields will // have the same names. For example, a struct field F will correspond to a // MongoDB document field "F". This setting matches the behavior of other // docstore drivers, making code portable across services. // // If true, all fields correspond to lower-cased MongoDB document fields. The // field name F will correspond to the MongoDB document field "f", for // instance. Use this to make code that uses this package interoperate with // code that uses the official Go client for MongoDB, // go.mongodb.org/mongo-driver/mongo, which lowercases field names. LowercaseFields bool // The name of the field holding the document revision. // Defaults to docstore.DefaultRevisionField. RevisionField string // Whether Query.Update writes a new revision into the updated documents. // The default is false, meaning that a revision will be written to all // documents that satisfy the query's conditions. Set to true if and only if // the collection's documents do not have revision fields. NoWriteQueryUpdateRevisions bool } // OpenCollection opens a MongoDB collection for use with Docstore. // The idField argument is the name of the document field to use for the document ID // (MongoDB's _id field). If it is empty, the field "_id" will be used. func OpenCollection(mcoll *mongo.Collection, idField string, opts *Options) (*docstore.Collection, error) { dc, err := newCollection(mcoll, idField, nil, opts) if err != nil { return nil, err } return docstore.NewCollection(dc), nil } // OpenCollectionWithIDFunc opens a MongoDB collection for use with Docstore. // The idFunc argument is function that accepts a document and returns the value to // be used for the document ID (MongoDB's _id field). IDFunc should return nil if the // document is missing the information to construct an ID. This will cause all // actions, even Create, to fail. func OpenCollectionWithIDFunc(mcoll *mongo.Collection, idFunc func(docstore.Document) interface{}, opts *Options) (*docstore.Collection, error) { dc, err := newCollection(mcoll, "", idFunc, opts) if err != nil { return nil, err } return docstore.NewCollection(dc), nil } func newCollection(mcoll *mongo.Collection, idField string, idFunc func(docstore.Document) interface{}, opts *Options) (*collection, error) { if opts == nil { opts = &Options{} } if opts.RevisionField == "" { opts.RevisionField = docstore.DefaultRevisionField } c := &collection{ coll: mcoll, idField: idField, idFunc: idFunc, revisionField: opts.RevisionField, opts: opts, } if c.idField == "" && c.idFunc == nil { c.idField = mongoIDField } if opts.LowercaseFields { c.idField = strings.ToLower(c.idField) c.revisionField = strings.ToLower(c.revisionField) } return c, nil } func (c *collection) Key(doc driver.Document) (interface{}, error) { if c.idField != "" { id, _ := doc.GetField(c.idField) return id, nil // missing field is not an error } id := c.idFunc(doc.Origin) if id == nil || driver.IsEmptyValue(reflect.ValueOf(id)) { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "missing document key") } return id, nil } func (c *collection) RevisionField() string { return c.opts.RevisionField } // From https://docs.mongodb.com/manual/core/document: "The field name _id is // reserved for use as a primary key; its value must be unique in the collection, is // immutable, and may be of any type other than an array." const mongoIDField = "_id" func (c *collection) RunActions(ctx context.Context, actions []*driver.Action, opts *driver.RunActionsOptions) driver.ActionListError { errs := make([]error, len(actions)) beforeGets, gets, writes, writesTx, afterGets := driver.GroupActions(actions) c.runGets(ctx, beforeGets, errs, opts) ch := make(chan []error) go func() { ch <- c.bulkWrite(ctx, writes, errs, opts) }() ch2 := make(chan []error) go func() { ch2 <- c.txWrite(ctx, writesTx, errs, opts) }() c.runGets(ctx, gets, errs, opts) writeErrs := <-ch <-ch2 c.runGets(ctx, afterGets, errs, opts) alerr := driver.NewActionListError(errs) for _, werr := range writeErrs { alerr = append(alerr, indexedError{-1, werr}) } return alerr } type indexedError = struct { Index int Err error } func (c *collection) runGets(ctx context.Context, gets []*driver.Action, errs []error, opts *driver.RunActionsOptions) { // TODO(shantuo): figure out a reasonable batch size, there is no hard limit on // the item number or filter string length. The limit for bulk write batch size // is 100,000. for _, group := range driver.GroupByFieldPath(gets) { c.bulkFind(ctx, group, errs, opts) } } func (c *collection) bulkFind(ctx context.Context, gets []*driver.Action, errs []error, dopts *driver.RunActionsOptions) { // errors need to be mapped to the actions' indices. setErr := func(err error) { for _, get := range gets { if errs[get.Index] == nil { errs[get.Index] = err } } } opts := options.Find() if len(gets[0].FieldPaths) > 0 { opts.Projection = c.projectionDoc(gets[0].FieldPaths) } ids := bson.A{} idToAction := map[interface{}]*driver.Action{} for _, a := range gets { id, err := encodeValue(a.Key) if err != nil { errs[a.Index] = err } else { ids = append(ids, id) idToAction[id] = a } } if dopts.BeforeDo != nil { if err := dopts.BeforeDo(driver.AsFunc(opts)); err != nil { setErr(err) return } } cursor, err := c.coll.Find(ctx, bson.D{bson.E{Key: mongoIDField, Value: bson.D{{Key: "$in", Value: ids}}}}, opts) if err != nil { setErr(err) return } defer cursor.Close(ctx) found := make(map[*driver.Action]bool) for cursor.Next(ctx) { var m map[string]interface{} if err := cursor.Decode(&m); err != nil { continue } a := idToAction[m[mongoIDField]] errs[a.Index] = decodeDoc(m, a.Doc, c.idField, c.opts.LowercaseFields) found[a] = true } for _, a := range gets { if !found[a] { errs[a.Index] = gcerr.Newf(gcerr.NotFound, nil, "item with key %v not found", a.Key) } } } // Construct a mongo "projection document" from field paths. // Always include the revision field. func (c *collection) projectionDoc(fps [][]string) bson.D { proj := bson.D{{Key: c.revisionField, Value: 1}} for _, fp := range fps { path := c.toMongoFieldPath(fp) if path != c.revisionField { proj = append(proj, bson.E{Key: path, Value: 1}) } } return proj } func (c *collection) toMongoFieldPath(fp []string) string { if c.opts.LowercaseFields { sliceToLower(fp) } return strings.Join(fp, ".") } func sliceToLower(s []string) { for i, e := range s { s[i] = strings.ToLower(e) } } func (c *collection) prepareCreate(a *driver.Action) (mdoc, createdID interface{}, rev string, err error) { id := a.Key if id == nil { // Create a unique ID here. (The MongoDB Go client does this for us when calling InsertOne, // but not for BulkWrite.) id = primitive.NewObjectID() createdID = id } else { id, err = encodeValue(id) if err != nil { return nil, nil, "", err } } mdoc, rev, err = c.encodeDoc(a.Doc, id) if err != nil { return nil, nil, "", err } return mdoc, createdID, rev, nil } func (c *collection) prepareReplace(a *driver.Action) (filter bson.D, mdoc map[string]interface{}, rev string, err error) { id, err := encodeValue(a.Key) if err != nil { return nil, nil, "", err } filter, _, err = c.makeFilter(id, a.Doc) if err != nil { return nil, nil, "", err } mdoc, rev, err = c.encodeDoc(a.Doc, id) if err != nil { return nil, nil, "", err } return filter, mdoc, rev, nil } // encodeDoc encodes doc and sets its ID to the encoded value id. It also creates a new revision and sets it. // It returns the encoded document and the new revision. func (c *collection) encodeDoc(doc driver.Document, id interface{}) (map[string]interface{}, string, error) { mdoc, err := encodeDoc(doc, c.opts.LowercaseFields) if err != nil { return nil, "", err } if id != nil { if c.idField != "" { delete(mdoc, c.idField) } mdoc[mongoIDField] = id } var rev string if c.hasField(doc, c.revisionField) { rev = driver.UniqueString() mdoc[c.revisionField] = rev } return mdoc, rev, nil } func (c *collection) prepareUpdate(a *driver.Action) (filter bson.D, updateDoc map[string]bson.D, rev string, err error) { id, err := encodeValue(a.Key) if err != nil { return nil, nil, "", err } filter, _, err = c.makeFilter(id, a.Doc) if err != nil { return nil, nil, "", err } updateDoc, rev, err = c.newUpdateDoc(a.Mods, c.hasField(a.Doc, c.revisionField)) if err != nil { return nil, nil, "", err } return filter, updateDoc, rev, nil } func (c *collection) newUpdateDoc(mods []driver.Mod, writeRevision bool) (map[string]bson.D, string, error) { var ( sets bson.D unsets bson.D incs bson.D ) for _, m := range mods { key := c.toMongoFieldPath(m.FieldPath) if m.Value == nil { unsets = append(unsets, bson.E{Key: key, Value: ""}) } else if inc, ok := m.Value.(driver.IncOp); ok { val, err := encodeValue(inc.Amount) if err != nil { return nil, "", err } incs = append(incs, bson.E{Key: key, Value: val}) } else { val, err := encodeValue(m.Value) if err != nil { return nil, "", err } sets = append(sets, bson.E{Key: key, Value: val}) } } updateDoc := map[string]bson.D{} var rev string if writeRevision { rev = driver.UniqueString() sets = append(sets, bson.E{Key: c.revisionField, Value: rev}) } if len(sets) > 0 { updateDoc["$set"] = sets } if len(unsets) > 0 { updateDoc["$unset"] = unsets } if len(incs) > 0 { updateDoc["$inc"] = incs } return updateDoc, rev, nil } // makeFilter constructs a filter using the given encoded id and the document's revision field, if any. func (c *collection) makeFilter(id interface{}, doc driver.Document) (filter bson.D, rev interface{}, err error) { rev, err = doc.GetField(c.revisionField) if err != nil && gcerrors.Code(err) != gcerrors.NotFound { return nil, nil, err } // Only select the document with the given ID. filter = bson.D{bson.E{Key: "_id", Value: id}} // If the given document has a revision, it must match the stored document. if rev != nil { filter = append(filter, bson.E{Key: c.revisionField, Value: rev}) } return filter, rev, nil } // bulkWrite calls the Mongo driver's BulkWrite RPC in unordered mode with the // actions, which must be writes. // errs is the slice of errors indexed by the position of the action in the original // action list. bulkWrite populates this slice. In addition, bulkWrite returns a list // of errors that cannot be attributed to any single action. func (c *collection) bulkWrite(ctx context.Context, actions []*driver.Action, errs []error, dopts *driver.RunActionsOptions) []error { var ( models []mongo.WriteModel modelActions []*driver.Action // corresponding action for each model newIDs []interface{} // new IDs for Create actions, corresponding to models slice revs []string // new revisions, corresponding to models slice nDeletes int64 nNonCreateWrite int64 // total operations expected from Put, Replace and Update ) for _, a := range actions { var m mongo.WriteModel var err error var newID interface{} var rev string switch a.Kind { case driver.Create: m, newID, rev, err = c.newCreateModel(a) case driver.Delete: m, err = c.newDeleteModel(a) if err == nil { nDeletes++ } case driver.Replace, driver.Put: m, rev, err = c.newReplaceModel(a, a.Kind == driver.Put) if err == nil { nNonCreateWrite++ } case driver.Update: m, rev, err = c.newUpdateModel(a) if err == nil && m != nil { nNonCreateWrite++ } default: err = gcerr.Newf(gcerr.Internal, nil, "bad action %+v", a) } if err != nil { errs[a.Index] = err } else if m != nil { // m can be nil for a no-op update models = append(models, m) modelActions = append(modelActions, a) newIDs = append(newIDs, newID) revs = append(revs, rev) } } if len(models) == 0 { return nil } bopts := options.BulkWrite().SetOrdered(false) if dopts.BeforeDo != nil { asFunc := func(target interface{}) bool { switch t := target.(type) { case *[]mongo.WriteModel: *t = models case **options.BulkWriteOptions: *t = bopts default: return false } return true } if err := dopts.BeforeDo(asFunc); err != nil { return []error{err} } } // TODO(jba): improve independent execution. I think that even if BulkWrite returns an error, // some of the actions may have succeeded. var reterrs []error res, err := c.coll.BulkWrite(ctx, models, bopts) if err != nil { bwe, ok := err.(mongo.BulkWriteException) if !ok { // assume everything failed with this error return []error{err} } // The returned indexes of the WriteErrors are wrong. See https://jira.mongodb.org/browse/GODRIVER-1028. // Until it's fixed, use negative values for the indexes in the errors we return. for _, w := range bwe.WriteErrors { reterrs = append(reterrs, gcerr.Newf(translateMongoCode(w.Code), w, "%s", w.Message)) } return reterrs } for i, newID := range newIDs { if newID == nil { continue } a := modelActions[i] if err := a.Doc.SetField(c.idField, newID); err != nil { errs[a.Index] = err } } for i, rev := range revs { a := modelActions[i] if rev != "" && c.hasField(a.Doc, c.revisionField) { if err := a.Doc.SetField(c.revisionField, rev); err != nil && errs[a.Index] == nil { errs[a.Index] = err } } } if res.DeletedCount != nDeletes { // Some Delete actions failed. It's not an error if a Delete failed because // the document didn't exist, but it is an error if it failed because of a // precondition mismatch. Find all the documents with revisions we tried to delete; if // any are still present, that's an error. c.determineDeleteErrors(ctx, models, modelActions, errs) } if res.MatchedCount+res.UpsertedCount != nNonCreateWrite { reterrs = append(reterrs, gcerr.Newf(gcerr.NotFound, nil, "some writes failed (replaced %d, upserted %d, out of total %d)", res.MatchedCount, res.UpsertedCount, nNonCreateWrite)) } return reterrs } func (c *collection) txWrite(ctx context.Context, actions []*driver.Action, errs []error, dopts *driver.RunActionsOptions) []error { var ( models []mongo.WriteModel modelActions []*driver.Action // corresponding action for each model newIDs []interface{} // new IDs for Create actions, corresponding to models slice revs []string // new revisions, corresponding to models slice nDeletes int64 nNonCreateWrite int64 // total operations expected from Put, Replace and Update ) // all actions will fail atomically even if a single action fails setErr := func(err error) { for _, a := range actions { errs[a.Index] = err } } for _, a := range actions { var m mongo.WriteModel var err error var newID interface{} var rev string switch a.Kind { case driver.Create: m, newID, rev, err = c.newCreateModel(a) case driver.Delete: m, err = c.newDeleteModel(a) if err == nil { nDeletes++ } case driver.Replace, driver.Put: m, rev, err = c.newReplaceModel(a, a.Kind == driver.Put) if err == nil { nNonCreateWrite++ } case driver.Update: m, rev, err = c.newUpdateModel(a) if err == nil && m != nil { nNonCreateWrite++ } default: err = gcerr.Newf(gcerr.Internal, nil, "bad action %+v", a) } if err != nil { setErr(err) return nil } else if m != nil { // m can be nil for a no-op update models = append(models, m) modelActions = append(modelActions, a) newIDs = append(newIDs, newID) revs = append(revs, rev) } } if len(models) == 0 { return nil } bopts := options.BulkWrite().SetOrdered(true) if dopts.BeforeDo != nil { asFunc := func(target interface{}) bool { switch t := target.(type) { case *[]mongo.WriteModel: *t = models case **options.BulkWriteOptions: *t = bopts default: return false } return true } if err := dopts.BeforeDo(asFunc); err != nil { return []error{err} } } client := c.coll.Database().Client() session, err := client.StartSession() if err != nil { setErr(err) return nil } defer session.EndSession(ctx) callback := func(sessionCtx mongo.SessionContext) error { if err := session.StartTransaction(); err != nil { return err } res, err := c.coll.BulkWrite(sessionCtx, models, bopts) if res.DeletedCount != nDeletes { // Some Delete actions failed. It's not an error if a Delete failed because // the document didn't exist, but it is an error if it failed because of a // precondition mismatch. Find all the documents with revisions we tried to delete; if // any are still present, that's an error. if c.determineDeleteErrors(ctx, models, modelActions, errs) { setErr(gcerr.Newf(gcerr.FailedPrecondition, nil, "wrong revision for document to be deleted")) } } if res.MatchedCount+res.UpsertedCount != nNonCreateWrite { err = gcerr.Newf(gcerr.NotFound, nil, "some writes failed (replaced %d, upserted %d, out of total %d)", res.MatchedCount, res.UpsertedCount, nNonCreateWrite) } if err != nil { abortTxErr := session.AbortTransaction(context.Background()) if abortTxErr != nil { return err } return err } if err = session.CommitTransaction(sessionCtx); err != nil { return err } return nil } err = mongo.WithSession(ctx, session, callback) if err != nil { setErr(err) return nil } return nil } // determineDeleteErrors find the errors for the delete and return true if found any func (c *collection) determineDeleteErrors(ctx context.Context, models []mongo.WriteModel, actions []*driver.Action, errs []error) bool { // TODO(jba): do this concurrently. foundErr := false for i, m := range models { if dm, ok := m.(*mongo.DeleteOneModel); ok { filter := dm.Filter.(bson.D) if len(filter) > 1 { // Delete with both ID and revision. See if the document is still there. idOnlyFilter := filter[:1] // TODO(shantuo): use Find instead of FindOne. res := c.coll.FindOne(ctx, idOnlyFilter) // Assume an error means the document wasn't found. // That means either that it was deleted successfully, or that it never // existed. Either way, it's not an error. // TODO(jba): distinguish between not found and other errors. if res.Err() == nil { // The document exists, but we didn't delete it: assume we had the wrong // revision. errs[actions[i].Index] = gcerr.Newf(gcerr.FailedPrecondition, nil, "wrong revision for document with ID %v", actions[i].Key) foundErr = true } } } } return foundErr } func (c *collection) newCreateModel(a *driver.Action) (*mongo.InsertOneModel, interface{}, string, error) { mdoc, createdID, rev, err := c.prepareCreate(a) if err != nil { return nil, nil, "", err } return &mongo.InsertOneModel{Document: mdoc}, createdID, rev, nil } func (c *collection) newDeleteModel(a *driver.Action) (*mongo.DeleteOneModel, error) { id, err := encodeValue(a.Key) if err != nil { return nil, err } filter, _, err := c.makeFilter(id, a.Doc) if err != nil { return nil, err } return &mongo.DeleteOneModel{Filter: filter}, nil } func (c *collection) newReplaceModel(a *driver.Action, upsert bool) (*mongo.ReplaceOneModel, string, error) { filter, mdoc, rev, err := c.prepareReplace(a) if err != nil { return nil, "", err } return &mongo.ReplaceOneModel{ Filter: filter, Replacement: mdoc, Upsert: &upsert, }, rev, nil } func (c *collection) newUpdateModel(a *driver.Action) (*mongo.UpdateOneModel, string, error) { filter, updateDoc, rev, err := c.prepareUpdate(a) if err != nil { return nil, "", err } if filter == nil { // no-op return nil, "", nil } return &mongo.UpdateOneModel{Filter: filter, Update: updateDoc}, rev, nil } // RevisionToBytes implements driver.RevisionToBytes. func (c *collection) RevisionToBytes(rev interface{}) ([]byte, error) { s, ok := rev.(string) if !ok { return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "revision %v of type %[1]T is not a string", rev) } return []byte(s), nil } func (c *collection) hasField(doc driver.Document, field string) bool { if c.opts.LowercaseFields { return doc.HasFieldFold(field) } return doc.HasField(field) } // BytesToRevision implements driver.BytesToRevision. func (c *collection) BytesToRevision(b []byte) (interface{}, error) { return string(b), nil } // As implements driver.As. func (c *collection) As(i interface{}) bool { p, ok := i.(**mongo.Collection) if !ok { return false } *p = c.coll return true } // ErrorAs implements driver.Collection.ErrorAs func (c *collection) ErrorAs(err error, i interface{}) bool { switch e := err.(type) { case mongo.CommandError: if p, ok := i.(*mongo.CommandError); ok { *p = e return true } case mongo.BulkWriteError: if p, ok := i.(*mongo.BulkWriteError); ok { *p = e return true } case mongo.BulkWriteException: if p, ok := i.(*mongo.BulkWriteException); ok { *p = e return true } } return false } // ErrorCode implements driver.Collection.ErrorCode. func (c *collection) ErrorCode(err error) gcerrors.ErrorCode { if g, ok := err.(*gcerr.Error); ok { return g.Code } if err == mongo.ErrNoDocuments { return gcerrors.NotFound } if wexc, ok := err.(mongo.WriteException); ok && len(wexc.WriteErrors) > 0 { return translateMongoCode(wexc.WriteErrors[0].Code) } return gcerrors.Unknown } // Close implements driver.Collection.Close. func (c *collection) Close() error { return nil } // Error code for a write error when no documents match a filter. // (The Go mongo driver doesn't define an exported constant for this.) const mongoDupKeyCode = 11000 func translateMongoCode(code int) gcerrors.ErrorCode { switch code { case mongoDupKeyCode: return gcerrors.AlreadyExists default: return gcerrors.Unknown } } ================================================ FILE: docstore/mongodocstore/mongo_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package mongodocstore // To run these tests against a real MongoDB server, first run ./localmongo.sh. // Then wait a few seconds for the server to be ready. import ( "context" "errors" "fmt" "testing" "time" "github.com/google/go-cmp/cmp" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" "gocloud.dev/docstore" "gocloud.dev/docstore/driver" "gocloud.dev/docstore/drivertest" "gocloud.dev/internal/gcerr" "gocloud.dev/internal/testing/setup" ) const ( serverURIV3 = "mongodb://localhost:27020" serverURIV4 = "mongodb://localhost:27017/?directConnection=true" dbName = "docstore-test" collectionName1 = "docstore-test-1" collectionName2 = "docstore-test-2" collectionName3 = "docstore-test-3" ) type harness struct { db *mongo.Database supportAtomicWrites bool } func (h *harness) MakeCollection(ctx context.Context, kind drivertest.CollectionKind) (driver.Collection, error) { var coll *collection var err error switch kind { case drivertest.SingleKey: coll, err = newCollection(h.db.Collection(collectionName1), drivertest.KeyField, nil, nil) case drivertest.TwoKey: coll, err = newCollection(h.db.Collection(collectionName2), "", drivertest.HighScoreKey, nil) case drivertest.AltRev: coll, err = newCollection(h.db.Collection(collectionName1), drivertest.KeyField, nil, &Options{RevisionField: drivertest.AlternateRevisionField}) case drivertest.NoRev: coll, err = newCollection(h.db.Collection(collectionName1), drivertest.KeyField, nil, &Options{NoWriteQueryUpdateRevisions: true}) default: panic("bad kind") } if err != nil { return nil, err } // It seems that the client doesn't actually connect until the first RPC. So // time out quickly if there's a problem. tctx, cancel := context.WithTimeout(ctx, 5*time.Second) defer cancel() if err := coll.coll.Drop(tctx); err != nil { return nil, err } return coll, nil } func (h *harness) SupportsAtomicWrites() bool { return h.supportAtomicWrites } func (*harness) BeforeDoTypes() []interface{} { return []interface{}{ []mongo.WriteModel{}, &options.FindOptions{}, } } func (*harness) BeforeQueryTypes() []interface{} { return []interface{}{&options.FindOptions{}, bson.D{}} } func (*harness) RevisionsEqual(rev1, rev2 interface{}) bool { return rev1 == rev2 } func (*harness) Close() {} type codecTester struct{} func (codecTester) UnsupportedTypes() []drivertest.UnsupportedType { return []drivertest.UnsupportedType{drivertest.NanosecondTimes} } func (codecTester) DocstoreEncode(x interface{}) (interface{}, error) { m, err := encodeDoc(drivertest.MustDocument(x), true) if err != nil { return nil, err } return bson.Marshal(m) } func (codecTester) DocstoreDecode(value, dest interface{}) error { var m map[string]interface{} if err := bson.Unmarshal(value.([]byte), &m); err != nil { return err } return decodeDoc(m, drivertest.MustDocument(dest), mongoIDField, true) } func (codecTester) NativeEncode(x interface{}) (interface{}, error) { return bson.Marshal(x) } func (codecTester) NativeDecode(value, dest interface{}) error { return bson.Unmarshal(value.([]byte), dest) } type verifyAs struct{} func (verifyAs) Name() string { return "verify As" } func (verifyAs) CollectionCheck(coll *docstore.Collection) error { var mc *mongo.Collection if !coll.As(&mc) { return errors.New("Collection.As failed") } return nil } func (verifyAs) QueryCheck(it *docstore.DocumentIterator) error { var c *mongo.Cursor if !it.As(&c) { return errors.New("DocumentIterator.As failed") } return nil } func (verifyAs) ErrorCheck(c *docstore.Collection, err error) error { var cmderr mongo.CommandError var bwerr mongo.BulkWriteError var bwexc mongo.BulkWriteException if !c.ErrorAs(err, &cmderr) && !c.ErrorAs(err, &bwerr) && !c.ErrorAs(err, &bwexc) { if e, ok := err.(*gcerr.Error); ok { err = e.Unwrap() } return fmt.Errorf("Collection.ErrorAs failed, got %T", err) } return nil } func TestConformance(t *testing.T) { // mongo 3 doesn't support atomic writes t.Run("V3", func(t *testing.T) { testConformance(t, serverURIV3, false) }) t.Run("V4", func(t *testing.T) { testConformance(t, serverURIV4, true) }) } func testConformance(t *testing.T, serverURI string, supportsAtomicWrites bool) { client := newTestClient(t, serverURI) defer client.Disconnect(context.Background()) newHarness := func(context.Context, *testing.T) (drivertest.Harness, error) { return &harness{client.Database(dbName), supportsAtomicWrites}, nil } drivertest.RunConformanceTests(t, newHarness, codecTester{}, []drivertest.AsTest{verifyAs{}}) } func newTestClient(t *testing.T, serverURI string) *mongo.Client { if !setup.HasDockerTestEnvironment() { t.Skip("Skipping Mongo tests since the Mongo server is not available") } ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) defer cancel() client, err := Dial(ctx, serverURI) if err != nil { t.Fatalf("dialing to %s: %v", serverURI, err) } if err := client.Ping(ctx, nil); err != nil { t.Fatalf("connecting to %s: %v", serverURI, err) } return client } func BenchmarkConformance(b *testing.B) { ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) defer cancel() // Only run benchmark once (against MongoDB v4). client, err := Dial(ctx, serverURIV4) if err != nil { b.Fatalf("dialing to %s: %v", serverURIV4, err) } if err := client.Ping(ctx, nil); err != nil { b.Fatalf("connecting to %s: %v", serverURIV4, err) } defer func() { client.Disconnect(context.Background()) }() db := client.Database(dbName) coll, err := newCollection(db.Collection(collectionName3), drivertest.KeyField, nil, nil) if err != nil { b.Fatal(err) } drivertest.RunBenchmarks(b, docstore.NewCollection(coll)) } // Mongo-specific tests. // Testing the driver lower all fields in lowercaseFields mode to match the // behavior of the official Go MongoDB client library. func TestLowercaseFields(t *testing.T) { // Verify that the LowercaseFields option works in all cases. must := func(err error) { t.Helper() if err != nil { t.Fatal(err) } } ctx := context.Background() client := newTestClient(t, serverURIV4) defer func() { client.Disconnect(ctx) }() db := client.Database(dbName) dc, err := newCollection(db.Collection("lowercase-fields"), "id", nil, &Options{LowercaseFields: true}) if err != nil { t.Fatal(err) } coll := docstore.NewCollection(dc) defer coll.Close() defer drivertest.ClearCollection(t, coll) type S struct { ID, F, G int DocstoreRevision interface{} } // driver.Document.GetField is case-insensitive on structs. doc := drivertest.MustDocument(&S{ID: 1, DocstoreRevision: 1}) for _, f := range []string{"ID", "Id", "id", "DocstoreRevision", "docstorerevision"} { got, err := doc.GetField(f) if err != nil { t.Errorf("%s: %v", f, err) } if got != 1 { t.Errorf("got %q, want 1", got) } } check := func(got, want interface{}) { t.Helper() if !cmp.Equal(got, want) { t.Errorf("\ngot %+v\nwant %+v", got, want) } } sdoc := &S{ID: 1, F: 2, G: 3} must(coll.Put(ctx, sdoc)) if sdoc.DocstoreRevision == nil { t.Fatal("revision is nil") } // Get with a struct. got := S{ID: 1} must(coll.Get(ctx, &got)) check(got, S{ID: 1, F: 2, G: 3, DocstoreRevision: sdoc.DocstoreRevision}) // Get with map. got2 := map[string]interface{}{"id": 1} must(coll.Get(ctx, got2)) check(got2, map[string]interface{}{ "id": int64(1), "f": int64(2), "g": int64(3), "docstorerevision": sdoc.DocstoreRevision, }) // Field paths in Get. got3 := S{ID: 1} must(coll.Get(ctx, &got3, "G")) check(got3, S{ID: 1, F: 0, G: 3, DocstoreRevision: sdoc.DocstoreRevision}) // Field paths in Update. got4 := map[string]interface{}{"id": 1} udoc := &S{ID: 1} must(coll.Actions().Update(udoc, docstore.Mods{"F": 4}).Get(got4).Do(ctx)) check(got4, map[string]interface{}{ "id": int64(1), "f": int64(4), "g": int64(3), "docstorerevision": udoc.DocstoreRevision, }) // Query filters. var got5 S must(coll.Query().Where("ID", "=", 1).Where("G", ">", 2).Get(ctx).Next(ctx, &got5)) check(got5, S{ID: 1, F: 4, G: 3, DocstoreRevision: udoc.DocstoreRevision}) // Query orders. sdoc2 := &S{ID: 2, F: 5, G: 6} must(coll.Put(ctx, sdoc2)) var got6 S must(coll.Query().OrderBy("G", docstore.Descending).Get(ctx).Next(ctx, &got6)) check(got6, *sdoc2) // List queries // select F from coll WHERE G IN (50, 51) ORDER BY G DESC // test that F is 99 sdoc3 := &S{ID: 3, F: 99, G: 50} sdoc4 := &S{ID: 4, F: 99, G: 51} must(coll.Put(ctx, sdoc3)) must(coll.Put(ctx, sdoc4)) var got7, got8 S iter := coll.Query().Where("G", "in", []int{50, 51}).OrderBy("G", docstore.Descending).Get(ctx) must(iter.Next(ctx, &got7)) must(iter.Next(ctx, &got8)) check(got7, *sdoc4) check(got8, *sdoc3) // same query with not-in, expect to get sdoc2 back even though G is higher for sdoc3 and sdoc4 var got9 S must(coll.Query().Where("G", "not-in", []int{50, 51}).OrderBy("G", docstore.Descending).Get(ctx).Next(ctx, &got9)) check(got9, *sdoc2) } ================================================ FILE: docstore/mongodocstore/query.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package mongodocstore import ( "context" "fmt" "io" "strings" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" "gocloud.dev/docstore/driver" ) func (c *collection) RunGetQuery(ctx context.Context, q *driver.Query) (driver.DocumentIterator, error) { opts := options.Find() if len(q.FieldPaths) > 0 { opts.Projection = c.projectionDoc(q.FieldPaths) } if q.Offset > 0 { offset := int64(q.Offset) opts.Skip = &offset } if q.Limit > 0 { lim := int64(q.Limit) opts.Limit = &lim } if q.OrderByField != "" { f := q.OrderByField if c.opts.LowercaseFields { f = strings.ToLower(f) } var dir int if q.OrderAscending { dir = 1 } else { dir = -1 } opts.Sort = bson.D{{Key: f, Value: dir}} } filter := bson.D{} // must be a zero-length slice, not nil for _, f := range q.Filters { bf, err := c.filterToBSON(f) if err != nil { return nil, err } filter = append(filter, bf) } if q.BeforeQuery != nil { if err := q.BeforeQuery(driver.AsFunc(opts)); err != nil { return nil, err } } cursor, err := c.coll.Find(ctx, filter, opts) if err != nil { return nil, err } return &docIterator{cursor: cursor, idField: c.idField, ctx: ctx, lowercaseFields: c.opts.LowercaseFields}, nil } var mongoQueryOps = map[string]string{ driver.EqualOp: "$eq", ">": "$gt", ">=": "$gte", "<": "$lt", "<=": "$lte", "in": "$in", "not-in": "$nin", } // filtersToBSON converts a []driver.Filter to the MongoDB equivalent, expressed // as a bson.D (list of key-value pairs). func (c *collection) filtersToBSON(fs []driver.Filter) (bson.D, error) { filter := bson.D{} // must be a zero-length slice, not nil for _, f := range fs { bf, err := c.filterToBSON(f) if err != nil { return nil, err } filter = append(filter, bf) } return filter, nil } // filterToBSON converts a driver.Filter to the MongoDB equivalent, expressed // as a bson.E (key-value pair). // The MongoDB document corresponding to "field op value" is // // {field: {mop: value}} // // where mop is the mongo version of op (see the mongoQueryOps map above). func (c *collection) filterToBSON(f driver.Filter) (bson.E, error) { key := c.toMongoFieldPath(f.FieldPath) if c.idField != "" && key == c.idField { key = mongoIDField } val, err := encodeValue(f.Value) if err != nil { return bson.E{}, err } op := mongoQueryOps[f.Op] if op == "" { return bson.E{}, fmt.Errorf("no mongo operator for %q", f.Op) } return bson.E{Key: key, Value: bson.D{{Key: op, Value: val}}}, nil } type docIterator struct { cursor *mongo.Cursor idField string ctx context.Context // remember for Stop lowercaseFields bool } func (it *docIterator) Next(ctx context.Context, doc driver.Document) error { m, err := it.nextMap(ctx) if err != nil { return err } return decodeDoc(m, doc, it.idField, it.lowercaseFields) } func (it *docIterator) nextMap(ctx context.Context) (map[string]interface{}, error) { if !it.cursor.Next(ctx) { if it.cursor.Err() != nil { return nil, it.cursor.Err() } return nil, io.EOF } var m map[string]interface{} if err := it.cursor.Decode(&m); err != nil { return nil, fmt.Errorf("cursor.Decode: %v", err) } return m, nil } func (it *docIterator) Stop() { // Ignore error on Close. _ = it.cursor.Close(it.ctx) } func (it *docIterator) As(i interface{}) bool { p, ok := i.(**mongo.Cursor) if !ok { return false } *p = it.cursor return true } func (c *collection) QueryPlan(q *driver.Query) (string, error) { return "unknown", nil } func (c *collection) RunDeleteQuery(ctx context.Context, q *driver.Query) error { filter, err := c.filtersToBSON(q.Filters) if err != nil { return err } if q.BeforeQuery != nil { if err := q.BeforeQuery(driver.AsFunc(filter)); err != nil { return err } } _, err = c.coll.DeleteMany(ctx, filter) return err } func (c *collection) RunUpdateQuery(ctx context.Context, q *driver.Query, mods []driver.Mod) error { filter, err := c.filtersToBSON(q.Filters) if err != nil { return err } // TODO(#2458): provide an option for the user to choose whether or not to // update the revision. updateDoc, _, err := c.newUpdateDoc(mods, !c.opts.NoWriteQueryUpdateRevisions) if err != nil { return err } if q.BeforeQuery != nil { if err := q.BeforeQuery(driver.AsFunc(filter)); err != nil { return err } } _, err = c.coll.UpdateMany(ctx, filter, updateDoc) return err } ================================================ FILE: docstore/mongodocstore/testdata/README ================================================ This directory is here just so that the prerelease script (internal/testing/prerelease.sh) will run this package's tests with -record. ================================================ FILE: docstore/mongodocstore/urls.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package mongodocstore import ( "context" "errors" "fmt" "net/url" "os" "strings" "sync" "go.mongodb.org/mongo-driver/mongo" "gocloud.dev/docstore" ) func init() { docstore.DefaultURLMux().RegisterCollection(Scheme, new(defaultDialer)) } // defaultDialer dials a default Mongo server based on the environment variable // MONGO_SERVER_URL. type defaultDialer struct { mongoServerURL string mu sync.Mutex opener *URLOpener err error } func (o *defaultDialer) OpenCollectionURL(ctx context.Context, u *url.URL) (*docstore.Collection, error) { o.mu.Lock() defer o.mu.Unlock() currentEnv := os.Getenv("MONGO_SERVER_URL") if currentEnv == "" { o.err = errors.New("MONGO_SERVER_URL environment variable is not set") return nil, fmt.Errorf("open collection %s: %v", u, o.err) } // If MONGO_SERVER_URL has been updated, then update o.opener as well if currentEnv != o.mongoServerURL { client, err := Dial(ctx, currentEnv) if err != nil { o.err = fmt.Errorf("failed to dial default Mongo server at %q: %v", currentEnv, err) return nil, fmt.Errorf("open collection %s: %v", u, o.err) } o.mongoServerURL = currentEnv o.opener = &URLOpener{Client: client} } return o.opener.OpenCollectionURL(ctx, u) } // Scheme is the URL scheme mongodocstore registers its URLOpener under on // docstore.DefaultMux. const Scheme = "mongo" // URLOpener opens URLs like "mongo://mydb/mycollection". // See https://docs.mongodb.com/manual/reference/limits/#naming-restrictions for // naming restrictions. // // The URL Host is used as the database name. // The URL Path is used as the collection name. // // The following query parameters are supported: // // - id_field (optional): the field name to use for the "_id" field. type URLOpener struct { // A Client is a MongoDB client that performs operations on the db, must be // non-nil. Client *mongo.Client // Options specifies the options to pass to OpenCollection. Options Options } // OpenCollectionURL opens the Collection URL. func (o *URLOpener) OpenCollectionURL(ctx context.Context, u *url.URL) (*docstore.Collection, error) { q := u.Query() idField := q.Get("id_field") q.Del("id_field") o.Options.RevisionField = q.Get("revision_field") q.Del("revision_field") for param := range q { return nil, fmt.Errorf("open collection %s: invalid query parameter %q", u, param) } dbName := u.Host if dbName == "" { return nil, fmt.Errorf("open collection %s: URL must have a non-empty Host (database name)", u) } collName := strings.TrimPrefix(u.Path, "/") if collName == "" { return nil, fmt.Errorf("open collection %s: URL must have a non-empty Path (collection name)", u) } return OpenCollection(o.Client.Database(dbName).Collection(collName), idField, &o.Options) } ================================================ FILE: docstore/mongodocstore/urls_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package mongodocstore import ( "context" "net/url" "os" "testing" "gocloud.dev/docstore" ) func fakeConnectionStringInEnv() func() { oldURLVal := os.Getenv("MONGO_SERVER_URL") os.Setenv("MONGO_SERVER_URL", "mongodb://localhost") return func() { os.Setenv("MONGO_SERVER_URL", oldURLVal) } } func TestOpenCollectionURL(t *testing.T) { cleanup := fakeConnectionStringInEnv() defer cleanup() tests := []struct { URL string WantErr bool }{ // OK. {"mongo://mydb/mycollection", false}, // Missing database name. {"mongo:///mycollection", true}, // Missing collection name. {"mongo://mydb/", true}, // Passing id_field parameter. {"mongo://mydb/mycollection?id_field=foo", false}, // Passing revision field. {"mongo://mydb/mycollection?id_field=foo&revision_field=123", false}, // Invalid parameter. {"mongo://mydb/mycollection?param=value", true}, } ctx := context.Background() for _, test := range tests { d, err := docstore.OpenCollection(ctx, test.URL) if d != nil { defer d.Close() } if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } } } func TestDefaultDialerOpenCollectionURL(t *testing.T) { // Defer cleanup oldURLVal := os.Getenv("MONGO_SERVER_URL") defer os.Setenv("MONGO_SERVER_URL", oldURLVal) tests := []struct { name string currentMongoServerURL string currentWantErr bool newMongoServerURL string newWantErr bool }{ { name: "fail when MONGO_SERVER_URL is empty / unset", currentMongoServerURL: "", currentWantErr: true, newMongoServerURL: "", newWantErr: true, }, { name: "fail when updated MONGO_SERVER_URL is empty / unset", currentMongoServerURL: "mongodb://localhost", currentWantErr: false, newMongoServerURL: "", newWantErr: true, }, { name: "pass when MONGO_SERVER_URL is updated to new value", currentMongoServerURL: "mongodb://localhost", currentWantErr: false, newMongoServerURL: "mongodb://localhost:27017", newWantErr: false, }, } // Set starting conditions d := new(defaultDialer) ctx := context.Background() mongoURLString := "mongo://mydb/mycollection" u, err := url.Parse(mongoURLString) if err != nil { t.Error(err) } for _, test := range tests { t.Run(test.name, func(t *testing.T) { // Set MONGO_SERVER_URL os.Setenv("MONGO_SERVER_URL", test.currentMongoServerURL) _, err = d.OpenCollectionURL(ctx, u) if err != nil && !test.currentWantErr { t.Error(err) } // Update MONGO_SERVER_URL os.Setenv("MONGO_SERVER_URL", test.newMongoServerURL) _, err = d.OpenCollectionURL(ctx, u) if err != nil && !test.newWantErr { t.Error(err) } // Check if the MONGO_SERVER_URL was updated after rotation if !test.newWantErr { if d.mongoServerURL != test.newMongoServerURL { t.Errorf("expected updated MONGO_SERVER_URL to be set to: %s, but got: %s", test.newMongoServerURL, d.mongoServerURL) } } }) } } ================================================ FILE: docstore/otel_test.go ================================================ // Copyright 2019-2025 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package docstore_test import ( "context" "gocloud.dev/docstore" "gocloud.dev/docstore/memdocstore" "gocloud.dev/gcerrors" "gocloud.dev/internal/testing/oteltest" "testing" ) func TestOpenTelemetry(t *testing.T) { ctx := context.Background() // Setup the test exporter for both trace and metrics. te := oteltest.NewTestExporter(t, docstore.OpenTelemetryViews) defer te.Shutdown(ctx) // Open a collection for testing. coll, err := memdocstore.OpenCollection("_id", nil) if err != nil { t.Fatal(err) } defer coll.Close() // Test ActionList.Do by creating a document. if err := coll.Create(ctx, map[string]any{"_id": "a", "count": 0}); err != nil { t.Fatal(err) } // Test Query.Get. iter := coll.Query().Get(ctx) iter.Stop() spanStubs := te.GetSpans() metrics := te.GetMetrics(ctx) const ( pkgName = "gocloud.dev/docstore" driver = "gocloud.dev/docstore/memdocstore" ) diff := oteltest.Diff(spanStubs.Snapshots(), metrics, pkgName, driver, []oteltest.Call{ {Method: "ActionList.Do", Code: gcerrors.OK}, {Method: "Query.Get", Code: gcerrors.OK}, }) if diff != "" { t.Error(diff) } } ================================================ FILE: docstore/query.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package docstore import ( "context" "io" "reflect" "time" "go.opentelemetry.io/otel/trace" "gocloud.dev/docstore/driver" "gocloud.dev/internal/gcerr" ) // Query represents a query over a collection. type Query struct { coll *Collection dq *driver.Query err error } // Query creates a new Query over the collection. func (c *Collection) Query() *Query { return &Query{coll: c, dq: &driver.Query{}} } // Where expresses a condition on the query. // Valid ops are: "=", ">", "<", ">=", "<=, "in", "not-in". // Valid values are strings, integers, floating-point numbers, time.Time and boolean (only for "=", "in" and "not-in") values. func (q *Query) Where(fp FieldPath, op string, value any) *Query { if q.err != nil { return q } pfp, err := parseFieldPath(fp) if err != nil { q.err = err return q } validator, ok := validOp[op] if !ok { return q.invalidf("invalid filter operator: %q. Use one of: =, >, <, >=, <=, in, not-in", op) } if !validator(value) { return q.invalidf("invalid filter value: %v", value) } q.dq.Filters = append(q.dq.Filters, driver.Filter{ FieldPath: pfp, Op: op, Value: value, }) return q } type valueValidator func(any) bool var validOp = map[string]valueValidator{ "=": validEqualValue, ">": validFilterValue, "<": validFilterValue, ">=": validFilterValue, "<=": validFilterValue, "in": validFilterSlice, "not-in": validFilterSlice, } func validEqualValue(v any) bool { if v == nil { return false } if reflect.TypeOf(v).Kind() == reflect.Bool { return true } return validFilterValue(v) } func validFilterValue(v any) bool { if v == nil { return false } if _, ok := v.(time.Time); ok { return true } switch reflect.TypeOf(v).Kind() { case reflect.String: return true case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: return true case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: return true case reflect.Float32, reflect.Float64: return true default: return false } } func validFilterSlice(v any) bool { if v == nil || reflect.TypeOf(v).Kind() != reflect.Slice { return false } vv := reflect.ValueOf(v) for i := 0; i < vv.Len(); i++ { if !validEqualValue(vv.Index(i).Interface()) { return false } } return true } // Offset (also commonly referred to as `Skip`) specifies the number of // documents to skip before returning results. // n must be non-negative. // It is an error to specify Offset more than once in a Get query, or // at all in a Delete or Update query. func (q *Query) Offset(n int) *Query { if q.err != nil { return q } if n < 0 { return q.invalidf("offset value of %d must be non-negative", n) } if q.dq.Offset > 0 { return q.invalidf("query can have at most one offset clause") } q.dq.Offset = n return q } // Limit will limit the results to at most n documents. // n must be positive. // It is an error to specify Limit more than once in a Get query, or // at all in a Delete or Update query. func (q *Query) Limit(n int) *Query { if q.err != nil { return q } if n <= 0 { return q.invalidf("limit value of %d must be greater than zero", n) } if q.dq.Limit > 0 { return q.invalidf("query can have at most one limit clause") } q.dq.Limit = n return q } // Ascending and Descending are constants for use in the OrderBy method. const ( Ascending = "asc" Descending = "desc" ) // OrderBy specifies that the returned documents appear sorted by the given field in // the given direction. // A query can have at most one OrderBy clause. If it has none, the order of returned // documents is unspecified. // If a query has a Where clause and an OrderBy clause, the OrderBy clause's field // must appear in a Where clause. // It is an error to specify OrderBy in a Delete or Update query. func (q *Query) OrderBy(field, direction string) *Query { if q.err != nil { return q } if field == "" { return q.invalidf("OrderBy: empty field") } if direction != Ascending && direction != Descending { return q.invalidf("OrderBy: direction must be one of %q or %q", Ascending, Descending) } if q.dq.OrderByField != "" { return q.invalidf("a query can have at most one OrderBy") } q.dq.OrderByField = field q.dq.OrderAscending = (direction == Ascending) return q } // BeforeQuery takes a callback function that will be called before the Query is // executed to the underlying service's query functionality. The callback takes // a parameter, asFunc, that converts its argument to driver-specific types. // See https://gocloud.dev/concepts/as/ for background information. func (q *Query) BeforeQuery(f func(asFunc func(any) bool) error) *Query { q.dq.BeforeQuery = f return q } // Get returns an iterator for retrieving the documents specified by the query. If // field paths are provided, only those paths are set in the resulting documents. // // Call Stop on the iterator when finished. func (q *Query) Get(ctx context.Context, fps ...FieldPath) *DocumentIterator { return q.get(ctx, true, fps...) } // get implements Get, with optional OpenTelemetry tracing so it can be used internally. func (q *Query) get(ctx context.Context, withTracing bool, fps ...FieldPath) *DocumentIterator { dcoll := q.coll.driver if err := q.initGet(fps); err != nil { return &DocumentIterator{err: wrapError(dcoll, err)} } var err error if withTracing { var span trace.Span ctx, span = q.coll.tracer.Start(ctx, "Query.Get") defer func() { q.coll.tracer.End(ctx, span, err) }() } it, err := dcoll.RunGetQuery(ctx, q.dq) return &DocumentIterator{iter: it, coll: q.coll, err: wrapError(dcoll, err)} } func (q *Query) initGet(fps []FieldPath) error { if q.err != nil { return q.err } if err := q.coll.checkClosed(); err != nil { return errClosed } pfps, err := parseFieldPaths(fps) if err != nil { return err } q.dq.FieldPaths = pfps if q.dq.OrderByField != "" && len(q.dq.Filters) > 0 { found := false for _, f := range q.dq.Filters { if len(f.FieldPath) == 1 && f.FieldPath[0] == q.dq.OrderByField { found = true break } } if !found { return gcerr.Newf(gcerr.InvalidArgument, nil, "OrderBy field %s must appear in a Where clause", q.dq.OrderByField) } } return nil } func (q *Query) invalidf(format string, args ...any) *Query { q.err = gcerr.Newf(gcerr.InvalidArgument, nil, format, args...) return q } // DocumentIterator iterates over documents. // // Always call Stop on the iterator. type DocumentIterator struct { iter driver.DocumentIterator coll *Collection err error // already wrapped } // Next stores the next document in dst. It returns io.EOF if there are no more // documents. // Once Next returns an error, it will always return the same error. func (it *DocumentIterator) Next(ctx context.Context, dst Document) error { if it.err != nil { return it.err } if err := it.coll.checkClosed(); err != nil { it.err = err return it.err } ddoc, err := driver.NewDocument(dst) if err != nil { it.err = wrapError(it.coll.driver, err) return it.err } it.err = wrapError(it.coll.driver, it.iter.Next(ctx, ddoc)) return it.err } // Stop stops the iterator. Calling Next on a stopped iterator will return io.EOF, or // the error that Next previously returned. func (it *DocumentIterator) Stop() { if it.err != nil { return } it.err = io.EOF it.iter.Stop() } // As converts i to driver-specific types. // See https://gocloud.dev/concepts/as/ for background information, the "As" // examples in this package for examples, and the driver package // documentation for the specific types supported for that driver. func (it *DocumentIterator) As(i any) bool { if i == nil || it.iter == nil { return false } return it.iter.As(i) } // Plan describes how the query would be executed if its Get method were called with // the given field paths. Plan uses only information available to the client, so it // cannot know whether a service uses indexes or scans internally. func (q *Query) Plan(fps ...FieldPath) (string, error) { if err := q.initGet(fps); err != nil { return "", err } return q.coll.driver.QueryPlan(q.dq) } ================================================ FILE: docstore/query_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package docstore import ( "context" "strings" "testing" "gocloud.dev/docstore/driver" "gocloud.dev/gcerrors" ) func TestQueryValidFilter(t *testing.T) { for _, fp := range []FieldPath{"", ".a", "a..b", "b."} { q := Query{dq: &driver.Query{}} q.Where(fp, ">", 1) if got := gcerrors.Code(q.err); got != gcerrors.InvalidArgument { t.Errorf("fieldpath %q: got %s, want InvalidArgument", fp, got) } } for _, op := range []string{"==", "!="} { q := Query{dq: &driver.Query{}} q.Where("a", op, 1) if got := gcerrors.Code(q.err); got != gcerrors.InvalidArgument { t.Errorf("op %s: got %s, want InvalidArgument", op, got) } } for _, v := range []any{nil, 5 + 2i, []byte("x"), func() {}, []int{}, map[string]bool{}} { q := Query{dq: &driver.Query{}} q.Where("a", "=", v) if got := gcerrors.Code(q.err); got != gcerrors.InvalidArgument { t.Errorf("value %+v: got %s, want InvalidArgument", v, got) } } } func TestInvalidQuery(t *testing.T) { ctx := context.Background() // We detect that these queries are invalid before they reach the driver. c := &Collection{} for _, test := range []struct { desc string appliesToGet bool q *Query contains string // error text must contain this string }{ {"negative Limit", true, c.Query().Limit(-1), "limit"}, {"zero Limit", true, c.Query().Limit(0), "limit"}, {"two Limits", true, c.Query().Limit(1).Limit(2), "limit"}, {"negative Offset", true, c.Query().Offset(-1), "offset"}, {"two Offsets", true, c.Query().Offset(1).Offset(2), "offset"}, {"zero Offset and Limit", true, c.Query().Offset(0).Limit(0), "limit"}, {"negative Offset and Limit", true, c.Query().Offset(-1).Limit(-1), "offset"}, {"zero Offset and negative Limit", true, c.Query().Offset(0).Limit(-1), "limit"}, {"empty OrderBy field", true, c.Query().OrderBy("", Ascending), "empty field"}, {"bad OrderBy direction", true, c.Query().OrderBy("x", "y"), "direction"}, {"two OrderBys", true, c.Query().OrderBy("x", Ascending).OrderBy("y", Descending), "orderby"}, {"OrderBy not in Where", true, c.Query().OrderBy("x", Ascending).Where("y", ">", 1), "orderby"}, {"any Limit", false, c.Query().Limit(1), "limit"}, {"any Offset", false, c.Query().Offset(1), "offset"}, {"any OrderBy", false, c.Query().OrderBy("x", Descending), "orderby"}, } { check := func(err error) { if gcerrors.Code(err) != gcerrors.InvalidArgument { t.Errorf("%s: got %v, want InvalidArgument", test.desc, err) return } if !strings.Contains(strings.ToLower(err.Error()), test.contains) { t.Errorf("%s: got %q, wanted it to contain %q", test.desc, err.Error(), test.contains) } } if test.appliesToGet { check(test.q.Get(ctx).Next(ctx, nil)) } } } ================================================ FILE: docstore/urls.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package docstore import ( "context" "net/url" "gocloud.dev/internal/openurl" ) // CollectionURLOpener opens a collection of documents based on a URL. // The opener must not modify the URL argument. It must be safe to call from // multiple goroutines. // // This interface is generally implemented by types in driver packages. type CollectionURLOpener interface { OpenCollectionURL(ctx context.Context, u *url.URL) (*Collection, error) } // URLMux is a URL opener multiplexer. It matches the scheme of the URLs against // a set of registered schemes and calls the opener that matches the URL's // scheme. See https://gocloud.dev/concepts/urls/ for more information. // // The zero value is a multiplexer with no registered scheme. type URLMux struct { schemes openurl.SchemeMap } // CollectionSchemes returns a sorted slice of the registered Collection schemes. func (mux *URLMux) CollectionSchemes() []string { return mux.schemes.Schemes() } // ValidCollectionScheme returns true iff scheme has been registered for Collections. func (mux *URLMux) ValidCollectionScheme(scheme string) bool { return mux.schemes.ValidScheme(scheme) } // RegisterCollection registers the opener with the given scheme. If an opener // already exists for the scheme, RegisterCollection panics. func (mux *URLMux) RegisterCollection(scheme string, opener CollectionURLOpener) { mux.schemes.Register("docstore", "Collection", scheme, opener) } // OpenCollection calls OpenCollectionURL with the URL parsed from urlstr. // OpenCollection is safe to call from multiple goroutines. func (mux *URLMux) OpenCollection(ctx context.Context, urlstr string) (*Collection, error) { opener, u, err := mux.schemes.FromString("Collection", urlstr) if err != nil { return nil, err } return opener.(CollectionURLOpener).OpenCollectionURL(ctx, u) } // OpenCollectionURL dispatches the URL to the opener that is registered with // the URL's scheme. OpenCollectionURL is safe to call from multiple goroutines. func (mux *URLMux) OpenCollectionURL(ctx context.Context, u *url.URL) (*Collection, error) { opener, err := mux.schemes.FromURL("Collection", u) if err != nil { return nil, err } return opener.(CollectionURLOpener).OpenCollectionURL(ctx, u) } var defaultURLMux = new(URLMux) // DefaultURLMux returns the URLMux used by OpenCollection. // // Driver packages can use this to register their CollectionURLOpener on the mux. func DefaultURLMux() *URLMux { return defaultURLMux } // OpenCollection opens the collection identified by the URL given. // See the URLOpener documentation in driver subpackages for details // on supported URL formats, and https://gocloud.dev/concepts/urls/ for more // information. func OpenCollection(ctx context.Context, urlstr string) (*Collection, error) { return defaultURLMux.OpenCollection(ctx, urlstr) } ================================================ FILE: docstore/urls_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package docstore import ( "context" "errors" "net/url" "testing" "github.com/google/go-cmp/cmp" ) func TestURLMux(t *testing.T) { ctx := context.Background() mux := new(URLMux) fake := &fakeOpener{} mux.RegisterCollection("foo", fake) mux.RegisterCollection("err", fake) if diff := cmp.Diff(mux.CollectionSchemes(), []string{"err", "foo"}); diff != "" { t.Errorf("Schemes: %s", diff) } if !mux.ValidCollectionScheme("foo") || !mux.ValidCollectionScheme("err") { t.Errorf("ValidCollectionScheme didn't return true for valid scheme") } if mux.ValidCollectionScheme("foo2") || mux.ValidCollectionScheme("http") { t.Errorf("ValidCollectionScheme didn't return false for invalid scheme") } for _, tc := range []struct { name string url string wantErr bool }{ { name: "empty URL", wantErr: true, }, { name: "invalid URL", url: ":foo", wantErr: true, }, { name: "invalid URL no scheme", url: "foo", wantErr: true, }, { name: "unregistered scheme", url: "bar://mycollection", wantErr: true, }, { name: "func returns error", url: "err://mycollection", wantErr: true, }, { name: "no query options", url: "foo://mycollection", }, { name: "empty query options", url: "foo://mycollection?", }, { name: "using api scheme prefix", url: "docstore+foo://bar", }, { name: "using api+type scheme prefix", url: "docstore+collection+foo://bar", }, } { t.Run(tc.name, func(t *testing.T) { _, gotErr := mux.OpenCollection(ctx, tc.url) if (gotErr != nil) != tc.wantErr { t.Fatalf("got err %v, want error %v", gotErr, tc.wantErr) } if gotErr != nil { return } if got := fake.u.String(); got != tc.url { t.Errorf("got %q want %q", got, tc.url) } // Repeat with OpenCollectionURL. parsed, err := url.Parse(tc.url) if err != nil { t.Fatal(err) } _, gotErr = mux.OpenCollectionURL(ctx, parsed) if gotErr != nil { t.Fatalf("got err %v want nil", gotErr) } if got := fake.u.String(); got != tc.url { t.Errorf("got %q want %q", got, tc.url) } }) } } type fakeOpener struct { u *url.URL // last url passed to OpenCollectionURL } func (o *fakeOpener) OpenCollectionURL(ctx context.Context, u *url.URL) (*Collection, error) { if u.Scheme == "err" { return nil, errors.New("fail") } o.u = u return nil, nil } ================================================ FILE: gcerrors/errors.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package gcerrors provides support for getting error codes from // errors returned by Go CDK APIs. package gcerrors import ( "context" "errors" "gocloud.dev/internal/gcerr" ) // An ErrorCode describes the error's category. Programs should act upon an error's // code, not its message. type ErrorCode = gcerr.ErrorCode const ( // OK is returned by the Code function on a nil error. It is not a valid // code for an error. OK ErrorCode = gcerr.OK // Unknown means that the error could not be categorized. Unknown ErrorCode = gcerr.Unknown // NotFound means that the resource was not found. NotFound ErrorCode = gcerr.NotFound // AlreadyExists means that the resource exists, but it should not. AlreadyExists ErrorCode = gcerr.AlreadyExists // InvalidArguments means that a value given to a Go CDK API is incorrect. InvalidArgument ErrorCode = gcerr.InvalidArgument // Internal means that something unexpected happened. Internal errors always indicate // bugs in the Go CDK (or possibly the underlying service). Internal ErrorCode = gcerr.Internal // Unimplemented means that the feature is not implemented. Unimplemented ErrorCode = gcerr.Unimplemented // FailedPrecondition means that the system was in the wrong state. FailedPrecondition ErrorCode = gcerr.FailedPrecondition // PermissionDenied means that the caller does not have permission to execute the specified operation. PermissionDenied ErrorCode = gcerr.PermissionDenied // ResourceExhausted means that some resource has been exhausted, typically because a service resource limit // has been reached. ResourceExhausted ErrorCode = gcerr.ResourceExhausted // Canceled means that the operation was canceled. Canceled ErrorCode = gcerr.Canceled // DeadlinedExceeded means that the operation timed out. DeadlineExceeded ErrorCode = gcerr.DeadlineExceeded ) // Code returns the ErrorCode of err if it, or some error it wraps, is an *Error. // If err is context.Canceled or context.DeadlineExceeded, or wraps one of those errors, // it returns the Canceled or DeadlineExceeded codes, respectively. // If err is nil, it returns the special code OK. // Otherwise, it returns Unknown. func Code(err error) ErrorCode { if err == nil { return OK } var e *gcerr.Error if errors.As(err, &e) { return e.Code } if errors.Is(err, context.Canceled) { return Canceled } if errors.Is(err, context.DeadlineExceeded) { return DeadlineExceeded } return Unknown } ================================================ FILE: gcerrors/errors_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcerrors import ( "context" "io" "testing" "gocloud.dev/internal/gcerr" ) type wrappedErr struct { err error } func (w wrappedErr) Error() string { return "wrapped" } func (w wrappedErr) Unwrap() error { return w.err } func TestCode(t *testing.T) { for _, test := range []struct { in error want ErrorCode }{ {nil, OK}, {gcerr.New(AlreadyExists, nil, 1, ""), AlreadyExists}, {wrappedErr{gcerr.New(PermissionDenied, nil, 1, "")}, PermissionDenied}, {context.Canceled, Canceled}, {context.DeadlineExceeded, DeadlineExceeded}, {wrappedErr{context.Canceled}, Canceled}, {wrappedErr{context.DeadlineExceeded}, DeadlineExceeded}, {io.EOF, Unknown}, } { got := Code(test.in) if got != test.want { t.Errorf("%v: got %s, want %s", test.in, got, test.want) } } } ================================================ FILE: gcp/cloudsql/cloudsql.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package cloudsql contains Wire providers that are common across Google Cloud // SQL. package cloudsql // import "gocloud.dev/gcp/cloudsql" import ( "github.com/GoogleCloudPlatform/cloudsql-proxy/proxy/certs" "github.com/GoogleCloudPlatform/cloudsql-proxy/proxy/proxy" "github.com/google/wire" "gocloud.dev/gcp" "golang.org/x/oauth2" ) // CertSourceSet is a Wire provider set that binds a Cloud SQL proxy // certificate source from an GCP-authenticated HTTP client. var CertSourceSet = wire.NewSet( NewCertSource, wire.Bind(new(proxy.CertSource), new(*certs.RemoteCertSource))) // NewCertSource creates a local certificate source that uses the given // HTTP client. The client is assumed to make authenticated requests. func NewCertSource(c *gcp.HTTPClient) *certs.RemoteCertSource { return certs.NewCertSourceOpts(&c.Client, certs.RemoteOpts{}) } // NewCertSourceWithIAM creates a local certificate source, including Token source for token information used in // cert creation, that uses the given HTTP client. The client is assumed to make authenticated requests. func NewCertSourceWithIAM(c *gcp.HTTPClient, t oauth2.TokenSource) *certs.RemoteCertSource { return certs.NewCertSourceOpts(&c.Client, certs.RemoteOpts{EnableIAMLogin: true, TokenSource: t}) } ================================================ FILE: gcp/gcp.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package gcp provides fundamental Wire providers and types for Google Cloud Platform (GCP). package gcp // import "gocloud.dev/gcp" import ( "context" "errors" "net/http" "github.com/google/wire" "golang.org/x/oauth2" "golang.org/x/oauth2/google" ) // DefaultIdentity is a Wire provider set that provides the project ID // and token source from Application Default Credentials (ADC). var DefaultIdentity = wire.NewSet( CredentialsTokenSource, DefaultCredentials, DefaultProjectID) // ProjectID is a GCP Project ID. type ProjectID string // TokenSource wraps a GCP token source that provides Cloud-Platform- // scoped tokens. type TokenSource oauth2.TokenSource // HTTPClient is an HTTP client that makes requests authenticated with Cloud- // Platform-scoped authentication tokens. type HTTPClient struct { http.Client } // NewAnonymousHTTPClient creates a new anonymous HTTP client. func NewAnonymousHTTPClient(transport http.RoundTripper) *HTTPClient { return &HTTPClient{ Client: http.Client{ Transport: transport, }, } } // NewHTTPClient creates a new authenticated HTTP client. func NewHTTPClient(transport http.RoundTripper, ts TokenSource) (*HTTPClient, error) { if ts == nil { return nil, errors.New("gcp: no credentials available") } return &HTTPClient{ Client: http.Client{ Transport: &oauth2.Transport{ Base: transport, Source: ts, }, }, }, nil } // DefaultTransport returns http.DefaultTransport. func DefaultTransport() http.RoundTripper { return http.DefaultTransport } // DefaultCredentials obtains the default GCP credentials with Cloud Platform // scope. func DefaultCredentials(ctx context.Context) (*google.Credentials, error) { adc, err := google.FindDefaultCredentials(ctx, "https://www.googleapis.com/auth/cloud-platform") if err != nil { return nil, err } return adc, nil } // DefaultCredentialsWithParams obtains the default GCP credentials with the // specified parameters. The Scopes field in params will be overridden with // Cloud Platform scope if not set. func DefaultCredentialsWithParams(ctx context.Context, params google.CredentialsParams) (*google.Credentials, error) { if len(params.Scopes) == 0 { params.Scopes = []string{"https://www.googleapis.com/auth/cloud-platform"} } adc, err := google.FindDefaultCredentialsWithParams(ctx, params) if err != nil { return nil, err } return adc, nil } // CredentialsTokenSource extracts the token source from GCP credentials. func CredentialsTokenSource(creds *google.Credentials) TokenSource { if creds == nil { return nil } return TokenSource(creds.TokenSource) } // DefaultProjectID obtains the project ID from the default GCP credentials. func DefaultProjectID(creds *google.Credentials) (ProjectID, error) { if creds == nil { return "", errors.New("gcp: no project found in credentials") } return ProjectID(creds.ProjectID), nil } ================================================ FILE: gcp/gcp_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcp_test import ( "context" "testing" "gocloud.dev/gcp" "gocloud.dev/internal/testing/setup" "golang.org/x/oauth2/google" ) func TestNewHTTPClient(t *testing.T) { transport := gcp.DefaultTransport() _, err := gcp.NewHTTPClient(transport, nil) if err == nil { t.Error("got nil want error") } creds, err := setup.FakeGCPCredentials(context.Background()) if err != nil { t.Fatal(err) } _, err = gcp.NewHTTPClient(transport, gcp.CredentialsTokenSource(creds)) if err != nil { t.Error(err) } } func TestCredentialsTokenSource(t *testing.T) { ts := gcp.CredentialsTokenSource(nil) if ts != nil { t.Error("got non-nil TokenSource from nil creds, want nil") } creds, err := setup.FakeGCPCredentials(context.Background()) if err != nil { t.Fatal(err) } ts = gcp.CredentialsTokenSource(creds) if ts == nil { t.Error("got nil TokenSource from creds, want non-nil") } } func TestDefaultProjectID(t *testing.T) { _, err := gcp.DefaultProjectID(nil) if err == nil { t.Error("got nil error from nil creds, want error") } creds, err := setup.FakeGCPCredentials(context.Background()) if err != nil { t.Fatal(err) } _, err = gcp.DefaultProjectID(creds) if err != nil { t.Error(err) } } func TestDefaultCredentialsWithParams(t *testing.T) { cleanup := setup.FakeGCPDefaultCredentials(t) defer cleanup() ctx := context.Background() // Test with empty params (should use default scope and default universe domain) creds, err := gcp.DefaultCredentialsWithParams(ctx, google.CredentialsParams{}) if err != nil { t.Fatalf("DefaultCredentialsWithParams with empty params failed: %v", err) } if creds == nil { t.Error("got nil credentials, want non-nil") } // Verify default universe domain (googleapis.com) gotDomain, err := creds.GetUniverseDomain() if err != nil { t.Fatalf("GetUniverseDomain failed: %v", err) } if gotDomain != "googleapis.com" { t.Errorf("got default universe domain %q, want %q", gotDomain, "googleapis.com") } // Test with universe domain parameter. // Note: The fake "authorized_user" credentials may not support universe domain // overrides, but we can verify the function accepts the parameter without error. creds, err = gcp.DefaultCredentialsWithParams(ctx, google.CredentialsParams{ UniverseDomain: "example.com", }) if err != nil { t.Fatalf("DefaultCredentialsWithParams with universe domain failed: %v", err) } if creds == nil { t.Error("got nil credentials, want non-nil") } // The universe domain may not be set for authorized_user credential type, // but the function should not error. _, err = creds.GetUniverseDomain() if err != nil { t.Fatalf("GetUniverseDomain failed: %v", err) } // Test with custom scopes creds, err = gcp.DefaultCredentialsWithParams(ctx, google.CredentialsParams{ Scopes: []string{"https://www.googleapis.com/auth/devstorage.read_only"}, }) if err != nil { t.Fatalf("DefaultCredentialsWithParams with custom scopes failed: %v", err) } if creds == nil { t.Error("got nil credentials, want non-nil") } } ================================================ FILE: gcp/gcpcloud/example_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcpcloud_test import ( "context" "fmt" "log" "net/http" "github.com/google/wire" sdktrace "go.opentelemetry.io/otel/sdk/trace" "gocloud.dev/gcp/gcpcloud" "gocloud.dev/server" "gocloud.dev/server/health" ) // This is an example of how to bootstrap an HTTP server running on // Google Cloud Platform (GCP). The code in this function would be // placed in main(). func Example() { // Connect and authenticate to GCP. srv, cleanup, err := setup(context.Background()) if err != nil { log.Fatal(err) } defer cleanup() // Set up the HTTP routes. http.HandleFunc("/", greet) // Run the server. This behaves much like http.ListenAndServe, // including that passing a nil handler will use http.DefaultServeMux. log.Fatal(srv.ListenAndServe(":8080")) } // setup is a Wire injector function that creates an HTTP server // configured to send diagnostics to Stackdriver. The second return // value is a clean-up function that can be called to shut down any // resources created by setup. // // The body of this function will be filled in by running Wire. While // the name of the function does not matter, the signature signals to // Wire what provider functions to call. See // https://github.com/google/wire/blob/master/docs/guide.md#injectors // for more details. func setup(ctx context.Context) (*server.Server, func(), error) { wire.Build( // The GCP set includes all the default wiring for GCP, including // for *server.Server. gcpcloud.GCP, // Providing nil instructs the server to use the default sampling policy. wire.Value(sdktrace.Sampler(nil)), // Health checks can be added to delay your server reporting healthy // to the load balancer before critical dependencies are available. wire.Value([]health.Checker{}), ) return nil, nil, nil } // greet is an ordinary http.HandleFunc. func greet(w http.ResponseWriter, req *http.Request) { fmt.Fprintln(w, "Hello, World!") } ================================================ FILE: gcp/gcpcloud/gcpcloud.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package gcpcloud contains Wire providers for GCP services. package gcpcloud // import "gocloud.dev/gcp/gcpcloud" import ( "github.com/google/wire" "gocloud.dev/blob/gcsblob" "gocloud.dev/docstore/gcpfirestore" "gocloud.dev/gcp" "gocloud.dev/gcp/cloudsql" "gocloud.dev/pubsub/gcppubsub" "gocloud.dev/runtimevar/gcpruntimeconfig" "gocloud.dev/secrets/gcpkms" "gocloud.dev/server/sdserver" ) // GCP is a Wire provider set that includes all Google Cloud Platform services // in this repository and authenticates using Application Default Credentials. var GCP = wire.NewSet(Services, gcp.DefaultIdentity) // Services is a Wire provider set that includes the default wiring for all // Google Cloud Platform services in this repository, but does not include // credentials. Individual services may require additional configuration. var Services = wire.NewSet( gcp.DefaultTransport, gcp.NewHTTPClient, gcpruntimeconfig.Set, gcpkms.Set, gcppubsub.Set, gcsblob.Set, cloudsql.CertSourceSet, gcpfirestore.Set, sdserver.Set, ) ================================================ FILE: go.mod ================================================ // Copyright 2018-2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. module gocloud.dev go 1.25.0 require ( cloud.google.com/go/compute/metadata v0.9.0 cloud.google.com/go/firestore v1.21.0 cloud.google.com/go/iam v1.5.3 cloud.google.com/go/kms v1.26.0 cloud.google.com/go/pubsub v1.50.1 cloud.google.com/go/pubsub/v2 v2.4.0 cloud.google.com/go/secretmanager v1.16.0 cloud.google.com/go/storage v1.61.3 github.com/Azure/azure-amqp-common-go/v3 v3.2.3 github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0 github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1 github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys v0.10.0 github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.10.0 github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.4 github.com/Azure/go-amqp v1.5.1 github.com/GoogleCloudPlatform/cloudsql-proxy v1.37.13 github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.31.0 github.com/GoogleCloudPlatform/opentelemetry-operations-go/propagator v0.55.0 github.com/XSAM/otelsql v0.41.0 github.com/aws/aws-sdk-go-v2 v1.41.4 github.com/aws/aws-sdk-go-v2/config v1.32.12 github.com/aws/aws-sdk-go-v2/credentials v1.19.12 github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.20.35 github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.8.35 github.com/aws/aws-sdk-go-v2/feature/rds/auth v1.6.20 github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.22.8 github.com/aws/aws-sdk-go-v2/service/dynamodb v1.56.2 github.com/aws/aws-sdk-go-v2/service/kms v1.50.3 github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1 github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.41.4 github.com/aws/aws-sdk-go-v2/service/sns v1.39.14 github.com/aws/aws-sdk-go-v2/service/sqs v1.42.24 github.com/aws/aws-sdk-go-v2/service/ssm v1.68.3 github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 github.com/aws/smithy-go v1.24.2 github.com/fsnotify/fsnotify v1.9.0 github.com/go-sql-driver/mysql v1.9.3 github.com/google/go-cmp v0.7.0 github.com/google/go-replayers/grpcreplay v1.3.0 github.com/google/go-replayers/httpreplay v1.2.0 github.com/google/uuid v1.6.0 github.com/google/wire v0.7.0 github.com/googleapis/gax-go/v2 v2.19.0 github.com/lib/pq v1.12.0 go.opentelemetry.io/contrib/detectors/aws/ec2 v1.38.0 go.opentelemetry.io/contrib/detectors/gcp v1.42.0 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 go.opentelemetry.io/contrib/propagators/aws v1.42.0 go.opentelemetry.io/otel v1.42.0 go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.42.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0 go.opentelemetry.io/otel/metric v1.42.0 go.opentelemetry.io/otel/sdk v1.42.0 go.opentelemetry.io/otel/sdk/metric v1.42.0 go.opentelemetry.io/otel/trace v1.42.0 golang.org/x/crypto v0.49.0 golang.org/x/net v0.52.0 golang.org/x/oauth2 v0.36.0 golang.org/x/sync v0.20.0 golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da google.golang.org/api v0.272.0 google.golang.org/genproto v0.0.0-20260316180232-0b37fe3546d5 google.golang.org/grpc v1.79.3 google.golang.org/protobuf v1.36.11 ) require ( cel.dev/expr v0.25.1 // indirect cloud.google.com/go v0.123.0 // indirect cloud.google.com/go/auth v0.18.2 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/longrunning v0.8.0 // indirect cloud.google.com/go/monitoring v1.24.3 // indirect cloud.google.com/go/trace v1.11.7 // indirect filippo.io/edwards25519 v1.2.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 // indirect github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.7.1 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.7.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 // indirect github.com/aws/aws-sdk-go v1.55.8 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 // indirect github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21 // indirect github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.32.13 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 // indirect github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12 // indirect github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.11.20 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 // indirect github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20 // indirect github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect github.com/envoyproxy/go-control-plane/envoy v1.37.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/go-jose/go-jose/v4 v4.1.3 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/golang-jwt/jwt/v5 v5.3.1 // indirect github.com/google/martian/v3 v3.3.3 // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.14 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.42.0 // indirect go.opentelemetry.io/proto/otlp v1.10.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.1 // indirect golang.org/x/sys v0.42.0 // indirect golang.org/x/text v0.35.0 // indirect golang.org/x/time v0.15.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260316180232-0b37fe3546d5 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260316180232-0b37fe3546d5 // indirect ) ================================================ FILE: go.sum ================================================ cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= cloud.google.com/go/auth v0.18.2 h1:+Nbt5Ev0xEqxlNjd6c+yYUeosQ5TtEUaNcN/3FozlaM= cloud.google.com/go/auth v0.18.2/go.mod h1:xD+oY7gcahcu7G2SG2DsBerfFxgPAJz17zz2joOFF3M= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.21.0 h1:BhopUsx7kh6NFx77ccRsHhrtkbJUmDAxNY3uapWdjcM= cloud.google.com/go/firestore v1.21.0/go.mod h1:1xH6HNcnkf/gGyR8udd6pFO4Z7GWJSwLKQMx/u6UrP4= cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= cloud.google.com/go/kms v1.26.0 h1:cK9mN2cf+9V63D3H1f6koxTatWy39aTI/hCjz1I+adU= cloud.google.com/go/kms v1.26.0/go.mod h1:pHKOdFJm63hxBsiPkYtowZPltu9dW0MWvBa6IA4HM58= cloud.google.com/go/logging v1.13.2 h1:qqlHCBvieJT9Cdq4QqYx1KPadCQ2noD4FK02eNqHAjA= cloud.google.com/go/logging v1.13.2/go.mod h1:zaybliM3yun1J8mU2dVQ1/qDzjbOqEijZCn6hSBtKak= cloud.google.com/go/longrunning v0.8.0 h1:LiKK77J3bx5gDLi4SMViHixjD2ohlkwBi+mKA7EhfW8= cloud.google.com/go/longrunning v0.8.0/go.mod h1:UmErU2Onzi+fKDg2gR7dusz11Pe26aknR4kHmJJqIfk= cloud.google.com/go/monitoring v1.24.3 h1:dde+gMNc0UhPZD1Azu6at2e79bfdztVDS5lvhOdsgaE= cloud.google.com/go/monitoring v1.24.3/go.mod h1:nYP6W0tm3N9H/bOw8am7t62YTzZY+zUeQ+Bi6+2eonI= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/pubsub v1.50.1 h1:fzbXpPyJnSGvWXF1jabhQeXyxdbCIkXTpjXHy7xviBM= cloud.google.com/go/pubsub v1.50.1/go.mod h1:6YVJv3MzWJUVdvQXG081sFvS0dWQOdnV+oTo++q/xFk= cloud.google.com/go/pubsub/v2 v2.4.0 h1:oMKNiBQpXImRWnHYla9uSU66ZzByZwBSCJOEs/pTKVg= cloud.google.com/go/pubsub/v2 v2.4.0/go.mod h1:2lS/XQKq5qtOMs6kHBK+WX1ytUC36kLl2ig3zqsGUx8= cloud.google.com/go/secretmanager v1.16.0 h1:19QT7ZsLJ8FSP1k+4esQvuCD7npMJml6hYzilxVyT+k= cloud.google.com/go/secretmanager v1.16.0/go.mod h1://C/e4I8D26SDTz1f3TQcddhcmiC3rMEl0S1Cakvs3Q= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.61.3 h1:VS//ZfBuPGDvakfD9xyPW1RGF1Vy3BWUoVZXgW1KMOg= cloud.google.com/go/storage v1.61.3/go.mod h1:JtqK8BBB7TWv0HVGHubtUdzYYrakOQIsMLffZ2Z/HWk= cloud.google.com/go/trace v1.11.7 h1:kDNDX8JkaAG3R2nq1lIdkb7FCSi1rCmsEtKVsty7p+U= cloud.google.com/go/trace v1.11.7/go.mod h1:TNn9d5V3fQVf6s4SCveVMIBS2LJUqo73GACmq/Tky0s= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= filippo.io/edwards25519 v1.2.0 h1:crnVqOiS4jqYleHd9vaKZ+HKtHfllngJIiOpNpoJsjo= filippo.io/edwards25519 v1.2.0/go.mod h1:xzAOLCNug/yB62zG1bQ8uziwrIqIuxhctzJT18Q77mc= github.com/Azure/azure-amqp-common-go/v3 v3.2.3 h1:uDF62mbd9bypXWi19V1bN5NZEO84JqgmI5G73ibAmrk= github.com/Azure/azure-amqp-common-go/v3 v3.2.3/go.mod h1:7rPmbSfszeovxGfc5fSAXE4ehlXQZHpMja2OtxC2Tas= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0 h1:fou+2+WFTib47nS+nz/ozhEBnvU96bKHy6LjRsY4E28= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0/go.mod h1:t76Ruy8AHvUAC8GfMWJMa0ElSbuIcO03NLpynfbgsPA= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1 h1:Hk5QBxZQC1jb2Fwj6mpzme37xbCDdNTxU7O9eb5+LB4= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1/go.mod h1:IYus9qsFobWIc2YVwe/WPjcnyCkPKtnHAqUYeebc8z0= github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2 h1:yz1bePFlP5Vws5+8ez6T3HWXPmwOK7Yvq8QxDBD3SKY= github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2/go.mod h1:Pa9ZNPuoNu/GztvBSKk9J1cDJW6vk/n0zLtV4mgd8N8= github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 h1:9iefClla7iYpfYWdzPCRDozdmndjTm8DXdpCzPajMgA= github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2/go.mod h1:XtLgD3ZD34DAaVIIAyG3objl5DynM3CQ/vMcbBNJZGI= github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys v0.10.0 h1:m/sWOGCREuSBqg2htVQTBY8nOZpyajYztF0vUvSZTuM= github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys v0.10.0/go.mod h1:Pu5Zksi2KrU7LPbZbNINx6fuVrUp/ffvpxdDj+i8LeE= github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.7.1 h1:FbH3BbSb4bvGluTesZZ+ttN/MDsnMmQP36OSnDuSXqw= github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.7.1/go.mod h1:9V2j0jn9jDEkCkv8w/bKTNppX/d0FVA1ud77xCIP4KA= github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.10.0 h1:kE5kpeiSqu4jcCQ/sWuyggMXJ/pT6oQ99+8hwPmyeJ0= github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.10.0/go.mod h1:IAN3Z0DMtehoxoQQnfqg1891z1P7GNoDryKtFcAyMBI= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.1 h1:/Zt+cDPnpC3OVDm/JKLOs7M2DKmLRIIp3XIx9pHHiig= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.1/go.mod h1:Ng3urmn6dYe8gnbCMoHHVl5APYz2txho3koEkV2o2HA= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.4 h1:jWQK1GI+LeGGUKBADtcH2rRqPxYB1Ljwms5gFA2LqrM= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.4/go.mod h1:8mwH4klAm9DUgR2EEHyEEAQlRDvLPyg5fQry3y+cDew= github.com/Azure/go-amqp v0.17.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= github.com/Azure/go-amqp v1.5.1 h1:WyiPTz2C3zVvDL7RLAqwWdeoYhMtX62MZzQoP09fzsU= github.com/Azure/go-amqp v1.5.1/go.mod h1:vZAogwdrkbyK3Mla8m/CxSc/aKdnTZ4IbPxl51Y5WZE= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJTmL004Abzc5wDB5VtZG2PJk5ndYDgVacGqfirKxjM= github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE= github.com/AzureAD/microsoft-authentication-library-for-go v1.7.0 h1:4iB+IesclUXdP0ICgAabvq2FYLXrJWKx1fJQ+GxSo3Y= github.com/AzureAD/microsoft-authentication-library-for-go v1.7.0/go.mod h1:HKpQxkWaGLJ+D/5H8QRpyQXA1eKjxkFlOMwck5+33Jk= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/GoogleCloudPlatform/cloudsql-proxy v1.37.13 h1:cszvE7VCNLGIvcr7mOZ5lOIqITQfQnn4NXbuHozqO4c= github.com/GoogleCloudPlatform/cloudsql-proxy v1.37.13/go.mod h1:6IMmxkLFo8kvCZbG0egv30L6YSgeZwxjH0WVRMGAacQ= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0 h1:DHa2U07rk8syqvCge0QIGMCE1WxGj9njT44GH7zNJLQ= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 h1:UnDZ/zFfG1JhH/DqxIZYU/1CUAlTUScoXD/LcM2Ykk8= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0/go.mod h1:IA1C1U7jO/ENqm/vhi7V9YYpBsp+IMyqNrEN94N7tVc= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.31.0 h1:xQMhkBXPOKe/GzC6TctwlK2aNF+9k5VwFgdE83rBK2Y= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.31.0/go.mod h1:VLoD5cAsRQXsAFXpOZrrTGzbuMsntlspIZno4xor5Zg= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.55.0 h1:7t/qx5Ost0s0wbA/VDrByOooURhp+ikYwv20i9Y07TQ= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.55.0/go.mod h1:vB2GH9GAYYJTO3mEn8oYwzEdhlayZIdQz6zdzgUIRvA= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 h1:0s6TxfCu2KHkkZPnBfsQ2y5qia0jl3MMrmBhu3nCOYk= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0/go.mod h1:Mf6O40IAyB9zR/1J8nGDDPirZQQPbYJni8Yisy7NTMc= github.com/GoogleCloudPlatform/opentelemetry-operations-go/propagator v0.55.0 h1:0G1Faw/W6OirxOw2Kgz303+JuUgifQXYS5J21NtZxog= github.com/GoogleCloudPlatform/opentelemetry-operations-go/propagator v0.55.0/go.mod h1:8W5IW/jylevlBQKSWkh5ZMP2oy7yT9Pnfug6Y6W/9D8= github.com/XSAM/otelsql v0.41.0 h1:uZifjQhZhv5EDYJh+IVk1DiYxQZJBlNSen0MBFnfxB8= github.com/XSAM/otelsql v0.41.0/go.mod h1:NMQT0PiKoFILp9QgjQz+D5mvW+9mT0suR7OejqrtMaM= github.com/aws/aws-sdk-go v1.55.8 h1:JRmEUbU52aJQZ2AjX4q4Wu7t4uZjOu71uyNmaWlUkJQ= github.com/aws/aws-sdk-go v1.55.8/go.mod h1:ZkViS9AqA6otK+JBBNH2++sx1sgxrPKcSzPPvQkUtXk= github.com/aws/aws-sdk-go-v2 v1.41.4 h1:10f50G7WyU02T56ox1wWXq+zTX9I1zxG46HYuG1hH/k= github.com/aws/aws-sdk-go-v2 v1.41.4/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7 h1:3kGOqnh1pPeddVa/E37XNTaWJ8W6vrbYV9lJEkCnhuY= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7/go.mod h1:lyw7GFp3qENLh7kwzf7iMzAxDn+NzjXEAGjKS2UOKqI= github.com/aws/aws-sdk-go-v2/config v1.32.12 h1:O3csC7HUGn2895eNrLytOJQdoL2xyJy0iYXhoZ1OmP0= github.com/aws/aws-sdk-go-v2/config v1.32.12/go.mod h1:96zTvoOFR4FURjI+/5wY1vc1ABceROO4lWgWJuxgy0g= github.com/aws/aws-sdk-go-v2/credentials v1.19.12 h1:oqtA6v+y5fZg//tcTWahyN9PEn5eDU/Wpvc2+kJ4aY8= github.com/aws/aws-sdk-go-v2/credentials v1.19.12/go.mod h1:U3R1RtSHx6NB0DvEQFGyf/0sbrpJrluENHdPy1j/3TE= github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.20.35 h1:CQ2kB9Q4xQ2PDBmn+KCr/pw1DvK7pH6NkR2nl2KV7ng= github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.20.35/go.mod h1:ypTMB9nZhpqfMeRVesGj4dEknIg0YS+aXGtLMidw/Ek= github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.8.35 h1:qxsbiWRtwChp/rrSHMfYoosVDVWRICoYXoDdczaLFiI= github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.8.35/go.mod h1:SomvXQRUKYBML53k4LqIgszKJKz8TdUwi/Zwig7JhfU= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 h1:zOgq3uezl5nznfoK3ODuqbhVg1JzAGDUhXOsU0IDCAo= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20/go.mod h1:z/MVwUARehy6GAg/yQ1GO2IMl0k++cu1ohP9zo887wE= github.com/aws/aws-sdk-go-v2/feature/rds/auth v1.6.20 h1:nBtAkfvLanKNwKfmsxfpLqYAjKpTAO9yRfuXAKconUY= github.com/aws/aws-sdk-go-v2/feature/rds/auth v1.6.20/go.mod h1:wtCkeFPPKHdxFPrZGkdT5tKR4boa3GvW54sYdGNWPHg= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.22.8 h1:nuc44j+otOY0d1e+CWwB6zul57d2YEGlgCyiq3SL0lI= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.22.8/go.mod h1:qSFgGCN8fjdhvlLhTPZdWRWXbwfeZZWF2FEaIplYPhE= github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 h1:CNXO7mvgThFGqOFgbNAP2nol2qAWBOGfqR/7tQlvLmc= github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20/go.mod h1:oydPDJKcfMhgfcgBUZaG+toBbwy8yPWubJXBVERtI4o= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 h1:tN6W/hg+pkM+tf9XDkWUbDEjGLb+raoBMFsTodcoYKw= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20/go.mod h1:YJ898MhD067hSHA6xYCx5ts/jEd8BSOLtQDL3iZsvbc= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 h1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY= github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21 h1:SwGMTMLIlvDNyhMteQ6r8IJSBPlRdXX5d4idhIGbkXA= github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21/go.mod h1:UUxgWxofmOdAMuqEsSppbDtGKLfR04HGsD0HXzvhI1k= github.com/aws/aws-sdk-go-v2/service/dynamodb v1.56.2 h1:xi/ECwajy2mixviBD7bKAlGGSwzEaFKX2wIhrZt9NGw= github.com/aws/aws-sdk-go-v2/service/dynamodb v1.56.2/go.mod h1:dLREOeW66eVaaGIOi2ZlLHDgkR3nuJ02rd00j0YSlBE= github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.32.13 h1:xQ9dX2jxVm14uNVe0WomcCSza832ytYWt1ZBu2LrBLM= github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.32.13/go.mod h1:D5up2/CMSP4sF8ESBWla6gJvIMySJi8dYYAaED4oTCc= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 h1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12 h1:qtJZ70afD3ISKWnoX3xB0J2otEqu3LqicRcDBqsj0hQ= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12/go.mod h1:v2pNpJbRNl4vEUWEh5ytQok0zACAKfdmKS51Hotc3pQ= github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.11.20 h1:ru+seMuylHiNZlvgZei83eD8h37hRjm1XIMOEmcV0BU= github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.11.20/go.mod h1:ihZMtPTKoX/ugQRHbui6zNdSgVYN1KY2Dgwb2d3hXlc= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 h1:2HvVAIq+YqgGotK6EkMf+KIEqTISmTYh5zLpYyeTo1Y= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20/go.mod h1:V4X406Y666khGa8ghKmphma/7C0DAtEQYhkq9z4vpbk= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20 h1:siU1A6xjUZ2N8zjTHSXFhB9L/2OY8Dqs0xXiLjF30jA= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20/go.mod h1:4TLZCmVJDM3FOu5P5TJP0zOlu9zWgDWU7aUxWbr+rcw= github.com/aws/aws-sdk-go-v2/service/kms v1.50.3 h1:s/zDSG/a/Su9aX+v0Ld9cimUCdkr5FWPmBV8owaEbZY= github.com/aws/aws-sdk-go-v2/service/kms v1.50.3/go.mod h1:/iSgiUor15ZuxFGQSTf3lA2FmKxFsQoc2tADOarQBSw= github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1 h1:csi9NLpFZXb9fxY7rS1xVzgPRGMt7MSNWeQ6eo247kE= github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1/go.mod h1:qXVal5H0ChqXP63t6jze5LmFalc7+ZE7wOdLtZ0LCP0= github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.41.4 h1:9aZbO86sraeCIHHCpZhxwN9tnVy9POkSKzi4/TpT54A= github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.41.4/go.mod h1:cxiXDhEzIq7Xx1BtmC4lGBK3SwAZ79+EUWiKawYHo14= github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 h1:0GFOLzEbOyZABS3PhYfBIx2rNBACYcKty+XGkTgw1ow= github.com/aws/aws-sdk-go-v2/service/signin v1.0.8/go.mod h1:LXypKvk85AROkKhOG6/YEcHFPoX+prKTowKnVdcaIxE= github.com/aws/aws-sdk-go-v2/service/sns v1.39.14 h1:p8WdWDh5AwSZdp19Haa3XMyPCICi9Z375a/Nu3IIEZY= github.com/aws/aws-sdk-go-v2/service/sns v1.39.14/go.mod h1:NKVY7DER6VXHkt2I/ycmHakALNboi3Rqwt4eEf/1Cnk= github.com/aws/aws-sdk-go-v2/service/sqs v1.42.24 h1:JP2wjWGmUp8lTCZb13Dv0Eciyc1jbO8pd0HZVMHFlrc= github.com/aws/aws-sdk-go-v2/service/sqs v1.42.24/go.mod h1:Ql9ziDutk8ERAN9HMaYANCW3lop451ppebkxEJMLCTM= github.com/aws/aws-sdk-go-v2/service/ssm v1.68.3 h1:bBoWhx8lsFLTXintRX64ZBXcmFZbGqUmaPUrjXECqIc= github.com/aws/aws-sdk-go-v2/service/ssm v1.68.3/go.mod h1:rcRkKbUJ2437WuXdq9fbj+MjTudYWzY9Ct8kiBbN8a8= github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 h1:kiIDLZ005EcKomYYITtfsjn7dtOwHDOFy7IbPXKek2o= github.com/aws/aws-sdk-go-v2/service/sso v1.30.13/go.mod h1:2h/xGEowcW/g38g06g3KpRWDlT+OTfxxI0o1KqayAB8= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 h1:jzKAXIlhZhJbnYwHbvUQZEB8KfgAEuG0dc08Bkda7NU= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17/go.mod h1:Al9fFsXjv4KfbzQHGe6V4NZSZQXecFcvaIF4e70FoRA= github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 h1:Cng+OOwCHmFljXIxpEVXAGMnBia8MSU6Ch5i9PgBkcU= github.com/aws/aws-sdk-go-v2/service/sts v1.41.9/go.mod h1:LrlIndBDdjA/EeXeyNBle+gyCwTlizzW5ycgWnvIxkk= github.com/aws/smithy-go v1.24.2 h1:FzA3bu/nt/vDvmnkg+R8Xl46gmzEDam6mZ1hzmwXFng= github.com/aws/smithy-go v1.24.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os8IaYg++6uMOdKK83QtkkvJik= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4= github.com/coder/websocket v1.8.13 h1:f3QZdXy7uGVz+4uCJy2nTZyM0yTBj8yANEHhqlXZ9FE= github.com/coder/websocket v1.8.13/go.mod h1:LNVeNrXQZfe5qhS9ALED3uA+l5pPqvwXg3CKoDBB2gs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU= github.com/envoyproxy/go-control-plane/envoy v1.37.0 h1:u3riX6BoYRfF4Dr7dwSOroNfdSbEPe9Yyl09/B6wBrQ= github.com/envoyproxy/go-control-plane/envoy v1.37.0/go.mod h1:DReE9MMrmecPy+YvQOAOHNYMALuowAnbjjEMkkWOi6A= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds= github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo= github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU= github.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63YCY= github.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/go-replayers/grpcreplay v1.3.0 h1:1Keyy0m1sIpqstQmgz307zhiJ1pV4uIlFds5weTmxbo= github.com/google/go-replayers/grpcreplay v1.3.0/go.mod h1:v6NgKtkijC0d3e3RW8il6Sy5sqRVUwoQa4mHOGEy8DI= github.com/google/go-replayers/httpreplay v1.2.0 h1:VM1wEyyjaoU53BwrOnaf9VhAyQQEEioJvFYxYcLRKzk= github.com/google/go-replayers/httpreplay v1.2.0/go.mod h1:WahEFFZZ7a1P4VM1qEeHy+tME4bwyqPcwWbNlUI1Mcg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/wire v0.7.0 h1:JxUKI6+CVBgCO2WToKy/nQk0sS+amI9z9EjVmdaocj4= github.com/google/wire v0.7.0/go.mod h1:n6YbUQD9cPKTnHXEBN2DXlOp/mVADhVErcMFb0v3J18= github.com/googleapis/enterprise-certificate-proxy v0.3.14 h1:yh8ncqsbUY4shRD5dA6RlzjJaT4hi3kII+zYw8wmLb8= github.com/googleapis/enterprise-certificate-proxy v0.3.14/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.19.0 h1:fYQaUOiGwll0cGj7jmHT/0nPlcrZDFPrZRhTsoCr8hE= github.com/googleapis/gax-go/v2 v2.19.0/go.mod h1:w2ROXVdfGEVFXzmlciUU4EdjHgWvB5h2n6x/8XSTTJA= github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs= github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/keybase/go-keychain v0.0.1 h1:way+bWYa6lDppZoZcgMbYsvC7GxljxrskdNInRtuthU= github.com/keybase/go-keychain v0.0.1/go.mod h1:PdEILRW3i9D8JcdM+FmY6RwkHGnhHxXwkPPMeUgOK1k= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/lib/pq v1.12.0 h1:mC1zeiNamwKBecjHarAr26c/+d8V5w/u4J0I/yASbJo= github.com/lib/pq v1.12.0/go.mod h1:/p+8NSbOcwzAEI7wiMXFlgydTwcgTr3OSKMsD2BitpA= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.einride.tech/aip v0.79.0 h1:19zdPlZzlUvxOA8syAFw4LkdJdXepzyTl6gt9XEeqdU= go.einride.tech/aip v0.79.0/go.mod h1:E8+wdTApA70odnpFzJgsGogHozC2JCIhFJBKPr8bVig= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/detectors/aws/ec2 v1.38.0 h1:gSqtaXUzONG+J3PutTnKpLVLpKLsX+FztJwxSFQ15PU= go.opentelemetry.io/contrib/detectors/aws/ec2 v1.38.0/go.mod h1:AqLDNPbKVFwdXy2/Xu2EYElVHO7ghhbEhKCCWymjpMI= go.opentelemetry.io/contrib/detectors/gcp v1.42.0 h1:kpt2PEJuOuqYkPcktfJqWWDjTEd/FNgrxcniL7kQrXQ= go.opentelemetry.io/contrib/detectors/gcp v1.42.0/go.mod h1:W9zQ439utxymRrXsUOzZbFX4JhLxXU4+ZnCt8GG7yA8= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0 h1:yI1/OhfEPy7J9eoa6Sj051C7n5dvpj0QX8g4sRchg04= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0/go.mod h1:NoUCKYWK+3ecatC4HjkRktREheMeEtrXoQxrqYFeHSc= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 h1:OyrsyzuttWTSur2qN/Lm0m2a8yqyIjUVBZcxFPuXq2o= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0/go.mod h1:C2NGBr+kAB4bk3xtMXfZ94gqFDtg/GkI7e9zqGh5Beg= go.opentelemetry.io/contrib/propagators/aws v1.42.0 h1:Kbr3xDxs6kcxp5ThXTKWK2OtwLhNoXBVtqguNYcsZL0= go.opentelemetry.io/contrib/propagators/aws v1.42.0/go.mod h1:Jzw9hZHtxdpCN7x8S17UH59X/EiFivp6VXLs9bdM1OQ= go.opentelemetry.io/otel v1.42.0 h1:lSQGzTgVR3+sgJDAU/7/ZMjN9Z+vUip7leaqBKy4sho= go.opentelemetry.io/otel v1.42.0/go.mod h1:lJNsdRMxCUIWuMlVJWzecSMuNjE7dOYyWlqOXWkdqCc= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.42.0 h1:MdKucPl/HbzckWWEisiNqMPhRrAOQX8r4jTuGr636gk= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.42.0/go.mod h1:RolT8tWtfHcjajEH5wFIZ4Dgh5jpPdFXYV9pTAk/qjc= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.42.0 h1:THuZiwpQZuHPul65w4WcwEnkX2QIuMT+UFoOrygtoJw= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.42.0/go.mod h1:J2pvYM5NGHofZ2/Ru6zw/TNWnEQp5crgyDeSrYpXkAw= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0 h1:zWWrB1U6nqhS/k6zYB74CjRpuiitRtLLi68VcgmOEto= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0/go.mod h1:2qXPNBX1OVRC0IwOnfo1ljoid+RD0QK3443EaqVlsOU= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.40.0 h1:ZrPRak/kS4xI3AVXy8F7pipuDXmDsrO8Lg+yQjBLjw0= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.40.0/go.mod h1:3y6kQCWztq6hyW8Z9YxQDDm0Je9AJoFar2G0yDcmhRk= go.opentelemetry.io/otel/metric v1.42.0 h1:2jXG+3oZLNXEPfNmnpxKDeZsFI5o4J+nz6xUlaFdF/4= go.opentelemetry.io/otel/metric v1.42.0/go.mod h1:RlUN/7vTU7Ao/diDkEpQpnz3/92J9ko05BIwxYa2SSI= go.opentelemetry.io/otel/sdk v1.42.0 h1:LyC8+jqk6UJwdrI/8VydAq/hvkFKNHZVIWuslJXYsDo= go.opentelemetry.io/otel/sdk v1.42.0/go.mod h1:rGHCAxd9DAph0joO4W6OPwxjNTYWghRWmkHuGbayMts= go.opentelemetry.io/otel/sdk/metric v1.42.0 h1:D/1QR46Clz6ajyZ3G8SgNlTJKBdGp84q9RKCAZ3YGuA= go.opentelemetry.io/otel/sdk/metric v1.42.0/go.mod h1:Ua6AAlDKdZ7tdvaQKfSmnFTdHx37+J4ba8MwVCYM5hc= go.opentelemetry.io/otel/trace v1.42.0 h1:OUCgIPt+mzOnaUTpOQcBiM/PLQ/Op7oq6g4LenLmOYY= go.opentelemetry.io/otel/trace v1.42.0/go.mod h1:f3K9S+IFqnumBkKhRJMeaZeNk9epyhnCmQh/EysQCdc= go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g= go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= google.golang.org/api v0.272.0 h1:eLUQZGnAS3OHn31URRf9sAmRk3w2JjMx37d2k8AjJmA= google.golang.org/api v0.272.0/go.mod h1:wKjowi5LNJc5qarNvDCvNQBn3rVK8nSy6jg2SwRwzIA= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20260316180232-0b37fe3546d5 h1:JNfk58HZ8lfmXbYK2vx/UvsqIL59TzByCxPIX4TDmsE= google.golang.org/genproto v0.0.0-20260316180232-0b37fe3546d5/go.mod h1:x5julN69+ED4PcFk/XWayw35O0lf/nGa4aNgODCmNmw= google.golang.org/genproto/googleapis/api v0.0.0-20260316180232-0b37fe3546d5 h1:CogIeEXn4qWYzzQU0QqvYBM8yDF9cFYzDq9ojSpv0Js= google.golang.org/genproto/googleapis/api v0.0.0-20260316180232-0b37fe3546d5/go.mod h1:EIQZ5bFCfRQDV4MhRle7+OgjNtZ6P1PiZBgAKuxXu/Y= google.golang.org/genproto/googleapis/rpc v0.0.0-20260316180232-0b37fe3546d5 h1:aJmi6DVGGIStN9Mobk/tZOOQUBbj0BPjZjjnOdoZKts= google.golang.org/genproto/googleapis/rpc v0.0.0-20260316180232-0b37fe3546d5/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= ================================================ FILE: gocloud.code-workspace ================================================ { "folders": [ { "path": "." }, { "path": "internal/cmd/gocdk" }, { "path": "internal/website" }, { "path": "samples" } ], "settings": { "cSpell.words": [ "Hashicorp", "MongoDB", "MongoDB's", "NATS", "Nanos", "Newf", "RPC", "RPCs", "Shopify", "URL's", "ack", "acked", "acking", "acks", "amazonaws", "amqp", "appengine", "awserr", "awserror", "awskms", "awsmysql", "awsparamstore", "awspostgres", "awssns", "awssnssqs", "awssqs", "azuresb", "biome's", "bson", "cloudkms", "curr", "dbname", "dynamodb", "etag", "etcd", "etcdvar", "fsnotify", "gRPC", "gcaws", "gcerr", "gcerrors", "gcpkms", "gcpmysql", "gcppostgres", "gcppubsub", "gcsblob", "gocdk", "gocloud", "googleapis", "healthz", "knative", "memblob", "mempubsub", "mongodocstore", "msg", "msgs", "mybucket", "mycfg", "mycollection", "mydb", "myinstance", "mykey", "myproject", "mysub", "mysubject", "mysubscription", "mytable", "mytopic", "myvar", "nackable", "nacked", "nacking", "nacks", "natspubsub", "oauth", "oauth2", "ocsql", "pctx", "postgres", "protobuf", "protos", "ptypes", "sarama", "sess", "specifier", "specifier's", "structs", "tfstate", "unacked", "uploader", "upsert", "usagef", "uuid", "vals", "vkit", "waitc", "xerrors" ], "files.associations": { "*.htmlt": "html" } } } ================================================ FILE: internal/docs/README.md ================================================ # Docs This is the documentation for developers of the Go CDK, describing various coding practices and project processes. - [Design Decisions](design.md) - [Releases](release.md) ================================================ FILE: internal/docs/design.md ================================================ # Design Decisions This document outlines important design decisions made for this repository and attempts to provide succinct rationales. Recording these decisions helps maintain consistency across packages, especially as an open source project where contributors can join at any point during development. A broad design goal for the Go Cloud Development Kit (Go CDK) is for the API style to be consistent. Consistency aids users in building a mental model of how to use the APIs. As such, the design of individual packages must also consider their impact on the Go CDK as a whole. This is a [Living Document](https://en.wikipedia.org/wiki/Living_document). The decisions in here are not set in stone, but simply describe our current thinking about how to guide the Go Cloud Development Kit project. While it is useful to link to this document when having discussions in an issue, it is not to be used as a means of closing issues without discussion at all. Discussion on an issue can lead to revisions of this document. ## Developers and Operators The Go CDK is designed with two different personas in mind: the developer and the operator. In the world of DevOps, these may be the same person. A developer may be directly deploying their application into production, especially on smaller teams. In a larger organization, these may be different teams entirely, but working closely together. Regardless, these two personas have two very different ways of looking at a Go program: - The developer persona wants to write business logic that is agnostic of underlying cloud provider. Their focus is on making software correct for the requirements at hand. - The operator persona wants to incorporate the business logic into the organization's policies and provision resources for the logic to run. Their focus is making software run predictably and reliably with the resources at hand. The Go CDK uses Go interfaces at the boundary between these two personas: a developer is meant to use an interface, and an operator is meant to provide an implementation of that interface. This distinction prevents the Go CDK going down a path of complexity that makes application portability difficult. The [`blob.Bucket`][] type is a prime example: the API does not provide a way of creating a new bucket. To properly and safely create such a bucket requires careful consideration, getting something like ACLs wrong could lead to a catastrophic data leak. To generate the ACLs correctly requires modeling of IAM users and roles for each cloud platform, and some way of mapping those users and roles across clouds. While not impossible, the level of complexity and the high likelihood of a leaky abstraction leads us to believe this is not the right direction for the Go CDK. Instead of adding large amounts of leaky complexity to the Go CDK, we expect the operator role to handle the management of non-portable platform-specific resources. An implementor of the `Bucket` interface does not need to determine the content type of incoming data, as that is a developer's concern. This separation of concerns allows these two personas to communicate using a shared language while focusing on their respective areas of expertise. [`blob.Bucket`]: https://godoc.org/github.com/google/go-cloud/blob#Bucket ## Portable Types and Drivers The portable APIs that the Go CDK exports (like [`blob.Bucket`][] or [`runtimevar.Variable`][]) are concrete types, not interfaces. To understand why, imagine if we used a plain interface: ![Diagram showing user code depending on blob.Bucket, which is implemented by awsblob.Bucket.](img/user-facing-type-no-driver.png) Consider the [`Bucket.NewWriter` method][], which infers the content type of the blob based on the first bytes written to it. If `blob.Bucket` was an interface, each implementation of `blob.Bucket` would have to replicate this behavior precisely. This does not scale: conformance tests would be needed to ensure that each interface method actually behaves in the way that the docs describe. This makes the interfaces hard to implement, which runs counter to the goals of the project. Instead, we follow the example of [`database/sql`][] and separate out the implementation-agnostic logic from the interface. The implementation-agnostic logic-containing concrete type is the **portable type**. We call the interface the **driver**. Visually, it looks like this: ![Diagram showing user code depending on blob.Bucket, which holds a driver.Bucket implemented by awsblob.Bucket.](img/user-facing-type.png) This has a number of benefits: - The portable type can perform higher level logic without making the interface complex to implement. In the blob example, the portable type's `NewWriter` method can do the content type detection and then pass the final result to the driver type. - Methods can be added to the portable type without breaking compatibility. Contrast with adding methods to an interface, which is a breaking change. - When new operations on the driver are added as new optional interfaces, the portable type can hide the need for type-assertions from the user. As a rule, if a method `Foo` has the same inputs and semantics in the portable type and the driver type, then the driver method may be called `Foo`, even though the return signatures may differ. Otherwise, the driver method name should be different to reduce confusion. New Go CDK APIs should always follow this portable type and driver pattern. [`runtimevar.Variable`]: https://godoc.org/github.com/google/go-cloud/runtimevar#Variable [`Bucket.NewWriter` method]: https://godoc.org/github.com/google/go-cloud/blob#Bucket.NewWriter [`database/sql`]: https://godoc.org/database/sql ## Minimize Global State As a library, the Go CDK should not introduce global state. Global state is difficult to reason about in large codebases, where it can be necessary for different parts of the application to use different states. Instead of adding global state, push responsibility to the application to inject the state where it is needed. The exception we permit is URL scheme registration as documented under [URLs](#urls). The amount of boilerplate setup code required for URL muxes for multiple drivers without use of a tool like Wire is an unreasonable burden for users of Go CDK. We want the Go CDK to be usable both with and without Wire. A global registry is acceptable as long as its use is not mandatory, but the burden is to prove the benefit over the cost. ## Driver Package Naming Conventions Inside this repository, we name packages that handle cloud services after the service name, not the providing cloud (`s3blob` instead of `awsblob`). While a cloud provider may provide a unique offering for a particular API, they may not always provide only one, so distinguishing them in this way keeps the API symbols stable over time. The naming convention is ``, where: * `` is the provider name, like `aws` or `gcp` or `azure`. * Omit for 3rd party/open source/local packages. * May also be omitted in cases where the product name is sufficient (e.g., `s3blob` not `awss3blob` since S3 is well-known, `gcsblob` not `gcpgcsblob` since GCS already references Google). * Required if the product name is not unique across providers (e.g., `gcpkms` and `awskms`). * ``is the product/service name. * `` is the portable API name. * Include for local/test packages like (e.g., `fileblob`, `mempubsub`). * May be omitted when it makes the package name too long (e.g. `awssnssqs` is long enough, don't add `pubsub`). * Encouraged when it helps distinguish the package from the service's own package name (e.g., `s3blob` not `s3`). ## Portable Type Constructors Portable type constructors are the functions defined in driver packages that end users call to get an instance of the portable type. For example, `gcsblob.OpenBucket`, which returns an instance of the `*blob.Bucket` portable type backed by GCS. - Portable type constructors should be top-level functions that return the portable type directly. Avoid helpers (e.g., a `Client` struct with a function that returns the portable type instead of it being top-level) and wrappers (e.g., a `fooblob.Bucket` type returned from `fooblob.OpenBucket` that wraps the portable type). Top level functions without wrappers are easier to use, especially when we're consistent about it. - Order arguments that are less likely to change across multiple calls to the constructor before ones that are likely to change. For example, connection and authorization related arguments should go before names, so `OpenBucket(ctx, client, "mybucket")` instead of `OpenBucket(ctx, "mybucket", client)`. - All public constructors should take an `Options` struct (see next section). ### Option Structs All public constructors should take an `Options` struct, even if it is currently empty, to ensure that we can add arguments to the APIs in the future without breaking backward compatibility. - This includes driver constructors (e.g., `gcsblob.OpenBucket`) as well as API functions (e.g., `blob.NewReader`). When in doubt, if you think it's possible that we'll add arguments, add `Options`. - The argument should be of type `*Options`, so that `nil` can be passed in the default case. - Name the `Options` struct appropriately. `Options` is usually fine for portable type constructors since the package generally only exposes a constructor. Inside a driver interface or in a portable type like `blob`, use more descriptive names like `ReaderOptions` or `WriterOptions`. - If a function already has a struct argument, don't add a separate `Options` struct. Example: the various `sql.Open` functions take a `Params` struct with connection parameters; we chose to add new options to `Params` instead of introducing a separate `Options` struct. This keeps the function signature simpler and avoid confusion about which struct new parameters should be added to. - When similar `Options` are part of a driver interface and also part of the portable type (e.g., `blob.WriterOptions`), duplicate the struct instead of aliasing or embedding it, and copy the struct fields explicitly where needed. This allows the godoc for each type to be tailored to the appropriate audience (e.g. end-users for the portable type, driver implementors for the driver interface), and also allows the structs to diverge over time if appropriate. - Required arguments must not be in an `Options` struct, and all fields of the `Options` struct must have reasonable defaults. Exception: struct arguments that don't have `Options` in the name can contain required arguments (e.g., see the `Params` example for `sql.Open` above). Regarding empty `Options` structs: we considered only adding them when the first option is added, and using a separate constructor for compatibility (e.g., start with `foo.New(...)` and later add `foo.NewWithOptions(..., opts *Options)` if needed). However, this would result in inconsistent names over time (e.g., some packages would expose `New` with an `Options`, while others would expose `NewWithOptions`). ### Compound IDs Many cloud providers have resource IDs that are made up of subcomponents in some well-defined syntax. For example, [GCP KMS key IDs][] take the form `projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEY_RING]/cryptoKeys/[KEY]`. We call these _compound IDs_. There are two broad compound ID usage patterns we have observed: 1. Applications will keep resources in the same location, so the application will build the ID from the subcomponents rather than passing the entire resource ID around. 2. Applications will pass a verbatim string from configuration down to the API, since this is what was easily copy-pasteable from the cloud console UI. Go CDK constructors that take in compound IDs should take in a `string` with the full compound ID. Helper functions to build these compound IDs from subcomponents may be provided as needed. URL openers (described below) should prefer to use the full compound ID in their URL format. [GCP KMS key IDs]: https://cloud.google.com/kms/docs/object-hierarchy#key ### URLs To enable the [Backing services factor][] of a Twelve-Factor Application, Go Cloud includes the ability to construct each of its API objects using identifying URLs. The portable type's package should include APIs like the following: ```go // Package foo is a portable API. foo could be something like blob or pubsub. // // Throughout this example, Widget is used as a stand-in for a portable type // inside foo, like Bucket or Subscription. package foo // A type that implements WidgetURLOpener can open widgets based on a URL. // The opener must not modify the URL argument. OpenWidgetURL must be safe to // call from multiple goroutines. // // WidgetURLOpeners should not assume that the URL has a particular scheme. type WidgetURLOpener interface { OpenWidgetURL(ctx context.Context, u *url.URL) (*Widget, error) } // URLMux is a URL opener multiplexer. It matches the scheme of the URLs // against a set of registered schemes and calls the opener that matches the // URL's scheme. // // The zero value is a multiplexer with no registered schemes. type URLMux struct { // ... } // RegisterWidget registers the opener with the given scheme. If an opener // already exists for the scheme, RegisterWidget panics. func (mux *URLMux) RegisterWidget(scheme string, opener WidgetURLOpener) { // ... } // OpenWidget calls OpenWidgetURL with the URL parsed from urlstr. // OpenWidget is safe to call from multiple goroutines. func (mux *URLMux) OpenWidget(ctx context.Context, urlstr string) (*Widget, error) { u, err := url.Parse(urlstr) if err != nil { return nil, fmt.Errorf("open widget: %v", err) } return mux.OpenWidgetURL(ctx, u) } // OpenWidgetURL dispatches the URL to the opener that is registered with the // URL's scheme. OpenWidgetURL is safe to call from multiple goroutines. func (mux *URLMux) OpenWidgetURL(ctx context.Context, u *url.URL) (*Widget, error) { // ... } // DefaultURLMux returns the URLMux used by OpenWidget. func DefaultURLMux() *URLMux { return defaultURLMux } var defaultURLMux = new(URLMux) // OpenWidget opens the Widget identified by the URL given. URL openers must be // registered in the DefaultURLMux, which is typically done in driver // packages' initialization. func OpenWidget(ctx context.Context, urlstr string) (*Widget, error) { return DefaultURLMux().OpenWidget(urlstr) } ``` The repetition of `Widget` in the method names permits a type to handle multiple resources within the API. Exporting the `URLMux` allows applications to build their own muxes, potentially wrapping existing ones. Driver packages should include their own `URLOpener` struct type which implements all the relevant `WidgetURLOpener` methods. The URL should only serve to identify which resource to open. Any credentials or other complex values should be taken in as struct fields, not as input from URL. If the driver package registers its `URLOpener` with the `DefaultURLMux`, then it should populate these complex fields from environment variables. If doing so is undesirable or expensive, then it should not register with the `DefaultURLMux` and instead rely on users to create their own mux. If there already exists a well-established URI format for the backend (like S3 URLs or database connection URIs), then drivers should honor them where possible. [Backing services factor]: https://12factor.net/backing-services #### URL Examples A `WidgetURLOpener` implementation for a hypothetical GCP service: ```go package gcpfoo // ... const Scheme = "gcpwidget" type URLOpener struct { Client *gcp.HTTPClient Options Options } func (o *URLOpener) OpenWidgetURL(ctx context.Context, u *url.URL) (*foo.Widget, error) { // ... return OpenWidget(ctx, o.Client, u.Host, &o.Options) } type lazyURLOpener struct { init sync.Once opener *URLOpener err error } func (o *lazyURLOpener) OpenWidgetURL(ctx context.Context, u *url.URL) (*foo.Widget, error) { o.init.Once(func() { creds, err := gcp.DefaultCredentials(ctx) if err != nil { o.err = err return } o.opener = new(URLOpener) o.opener.Client, _ = gcp.NewHTTPClient(http.DefaultTransport, creds.TokenSource) }) if o.err != nil { return nil, o.err } return o.opener.OpenWidgetURL(ctx, u) } func init() { foo.DefaultURLMux().Register(Scheme, new(lazyURLOpener)) } // OpenWidget is the exported non-URL constructor. func OpenWidget(ctx context.Context, c *gcp.HTTPClient, name string, opts *Options) (*foo.Widget, error) { // ... } ``` Using the global default mux: ```go import _ "gocloud.dev/foo/gcpfoo" // ... widget, err := foo.OpenWidget(context.Background(), "gcpwidget://xyzzy") ``` Using a custom mux created during server initialization: ```go myMux := new(foo.URLMux) myMux.Register(gcpfoo.Scheme, &gcpfoo.URLOpener{ Client: client, }) widget, err := myMux.OpenWidget(context.Background(), "gcpwidget://xyzzy") ``` ## Errors ### General - The callee is expected to return `error`s with messages that include information about the particular call, as opposed to the caller adding this information. This aligns with common Go practice. ### Drivers Driver implementations should: - Return the raw errors from the underlying service, and not wrap them in `fmt.Errorf` calls, so that they can be exposed to end users via `ErrorAs`. ### Portable Types Portable types should: - Wrap errors returned from driver implementations before returning them to end users, so that users can't peek into driver-specific error details without using `As`. Make sure not to double-wrap. - Use `internal/gcerr.New` when wrapping driver errors, like so: `if err := driver.Call(xyz); err != nil { return gcerr.New(code, err, 1, "blob") }` The first argument is an error code. See below for advice on choosing the appropriate code. The third argument is the distance in stack frames from the function whose location should be associated with the error. It should be `1` if you are calling `New` from the same function that made the driver call, `2` if you are calling new from a helper function, and so on. The fourth argument is an additional string that will display with the error. You should pass the API name. - By default, choose the code `Unknown`, keeping details of returned `error`s unspecified. The most common case is that the caller will only care whether an operation succeeds or not. - If certain `error`s are interesting for callers to distinguish, choose one of the other codes from the `gcerrors.ErrorCode` enum, so user programs can act on the kind of error without having to look at driver-specific errors. - If more than one error code makes sense, choose the most specific one. - If none make sense, choose `Unknown`. - If none make sense but you want something more specific than `Unknown`: - If you can generalize your code to make it applicable to more than just your API, add it to `gcerrors.ErrorCode`. Look at the [gRPC error codes](https://github.com/grpc/grpc-go/blob/master/codes/codes.go) for inspiration. - Otherwise, you can define a custom code in your portable API package. Your code should use a negative integer. - For now, your package should expose an `ErrorAs` function to allow users to access driver-specific error types. We may review this choice if `golang.org/x/xerrors.As` becomes part of the standard library. - Handle transient network errors. Retry logic is best handled as low in the stack as possible to avoid [cascading failure][]. APIs should try to surface "permanent" errors (e.g. malformed request, bad permissions) where appropriate so that application logic does not attempt to retry non-idempotent operations, but the responsibility is largely on the library, not on the application. [cascading failure]: https://landing.google.com/sre/book/chapters/addressing-cascading-failures.html ## Escape Hatches using As The Go CDK allows users to escape the abstraction as needed using `As` functions, described in more detail in the [concept guide](https://gocloud.dev/concepts/as/). `As` functions take an `interface{}` and return a `bool`; they return `true` if the underlying concrete type could be converted into the type provided as the `interface{}`. An alternative approach would have been something like [`os.ProcessState.Sys`](https://golang.org/pkg/os/#ProcessState.Sys), which returns an `interface{}` that the user can then type cast/assert to service-specific types. We ended up going with `As` because: 1. Most portable types have an `As` function for errors; choosing `As` results in an easy and natural implementation for chained errors once the [Go 2 proposal for errors](https://go.googlesource.com/proposal/+/master/design/29934-error-values.md) arrives. It is currently implemented in [xerrors](https://godoc.org/golang.org/x/xerrors#As), and we're already using that in some drivers. 2. `As` adds more flexibility for drivers to support conversions to multiple types. Specifically, not the case where there are multiple possible underlying types, but rather that a single underlying type can be converted to multiple types. * Chained errors is one example of this, where the top-level error may always be the same type, but may also represent a chain of other errors with different types. * Another example is that a driver might choose to support `As`-level compatibility with another driver; e.g., driver `foo` could support all of the `As` types defined by `s3blob`, converting them internally, and then any code that runs with driver `s3blob` would also work with driver `foo` (even if it uses the `As` escape hatches). ## Enforcing Portability The Go CDK APIs will end up exposing functionality that is not supported by all services. In addition, some functionality details will differ across services. Some theoretical examples using [`blob.Bucket`][]: 1. **Top-level APIs**: There might be a service that supports reads, but not writes or deletes. 1. **Data fields**. Some services may support key/value metadata associated with a blob, others may not. 1. **Naming rules**. Different services may allow different name lengths, or allow/disallow non-ASCII unicode characters. See [Strings](#strings) below for more on handling string differences. 1. **Semantic guarantees**. Different services may have different consistency guarantees; for example, S3 only provides eventually consistency while GCS provides strong consistency. How can we maintain portability while these differences exist? ### Guiding Principle Any incompatibilities between drivers should be visible to the user as soon as possible. From best to worst: 1. At compile time 1. At configuration/app startup time (e.g., when the portable type is created) 1. At runtime (e.g., when the incompatible behavior is accessed), via a non-nil error 1. At runtime, via panic ### Approaches Considered 1. **Documentation**. We could try to document non-uniform or optional functionality across drivers. Optional fields or functionality would return "not implemented" errors or zero values. 1. **Restrict functionality to the intersection**. We could explicitly only support the intersection of all services. For example, if not all services allow unicode characters in names, then **blob** would not allow it either. 1. **Enforced feature codes**: Go CDK APIs could enumerate the ways in which drivers differ as a `FeatureCode` enum. * Drivers would declare which feature codes they support, enforced by extensions to the existing conformance tests. * API users would declare which feature codes they need. * Mismatches between what a user requests and what the driver supports would be enforced at initialization time. * As much as possible, the API (via the portable type) would enforce that the user is only exposed to optional functionality that they asked for. * For example, the default legal name for a blob might be ASCII only, with a `FeatureUnicodeNames` feature code. Users that don't request this feature code would only be able to use blobs with ASCII names, even if the underlying service supports unicode. If the user requested `FeatureUnicodeNames`, and their driver supports it, they could then use blobs with unicode; if their driver doesn't support it, they would get an initialization-time error. ``` b, err := blob.NewBucket(d, blob.FeatureUnicodeNames) ... ``` Design discussions regarding enforcing portability are ongoing; we welcome input on the [mailing list](https://groups.google.com/forum/#!forum/go-cloud). ### Strings Services often differ on what they accept in particular strings (e.g., blob names, metadata keys, etc.). A couple of specific examples: * Azure Blob only [accepts C# identifiers](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-properties-metadata) as metadata keys. * S3 drops double slashes in blob names (e.g., `foo//bar` will end up being saved as `foo/bar`). These differences lead to a loss of portability and predictability for users. To resolve this issue, we insist that Go CDK can handle any UTF-8 string, and force drivers to use escaping mechanisms to handle strings that the underlying service can't handle. We enforce driver compliance with conformance tests. Behavior for non-UTF-8 strings is undefined (but see https://github.com/google/go-cloud/issues/1281 and https://github.com/google/go-cloud/issues/1260). We try to use URL encoding as the escaping mechanism where possible; however, sometimes it is not and we'll use custom escaping. As an example, a driver for a service that only allows underscores and ASCII alphanumeric characters might escape the string `foo.bar` to `foo__0x2e__bar` (URL escaping won't work because `%` isn't allowed). Pros of this approach: * Go CDK APIs are internally consistent in that a user can write any string to any service and get the original string back when they read it back. * Go CDK APIs have visibility into all existing strings for all services. Cons: * Go CDK could overwrite existing data if a Go CDK-written key escapes to an already-existing value (e.g., if the `foo__0x2e__bar` string already existed, it would be overwritten by a Go CDK write to `foo.bar`). * Escaping may push a string over the maximum allowed string length for a service. Escaping does not solve (and in fact may exacerbate) problems with different maximum string lengths across services. * Existing strings that happen to look like Go CDK-escaped strings will be unescaped by Go CDK (e.g., an existing string `foo__0x2e__bar` would appear as `foo.bar` when read through the Go CDK). * Strings that were written through the Go CDK and needed escaping will appear in their escaped form when viewed outside of Go CDK (e.g., `foo__0x2e__bar` would appear on the service's UI). Most of these cons are mitigated by choosing unusual-looking escape mechanisms that are unlikely to appear in existing data. Drivers should escape strings when writing to the underlying service, and unescape them when reading them back. The Go CDK will provide helpers for these operations, as well as a test suite of strings for conformance tests. Sample code for the helper for escaping strings: ``` // package escape provides helpers for escaping and unescaping strings. package escape // Escape returns s, with all runes for which shouldEscape returns true // escaped to "__0xXXXX__", where XXXX is the hex representation of the rune // value. For example, " " would escape to "__0x20__". // // Non-UTF-8 strings will have their non-UTF-8 characters escaped to // unicode.ReplacementChar; the original value is lost. Please file an // issue if you need non-UTF8 support. // // Note: shouldEscape takes the whole string as a slice of runes and an // index. Passing it a single byte or a single rune doesn't provide // enough context for some escape decisions; for example, the caller might // want to escape the second "/" in "//" but not the first one. // We pass a slice of runes instead of the string or a slice of bytes // because some decisions will be made on a rune basis (e.g., encode // all non-ASCII runes). func Escape(s string, shouldEscape func(s []rune, i int) bool) string { ... } // Unescape reverses Escape. func Unescape(s string) string {...} ``` Sample code for how a driver might use it, using metadata keys for a `blob` as the example string: ``` // When writing metadata keys, escape the keys: // ... gcdkMetadata is the metadata passed to the GCDK API. for k, v := range gcdkMetadata { e := escape.Escape(k, func (r []rune, i int) bool {...}) if _, ok := serviceMetadata[e]; ok { return fmt.Errorf("duplicate keys after escaping: %q => %q", k, e) } serviceMetadata[e] = v } // ... write serviceMetadata to the service. // When reading metadata keys, unescape them: // ... serviceMetadata is the metadata read from the service. for k, v := range serviceMetadata { gcdkMetadata[escape.Unescape(k)] = v } // ... return gcdkMetadata. ``` The details of what runes need to be escaped will vary from service to service. The details of how to escape may also vary, although we expect to use URL encoding where possible, and a common custom escaping where not. For the custom escaping, we plan to escape each rune for which `shouldEscape` returns true with `__0xXXX__`, where `XCX` is the hex representation of the rune value. ### Alternatives Considered * We considered restricting Go CDK's APIs to strings that all services support. For example, we could have asserted that Go CDK's `blob` only supports ASCII plus `/` for blob names (and no `//`!). However, such a rule would mean that we couldn't cleanly handle existing strings created through some mechanism other than through Go CDK APIs that violate the rule. For example, an existing blob in S3 with a unicode name. Filtering out such strings so that they aren't visible at all through the Go CDK would be both surprising and limiting, and could easily result in data loss (e.g., if a user read a set of metadata for a blob via the Go CDK, and some keys were filtered out, and then wrote the metadata back, the filtered keys would be lost). Not filtering such strings would mean that the Go CDK isn't internally consistent (i.e., you can read some strings but not write them). Overall, we decided that this approach is unacceptable. * We could expose the escaper used by drivers in their `Options` structs (including options like disabling it, overriding the set of bytes to be escaped, or overriding the escaping mechanism), but we'll wait to see if there's demand for that. ## Coding Conventions We try to adhere to commonly accepted Go coding conventions, some of which are described on the [Code Review Comments](https://github.com/golang/go/wiki/CodeReviewComments) wiki page. We also adopt the following guidelines: - Prefer `map[K]V{}` to `make(map[K]V)`. It's more concise. - When writing a loop appending to a slice `s`, prefer ``` var s []T for ... { ... s = append(s, ...) ... } ``` to ``` s := make([]T, 0, N) for ... { ... s = append(s, ...) ... } ``` or ``` s := make([]T, N) for ... { ... s[i] = ... ... } ``` (Exception: the loop body is trivial and the loop is performance-sensitive.) The first version is shorter and easier to read, and it is impossible to get the length wrong. - Prefer `log.Fatal` to `panic` in example tests. - Ensure you've run `goimports` on your code to properly group import statements. - Order arguments that are less likely to change across multiple calls to the constructor before ones that are likely to change. For example, connection and authorization related arguments should go before names, so `OpenBucket(ctx, client, "mybucket")` instead of `OpenBucket(ctx, "mybucket", client)`. ## Tests ### Conformance Tests Since our goal is for users to be able to use drivers interchangeably, it is critical that they behave similarly. To this end, each portable API (e.g., `blob`) must provide a suite of conformance tests that driver implementations should run. The conformance tests should be comprehensive; drivers should not need additional unit tests for the core driver semantics. ### Provisioning For Tests Portable API integration tests require developer-specific resources to be created and destroyed. We use [Terraform](http://terraform.io) to do so, and record the resource info and network interactions so that they can be replayed as fast and repeatable unit tests. ### Replay Mode Tests normally run in replay mode. In this mode, they don't require any provisioned resources or network interactions. Replay tests verify that: - The same test inputs produce the same requests (e.g., HTTP requests) to the cloud service. Some parts of the request may be dynamic (e.g., dates in the HTTP request headers), so the replay tests do some scrubbing when verifying that requests match. Some parts of this scrubbing are service-specific. - The replayed service responses produce the expected results from the portable API library. ### Record Mode In `-record` mode, tests run as integration tests, making live requests to backend servers and recording the requests/responses for later use in replay mode. To use `-record`: 1. Provision resources. - For example, the tests for the AWS implementation of Blob requires a bucket to be provisioned. - TODO(issue #300): Use Terraform scripts to provision the resources needed for a given test. - For now, do this manually. 2. Run the test with `-record`. - TODO(issue #300): The test will read the Terraform output to find its inputs. - For now, pass the required resources via test-specific flags. - When changing or adding tests, please only record the tests that are changed/affected by passing the `-run` flag to `go test` with the name of the test(s). Re-recording all tests of a driver creates a lot of noise and a large diff that's difficult to review. 3. The test will save the network interactions for subsequent replays. - TODO(issue #300): The test will save the Terraform output to a file in order to replay using the same inputs. - Commit the new replay files along with your code change. Expect to see lots of diffs; see below for more discussion. ### Diffs in replay files Each time portable API tests are run in `-record` mode, the resulting replay files are different. Looking at diffs of these files isn't particularly useful. We [considered](https://github.com/google/go-cloud/issues/276) trying to scrub the files of dynamic data so that diffs would be useful. We ended up deciding not to do this, for several reasons: - There's a lot of dynamic data, in structured data of various forms (e.g., HTTP headers, XML/JSON body, etc.). It would be difficult and fragile to scrub it all. - The scrub process would also be fragile relative to changes in services (e.g., adding a new dynamic HTTP response header). - The scrub process would need to be implemented for every new service, increasing the barrier to entry for new implementations. - Scrubbing would likely be even more difficult for services using a non-HTTP-based protocol (e.g., gRPC). - Scrubbing the data decreases the fidelity of the replay test, since it wouldn't be operating on the original data. Overall, massive diffs in the replay files are expected and fine. As part of a code change, you may want to check for things like the number of RPCs made to identify performance regressions. ================================================ FILE: internal/docs/pubsub/design.md ================================================ # Go CDK `pubsub` Design ## Summary This document proposes a new `pubsub` package for the Go CDK. ## Motivation A developer designing a new system with cross-cloud portability in mind could choose a messaging system supporting pubsub, such as ZeroMQ, Kafka or RabbitMQ. These pubsub systems run on AWS, Azure, GCP and others, so they pose no obstacle to portability between clouds. They can also be run on-prem. Users wanting managed pubsub could go with Confluent Cloud for Kafka (AWS, GCP), or CloudAMQP for RabbitMQ (AWS, Azure) without losing much in the way of portability. So what’s missing? The solution described above means being locked into a particular implementation of pubsub. There is also a potential for lock-in when building systems in terms of the cloud-specific services such as AWS SNS+SQS, GCP PubSub or Azure Service Bus. Developers may wish to compare different pubsub systems in terms of their performance, reliability, cost or other factors, and they may want the option to move between these systems without too much friction. A `pubsub` package in the Go CDK could lower the cost of such experiments and migrations. ## Goals * Publish messages to an existing topic. * Receive messages from an existing subscription. * Perform not much worse than 90% compared to directly using the APIs of various pubsub systems. * Work well with managed pubsub services on AWS, Azure, GCP and the most used open source pubsub systems. ## Non-goals * Create new topics in the cloud. The Go CDK focuses on developer concerns, but topic creation is an [operator concern](https://github.com/google/go-cloud/blob/master/internal/docs/design.md#developers-and-operators). * Create new subscriptions in the cloud. The subscribers are assumed to correspond to components of a distributed system rather than to users of that system. ## Background [Pubsub](https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern) is a frequently requested feature for the Go CDK project \[[github issue](https://github.com/google/go-cloud/issues/312)]. A key use case motivating these requests is to support [event driven architectures](https://en.wikipedia.org/wiki/Event-driven_architecture). There are several pubsub systems available that could be made to work with the Go CDK by writing drivers for them. Here is a [table](https://docs.google.com/a/google.com/spreadsheets/d/e/2PACX-1vQ2CML8muCrqhinxOeKTcWtwAeGk-RFFFMjB3O2u5DbbBt9R3YnUQcgRjRp6TySXe1CzSOtPVCsKACY/pubhtml) comparing some of them. ## Design overview ### Developer’s perspective Given a topic that has already been created on the pubsub server, messages can be sent to that topic by calling `acmepubsub.OpenTopic` and calling the `Send` method of the returned `Topic`, like this (assuming a fictional pubsub service called "acme"): ```go package main import ( "context" "log" "net/http" rawacmepubsub "github.com/acme/pubsub" "github.com/google/go-cloud/pubsub" "github.com/google/go-cloud/pubsub/acmepubsub" ) func main() { log.Fatal(serve()) } func serve() error { ctx := context.Background() client, err := rawacmepubsub.NewClient(ctx, "unicornvideohub") if err != nil { return err } t, err := acmepubsub.OpenTopic(ctx, client, "user-signup", nil) if err != nil { return err } defer t.Close() http.HandleFunc("/signup", func(w http.ResponseWriter, r *http.Request) { err := t.Send(r.Context(), pubsub.Message{Body: []byte("Someone signed up")}) if err != nil { log.Println(err) } }) return http.ListenAndServe(":8080", nil) } ``` The call to `Send` will only return after the message has been sent to the server or its sending has failed. Messages can be received from an existing subscription to a topic by calling the `Receive` method on a `Subscription` object returned from `acmepubsub.OpenSubscription`, like this: ```go package main import ( "context" "fmt" "log" rawacmepubsub "github.com/acme/pubsub" "github.com/google/go-cloud/pubsub" "github.com/google/go-cloud/pubsub/acmepubsub" ) func main() { if err := receive(); err != nil { log.Fatal(err) } } func receive() error { ctx := context.Background() client, err := rawacmepubsub.NewClient(ctx, "unicornvideohub") if err != nil { return err } s, err := acmepubsub.OpenSubscription(ctx, client, "user-signup-minder", nil) if err != nil { return err } defer s.Close() msg, err := s.Receive(ctx) if err != nil { return err } // Do something with msg. fmt.Printf("Got message: %s\n", msg.Body) // Acknowledge that we handled the message. msg.Ack() } ``` A more realistic subscriber client would process messages in a loop, like this: ```go package main import ( "context" "log" "os" "os/signal" "github.com/google/go-cloud/pubsub" "github.com/google/go-cloud/pubsub/acmepubsub" ) func main() { if err := receive(); err != nil { log.Fatal(err) } } func receive() error { ctx := context.Background() client, err := rawacmepubsub.NewClient(ctx, "unicornvideohub") if err != nil { return err } s, err := acmepubsub.OpenSubscription(ctx, client, "signup-minder", nil) if err != nil { return err } defer s.Close() // Process messages. for { msg, err := s.Receive(ctx) if err { return err } log.Printf("Got message: %s\n", msg.Body) msg.Ack() } } ``` The messages can be processed concurrently with an [inverted worker pool](https://www.youtube.com/watch?v=5zXAHh5tJqQ&t=26m58s), like this: ```go package main import ( "context" "log" "os" "os/signal" "github.com/google/go-cloud/pubsub" "github.com/google/go-cloud/pubsub/acmepubsub" ) func main() { if err := receive(); err != nil { log.Fatal(err) } } func receive() error { ctx := context.Background() client, err := rawacmepubsub.NewClient(ctx, "unicornvideohub") if err != nil { return err } s, err := acmepubsub.OpenSubscription(ctx, client, "user-signup-minder", nil) if err != nil { return err } defer s.Close() // Process messages. const poolSize = 10 // Use a buffered channel as a semaphore. sem := make(chan struct{}, poolSize) for { msg, err := s.Receive(ctx) if err { return err } sem <- struct{}{} go func() { log.Printf("Got message: %s", msg.Body) msg.Ack() <-sem }() } for n := poolSize; n > 0; n-- { sem <- struct{}{} } } ``` ### Driver implementer’s perspective Adding support for a new pubsub system involves the following steps, continuing with the "acme" example: 1. Add a new package called `acmepubsub`. 2. Add private `topic` and `subscription` types to `acmepubsub` implementing the corresponding interfaces in the `github.com/go-cloud/pubsub/driver` package. 3. Add `func OpenTopic(...)` that creates an `acmepubsub.topic` and returns a concrete `pubsub.Topic` object made from it. 4. Add `func OpenSubscription(...)` that creates an `acmepubsub.subscription` and returns a `pubsub.Subscription` object made from it. Here is a sketch of what the `acmepubsub` package could look like: ```go package acmepubsub import ( "context" rawacmepubsub "github.com/acme/pubsub" "github.com/google/go-cloud/pubsub" "github.com/google/go-cloud/pubsub/driver" ) // OpenTopic opens an existing topic on the pubsub server and returns a Topic // that can be used to send messages to that topic. func OpenTopic(ctx context.Context, client *rawacmepubsub.Client, topicName string) (*pubsub.Topic, error) { rt, err := client.Topic(ctx, topicName) if err != nil { return nil, err } rt, err := client.Topic(ctx, topicName) if err != nil { return err } t := &topic{ rawTopic: rt } return pubsub.NewTopic(t) } // OpenSubscription opens an existing subscription on the server and returns a // Subscription that can be used to receive messages. func OpenSubscription(ctx context.Context, client *rawacmepubsub.Client, subscriptionName string) (*pubsub.Subscription, error) { rs, err := client.Subscription(ctx, subscriptionName) if err != nil { return err } s := &subscription{ rawSub: rs } return pubsub.NewSubscription(s) } type topic struct { rawTopic *rawacmepubsub.Topic } func (t *topic) SendBatch(ctx context.Context, []*pubsub.Message) error { // ... } func (t *topic) Close() error { // ... } type subscription struct { rawSub *rawacmepubsub.Subscription } func (s *subscription) ReceiveBatch(ctx context.Context) ([]*pubsub.Message, error) { // ... } func (s *subscription) SendAcks(ctx context.Context, []pubsub.AckID) error { // ... } func (s *subscription) Close() error { // ... } ``` The driver interfaces are batch-oriented because some pubsub systems can more efficiently deal with batches of messages than with one at a time. Streaming was considered but it does not appear to provide enough of a performance gain to be worth the additional complexity of supporting it across different pubsub systems \[[benchmarks](https://github.com/ijt/pubsub/tree/master/benchmarks)]. The driver interfaces will be located in the `github.com/google/go-cloud/pubsub/driver` package and will look something like this: ```go package driver type AckID interface{} type Message struct { // Body contains the content of the message. Body []byte // Attributes has key/value metadata for the message. Attributes map[string]string // AckID identifies the message on the server. // It can be used to ack the message after it has been received. AckID AckID } // Topic publishes messages. type Topic interface { // SendBatch publishes all the messages in ms. SendBatch(ctx context.Context, ms []*Message) error // Close disconnects the Topic. Close() error } // Subscription receives published messages. type Subscription interface { // ReceiveBatch should return a batch of messages that have queued up // for the subscription on the server. // // If there is a transient failure, this method should not retry but // should return a nil slice and an error. The concrete API will take // care of retry logic. // // If the service returns no messages for some other reason, this // method should return the empty slice of messages and not attempt to // retry. // // ReceiveBatch is only called sequentially for individual // Subscriptions. ReceiveBatch(ctx context.Context) ([]*Message, error) // SendAcks acknowledges the messages with the given ackIDs on the // server so that they // will not be received again for this subscription. This method // returns only after all the ackIDs are sent. SendAcks(ctx context.Context, ackIDs []interface{}) error // Close disconnects the Subscription. Close() error } ``` ## Detailed design The developer experience of using Go CDK's pubsub involves sending, receiving and acknowledging one message at a time, all in terms of synchronous calls. Behind the scenes, the driver implementations deal with batches of messages and acks. The concrete API, to be written by the Go CDK team, takes care of creating the batches in the case of Send or Ack, and dealing out messages one at a time in the case of Receive. The concrete API will be located at `github.com/google/go-cloud/pubsub` and will look something like this: ```go package pubsub import ( "context" "github.com/google/go-cloud/pubsub/driver" ) // Message contains data to be published. type Message struct { // Body contains the content of the message. Body []byte // Attributes contains key/value pairs with metadata about the message. Attributes map[string]string // ackID is an ID for the message on the server, used for acking. ackID AckID // sub is the Subscription this message was received from. sub *Subscription // isAcked is true if Ack has been called on this message. isAcked bool } type AckID interface{} // Ack acknowledges the message, telling the server that it does not need to // be sent again to the associated Subscription. This method returns // immediately. If Ack has already been called on the message, Ack panics. func (m *Message) Ack() { // Send the ack ID back to the subscriber for batching. // The ack is sent to the server in a separate goroutine // managed by the Subscription from which this message was // received. // ... } // Topic publishes messages to all its subscribers. type Topic struct { driver driver.Topic mcChan chan msgCtx doneChan chan struct{} } // msgCtx pairs a Message with the Context of its Send call. type msgCtx struct { msg *Message ctx context.Context } // Send publishes a message. It only returns after the message has been // sent, or failed to be sent. The call will fail if ctx is canceled. // Send can be called from multiple goroutines at once. func (t *Topic) Send(ctx context.Context, m *Message) error { // Send this message over t.mcChan and then wait for the batch including // this message to be sent to the server. // ... } // Close disconnects the Topic. func (t *Topic) Close() error { close(t.doneChan) return t.driver.Close() } // NewTopic makes a pubsub.Topic from a driver.Topic. func NewTopic(d driver.Topic) *Topic { t := &Topic{ driver: d, mcChan: make(chan msgCtx), doneChan: make(chan struct{}), } go func() { // Pull messages from t.mcChan and put them in batches. Send the current // batch whenever it is large enough or enough time has elapsed since // the last send. // ... }() return t } // Subscription receives published messages. type Subscription struct { driver driver.Subscription // ackChan conveys ackIDs from Message.Ack to the ack batcher goroutine. ackChan chan AckID // ackErrChan reports errors back to Message.Ack. ackErrChan chan error // doneChan tells the goroutine from startAckBatcher to finish. doneChan chan struct{} // q is the local queue of messages downloaded from the server. q []*Message } // Receive receives and returns the next message from the Subscription's queue, // blocking if none are available. This method can be called concurrently from // multiple goroutines. On systems that support acks, the Ack() method of the // returned Message has to be called once the message has been processed, to // prevent it from being received again. func (s *Subscription) Receive(ctx context.Context) (*Message, error) { if len(s.q) == 0 { // Get the next batch of messages from the server. // ... } m := s.q[0] s.q = s.q[1:] return m, nil } // Close disconnects the Subscription. func (s *Subscription) Close() error { close(s.doneChan) return s.driver.Close() } // NewSubscription creates a Subscription from a driver.Subscription and opts to // tune sending and receiving of acks and messages. Behind the scenes, // NewSubscription spins up a goroutine to gather acks into batches and // periodically send them to the server. func NewSubscription(s driver.Subscription) *Subscription { // Details similar to the body of NewTopic should go here. } ``` Topics will gather messages into batches for sending. The batch size will be dynamically tuned according to how many messages are being sent concurrently. Subscriptions will gather message acks into batches the same way, also dynamically tuning the batch size. If sending acks back to the server fails transiently then it will be retried, most likely within a loop in the concrete API. If an unrecoverable error occurs while sending acks then a flag will be set on the `pubsub.Subscription` saying that the whole `Subscription` is no longer usable. Calls to `Receive` will fail from then on. ## Alternative designs considered ### Batch oriented concrete API In this alternative, the application code sends, receives and acknowledges messages in batches. Here is an example of how it would look from the developer's perspective, in a situation where not too many signups are happening per second. ```go package main import ( "context" "log" "net/http" rawacmepubsub "github.com/acme/pubsub" "github.com/google/go-cloud/pubsub" "github.com/google/go-cloud/pubsub/acmepubsub" ) func main() { log.Fatal(serve()) } func serve() error { ctx := context.Background() client, err := rawacmepubsub.NewClient(ctx, "unicornvideohub") if err != nil { return err } t, err := acmepubsub.OpenTopic(ctx, client, "user-signup", nil) if err != nil { return err } defer t.Close() http.HandleFunc("/signup", func(w http.ResponseWriter, r *http.Request) { err := t.Send(r.Context(), []pubsub.Message{{Body: []byte("Someone signed up")}}) if err != nil { log.Println(err) } }) return http.ListenAndServe(":8080", nil) } ``` For a company experiencing explosive growth or enthusiastic spammers creating more signups than this simple-minded implementation can handle, the app would have to be adapted to create non-singleton batches, like this: ```go package main import ( "context" "log" "net/http" rawacmepubsub "github.com/acme/pubsub" "github.com/google/go-cloud/pubsub" "github.com/google/go-cloud/pubsub/acmepubsub" ) const batchSize = 1000 func main() { log.Fatal(serve()) } func serve() error { ctx := context.Background() client, err := rawacmepubsub.NewClient(ctx, "unicornvideohub") if err != nil { return err } t, err := acmepubsub.OpenTopic(ctx, client, "user-signup", nil) if err != nil { return err } defer t.Close() c := make(chan *pubsub.Message) go sendBatches(ctx, t, c) http.HandleFunc("/signup", func(w http.ResponseWriter, r *http.Request) { c <- &pubsub.Message{Body: []byte("Someone signed up")} }) return http.ListenAndServe(":8080", nil) } func sendBatches(ctx context.Context, t *pubsub.Topic, c chan *pubsub.Message) { batch := make([]*pubsub.Message, batchSize) for { for i := 0; i < batchSize; i++ { batch[i] = <-c } if err := t.Send(ctx, batch); err != nil { log.Println(err) } } } ``` This shows how the complexity of batching has been pushed onto the application code. Removing messages from the batch when HTTP/2 requests are canceled would require the application code to be even more complex, adding more risk of bugs. In this API, the application code has to either request batches of size 1, meaning more network traffic, or it has to explicitly manage the batches of messages it receives. Here is an example of how this API would be used for serial message processing: ```go package main import ( "context" "log" "os" "os/signal" rawacmepubsub "github.com/acme/pubsub" "github.com/google/go-cloud/pubsub" "github.com/google/go-cloud/pubsub/acmepubsub" ) const batchSize = 10 func main() { if err := receive(); err != nil { log.Fatal(err) } } func receive() error { ctx := context.Background() client, err := rawacmepubsub.NewClient(ctx, "unicornvideohub") if err != nil { return err } s, err := acmepubsub.OpenSubscription(ctx, client, "signup-minder", nil) if err != nil { return err } defer s.Close() // Process messages. for { msgs, err := s.Receive(ctx, batchSize) if err { return err } acks := make([]pubsub.AckID, 0, batchSize) for _, msg := range msgs { // Do something with msg. fmt.Printf("Got message: %q\n", msg.Body) acks = append(acks, msg.AckID) } err := s.SendAcks(ctx, acks) if err != nil { return err } } } ``` Here’s what it might look like to use this batch-only API with the inverted worker pool pattern: ```go package main import ( "context" "log" "os" "os/signal" rawacmepubsub "github.com/acme/pubsub" "github.com/google/go-cloud/pubsub" "github.com/google/go-cloud/pubsub/acmepubsub" ) const batchSize = 100 const poolSize = 10 func main() { if err := receive(); err != nil { log.Fatal(err) } } func receive() error { ctx := context.Background() client, err := rawacmepubsub.NewClient(ctx, "unicornvideohub") if err != nil { return err } s, err := acmepubsub.OpenSubscription(ctx, client, "user-signup-minder", nil) if err != nil { return err } defer s.Close() // Receive the messages and forward them to a chan. msgsChan := make(chan *pubsub.Message) go func() { for { msgs, err := s.Receive(ctx, batchSize) if err { log.Fatal(err) } for _, m := range msgs { msgsChan <- m } } } // Get the acks from a chan and send them back to the // server in batches. acksChan := make(chan pubsub.AckID) go func() { for { batch := make([]pubsub.AckID, batchSize) for i := 0; i < len(batch); i++ { batch[i] = <-acksChan } if err := s.SendAcks(ctx, batch); err != nil { /* handle err */ } } } // Use a buffered channel as a semaphore. sem := make(chan struct{}, poolSize) for msg := range msgsChan { sem <- struct{}{} go func(msg *pubsub.Message) { log.Printf("Got message: %s", msg.Body) acksChan <- msg.AckID <-sem }(msg) } for n := poolSize; n > 0; n-- { sem <- struct{}{} } } ``` Here are some trade-offs of this design: Pro: * The semantics are simple, making it * straightforward to implement the concrete API and the drivers for most pubsub services * easy for developers to reason about how it will behave * less risky that bugs will be present in the concrete API * Fairly efficient sending and receiving of messages is possible by tuning batch size and the number of goroutines sending or receiving messages. Con: * This style of API makes the inverted worker pool pattern verbose. * Apps needing to send or receive a large volume of messages must have their own logic to create batches of size greater than 1. ### go-micro Here is an example of what application code could look like for a pubsub API inspired by [`go-micro`](https://github.com/micro/go-micro)'s `broker` package: ```go b := somepubsub.NewBroker(...) if err := b.Connect(); err != nil { /* handle err */ } topic := "user-signups" subID := "user-signups-subscription-1" s, err := b.Subscription(ctx, topic, subID, func(pub broker.Publication) error { fmt.Printf("%s\n", pub.Message.Body) return nil }) if err := b.Publish(ctx, topic, &broker.Message{ Body: []byte("alice signed up") }); err != nil { /* handle err */ } // Sometime later: if err := s.Unsubscribe(ctx); err != nil { /* handle err */ } ``` Pro: * The callback to the subscription returning an error to decide whether to acknowledge the message means the developer cannot forget to ack. Con: * Go micro has code to auto-create [topics](https://github.com/micro/go-plugins/blob/f3fcfcdf77392b4e053c8d5b361abfabc0c623d3/broker/googlepubsub/googlepubsub.go#L152) and [subscriptions](https://github.com/micro/go-plugins/blob/f3fcfcdf77392b4e053c8d5b361abfabc0c623d3/broker/googlepubsub/googlepubsub.go#L185) as needed, but this is not consistent with the Go CDK’s design principle to not get involved in operations. * The subscription callback idea does not appear to be compatible with inverted worker pools. ## Acknowledgements In pubsub systems with acknowledgement, messages are kept in a queue associated with the subscription on the server. When a client receives one of these messages, its counterpart on the server is marked as being processed. Once the client finishes processing the message, it sends an acknowledgement (or "ack") to the server and the server removes the message from the subscription queue. There may be a deadline for the acknowledgement, past which the server unmarks the message so that it can be received again for another try at processing. Redis Pub/Sub and ZeroMQ don’t support acking, but many others do including GCP PubSub, Azure Service Bus, RabbitMQ, and [Redis Streams](https://redis.io/topics/streams-intro). Given the wide support and usefulness, it makes sense to support message acking in the Go CDK. As of this writing, it is an open question as to what should be done about pubsub systems that do not support acks. Some possibilities have been discussed, but no clear best option has emerged yet: 1. simulating acknowledgement by constructing queues on the server. Con: the magically created queues would probably be a less than pleasant surprise for some users. 2. making ack a no-op for systems that don't support it. With this, do we return a sentinel error from `Ack`, and if so then doesn't that unduly complicate the code for apps that never use non-acking systems? This option is also potentially misleading for developers who would naturally assume that un-acked messages would be redelivered. ### Rejected acknowledgement API: `Receive` method returns an `ack` func In this alternative, the application code would look something like this: ```go msg, ack, err := s.Receive(ctx) log.Printf("Received message: %q", msg.Body) ack(msg) ``` Pro: * The compiler will complain if the returned `ack` function is not used. Con: * Receive has one more return value. * Passing `ack` around along with `msg` is inconvenient. ## Tests ### Unit tests for the concrete API (`github.com/go-cloud/pubsub`) We can test that the batched sending, receiving and acking work as intended by making mock implementations of the driver interfaces. At least the following things should be tested: * Calling `pubsub.Message.Ack` causes `driver.Subscription.SendAcks` to be called. * Calling `pubsub.Topic.Send` causes `driver.Topic.SendBatch` to be called. * Calling `pubsub.Subscription.Receive` causes `driver.Subscription.ReceiveBatch` to be called. ### Conformance tests for specific implementations (*e.g.*, `github.com/go-cloud/pubsub/acmepubsub`) * Sent messages with random contents are received with the same contents. * Sent messages with random attributes are received with the same attributes. * Error occurs when making a local topic with an ID that doesn’t exist on the server. * Error occurs when making a subscription with an ID that doesn’t exist on the server. * Message gets sent again after ack deadline if a message is never acknowledged. * ~~Acked messages don't get received again after waiting twice the ack deadline.~~ :point_left: This test would probably be too flakey. ## Benchmarks What is the throughput and latency of the Go CDK's `pubsub` package, relative to directly using the APIs for various services? * send, for 1, 10, 100 topics, and for 1, 10, 100 goroutines sending messages to those topics * receive, for 1, 10, 100 subscriptions, and for 1, 10, 100 goroutines receiving from each subscription ## References * https://github.com/google/go-cloud/issues/312 * http://queues.io/ ================================================ FILE: internal/docs/release.md ================================================ # Releases To do a release: - Pick the new release name; it's probably `v0.x.0` where `x` is whatever the [last release](https://github.com/google/go-cloud/releases/latest) was plus one, but follow [semantic versioning](https://semver.org/). - Consider updating dependencies via `internal/testing/update_deps.sh` if it hasn't been done recently. Do this as a separte step before the release. - Create a new branch for the release (`git checkout -B prerelease`). - Update the `User-Agent` version in internal/useragent/useragent.go. - Run the release helper tool to remove `replace` lines from the `go.mod` files of submodules: ```bash $ go run internal/releasehelper/releasehelper.go dropreplace ``` - Run the release helper tool to set the version in `require` directives of submodules to the new (yet unreleased) version: ```bash $ go run internal/releasehelper/releasehelper.go setversion v0.x.0 ``` - Commit and create a PR. Tests will fail for this PR because submodules depend on a version of the main module that wasn't tagged yet, so you may have to force-merge the PR. Note that this does not affect users, since a new version hasn't been tagged yet. - `git sync` your local client and move to the master branch. - Tag new versions by running `./internal/testing/git_tag_modules.sh v0.X.0`. - Push tags to upstream with `git push upstream --tags` - Go to [Releases](https://github.com/google/go-cloud/releases). Click `Draft a new release`, enter your release name, select your tag from the dropdown, and enter release notes by clicking "Generate Release Notes". - Add a section for breaking changes, if any. They should be marked with `BREAKING_CHANGE` in the PR title; however, that's not enforced so do your best to look for them. - Update the list of changes to remove anything that's not interesting (e.g., updating dependencies, prerelease, minor cleanups, etc.). - Send an email to [go-cloud@googlegroups.com](https://groups.google.com/forum/#!forum/go-cloud) announcing the release, and including the release notes. - Create a new branch for the postrelease (`git checkout -B postrelease`). - Add back `replace` lines: ```bash $ go run internal/releasehelper/releasehelper.go addreplace ``` Run tests and send out a PR as usual. ================================================ FILE: internal/escape/escape.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package escape includes helpers for escaping and unescaping strings. package escape import ( "fmt" "net/url" "strconv" "strings" ) // NonUTF8String is a string for which utf8.ValidString returns false. const NonUTF8String = "\xbd\xb2" // IsASCIIAlphanumeric returns true iff r is alphanumeric: a-z, A-Z, 0-9. func IsASCIIAlphanumeric(r rune) bool { switch { case 'A' <= r && r <= 'Z': return true case 'a' <= r && r <= 'z': return true case '0' <= r && r <= '9': return true } return false } // HexEscape returns s, with all runes for which shouldEscape returns true // escaped to "__0xXXX__", where XXX is the hex representation of the rune // value. For example, " " would escape to "__0x20__". // // Non-UTF-8 strings will have their non-UTF-8 characters escaped to // unicode.ReplacementChar; the original value is lost. Please file an // issue if you need non-UTF8 support. // // Note: shouldEscape takes the whole string as a slice of runes and an // index. Passing it a single byte or a single rune doesn't provide // enough context for some escape decisions; for example, the caller might // want to escape the second "/" in "//" but not the first one. // We pass a slice of runes instead of the string or a slice of bytes // because some decisions will be made on a rune basis (e.g., encode // all non-ASCII runes). func HexEscape(s string, shouldEscape func(s []rune, i int) bool) string { // Do a first pass to see which runes (if any) need escaping. runes := []rune(s) var toEscape []int for i := range runes { if shouldEscape(runes, i) { toEscape = append(toEscape, i) } } if len(toEscape) == 0 { return s } // Each escaped rune turns into at most 14 runes ("__0x7fffffff__"), // so allocate an extra 13 for each. We'll reslice at the end // if we didn't end up using them. escaped := make([]rune, len(runes)+13*len(toEscape)) n := 0 // current index into toEscape j := 0 // current index into escaped for i, r := range runes { if n < len(toEscape) && i == toEscape[n] { // We were asked to escape this rune. for _, x := range fmt.Sprintf("__%#x__", r) { escaped[j] = x j++ } n++ } else { escaped[j] = r j++ } } return string(escaped[0:j]) } // unescape tries to unescape starting at r[i]. // It returns a boolean indicating whether the unescaping was successful, // and (if true) the unescaped rune and the last index of r that was used // during unescaping. func unescape(r []rune, i int) (bool, rune, int) { // Look for "__0x". if r[i] != '_' { return false, 0, 0 } i++ if i >= len(r) || r[i] != '_' { return false, 0, 0 } i++ if i >= len(r) || r[i] != '0' { return false, 0, 0 } i++ if i >= len(r) || r[i] != 'x' { return false, 0, 0 } i++ // Capture the digits until the next "_" (if any). var hexdigits []rune for ; i < len(r) && r[i] != '_'; i++ { hexdigits = append(hexdigits, r[i]) } // Look for the trailing "__". if i >= len(r) || r[i] != '_' { return false, 0, 0 } i++ if i >= len(r) || r[i] != '_' { return false, 0, 0 } // Parse the hex digits into an int32. retval, err := strconv.ParseInt(string(hexdigits), 16, 32) if err != nil { return false, 0, 0 } return true, rune(retval), i } // HexUnescape reverses HexEscape. func HexUnescape(s string) string { var unescaped []rune runes := []rune(s) for i := 0; i < len(runes); i++ { if ok, newR, newI := unescape(runes, i); ok { // We unescaped some runes starting at i, resulting in the // unescaped rune newR. The last rune used was newI. if unescaped == nil { // This is the first rune we've encountered that // needed unescaping. Allocate a buffer and copy any // previous runes. unescaped = make([]rune, i) copy(unescaped, runes) } unescaped = append(unescaped, newR) i = newI } else if unescaped != nil { unescaped = append(unescaped, runes[i]) } } if unescaped == nil { return s } return string(unescaped) } // URLEscape uses url.PathEscape to escape s. func URLEscape(s string) string { return url.PathEscape(s) } // URLUnescape reverses URLEscape using url.PathUnescape. If the unescape // returns an error, it returns s. func URLUnescape(s string) string { if u, err := url.PathUnescape(s); err == nil { return u } return s } func makeASCIIString(start, end int) string { var s []byte for i := start; i < end; i++ { if i >= 'a' && i <= 'z' { continue } if i >= 'A' && i <= 'Z' { continue } if i >= '0' && i <= '9' { continue } s = append(s, byte(i)) } return string(s) } // WeirdStrings are unusual/weird strings for use in testing escaping. // The keys are descriptive strings, the values are the weird strings. var WeirdStrings = map[string]string{ "fwdslashes": "foo/bar/baz", "repeatedfwdslashes": "foo//bar///baz", "dotdotslash": "../foo/../bar/../../baz../", "backslashes": "foo\\bar\\baz", "repeatedbackslashes": "..\\foo\\\\bar\\\\\\baz", "dotdotbackslash": "..\\foo\\..\\bar\\..\\..\\baz..\\", "quote": "foo\"bar\"baz", "spaces": "foo bar baz", "startwithdigit": "12345", "unicode": strings.Repeat("☺", 3), // The ASCII characters 0-128, split up to avoid the possibly-escaped // versions from getting too long. "ascii-1": makeASCIIString(0, 16), "ascii-2": makeASCIIString(16, 32), "ascii-3": makeASCIIString(32, 48), "ascii-4": makeASCIIString(48, 64), "ascii-5": makeASCIIString(64, 80), "ascii-6": makeASCIIString(80, 96), "ascii-7": makeASCIIString(96, 112), "ascii-8": makeASCIIString(112, 128), } ================================================ FILE: internal/escape/escape_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package escape import ( "testing" ) func TestHexEscape(t *testing.T) { always := func([]rune, int) bool { return true } for _, tc := range []struct { description, s, want string should func([]rune, int) bool }{ { description: "empty string", s: "", want: "", should: always, }, { description: "first rune", s: "hello world", want: "__0x68__ello world", should: func(_ []rune, i int) bool { return i == 0 }, }, { description: "last rune", s: "hello world", want: "hello worl__0x64__", should: func(r []rune, i int) bool { return i == len(r)-1 }, }, { description: "runes in middle", s: "hello world", want: "hello__0x20____0x20__world", should: func(r []rune, i int) bool { return r[i] == ' ' }, }, { description: "unicode", s: "☺☺", should: always, want: "__0x263a____0x263a__", }, } { got := HexEscape(tc.s, tc.should) if got != tc.want { t.Errorf("%s: got escaped %q want %q", tc.description, got, tc.want) } got = HexUnescape(got) if got != tc.s { t.Errorf("%s: got unescaped %q want %q", tc.description, got, tc.s) } } } func TestHexEscapeUnescapeWeirdStrings(t *testing.T) { for name, s := range WeirdStrings { escaped := HexEscape(s, func(r []rune, i int) bool { return !IsASCIIAlphanumeric(r[i]) }) unescaped := HexUnescape(escaped) if unescaped != s { t.Errorf("%s: got unescaped %q want %q", name, unescaped, s) } } } func TestHexUnescapeOnInvalid(t *testing.T) { // Unescaping of valid escape sequences is tested in TestEscape. // This only tests invalid escape sequences, so Unescape is expected // to do nothing. for _, s := range []string{ "0x68", "_0x68_", "__0x68_", "_0x68__", "__1x68__", "__0y68__", "__0xag__", // invalid hex digit "__0x8fffffff__", // out of int32 range } { got := HexUnescape(s) if got != s { t.Errorf("%s: got %q want %q", s, got, s) } } } ================================================ FILE: internal/gcerr/errorcode_string.go ================================================ // Code generated by "stringer -type=ErrorCode"; DO NOT EDIT. package gcerr import "strconv" const _ErrorCode_name = "OKUnknownNotFoundAlreadyExistsInvalidArgumentInternalUnimplementedFailedPreconditionPermissionDeniedResourceExhaustedCanceledDeadlineExceeded" var _ErrorCode_index = [...]uint8{0, 2, 9, 17, 30, 45, 53, 66, 84, 100, 117, 125, 141} func (i ErrorCode) String() string { if i < 0 || i >= ErrorCode(len(_ErrorCode_index)-1) { return "ErrorCode(" + strconv.FormatInt(int64(i), 10) + ")" } return _ErrorCode_name[_ErrorCode_index[i]:_ErrorCode_index[i+1]] } ================================================ FILE: internal/gcerr/gcerr.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package gcerr provides an error type for Go CDK APIs. package gcerr import ( "context" "errors" "fmt" "io" "reflect" "gocloud.dev/internal/retry" "golang.org/x/xerrors" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) // An ErrorCode describes the error's category. type ErrorCode int const ( // OK is returned by the Code function on a nil error. It is not a valid // code for an error. OK ErrorCode = 0 // Unknown means that the error could not be categorized. Unknown ErrorCode = 1 // NotFound means that the resource was not found. NotFound ErrorCode = 2 // AlreadyExists means that the resource exists, but it should not. AlreadyExists ErrorCode = 3 // InvalidArguments means that a value given to a Go CDK API is incorrect. InvalidArgument ErrorCode = 4 // Internal means that something unexpected happened. Internal errors always indicate // bugs in the Go CDK (or possibly the underlying service). Internal ErrorCode = 5 // Unimplemented means that the feature is not implemented. Unimplemented ErrorCode = 6 // FailedPrecondition means that the system was in the wrong state. FailedPrecondition ErrorCode = 7 // PermissionDenied means that the caller does not have permission to execute the specified operation. PermissionDenied ErrorCode = 8 // ResourceExhausted means that some resource has been exhausted, typically because a service resource limit // has been reached. ResourceExhausted ErrorCode = 9 // Canceled means that the operation was canceled. Canceled ErrorCode = 10 // DeadlineExceeded means that The operation timed out. DeadlineExceeded ErrorCode = 11 ) // When adding a new error code, try to use the names defined in google.golang.org/grpc/codes. // Do not change the numbers assigned to codes: past values may be stored in metric databases. // Call "go generate" whenever you change the above list of error codes. // To get stringer: // go get golang.org/x/tools/cmd/stringer // Make sure $GOPATH/bin or $GOBIN in on your path. //go:generate stringer -type=ErrorCode // An Error describes a Go CDK error. type Error struct { // Code is the error code. Code ErrorCode msg string frame xerrors.Frame err error } // Error returns the error as a string. func (e *Error) Error() string { return fmt.Sprint(e) } // Format formats the error. func (e *Error) Format(s fmt.State, c rune) { xerrors.FormatError(e, s, c) } // FormatError formats the errots. func (e *Error) FormatError(p xerrors.Printer) (next error) { if e.msg == "" { p.Printf("code=%v", e.Code) } else { p.Printf("%s (code=%v)", e.msg, e.Code) } e.frame.Format(p) return e.err } // Unwrap returns the error underlying the receiver, which may be nil. func (e *Error) Unwrap() error { return e.err } // New returns a new error with the given code, underlying error and message. Pass 1 // for the call depth if New is called from the function raising the error; pass 2 if // it is called from a helper function that was invoked by the original function; and // so on. func New(c ErrorCode, err error, callDepth int, msg string) *Error { return &Error{ Code: c, msg: msg, frame: xerrors.Caller(callDepth), err: err, } } // Newf uses format and args to format a message, then calls New. func Newf(c ErrorCode, err error, format string, args ...any) *Error { return New(c, err, 2, fmt.Sprintf(format, args...)) } // DoNotWrap reports whether an error should not be wrapped in the Error // type from this package. // It returns true if err is a retry error, a context error, io.EOF, or if it wraps // one of those. func DoNotWrap(err error) bool { if errors.Is(err, io.EOF) { return true } if errors.Is(err, context.Canceled) { return true } if errors.Is(err, context.DeadlineExceeded) { return true } var r *retry.ContextError return errors.As(err, &r) } // GRPCCode extracts the gRPC status code and converts it into an ErrorCode. // It returns Unknown if the error isn't from gRPC. func GRPCCode(err error) ErrorCode { switch status.Code(err) { case codes.NotFound: return NotFound case codes.AlreadyExists: return AlreadyExists case codes.InvalidArgument: return InvalidArgument case codes.Internal: return Internal case codes.Unimplemented: return Unimplemented case codes.FailedPrecondition: return FailedPrecondition case codes.PermissionDenied: return PermissionDenied case codes.ResourceExhausted: return ResourceExhausted case codes.Canceled: return Canceled case codes.DeadlineExceeded: return DeadlineExceeded default: return Unknown } } // ErrorAs is a helper for the ErrorAs method of an API's portable type. // It performs some initial nil checks, and does a single level of unwrapping // when err is a *gcerr.Error. Then it calls its errorAs argument, which should // be a driver implementation of ErrorAs. func ErrorAs(err error, target any, errorAs func(error, any) bool) bool { if err == nil { return false } if target == nil { panic("ErrorAs target cannot be nil") } val := reflect.ValueOf(target) if val.Type().Kind() != reflect.Pointer || val.IsNil() { panic("ErrorAs target must be a non-nil pointer") } if e, ok := err.(*Error); ok { err = e.Unwrap() } return errorAs(err, target) } ================================================ FILE: internal/gcerr/gcerr_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcerr import ( "errors" "fmt" "regexp" "strconv" "strings" "testing" ) func TestNewf(t *testing.T) { e := Newf(Internal, nil, "a %d b", 3) got := e.Error() want := "a 3 b (code=Internal)" if got != want { t.Errorf("got %q, want %q", got, want) } } func TestFormatting(t *testing.T) { for i, test := range []struct { err *Error verb string want []string // regexps, one per line }{ { New(NotFound, nil, 1, "message"), "%v", []string{`^message \(code=NotFound\)$`}, }, { New(NotFound, nil, 1, "message"), "%+v", []string{ `^message \(code=NotFound\):$`, `\s+gocloud.dev/internal/gcerr.TestFormatting$`, `\s+.*/internal/gcerr/gcerr_test.go:\d+$`, }, }, { New(AlreadyExists, errors.New("wrapped"), 1, "message"), "%v", []string{`^message \(code=AlreadyExists\): wrapped$`}, }, { New(AlreadyExists, errors.New("wrapped"), 1, "message"), "%+v", []string{ `^message \(code=AlreadyExists\):`, `^\s+gocloud.dev/internal/gcerr.TestFormatting$`, `^\s+.*/internal/gcerr/gcerr_test.go:\d+$`, `^\s+- wrapped$`, }, }, { New(AlreadyExists, errors.New("wrapped"), 1, ""), "%v", []string{`^code=AlreadyExists: wrapped`}, }, { New(AlreadyExists, errors.New("wrapped"), 1, ""), "%+v", []string{ `^code=AlreadyExists:`, `^\s+gocloud.dev/internal/gcerr.TestFormatting$`, `^\s+.*/internal/gcerr/gcerr_test.go:\d+$`, `^\s+- wrapped$`, }, }, } { t.Run(strconv.Itoa(i), func(t *testing.T) { gotString := fmt.Sprintf(test.verb, test.err) gotLines := strings.Split(gotString, "\n") if got, want := len(gotLines), len(test.want); got != want { t.Fatalf("got %d lines, want %d. got:\n%s", got, want, gotString) } for j, gl := range gotLines { matched, err := regexp.MatchString(test.want[j], gl) if err != nil { t.Fatal(err) } if !matched { t.Fatalf("line #%d: got %q, which doesn't match %q", j, gl, test.want[j]) } } }) } } func TestError(t *testing.T) { // Check that err.Error() == fmt.Sprintf("%s", err) for _, err := range []*Error{ New(NotFound, nil, 1, "message"), New(AlreadyExists, errors.New("wrapped"), 1, "message"), New(AlreadyExists, errors.New("wrapped"), 1, ""), } { got := err.Error() want := fmt.Sprint(err) if got != want { t.Errorf("%v: got %q, want %q", err, got, want) } } } ================================================ FILE: internal/openurl/openurl.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package openurl provides helpers for URLMux and URLOpeners in portable APIs. package openurl // import "gocloud.dev/internal/openurl" import ( "fmt" "net/url" "sort" "strings" ) // SchemeMap maps URL schemes to values. The zero value is an empty map, ready for use. // All schemes are stored and compared case-insensitively. type SchemeMap struct { api string m map[string]any } // Register registers scheme for value; subsequent calls to FromString or // FromURL with scheme will return value. // api is the portable API name (e.g., "blob"); the same value should always // be passed. It should be in all lowercase. // typ is the portable type (e.g., "Bucket"). // Register panics if scheme has already been registered. func (m *SchemeMap) Register(api, typ, scheme string, value any) { if m.m == nil { m.m = map[string]any{} } if api != strings.ToLower(api) { panic(fmt.Errorf("api should be lowercase: %q", api)) } if m.api == "" { m.api = api } else if m.api != api { panic(fmt.Errorf("previously registered using api %q (now %q)", m.api, api)) } scheme = strings.ToLower(scheme) if _, exists := m.m[scheme]; exists { panic(fmt.Errorf("scheme %q already registered for %s.%s", scheme, api, typ)) } m.m[scheme] = value } // FromString parses urlstr as an URL and looks up the value for the URL's scheme. func (m *SchemeMap) FromString(typ, urlstr string) (any, *url.URL, error) { u, err := url.Parse(urlstr) if err != nil { return nil, nil, fmt.Errorf("open %s.%s: %v", m.api, typ, err) } val, err := m.FromURL(typ, u) if err != nil { return nil, nil, err } return val, u, nil } // FromURL looks up the value for u's scheme. func (m *SchemeMap) FromURL(typ string, u *url.URL) (any, error) { scheme := strings.ToLower(u.Scheme) if scheme == "" { return nil, fmt.Errorf("open %s.%s: no scheme in URL %q", m.api, typ, u) } for _, prefix := range []string{ fmt.Sprintf("%s+%s+", m.api, strings.ToLower(typ)), fmt.Sprintf("%s+", m.api), } { scheme = strings.TrimPrefix(scheme, prefix) } v, ok := m.m[scheme] if !ok { return nil, fmt.Errorf("open %s.%s: no driver registered for %q for URL %q; available schemes: %v", m.api, typ, scheme, u, strings.Join(m.Schemes(), ", ")) } return v, nil } // Schemes returns a sorted slice of the registered schemes. func (m *SchemeMap) Schemes() []string { var schemes []string for s := range m.m { schemes = append(schemes, s) } sort.Strings(schemes) return schemes } // ValidScheme returns true iff scheme has been registered. func (m *SchemeMap) ValidScheme(scheme string) bool { _, exists := m.m[strings.ToLower(scheme)] return exists } ================================================ FILE: internal/openurl/openurl_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package openurl_test import ( "testing" "github.com/google/go-cmp/cmp" "gocloud.dev/internal/openurl" ) func TestSchemeMap(t *testing.T) { const foo, bar = "foo value", "bar value" tests := []struct { url string wantErr bool want any }{ {"invalid url", true, nil}, {"foo://a/b/c", false, foo}, {"api+foo://a/b/c", false, foo}, {"api+type+foo://a/b/c", false, foo}, {"bar://a?p=v", false, bar}, {"api+bar://a", false, bar}, {"api+type+bar://a", false, bar}, {"typ+bar://a", true, nil}, {"api+typ+bar://a", true, nil}, } var emptyM, m openurl.SchemeMap m.Register("api", "Type", "foo", foo) m.Register("api", "Type", "bar", bar) if diff := cmp.Diff(m.Schemes(), []string{"bar", "foo"}); diff != "" { t.Errorf("Schemes: %s", diff) } if !m.ValidScheme("foo") || !m.ValidScheme("bar") { t.Errorf("ValidScheme didn't return true for valid scheme") } if m.ValidScheme("foo2") || m.ValidScheme("http") { t.Errorf("ValidScheme didn't return false for invalid scheme") } for _, test := range tests { // Empty SchemeMap should always return an error. if _, _, err := emptyM.FromString("type", test.url); err == nil { t.Errorf("%s: empty SchemeMap got nil error, wanted non-nil error", test.url) } got, gotURL, gotErr := m.FromString("type", test.url) if (gotErr != nil) != test.wantErr { t.Errorf("%s: got error %v, want error: %v", test.url, gotErr, test.wantErr) } if gotErr != nil { continue } if got := gotURL.String(); got != test.url { t.Errorf("%s: got URL %q want %v", test.url, got, test.url) } if got != test.want { t.Errorf("%s: got %v want %v", test.url, got, test.want) } } } ================================================ FILE: internal/otel/metrics.go ================================================ // Copyright 2019-2025 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package otel supports OpenTelemetry tracing and metrics for the Go Cloud Development Kit. package otel import ( "fmt" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/metric" sdkmetric "go.opentelemetry.io/otel/sdk/metric" "strings" ) // Units are encoded according to the case-sensitive abbreviations from the // Unified Code for Units of Measure: http://unitsofmeasure.org/ucum.html. const ( unitDimensionless = "1" unitMilliseconds = "ms" unitBytes = "By" ) var ( defaultMillisecondsBoundaries = []float64{ 0.0, 0.1, 0.2, 0.4, 0.6, 0.8, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 8.0, 10.0, 13.0, 16.0, 20.0, 25.0, 30.0, 40.0, 50.0, 65.0, 80.0, 100.0, 130.0, 160.0, 200.0, 250.0, 300.0, 400.0, 500.0, 650.0, 800.0, 1000.0, 2000.0, 5000.0, 10000.0, } ) func Views(pkg string) []sdkmetric.View { return []sdkmetric.View{ // View for latency histogram. func(inst sdkmetric.Instrument) (sdkmetric.Stream, bool) { if inst.Kind == sdkmetric.InstrumentKindHistogram { if inst.Name == pkg+"/latency" { return sdkmetric.Stream{ Name: inst.Name, Description: "Distribution of method latency, by provider and method.", Aggregation: sdkmetric.AggregationExplicitBucketHistogram{ Boundaries: defaultMillisecondsBoundaries, }, AttributeFilter: func(kv attribute.KeyValue) bool { return kv.Key == packageKey || kv.Key == methodKey }, }, true } } return sdkmetric.Stream{}, false }, // View for completed_calls count. func(inst sdkmetric.Instrument) (sdkmetric.Stream, bool) { if inst.Kind == sdkmetric.InstrumentKindHistogram { if inst.Name == pkg+"/latency" { return sdkmetric.Stream{ Name: strings.Replace(inst.Name, "/latency", "/completed_calls", 1), Description: "Count of method calls by provider, method and status.", Aggregation: sdkmetric.DefaultAggregationSelector(sdkmetric.InstrumentKindCounter), AttributeFilter: func(kv attribute.KeyValue) bool { return kv.Key == methodKey || kv.Key == statusKey }, }, true } } return sdkmetric.Stream{}, false }, } } // CounterView returns summation views that add up individual measurements the counter takes. func CounterView(pkg string, meterName string, description string) []sdkmetric.View { return []sdkmetric.View{ // View for gauge counts. func(inst sdkmetric.Instrument) (sdkmetric.Stream, bool) { if inst.Kind == sdkmetric.InstrumentKindCounter { if inst.Name == pkg+meterName { return sdkmetric.Stream{ Name: inst.Name, Description: description, Aggregation: sdkmetric.DefaultAggregationSelector(sdkmetric.InstrumentKindCounter), }, true } } return sdkmetric.Stream{}, false }, } } // LatencyMeasure returns the measure for method call latency used by Go CDK APIs. func LatencyMeasure(pkg string, provider string) metric.Float64Histogram { attrs := []attribute.KeyValue{ packageKey.String(pkg), providerKey.String(provider), } pkgMeter := otel.Meter(pkg, metric.WithInstrumentationAttributes(attrs...)) m, err := pkgMeter.Float64Histogram( pkg+"/latency", metric.WithDescription("Latency distribution of method calls"), metric.WithUnit(unitMilliseconds), ) if err != nil { // The only possible errors are from invalid key or value names, and those are programming // errors that will be found during testing. panic(fmt.Sprintf("fullName=%q, provider=%q: %v", pkg, pkgMeter, err)) } return m } // DimensionlessMeasure creates a simple counter specifically for dimensionless measurements. func DimensionlessMeasure(pkg string, provider string, meterName string, description string) metric.Int64Counter { attrs := []attribute.KeyValue{ packageKey.String(pkg), providerKey.String(provider), } pkgMeter := otel.Meter(pkg, metric.WithInstrumentationAttributes(attrs...)) m, err := pkgMeter.Int64Counter(pkg+meterName, metric.WithDescription(description), metric.WithUnit(unitDimensionless)) if err != nil { // The only possible errors are from invalid key or value names, // and those are programming errors that will be found during testing. panic(fmt.Sprintf("fullName=%q, provider=%q: %v", pkg, pkgMeter, err)) } return m } // BytesMeasure creates a counter for bytes measurements. func BytesMeasure(pkg string, provider string, meterName string, description string) metric.Int64Counter { attrs := []attribute.KeyValue{ packageKey.String(pkg), providerKey.String(provider), } pkgMeter := otel.Meter(pkg, metric.WithInstrumentationAttributes(attrs...)) m, err := pkgMeter.Int64Counter(pkg+meterName, metric.WithDescription(description), metric.WithUnit(unitBytes)) if err != nil { // The only possible errors are from invalid key or value names, and those are programming // errors that will be found during testing. panic(fmt.Sprintf("fullName=%q, provider=%q: %v", pkg, pkgMeter, err)) } return m } ================================================ FILE: internal/otel/trace.go ================================================ // Copyright 2019-2025 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package otel import ( "context" "fmt" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/codes" "go.opentelemetry.io/otel/metric" "go.opentelemetry.io/otel/trace" "gocloud.dev/gcerrors" "reflect" "time" ) // Common attribute keys used across the Go CDK. var ( methodKey = attribute.Key("gocdk_method") packageKey = attribute.Key("gocdk_package") providerKey = attribute.Key("gocdk_provider") statusKey = attribute.Key("gocdk_status") errorKey = attribute.Key("gocdk_error") ) const ( startTimeContextKey = "spanStartTimeCtxKey" methodNameContextKey = "methodNameCtxKey" ) // Tracer provides OpenTelemetry tracing for Go CDK packages. type Tracer struct { pkg string provider string tracer trace.Tracer latencyMeasure metric.Float64Histogram } // ProviderName returns the name of the provider associated with the driver value. // It is intended to be used as the provider argument to NewTracer. // It actually returns the package path of the driver's type. func ProviderName(driver any) string { // Return the last component of the package path. if driver == nil { return "" } t := reflect.TypeOf(driver) if t.Kind() == reflect.Pointer { t = t.Elem() } return t.PkgPath() } // NewTracer creates a new Tracer for a package and provider. func NewTracer(pkg string, provider string) *Tracer { attrs := []attribute.KeyValue{ packageKey.String(pkg), providerKey.String(provider), } tracer := otel.Tracer(pkg, trace.WithInstrumentationAttributes(attrs...)) return &Tracer{ pkg: pkg, provider: provider, tracer: tracer, latencyMeasure: LatencyMeasure(pkg, provider), } } // Start creates and starts a new span and returns the updated context and span. func (t *Tracer) Start(ctx context.Context, methodName string) (context.Context, trace.Span) { fullName := t.pkg + "." + methodName sCtx, span := t.tracer.Start(ctx, fullName, trace.WithAttributes(methodKey.String(methodName))) sCtx = context.WithValue(sCtx, startTimeContextKey, time.Now()) return context.WithValue(sCtx, methodNameContextKey, fullName), span } // End completes a span with error information if applicable. func (t *Tracer) End(ctx context.Context, span trace.Span, err error) { startTime := ctx.Value(startTimeContextKey).(time.Time) elapsed := time.Since(startTime) code := gcerrors.OK if err != nil { code = gcerrors.Code(err) span.SetAttributes( errorKey.String(err.Error()), statusKey.String(fmt.Sprint(code)), ) span.SetStatus(codes.Error, err.Error()) span.RecordError(err) } else { span.SetStatus(codes.Ok, "") } span.End() methodName := ctx.Value(methodNameContextKey).(string) t.latencyMeasure.Record(ctx, float64(elapsed.Milliseconds()), metric.WithAttributes( statusKey.String(fmt.Sprint(code)), methodKey.String(methodName)), ) } ================================================ FILE: internal/otel/trace_test.go ================================================ // Copyright 2025 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package otel import ( "testing" ) type testDriver struct{} func TestProviderName(t *testing.T) { testCases := []struct { name string driver any want string }{ {"nil", nil, ""}, {"struct", testDriver{}, "gocloud.dev/internal/otel"}, {"pointer", &testDriver{}, "gocloud.dev/internal/otel"}, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { got := ProviderName(tc.driver) if got != tc.want { t.Errorf("ProviderName(%#v) = %q, want %q", tc.driver, got, tc.want) } }) } } ================================================ FILE: internal/releasehelper/releasehelper.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Helper tool for creating new releases of the Go CDK. Run without arguments // or with 'help' for details. package main import ( "bufio" "encoding/json" "fmt" "log" "os" "os/exec" "path/filepath" "regexp" "strings" ) var helpText string = ` Helper tool for creating new releases of the Go CDK. Automates the modifications required in the project's go.mod files to create an test new releases. The tool processes all modules listed in the 'allmodules' file. For each module it handles all dependencies on other gocloud.dev modules. Run it from the root directory of the repository, as follows: $ %s Where command is one of the following: addreplace adds 'replace' directives to point to local versions for testing. dropreplace removes these directives. setversion sets 'required' version of modules to a given version formatted as vX.Y.Z tag runs 'git tag /' for all CDK modules help prints this usage message ` func printHelp() { _, binName := filepath.Split(os.Args[0]) fmt.Fprintf(os.Stderr, helpText, binName) fmt.Fprintln(os.Stderr) } // cmdCheck invokes the command given in s, echoing the invocation to stdout. // It checks that the command was successful and returns its standard output. // If the command returned a non-0 status, log.Fatal is invoked. func cmdCheck(s string) []byte { fmt.Printf(" -> %s\n", s) fields := strings.Fields(s) if len(fields) < 1 { log.Fatal(`Expected "command "`) } b, err := exec.Command(fields[0], fields[1:]...).Output() if exiterr, ok := err.(*exec.ExitError); ok { log.Fatalf("%s; stderr: %s\n", err, string(exiterr.Stderr)) } else if err != nil { log.Fatal("exec.Command", err) } return b } // GoMod holds "go mod" parameters, taken from "go mod help edit", in order to parse the JSON // output of `go mod edit -json`. type GoMod struct { Module Module Go string Require []Require Exclude []Module Replace []Replace } // Module represents a Go module. type Module struct { Path string Version string } // Require represents a required module. type Require struct { Path string Version string Indirect bool } // Replace represents a replace directive. type Replace struct { Old Module New Module } // parseModuleInfo parses module information from a go.mod file at path. func parseModuleInfo(path string) GoMod { rawJson := cmdCheck("go mod edit -json " + path) var modInfo GoMod err := json.Unmarshal(rawJson, &modInfo) if err != nil { log.Fatal(err) } return modInfo } // runOnGomod processes a single go.mod file (located in directory 'path'). // Each require in the go.mod file is processed with reqHandler, a callback // function. It's called with these arguments: // // gomodPath - path to the go.mod file where this 'require' was found // mod - name of the module being 'require'd // modPath - mod's location in the filesystem relative to // the go.mod 'require'ing it func runOnGomod(path string, reqHandler func(gomodPath, mod, modPath string)) { gomodPath := filepath.Join(path, "go.mod") fmt.Println("Processing", gomodPath) modInfo := parseModuleInfo(gomodPath) base := "gocloud.dev" for _, r := range modInfo.Require { // Find requirements on modules within the gocloud.dev tree. if strings.HasPrefix(r.Path, base) { // Find the relative path from 'path' and the module required here. var reqPath string if r.Path == base { reqPath = "." } else { reqPath = strings.TrimPrefix(r.Path, base+"/") } rel, err := filepath.Rel(path, reqPath) if err != nil { log.Fatal(err) } // When path is '.', filepath.Rel will append a /. to the result and we // may get paths like ../../. if strings.HasSuffix(rel, "/.") { rel, _ = filepath.Split(rel) } reqHandler(gomodPath, r.Path, rel) } } } func gomodAddReplace(path string) { runOnGomod(path, func(gomodPath, mod, modPath string) { cmdCheck(fmt.Sprintf("go mod edit -replace=%s=%s %s", mod, modPath, gomodPath)) }) } func gomodDropReplace(path string) { runOnGomod(path, func(gomodPath, mod, modPath string) { cmdCheck(fmt.Sprintf("go mod edit -dropreplace=%s %s", mod, gomodPath)) }) } func gomodSetVersion(path, v string) { runOnGomod(path, func(gomodPath, mod, modPath string) { cmdCheck(fmt.Sprintf("go mod edit -require=%s@%s %s", mod, v, gomodPath)) }) } func gomodTag(path, v string) { var tagName string if path == "." { tagName = v } else { tagName = filepath.Join(path, v) } cmdCheck(fmt.Sprintf("git tag %s", tagName)) } func validSemanticVersion(v string) bool { match, err := regexp.MatchString(`v\d+\.\d+\.\d+`, v) if err != nil { return false } return match } func main() { if len(os.Args) < 2 { printHelp() os.Exit(0) } var gomodHandler func(path string) switch os.Args[1] { case "help": printHelp() os.Exit(0) case "addreplace": gomodHandler = gomodAddReplace case "dropreplace": gomodHandler = gomodDropReplace case "setversion": if len(os.Args) < 3 || !validSemanticVersion(os.Args[2]) { printHelp() os.Exit(1) } gomodHandler = func(path string) { gomodSetVersion(path, os.Args[2]) } case "tag": if len(os.Args) < 3 || !validSemanticVersion(os.Args[2]) { printHelp() os.Exit(1) } gomodHandler = func(path string) { gomodTag(path, os.Args[2]) } default: printHelp() os.Exit(1) } f, err := os.Open("allmodules") if err != nil { log.Fatal(err) } input := bufio.NewScanner(f) input.Split(bufio.ScanLines) for input.Scan() { if len(input.Text()) > 0 && !strings.HasPrefix(input.Text(), "#") { fields := strings.Fields(input.Text()) if len(fields) != 2 { log.Fatalf("want 2 fields, got %q\n", input.Text()) } // "tag" only runs if the released field is "yes". Other commands run // for every line. if os.Args[1] != "tag" || fields[1] == "yes" { gomodHandler(fields[0]) } } } if input.Err() != nil { log.Fatal(input.Err()) } } ================================================ FILE: internal/releasehelper/releasehelper_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package main import ( "fmt" "os" "path/filepath" "strings" "testing" ) // The following directory/file structure is created. ROOT is the root temp // directory created by the test. // // ROOT/go.mod <-- main go.mod for gocloud.dev // ROOT/submod/go.mod <-- go.mod for a submodule of gocloud.dev // ROOT/samples/go.mod <-- go.mod for "samples" that include both of the // // other modules var mainGomod = []byte("module gocloud.dev\n") var submodGomod = []byte(`module gocloud.dev/submod require ( gocloud.dev v0.15.0 ) `) var samplesGomod = []byte(`module gocloud.dev/samples require ( gocloud.dev v0.15.0 gocloud.dev/submod v0.15.0 ) `) func createFilesForTest(root string) error { if err := os.WriteFile(filepath.Join(root, "go.mod"), mainGomod, 0o666); err != nil { return err } if err := os.MkdirAll(filepath.Join(root, "submod"), 0o766); err != nil { return err } if err := os.WriteFile(filepath.Join(root, "submod", "go.mod"), submodGomod, 0o666); err != nil { return err } if err := os.MkdirAll(filepath.Join(root, "samples"), 0o766); err != nil { return err } if err := os.WriteFile(filepath.Join(root, "samples", "go.mod"), samplesGomod, 0o666); err != nil { return err } return nil } func Test(t *testing.T) { tempDir := t.TempDir() fmt.Println("temp dir:", tempDir) if err := createFilesForTest(tempDir); err != nil { t.Fatal(err) } if err := os.Chdir(tempDir); err != nil { t.Fatal(err) } // Add replace lines and expect to find them. gomodAddReplace("samples") samplesGomod := filepath.Join("samples", "go.mod") c, err := os.ReadFile(samplesGomod) if err != nil { t.Fatal(err) } replaceLines := []string{ "replace gocloud.dev => " + filepath.Clean("../"), "replace gocloud.dev/submod => " + filepath.Clean("../submod"), } for _, line := range replaceLines { if !strings.Contains(string(c), line) { t.Errorf("Expected to find %q in samples/go.mod", line) } } // Drop replace lines and expect not to find them. gomodDropReplace("samples") c, err = os.ReadFile(samplesGomod) if err != nil { t.Fatal(err) } for _, line := range replaceLines { if strings.Contains(string(c), line) { t.Errorf("Expected to not find %q in samples/go.mod", line) } } // Set new version and check it was set as expected. gomodSetVersion("samples", "v1.8.99") c, err = os.ReadFile(samplesGomod) if err != nil { t.Fatal(err) } if !strings.Contains(string(c), "gocloud.dev v1.8.99") || !strings.Contains(string(c), "gocloud.dev/submod v1.8.99") { t.Error("New versions for require not found in samples/go.mod") } } ================================================ FILE: internal/retry/retry.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package retry provides retry logic. package retry // import "gocloud.dev/internal/retry" import ( "context" "fmt" "time" "github.com/googleapis/gax-go/v2" ) // Call calls the supplied function f repeatedly, using the isRetryable function and // the provided backoff parameters to control the repetition. // // When f returns nil, Call immediately returns nil. // // When f returns an error for which isRetryable returns false, Call immediately // returns that error. // // When f returns an error for which isRetryable returns true, Call sleeps for the // provided backoff value and invokes f again. // // When the provided context is done, Retry returns a ContextError that includes both // ctx.Error() and the last error returned by f, or nil if there isn't one. func Call(ctx context.Context, bo gax.Backoff, isRetryable func(error) bool, f func() error) error { return call(ctx, bo, isRetryable, f, gax.Sleep) } // Split out for testing. func call(ctx context.Context, bo gax.Backoff, isRetryable func(error) bool, f func() error, sleep func(context.Context, time.Duration) error, ) error { // Do nothing if context is done on entry. if err := ctx.Err(); err != nil { return &ContextError{CtxErr: err} } for { err := f() if err == nil { return nil } if !isRetryable(err) { return err } if cerr := sleep(ctx, bo.Pause()); cerr != nil { return &ContextError{CtxErr: cerr, FuncErr: err} } } } // A ContextError contains both a context error (either context.Canceled or // context.DeadlineExceeded), and the last error from the function being retried, // or nil if the function was never called. type ContextError struct { CtxErr error // The error obtained from ctx.Err() FuncErr error // The error obtained from the function being retried, or nil } func (e *ContextError) Error() string { return fmt.Sprintf("%v; last error: %v", e.CtxErr, e.FuncErr) } // Is returns true iff one of the two errors held in e is equal to target. func (e *ContextError) Is(target error) bool { return e.CtxErr == target || e.FuncErr == target } ================================================ FILE: internal/retry/retry_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package retry import ( "context" "errors" "os" "testing" "time" "github.com/googleapis/gax-go/v2" ) // Errors to distinguish retryable and non-retryable cases. var ( errRetry = errors.New("retry") errNoRetry = errors.New("no retry") ) func retryable(err error) bool { return err == errRetry } func TestCall(t *testing.T) { for _, test := range []struct { desc string isRetryable func(error) bool f func(int) error // passed the number of calls so far wantErr error // the return value of call wantCount int // number of times f is called }{ { desc: "f returns nil", isRetryable: retryable, f: func(int) error { return nil }, wantCount: 1, wantErr: nil, }, { desc: "f returns non-retryable error", isRetryable: retryable, f: func(int) error { return errNoRetry }, wantCount: 1, wantErr: errNoRetry, }, { desc: "f returns retryable error", isRetryable: retryable, f: func(n int) error { if n < 2 { return errRetry } return errNoRetry }, wantCount: 3, wantErr: errNoRetry, }, { desc: "f returns context error", // same as non-retryable isRetryable: retryable, f: func(int) error { return context.Canceled }, wantCount: 1, wantErr: context.Canceled, }, } { t.Run(test.desc, func(t *testing.T) { sleep := func(context.Context, time.Duration) error { return nil } gotCount := 0 f := func() error { gotCount++; return test.f(gotCount - 1) } gotErr := call(context.Background(), gax.Backoff{}, test.isRetryable, f, sleep) if gotErr != test.wantErr { t.Errorf("error: got %v, want %v", gotErr, test.wantErr) } if gotCount != test.wantCount { t.Errorf("retry count: got %d, want %d", gotCount, test.wantCount) } }) } } func TestCallCancel(t *testing.T) { t.Run("done on entry", func(t *testing.T) { // If the context is done on entry, f is never called. ctx, cancel := context.WithCancel(context.Background()) cancel() gotCount := 0 f := func() error { gotCount++; return nil } gotErr := call(ctx, gax.Backoff{}, retryable, f, nil) if gotCount != 0 { t.Errorf("retry count: got %d, want 0", gotCount) } wantErr := &ContextError{CtxErr: context.Canceled} if !equalContextError(gotErr, wantErr) { t.Errorf("error: got %v, want %v", gotErr, wantErr) } }) t.Run("done in sleep", func(t *testing.T) { // If the context is done during sleep, we get a ContextError. gotCount := 0 f := func() error { gotCount++; return errRetry } sleep := func(context.Context, time.Duration) error { return context.Canceled } gotErr := call(context.Background(), gax.Backoff{}, retryable, f, sleep) if gotCount != 1 { t.Errorf("retry count: got %d, want 1", gotCount) } wantErr := &ContextError{CtxErr: context.Canceled, FuncErr: errRetry} if !equalContextError(gotErr, wantErr) { t.Errorf("error: got %v, want %v", gotErr, wantErr) } }) } func equalContextError(got error, want *ContextError) bool { cerr, ok := got.(*ContextError) if !ok { return false } return cerr.CtxErr == want.CtxErr && cerr.FuncErr == want.FuncErr } func TestErrorsIs(t *testing.T) { err := &ContextError{ CtxErr: context.Canceled, FuncErr: os.ErrExist, } for _, target := range []error{err, context.Canceled, os.ErrExist} { if !errors.Is(err, target) { t.Errorf("xerrors.Is(%v) == false, want true", target) } } } ================================================ FILE: internal/testing/alldeps ================================================ cel.dev/expr cloud.google.com/go cloud.google.com/go/auth cloud.google.com/go/auth/oauth2adapt cloud.google.com/go/compute/metadata cloud.google.com/go/firestore cloud.google.com/go/iam cloud.google.com/go/kms cloud.google.com/go/longrunning cloud.google.com/go/monitoring cloud.google.com/go/pubsub cloud.google.com/go/pubsub/v2 cloud.google.com/go/secretmanager cloud.google.com/go/storage cloud.google.com/go/trace filippo.io/edwards25519 github.com/Azure/azure-amqp-common-go/v3 github.com/Azure/azure-sdk-for-go/sdk/azcore github.com/Azure/azure-sdk-for-go/sdk/azidentity github.com/Azure/azure-sdk-for-go/sdk/internal github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus github.com/Azure/azure-sdk-for-go/sdk/storage/azblob github.com/Azure/go-amqp github.com/AzureAD/microsoft-authentication-library-for-go github.com/GoogleCloudPlatform/cloudsql-proxy github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping github.com/GoogleCloudPlatform/opentelemetry-operations-go/propagator github.com/IBM/sarama github.com/XSAM/otelsql github.com/aws/aws-sdk-go github.com/aws/aws-sdk-go-v2 github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream github.com/aws/aws-sdk-go-v2/config github.com/aws/aws-sdk-go-v2/credentials github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression github.com/aws/aws-sdk-go-v2/feature/ec2/imds github.com/aws/aws-sdk-go-v2/feature/rds/auth github.com/aws/aws-sdk-go-v2/feature/s3/manager github.com/aws/aws-sdk-go-v2/internal/configsources github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 github.com/aws/aws-sdk-go-v2/internal/ini github.com/aws/aws-sdk-go-v2/internal/v4a github.com/aws/aws-sdk-go-v2/service/dynamodb github.com/aws/aws-sdk-go-v2/service/dynamodbstreams github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding github.com/aws/aws-sdk-go-v2/service/internal/checksum github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery github.com/aws/aws-sdk-go-v2/service/internal/presigned-url github.com/aws/aws-sdk-go-v2/service/internal/s3shared github.com/aws/aws-sdk-go-v2/service/kms github.com/aws/aws-sdk-go-v2/service/s3 github.com/aws/aws-sdk-go-v2/service/secretsmanager github.com/aws/aws-sdk-go-v2/service/signin github.com/aws/aws-sdk-go-v2/service/sns github.com/aws/aws-sdk-go-v2/service/sqs github.com/aws/aws-sdk-go-v2/service/ssm github.com/aws/aws-sdk-go-v2/service/sso github.com/aws/aws-sdk-go-v2/service/ssooidc github.com/aws/aws-sdk-go-v2/service/sts github.com/aws/smithy-go github.com/beorn7/perks github.com/cenkalti/backoff/v4 github.com/cenkalti/backoff/v5 github.com/cespare/xxhash/v2 github.com/cncf/xds/go github.com/coreos/go-semver github.com/coreos/go-systemd/v22 github.com/davecgh/go-spew github.com/eapache/go-resiliency github.com/eapache/queue github.com/envoyproxy/go-control-plane/envoy github.com/envoyproxy/protoc-gen-validate github.com/felixge/httpsnoop github.com/fsnotify/fsnotify github.com/go-jose/go-jose/v4 github.com/go-logr/logr github.com/go-logr/stdr github.com/go-sql-driver/mysql github.com/gogo/protobuf github.com/golang-jwt/jwt/v5 github.com/golang/protobuf github.com/golang/snappy github.com/google/go-cmp github.com/google/go-replayers/grpcreplay github.com/google/go-replayers/httpreplay github.com/google/martian/v3 github.com/google/s2a-go github.com/google/subcommands github.com/google/uuid github.com/google/wire github.com/googleapis/enterprise-certificate-proxy github.com/googleapis/gax-go/v2 github.com/gorilla/mux github.com/grpc-ecosystem/grpc-gateway/v2 github.com/hashicorp/errwrap github.com/hashicorp/go-cleanhttp github.com/hashicorp/go-multierror github.com/hashicorp/go-retryablehttp github.com/hashicorp/go-rootcerts github.com/hashicorp/go-secure-stdlib/parseutil github.com/hashicorp/go-secure-stdlib/strutil github.com/hashicorp/go-sockaddr github.com/hashicorp/go-uuid github.com/hashicorp/hcl github.com/hashicorp/vault/api github.com/jcmturner/aescts/v2 github.com/jcmturner/dnsutils/v2 github.com/jcmturner/gofork github.com/jcmturner/gokrb5/v8 github.com/jcmturner/rpc/v2 github.com/jmespath/go-jmespath github.com/klauspost/compress github.com/kylelemons/godebug github.com/lib/pq github.com/mitchellh/mapstructure github.com/montanaflynn/stats github.com/munnerz/goautoneg github.com/nats-io/nats.go github.com/nats-io/nkeys github.com/nats-io/nuid github.com/pierrec/lz4/v4 github.com/pkg/browser github.com/prometheus/client_golang github.com/prometheus/client_model github.com/prometheus/common github.com/prometheus/otlptranslator github.com/prometheus/procfs github.com/rabbitmq/amqp091-go github.com/rcrowley/go-metrics github.com/ryanuber/go-glob github.com/spiffe/go-spiffe/v2 github.com/xdg-go/scram github.com/xdg-go/stringprep github.com/youmark/pkcs8 go.etcd.io/etcd go.etcd.io/etcd/api/v3 go.etcd.io/etcd/client/pkg/v3 go.etcd.io/etcd/client/v3 go.mongodb.org/mongo-driver go.opencensus.io go.opentelemetry.io/auto/sdk go.opentelemetry.io/contrib/bridges/prometheus go.opentelemetry.io/contrib/detectors/aws/ec2 go.opentelemetry.io/contrib/detectors/gcp go.opentelemetry.io/contrib/exporters/autoexport go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp go.opentelemetry.io/contrib/propagators/autoprop go.opentelemetry.io/contrib/propagators/aws go.opentelemetry.io/contrib/propagators/b3 go.opentelemetry.io/contrib/propagators/jaeger go.opentelemetry.io/contrib/propagators/ot go.opentelemetry.io/otel go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp go.opentelemetry.io/otel/exporters/otlp/otlptrace go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp go.opentelemetry.io/otel/exporters/prometheus go.opentelemetry.io/otel/exporters/stdout/stdoutlog go.opentelemetry.io/otel/exporters/stdout/stdoutmetric go.opentelemetry.io/otel/exporters/stdout/stdouttrace go.opentelemetry.io/otel/log go.opentelemetry.io/otel/metric go.opentelemetry.io/otel/sdk go.opentelemetry.io/otel/sdk/log go.opentelemetry.io/otel/sdk/metric go.opentelemetry.io/otel/trace go.opentelemetry.io/proto/otlp go.uber.org/multierr go.uber.org/zap go.yaml.in/yaml/v2 gocloud.dev gocloud.dev/docstore/mongodocstore gocloud.dev/internal/website gocloud.dev/pubsub/kafkapubsub gocloud.dev/pubsub/natspubsub gocloud.dev/pubsub/rabbitpubsub gocloud.dev/runtimevar/etcdvar gocloud.dev/runtimevar/hashivault gocloud.dev/samples gocloud.dev/secrets/hashivault golang.org/x/crypto golang.org/x/mod golang.org/x/net golang.org/x/oauth2 golang.org/x/sync golang.org/x/sys golang.org/x/text golang.org/x/time golang.org/x/tools golang.org/x/xerrors google.golang.org/api google.golang.org/genproto google.golang.org/genproto/googleapis/api google.golang.org/genproto/googleapis/rpc google.golang.org/grpc google.golang.org/protobuf gopkg.in/pipe.v2 ================================================ FILE: internal/testing/check_mod_tidy.sh ================================================ #!/usr/bin/env bash # Copyright 2019 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # This script checks to see if `go mod tidy` has been run on the module # in the current directory. # # It exits with status 1 if "go mod tidy && go list -deps ./..." would # make changes. # # TODO(rvangent): Replace this with `go mod tidy --check` when it exists: # https://github.com/golang/go/issues/27005. # # TODO(rvangent): Drop the "go list" part here and in gomodcleanup.sh once # https://github.com/golang/go/issues/31248 is fixed. set -euo pipefail TMP_GOMOD=$(mktemp) TMP_GOSUM=$(mktemp) function cleanup() { # Restore the original files in case "go mod tidy" made changes. if [[ -f "$TMP_GOMOD" ]]; then mv "$TMP_GOMOD" ./go.mod fi if [[ -f "$TMP_GOSUM" ]]; then mv "$TMP_GOSUM" ./go.sum fi } trap cleanup EXIT # Make copies of the current files. cp ./go.mod "$TMP_GOMOD" cp ./go.sum "$TMP_GOSUM" # Modifies the files in-place. go mod tidy go list -deps ./... &> /dev/null # Check for diffs. diff -u "$TMP_GOMOD" ./go.mod diff -u "$TMP_GOSUM" ./go.sum ================================================ FILE: internal/testing/deploywebsite.sh ================================================ #!/bin/bash # To update the website: # # Install Hugo locally, by downloading a version (at least 0.92) and unpacking: # # In $HUGODIR: # # wget https://github.com/gohugoio/hugo/releases/download/v0.91.2/hugo_0.91.2_Linux-64bit.tar.gz # tar xvf hugo_0.91.2_Linux-64bit.tar.gz # # This creates a binary $HUGODIR/hugo # # In a go-cloud clone, run: # # $HUGODIR/hugo -s internal/website # # This updates the internal/website/public directory with the new contents of # the website. Now we'll need a separate clone of go-cloud, with the gh-pages # branch checked out: # # git clone git@github.com:google/go-cloud.git GH-PAGES-CLONE # cd GH-PAGES-CLONE # git co gh-pages # # This should have the contents of the website (configured in # https://github.com/google/go-cloud/settings/pages). # # Once that's ready, copy the contents of internal/website/public into the root # directory of the clone that's on the gh-pages branch, e.g. with rsync: # # rsync -avc internal/website/public/ GH-PAGES-CLONE # # Commit into the gh-pages branch and push it to origin (git push origin # gh-pages). This deploys the new site contents. # (Old) # Here's what we had in Travis: # install: "curl -fsSL https://github.com/gohugoio/hugo/releases/download/v0.54.0/hugo_0.54.0_Linux-64bit.tar.gz | tar zxf - -C \"$HOME\" hugo" # script: "HUGO_GOOGLEANALYTICS=UA-135118641-1 \"$HOME/hugo\" -s internal/website" # deploy: # provider: pages # edge: true # fqdn: gocloud.dev # skip-cleanup: true # local-dir: internal/website/public ================================================ FILE: internal/testing/git_tag_modules.sh ================================================ #!/usr/bin/env bash # Copyright 2021 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # This script should be run from the root directory. # It creates git tags for all marked modules listed in the allmodules file. set -euo pipefail function usage() { echo echo "Usage: git_tag_modules.sh vX.X.X" 1>&2 echo " vX.X.X: the git tag version" exit 64 } if [[ $# -ne 1 ]] ; then echo "Need at least one argument" usage fi version="$1" sed -e '/^#/d' -e '/^$/d' allmodules | awk '{ print $1, $2}' | while read -r path update || [[ -n "$path" ]] ; do if [[ "$update" != "yes" ]]; then echo "$path is not marked to be released" continue fi tag="$version" if [[ "$path" != "." ]]; then tag="$path/$version" fi echo "Creating tag: ${tag}" git tag "$tag" done ================================================ FILE: internal/testing/gomodcleanup.sh ================================================ #!/usr/bin/env bash # Copyright 2019 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # This script should be run from the root directory. # It runs "go mod tidy && go list -deps ./..." on all modules in # the repo, to ensure that go.mod and go.sum are in the canonical # form that tests will verify (see check_mod_tidy.sh). set -euo pipefail sed -e '/^#/d' -e '/^$/d' allmodules | awk '{print $1}' | while read -r path || [[ -n "$path" ]]; do echo "cleaning up $path" ( cd "$path" && go mod tidy && go list -deps ./... &> /dev/null || echo " FAILED!") done ================================================ FILE: internal/testing/listdeps.sh ================================================ #!/usr/bin/env bash # Copyright 2019 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set -euo pipefail # To run this script manually to update alldeps: # # $ internal/testing/listdeps.sh > internal/testing/alldeps # # Make sure to use the same version of Go as used by tests # (see .github/actions/tests.yml) when updating the alldeps file. tmpfile=$(mktemp) function cleanup() { rm -rf "$tmpfile" } trap cleanup EXIT sed -e '/^#/d' -e '/^$/d' allmodules | awk '{print $1}' | while read -r path || [[ -n "$path" ]]; do ( cd "$path" && go list -mod=readonly -deps -f '{{with .Module}}{{.Path}}{{end}}' ./... >> "$tmpfile") done # Sort using the native byte values to keep results from different environment consistent. LC_ALL=C sort "$tmpfile" | uniq ================================================ FILE: internal/testing/oteltest/diff.go ================================================ // Copyright 2019-2025 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package oteltest import ( "fmt" "go.opentelemetry.io/otel/codes" "sort" "strings" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/sdk/metric/metricdata" sdktrace "go.opentelemetry.io/otel/sdk/trace" "gocloud.dev/gcerrors" ) var ( methodKey = attribute.Key("gocdk_method") providerKey = attribute.Key("gocdk_provider") statusKey = attribute.Key("gocdk_status") ) // Call represents a method call/span with its result code. type Call struct { Method string Code gcerrors.ErrorCode Attrs []attribute.KeyValue } func formatSpanData(s sdktrace.ReadOnlySpan) string { if s == nil { return "missing" } // OTel uses codes.Code for status. return fmt.Sprintf("", s.Name(), s.Status().Code.String()) } func formatCall(c *Call) string { if c == nil { return "nothing" } // gcerrors.ErrorCode is an int, just print it. return fmt.Sprintf("", c.Method, c.Code) } // Diff compares the list of spans and metric data obtained from OpenTelemetry // instrumentation (using a test exporter like `sdktrace/tracetest.NewExporter` // and `sdkmetric/metrictest.NewExporter`) with an expected list of calls. // The span/metric name and status code/status attribute are compared. // Order matters for traces (though not for metrics). // // gotSpans should be the result from a test trace exporter (e.g., exporter.GetSpans()). // gotMetrics should be the result from a test metric exporter (e.g., exporter.GetMetrics()). // namePrefix is the prefix prepended to method names in spans/metrics mostly its the package name. // provider is the name of the provider used (e.g., "aws"). // want is the list of expected calls. func Diff(gotSpans []sdktrace.ReadOnlySpan, gotMetrics []metricdata.ScopeMetrics, namePrefix, provider string, want []Call) string { ds := diffSpans(gotSpans, namePrefix, want) dc := DiffMetrics(gotMetrics, namePrefix, provider, want) if len(ds) > 0 { ds = "trace: " + ds + "\n" } if len(dc) > 0 { dc = "metrics: " + dc } return ds + dc } func mapStatusCode(code gcerrors.ErrorCode) codes.Code { // For gcerrors used by gocloud, OK -> Ok, everything else -> Error is common. if code == gcerrors.OK { return codes.Ok } return codes.Error } func diffSpans(got []sdktrace.ReadOnlySpan, prefix string, want []Call) string { var diffs []string add := func(i int, g sdktrace.ReadOnlySpan, w *Call) { diffs = append(diffs, fmt.Sprintf("#%d: got %s, want %s", i, formatSpanData(g), formatCall(w))) } for i := 0; i < len(got) || i < len(want); i++ { var gotSpan sdktrace.ReadOnlySpan if i < len(got) { gotSpan = got[i] } switch { case i >= len(got): add(i, nil, &want[i]) case i >= len(want): add(i, gotSpan, nil) default: expectedName := prefix + "." + want[i].Method expectedCode := mapStatusCode(want[i].Code) // Map wanted gcerrors code to OTel code. if gotSpan == nil || gotSpan.Name() != expectedName || gotSpan.Status().Code != expectedCode { w := want[i] w.Method = prefix + "." + w.Method add(i, gotSpan, &w) } } } return strings.Join(diffs, "\n") } func DiffMetrics(got []metricdata.ScopeMetrics, prefix, provider string, wantCalls []Call) string { // OTel metric data is structured. We need to iterate through it to find the // relevant metric data points and their attributes. var diffs []string gotTags := map[string]bool{} // map of canonicalized data point attributes // Helper to convert attribute.Set to a canonical string key attrSetToCanonicalString := func(set attribute.Set) string { // Get key-value pairs, sort them, and format into a stable string. attrs := make([]attribute.KeyValue, 0, set.Len()) iter := set.Iter() for iter.Next() { attrs = append(attrs, iter.Attribute()) } sort.Slice(attrs, func(i, j int) bool { return string(attrs[i].Key) < string(attrs[j].Key) }) parts := make([]string, len(attrs)) for i, attr := range attrs { // Format value based on type - attribute.Value doesn't have a simple String() // that's guaranteed to be consistent for comparison. Using fmt.Sprint is safer. parts[i] = fmt.Sprintf("%s:%s", attr.Key, fmt.Sprint(attr.Value.AsInterface())) } return strings.Join(parts, ",") } // Helper function to collect relevant attributes for tag comparison. processAtrributes := func(attrSets ...attribute.Set) { var requiredAttributes []attribute.KeyValue for _, attrSet := range attrSets { for _, a := range attrSet.ToSlice() { if a.Key == providerKey { requiredAttributes = append(requiredAttributes, a) } if a.Key == methodKey { requiredAttributes = append(requiredAttributes, a) } if a.Key == statusKey { requiredAttributes = append(requiredAttributes, a) } } } if len(requiredAttributes) > 0 { gotTags[attrSetToCanonicalString(attribute.NewSet(requiredAttributes...))] = true } } // Iterate through all collected metrics to find relevant data points. for _, sm := range got { for _, m := range sm.Metrics { // Using a switch will allow us accommodate other types of metrics. switch v := m.Data.(type) { case metricdata.Sum[int64]: // Handle int64 Sum metrics. for _, dp := range v.DataPoints { processAtrributes(sm.Scope.Attributes, dp.Attributes) } case metricdata.Sum[float64]: // gocloud usually records counts. Check for Sum metrics. for _, dp := range v.DataPoints { processAtrributes(sm.Scope.Attributes, dp.Attributes) } default: // Handle any other types of metrics. processAtrributes(sm.Scope.Attributes) } } } // Check that each wanted call has a corresponding metric data point with the correct attributes. for _, wc := range wantCalls { // Construct the expected set of attributes for the wanted call. expectedAttributes := []attribute.KeyValue{providerKey.String(provider)} if wc.Method != "" { expectedAttributes = append(expectedAttributes, methodKey.String(prefix+"."+wc.Method), statusKey.String(fmt.Sprint(wc.Code))) } // Canonicalize the expected attributes to check against the collected ones. expectedKey := attrSetToCanonicalString(attribute.NewSet(expectedAttributes...)) if !gotTags[expectedKey] { diffs = append(diffs, fmt.Sprintf("missing metric data point with attributes %q", expectedKey)) } } return strings.Join(diffs, "\n") } ================================================ FILE: internal/testing/oteltest/exporter.go ================================================ // Copyright 2019-2025 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package oteltest supports testing of OpenTelemetry integrations. package oteltest import ( "context" "sync" "testing" "go.opentelemetry.io/otel" noopmetric "go.opentelemetry.io/otel/metric/noop" sdkmetric "go.opentelemetry.io/otel/sdk/metric" "go.opentelemetry.io/otel/sdk/metric/metricdata" "go.opentelemetry.io/otel/sdk/resource" sdktrace "go.opentelemetry.io/otel/sdk/trace" "go.opentelemetry.io/otel/sdk/trace/tracetest" nooptrace "go.opentelemetry.io/otel/trace/noop" ) // TestExporter is an exporter of OpenTelemetry traces and metrics, for testing. // It should be created with NewTestExporter. type TestExporter struct { mu sync.Mutex spanExporter *tracetest.InMemoryExporter metricExporter *metricExporter shutdown func(context.Context) error } // metricExporter is a simple metrics exporter for testing. // It implements the sdkmetric.Exporter interface. type metricExporter struct { mu sync.Mutex reader sdkmetric.Reader temporalitySelector sdkmetric.TemporalitySelector aggregationSelector sdkmetric.AggregationSelector rm *metricdata.ResourceMetrics } var _ sdkmetric.Exporter = (*metricExporter)(nil) // newMetricExporter creates a new metric exporter for testing. func newMetricExporter() *metricExporter { reader := sdkmetric.NewManualReader() return &metricExporter{ reader: reader, temporalitySelector: sdkmetric.DefaultTemporalitySelector, aggregationSelector: sdkmetric.DefaultAggregationSelector, rm: &metricdata.ResourceMetrics{}, } } // Temporality returns the aggregation temporality for the given instrument kind. func (e *metricExporter) Temporality(kind sdkmetric.InstrumentKind) metricdata.Temporality { return e.temporalitySelector(kind) } // Aggregation returns the aggregation for the given instrument kind. func (e *metricExporter) Aggregation(kind sdkmetric.InstrumentKind) sdkmetric.Aggregation { return e.aggregationSelector(kind) } // Export exports metric data. func (e *metricExporter) Export(ctx context.Context, data *metricdata.ResourceMetrics) error { return nil } // GetMetrics returns all collected metrics. func (e *metricExporter) GetMetrics() []metricdata.ScopeMetrics { e.mu.Lock() defer e.mu.Unlock() return e.rm.ScopeMetrics } // ForceFlush forces a flush of metrics. func (e *metricExporter) ForceFlush(ctx context.Context) error { err := e.reader.Collect(ctx, e.rm) if err == nil { return err } return e.Export(ctx, e.rm) } // Reset the current in-memory storage. func (e *metricExporter) Reset() { e.mu.Lock() defer e.mu.Unlock() e.rm = &metricdata.ResourceMetrics{} } // Shutdown shuts down the exporter. func (e *metricExporter) Shutdown(ctx context.Context) error { e.mu.Lock() defer e.mu.Unlock() e.Reset() return nil } // NewTestExporter creates a TestExporter and registers it with OpenTelemetry. func NewTestExporter(t *testing.T, views []sdkmetric.View) *TestExporter { // Create span exporter se := tracetest.NewInMemoryExporter() res := resource.NewSchemaless() traceShutdown, err := configureTraceProvider("test", se, sdktrace.AlwaysSample(), res, true) if err != nil { t.Fatalf("Failed to configure trace provider: %v", err) } // Create metric exporter me := newMetricExporter() // Create and register meter provider. metricsShutdown, err := configureMeterProvider("test", me.reader, res, views) if err != nil { t.Fatalf("Failed to configure meter provider: %v", err) } shutdown := func(ctx context.Context) error { err1 := traceShutdown(ctx) err2 := metricsShutdown(ctx) if err1 != nil { return err1 } return err2 } return &TestExporter{ spanExporter: se, metricExporter: me, shutdown: shutdown, } } // GetSpans returns the collected span stubs. func (te *TestExporter) GetSpans() tracetest.SpanStubs { return te.spanExporter.GetSpans() } // GetMetrics returns the collected metrics. func (te *TestExporter) GetMetrics(ctx context.Context) []metricdata.ScopeMetrics { _ = te.metricExporter.ForceFlush(ctx) return te.metricExporter.GetMetrics() } // ForceFlush forces the export of all metrics. func (te *TestExporter) ForceFlush(ctx context.Context) error { return te.metricExporter.ForceFlush(ctx) } // Shutdown unregisters and shuts down the exporter. func (te *TestExporter) Shutdown(ctx context.Context) error { if te.shutdown != nil { err := te.shutdown(ctx) if err != nil { return err } } // Reset global providers otel.SetTracerProvider(nooptrace.NewTracerProvider()) otel.SetMeterProvider(noopmetric.NewMeterProvider()) return nil } ================================================ FILE: internal/testing/oteltest/init.go ================================================ // Copyright 2025 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package oteltest import ( "context" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/propagation" sdkmetric "go.opentelemetry.io/otel/sdk/metric" "go.opentelemetry.io/otel/sdk/resource" sdktrace "go.opentelemetry.io/otel/sdk/trace" semconv "go.opentelemetry.io/otel/semconv/v1.21.0" ) // configureTraceProvider sets up the global trace provider with the given exporter. // It returns a function to shut down the exporter. func configureTraceProvider(serviceName string, exporter sdktrace.SpanExporter, sampler sdktrace.Sampler, res *resource.Resource, asyncExport bool) (func(context.Context) error, error) { var err error if res == nil { res = resource.Default() } res, err = resource.Merge( res, resource.NewWithAttributes( semconv.SchemaURL, semconv.ServiceName(serviceName), ), ) if err != nil { return nil, err } if sampler == nil { sampler = sdktrace.AlwaysSample() } var exporterOpt sdktrace.TracerProviderOption if asyncExport { exporterOpt = sdktrace.WithSyncer(exporter) } else { exporterOpt = sdktrace.WithBatcher(exporter) } tp := sdktrace.NewTracerProvider( exporterOpt, sdktrace.WithResource(res), sdktrace.WithSampler(sampler), ) // Set the global trace provider. otel.SetTracerProvider(tp) // Set the global propagator to tracecontext (the default is no-op). otel.SetTextMapPropagator(propagation.TraceContext{}) return tp.Shutdown, nil } // configureMeterProvider sets up the given meter provider with the given exporter. // It returns a function to collect and export metrics on demand, and a shutdown function. func configureMeterProvider(serviceName string, reader sdkmetric.Reader, res *resource.Resource, views []sdkmetric.View) (func(context.Context) error, error) { var err error if res == nil { res = resource.Default() } res, err = resource.Merge( res, resource.NewWithAttributes( semconv.SchemaURL, semconv.ServiceName(serviceName), ), ) if err != nil { return nil, err } mp := sdkmetric.NewMeterProvider( sdkmetric.WithReader(reader), sdkmetric.WithResource(res), sdkmetric.WithView(views...), ) // Set the global meter provider. otel.SetMeterProvider(mp) return func(ctx context.Context) error { return mp.Shutdown(ctx) }, nil } ================================================ FILE: internal/testing/runchecks.sh ================================================ #!/usr/bin/env bash # Copyright 2018 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # This script runs all checks for Go CDK, including go test suites, # compatibility checks, consistency checks, Wire, etc. # https://coderwall.com/p/fkfaqq/safer-bash-scripts-with-set-euxo-pipefail # Change to -euxo if debugging. set -euo pipefail if [[ $# -gt 0 ]]; then echo "usage: runchecks.sh" 1>&2 exit 64 fi # start_local_deps.sh requires that Docker is installed, # which is only supported on Linux. # Tests that depend on them should check the RUNNER_OS environment before running. # Don't do this when running locally, as it's slow; user should do it. if [[ "${RUNNER_OS:-}" == "Linux" ]]; then echo echo "Starting local dependencies..." ./internal/testing/start_local_deps.sh else echo "Not starting local dependencies for ${RUNNER_OS:-}." fi result=0 rootdir="$(pwd)" # Update the regexp below when upgrading to a # new Go version. Some checks below we only run # for the latest Go version. latest_go_version=0 go_version=$(go version) if [[ ${go_version} == *go1\.26* ]]; then latest_go_version=1 fi echo "Go Version: ${go_version}; latest=${latest_go_version}" # Build the test-summary app, which is used inside the loop to summarize results # from Go tests. (cd internal/testing/test-summary && go build) while read -r path || [[ -n "$path" ]]; do echo echo "******************************" echo "* Running Go tests for module: $path" echo "******************************" echo # TODO(rvangent): Special case modules to skip for Windows. Perhaps # this should be data-driven by allmodules? # (https://github.com/google/go-cloud/issues/2111). if [[ "${RUNNER_OS:-}" == "Windows" ]] && [[ "$path" == "internal/website" ]]; then echo " Skipping on Windows" continue fi gotestflags=("-json" "-race") testsummaryflags=("-progress") if [[ $latest_go_version -eq 1 ]]; then # Only do coverage for the latest Linux build because it is slow, and # codecov will only save the last one anyway. if [[ "${RUNNER_OS:-}" == "Linux" ]]; then gotestflags+=("-coverpkg=./..." "-coverprofile=$rootdir/modcoverage.out") fi # Previous versions of the "go" command may have # different opinions about what go.mod should look # like. gotestflags+=("-mod=readonly") fi # Run the tests. (cd "$path" && go test "${gotestflags[@]}" ./...) | ./internal/testing/test-summary/test-summary "${testsummaryflags[@]}" || result=1 if [ -f modcoverage.out ] && [ $result -eq 0 ]; then cat modcoverage.out >> coverage.out rm modcoverage.out fi done < <( sed -e '/^#/d' -e '/^$/d' allmodules | awk '{print $1}' ) # The above filters out comments and empty lines from allmodules and only takes # the first (whitespace-separated) field from each line. # Upload cumulative coverage data if we generated it. if [ -f coverage.out ] && [ $result -eq 0 ]; then # Filter out test packages. grep -v test coverage.out > coverage2.out mv coverage2.out coverage.out bash <(curl -s https://codecov.io/bash) rm coverage.out fi # The rest of these checks are not OS-specific, so we only run them for the # Linux build, or when running locally. if [[ "${RUNNER_OS:-linux}" != "Linux" ]]; then exit $result fi if [[ ${latest_go_version} -eq 1 ]]; then echo echo "************************" echo "* Checking go mod tidy" echo "************************" echo while read -r path || [[ -n "$path" ]]; do echo "Module: $path" ( cd "$path" && "$rootdir"/internal/testing/check_mod_tidy.sh && echo " OK" ) || { echo "FAIL: please run ./internal/testing/gomodcleanup.sh" && result=1; } done < <( sed -e '/^#/d' -e '/^$/d' allmodules | awk '{print $1}' ) # The above filters out comments and empty lines from allmodules and only takes # the first (whitespace-separated) field from each line. fi if [[ ${latest_go_version} -eq 1 ]]; then echo echo "**********************" echo "* Checking wire diff" echo "**********************" echo echo "Installing Wire..." go install github.com/google/wire/cmd/wire@latest echo while read -r path || [[ -n "$path" ]]; do echo "Module: $path" ( cd "$path" && wire diff ./... && echo " OK" ) || { echo "FAIL: wire diff found diffs!" && result=1; } done < <( sed -e '/^#/d' -e '/^$/d' allmodules | awk '{print $1}' ) # The above filters out comments and empty lines from allmodules and only takes # the first (whitespace-separated) field from each line. fi; if [[ ${latest_go_version} -eq 1 ]]; then echo echo "******************************" echo "* Doing non-module checks" echo "******************************" echo echo "Ensuring .go files are formatted with gofmt -s..." DIFF="$(gofmt -s -d .)" if [ -n "$DIFF" ]; then echo "FAIL: please run 'gofmt -s -w .' and commit the result" echo "$DIFF"; exit 1; else echo " OK" fi; fi; if [[ ${latest_go_version} -eq 1 ]]; then echo echo "Ensuring that there are no dependencies not listed in ./internal/testing/alldeps..." ( ./internal/testing/listdeps.sh | diff -u ./internal/testing/alldeps - && echo " OK" ) || { echo "FAIL: dependencies changed; run: internal/testing/listdeps.sh > internal/testing/alldeps" && result=1 # Module behavior may differ across versions. echo "using the most recent go version." } fi if [[ ${latest_go_version} -eq 1 ]]; then echo echo "Ensuring that any new packages have the corresponding entries in Hugo..." missing_packages="$(internal/website/listnewpkgs.sh)" if ! [[ -z "$missing_packages" ]]; then echo "FAIL: missing package meta tags for:" 1>&2 echo "$missing_packages" 1>&2 result=1 else echo " OK" fi echo echo "Ensuring that all examples used in Hugo match what's in source..." (internal/website/gatherexamples/run.sh | diff -u internal/website/data/examples.json - > /dev/null && echo " OK") || { echo "FAIL: examples changed; run: internal/website/gatherexamples/run.sh > internal/website/data/examples.json" result=1 } fi; echo if [[ ${result} -eq 0 ]]; then echo "SUCCESS!" else echo "FAILED; see above for more info." fi exit $result ================================================ FILE: internal/testing/setup/setup.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package setup // import "gocloud.dev/internal/testing/setup" import ( "context" "flag" "net/http" "os" "path/filepath" "testing" "time" awsv2 "github.com/aws/aws-sdk-go-v2/aws" awsv2config "github.com/aws/aws-sdk-go-v2/config" awsv2creds "github.com/aws/aws-sdk-go-v2/credentials" "gocloud.dev/gcp" "gocloud.dev/internal/useragent" "github.com/google/go-replayers/grpcreplay" "github.com/google/go-replayers/httpreplay" hrgoog "github.com/google/go-replayers/httpreplay/google" "golang.org/x/oauth2/google" "google.golang.org/api/option" "google.golang.org/grpc" grpccreds "google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials/oauth" ) // Record is true iff the tests are being run in "record" mode. var Record = flag.Bool("record", false, "whether to run tests against cloud resources and record the interactions") // FakeGCPCredentials gets fake GCP credentials. func FakeGCPCredentials(ctx context.Context) (*google.Credentials, error) { return google.CredentialsFromJSON(ctx, []byte(`{"type": "service_account", "project_id": "my-project-id"}`)) } func awsV2Config(ctx context.Context, region string, client *http.Client) (awsv2.Config, error) { // Provide fake creds if running in replay mode. var creds awsv2.CredentialsProvider if !*Record { creds = awsv2creds.NewStaticCredentialsProvider("FAKE_KEY", "FAKE_SECRET", "FAKE_SESSION") } return awsv2config.LoadDefaultConfig( ctx, awsv2config.WithHTTPClient(client), awsv2config.WithRegion(region), awsv2config.WithCredentialsProvider(creds), awsv2config.WithRetryer(func() awsv2.Retryer { return awsv2.NopRetryer{} }), ) } // NewRecordReplayClient creates a new http.Client for tests. This client's // activity is being either recorded to files (when *Record is set) or replayed // from files. rf is a modifier function that will be invoked with the address // of the httpreplay.Recorder object used to obtain the client; this function // can mutate the recorder to add service-specific header filters, for example. // An initState is returned for tests that need a state to have deterministic // results, for example, a seed to generate random sequences. func NewRecordReplayClient(ctx context.Context, t *testing.T, rf func(r *httpreplay.Recorder)) (c *http.Client, cleanup func(), initState int64) { t.Helper() httpreplay.DebugHeaders() path := filepath.Join("testdata", t.Name()+".replay") if *Record { t.Logf("Recording into golden file %s", path) if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil { t.Fatal(err) } state := time.Now() b, _ := state.MarshalBinary() rec, err := httpreplay.NewRecorder(path, b) if err != nil { t.Fatal(err) } rf(rec) cleanup = func() { if err := rec.Close(); err != nil { t.Fatal(err) } } return rec.Client(), cleanup, state.UnixNano() } t.Logf("Replaying from golden file %s", path) rep, err := httpreplay.NewReplayer(path) if err != nil { t.Fatal(err) } recState := new(time.Time) if err := recState.UnmarshalBinary(rep.Initial()); err != nil { t.Fatal(err) } return rep.Client(), func() { rep.Close() }, recState.UnixNano() } // NewAWSv2Config creates a new aws.Config for testing against AWS. // If the test is in --record mode, the test will call out to AWS, and the // results are recorded in a replay file. // Otherwise, the session reads a replay file and runs the test as a replay, // which never makes an outgoing HTTP call and uses fake credentials. // An initState is returned for tests that need a state to have deterministic // results, for example, a seed to generate random sequences. // // If scrubBody is true, the entire HTTP POST body is cleared for matching, // so the tests will rely entirely on ordering and headers. func NewAWSv2Config(ctx context.Context, t *testing.T, region string, scrubBody bool) (cfg awsv2.Config, rt http.RoundTripper, cleanup func(), initState int64) { t.Helper() client, cleanup, state := NewRecordReplayClient(ctx, t, func(r *httpreplay.Recorder) { r.RemoveQueryParams("X-Amz-Credential", "X-Amz-Signature", "X-Amz-Security-Token") r.RemoveRequestHeaders("Authorization", "Duration", "X-Amz-Security-Token") r.ClearHeaders("Amz-Sdk-Invocation-Id") r.ClearHeaders("X-Amz-Date") r.ClearQueryParams("X-Amz-Date") r.ClearHeaders("User-Agent") // AWS includes the Go version // The MessageAttributes parameter is a map, and so the values are // in randomized order, so we can't match against them. Just scrub // them and rely on the ordering. r.ScrubBody("MessageAttributes.*") if scrubBody { r.ScrubBody(".*") } }) cfg, err := awsV2Config(ctx, region, client) if err != nil { t.Fatal(err) } return cfg, client.Transport, cleanup, state } // NewGCPClient creates a new HTTPClient for testing against GCP. // // If the test is in --record mode, the client will call out to GCP, and the // results are recorded in a replay file. // Otherwise, the session reads a replay file and runs the test as a replay, // which never makes an outgoing HTTP call and uses fake credentials. func NewGCPClient(ctx context.Context, t *testing.T) (client *gcp.HTTPClient, rt http.RoundTripper, done func()) { t.Helper() c, cleanup, _ := NewRecordReplayClient(ctx, t, func(r *httpreplay.Recorder) { r.ClearQueryParams("Expires") r.ClearQueryParams("Signature") r.ClearHeaders("Expires") r.ClearHeaders("Signature") r.ClearHeaders("X-Goog-Gcs-Idempotency-Token") r.ClearHeaders("User-Agent") }) transport := c.Transport if *Record { creds, err := gcp.DefaultCredentials(ctx) if err != nil { t.Fatalf("failed to get default credentials: %v", err) } c, err = hrgoog.RecordClient(ctx, c, option.WithTokenSource(gcp.CredentialsTokenSource(creds))) if err != nil { t.Fatal(err) } } return &gcp.HTTPClient{Client: *c}, transport, cleanup } // NewGCPgRPCConn creates a new connection for testing against GCP via gRPC. // // If the test is in --record mode, the client will call out to GCP, and the // results are recorded in a replay file. // Otherwise, the session reads a replay file and runs the test as a replay, // which never makes an outgoing RPC and uses fake credentials. func NewGCPgRPCConn(ctx context.Context, t *testing.T, endPoint, api string) (*grpc.ClientConn, func()) { t.Helper() filename := t.Name() + ".replay" if *Record { opts, done := newGCPRecordDialOptions(t, filename) opts = append(opts, useragent.GRPCDialOption(api)) // Add credentials for real RPCs. creds, err := gcp.DefaultCredentials(ctx) if err != nil { t.Fatal(err) } opts = append(opts, grpc.WithTransportCredentials(grpccreds.NewClientTLSFromCert(nil, ""))) opts = append(opts, grpc.WithPerRPCCredentials(oauth.TokenSource{TokenSource: gcp.CredentialsTokenSource(creds)})) conn, err := grpc.DialContext(ctx, endPoint, opts...) if err != nil { t.Fatal(err) } return conn, done } rep, done := newGCPReplayer(t, filename) conn, err := rep.Connection() if err != nil { t.Fatal(err) } return conn, done } // NewAzureTestBlobClient creates a new connection for testing against Azure Blob. func NewAzureTestBlobClient(ctx context.Context, t *testing.T) (*http.Client, func()) { t.Helper() client, cleanup, _ := NewRecordReplayClient(ctx, t, func(r *httpreplay.Recorder) { r.RemoveQueryParams("se", "sig", "st") r.RemoveQueryParams("X-Ms-Date") r.ClearQueryParams("blockid") r.ClearHeaders("X-Ms-Date") r.ClearHeaders("X-Ms-Version") r.ClearHeaders("User-Agent") // includes the full Go version // Yes, it's true, Azure does not appear to be internally // consistent about casing for BLock(l|L)ist. r.ScrubBody(".*") }) return client, cleanup } // NewAzureKeyVaultTestClient creates a *http.Client for Azure KeyVault test // recordings. func NewAzureKeyVaultTestClient(ctx context.Context, t *testing.T) (*http.Client, func()) { t.Helper() client, cleanup, _ := NewRecordReplayClient(ctx, t, func(r *httpreplay.Recorder) { r.RemoveQueryParams("se", "sig") r.RemoveQueryParams("X-Ms-Date") r.ClearHeaders("X-Ms-Date") r.ClearHeaders("User-Agent") // includes the full Go version }) return client, cleanup } // FakeGCPDefaultCredentials sets up the environment with fake GCP credentials. // It returns a cleanup function. func FakeGCPDefaultCredentials(t *testing.T) func() { t.Helper() const envVar = "GOOGLE_APPLICATION_CREDENTIALS" jsonCred := []byte(`{"client_id": "foo.apps.googleusercontent.com", "client_secret": "bar", "refresh_token": "baz", "type": "authorized_user"}`) f, err := os.CreateTemp(t.TempDir(), "fake-gcp-creds") if err != nil { t.Fatal(err) } if err := os.WriteFile(f.Name(), jsonCred, 0o666); err != nil { t.Fatal(err) } t.Setenv(envVar, f.Name()) return func() { t.Log("fake gcp default credentials done") } } // newGCPRecordDialOptions return grpc.DialOptions that are to be appended to a // GRPC dial request. These options allow a recorder to intercept RPCs and save // RPCs to the file at filename, or read the RPCs from the file and return them. func newGCPRecordDialOptions(t *testing.T, filename string) (opts []grpc.DialOption, done func()) { t.Helper() path := filepath.Join("testdata", filename) os.MkdirAll(filepath.Dir(path), os.ModePerm) t.Logf("Recording into golden file %s", path) r, err := grpcreplay.NewRecorder(path, nil) if err != nil { t.Fatal(err) } opts = r.DialOptions() done = func() { if err := r.Close(); err != nil { t.Errorf("unable to close recorder: %v", err) } } return opts, done } // newGCPReplayer returns a Replayer for GCP gRPC connections, as well as a function // to call when done with the Replayer. func newGCPReplayer(t *testing.T, filename string) (*grpcreplay.Replayer, func()) { t.Helper() path := filepath.Join("testdata", filename) t.Logf("Replaying from golden file %s", path) r, err := grpcreplay.NewReplayer(path, nil) if err != nil { t.Fatal(err) } done := func() { if err := r.Close(); err != nil { t.Errorf("unable to close recorder: %v", err) } } return r, done } // HasDockerTestEnvironment returns true when either: // 1) Not on Github Actions. // 2) On Github's Linux environment, where Docker is available. func HasDockerTestEnvironment() bool { s := os.Getenv("RUNNER_OS") return s == "" || s == "Linux" } ================================================ FILE: internal/testing/start_local_deps.sh ================================================ #!/usr/bin/env bash # Copyright 2019 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Starts all local instances needed for Go CDK tests. # You must have Docker installed. # Run this script from the top level of the tree, e.g.: # ./internal/testing/start_local_deps.sh # https://coderwall.com/p/fkfaqq/safer-bash-scripts-with-set-euxo-pipefail set -euo pipefail ./pubsub/kafkapubsub/localkafka.sh ./pubsub/rabbitpubsub/localrabbit.sh ./runtimevar/etcdvar/localetcd.sh ./docstore/mongodocstore/localmongo.sh ./secrets/hashivault/localvault.sh sleep 10 ================================================ FILE: internal/testing/terraform/terraform.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package terraform provides a function to read Terraform output. package terraform // import "gocloud.dev/internal/testing/terraform" import ( "encoding/json" "fmt" "os/exec" ) // ReadOutput runs `terraform output` on the given directory and returns // the parsed result. func ReadOutput(dir string) (map[string]Output, error) { c := exec.Command("terraform", "output", "-json") c.Dir = dir data, err := c.Output() if err != nil { return nil, fmt.Errorf("read terraform output: %v", err) } var parsed map[string]Output if err := json.Unmarshal(data, &parsed); err != nil { return nil, fmt.Errorf("read terraform output: %v", err) } return parsed, nil } // Output describes a single output value. type Output struct { Type string `json:"type"` // one of "string", "list", or "map" Sensitive bool `json:"sensitive"` Value any `json:"value"` } ================================================ FILE: internal/testing/test-summary/test-summary.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Summarizes the output of go test. // Run like so: // // go test -json ./... | test-summary package main import ( "bufio" "encoding/json" "flag" "fmt" "io" "log" "os" "path/filepath" "strings" "time" ) var ( progress = flag.Bool("progress", false, "display test progress") verbose = flag.Bool("verbose", false, "display all test output") ) // TestEvent is copied from "go doc test2json". type TestEvent struct { Time time.Time // encodes as an RFC3339-format string Action string Package string Test string Elapsed float64 // seconds Output string } func main() { flag.Parse() s, fails, err := run(os.Stdin) if err != nil { log.Fatal(err) } fmt.Println(s) if fails { os.Exit(1) } } func run(r io.Reader) (msg string, failures bool, err error) { counts := map[string]int{} scanner := bufio.NewScanner(bufio.NewReader(r)) // Collects tests that failed. var failedTests []string // Stores output produced by each test. testOutputs := map[string][]string{} start := time.Now() for scanner.Scan() { // When the build fails, go test -json doesn't emit a valid JSON value, only // a line of output starting with FAIL. Report a more reasonable error in // this case. if strings.HasPrefix(scanner.Text(), "FAIL") { return "", true, fmt.Errorf("No test output: %q", scanner.Text()) } var event TestEvent if err := json.Unmarshal(scanner.Bytes(), &event); err != nil { return "", false, fmt.Errorf("%q: %v", scanner.Text(), err) } testpath := filepath.Join(event.Package, event.Test) // The Test field, if non-empty, specifies the test, example, or benchmark // function that caused the event. Events for the overall package test do // not set Test. if event.Action == "fail" && event.Test != "" { failedTests = append(failedTests, testpath) } if event.Action == "output" { if *verbose { fmt.Print(event.Output) } testOutputs[testpath] = append(testOutputs[testpath], event.Output) } // We don't want to count package passes/fails because these don't // represent specific tests being run. However, skips of an entire package // are not duplicated with individual test skips. if event.Test != "" || event.Action == "skip" { counts[event.Action]++ } // For failed tests, print all the output we collected for them before // the "fail" event. if event.Action == "fail" { fmt.Println(strings.Join(testOutputs[testpath], "")) } if *progress { // Only print progress for fail events for packages and tests, or // pass events for packages only (not individual tests, since this is // too noisy). if event.Action == "fail" || (event.Test == "" && event.Action == "pass") { fmt.Printf("%s %s (%.2fs)\n", event.Action, testpath, event.Elapsed) } } } if err := scanner.Err(); err != nil { return "", false, err } p := counts["pass"] f := counts["fail"] s := counts["skip"] summary := fmt.Sprintf("ran %d; passed %d; failed %d; skipped %d (in %.1f sec)", p+f+s, p, f, s, time.Since(start).Seconds()) if len(failedTests) > 0 { var sb strings.Builder sb.WriteString("Failures (reporting up to 10):\n") for i := 0; i < len(failedTests) && i < 10; i++ { fmt.Fprintf(&sb, " %s\n", failedTests[i]) } if len(failedTests) > 10 { sb.WriteString(" ...\n") } sb.WriteString(summary) summary = sb.String() } return summary, f > 0, nil } ================================================ FILE: internal/testing/test-summary/test-summary_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package main import ( "fmt" "path/filepath" "strings" "testing" ) func Test(t *testing.T) { got, fails, err := run(strings.NewReader(testOutput)) if err != nil { t.Fatal(err) } path := filepath.Join("gocloud.dev", "internal", "docstore", "internal", "fields", "TestUnexportedAnonymousNonStruct") want := fmt.Sprintf(`Failures (reporting up to 10): %s ran 6; passed 3; failed 1; skipped 2 (in `, path) if !strings.HasPrefix(got, want) { t.Errorf("\ngot %s\nwant %s", got, want) } if !fails { t.Error("wanted fails true, got false") } } const testOutput = `{"Time":"2019-05-09T16:39:56.83133991-04:00","Action":"run","Package":"gocloud.dev/internal/docstore/internal/fields","Test":"TestFieldsNoTags"} {"Time":"2019-05-09T16:39:56.831489481-04:00","Action":"output","Package":"gocloud.dev/internal/docstore/internal/fields","Test":"TestFieldsNoTags","Output":"=== RUN TestFieldsNoTags\n"} {"Time":"2019-05-09T16:39:56.831517464-04:00","Action":"output","Package":"gocloud.dev/internal/docstore/internal/fields","Test":"TestFieldsNoTags","Output":"--- PASS: TestFieldsNoTags (0.00s)\n"} {"Time":"2019-05-09T16:39:56.831535431-04:00","Action":"pass","Package":"gocloud.dev/internal/docstore/internal/fields","Test":"TestFieldsNoTags","Elapsed":0} {"Time":"2019-05-09T16:39:56.831551807-04:00","Action":"run","Package":"gocloud.dev/internal/docstore/internal/fields","Test":"TestAgainstJSONEncodingNoTags"} {"Time":"2019-05-09T16:39:56.831561396-04:00","Action":"output","Package":"gocloud.dev/internal/docstore/internal/fields","Test":"TestAgainstJSONEncodingNoTags","Output":"=== RUN TestAgainstJSONEncodingNoTags\n"} {"Time":"2019-05-09T16:39:56.831573783-04:00","Action":"output","Package":"gocloud.dev/internal/docstore/internal/fields","Test":"TestAgainstJSONEncodingNoTags","Output":"--- PASS: TestAgainstJSONEncodingNoTags (0.00s)\n"} {"Time":"2019-05-09T16:39:56.831584528-04:00","Action":"pass","Package":"gocloud.dev/internal/docstore/internal/fields","Test":"TestAgainstJSONEncodingNoTags","Elapsed":0} {"Time":"2019-05-09T16:39:56.844376487-04:00","Action":"output","Package":"gocloud.dev/internal/docstore/drivertest","Output":"? \tgocloud.dev/internal/docstore/drivertest\t[no test files]\n"} {"Time":"2019-05-09T16:39:56.844397339-04:00","Action":"skip","Package":"gocloud.dev/internal/docstore/drivertest","Elapsed":0} {"Time":"2019-05-09T16:39:56.831666898-04:00","Action":"output","Package":"gocloud.dev/internal/docstore/internal/fields","Test":"TestFieldsWithTags","Output":"--- PASS: TestFieldsWithTags (0.00s)\n"} {"Time":"2019-05-09T16:39:56.831677054-04:00","Action":"pass","Package":"gocloud.dev/internal/docstore/internal/fields","Test":"TestFieldsWithTags","Elapsed":0} {"Time":"2019-05-09T16:39:56.831729957-04:00","Action":"output","Package":"gocloud.dev/internal/docstore/internal/fields","Test":"TestUnexportedAnonymousNonStruct","Output":"=== RUN TestUnexportedAnonymousNonStruct\n"} {"Time":"2019-05-09T16:39:56.831759258-04:00","Action":"fail","Package":"gocloud.dev/internal/docstore/internal/fields","Test":"TestUnexportedAnonymousNonStruct","Elapsed":0} {"Time":"2019-05-09T16:39:56.873905964-04:00","Action":"skip","Package":"gocloud.dev/internal/docstore/memdocstore","Test":"TestConformance/TypeDrivenCodec","Elapsed":0} ` ================================================ FILE: internal/testing/update_deps.sh ================================================ #!/usr/bin/env bash # Copyright 2019 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # This script should be run from the root directory. # It runs "go get -u && go mod tidy" on all modules in # the repo, to update dependencies. Run runchecks.sh afterwards. set -euo pipefail sed -e '/^#/d' -e '/^$/d' allmodules | awk '{print $1}' | while read -r path || [[ -n "$path" ]]; do echo "updating $path" ( cd "$path" && go get -u ./... &> /dev/null && go mod tidy &> /dev/null || echo " FAILED! (some modules without code, like samples, are expected to fail)") done ================================================ FILE: internal/useragent/useragent.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package useragent includes constants and utilitiesfor setting the User-Agent // for Go CDK connections to GCP. package useragent // import "gocloud.dev/internal/useragent" import ( "fmt" "maps" "net/http" "google.golang.org/api/option" "google.golang.org/grpc" ) const ( prefix = "go-cloud" version = "0.45.0" ) // ClientOption returns an option.ClientOption that sets a Go CDK User-Agent. func ClientOption(api string) option.ClientOption { return option.WithUserAgent(userAgentString(api)) } // GRPCDialOption returns a grpc.DialOption that sets a Go CDK User-Agent. func GRPCDialOption(api string) grpc.DialOption { return grpc.WithUserAgent(userAgentString(api)) } // AzureUserAgentPrefix returns a prefix that is used to set Azure SDK User-Agent to help with diagnostics. func AzureUserAgentPrefix(api string) string { return userAgentString(api) } func userAgentString(api string) string { return fmt.Sprintf("%s/%s/%s", prefix, api, version) } // userAgentTransport wraps an http.RoundTripper, adding a User-Agent header // to each request. type userAgentTransport struct { base http.RoundTripper api string } func (t *userAgentTransport) RoundTrip(req *http.Request) (*http.Response, error) { // Clone the request to avoid mutating it. newReq := *req newReq.Header = make(http.Header) maps.Copy(newReq.Header, req.Header) // Append to the User-Agent string to preserve other information. newReq.Header.Set("User-Agent", req.UserAgent()+" "+userAgentString(t.api)) return t.base.RoundTrip(&newReq) } // HTTPClient wraps client and appends a Go CDK string to the User-Agent // header for all requests. func HTTPClient(client *http.Client, api string) *http.Client { c := *client c.Transport = &userAgentTransport{base: c.Transport, api: api} return &c } ================================================ FILE: internal/website/README.md ================================================ # gocloud.dev source Source for the [gocloud.dev website][]. Powered by [Hugo][]. [gocloud.dev website]: https://gocloud.dev/ [Hugo]: https://gohugo.io/ ## Local Development Use local hugo server for preview. `cd` into this directory and run: ``` $ hugo server -D ``` This will run the Hugo server that auto-updates its output based on the source contents. It will print out the `localhost:` URL to point the browser to. This was tested with Hugo 0.53 but should work with subsequent versions as well. ## Editing Use `hugo new foo/page.md` to create `content/foo/page.md`. This will automatically add the appropriate [Front Matter][] to the site. After modifying an existing page, add the `lastmod` attribute with the current ISO date, which you can obtain with `date -I`. For example: ```yaml --- title: Foo date: "2019-03-17T09:00:00-07:00" lastmod: "2019-03-18T13:30:12-07:00" --- ... ``` [Front Matter]: https://gohugo.io/content-management/front-matter/ ================================================ FILE: internal/website/archetypes/default.md ================================================ --- title: "{{ replace .Name "-" " " | title }}" date: {{ .Date }} draft: true showInSidenav: false # only for sections (any level) pagesInSidenav: false # only for top-level sections weight: 0 --- ================================================ FILE: internal/website/archetypes/howto.md ================================================ --- title: "{{ replace .Name "-" " " | title }}" date: {{ .Date }} draft: true showInSidenav: false # only for sections (any level) weight: 0 --- ================================================ FILE: internal/website/config.toml ================================================ baseURL = "https://gocloud.dev/" languageCode = "en-us" title = "Go CDK" copyright = "Copyright © 2018–2019 The Go Cloud Development Kit Authors" pygmentsUseClasses = true pygmentsCodefences = true [outputs] home = ["HTML", "RSS"] section = ["HTML"] taxonomy = ["HTML"] taxonomyTerm = ["HTML", "RSS"] [[menu.footer]] identifier = "github" name = "GitHub" url = "https://github.com/google/go-cloud/" weight = 1 [[menu.footer]] identifier = "private-contact" name = "Contact Team" url = "https://github.com/google/go-cloud/issues" weight = 3 ================================================ FILE: internal/website/content/_index.md ================================================ --- title: "Go CDK" pkgmeta: true --- # The Go Cloud Development Kit The Go Cloud Development Kit (Go CDK) is an open source project building libraries and tools to improve the experience of developing for the cloud with Go. Go CDK provides commonly used, vendor-neutral generic APIs that you can deploy across cloud providers. The idea is to support hybrid cloud deployments while combining on-prem (local) and cloud tools. This project also lays the foundation for other open source projects to write cloud libraries that work across providers. It does this by providing stable, idiomatic interfaces for use cases like storage, events and databases. For more background about the project, check out the [announcement blog post](https://blog.golang.org/go-cloud) and [our talk from Cloud Next 2018](https://www.youtube.com/watch?v=_2ZwhvIkgek). If you're interested in contributing to the Go CDK or are interested in checking out the code, head to [our GitHub project page](https://github.com/google/go-cloud). ## Installing and getting started To start using the Go CDK, install it using `go get`: ```shell go get gocloud.dev ``` Then follow the [Go CDK tutorial][]. Links to additional documentation and samples are available below and in the site navigation bar. [Go CDK tutorial]: {{< ref "/tutorials/cli-uploader.md" >}} ## Portable Cloud APIs in Go At this time, the Go CDK focuses on a set of portable APIs for cloud programming. We strive to implement these APIs for the leading Cloud providers: AWS, GCP and Azure, as well as provide a local (on-prem) implementation. Using the Go CDK you can write your application code once using these idiomatic APIs, test locally using the local versions, and then deploy to a cloud provider with only minimal setup-time changes. ## Project status We're looking for early adopters to help us validate the APIs before releasing a beta version. Please try it and provide feedback by filing a [GitHub issue](https://github.com/google/go-cloud/issues). ## Legal disclaimer The Go CDK is open-source and released under an [Apache 2.0 License](https://github.com/google/go-cloud/blob/master/LICENSE). Copyright © 2018–2019 The Go Cloud Development Kit Authors. If you are looking for the website of GoCloud Systems, which is unrelated to the Go CDK, visit https://gocloud.systems. ================================================ FILE: internal/website/content/aws/_index.md ================================================ --- title: gocloud.dev/aws type: pkg --- ================================================ FILE: internal/website/content/aws/awscloud/_index.md ================================================ --- title: gocloud.dev/aws/awscloud type: pkg --- ================================================ FILE: internal/website/content/aws/rds/_index.md ================================================ --- title: gocloud.dev/aws/rds type: pkg --- ================================================ FILE: internal/website/content/azure/azurecloud/_index.md ================================================ --- title: gocloud.dev/azure/azurecloud type: pkg --- ================================================ FILE: internal/website/content/azure/azuredb/_index.md ================================================ --- title: gocloud.dev/azure/azuredb type: pkg --- ================================================ FILE: internal/website/content/blob/_index.md ================================================ --- title: gocloud.dev/blob type: pkg --- ================================================ FILE: internal/website/content/blob/azureblob/_index.md ================================================ --- title: gocloud.dev/blob/azureblob type: pkg --- ================================================ FILE: internal/website/content/blob/driver/_index.md ================================================ --- title: gocloud.dev/blob/driver type: pkg --- ================================================ FILE: internal/website/content/blob/drivertest/_index.md ================================================ --- title: gocloud.dev/blob/drivertest type: pkg --- ================================================ FILE: internal/website/content/blob/fileblob/_index.md ================================================ --- title: gocloud.dev/blob/fileblob type: pkg --- ================================================ FILE: internal/website/content/blob/gcsblob/_index.md ================================================ --- title: gocloud.dev/blob/gcsblob type: pkg --- ================================================ FILE: internal/website/content/blob/memblob/_index.md ================================================ --- title: gocloud.dev/blob/memblob type: pkg --- ================================================ FILE: internal/website/content/blob/s3blob/_index.md ================================================ --- title: gocloud.dev/blob/s3blob type: pkg --- ================================================ FILE: internal/website/content/concepts/_index.md ================================================ --- title: "Concepts" date: 2019-05-06T09:52:00-07:00 showInSidenav: true pagesInSidenav: true weight: 4 --- The documents in this section describe higher level concepts in the Go CDK. ================================================ FILE: internal/website/content/concepts/as.md ================================================ --- title: Using provider-specific APIs date: 2019-05-10T11:17:09-07:00 weight: 3 --- It is not feasible or desirable for APIs like `blob.Bucket` to encompass the full functionality of every provider. Rather, we intend to provide a subset of the most commonly used functionality. There will be cases where a developer wants to access provider-specific functionality, such as unexposed APIs or data fields, errors, or options. This can be accomplished using `As` functions. ## `As` {#as} `As` functions in the APIs provide the user a way to escape the Go CDK abstraction to access provider-specific types. They might be used as an interim solution until a feature request to the Go CDK is implemented. Or, the Go CDK may choose not to support specific features, and the use of `As` will be permanent. Using `As` implies that the resulting code is no longer portable; the provider-specific code will need to be ported in order to switch providers. Therefore, it should be avoided if possible. Each API includes examples demonstrating how to use its various `As` functions, and each provider implementation documents what types it supports for each. Usage: 1. Declare a variable of the provider-specific type you want to access. 2. Pass a pointer to it to `As`. 3. If the type is supported, `As` will return `true` and copy the provider-specific type into your variable. Otherwise, it will return `false`. Provider-specific types that are intended to be mutable will be exposed as a pointer to the underlying type. ================================================ FILE: internal/website/content/concepts/structure/index.md ================================================ --- title: "Structuring Portable Code" date: 2019-06-03T07:34:22-07:00 weight: 1 --- The Go CDK's APIs are intentionally structured to make it easier to separate your application's core logic from the details of the services it is using. ## Motivation Consider the [uploader tutorial][]. Without the Go CDK, we would have had to write a code path for Amazon's Simple Storage Service (S3) and another code path for Google Cloud Storage (GCS). That would work, but it would be tedious. We would have to learn the semantics of uploading files to both blob storage services. Even worse, we would have two code paths that effectively do the same thing, but would have to be maintained separately. It would be much nicer if we could write the upload logic once and reuse it across providers. That's exactly the kind of [separation of concerns][] that the Go CDK makes possible. (More details available in the [Go CDK design doc][Developers and Operators].) [Developers and Operators]: https://github.com/google/go-cloud/blob/master/internal/docs/design.md#developers-and-operators [separation of concerns]: https://en.wikipedia.org/wiki/Separation_of_concerns [uploader tutorial]: {{< ref "/tutorials/cli-uploader.md" >}} ## Portable Types and Drivers The portable APIs that the Go CDK exports (like [`blob.Bucket`][] or [`runtimevar.Variable`][]) are concrete types, not interfaces. To understand why, imagine if we used a plain interface: {{< figure class="FullWidthFigure" src="portable-type-no-driver.png" link="portable-type-no-driver.png" alt="Diagram showing user code depending on blob.Bucket, which is implemented by awsblob.Bucket." >}} Consider the [`Bucket.NewWriter` method][], which infers the content type of the blob based on the first bytes written to it. If `blob.Bucket` was an interface, each implementation of `blob.Bucket` would have to replicate this behavior precisely. This does not scale: conformance tests would be needed to ensure that each interface method actually behaves in the way that the docs describe. This makes the interfaces hard to implement, which runs counter to the goals of the project. Instead, we follow the example of [`database/sql`][] and separate out the implementation-agnostic logic from the interface. The implementation-agnostic logic-containing concrete type is the **portable type**. We call the interface the **driver**. Visually, it looks like this: {{< figure class="FullWidthFigure" src="portable-type.png" link="portable-type.png" alt="Diagram showing user code depending on blob.Bucket, which holds a driver.Bucket implemented by awsblob.Bucket." >}} This has a number of benefits: - The portable type can perform higher level logic without making the interface complex to implement. In the blob example, the portable type's `NewWriter` method can do the content type detection and then pass the final result to the driver type. - Methods can be added to the portable type without breaking compatibility. Contrast with adding methods to an interface, which is a breaking change. - When new operations on the driver are added as new optional interfaces, the portable type can hide the need for type-assertions from the user. (More details available in the [Go CDK design doc][Portable Types and Drivers].) [Portable Types and Drivers]: https://github.com/google/go-cloud/blob/master/internal/docs/design.md#portable-types-and-drivers [`blob.Bucket`]: https://godoc.org/github.com/google/go-cloud/blob#Bucket [`runtimevar.Variable`]: https://godoc.org/github.com/google/go-cloud/runtimevar#Variable [`Bucket.NewWriter` method]: https://godoc.org/github.com/google/go-cloud/blob#Bucket.NewWriter [`database/sql`]: https://godoc.org/database/sql ## Best Practices - **Create portable types as close to program startup as possible.** Since creation of a portable type requires using driver-specific setup, this separates your driver-specific details from the rest of your application. - **Pass portable types around as arguments or struct fields instead of as package variables.** This allows you to easily swap out the portable type for a local implementation in unit tests. It also enables you to use dependency injection tools like [Wire][] to set up your application. - **Avoid using [`As`][] functions when possible.** Using driver-specific options makes it harder to test your code with confidence or migrate to another driver later. If your application needs to use driver-specific options, try to make it so that other drivers fall back gracefully. For example, you may need to use a particular ACL setting for a write to a Google Cloud Storage bucket. When testing for the driver-specific write options, don't return an error if the `As` function doesn't have the right type. That way, when running against an in-memory bucket for tests, the write will still occur and can be observed. Leave provider-specific checks to integration tests. [`As`]: {{< ref "/concepts/as.md#as" >}} [Wire]: https://github.com/google/wire ================================================ FILE: internal/website/content/concepts/urls.md ================================================ --- title: "URLs" date: 2019-05-06T09:55:09-07:00 weight: 2 --- In addition to creating portable types via provider-specific constructors (e.g., creating a `*blob.Bucket` using [`s3blob.OpenBucket`][]), many portable types can also be created using a URL. The scheme of the URL specifies the provider, and each provider implementation has code to convert the URL into the data needed to call its constructor. For example, calling `blob.OpenBucket("s3blob://my-bucket")` will return a `*blob.Bucket` created using [`s3blob.OpenBucket`][]. [`s3blob.OpenBucket`]: https://godoc.org/gocloud.dev/blob/s3blob#OpenBucket Each portable API package will document the types that it supports opening by URL. For example, the `blob` package supports `Bucket`s, while the `pubsub` package supports `Topic`s and `Subscription`s. Each provider implementation will document what scheme(s) it registers for, and what format of URL it expects. Each portable type URL opener will accept URL schemes with an `+` prefix (e.g. `blob+file:///dir` instead of `file:///dir`, as well as schemes with an `++` prefix (e.g. `blob+bucket+file:///dir`). Each portable API package should include an example using a URL, and many providers will include provider-specific examples as well. ## Muxes Each portable type that is openable via URL will have a top-level function you can call, like [`blob.OpenBucket`][]. This top-level function uses a default instance of a `URLMux` multiplexer to map schemes to a provider-specific opener for the type. For example, `blob` has a [`BucketURLOpener`][] interface that providers implement and then register using [`RegisterBucket`][] on the result of [`DefaultURLMux`][]. Many applications will work just fine using the default mux through the top-level `Open` functions. However, if you want more control, you can create your own `URLMux` and register the provider `URLOpener`s you need. Most providers will export URLOpeners that give you more fine grained control over the arguments needed by the constructor. In particular, portable types opened via URL will often use default credentials from the environment. For example, the AWS URL openers use the credentials saved by "aws login" (we don't want to include credentials in the URL itself, since they are likely to be sensitive). 1. Instantiate the provider's `URLOpener` with the specific fields you need. For example, `s3blob.URLOpener{ConfigProvider: myAWSProvider}` using a `ConfigProvider` that holds explicit AWS credentials. 2. Create your own instance of the `URLMux`. For example: `mymux := new(blob.URLMux)` 3. Register your custom URLOpener on your mux. For example: `mymux.RegisterBucket(s3blob.Scheme, myS3URLOpener)` 4. Now use your mux to open URLs: `mymux.OpenBucket("s3://my-bucket")` [`blob.OpenBucket`]: https://godoc.org/gocloud.dev/blob#OpenBucket [`BucketURLOpener`]: https://godoc.org/gocloud.dev/blob#BucketURLOpener [`DefaultURLMux`]: https://godoc.org/gocloud.dev/blob#DefaultURLMux [`RegisterBucket`]: https://godoc.org/gocloud.dev/blob#URLMux.RegisterBucket ================================================ FILE: internal/website/content/docstore/_index.md ================================================ --- title: gocloud.dev/docstore type: pkg --- ================================================ FILE: internal/website/content/docstore/awsdynamodb/v2/_index.md ================================================ --- title: gocloud.dev/docstore/awsdynamodb/v2 type: pkg --- ================================================ FILE: internal/website/content/docstore/driver/_index.md ================================================ --- title: gocloud.dev/docstore/driver type: pkg --- ================================================ FILE: internal/website/content/docstore/drivertest/_index.md ================================================ --- title: gocloud.dev/docstore/drivertest type: pkg --- ================================================ FILE: internal/website/content/docstore/dynamodocstore/_index.md ================================================ --- title: gocloud.dev/docstore/dynamodocstore type: pkg --- ================================================ FILE: internal/website/content/docstore/firedocstore/_index.md ================================================ --- title: gocloud.dev/docstore/firedocstore type: pkg --- ================================================ FILE: internal/website/content/docstore/gcpfirestore/_index.md ================================================ --- title: gocloud.dev/docstore/gcpfirestore type: pkg --- ================================================ FILE: internal/website/content/docstore/internal/fields/_index.md ================================================ --- title: gocloud.dev/docstore/internal/fields type: pkg --- ================================================ FILE: internal/website/content/docstore/memdocstore/_index.md ================================================ --- title: gocloud.dev/docstore/memdocstore type: pkg --- ================================================ FILE: internal/website/content/docstore/mongodocstore/_index.md ================================================ --- title: gocloud.dev/docstore/mongodocstore type: pkg --- ================================================ FILE: internal/website/content/gcerrors/_index.md ================================================ --- title: gocloud.dev/gcerrors type: pkg --- ================================================ FILE: internal/website/content/gcp/_index.md ================================================ --- title: gocloud.dev/gcp type: pkg --- ================================================ FILE: internal/website/content/gcp/cloudsql/_index.md ================================================ --- title: gocloud.dev/gcp/cloudsql type: pkg --- ================================================ FILE: internal/website/content/gcp/gcpcloud/_index.md ================================================ --- title: gocloud.dev/gcp/gcpcloud type: pkg --- ================================================ FILE: internal/website/content/health/_index.md ================================================ --- title: gocloud.dev/health type: pkg --- ================================================ FILE: internal/website/content/health/sqlhealth/_index.md ================================================ --- title: gocloud.dev/health/sqlhealth type: pkg --- ================================================ FILE: internal/website/content/howto/_index.md ================================================ --- title: "How-To Guides" date: 2019-03-20T14:50:56-07:00 showInSidenav: true pagesInSidenav: true weight: 2 --- The guides in this section are aimed to help you solve common tasks with the Go CDK. They are grouped by API. ================================================ FILE: internal/website/content/howto/blob/_index.md ================================================ --- title: "Blob" date: 2019-07-09T16:46:29-07:00 lastmod: 2019-07-29T12:00:00-07:00 showInSidenav: true toc: true --- Blobs are a common abstraction for storing unstructured data on Cloud storage services and accessing them via HTTP. This guide shows how to work with blobs in the Go CDK. The [`blob` package][] supports operations like reading and writing blobs (using standard [`io` package][] interfaces), deleting blobs, and listing blobs in a bucket. Subpackages contain driver implementations of blob for various services, including Cloud and on-prem solutions. You can develop your application locally using [`fileblob`][], then deploy it to multiple Cloud providers with minimal initialization reconfiguration. [`blob` package]: https://godoc.org/gocloud.dev/blob [`io` package]: https://golang.org/pkg/io/ [`fileblob`]: https://godoc.org/gocloud.dev/blob/fileblob ## Opening a Bucket {#opening} The first step in interacting with unstructured storage is to instantiate a portable [`*blob.Bucket`][] for your storage service. The easiest way to do so is to use [`blob.OpenBucket`][] and a service-specific URL pointing to the bucket, making sure you ["blank import"][] the driver package to link it in. ```go import ( "gocloud.dev/blob" _ "gocloud.dev/blob/" ) ... bucket, err := blob.OpenBucket(context.Background(), "") if err != nil { return fmt.Errorf("could not open bucket: %v", err) } defer bucket.Close() // bucket is a *blob.Bucket; see usage below ... ``` See [Concepts: URLs][] for general background and the [guide below][] for URL usage for each supported service. Alternatively, if you need fine-grained control over the connection settings, you can call the constructor function in the driver package directly. ```go import "gocloud.dev/blob/" ... bucket, err := .OpenBucket(...) ... ``` You may find the [`wire` package][] useful for managing your initialization code when switching between different backing services. See the [guide below][] for constructor usage for each supported service. [`wire` package]: http://github.com/google/wire [`*blob.Bucket`]: https://godoc.org/gocloud.dev/blob#Bucket [`blob.OpenBucket`]: https://godoc.org/gocloud.dev/blob#OpenBucket ["blank import"]: https://golang.org/doc/effective_go.html#blank_import [Concepts: URLs]: {{< ref "/concepts/urls.md" >}} [guide below]: {{< ref "#services" >}} ### Prefixed Buckets {#prefix} You can wrap a `*blob.Bucket` to always operate on a subfolder of the bucket using `blob.PrefixedBucket`: {{< goexample "gocloud.dev/blob.ExamplePrefixedBucket" >}} Alternatively, you can configure the prefix directly in the `blob.OpenBucket` URL: {{< goexample "gocloud.dev/blob.Example_openFromURLWithPrefix" >}} ### Single Key Buckets {#singlekey} You can wrap a `*blob.Bucket` to always operate on a single key using `blob.SingleKeyBucket`: {{< goexample "gocloud.dev/blob.ExampleSingleKeyBucket" >}} Alternatively, you can configure the single key directly in the `blob.OpenBucket` URL: {{< goexample "gocloud.dev/blob.Example_openFromURLWithSingleKey" >}} The resulting bucket will ignore the `key` parameter to its functions, and always refer to the single key. This can be useful to allow configuration of a specific "file" via a single URL. `List` functions will not work on single key buckets. ## Using a Bucket {#using} Once you have opened a bucket for the storage provider you want, you can store and access data from it using the standard Go I/O patterns described below. Other operations like listing and reading metadata are documented in the [`blob` package documentation][]. [`blob` package documentation]: https://godoc.org/gocloud.dev/blob ### Writing Data to a Bucket {#writing} To write data to a bucket, you create a writer, write data to it, and then close the writer. Closing the writer commits the write to the provider, flushing any buffers, and releases any resources used while writing, so you must always check the error of `Close`. The writer implements [`io.Writer`][], so you can use any functions that take an `io.Writer` like `io.Copy` or `fmt.Fprintln`. {{< goexample src="gocloud.dev/blob.ExampleBucket_NewWriter" imports="0" >}} In some cases, you may want to cancel an in-progress write to avoid the blob being created or overwritten. A typical reason for wanting to cancel a write is encountering an error in the stream your program is copying from. To abort a write, you cancel the `Context` you pass to the writer. Again, you must always `Close` the writer to release the resources, but in this case you can ignore the error because the write's failure is expected. {{< goexample src="gocloud.dev/blob.ExampleBucket_NewWriter_cancel" imports="0" >}} [`io.Writer`]: https://golang.org/pkg/io/#Writer ### Reading Data from a Bucket {#reading} Once you have written data to a bucket, you can read it back by creating a reader. The reader implements [`io.Reader`][], so you can use any functions that take an `io.Reader` like `io.Copy` or `io/io.ReadAll`. You must always close a reader after using it to avoid leaking resources. {{< goexample src="gocloud.dev/blob.ExampleBucket_NewReader" imports="0" >}} Many storage providers provide efficient random-access to data in buckets. To start reading from an arbitrary offset in the blob, use `NewRangeReader`. {{< goexample src="gocloud.dev/blob.ExampleBucket_NewRangeReader" imports="0" >}} [`io.Reader`]: https://golang.org/pkg/io/#Reader ### Deleting a Bucket {#deleting} You can delete blobs using the `Bucket.Delete` method. {{< goexample src="gocloud.dev/blob.ExampleBucket_Delete" imports="0" >}} ## Other Usage Samples * [CLI Tutorial]({{< ref "/tutorials/cli-uploader.md" >}}) * [CLI Sample](https://github.com/google/go-cloud/tree/master/samples/gocdk-blob) * [Guestbook sample](https://gocloud.dev/tutorials/guestbook/) * [blob package examples](https://godoc.org/gocloud.dev/blob#pkg-examples) ## Supported Storage Services {#services} ### Google Cloud Storage {#gcs} [Google Cloud Storage][] (GCS) URLs in the Go CDK closely resemble the URLs you would see in the [`gsutil`][] CLI. [Google Cloud Storage]: https://cloud.google.com/storage/ [`gsutil`]: https://cloud.google.com/storage/docs/gsutil `blob.OpenBucket` will use Application Default Credentials; if you have authenticated via [`gcloud auth application-default login`][], it will use those credentials. See [Application Default Credentials][GCP creds] to learn about authentication alternatives, including using environment variables. [GCP creds]: https://cloud.google.com/docs/authentication/production [`gcloud auth application-default login`]: https://cloud.google.com/sdk/gcloud/reference/auth/application-default/login {{< goexample "gocloud.dev/blob/gcsblob.Example_openBucketFromURL" >}} Full details about acceptable URLs can be found under the API reference for [`gcsblob.URLOpener`][]. [`gcsblob.URLOpener`]: https://godoc.org/gocloud.dev/blob/gcsblob#URLOpener #### GCS Constructor {#gcs-ctor} The [`gcsblob.OpenBucket`][] constructor opens a GCS bucket. You must first create a `*net/http.Client` that sends requests authorized by [Google Cloud Platform credentials][GCP creds]. (You can reuse the same client for any other API that takes in a `*gcp.HTTPClient`.) You can find functions in the [`gocloud.dev/gcp`][] package to set this up for you. {{< goexample "gocloud.dev/blob/gcsblob.ExampleOpenBucket" >}} [`gcsblob.OpenBucket`]: https://godoc.org/gocloud.dev/blob/gcsblob#OpenBucket [`gocloud.dev/gcp`]: https://godoc.org/gocloud.dev/gcp ### S3 {#s3} S3 URLs in the Go CDK closely resemble the URLs you would see in the [AWS CLI][]. You should specify the `region` query parameter to ensure your application connects to the correct region. It will create an AWS Config based on the AWS SDK V2; see [AWS V2 Config][] to learn more. Full details about acceptable URLs can be found under the API reference for [`s3blob.URLOpener`][]. {{< goexample "gocloud.dev/blob/s3blob.Example_openBucketFromURL" >}} [AWS CLI]: https://aws.amazon.com/cli/ [AWS V2 Config]: https://aws.github.io/aws-sdk-go-v2/docs/configuring-sdk/ [`s3blob.URLOpener`]: https://godoc.org/gocloud.dev/blob/s3blob#URLOpener #### S3 Constructor {#s3-ctor} The [`s3blob.OpenBucket`][] constructor opens an [S3][] bucket. You must first create an AWS Config with the same region as your bucket: {{< goexample "gocloud.dev/blob/s3blob.ExampleOpenBucket" >}} [`s3blob.OpenBucket`]: https://godoc.org/gocloud.dev/blob/s3blob#OpenBucket [S3]: https://aws.amazon.com/s3/ #### S3-Compatible Servers {#s3-compatible} The Go CDK can also interact with [S3-compatible storage servers][] that recognize the same REST HTTP endpoints as S3, like [Minio][], [Ceph][], or [SeaweedFS][]. You can change the endpoint by changing the [`Endpoint` field][] on the `*aws.Config` you pass to `s3blob.OpenBucket`. If you are using `blob.OpenBucket`, you can switch endpoints by using the S3 URL using query parameters like so: ```go bucket, err := blob.OpenBucket("s3://mybucket?" + "endpoint=my.minio.local:8080&" + "disable_https=true&" + "s3ForcePathStyle=true") ``` See [`aws.V2ConfigFromURLParams`][] for more details on supported URL options for S3. [`aws.V2ConfigFromURLParams`]: https://godoc.org/gocloud.dev/aws#V2ConfigFromURLParams [`Endpoint` field]: https://godoc.org/github.com/aws/aws-sdk-go/aws#Config.Endpoint [Ceph]: https://ceph.com/ [Minio]: https://www.minio.io/ [SeaweedFS]: https://github.com/chrislusf/seaweedfs [S3-compatible storage servers]: https://en.wikipedia.org/wiki/Amazon_S3#S3_API_and_competing_services ### Azure Blob Storage {#azure} Azure Blob Storage URLs in the Go CDK allow you to identify [Azure Blob Storage][] containers when opening a bucket with `blob.OpenBucket`. Go CDK uses the environment variables `AZURE_STORAGE_ACCOUNT`, `AZURE_STORAGE_KEY`, and `AZURE_STORAGE_SAS_TOKEN`, among others, to configure the credentials. {{< goexample "gocloud.dev/blob/azureblob.Example_openBucketFromURL" >}} Full details about acceptable URLs can be found under the API reference for [`azureblob.URLOpener`][]. [Azure Blob Storage]: https://azure.microsoft.com/en-us/services/storage/blobs/ [`azureblob.URLOpener`]: https://godoc.org/gocloud.dev/blob/azureblob#URLOpener #### Azure Blob Constructor {#azure-ctor} The [`azureblob.OpenBucket`][] constructor opens an Azure Blob Storage container. `azureblob` operates on [Azure Storage Block Blobs][]. You must first create an Azure Service Client before you can open a container. {{< goexample "gocloud.dev/blob/azureblob.ExampleOpenBucket" >}} [Azure Storage Block Blobs]: https://docs.microsoft.com/en-us/rest/api/storageservices/understanding-block-blobs--append-blobs--and-page-blobs#about-block-blobs [`azureblob.OpenBucket`]: https://godoc.org/gocloud.dev/blob/azureblob#OpenBucket ### Local Storage {#local} The Go CDK provides blob drivers for storing data in memory and on the local filesystem. These are primarily intended for testing and local development, but may be useful in production scenarios where an NFS mount is used. Local storage URLs take the form of either `mem://` or `file:///` URLs. Memory URLs are always `mem://` with no other information and always create a new bucket. File URLs convert slashes to the operating system's native file separator, so on Windows, `C:\foo\bar` would be written as `file:///C:/foo/bar`. ```go import ( "gocloud.dev/blob" _ "gocloud.dev/blob/fileblob" _ "gocloud.dev/blob/memblob" ) // ... bucket1, err := blob.OpenBucket(ctx, "mem://") if err != nil { return err } defer bucket1.Close() bucket2, err := blob.OpenBucket(ctx, "file:///path/to/dir") if err != nil { return err } defer bucket2.Close() ``` #### Local Storage Constructors {#local-ctor} You can create an in-memory bucket with [`memblob.OpenBucket`][]: {{< goexample "gocloud.dev/blob/memblob.ExampleOpenBucket" >}} You can use a local filesystem directory with [`fileblob.OpenBucket`][]: {{< goexample "gocloud.dev/blob/fileblob.ExampleOpenBucket" >}} [`fileblob.OpenBucket`]: https://godoc.org/gocloud.dev/blob/fileblob#OpenBucket [`memblob.OpenBucket`]: https://godoc.org/gocloud.dev/blob/memblob#OpenBucket ================================================ FILE: internal/website/content/howto/docstore/_index.md ================================================ --- title: "Docstore" date: 2019-06-08T15:11:57-04:00 lastmod: 2019-07-29T12:00:00-07:00 showInSidenav: true toc: true --- The [`docstore` package][] provides an abstraction layer over common [document stores](https://en.wikipedia.org/wiki/Document-oriented_database) like Google Cloud Firestore, Amazon DynamoDB and MongoDB. This guide shows how to work with document stores in the Go CDK. A document store is a service that stores data in semi-structured JSON-like documents grouped into collections. Like other NoSQL databases, document stores are schemaless. The [`docstore` package][] supports operations to add, retrieve, modify and delete documents. Subpackages contain driver implementations of docstore for various services, including Cloud and on-prem solutions. You can develop your application locally using [`memdocstore`][], then deploy it to multiple Cloud providers with minimal initialization reconfiguration. [`docstore` package]: https://godoc.org/gocloud.dev/docstore [`memdocstore`]: https://godoc.org/gocloud.dev/docstore/memdocstore ## Opening a Collection {#opening} The first step in interacting with a document store is to instantiate a portable [`*docstore.Collection`][] for your service. While every docstore service has the concept of a primary key that uniquely distinguishes a document in a collection, each one specifies that key in its own way. To be portable, Docstore requires that the key be part of the document's contents. When you open a collection using one of the functions described here, you specify how to find the provider's primary key in the document. The easiest way to open a collection is using [`docstore.OpenCollection`][] and a service-specific URL pointing to it, making sure you ["blank import"][] the driver package to link it in. ```go import ( "gocloud.dev/docstore" _ "gocloud.dev/docstore/" ) ... coll, err := docstore.OpenCollection(context.Background(), "") if err != nil { return fmt.Errorf("could not open collection: %v", err) } defer coll.Close() // coll is a *docstore.Collection; see usage below ... ``` See [Concepts: URLs][] for general background and the [guide below][] for URL usage for each supported service. Alternatively, if you need fine-grained control over the connection settings, you can call the constructor function in the driver package directly (like `mongodocstore.OpenCollection`). ```go import "gocloud.dev/docstore/" ... coll, err := .OpenCollection(...) ... ``` You may find the [`wire` package][] useful for managing your initialization code when switching between different backing services. See the [guide below][] for constructor usage for each supported service [`*docstore.Collection`]: https://godoc.org/gocloud.dev/docstore#Collection [`docstore.OpenCollection`]: https://godoc.org/gocloud.dev/docstore#OpenCollection ["blank import"]: https://golang.org/doc/effective_go.html#blank_import [Concepts: URLs]: {{< ref "/concepts/urls.md" >}} [guide below]: {{< ref "#services" >}} [`wire` package]: http://github.com/google/wire ## Using a Collection {#using} ### Representing Documents {#rep-doc} We'll use a collection with documents represented by this Go struct: ```go type Player struct { Name string Score int DocstoreRevision interface{} } ``` We recommend using structs for documents because they impose some structure on your data, but Docstore also accepts `map[string]interface{}` values. See [the `docstore` package documentation](https://godoc.org/gocloud.dev/docstore#hdr-Documents) for more information. The `DocstoreRevision` field holds information about the latest revision of the document. We discuss it [below]({{< ref "#rev" >}}). ### Actions {#actions} Once you have [opened a collection]( {{< ref "#opening" >}}), you can call action methods on it to read, modify and write documents. You can execute a single action, or run multiple actions together in an [_action list_]({{ ref "act-list" }}). Docstore supports six kinds of actions on documents: - `Get` retrieves a document. - `Create` creates a new document. - `Replace` replaces an existing document. - `Put` puts a document whether or not it already exists. - `Update` applies a set of modifications to a document. - `Delete` deletes a document. You can create a single document with the `Collection.Create` method, we will use `coll` as the variable holding the collection throughout the guide: ```go err := coll.Create(ctx, &Player{Name: "Pat", Score: 10}) if err != nil { return err } ``` #### Action Lists {#act-list} When you use an action list to perform multiple actions at once, drivers can optimize action lists by using bulk RPCs, running the actions concurrently, or employing a provider's special features to improve efficiency and reduce cost. Here we create several documents using an action list. {{< goexample "gocloud.dev/docstore.ExampleCollection_Actions_bulkWrite" >}} `ActionList` has a fluent API, so you can build and execute a sequence of actions in one line of code. Here we `Put` a document and immediately `Get` its new contents. {{< goexample "gocloud.dev/docstore.ExampleCollection_Actions_getAfterWrite" >}} If the underlying provider is eventually consistent, the result of the `Get` might not reflect the `Put`. Docstore only guarantees that it will perform the `Get` after the `Put` completes. See the documentation for [`docstore.ActionList`][] for the semantics of action list execution. [`docstore.ActionList`]: https://godoc.org/gocloud.dev/docstore#ActionList #### Updates {#act-update} Use `Update` to modify individual fields of a document. The `Update` action takes a set of modifications to document fields, and applies them all atomically. You can change the value of a field, increment it, or delete it. {{< goexample "gocloud.dev/docstore.ExampleCollection_Update" >}} ### Queries {#queries} Docstore's `Get` action lets you retrieve a single document by its primary key. Queries let you retrieve all documents that match some conditions. You can also use queries to delete or update all documents that match the conditions. #### Getting Documents {#qr-get} Like [actions]({{< ref "#actions" >}}), queries are built up in a fluent style. Just as a `Get` action returns one document, the `Query.Get` method returns several documents, in the form of an iterator. ```go iter := coll.Query().Where("Score", ">", 20).Get(ctx) defer iter.Stop() // Always call Stop on an iterator. ``` Repeatedly calling `Next` on the iterator will return all the matching documents. Like the `Get` action, `Next` will populate an empty document that you pass to it: ```go doc := &Player{} err := iter.Next(ctx, doc) ``` The iteration is over when `Next` returns `io.EOF`. {{< goexample "gocloud.dev/docstore.ExampleQuery_Get" >}} You can pass a list of fields to `Get` to reduce the amount of data transmitted. Queries support the following methods: - `Where` describes a condition on a document. You can ask whether a field is equal to, greater than, or less than a value. The "not equals" comparison isn't supported, because it isn't portable across providers. - `OrderBy` specifies the order of the resulting documents, by field and direction. For portability, you can specify at most one `OrderBy`, and its field must also be mentioned in a `Where` clause. - `Limit` limits the number of documents in the result. If a query returns an error, the message may help you fix the problem. Some features, like full table scans, have to be enabled via constructor options, because they can be expensive. Other queries may require that you manually create an index on the collection. ### Revisions {#rev} Docstore maintains a revision for every document. Whenever the document is changed, the revision is too. By default, Docstore stores the revision in a field named `DocstoreRevision`, but you can change the field name via an option to a `Collection` constructor. You can use revisions to perform _optimistic locking_, a technique for updating a document atomically: 1. `Get` a document. This reads the current revision. 2. Modify the document contents on the client (but do not change the revision). 3. `Replace` the document. If the document was changed since it was retrieved in step 1, the revision will be different, and Docstore will return an error instead of overwriting the document. 4. If the `Replace` failed, start again from step 1. {{< goexample "gocloud.dev/docstore.Example_optimisticLocking" >}} See [the Revisions section of the package documentation](https://godoc.org/gocloud.dev/docstore#hdr-Revisions) for more on revisions. ## Other Usage Samples * [CLI Sample](https://github.com/google/go-cloud/tree/master/samples/gocdk-docstore) * [Order Processor sample](https://gocloud.dev/tutorials/order/) * [docstore package examples](https://godoc.org/gocloud.dev/docstore#pkg-examples) ## Supported Docstore Services {#services} ### Google Cloud Firestore {#firestore} The [`gcpfirestore`](https://godoc.org/gocloud.dev/docstore/gcpfirestore) package supports [Google Cloud Firestore](https://cloud.google.com/firestore). Firestore documents are uniquely named by paths that are not part of the document content. In Docstore, these unique names are represented as part of the document. You must supply a way to extract a document's name from its contents. This can be done by specifying a document field that holds the name, or by providing a function to extract the name from a document. Firestore URLs provide the project and collection, as well as the field that holds the document name. `docstore.OpenCollection` will use Application Default Credentials; if you have authenticated via [`gcloud auth application-default login`][], it will use those credentials. See [Application Default Credentials][GCP creds] to learn about authentication alternatives, including using environment variables. [GCP creds]: https://cloud.google.com/docs/authentication/production [`gcloud auth application-default login`]: https://cloud.google.com/sdk/gcloud/reference/auth/application-default/login {{< goexample "gocloud.dev/docstore/gcpfirestore.Example_openCollectionFromURL" >}} Full details about acceptable URLs can be found under the API reference for [`gcpfirestore.URLOpener`][]. [`gcpfirestore.URLOpener`]: https://godoc.org/gocloud.dev/docstore/gcpfirestore#URLOpener #### Firestore Constructors {#firestore-ctor} The [`gcpfirestore.OpenCollection`][] constructor opens a Cloud Firestore collection as a Docstore collection. You must first connect a Firestore client using [`gcpfirestore.Dial`][] or the [`cloud.google.com/go/firestore/apiv1`](https://godoc.org/cloud.google.com/go/firestore/apiv1) package. In addition to a client, `OpenCollection` requires a Google Cloud project ID, the path to the Firestore collection, and the name of the field that holds the document name. {{< goexample "gocloud.dev/docstore/gcpfirestore.ExampleOpenCollection" >}} Instead of mapping the document name to a field, you can supply a function to construct the name from the document contents with [`gcpfirestore.OpenCollectionWithNameFunc`][]. This can be useful for documents whose name is the combination of two or more fields. {{< goexample "gocloud.dev/docstore/gcpfirestore.ExampleOpenCollectionWithNameFunc" >}} [`gcpfirestore.Dial`]: https://godoc.org/gocloud.dev/docstore/gcpfirestore#Dial [`gcpfirestore.OpenCollection`]: https://godoc.org/gocloud.dev/docstore/gcpfirestore#OpenCollection [`gcpfirestore.OpenCollectionWithNameFunc`]: https://godoc.org/gocloud.dev/docstore/gcpfirestore#OpenCollectionWithNameFunc ### Amazon DynamoDB {#dynamodb} The [`awsdynamodb`](https://godoc.org/gocloud.dev/docstore/awsdynamodb) package supports [Amazon DynamoDB](https://aws.amazon.com/dynamodb). A Docstore collection corresponds to a DynamoDB table. DynamoDB URLs provide the table, partition key field and optionally the sort key field for the collection. `docstore.OpenCollection` will create a default AWS Session with the `SharedConfigEnable` option enabled; if you have authenticated with the AWS CLI, it will use those credentials. See [AWS Session][] to learn about authentication alternatives, including using environment variables. [AWS Session]: https://docs.aws.amazon.com/sdk-for-go/api/aws/session/ {{< goexample "gocloud.dev/docstore/awsdynamodb.Example_openCollectionFromURL" >}} Full details about acceptable URLs can be found under the API reference for [`awsdynamodb.URLOpener`][]. #### DynamoDB Constructor {#dynamodb-ctor} The [`awsdynamodb.OpenCollection`][] constructor opens a DynamoDB table as a Docstore collection. You must first create an [AWS session][] with the same region as your collection: {{< goexample "gocloud.dev/docstore/awsdynamodb.ExampleOpenCollection" >}} [AWS session]: https://docs.aws.amazon.com/sdk-for-go/api/aws/session/ [`awsdynamodb.OpenCollection`]: https://godoc.org/gocloud.dev/docstore/awsdynamodb#OpenCollection [`awsdynamodb.URLOpener`]: https://godoc.org/gocloud.dev/docstore/awsdynamodb#URLOpener ### Azure Cosmos DB {#cosmosdb} [Azure Cosmos DB][] is compatible with the MongoDB API. You can use the [`mongodocstore`][] package to connect to Cosmos DB. You must [create an Azure Cosmos account][] and get the MongoDB [connection string][]. When you use MongoDB URLs to connect to Cosmos DB, specify the Mongo server URL by setting the `MONGO_SERVER_URL` environment variable to the connection string. See the [MongoDB section][] for more details and examples on how to use the package. [Azure Cosmos DB]: https://docs.microsoft.com/en-us/azure/cosmos-db/ [create an Azure Cosmos account]: https://docs.microsoft.com/en-us/azure/cosmos-db/create-mongodb-dotnet [connection string]: https://docs.microsoft.com/en-us/azure/cosmos-db/connect-mongodb-account#QuickstartConnection [MongoDB section]: {{< ref "#mongo" >}} #### Cosmos DB Constructors {#cosmosdb-ctor} The [`mongodocstore.OpenCollection`][] constructor can open a Cosmos DB collection. You must first obtain a standard MongoDB Go client with your Cosmos connections string. See the [MongoDB constructor section][] for more details and examples. [MongoDB constructor section]: {{< ref "#mongo-ctor" >}} ### MongoDB {#mongo} The [`mongodocstore`][] package supports the popular [MongoDB](https://mongodb.org) document store. MongoDB documents are uniquely identified by a field called `_id`. In Docstore, you can choose a different name for this field, or provide a function to extract the document ID from a document. MongoDB URLs provide the database and collection, and optionally the field that holds the document ID. Specify the Mongo server URL by setting the `MONGO_SERVER_URL` environment variable. {{< goexample "gocloud.dev/docstore/mongodocstore.Example_openCollectionFromURL" >}} Full details about acceptable URLs can be found under the API reference for [`mongodocstore.URLOpener`][]. [`mongodocstore.URLOpener`]: https://godoc.org/gocloud.dev/docstore/mongodocstore#URLOpener #### MongoDB Constructors {#mongo-ctor} The [`mongodocstore.OpenCollection`][] constructor opens a MongoDB collection. You must first obtain a standard MongoDB Go client using [`mongodocstore.Dial`][] or the package [`go.mongodb.org/mongo-driver/mongo`](https://godoc.org/go.mongodb.org/mongo-driver/mongo). Obtain a `*mongo.Collection` from the client with `client.Database(dbName).Collection(collName)`. Then pass the result to `mongodocstore.OpenCollection` along with the name of the ID field, or `""` to use `_id`. {{< goexample "gocloud.dev/docstore/mongodocstore.ExampleOpenCollection" >}} Instead of mapping the document ID to a field, you can supply a function to construct the ID from the document contents with [`mongodocstore.OpenCollectionWithIDFunc`][]. This can be useful for documents whose name is the combination of two or more fields. {{< goexample "gocloud.dev/docstore/mongodocstore.ExampleOpenCollectionWithIDFunc" >}} [`mongodocstore`]: https://godoc.org/gocloud.dev/docstore/mongodocstore [`mongodocstore.Dial`]: https://godoc.org/gocloud.dev/docstore/mongodocstore#Dial [`mongodocstore.OpenCollection`]: https://godoc.org/gocloud.dev/docstore/mongodocstore#OpenCollection [`mongodocstore.OpenCollectionWithIDFunc`]: https://godoc.org/gocloud.dev/docstore/mongodocstore#OpenCollectionWithIDFunc ### In-Memory Document Store {#mem} The [`memdocstore`](https://godoc.org/gocloud.dev/docstore/memdocstore) package implements an in-memory document store suitable for testing and development. URLs for the in-memory store have a `mem:` scheme. The URL host is used as the the collection name, and the URL path is used as the name of the document field to use as a primary key. {{< goexample "gocloud.dev/docstore/memdocstore.Example_openCollectionFromURL" >}} Full details about acceptable URLs can be found under the API reference for [`memdocstore.URLOpener`][]. [`memdocstore.URLOpener`]: https://godoc.org/gocloud.dev/docstore/memdocstore#URLOpener #### Mem Constructors {#mem-ctor} The [`memdocstore.OpenCollection`][] constructor creates and opens a collection, taking the name of the key field. {{< goexample "gocloud.dev/docstore/memdocstore.ExampleOpenCollection" >}} You can instead supply a function to construct the primary key from the document contents with [`memdocstore.OpenCollectionWithKeyFunc`][]. This can be useful for documents whose name is the combination of two or more fields. {{< goexample "gocloud.dev/docstore/memdocstore.ExampleOpenCollectionWithKeyFunc" >}} [`memdocstore.OpenCollection`]: https://godoc.org/gocloud.dev/docstore/memdocstore#OpenCollection [`memdocstore.OpenCollectionWithKeyFunc`]: https://godoc.org/gocloud.dev/docstore/memdocstore#OpenCollectionWithKeyFunc ================================================ FILE: internal/website/content/howto/pubsub/_index.md ================================================ --- title: "Pub/Sub" date: 2019-03-26T09:44:06-07:00 showInSidenav: true --- The [`pubsub` package][] provides an easy and portable way to interact with publish/subscribe systems. This guide shows how to work with pubsub in the Go CDK. The [publish/subscribe model][] allows parts of a system to publish messages that other parts of a system may subscribe to. This is commonly used to arrange for work to happen at some point after an interactive frontend request is finished or in other event-driven computing. The [`pubsub` package][] supports operations to publish messages to a topic and to subscribe to receive messages from a topic. Subpackages contain driver implementations of pubsub for various services, including Cloud and on-prem solutions. You can develop your application locally using [`mempubsub`][], then deploy it to multiple Cloud providers with minimal initialization reconfiguration. [publish/subscribe model]: https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern [`pubsub` package]: https://godoc.org/gocloud.dev/pubsub [`mempubsub`]: https://godoc.org/gocloud.dev/pubsub/mempubsub ================================================ FILE: internal/website/content/howto/pubsub/publish.md ================================================ --- title: "Publish Messages to a Topic" date: 2019-03-26T09:44:15-07:00 lastmod: 2019-07-29T12:00:00-07:00 weight: 1 toc: true --- Publishing a message to a topic with the Go CDK takes two steps: 1. [Open a topic][] with the Pub/Sub provider of your choice (once per topic). 2. [Send messages][] on the topic. [Open a topic]: {{< ref "#opening" >}} [Send messages]: {{< ref "#sending" >}} ## Opening a Topic {#opening} The first step in publishing messages to a topic is to instantiate a portable [`*pubsub.Topic`][] for your service. The easiest way to do so is to use [`pubsub.OpenTopic`][] and a service-specific URL pointing to the topic, making sure you ["blank import"][] the driver package to link it in. ```go import ( "context" "gocloud.dev/pubsub" _ "gocloud.dev/pubsub/" ) ... ctx := context.Background() topic, err := pubsub.OpenTopic(ctx, "") if err != nil { return fmt.Errorf("could not open topic: %v", err) } defer topic.Shutdown(ctx) // topic is a *pubsub.Topic; see usage below ... ``` See [Concepts: URLs][] for general background and the [guide below][] for URL usage for each supported service. Alternatively, if you need fine-grained control over the connection settings, you can call the constructor function in the driver package directly (like `gcppubsubv2.OpenTopic`). ```go import "gocloud.dev/pubsub/" ... topic, err := .OpenTopic(...) ... ``` You may find the [`wire` package][] useful for managing your initialization code when switching between different backing services. See the [guide below][] for constructor usage for each supported service. [guide below]: {{< ref "#services" >}} [`*pubsub.Topic`]: https://godoc.org/gocloud.dev/pubsub#Topic [`pubsub.OpenTopic`]: https://godoc.org/gocloud.dev/pubsub#OpenTopic ["blank import"]: https://golang.org/doc/effective_go.html#blank_import [Concepts: URLs]: {{< ref "/concepts/urls.md" >}} [`wire` package]: http://github.com/google/wire ## Sending Messages on a Topic {#sending} Sending a message on a [Topic](https://godoc.org/gocloud.dev/pubsub#Topic) looks like this: {{< goexample src="gocloud.dev/pubsub.ExampleTopic_Send" imports="0" >}} Note that the [semantics of message delivery][] can vary by backing service. [semantics of message delivery]: https://godoc.org/gocloud.dev/pubsub#hdr-At_most_once_and_At_least_once_Delivery ## Other Usage Samples * [CLI Sample](https://github.com/google/go-cloud/tree/master/samples/gocdk-pubsub) * [Order Processor sample](https://gocloud.dev/tutorials/order/) * [pubsub package examples](https://godoc.org/gocloud.dev/pubsub#pkg-examples) ## Supported Pub/Sub Services {#services} ### Google Cloud Pub/Sub {#gcp} The Go CDK can publish to a Google [Cloud Pub/Sub][] topic. The URLs use the project ID and the topic ID. [Cloud Pub/Sub]: https://cloud.google.com/pubsub/docs/ `pubsub.OpenTopic` will use Application Default Credentials; if you have authenticated via [`gcloud auth application-default login`][], it will use those credentials. See [Application Default Credentials][GCP creds] to learn about authentication alternatives, including using environment variables. [GCP creds]: https://cloud.google.com/docs/authentication/production [`gcloud auth application-default login`]: https://cloud.google.com/sdk/gcloud/reference/auth/application-default/login {{< goexample "gocloud.dev/pubsub/gcppubsubv2.Example_openTopicFromURL" >}} #### Google Cloud Pub/Sub Constructor {#gcp-ctor} The [`gcppubsubv2.OpenTopic`][] constructor opens a Cloud Pub/Sub topic. You must first obtain [GCP credentials][GCP creds] and then create a gRPC connection to Cloud Pub/Sub. (This gRPC connection can be reused among topics.) {{< goexample "gocloud.dev/pubsub/gcppubsubv2.ExampleOpenTopic" >}} [`gcppubsubv2.OpenTopic`]: https://godoc.org/gocloud.dev/pubsub/gcppubsubv2#OpenTopic ### Amazon Simple Notification Service {#sns} The Go CDK can publish to an Amazon [Simple Notification Service][SNS] (SNS) topic. SNS URLs in the Go CDK use the Amazon Resource Name (ARN) to identify the topic. You should specify the `region` query parameter to ensure your application connects to the correct region. [SNS]: https://aws.amazon.com/sns/ It will create an AWS Config based on the AWS SDK V2; see [AWS V2 Config][] to learn more. {{< goexample "gocloud.dev/pubsub/awssnssqs.Example_openSNSTopicFromURL" >}} SNS messages are restricted to UTF-8 clean payloads. If your application sends a message that contains non-UTF-8 bytes, then the Go CDK will automatically [Base64][] encode the message and add a `base64encoded` message attribute. When subscribing to messages on the topic through the Go CDK, these will be [automatically Base64 decoded][SQS Subscribe], but if you are receiving messages from a topic in a program that does not use the Go CDK, you may need to manually Base64 decode the message payload. [Base64]: https://en.wikipedia.org/wiki/Base64 [SQS Subscribe]: {{< relref "./subscribe.md#sqs" >}} [AWS V2 Config]: https://aws.github.io/aws-sdk-go-v2/docs/configuring-sdk/ #### Amazon SNS Constructor {#sns-ctor} The [`awssnssqs.OpenSNSTopic`][] constructor opens an SNS topic. You must first create an AWS Config with the same region as your topic: {{< goexample "gocloud.dev/pubsub/awssnssqs.ExampleOpenSNSTopic" >}} [`awssnssqs.OpenSNSTopic`]: https://godoc.org/gocloud.dev/pubsub/awssnssqs#OpenSNSTopic ### Amazon Simple Queue Service {#sqs} The Go CDK can publish to an Amazon [Simple Queue Service][SQS] (SQS) topic. SQS URLs closely resemble the the queue URL, except the leading `https://` is replaced with `awssqs://`. You can specify the `region` query parameter to ensure your application connects to the correct region, but otherwise `pubsub.OpenTopic` will use the region found in the environment variables or your AWS CLI configuration. {{< goexample "gocloud.dev/pubsub/awssnssqs.Example_openSQSTopicFromURL" >}} SQS messages are restricted to UTF-8 clean payloads. If your application sends a message that contains non-UTF-8 bytes, then the Go CDK will automatically [Base64][] encode the message and add a `base64encoded` message attribute. When subscribing to messages on the topic through the Go CDK, these will be [automatically Base64 decoded][SQS Subscribe], but if you are receiving messages from a topic in a program that does not use the Go CDK, you may need to manually Base64 decode the message payload. [Base64]: https://en.wikipedia.org/wiki/Base64 [SQS Subscribe]: {{< relref "./subscribe.md#sqs" >}} [SQS]: https://aws.amazon.com/sqs/ #### Amazon SQS Constructor {#sqs-ctor} The [`awssnssqs.OpenSQSTopic`][] constructor opens an SQS topic. You must first create an AWS Config with the same region as your topic: {{< goexample "gocloud.dev/pubsub/awssnssqs.ExampleOpenSQSTopic" >}} [`awssnssqs.OpenSQSTopic`]: https://godoc.org/gocloud.dev/pubsub/awssnssqs#OpenSQSTopic ### Azure Service Bus {#azure} The Go CDK can publish to an [Azure Service Bus][] topic. The URL for publishing is the topic name. `pubsub.OpenTopic` will use the environment variable `SERVICEBUS_CONNECTION_STRING` to obtain the Service Bus connection string. The connection string can be obtained [from the Azure portal][Azure connection string]. {{< goexample "gocloud.dev/pubsub/azuresb.Example_openTopicFromURL" >}} [Azure connection string]: https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-dotnet-how-to-use-topics-subscriptions#get-the-connection-string [Azure Service Bus]: https://azure.microsoft.com/en-us/services/service-bus/ #### Azure Service Bus Constructor {#azure-ctor} The [`azuresb.OpenTopic`][] constructor opens an Azure Service Bus topic. You must first connect to the topic using the [Azure Service Bus library][] and then pass it to `azuresb.OpenTopic`. There are also helper functions in the `azuresb` package to make this easier. {{< goexample "gocloud.dev/pubsub/azuresb.ExampleOpenTopic" >}} [`azuresb.OpenTopic`]: https://godoc.org/gocloud.dev/pubsub/azuresb#OpenTopic [Azure Service Bus library]: https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus ### RabbitMQ {#rabbitmq} The Go CDK can publish to an [AMQP 0.9.1][] fanout exchange, the dialect of AMQP spoken by [RabbitMQ][]. A RabbitMQ URL only includes the exchange name. The RabbitMQ's server is discovered from the `RABBIT_SERVER_URL` environment variable (which is something like `amqp://guest:guest@localhost:5672/`). {{< goexample "gocloud.dev/pubsub/rabbitpubsub.Example_openTopicFromURL" >}} [AMQP 0.9.1]: https://www.rabbitmq.com/protocol.html [RabbitMQ]: https://www.rabbitmq.com #### RabbitMQ Constructor {#rabbitmq-ctor} The [`rabbitpubsub.OpenTopic`][] constructor opens a RabbitMQ exchange. You must first create an [`*amqp.Connection`][] to your RabbitMQ instance. {{< goexample "gocloud.dev/pubsub/rabbitpubsub.ExampleOpenTopic" >}} [`*amqp.Connection`]: https://pkg.go.dev/github.com/rabbitmq/amqp091-go#Connection [`rabbitpubsub.OpenTopic`]: https://godoc.org/gocloud.dev/pubsub/rabbitpubsub#OpenTopic ### NATS {#nats} The Go CDK can publish to a [NATS][] subject. A NATS URL only includes the subject name. The NATS server is discovered from the `NATS_SERVER_URL` environment variable (which is something like `nats://nats.example.com`). {{< goexample "gocloud.dev/pubsub/natspubsub.Example_openTopicFromURL" >}} Because NATS does not natively support metadata, messages sent to NATS will be encoded with [gob][]. [gob]: https://golang.org/pkg/encoding/gob/ [NATS]: https://nats.io/ #### NATS Constructor {#nats-ctor} The [`natspubsub.OpenTopic`][] constructor opens a NATS subject as a topic. You must first create an [`*nats.Conn`][] to your NATS instance. {{< goexample "gocloud.dev/pubsub/natspubsub.ExampleOpenTopic" >}} [`*nats.Conn`]: https://godoc.org/github.com/nats-io/go-nats#Conn [`natspubsub.OpenTopic`]: https://godoc.org/gocloud.dev/pubsub/natspubsub#OpenTopic ### Kafka {#kafka} The Go CDK can publish to a [Kafka][] cluster. A Kafka URL only includes the topic name. The brokers in the Kafka cluster are discovered from the `KAFKA_BROKERS` environment variable (which is a comma-delimited list of hosts, something like `1.2.3.4:9092,5.6.7.8:9092`). {{< goexample "gocloud.dev/pubsub/kafkapubsub.Example_openTopicFromURL" >}} [Kafka]: https://kafka.apache.org/ #### Kafka Constructor {#kafka-ctor} The [`kafkapubsub.OpenTopic`][] constructor opens a Kafka topic to publish messages to. Depending on your Kafka cluster configuration (see `auto.create.topics.enable`), you may need to provision the topic beforehand. In addition to the list of brokers, you'll need a [`*sarama.Config`][], which exposes many knobs that can affect performance and semantics; review and set them carefully. [`kafkapubsub.MinimalConfig`][] provides a minimal config to get you started. {{< goexample "gocloud.dev/pubsub/kafkapubsub.ExampleOpenTopic" >}} [`*sarama.Config`]: https://godoc.org/github.com/IBM/sarama#Config [`kafkapubsub.OpenTopic`]: https://godoc.org/gocloud.dev/pubsub/kafkapubsub#OpenTopic [`kafkapubsub.MinimalConfig`]: https://godoc.org/gocloud.dev/pubsub/kafkapubsub#MinimalConfig ### In-Memory {#mem} The Go CDK includes an in-memory Pub/Sub provider useful for local testing. The names in `mem://` URLs are a process-wide namespace, so subscriptions to the same name will receive messages posted to that topic. This is detailed more in the [subscription guide][subscribe-mem]. {{< goexample "gocloud.dev/pubsub/mempubsub.Example_openTopicFromURL" >}} [subscribe-mem]: {{< ref "./subscribe.md#mem" >}} #### In-Memory Constructor {#mem-ctor} To create an in-memory Pub/Sub topic, use the [`mempubsub.NewTopic` function][]. You can use the returned topic to create in-memory subscriptions, as detailed in the [subscription guide][subscribe-mem-ctor]. {{< goexample "gocloud.dev/pubsub/mempubsub.ExampleNewTopic" >}} [`mempubsub.NewTopic` function]: https://godoc.org/gocloud.dev/pubsub/mempubsub#NewTopic [subscribe-mem-ctor]: {{< ref "./subscribe.md#mem-ctor" >}} ================================================ FILE: internal/website/content/howto/pubsub/subscribe.md ================================================ --- title: "Subscribe to Messages from a Topic" date: 2019-03-26T09:44:33-07:00 lastmod: 2019-07-29T12:00:00-07:00 weight: 2 toc: true --- Subscribing to receive message from a topic with the Go CDK takes three steps: 1. [Open a subscription][] to a topic with the Pub/Sub service of your choice (once per subscription). 2. [Receive and acknowledge messages][] from the topic. After completing any work related to the message, use the Ack method to prevent it from being redelivered. [Open a subscription]: {{< ref "#opening" >}} [Receive and acknowledge messages]: {{< ref "#receiving" >}} ## Opening a Subscription {#opening} The first step in subscribing to receive messages from a topic is to instantiate a portable [`*pubsub.Subscription`][] for your service. The easiest way to do so is to use [`pubsub.OpenSubscription`][] and a service-specific URL pointing to the topic, making sure you ["blank import"][] the driver package to link it in. ```go import ( "context" "gocloud.dev/pubsub" _ "gocloud.dev/pubsub/" ) ... ctx := context.Background() subs, err := pubsub.OpenSubscription(ctx, "") if err != nil { return fmt.Errorf("could not open topic subscription: %v", err) } defer subs.Shutdown(ctx) // subs is a *pubsub.Subscription; see usage below ... ``` See [Concepts: URLs][] for general background and the [guide below][] for URL usage for each supported service. Alternatively, if you need fine-grained control over the connection settings, you can call the constructor function in the driver package directly (like `gcppubsubv2.OpenSubscription`). ```go import "gocloud.dev/pubsub/" ... subs, err := .OpenSubscription(...) ... ``` You may find the [`wire` package][] useful for managing your initialization code when switching between different backing services. See the [guide below][] for constructor usage for each supported service. [guide below]: {{< ref "#services" >}} [`pubsub.OpenSubscription`]: https://godoc.org/gocloud.dev/pubsub#OpenTopic ["blank import"]: https://golang.org/doc/effective_go.html#blank_import [Concepts: URLs]: {{< ref "/concepts/urls.md" >}} [`wire` package]: http://github.com/google/wire ## Receiving and Acknowledging Messages {#receiving} A simple subscriber that operates on [messages](https://godoc.org/gocloud.dev/pubsub#Message) serially looks like this: {{< goexample src="gocloud.dev/pubsub.ExampleSubscription_Receive" imports="0" >}} If you want your subscriber to operate on incoming messages concurrently, you can start multiple goroutines: {{< goexample src="gocloud.dev/pubsub.ExampleSubscription_Receive_concurrent" imports="0" >}} Note that the [semantics of message delivery][] can vary by backing service. [`*pubsub.Subscription`]: https://godoc.org/gocloud.dev/pubsub#Subscription [semantics of message delivery]: https://godoc.org/gocloud.dev/pubsub#hdr-At_most_once_and_At_least_once_Delivery ## Other Usage Samples * [CLI Sample](https://github.com/google/go-cloud/tree/master/samples/gocdk-pubsub) * [Order Processor sample](https://gocloud.dev/tutorials/order/) * [pubsub package examples](https://godoc.org/gocloud.dev/pubsub#pkg-examples) ## Supported Pub/Sub Services {#services} ### Google Cloud Pub/Sub {#gcp} The Go CDK can receive messages from a Google [Cloud Pub/Sub][] subscription. The URLs use the project ID and the subscription ID. [Cloud Pub/Sub]: https://cloud.google.com/pubsub/docs/ `pubsub.OpenSubscription` will use Application Default Credentials; if you have authenticated via [`gcloud auth application-default login`][], it will use those credentials. See [Application Default Credentials][GCP creds] to learn about authentication alternatives, including using environment variables. [GCP creds]: https://cloud.google.com/docs/authentication/production [`gcloud auth application-default login`]: https://cloud.google.com/sdk/gcloud/reference/auth/application-default/login {{< goexample "gocloud.dev/pubsub/gcppubsubv2.Example_openSubscriptionFromURL" >}} #### Google Cloud Pub/Sub Constructor {#gcp-ctor} The [`gcppubsubv2.OpenSubscription`][] constructor opens a Cloud Pub/Sub subscription. You must first obtain [GCP credentials][GCP creds] and then create a gRPC connection to Cloud Pub/Sub. (This gRPC connection can be reused among subscriptions.) {{< goexample "gocloud.dev/pubsub/gcppubsubv2.ExampleOpenSubscription" >}} [`gcppubsubv2.OpenSubscription`]: https://godoc.org/gocloud.dev/pubsub/gcppubsubv2#OpenSubscription ### Amazon Simple Queueing Service {#sqs} The Go CDK can subscribe to an Amazon [Simple Queueing Service][SQS] (SQS) topic. SQS URLs closely resemble the the queue URL, except the leading `https://` is replaced with `awssqs://`. You should specify the `region` query parameter to ensure your application connects to the correct region. [SQS]: https://aws.amazon.com/sqs/ `pubsub.OpenSubscription` will open a subscription using a default AWS Config. {{< goexample "gocloud.dev/pubsub/awssnssqs.Example_openSubscriptionFromURL" >}} If your messages are being sent to SQS directly, or if they are being delivered via an SNS topic with `RawMessageDelivery` enabled, set a `raw=true` query parameter in your URL, or set `SubscriberOptions.Raw` to `true` if you're using the constructors. By default, the subscription will use heuristics to identify whether the message bodies are raw or [SNS JSON][]. Messages with a `base64encoded` message attribute will be automatically [Base64][] decoded before being returned. See the [SNS publishing guide][] or the [SQS publishing guide][] for more details. [Base64]: https://en.wikipedia.org/wiki/Base64 [SNS publishing guide]: {{< ref "./publish.md#sns" >}} [SQS publishing guide]: {{< ref "./publish.md#sqs" >}} [SNS JSON]: https://aws.amazon.com/sns/faqs/#Raw_message_delivery #### Amazon SQS Constructor {#sqs-ctor} The [`awssnssqs.OpenSubscription`][] constructor opens an SQS queue. You must first create an AWS Config with the same region as your topic: {{< goexample "gocloud.dev/pubsub/awssnssqs.ExampleOpenSubscription" >}} [`awssnssqs.OpenSubscription`]: https://godoc.org/gocloud.dev/pubsub/awssnssqs#OpenSubscription ### Azure Service Bus {#azure} The Go CDK can recieve messages from an [Azure Service Bus][] subscription. The URL for subscribing is the topic name with the subscription name in the `subscription` query parameter. `pubsub.OpenSubscription` will use the environment variable `SERVICEBUS_CONNECTION_STRING` to obtain the Service Bus Connection String you need to copy [from the Azure portal][Azure connection string]. {{< goexample "gocloud.dev/pubsub/azuresb.Example_openSubscriptionFromURL" >}} [AMQP 1.0]: https://www.amqp.org/ [Azure connection string]: https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-dotnet-how-to-use-topics-subscriptions#get-the-connection-string [Azure Service Bus]: https://azure.microsoft.com/en-us/services/service-bus/ #### Azure Service Bus Constructor {#azure-ctor} The [`azuresb.OpenSubscription`][] constructor opens an Azure Service Bus subscription. You must first connect to the topic and subscription using the [Azure Service Bus library][] and then pass the subscription to `azuresb.OpenSubscription`. There are also helper functions in the `azuresb` package to make this easier. {{< goexample "gocloud.dev/pubsub/azuresb.ExampleOpenSubscription" >}} [`azuresb.OpenSubscription`]: https://godoc.org/gocloud.dev/pubsub/azuresb#OpenSubscription [Azure Service Bus library]: https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus ### RabbitMQ {#rabbitmq} The Go CDK can receive messages from an [AMQP 0.9.1][] queue, the dialect of AMQP spoken by [RabbitMQ][]. A RabbitMQ URL only includes the queue name. The RabbitMQ's server is discovered from the `RABBIT_SERVER_URL` environment variable (which is something like `amqp://guest:guest@localhost:5672/`). {{< goexample "gocloud.dev/pubsub/rabbitpubsub.Example_openSubscriptionFromURL" >}} [AMQP 0.9.1]: https://www.rabbitmq.com/protocol.html [RabbitMQ]: https://www.rabbitmq.com #### RabbitMQ Constructor {#rabbitmq-ctor} The [`rabbitpubsub.OpenSubscription`][] constructor opens a RabbitMQ queue. You must first create an [`*amqp.Connection`][] to your RabbitMQ instance. {{< goexample "gocloud.dev/pubsub/rabbitpubsub.ExampleOpenSubscription" >}} [`*amqp.Connection`]: https://pkg.go.dev/github.com/rabbitmq/amqp091-go#Connection [`rabbitpubsub.OpenSubscription`]: https://godoc.org/gocloud.dev/pubsub/rabbitpubsub#OpenSubscription ### NATS {#nats} The Go CDK can publish to a [NATS][] subject. A NATS URL only includes the subject name. The NATS server is discovered from the `NATS_SERVER_URL` environment variable (which is something like `nats://nats.example.com`). {{< goexample "gocloud.dev/pubsub/natspubsub.Example_openSubscriptionFromURL" >}} NATS guarantees at-most-once delivery; it will never redeliver a message. Therefore, `Message.Ack` is a no-op. To parse messages [published via the Go CDK][publish#nats], the NATS driver will first attempt to decode the payload using [gob][]. Failing that, it will return the message payload as the `Data` with no metadata to accomodate subscribing to messages coming from a source not using the Go CDK. [gob]: https://golang.org/pkg/encoding/gob/ [NATS]: https://nats.io/ [publish#nats]: {{< ref "./publish.md#nats" >}} #### NATS Constructor {#nats-ctor} The [`natspubsub.OpenSubscription`][] constructor opens a NATS subject as a topic. You must first create an [`*nats.Conn`][] to your NATS instance. {{< goexample "gocloud.dev/pubsub/natspubsub.ExampleOpenSubscription" >}} [`*nats.Conn`]: https://godoc.org/github.com/nats-io/go-nats#Conn [`natspubsub.OpenSubscription`]: https://godoc.org/gocloud.dev/pubsub/natspubsub#OpenSubscription ### Kafka {#kafka} The Go CDK can receive messages from a [Kafka][] cluster. A Kafka URL includes the consumer group name, plus at least one instance of a query parameter specifying the topic to subscribe to. The brokers in the Kafka cluster are discovered from the `KAFKA_BROKERS` environment variable (which is a comma-delimited list of hosts, something like `1.2.3.4:9092,5.6.7.8:9092`). {{< goexample "gocloud.dev/pubsub/kafkapubsub.Example_openSubscriptionFromURL" >}} [Kafka]: https://kafka.apache.org/ #### Kafka Constructor {#kafka-ctor} The [`kafkapubsub.OpenSubscription`][] constructor creates a consumer in a consumer group, subscribed to one or more topics. In addition to the list of brokers, you'll need a [`*sarama.Config`][], which exposes many knobs that can affect performance and semantics; review and set them carefully. [`kafkapubsub.MinimalConfig`][] provides a minimal config to get you started. {{< goexample "gocloud.dev/pubsub/kafkapubsub.ExampleOpenSubscription" >}} [`*sarama.Config`]: https://godoc.org/github.com/IBM/sarama#Config [`kafkapubsub.OpenSubscription`]: https://godoc.org/gocloud.dev/pubsub/kafkapubsub#OpenSubscription [`kafkapubsub.MinimalConfig`]: https://godoc.org/gocloud.dev/pubsub/kafkapubsub#MinimalConfig ### In-Memory {#mem} The Go CDK includes an in-memory Pub/Sub provider useful for local testing. The names in `mem://` URLs are a process-wide namespace, so subscriptions to the same name will receive messages posted to that topic. For instance, if you open a topic `mem://topicA` and open two subscriptions with `mem://topicA`, you will have two subscriptions to the same topic. {{< goexample "gocloud.dev/pubsub/mempubsub.Example_openSubscriptionFromURL" >}} #### In-Memory Constructor {#mem-ctor} To create a subscription to an in-memory Pub/Sub topic, pass the [topic you created][publish-mem-ctor] into the [`mempubsub.NewSubscription` function][]. You will also need to pass an acknowledgement deadline: once a message is received, if it is not acknowledged after the deadline elapses, then it will be redelivered. {{< goexample "gocloud.dev/pubsub/mempubsub.ExampleNewSubscription" >}} [`mempubsub.NewSubscription` function]: https://godoc.org/gocloud.dev/pubsub/mempubsub#NewSubscription [publish-mem-ctor]: {{< ref "./publish.md#mem-ctor" >}} ================================================ FILE: internal/website/content/howto/runtimevar/_index.md ================================================ --- title: "Runtime Configuration" date: 2019-07-11T12:00:00-07:00 lastmod: 2020-12-23T12:00:00-07:00 showInSidenav: true toc: true --- The [`runtimevar` package][] provides an easy and portable way to watch runtime configuration variables. This guide shows how to work with runtime configuration variables using the Go CDK. Subpackages contain driver implementations of runtimevar for various services, including Cloud and on-prem solutions. You can develop your application locally using [`filevar`][] or [`constantvar`][], then deploy it to multiple Cloud providers with minimal initialization reconfiguration. [`runtimevar` package]: https://godoc.org/gocloud.dev/runtimevar [`filevar`]: https://godoc.org/gocloud.dev/runtimevar/filevar [`constantvar`]: https://godoc.org/gocloud.dev/runtimevar/constantvar ## Opening a Variable {#opening} The first step in watching a variable is to instantiate a portable [`*runtimevar.Variable`][] for your service. The easiest way to do so is to use [`runtimevar.OpenVariable`][] and a service-specific URL pointing to the variable, making sure you ["blank import"][] the driver package to link it in. ```go import ( "gocloud.dev/runtimevar" _ "gocloud.dev/runtimevar/" ) ... v, err := runtimevar.OpenVariable(context.Background(), "") if err != nil { return fmt.Errorf("could not open variable: %v", err) } defer v.Close() // v is a *runtimevar.Variable; see usage below ... ``` See [Concepts: URLs][] for general background and the [guide below][] for URL usage for each supported service. Alternatively, if you need fine-grained control over the connection settings, you can call the constructor function in the driver package directly (like `etcdvar.OpenVariable`). ```go import "gocloud.dev/runtimevar/" ... v, err := .OpenVariable(...) ... ``` You may find the [`wire` package][] useful for managing your initialization code when switching between different backing services. See the [guide below][] for constructor usage for each supported service. When opening the variable, you can provide a [decoder][] parameter (either as a [query parameter][] for URLs, or explicitly to the constructor) to specify whether the raw value stored in the variable is interpreted as a `string`, a `[]byte`, or as JSON. Here's an example of using a JSON encoder: {{< goexample src="gocloud.dev/runtimevar.Example_jsonDecoder" imports="0" >}} [`*runtimevar.Variable`]: https://godoc.org/gocloud.dev/runtimevar#Variable [`runtimevar.OpenVariable`]: https://godoc.org/gocloud.dev/runtimevar#OpenVariable ["blank import"]: https://golang.org/doc/effective_go.html#blank_import [Concepts: URLs]: {{< ref "/concepts/urls.md" >}} [decoder]: https://godoc.org/gocloud.dev/runtimevar#Decoder [guide below]: {{< ref "#services" >}} [query parameter]: https://godoc.org/gocloud.dev/runtimevar#DecoderByName [`wire` package]: http://github.com/google/wire ## Using a Variable {#using} Once you have opened a `runtimevar.Variable` for the provider you want, you can use it portably. ### Latest {#latest} The easiest way to a `Variable` is to use the [`Variable.Latest`][] method. It returns the latest good [`Snapshot`][] of the variable value, blocking if no good value has *ever* been detected. The dynamic type of `Snapshot.Value` depends on the decoder you provided when creating the `Variable`. {{< goexample src="gocloud.dev/runtimevar.ExampleVariable_Latest" imports="0" >}} To avoid blocking, you can pass an already-`Done` context. You can also use [`Variable.CheckHealth`][], which reports as healthy when `Latest` will return a value without blocking. [`Variable.Latest`]: https://godoc.org/gocloud.dev/runtimevar#Variable.Latest [`Variable.CheckHealth`]: https://godoc.org/gocloud.dev/runtimevar#Variable.CheckHealth [`Snapshot`]: https://godoc.org/gocloud.dev/runtimevar#Snapshot ### Watch {#watch} `Variable` also has a [`Watch`][] method for obtaining the value of a variable; it has different semantics than `Latest` and may be useful in some scenarios. We recommend starting with `Latest` as it's conceptually simpler to work with. [`Watch`]: https://godoc.org/gocloud.dev/runtimevar#Variable.Watch ## Other Usage Samples * [CLI Sample](https://github.com/google/go-cloud/tree/master/samples/gocdk-runtimevar) * [Guestbook sample](https://gocloud.dev/tutorials/guestbook/) * [runtimevar package examples](https://godoc.org/gocloud.dev/runtimevar#pkg-examples) ## Supported Services {#services} ### GCP Runtime Configurator {#gcprc} To open a variable stored in [GCP Runtime Configurator][] via a URL, you can use the `runtimevar.OpenVariable` function as shown in the example below. [GCP Runtime Configurator]: https://cloud.google.com/deployment-manager/runtime-configurator/ `runtimevar.OpenVariable` will use Application Default Credentials; if you have authenticated via [`gcloud auth application-default login`][], it will use those credentials. See [Application Default Credentials][GCP creds] to learn about authentication alternatives, including using environment variables. [GCP creds]: https://cloud.google.com/docs/authentication/production [`gcloud auth application-default login`]: https://cloud.google.com/sdk/gcloud/reference/auth/application-default/login {{< goexample "gocloud.dev/runtimevar/gcpruntimeconfig.Example_openVariableFromURL" >}} #### GCP Constructor {#gcprc-ctor} The [`gcpruntimeconfig.OpenVariable`][] constructor opens a Runtime Configurator variable. {{< goexample "gocloud.dev/runtimevar/gcpruntimeconfig.ExampleOpenVariable" >}} [`gcpruntimeconfig.OpenVariable`]: https://godoc.org/gocloud.dev/runtimevar/gcpruntimeconfig#OpenVariable ### GCP Secret Manager {#gcpsm} To open a variable stored in [GCP Secret Manager][] via a URL, you can use the `runtimevar.OpenVariable` function as shown in the example below. [GCP Secret Manager]: https://cloud.google.com/secret-manager `runtimevar.OpenVariable` will use Application Default Credentials; if you have authenticated via [`gcloud auth application-default login`][], it will use those credentials. See [Application Default Credentials][GCP creds] to learn about authentication alternatives, including using environment variables. [GCP creds]: https://cloud.google.com/docs/authentication/production [`gcloud auth application-default login`]: https://cloud.google.com/sdk/gcloud/reference/auth/application-default/login {{< goexample "gocloud.dev/runtimevar/gcpsecretmanager.Example_openVariableFromURL" >}} #### GCP Constructor {#gcpsm-ctor} The [`gcpsecretmanager.OpenVariable`][] constructor opens a Secret Manager variable. {{< goexample "gocloud.dev/runtimevar/gcpsecretmanager.ExampleOpenVariable" >}} [`gcpsecretmanager.OpenVariable`]: https://godoc.org/gocloud.dev/runtimevar/gcpsecretmanager#OpenVariable ### AWS Parameter Store {#awsps} To open a variable stored in [AWS Parameter Store][] via a URL, you can use the `runtimevar.OpenVariable` function as shown in the example below. [AWS Parameter Store]: https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html It will create an AWS Config based on the AWS SDK V2; see [AWS V2 Config][] to learn more. [AWS V2 Config]: https://aws.github.io/aws-sdk-go-v2/docs/configuring-sdk/ {{< goexample "gocloud.dev/runtimevar/awsparamstore.Example_openVariableFromURL" >}} #### AWS Constructor {#awsps-ctor} The [`awsparamstore.OpenVariable`][] constructor opens a Parameter Store variable. {{< goexample "gocloud.dev/runtimevar/awsparamstore.ExampleOpenVariable" >}} [`awsparamstore.OpenVariable`]: https://godoc.org/gocloud.dev/runtimevar/awsparamstore#OpenVariable ### AWS Secrets Manager {#awssm} To open a variable stored in [AWS Secrets Manager][] via a URL, you can use the `runtimevar.OpenVariable` function as shown in the example below. [AWS Secrets Manager]: https://aws.amazon.com/secrets-manager It will create an AWS Config based on the AWS SDK V2; see [AWS V2 Config][] to learn more. [AWS V2 Config]: https://aws.github.io/aws-sdk-go-v2/docs/configuring-sdk/ {{< goexample "gocloud.dev/runtimevar/awssecretsmanager.Example_openVariableFromURL" >}} #### AWS Constructor {#awssm-ctor} The [`awssecretsmanager.OpenVariable`][] constructor opens a Secrets Manager variable. {{< goexample "gocloud.dev/runtimevar/awssecretsmanager.ExampleOpenVariable" >}} [`awssecretsmanager.OpenVariable`]: https://godoc.org/gocloud.dev/runtimevar/awssecretsmanager#OpenVariable Note that both `secretsmanager:GetSecretValue` and `secretsmanager:DescribeSecret` actions must be allowed in the caller's IAM policy. ### etcd {#etcd} *NOTE*: Support for `etcd` has been temporarily dropped due to dependency issues. See https://github.com/google/go-cloud/issues/2914. You can use `runtimevar.etcd` in Go CDK version `v0.20.0` or earlier. ### HTTP {#http} `httpvar` supports watching a variable via an HTTP request. Use `runtimevar.OpenVariable` with a regular URL starting with `http` or `https`. `httpvar` will periodically make an HTTP `GET` request to that URL, with the `decode` URL parameter removed (if present). {{< goexample "gocloud.dev/runtimevar/httpvar.Example_openVariableFromURL" >}} #### HTTP Constructor {#http-ctor} The [`httpvar.OpenVariable`][] constructor opens a variable with a `http.Client` and a URL. {{< goexample "gocloud.dev/runtimevar/httpvar.ExampleOpenVariable" >}} [`httpvar.OpenVariable`]: https://godoc.org/gocloud.dev/runtimevar/httpvar#OpenVariable ### HashiCorp Vault {#hashivault} `hashivault` supports watching a variable stored in [HashiCorp Vault's KV Secrets Engine][]. Use `runtimevar.OpenVariable` with a URL starting with `hashivault://`. The default URL opener will use the environment variables `VAULT_SERVER_URL` (or `VAULT_ADDR`) for the server address, and `VAULT_SERVER_TOKEN` (or `VAULT_TOKEN`) for authentication. [HashiCorp Vault's KV Secrets Engine]: https://www.vaultproject.io/docs/secrets/kv {{< goexample "gocloud.dev/runtimevar/hashivault.Example_openVariableFromURL" >}} #### HashiCorp Vault Constructor {#hashivault-ctor} The [`hashivault.OpenVariable`][] constructor opens a variable with a Vault client. {{< goexample "gocloud.dev/runtimevar/hashivault.ExampleOpenVariable" >}} [`hashivault.OpenVariable`]: https://godoc.org/gocloud.dev/runtimevar/hashivault#OpenVariable ### Blob {#blob} `blobvar` supports watching a variable based on the contents of a [Go CDK blob][]. Set the environment variable `BLOBVAR_BUCKET_URL` to the URL of the bucket, and then use `runtimevar.OpenVariable` as shown below. `blobvar` will periodically re-fetch the contents of the blob. {{< goexample "gocloud.dev/runtimevar/blobvar.Example_openVariableFromURL" >}} [Go CDK blob]: https://gocloud.dev/howto/blob/ You can also use [`blobvar.OpenVariable`][]. [`blobvar.OpenVariable`]: https://godoc.org/gocloud.dev/runtimevar/blobvar#OpenVariable ### Local {#local} You can create an in-memory variable (useful for testing) using `constantvar`: {{< goexample "gocloud.dev/runtimevar/constantvar.Example_openVariableFromURL" >}} Alternatively, you can create a variable based on the contents of a file using `filevar`: {{< goexample "gocloud.dev/runtimevar/filevar.Example_openVariableFromURL" >}} ================================================ FILE: internal/website/content/howto/secrets/_index.md ================================================ --- title: "Secrets" date: 2019-03-21T17:42:18-07:00 lastmod: 2019-07-29T12:00:00-07:00 showInSidenav: true toc: true --- The [`secrets` package][] provides access to key management services in a portable way. This guide shows how to work with secrets in the Go CDK. Cloud applications frequently need to store sensitive information like web API credentials or encryption keys in a medium that is not fully secure. For example, an application that interacts with GitHub needs to store its OAuth2 client secret and use it when obtaining end-user credentials. If this information was compromised, it could allow someone else to impersonate the application. In order to keep such information secret and secure, you can encrypt the data, but then you need to worry about rotating the encryption keys and distributing them securely to all of your application servers. Most Cloud providers include a key management service to perform these tasks, usually with hardware-level security and audit logging. The [`secrets` package][] supports encryption and decryption operations. Subpackages contain driver implementations of secrets for various services, including Cloud and on-prem solutions. You can develop your application locally using [`localsecrets`][], then deploy it to multiple Cloud providers with minimal initialization reconfiguration. [`secrets` package]: https://godoc.org/gocloud.dev/secrets [`localsecrets`]: https://godoc.org/gocloud.dev/secrets/localsecrets ## Opening a SecretsKeeper {#opening} The first step in working with your secrets is to instantiate a portable [`*secrets.Keeper`][] for your service. The easiest way to do so is to use [`secrets.OpenKeeper`][] and a service-specific URL pointing to the keeper, making sure you ["blank import"][] the driver package to link it in. ```go import ( "gocloud.dev/secrets" _ "gocloud.dev/secrets/" ) ... keeper, err := secrets.OpenKeeper(context.Background(), "") if err != nil { return fmt.Errorf("could not open keeper: %v", err) } defer keeper.Close() // keeper is a *secrets.Keeper; see usage below ... ``` See [Concepts: URLs][] for general background and the [guide below][] for URL usage for each supported service. Alternatively, if you need fine-grained control over the connection settings, you can call the constructor function in the driver package directly (like `awskms.OpenKeeper`). ```go import "gocloud.dev/secrets/" ... keeper, err := .OpenKeeper(...) ... ``` You may find the [`wire` package][] useful for managing your initialization code when switching between different backing services. See the [guide below][] for constructor usage for each supported service. [`*secrets.Keeper`]: https://godoc.org/gocloud.dev/secrets#Keeper [`secrets.OpenKeeper`]: https://godoc.org/gocloud.dev/secrets#OpenKeeper ["blank import"]: https://golang.org/doc/effective_go.html#blank_import [Concepts: URLs]: {{< ref "/concepts/urls.md" >}} [guide below]: {{< ref "#services" >}} [`wire` package]: http://github.com/google/wire ## Using a SecretsKeeper {#using} Once you have [opened a secrets keeper][] for the secrets provider you want, you can encrypt and decrypt small messages using the keeper. [opened a secrets keeper]: {{< ref "#opening" >}} ### Encrypting Data {#encrypt} To encrypt data with a keeper, you call `Encrypt` with the byte slice you want to encrypt. {{< goexample src="gocloud.dev/secrets.ExampleKeeper_Encrypt" imports="0" >}} ### Decrypting Data {#decrypt} To decrypt data with a keeper, you call `Decrypt` with the byte slice you want to decrypt. This should be data that you obtained from a previous call to `Encrypt` with a keeper that uses the same secret material (e.g. two AWS KMS keepers created with the same customer master key ID). The `Decrypt` method will return an error if the input data is corrupted. {{< goexample src="gocloud.dev/secrets.ExampleKeeper_Decrypt" imports="0" >}} ### Large Messages {#large-messages} The secrets keeper API is designed to work with small messages (i.e. <10 KiB in length.) Cloud key management services are high latency; using them for encrypting or decrypting large amounts of data is prohibitively slow (and in some providers not permitted). If you need your application to encrypt or decrypt large amounts of data, you should: 1. Generate a key for the encryption algorithm (16KiB chunks with [`secretbox`][] is a reasonable approach). 2. Encrypt the key with secret keeper. 3. Store the encrypted key somewhere accessible to the application. When your application needs to encrypt or decrypt a large message: 1. Decrypt the key from storage using the secret keeper 2. Use the decrypted key to encrypt or decrypt the message inside your application. [`secretbox`]: https://godoc.org/golang.org/x/crypto/nacl/secretbox ### Keep Secrets in Configuration {#runtimevar} Once you have [opened a secrets keeper][] for the secrets provider you want, you can use a secrets keeper to access sensitive configuration stored in an encrypted `runtimevar`. First, you create a [`*runtimevar.Decoder`][] configured to use your secrets keeper using [`runtimevar.DecryptDecode`][]. In this example, we assume the data is a plain string, but the configuration could be a more structured type. {{< goexample src="gocloud.dev/runtimevar.ExampleDecryptDecode" imports="0" >}} Then you can pass the decoder to the runtime configuration provider of your choice. See the [Runtime Configuration How-To Guide][] for more on how to set up runtime configuration. [opened a secrets keeper]: {{< ref "#opening" >}} [Runtime Configuration How-To Guide]: {{< ref "/howto/runtimevar/_index.md" >}} [`*runtimevar.Decoder`]: https://godoc.org/gocloud.dev/runtimevar#Decoder [`runtimevar.DecryptDecode`]: https://godoc.org/gocloud.dev/runtimevar#DecryptDecode ## Other Usage Samples * [CLI Sample](https://github.com/google/go-cloud/tree/master/samples/gocdk-secrets) * [Secrets package examples](https://godoc.org/gocloud.dev/secrets#example-package) ## Supported Services {#services} ### Google Cloud Key Management Service {#gcp} The Go CDK can use keys from Google Cloud Platform's [Key Management Service][GCP KMS] (GCP KMS) to keep information secret. GCP KMS URLs are similar to [key resource IDs][]. [GCP KMS]: https://cloud.google.com/kms/ [key resource IDs]: https://cloud.google.com/kms/docs/object-hierarchy#key `secrets.OpenKeeper` will use Application Default Credentials; if you have authenticated via [`gcloud auth application-default login`][], it will use those credentials. See [Application Default Credentials][GCP creds] to learn about authentication alternatives, including using environment variables. [GCP creds]: https://cloud.google.com/docs/authentication/production [`gcloud auth application-default login`]: https://cloud.google.com/sdk/gcloud/reference/auth/application-default/login {{< goexample "gocloud.dev/secrets/gcpkms.Example_openFromURL" >}} #### GCP Constructor {#gcp-ctor} The [`gcpkms.OpenKeeper`][] constructor opens a GCP KMS key. You must first obtain [GCP credentials][GCP creds] and then create a gRPC connection to GCP KMS. {{< goexample "gocloud.dev/secrets/gcpkms.ExampleOpenKeeper" >}} [`gcpkms.OpenKeeper`]: https://godoc.org/gocloud.dev/secrets/gcpkms#OpenKeeper ### AWS Key Management Service {#aws} The Go CDK can use customer master keys from Amazon Web Service's [Key Management Service][AWS KMS] (AWS KMS) to keep information secret. AWS KMS URLs can use the key's ID, alias, or Amazon Resource Name (ARN) to identify the key. You should specify the `region` query parameter to ensure your application connects to the correct region. [AWS KMS]: https://aws.amazon.com/kms/ It will create an AWS Config based on the AWS SDK V2; see [AWS V2 Config][] to learn more. [AWS V2 Config]: https://aws.github.io/aws-sdk-go-v2/docs/configuring-sdk/ {{< goexample "gocloud.dev/secrets/awskms.Example_openFromURL" >}} #### AWS Constructor {#aws-ctor} The [`awskms.OpenKeeper`][] constructor opens a customer master key. You must first create an AWS Config with the same region as your key and then connect to KMS: {{< goexample "gocloud.dev/secrets/awskms.ExampleOpenKeeper" >}} [`awskms.OpenKeeper`]: https://godoc.org/gocloud.dev/secrets/awskms#OpenKeeper ### Azure KeyVault {#azure} The Go CDK can use keys from [Azure KeyVault][] to keep information secret. `secrets.OpenKeeper` will use [default credentials from the environment][Azure Environment Auth], unless you set the environment variable `AZURE_KEYVAULT_AUTH_VIA_CLI` to `true`, in which case it will use credentials from the `az` command line. Azure KeyVault URLs are based on the [Azure Key object identifer][Azure Key ID]: {{< goexample "gocloud.dev/secrets/azurekeyvault.Example_openFromURL" >}} [Azure KeyVault]: https://azure.microsoft.com/en-us/services/key-vault/ [Azure Environment Auth]: https://docs.microsoft.com/en-us/go/azure/azure-sdk-go-authorization#use-environment-based-authentication [Azure Key ID]: https://docs.microsoft.com/en-us/azure/key-vault/about-keys-secrets-and-certificates #### Azure Constructor {#azure-ctor} The [`azurekeyvault.OpenKeeper`][] constructor opens an Azure KeyVault key. {{< goexample "gocloud.dev/secrets/azurekeyvault.ExampleOpenKeeper" >}} [`azurekeyvault.OpenKeeper`]: https://godoc.org/gocloud.dev/secrets/azurekeyvault#OpenKeeper ### HashiCorp Vault {#vault} The Go CDK can use the [transit secrets engine][] in [Vault][] to keep information secret. Vault URLs only specify the key ID. The Vault server endpoint and authentication token are specified using the environment variables `VAULT_SERVER_URL` and `VAULT_SERVER_TOKEN`, respectively. {{< goexample "gocloud.dev/secrets/hashivault.Example_openFromURL" >}} [Vault]: https://www.vaultproject.io/ [transit secrets engine]: https://www.vaultproject.io/docs/secrets/transit/index.html #### HashiCorp Vault Constructor {#vault-ctor} The [`hashivault.OpenKeeper`][] constructor opens a transit secrets engine key. You must first connect to your Vault instance. {{< goexample "gocloud.dev/secrets/hashivault.ExampleOpenKeeper" >}} [`hashivault.OpenKeeper`]: https://godoc.org/gocloud.dev/secrets/hashivault#OpenKeeper ### Local Secrets {#local} The Go CDK can use local encryption for keeping secrets. Internally, it uses the [NaCl secret box][] algorithm to perform encryption and authentication. {{< goexample "gocloud.dev/secrets/localsecrets.Example_openFromURL" >}} [NaCl secret box]: https://godoc.org/golang.org/x/crypto/nacl/secretbox #### Local Secrets Constructor {#local-ctor} The [`localsecrets.NewKeeper`][] constructor takes in its secret material as a `[]byte`. {{< goexample "gocloud.dev/secrets/localsecrets.ExampleNewKeeper" >}} [`localsecrets.NewKeeper`]: https://godoc.org/gocloud.dev/secrets/localsecrets#NewKeeper ================================================ FILE: internal/website/content/howto/server/_index.md ================================================ --- title: "Server" date: 2019-06-21T10:36:43-07:00 showInSidenav: true toc: true --- The Go CDK's `server` package provides a pre-configured HTTP server with diagnostic hooks for request logging, health checks, and trace exporting via OpenCensus. This guide will show you how to start up and shut down the server, as well as how to work with the request logging and health checks. ## Starting up the server The Go CDK Server constructor takes an `http.Handler` and an `Options` struct. The simplest way to start the server is to use `http.DefaultServeMux` and pass `nil` for the options. {{< goexample src="gocloud.dev/server.ExampleServer" >}} ### Adding a request logger You can use the `server.Options` struct to specify a request logger. The example is shown with the Go CDK [`requestlog`](https://godoc.org/gocloud.dev/server/requestlog) package's `NCSALogger`. To get logs in the Stackdriver JSON format, use `NewStackdriverLogger` in place of `NewNCSALogger`. {{< goexample src="gocloud.dev/server.ExampleServer_withRequestLogger" >}} ### Adding health checks The Go CDK `server` package affords a hook for you to define health checks for your application and see the results at `/healthz/readiness`. The server also runs an endpoint at `/healthz/liveness`, which is a conventional name for a liveness check and is where Kubernetes, if you are using it, will look. Health checks are an important part of application monitoring, and readiness checks are subtly different than liveness checks. The liveness check will return `200 OK` if the server can serve requests. But because each application may have a different definition of what it means to be "healthy" (perhaps your application has a dependency on a back end service), you will need to define a concrete type to implement the `health.Checker` interface and define a `CheckHealth` method specific to your application for readiness checks. ```go // customHealthCheck is an example health check. It implements the // health.Checker interface and reports the server is healthy when the healthy // field is set to true. type customHealthCheck struct { mu sync.RWMutex healthy bool } // customHealthCheck implements the health.Checker interface because it has a // CheckHealth method. func (h *customHealthCheck) CheckHealth() error { h.mu.RLock() defer h.mu.RUnlock() if !h.healthy { return errors.New("not ready yet!") } return nil } ``` {{< goexample src="gocloud.dev/server.ExampleServer_withHealthChecks" >}} ## Other Usage Samples * [Minimal server sample](https://github.com/google/go-cloud/tree/master/samples/server) * [Guestbook sample](https://gocloud.dev/tutorials/guestbook/) ================================================ FILE: internal/website/content/howto/sql/_index.md ================================================ --- title: "MySQL/PostgreSQL" date: 2019-06-21T09:26:56-07:00 showInSidenav: true toc: true --- Connecting to Cloud providers' hosted database services requires additional steps to ensure the security of the connection. For example, each of GCP, AWS and Azure require the use of custom certificate authorities to be configured in the client. GCP requires a custom proxy with authentication credentials. The Go CDK makes opening these connections easier while still using the standard [`*sql.DB`][] type. [`*sql.DB`]: https://godoc.org/database/sql#DB ## Local or On-Premise {#local} The Go CDK uses the same [URL opener pattern][] as seen in other Go CDK APIs. It differs from the standard library's `sql.Open` in that it automatically instruments the connection with [OpenCensus metrics][]. The portable function for MySQL is [`mysql.Open`][]: {{< goexample "gocloud.dev/mysql.ExampleOpen" >}} And the portable function for PostgreSQL is [`postgres.Open`][]: {{< goexample "gocloud.dev/postgres.ExampleOpen" >}} [`mysql.Open`]: https://godoc.org/gocloud.dev/mysql#Open [OpenCensus metrics]: https://opencensus.io/integrations/sql/go_sql/ [`postgres.Open`]: https://godoc.org/gocloud.dev/postgres#Open [URL opener pattern]: {{< ref "/concepts/urls.md" >}} ## GCP {#gcp} Users of [GCP Cloud SQL for MySQL][] should import the `gocloud.dev/mysql/gcpmysql` package: {{< goexample "gocloud.dev/mysql/gcpmysql.Example" >}} Users of [GCP Cloud SQL for PostgreSQL][] should import the `gocloud.dev/postgres/gcppostgres` package: {{< goexample "gocloud.dev/postgres/gcppostgres.Example" >}} [GCP Cloud SQL for MySQL]: https://cloud.google.com/sql/docs/mysql/ [GCP Cloud SQL for PostgreSQL]: https://cloud.google.com/sql/docs/postgres/ ## AWS {#aws} Users of [AWS RDS for MySQL][] should import the `gocloud.dev/mysql/awsmysql` package: {{< goexample "gocloud.dev/mysql/awsmysql.Example" >}} Users of [AWS RDS for PostgreSQL][] should import the `gocloud.dev/postgres/awspostgres` package: {{< goexample "gocloud.dev/postgres/awspostgres.Example" >}} [AWS RDS for MySQL]: https://aws.amazon.com/rds/mysql/ [AWS RDS for PostgreSQL]: https://aws.amazon.com/rds/postgresql/ ## Azure {#azure} Users of [Azure Database for MySQL][] should import the `gocloud.dev/mysql/azuremysql` package: {{< goexample "gocloud.dev/mysql/azuremysql.Example" >}} [Azure Database for MySQL]: https://azure.microsoft.com/en-us/services/mysql/ ## Other Usage Samples * [Guestbook sample](https://gocloud.dev/tutorials/guestbook/) ================================================ FILE: internal/website/content/internal/batcher/_index.md ================================================ --- title: gocloud.dev/internal/batcher type: pkg --- ================================================ FILE: internal/website/content/internal/escape/_index.md ================================================ --- title: gocloud.dev/internal/escape type: pkg --- ================================================ FILE: internal/website/content/internal/gcerr/_index.md ================================================ --- title: gocloud.dev/internal/gcerr type: pkg --- ================================================ FILE: internal/website/content/internal/oc/_index.md ================================================ --- title: gocloud.dev/internal/oc type: pkg --- ================================================ FILE: internal/website/content/internal/openurl/_index.md ================================================ --- title: gocloud.dev/internal/openurl type: pkg --- ================================================ FILE: internal/website/content/internal/otel/_index.md ================================================ --- title: gocloud.dev/internal/otel type: pkg --- Package otel provides OpenTelemetry integration for Go Cloud Development Kit, supporting tracing, metrics, and logging. It serves as the primary instrumentation framework, replacing the deprecated OpenCensus implementation. ================================================ FILE: internal/website/content/internal/releasehelper/_index.md ================================================ --- title: gocloud.dev/internal/releasehelper type: pkg --- ================================================ FILE: internal/website/content/internal/retry/_index.md ================================================ --- title: gocloud.dev/internal/retry type: pkg --- ================================================ FILE: internal/website/content/internal/testing/_index.md ================================================ --- title: gocloud.dev/internal/testing type: pkg --- ================================================ FILE: internal/website/content/internal/testing/cmdtest/_index.md ================================================ --- title: gocloud.dev/internal/testing/cmdtest type: pkg --- ================================================ FILE: internal/website/content/internal/testing/octest/_index.md ================================================ --- title: gocloud.dev/internal/testing/octest type: pkg --- ================================================ FILE: internal/website/content/internal/testing/oteltest/_index.md ================================================ --- title: gocloud.dev/internal/testing/oteltest type: pkg --- ================================================ FILE: internal/website/content/internal/testing/setup/_index.md ================================================ --- title: gocloud.dev/internal/testing/setup type: pkg --- ================================================ FILE: internal/website/content/internal/testing/terraform/_index.md ================================================ --- title: gocloud.dev/internal/testing/terraform type: pkg --- ================================================ FILE: internal/website/content/internal/testing/test-summary/_index.md ================================================ --- title: gocloud.dev/internal/testing/test-summary type: pkg --- ================================================ FILE: internal/website/content/internal/trace/_index.md ================================================ --- title: gocloud.dev/internal/trace type: pkg --- ================================================ FILE: internal/website/content/internal/useragent/_index.md ================================================ --- title: gocloud.dev/internal/useragent type: pkg --- ================================================ FILE: internal/website/content/internal/website/gatherexamples/_index.md ================================================ --- title: gocloud.dev/internal/website/gatherexamples type: pkg --- ================================================ FILE: internal/website/content/mysql/_index.md ================================================ --- title: gocloud.dev/mysql type: pkg --- ================================================ FILE: internal/website/content/mysql/awsmysql/_index.md ================================================ --- title: gocloud.dev/mysql/awsmysql type: pkg --- ================================================ FILE: internal/website/content/mysql/azuremysql/_index.md ================================================ --- title: gocloud.dev/mysql/azuremysql type: pkg --- ================================================ FILE: internal/website/content/mysql/cloudmysql/_index.md ================================================ --- title: gocloud.dev/mysql/cloudmysql type: pkg --- ================================================ FILE: internal/website/content/mysql/gcpmysql/_index.md ================================================ --- title: gocloud.dev/mysql/gcpmysql type: pkg --- ================================================ FILE: internal/website/content/mysql/rdsmysql/_index.md ================================================ --- title: gocloud.dev/mysql/rdsmysql type: pkg --- ================================================ FILE: internal/website/content/postgres/_index.md ================================================ --- title: gocloud.dev/postgres type: pkg --- ================================================ FILE: internal/website/content/postgres/awspostgres/_index.md ================================================ --- title: gocloud.dev/postgres/awspostgres type: pkg --- ================================================ FILE: internal/website/content/postgres/cloudpostgres/_index.md ================================================ --- title: gocloud.dev/postgres/cloudpostgres type: pkg --- ================================================ FILE: internal/website/content/postgres/gcppostgres/_index.md ================================================ --- title: gocloud.dev/postgres/gcppostgres type: pkg --- ================================================ FILE: internal/website/content/postgres/rdspostgres/_index.md ================================================ --- title: gocloud.dev/postgres/rdspostgres type: pkg --- ================================================ FILE: internal/website/content/pubsub/_index.md ================================================ --- title: gocloud.dev/pubsub type: pkg --- ================================================ FILE: internal/website/content/pubsub/awssnssqs/_index.md ================================================ --- title: gocloud.dev/pubsub/awssnssqs type: pkg --- ================================================ FILE: internal/website/content/pubsub/azurepubsub/_index.md ================================================ --- title: gocloud.dev/pubsub/azurepubsub type: pkg --- ================================================ FILE: internal/website/content/pubsub/azuresb/_index.md ================================================ --- title: gocloud.dev/pubsub/azuresb type: pkg --- ================================================ FILE: internal/website/content/pubsub/batcher/_index.md ================================================ --- title: gocloud.dev/internal/batcher type: pkg --- ================================================ FILE: internal/website/content/pubsub/driver/_index.md ================================================ --- title: gocloud.dev/pubsub/driver type: pkg --- ================================================ FILE: internal/website/content/pubsub/drivertest/_index.md ================================================ --- title: gocloud.dev/pubsub/drivertest type: pkg --- ================================================ FILE: internal/website/content/pubsub/gcppubsub/_index.md ================================================ --- title: gocloud.dev/pubsub/gcppubsub type: pkg --- ================================================ FILE: internal/website/content/pubsub/gcppubsubv2/_index.md ================================================ --- title: gocloud.dev/pubsub/gcppubsubv2 type: pkg --- ================================================ FILE: internal/website/content/pubsub/kafkapubsub/_index.md ================================================ --- title: gocloud.dev/pubsub/kafkapubsub type: pkg --- ================================================ FILE: internal/website/content/pubsub/mempubsub/_index.md ================================================ --- title: gocloud.dev/pubsub/mempubsub type: pkg --- ================================================ FILE: internal/website/content/pubsub/natspubsub/_index.md ================================================ --- title: gocloud.dev/pubsub/natspubsub type: pkg --- ================================================ FILE: internal/website/content/pubsub/rabbitpubsub/_index.md ================================================ --- title: gocloud.dev/pubsub/rabbitpubsub type: pkg --- ================================================ FILE: internal/website/content/requestlog/_index.md ================================================ --- title: gocloud.dev/requestlog type: pkg --- ================================================ FILE: internal/website/content/runtimevar/_index.md ================================================ --- title: gocloud.dev/runtimevar type: pkg --- ================================================ FILE: internal/website/content/runtimevar/awsparamstore/_index.md ================================================ --- title: gocloud.dev/runtimevar/awsparamstore type: pkg --- ================================================ FILE: internal/website/content/runtimevar/awssecretsmanager/_index.md ================================================ --- title: gocloud.dev/runtimevar/awssecretsmanager type: pkg --- ================================================ FILE: internal/website/content/runtimevar/blobvar/_index.md ================================================ --- title: gocloud.dev/runtimevar/blobvar type: pkg --- ================================================ FILE: internal/website/content/runtimevar/constantvar/_index.md ================================================ --- title: gocloud.dev/runtimevar/constantvar type: pkg --- ================================================ FILE: internal/website/content/runtimevar/driver/_index.md ================================================ --- title: gocloud.dev/runtimevar/driver type: pkg --- ================================================ FILE: internal/website/content/runtimevar/drivertest/_index.md ================================================ --- title: gocloud.dev/runtimevar/drivertest type: pkg --- ================================================ FILE: internal/website/content/runtimevar/etcdvar/_index.md ================================================ --- title: gocloud.dev/runtimevar/etcdvar type: pkg --- ================================================ FILE: internal/website/content/runtimevar/filevar/_demo/_index.md ================================================ --- title: gocloud.dev/runtimevar/filevar/_demo type: pkg --- ================================================ FILE: internal/website/content/runtimevar/filevar/_index.md ================================================ --- title: gocloud.dev/runtimevar/filevar type: pkg --- ================================================ FILE: internal/website/content/runtimevar/gcpruntimeconfig/_index.md ================================================ --- title: gocloud.dev/runtimevar/gcpruntimeconfig type: pkg --- ================================================ FILE: internal/website/content/runtimevar/gcpsecretmanager/_index.md ================================================ --- title: gocloud.dev/runtimevar/gcpsecretmanager type: pkg --- ================================================ FILE: internal/website/content/runtimevar/hashivault/_index.md ================================================ --- title: gocloud.dev/runtimevar/hashivault type: pkg --- ================================================ FILE: internal/website/content/runtimevar/httpvar/_index.md ================================================ --- title: gocloud.dev/runtimevar/httpvar type: pkg --- ================================================ FILE: internal/website/content/samples/appengine/_index.md ================================================ --- title: gocloud.dev/samples/appengine type: pkg --- ================================================ FILE: internal/website/content/samples/gocdk-blob/_index.md ================================================ --- title: gocloud.dev/samples/gocdk-blob type: pkg --- ================================================ FILE: internal/website/content/samples/gocdk-docstore/_index.md ================================================ --- title: "Gocdk Docstore" date: 2019-06-11T14:33:50-07:00 showInSidenav: false # only for sections (any level) pagesInSidenav: false # only for top-level sections weight: 0 --- ================================================ FILE: internal/website/content/samples/gocdk-pubsub/_index.md ================================================ --- title: gocloud.dev/samples/gocdk-pubsub type: pkg --- ================================================ FILE: internal/website/content/samples/gocdk-runtimevar/_index.md ================================================ --- title: gocloud.dev/samples/gocdk-runtimevar type: pkg --- ================================================ FILE: internal/website/content/samples/gocdk-secrets/_index.md ================================================ --- title: gocloud.dev/samples/gocdk-secrets type: pkg --- ================================================ FILE: internal/website/content/samples/guestbook/_index.md ================================================ --- title: gocloud.dev/samples/guestbook type: pkg --- ================================================ FILE: internal/website/content/samples/guestbook/aws/provision_db/_index.md ================================================ --- title: gocloud.dev/samples/guestbook/aws/provision_db type: pkg --- ================================================ FILE: internal/website/content/samples/guestbook/gcp/deploy/_index.md ================================================ --- title: gocloud.dev/samples/guestbook/gcp/deploy type: pkg --- ================================================ FILE: internal/website/content/samples/guestbook/gcp/provision_db/_index.md ================================================ --- title: gocloud.dev/samples/guestbook/gcp/provision_db type: pkg --- ================================================ FILE: internal/website/content/samples/guestbook/localdb/_index.md ================================================ --- title: gocloud.dev/samples/guestbook/localdb type: pkg --- ================================================ FILE: internal/website/content/samples/order/_index.md ================================================ --- title: gocloud.dev/samples/order type: pkg --- ================================================ FILE: internal/website/content/samples/server/_index.md ================================================ --- title: gocloud.dev/samples/server type: pkg --- ================================================ FILE: internal/website/content/samples/tutorial/_index.md ================================================ --- title: gocloud.dev/samples/tutorial type: pkg --- ================================================ FILE: internal/website/content/secrets/_index.md ================================================ --- title: gocloud.dev/secrets type: pkg --- ================================================ FILE: internal/website/content/secrets/awskms/_index.md ================================================ --- title: gocloud.dev/secrets/awskms type: pkg --- ================================================ FILE: internal/website/content/secrets/azurekeyvault/_index.md ================================================ --- title: gocloud.dev/secrets/azurekeyvault type: pkg --- ================================================ FILE: internal/website/content/secrets/driver/_index.md ================================================ --- title: gocloud.dev/secrets/driver type: pkg --- ================================================ FILE: internal/website/content/secrets/drivertest/_index.md ================================================ --- title: gocloud.dev/secrets/drivertest type: pkg --- ================================================ FILE: internal/website/content/secrets/gcpkms/_index.md ================================================ --- title: gocloud.dev/secrets/gcpkms type: pkg --- ================================================ FILE: internal/website/content/secrets/hashivault/_index.md ================================================ --- title: gocloud.dev/secrets/hashivault type: pkg --- ================================================ FILE: internal/website/content/secrets/localsecrets/_index.md ================================================ --- title: gocloud.dev/secrets/localsecrets type: pkg --- ================================================ FILE: internal/website/content/secrets/vault/_index.md ================================================ --- title: gocloud.dev/secrets/vault type: pkg --- ================================================ FILE: internal/website/content/server/_index.md ================================================ --- title: gocloud.dev/server type: pkg --- ================================================ FILE: internal/website/content/server/driver/_index.md ================================================ --- title: gocloud.dev/server/driver type: pkg --- ================================================ FILE: internal/website/content/server/health/_index.md ================================================ --- title: gocloud.dev/server/health type: pkg --- ================================================ FILE: internal/website/content/server/health/sqlhealth/_index.md ================================================ --- title: gocloud.dev/server/health/sqlhealth type: pkg --- ================================================ FILE: internal/website/content/server/requestlog/_index.md ================================================ --- title: gocloud.dev/server/requestlog type: pkg --- ================================================ FILE: internal/website/content/server/sdserver/_index.md ================================================ --- title: gocloud.dev/server/sdserver type: pkg --- ================================================ FILE: internal/website/content/server/xrayserver/_index.md ================================================ --- title: gocloud.dev/server/xrayserver type: pkg --- ================================================ FILE: internal/website/content/tests/aws/app/_index.md ================================================ --- title: gocloud.dev/tests/aws/app type: pkg --- ================================================ FILE: internal/website/content/tests/gcp/app/_index.md ================================================ --- title: gocloud.dev/tests/gcp/app type: pkg --- ================================================ FILE: internal/website/content/tests/internal/testutil/_index.md ================================================ --- title: gocloud.dev/tests/internal/testutil type: pkg --- ================================================ FILE: internal/website/content/tutorials/_index.md ================================================ --- title: "Tutorials" date: 2019-03-19T18:45:15-07:00 showInSidenav: true pagesInSidenav: true weight: 1 --- ================================================ FILE: internal/website/content/tutorials/cli-uploader.md ================================================ --- title: "Tutorial: Command-Line Uploader" linkTitle: "Command-Line Uploader" date: 2019-03-19T18:45:53-07:00 weight: 1 --- This quickstart will build a command line application called `upload` that uploads files to blob storage on GCP, AWS, and Azure. Blob storage stores binary data under a string key, and is one of the most frequently used cloud services. When we're done, our command line application will work like this: ```shell # uploads gopher.png to GCS $ ./upload gs://go-cloud-bucket gopher.png # uploads gopher.png to S3 $ ./upload s3://go-cloud-bucket gopher.png # uploads gopher.png to Azure $ ./upload azblob://go-cloud-bucket gopher.png ``` (You can download the finished tutorial [from GitHub][samples/tutorial]). [samples/tutorial]: https://github.com/google/go-cloud/tree/master/samples/tutorial/ ## Setup We start with a skeleton for our program to read from command-line arguments to configure the bucket URL. ```go // Command upload saves files to blob storage on GCP, AWS, and Azure. package main import ( "log" "os" ) func main() { // Define our input. if len(os.Args) != 3 { log.Fatal("usage: upload BUCKET_URL FILE") } bucketURL := os.Args[1] file := os.Args[2] _, _ = bucketURL, file } ``` Now that we have a basic skeleton in place, let's start filling in the pieces. ## Connecting to the bucket The easiest way to open a portable bucket API is with `blob.OpenBucket`. ```go package main import ( // previous imports omitted "gocloud.dev/blob" ) func main() { // previous code omitted // Open a connection to the bucket. b, err := blob.OpenBucket(context.Background(), bucketURL) if err != nil { log.Fatalf("Failed to setup bucket: %s", err) } defer b.Close() } ``` This is all we need in the `main` function to connect to the bucket. However, as written, this function call will always fail: the Go CDK does not link in any cloud-specific implementations of `blob.OpenBucket` unless you specifically depend on them. This ensures you're only depending on the code you need. To link in implementations, use blank imports: ```go package main import ( // previous imports omitted // Import the blob packages we want to be able to open. _ "gocloud.dev/blob/azureblob" _ "gocloud.dev/blob/gcsblob" _ "gocloud.dev/blob/s3blob" ) func main() { // ... } ``` With the setup done, we're ready to use the bucket connection. Note, as a design principle of the Go CDK, `blob.Bucket` does not support creating a bucket and instead focuses solely on interacting with it. This separates the concerns of provisioning infrastructure and using infrastructure. ## Reading the file We need to read our file into a slice of bytes before uploading it. The process is the usual one: ```go package main import ( // previous imports omitted "os" "io/ioutil" ) func main() { // ... previous code omitted // Prepare the file for upload. data, err := os.ReadFile(file) if err != nil { log.Fatalf("Failed to read file: %s", err) } } ``` ## Writing the file to the bucket Now, we have `data`, our file in a slice of bytes. Let's get to the fun part and write those bytes to the bucket! ```go package main // No new imports. func main() { // ... w, err := b.NewWriter(ctx, file, nil) if err != nil { log.Fatalf("Failed to obtain writer: %s", err) } _, err = w.Write(data) if err != nil { log.Fatalf("Failed to write to bucket: %s", err) } if err := w.Close(); err != nil { log.Fatalf("Failed to close: %s", err) } } ``` First, we create a writer based on the bucket connection. In addition to a `context.Context` type, the method takes the key under which the data will be stored and the mime type of the data. The call to `NewWriter` creates a `blob.Writer`, which implements `io.Writer`. With the writer, we call `Write` passing in the data. In response, we get the number of bytes written and any error that might have occurred. Finally, we close the writer with `Close` and check the error. Alternatively, we could have used the shortcut `b.WriteAll(ctx, file, data, nil)`. ## Uploading an image That's it! Let's try it out. As setup, we will need to create a [GCS bucket][gcs-bucket], an [S3 bucket][s3-bucket], and an [Azure container][azure-container]. In the code above, I called that bucket `go-cloud-bucket`, but you can change that to match whatever your bucket is called. Of course, you are free to try the code on any subset of Cloud providers. * For GCP, you will need to login with [gcloud](https://cloud.google.com/sdk/install). If you do not want to install `gcloud`, see [here](https://cloud.google.com/docs/authentication/production) for alternatives. * For AWS, you will need an access key ID and a secret access key. See [here](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_CreateAccessKey) for details. You then need to set the `AWS_REGION` environment variable to the region your bucket is in. * For Azure, you will need to add your storage account name and key as environment variables (`AZURE_STORAGE_ACCOUNT` and `AZURE_STORAGE_KEY`, respectively). See [here](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-portal) for details. With our buckets created and our credentials set up, we'll build the program first: ```shell $ go build -o upload ``` Then, we will send `gopher.png` (in the same directory as this README) to GCS: ```shell $ ./upload gs://go-cloud-bucket gopher.png ``` Then, we send that same gopher to S3: ```shell $ ./upload s3://go-cloud-bucket?region=us-west-1 gopher.png ``` Finally, we send that same gopher to Azure: ```shell $ ./upload azblob://go-cloud-bucket gopher.png ``` If we check the buckets, we should see our gopher in each of them! We're done! [s3-bucket]: https://docs.aws.amazon.com/AmazonS3/latest/gsg/CreatingABucket.html [gcs-bucket]: https://cloud.google.com/storage/docs/creating-buckets [azure-container]: https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction ## Wrapping Up In conclusion, we have a program that can seamlessly switch between multiple Cloud storage providers using just one code path. You can see the finished tutorial [on GitHub][samples/tutorial]. We hope this example demonstrates how having one type for multiple clouds is a huge win for simplicity and maintainability. By writing an application using a generic interface like `*blob.Bucket`, we retain the option of using infrastructure in whichever cloud that best fits our needs all without having to worry about a rewrite. If you want to learn more, you can read about [Structuring Portable Code][]. If you want to see how to deploy a Go CDK application, see [other tutorials][]. If you want to see how to use Go CDK APIs in your application, see the [how-to guides][]. [how-to guides]: {{< ref "/howto/_index.md" >}} [other tutorials]: {{< ref "/tutorials/_index.md" >}} [Structuring Portable Code]: {{< ref "/concepts/structure/index.md" >}} ================================================ FILE: internal/website/content/tutorials/guestbook.md ================================================ --- title: "Tutorial: Guestbook Application" linkTitle: "Guestbook" date: 2019-07-10T16:58:00-07:00 weight: 2 toc: true --- In this tutorial, we will deploy an existing Go CDK application called Guestbook locally, then on Google Cloud Platform (GCP), Amazon Web Services (AWS), and Azure. Guestbook is a sample application that records visitors' messages and displays a cloud banner with an administrative message. The main business logic is written in a cloud-agnostic manner using MySQL, the generic blob API, and the generic runtimevar API. All platform-specific code is set up by [Wire](https://github.com/google/wire). ## Prerequisites You will need to install the following software for this tutorial: - [Git](https://git-scm.com/) - [Go](https://golang.org/doc/install) - [Wire](https://github.com/google/wire/blob/master/README.md#installing) - [Docker Desktop](https://docs.docker.com/install/) - [Terraform](https://www.terraform.io/intro/getting-started/install.html) ### Cloning the Sample Before you can do anything else, you need to clone the Go CDK repository. The repository contains the Guestbook sample. ```shell git clone https://github.com/google/go-cloud.git cd go-cloud/samples/guestbook ``` ## Building Run the following in the `samples/guestbook` directory: ```shell go generate && go build ``` ## Running Locally You will need to run a local MySQL database server and create a local message of the day. `localdb/main.go` runs the local MySQL database server using Docker: ```shell go get ./localdb/... # Get package dependencies. go run localdb/main.go ``` In another terminal, run the `guestbook` application: ```shell # Set a local Message of the Day. echo 'Hello, World!' > motd.txt # Run the server. # For blob, it uses fileblob, pointing at the local directory ./blobs. # For runtimevar, it uses filevar, pointing at the local file ./motd.txt. # You can update the ./motd.txt while the server is running, refresh # the page, and see it change. ./guestbook -env=local -bucket=blobs -motd_var=motd.txt ``` Your server is now running on http://localhost:8080/. You can stop the MySQL database server with Ctrl-\\. MySQL ignores Ctrl-C (SIGINT). ## Running on Google Cloud Platform (GCP) If you want to run this sample on GCP, you need to create a project, download the [gcloud CLI][], install `kubectl` and log in. [gcloud CLI]: https://cloud.google.com/sdk/downloads ```shell # Install kubectl. gcloud components install kubectl # Opens a browser to log you into GCP. gcloud auth login ``` ### Provision resources You can now use Terraform to set up your project. ```shell gcloud auth application-default login cd gcp terraform init # Terraform will prompt you for your GCP project ID, desired region, # and desired zone. terraform apply ``` ### Deploy the application This sample provides a script for building the Guestbook binary and deploying it to the Kubernetes cluster created by Terraform. ```shell go run deploy/main.go ``` The deploy script will display the URL of your running service. ### Cleanup To clean up the created resources, run `terraform destroy` inside the `gcp` directory using the same variables you entered during `terraform apply`. ## Running on Amazon Web Services (AWS) If you want to run this sample on AWS, you need to set up an account, download the [AWS command line interface][], and log in. There's [help here][AWS Config Help] if you need it. ```shell aws configure ``` [AWS command line interface]: https://docs.aws.amazon.com/cli/latest/userguide/installing.html [AWS Config Help]: https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html ### Agree to the Debian Terms and Conditions You have to agree to the [Debian Terms and Conditions][] in order to provision the resources. Click through the "Continue to Subscribe" button at the top, then log in to your AWS account and subscribe to Debian. [Debian Terms and Conditions]: https://aws.amazon.com/marketplace/pp?sku=55q52qvgjfpdj2fpfy9mb1lo4 ### SSH Key You will also need an SSH key to SSH into the EC2 instance. If you don't already have one, you can follow [this guide from GitHub][GitHub SSH]. Follow the instructions for "Adding your key to the ssh-agent" if you want the key to persist across terminal sessions. ```shell ssh-add ``` [GitHub SSH]: https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/ ### Provision resources You can now use Terraform to set up your project. This will create an EC2 instance you can SSH to and run your binary. ```shell # Build for deploying on the AWS Linux VM. GOOS=linux GOARCH=amd64 go build # Enter AWS directory from samples/guestbook. cd aws terraform init # Provisioning can take up to 10 minutes. # Keep track of the output of this command as it is needed later. # You can replace us-west-1 with whatever region you want. terraform apply -var region=us-west-1 -var ssh_public_key="$(cat ~/.ssh/id_rsa.pub)" ``` ### Deploy the application You now need to connect to the new remote server to execute the `guestbook` binary. The final output of `terraform apply` lists the variables `guestbook` requires as arguments. Here's an example, with actual strings replaced with `[redacted]`: ```shell # Output from "terraform apply" command.... Outputs: bucket = [redacted] database_host = [redacted] database_root_password = instance_host = [redacted] paramstore_var = /guestbook/motd region = us-west-1 # Print out the database root password, since we'll need it below # Terraform hides it by default in the Outputs above. localhost$ terraform output database_root_password [redacted] # SSH into the EC2 instance. localhost$ ssh "admin@$( terraform output instance_host )" # Fill in each command-line argument with the values from the # Terraform output above. server$ AWS_REGION= ./guestbook \ -env=aws \ -bucket= \ -db_host= \ -db_user=root \ -db_password= \ -motd_var=/guestbook/motd ``` You can now visit the server at `http://:8080/`. ### Cleanup To clean up the created resources, run `terraform destroy` inside the `aws` directory using the same variables you entered during `terraform apply`. ## Running on Azure The Go CDK doesn't have support for SQL on Azure yet ([#1305][]), so we'll run MySQL and the binary locally. This tutorial will show how to use Azure storage for the MOTD and Gopher logo. You first need to set up an Azure account and install the [Azure CLI][]. Then, use the `az` CLI to log in. [#1305]: https://github.com/google/go-cloud/issues/1305 [Azure CLI]: https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest ```shell az login ``` ### Provision resources We'll use Terraform to set up your project. ```shell # Enter the Azure directory from samples/guestbook. cd azure terraform init # Provisioning can take up to 10 minutes. # Keep track of the output of this command as it is needed later. terraform apply -var location="West US" Outputs: access_key = [redacted] storage_account = [redacated] storage_container = [redacted] ``` ### Deploy the application You will need to run a local MySQL database server, similar to what we did for running locally earlier. Open a new terminal window, and run: ```shell cd .. # back up to samples/guestbook go get ./localdb/... # Get package dependencies. go run localdb/main.go ``` In the original terminal, add your Azure credentials to the environment and run the `guestbook` application: ```shell # You should be in the "samples/guestbook/azure" directory. # Enter the storage_account from the Terraform output earlier. export AZURE_STORAGE_ACCOUNT= # Enter the access_key from the Terraform output earlier. export AZURE_STORAGE_KEY= # Run the binary. # Fill in the -bucket command-line argument with the value from the Terraform # output. # ./guestbook -env=azure -bucket= -motd_var=motd ``` Your server is now running on http://localhost:8080/. You can stop the MySQL database server with Ctrl-\\. MySQL ignores Ctrl-C (SIGINT). ### Cleanup To clean up the created resources, run `terraform destroy` inside the `azure` directory using the same variables you entered during `terraform apply`. ## Gophers The Go gopher was designed by Renee French and used under the [Creative Commons 3.0 Attributions](https://creativecommons.org/licenses/by/3.0/) license. ================================================ FILE: internal/website/content/tutorials/order.md ================================================ --- title: "Order Processor" date: 2019-07-09T10:22:39-04:00 weight: 5 toc: true --- In this tutorial, we will run a Go CDK application called Order Processor on a local machine. Order Processor is a sample application that lets users place orders to convert images to PNG format, and to view the results. The main business logic is written in a cloud-agnostic manner using the generic APIs for blob, pubsub and docstore. The Order Processor application has two parts: a web frontend, and an image-processing backend called a processor. They communicate over a pubsub topic, store order information in a docstore collection, and store image files in a blob bucket. ## Prerequisites You will need to install the following software for this tutorial: - [Git](https://git-scm.com/) - [Go](https://golang.org/doc/install) Then you need to clone the Go CDK repository. The repository contains the Order Processor sample. ```shell git clone https://github.com/google/go-cloud.git cd go-cloud/samples/order ``` ## Building Run the following in the `samples/order` directory: ```shell go build ``` ## Running Locally If you run `order` with no arguments, both the frontend and the processor will run together in the same process. ```shell ./order ``` The frontend is now running on http://localhost:10538. Visit the home page in your browser and click "Convert an Image". Enter an email address (it need not be real) and select any image file from your computer. Then click Submit. Now visit the order list page by returning to the home page and clicking "List Conversions". It may take a few seconds to process the order (thanks to an artificial delay in the processor), so refresh the page until you see your order in the list. Then click on the output image link to see the converted image in your browser. ## Running on a Cloud Provider To run the Order Processor application on a cloud provider like Google Cloud Platform, Amazon AWS or Microsoft Azure, you will have to provision some resources: - A storage bucket, to hold the image files. (See the [`blob` How-To Guide](https://gocloud.dev/howto/blob/).) - A Pub/Sub topic and subscription, for requests from the frontend to the processor. (See the [`pubsub` How-To Guide](https://gocloud.dev/howto/pubsub/).) - A document store collection to store order metadata. (See the [`docstore` How-To Guide](https://gocloud.dev/howto/docstore/).) Then launch the `order` program with flags that provide the URLs to your resources. Run `order -help` to see the list of flags. ================================================ FILE: internal/website/data/examples.json ================================================ { "gocloud.dev/blob.ExampleBucket_Delete": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/blob\"\n)", "code": "if err := bucket.Delete(ctx, \"foo.txt\"); err != nil {\n\treturn err\n}" }, "gocloud.dev/blob.ExampleBucket_NewRangeReader": { "imports": "import (\n\t\"context\"\n\t\"io\"\n\t\"os\"\n\n\t\"gocloud.dev/blob\"\n)", "code": "// Open the key \"foo.txt\" for reading at offset 1024 and read up to 4096 bytes.\nr, err := bucket.NewRangeReader(ctx, \"foo.txt\", 1024, 4096, nil)\nif err != nil {\n\treturn err\n}\ndefer r.Close()\n// Copy from the read range to stdout.\nif _, err := io.Copy(os.Stdout, r); err != nil {\n\treturn err\n}" }, "gocloud.dev/blob.ExampleBucket_NewReader": { "imports": "import (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\n\t\"gocloud.dev/blob\"\n)", "code": "// Open the key \"foo.txt\" for reading with the default options.\nr, err := bucket.NewReader(ctx, \"foo.txt\", nil)\nif err != nil {\n\treturn err\n}\ndefer r.Close()\n// Readers also have a limited view of the blob's metadata.\nfmt.Println(\"Content-Type:\", r.ContentType())\nfmt.Println()\n// Copy from the reader to stdout.\nif _, err := io.Copy(os.Stdout, r); err != nil {\n\treturn err\n}" }, "gocloud.dev/blob.ExampleBucket_NewWriter": { "imports": "import (\n\t\"context\"\n\t\"fmt\"\n\n\t\"gocloud.dev/blob\"\n)", "code": "// Open the key \"foo.txt\" for writing with the default options.\nw, err := bucket.NewWriter(ctx, \"foo.txt\", nil)\nif err != nil {\n\treturn err\n}\n_, writeErr := fmt.Fprintln(w, \"Hello, World!\")\n// Always check the return value of Close when writing.\ncloseErr := w.Close()\nif writeErr != nil {\n\tlog.Fatal(writeErr)\n}\nif closeErr != nil {\n\tlog.Fatal(closeErr)\n}" }, "gocloud.dev/blob.ExampleBucket_NewWriter_cancel": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/blob\"\n)", "code": "// Create a cancelable context from the existing context.\nwriteCtx, cancelWrite := context.WithCancel(ctx)\ndefer cancelWrite()\n\n// Open the key \"foo.txt\" for writing with the default options.\nw, err := bucket.NewWriter(writeCtx, \"foo.txt\", nil)\nif err != nil {\n\treturn err\n}\n\n// Assume some writes happened and we encountered an error.\n// Now we want to abort the write.\n\nif err != nil {\n\t// First cancel the context.\n\tcancelWrite()\n\t// You must still close the writer to avoid leaking resources.\n\tw.Close()\n}" }, "gocloud.dev/blob.ExamplePrefixedBucket": { "imports": "import \"gocloud.dev/blob\"", "code": "// Wrap the bucket using blob.PrefixedBucket.\n// The prefix should end with \"/\", so that the resulting bucket operates\n// in a subfolder.\nbucket = blob.PrefixedBucket(bucket, \"a/subfolder/\")\n\n// The original bucket is no longer usable; it has been closed.\n// The wrapped bucket should be closed when done.\ndefer bucket.Close()\n\n// Bucket operations on \u003ckey\u003e will be translated to \"a/subfolder/\u003ckey\u003e\"." }, "gocloud.dev/blob.ExampleSingleKeyBucket": { "imports": "import \"gocloud.dev/blob\"", "code": "// Wrap the bucket using blob.SingleKeyBucket.\n// The bucket always references the provided key.\nbucket = blob.SingleKeyBucket(bucket, \"foo.txt\")\n\n// The original bucket is no longer usable; it has been closed.\n// The wrapped bucket should be closed when done.\ndefer bucket.Close()\n\n// Bucket operations will ignore the passed-in key and always reference foo.txt." }, "gocloud.dev/blob.Example_openFromURLWithPrefix": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/blob\"\n)", "code": "// Connect to a bucket using a URL, using the \"prefix\" query parameter to\n// target a subfolder in the bucket.\n// The prefix should end with \"/\", so that the resulting bucket operates\n// in a subfolder.\nb, err := blob.OpenBucket(ctx, \"mem://?prefix=a/subfolder/\")\nif err != nil {\n\treturn err\n}\ndefer b.Close()\n\n// Bucket operations on \u003ckey\u003e will be translated to \"a/subfolder/\u003ckey\u003e\"." }, "gocloud.dev/blob.Example_openFromURLWithSingleKey": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/blob\"\n)", "code": "// Connect to a bucket using a URL, using the \"key\" query parameter to\n// make the bucket always reference that key.\nb, err := blob.OpenBucket(ctx, \"mem://?key=foo.txt\")\nif err != nil {\n\treturn err\n}\ndefer b.Close()\n\n// Bucket operations will ignore the passed-in key and always reference foo.txt." }, "gocloud.dev/blob/azureblob.ExampleOpenBucket": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/blob/azureblob\"\n)", "code": "const (\n\t// The storage container to access.\n\tcontainerName = \"my-container\"\n)\n\n// Construct the service URL.\n// There are many forms of service URLs, see ServiceURLOptions.\nopts := azureblob.NewDefaultServiceURLOptions()\nserviceURL, err := azureblob.NewServiceURL(opts)\nif err != nil {\n\treturn err\n}\n\n// There are many ways to authenticate to Azure.\n// This approach uses environment variables as described in azureblob package\n// documentation.\n// For example, to use shared key authentication, you would set\n// AZURE_STORAGE_ACCOUNT and AZURE_STORAGE_KEY.\n// To use a SAS token, you would set AZURE_STORAGE_ACCOUNT and AZURE_STORAGE_SAS_TOKEN.\n// You can also construct a client using the azblob constructors directly, like\n// azblob.NewServiceClientWithSharedKey.\nclient, err := azureblob.NewDefaultClient(serviceURL, containerName)\nif err != nil {\n\treturn err\n}\n\n// Create a *blob.Bucket.\nb, err := azureblob.OpenBucket(ctx, client, nil)\nif err != nil {\n\treturn err\n}\ndefer b.Close()\n\n// Now we can use b to read or write files to the container.\ndata, err := b.ReadAll(ctx, \"my-key\")\nif err != nil {\n\treturn err\n}\n_ = data" }, "gocloud.dev/blob/azureblob.Example_openBucketFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/blob\"\n\t_ \"gocloud.dev/blob/azureblob\"\n)", "code": "// blob.OpenBucket creates a *blob.Bucket from a URL.\n// This URL will open the container \"my-container\" using default\n// credentials found in environment variables as documented in\n// the package.\n// Assuming AZURE_STORAGE_ACCOUNT is set to \"myaccount\",\n// and other options aren't set, the service URL will look like:\n// \"https://myaccount.blob.core.windows.net/my-container\".\nbucket, err := blob.OpenBucket(ctx, \"azblob://my-container\")\nif err != nil {\n\treturn err\n}\ndefer bucket.Close()\n\n// Another example, against a local emulator.\n// Assuming AZURE_STORAGE_ACCOUNT is set to \"myaccount\",\n// the service URL will look like:\n// \"http://localhost:10001/myaccount/my-container\".\nlocalbucket, err := blob.OpenBucket(ctx, \"azblob://my-container?protocol=http\u0026domain=localhost:10001\")\nif err != nil {\n\treturn err\n}\ndefer localbucket.Close()" }, "gocloud.dev/blob/fileblob.ExampleOpenBucket": { "imports": "import (\n\t\"os\"\n\n\t\"gocloud.dev/blob/fileblob\"\n)", "code": "// The directory you pass to fileblob.OpenBucket must exist first.\nconst myDir = \"path/to/local/directory\"\nif err := os.MkdirAll(myDir, 0o777); err != nil {\n\treturn err\n}\n\n// Create a file-based bucket.\nbucket, err := fileblob.OpenBucket(myDir, nil)\nif err != nil {\n\treturn err\n}\ndefer bucket.Close()" }, "gocloud.dev/blob/gcsblob.ExampleOpenBucket": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/blob/gcsblob\"\n\t\"gocloud.dev/gcp\"\n)", "code": "// Your GCP credentials.\n// See https://cloud.google.com/docs/authentication/production\n// for more info on alternatives.\ncreds, err := gcp.DefaultCredentials(ctx)\nif err != nil {\n\treturn err\n}\n\n// Create an HTTP client.\n// This example uses the default HTTP transport and the credentials\n// created above.\nclient, err := gcp.NewHTTPClient(\n\tgcp.DefaultTransport(),\n\tgcp.CredentialsTokenSource(creds))\nif err != nil {\n\treturn err\n}\n\n// Create a *blob.Bucket.\nbucket, err := gcsblob.OpenBucket(ctx, client, \"my-bucket\", nil)\nif err != nil {\n\treturn err\n}\ndefer bucket.Close()" }, "gocloud.dev/blob/gcsblob.Example_openBucketFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/blob\"\n\t_ \"gocloud.dev/blob/gcsblob\"\n)", "code": "// blob.OpenBucket creates a *blob.Bucket from a URL.\n// This URL will open the bucket \"my-bucket\" using default credentials.\nbucket, err := blob.OpenBucket(ctx, \"gs://my-bucket\")\nif err != nil {\n\treturn err\n}\ndefer bucket.Close()" }, "gocloud.dev/blob/memblob.ExampleOpenBucket": { "imports": "import (\n\t\"context\"\n\t\"fmt\"\n\n\t\"gocloud.dev/blob/memblob\"\n)", "code": "// Create an in-memory bucket.\nbucket := memblob.OpenBucket(nil)\ndefer bucket.Close()\n\n// Now we can use bucket to read or write files to the bucket.\nerr := bucket.WriteAll(ctx, \"my-key\", []byte(\"hello world\"), nil)\nif err != nil {\n\treturn err\n}\ndata, err := bucket.ReadAll(ctx, \"my-key\")\nif err != nil {\n\treturn err\n}\nfmt.Println(string(data))\n\n// Output:\n// hello world" }, "gocloud.dev/blob/s3blob.ExampleOpenBucket": { "imports": "import (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/config\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3\"\n\t\"gocloud.dev/blob/s3blob\"\n)", "code": "// Establish a AWS Config.\n// See https://aws.github.io/aws-sdk-go-v2/docs/configuring-sdk/ for more info.\ncfg, err := config.LoadDefaultConfig(ctx)\nif err != nil {\n\treturn err\n}\n\n// Create a *blob.Bucket.\nclient := s3.NewFromConfig(cfg)\nbucket, err := s3blob.OpenBucket(ctx, client, \"my-bucket\", nil)\nif err != nil {\n\treturn err\n}\ndefer bucket.Close()" }, "gocloud.dev/blob/s3blob.Example_openBucketFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/blob\"\n\t_ \"gocloud.dev/blob/s3blob\"\n)", "code": "// blob.OpenBucket creates a *blob.Bucket from a URL.\nbucket, err := blob.OpenBucket(ctx, \"s3://my-bucket?region=us-west-1\")\nif err != nil {\n\treturn err\n}\ndefer bucket.Close()" }, "gocloud.dev/docstore.ExampleCollection_Actions_bulkWrite": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/docstore\"\n)", "code": "// Build an ActionList to create several new players, then execute it.\n// The actions may happen in any order.\nnewPlayers := []string{\"Pat\", \"Mel\", \"Fran\"}\nactionList := coll.Actions()\nfor _, p := range newPlayers {\n\tactionList.Create(\u0026Player{Name: p, Score: 0})\n}\nif err := actionList.Do(ctx); err != nil {\n\treturn err\n}" }, "gocloud.dev/docstore.ExampleCollection_Actions_getAfterWrite": { "imports": "import (\n\t\"context\"\n\t\"fmt\"\n\n\t\"gocloud.dev/docstore\"\n)", "code": "// Add a document to the collection, then retrieve it.\n// Because both the Put and the Get refer to the same document,\n// they happen in order.\ngot := Player{Name: \"Pat\"}\nerr := coll.Actions().Put(\u0026Player{Name: \"Pat\", Score: 88}).Get(\u0026got).Do(ctx)\nif err != nil {\n\treturn err\n}\nfmt.Println(got.Name, got.Score)" }, "gocloud.dev/docstore.ExampleCollection_Update": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/docstore\"\n)", "code": "// Create a player.\npat := \u0026Player{Name: \"Pat\", Score: 0}\nif err := coll.Create(ctx, pat); err != nil {\n\treturn err\n}\n\n// Set the score to a new value.\npat2 := \u0026Player{Name: \"Pat\"}\nerr := coll.Actions().Update(pat, docstore.Mods{\"Score\": 15}).Get(pat2).Do(ctx)\nif err != nil {\n\treturn err\n}\n\n// Increment the score.\nerr = coll.Actions().Update(pat, docstore.Mods{\"Score\": docstore.Increment(5)}).Get(pat2).Do(ctx)\nif err != nil {\n\treturn err\n}" }, "gocloud.dev/docstore.ExampleQuery_Get": { "imports": "import (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\n\t\"gocloud.dev/docstore\"\n)", "code": "// Ask for all players with scores at least 20.\niter := coll.Query().Where(\"Score\", \"\u003e=\", 20).OrderBy(\"Score\", docstore.Descending).Get(ctx)\ndefer iter.Stop()\n\n// Query.Get returns an iterator. Call Next on it until io.EOF.\nfor {\n\tvar p Player\n\terr := iter.Next(ctx, \u0026p)\n\tif err == io.EOF {\n\t\tbreak\n\t} else if err != nil {\n\t\treturn err\n\t} else {\n\t\tfmt.Printf(\"%s: %d\\n\", p.Name, p.Score)\n\t}\n}" }, "gocloud.dev/docstore.Example_optimisticLocking": { "imports": "import (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"gocloud.dev/docstore/memdocstore\"\n\t\"gocloud.dev/gcerrors\"\n)", "code": "coll, err := memdocstore.OpenCollection(\"Name\", nil)\nif err != nil {\n\treturn err\n}\ndefer coll.Close()\n\n// Create a player.\npat := \u0026Player{Name: \"Pat\", Score: 7}\nif err := coll.Create(ctx, pat); err != nil {\n\treturn err\n}\nfmt.Println(pat) // memdocstore revisions are deterministic, so we can check the output.\n\n// Double a player's score. We cannot use Update to multiply, so we use optimistic\n// locking instead.\n\n// We may have to retry a few times; put a time limit on that.\nctx, cancel := context.WithTimeout(ctx, 30*time.Second)\ndefer cancel()\nfor {\n\t// Get the document.\n\tplayer := \u0026Player{Name: \"Pat\"}\n\tif err := coll.Get(ctx, player); err != nil {\n\t\treturn err\n\t}\n\t// player.DocstoreRevision is set to the document's revision.\n\n\t// Modify the document locally.\n\tplayer.Score *= 2\n\n\t// Replace the document. player.DocstoreRevision will be checked against\n\t// the stored document's revision.\n\terr := coll.Replace(ctx, player)\n\tif err != nil {\n\t\tcode := gcerrors.Code(err)\n\t\t// On FailedPrecondition or NotFound, try again.\n\t\tif code == gcerrors.FailedPrecondition || code == gcerrors.NotFound {\n\t\t\tcontinue\n\t\t}\n\t\treturn err\n\t}\n\tfmt.Println(player)\n\tbreak\n}\n\n// Output:\n// \u0026{Pat 7 1}\n// \u0026{Pat 14 2}" }, "gocloud.dev/docstore/awsdynamodb/v2.ExampleOpenCollection": { "imports": "import (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/config\"\n\t\"github.com/aws/aws-sdk-go-v2/service/dynamodb\"\n\t\"gocloud.dev/docstore/awsdynamodb/v2\"\n)", "code": "cfg, err := config.LoadDefaultConfig(context.Background())\nif err != nil {\n\treturn err\n}\ncoll, err := awsdynamodb.OpenCollection(\n\tdynamodb.NewFromConfig(cfg), \"docstore-test\", \"partitionKeyField\", \"\", nil)\nif err != nil {\n\treturn err\n}\ndefer coll.Close()" }, "gocloud.dev/docstore/awsdynamodb/v2.Example_openCollectionFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/docstore\"\n\t_ \"gocloud.dev/docstore/awsdynamodb\"\n)", "code": "// docstore.OpenCollection creates a *docstore.Collection from a URL.\ncoll, err := docstore.OpenCollection(ctx, \"dynamodb://my-table?partition_key=name\")\nif err != nil {\n\treturn err\n}\ndefer coll.Close()" }, "gocloud.dev/docstore/gcpfirestore.ExampleOpenCollection": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/docstore/gcpfirestore\"\n\t\"gocloud.dev/gcp\"\n)", "code": "creds, err := gcp.DefaultCredentials(ctx)\nif err != nil {\n\treturn err\n}\nclient, _, err := gcpfirestore.Dial(ctx, creds.TokenSource)\nif err != nil {\n\treturn err\n}\nresourceID := gcpfirestore.CollectionResourceID(\"my-project\", \"my-collection\")\ncoll, err := gcpfirestore.OpenCollection(client, resourceID, \"userID\", nil)\nif err != nil {\n\treturn err\n}\ndefer coll.Close()" }, "gocloud.dev/docstore/gcpfirestore.ExampleOpenCollectionWithNameFunc": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/docstore\"\n\t\"gocloud.dev/docstore/gcpfirestore\"\n\t\"gocloud.dev/gcp\"\n)", "code": "creds, err := gcp.DefaultCredentials(ctx)\nif err != nil {\n\treturn err\n}\nclient, _, err := gcpfirestore.Dial(ctx, creds.TokenSource)\nif err != nil {\n\treturn err\n}\n\n// The name of a document is constructed from the Game and Player fields.\nnameFromDocument := func(doc docstore.Document) string {\n\ths := doc.(*HighScore)\n\treturn hs.Game + \"|\" + hs.Player\n}\n\nresourceID := gcpfirestore.CollectionResourceID(\"my-project\", \"my-collection\")\ncoll, err := gcpfirestore.OpenCollectionWithNameFunc(client, resourceID, nameFromDocument, nil)\nif err != nil {\n\treturn err\n}\ndefer coll.Close()" }, "gocloud.dev/docstore/gcpfirestore.Example_openCollectionFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/docstore\"\n\t_ \"gocloud.dev/docstore/gcpfirestore\"\n)", "code": "// docstore.OpenCollection creates a *docstore.Collection from a URL.\nconst url = \"firestore://projects/my-project/databases/(default)/documents/my-collection?name_field=userID\"\ncoll, err := docstore.OpenCollection(ctx, url)\nif err != nil {\n\treturn err\n}\ndefer coll.Close()" }, "gocloud.dev/docstore/memdocstore.ExampleOpenCollection": { "imports": "import \"gocloud.dev/docstore/memdocstore\"", "code": "coll, err := memdocstore.OpenCollection(\"keyField\", nil)\nif err != nil {\n\treturn err\n}\ndefer coll.Close()" }, "gocloud.dev/docstore/memdocstore.ExampleOpenCollectionWithKeyFunc": { "imports": "import (\n\t\"gocloud.dev/docstore\"\n\t\"gocloud.dev/docstore/memdocstore\"\n)", "code": "// The name of a document is constructed from the Game and Player fields.\nnameFromDocument := func(doc docstore.Document) any {\n\ths := doc.(*HighScore)\n\treturn hs.Game + \"|\" + hs.Player\n}\n\ncoll, err := memdocstore.OpenCollectionWithKeyFunc(nameFromDocument, nil)\nif err != nil {\n\treturn err\n}\ndefer coll.Close()" }, "gocloud.dev/docstore/memdocstore.Example_openCollectionFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/docstore\"\n\t_ \"gocloud.dev/docstore/memdocstore\"\n)", "code": "// docstore.OpenCollection creates a *docstore.Collection from a URL.\ncoll, err := docstore.OpenCollection(ctx, \"mem://collection/keyField\")\nif err != nil {\n\treturn err\n}\ndefer coll.Close()" }, "gocloud.dev/docstore/mongodocstore.ExampleOpenCollection": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/docstore/mongodocstore\"\n)", "code": "client, err := mongodocstore.Dial(ctx, \"mongodb://my-host\")\nif err != nil {\n\treturn err\n}\nmcoll := client.Database(\"my-db\").Collection(\"my-coll\")\ncoll, err := mongodocstore.OpenCollection(mcoll, \"userID\", nil)\nif err != nil {\n\treturn err\n}\ndefer coll.Close()" }, "gocloud.dev/docstore/mongodocstore.ExampleOpenCollectionWithIDFunc": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/docstore\"\n\t\"gocloud.dev/docstore/mongodocstore\"\n)", "code": "client, err := mongodocstore.Dial(ctx, \"mongodb://my-host\")\nif err != nil {\n\treturn err\n}\nmcoll := client.Database(\"my-db\").Collection(\"my-coll\")\n\n// The name of a document is constructed from the Game and Player fields.\nnameFromDocument := func(doc docstore.Document) interface{} {\n\ths := doc.(*HighScore)\n\treturn hs.Game + \"|\" + hs.Player\n}\n\ncoll, err := mongodocstore.OpenCollectionWithIDFunc(mcoll, nameFromDocument, nil)\nif err != nil {\n\treturn err\n}\ndefer coll.Close()" }, "gocloud.dev/docstore/mongodocstore.Example_openCollectionFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/docstore\"\n\t_ \"gocloud.dev/docstore/mongodocstore\"\n)", "code": "// docstore.OpenCollection creates a *docstore.Collection from a URL.\ncoll, err := docstore.OpenCollection(ctx, \"mongo://my-db/my-collection?id_field=userID\")\nif err != nil {\n\treturn err\n}\ndefer coll.Close()" }, "gocloud.dev/mysql.ExampleOpen": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/mysql\"\n)", "code": "// Replace this with your actual settings.\ndb, err := mysql.Open(ctx, \"mysql://user:password@localhost/testdb\")\nif err != nil {\n\treturn err\n}\ndefer db.Close()\n\n// Use database in your program.\ndb.Exec(\"CREATE TABLE foo (bar INT);\")" }, "gocloud.dev/mysql/awsmysql.Example": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/mysql\"\n\t_ \"gocloud.dev/mysql/awsmysql\"\n)", "code": "// Replace these with your actual settings.\ndb, err := mysql.Open(ctx,\n\t\"awsmysql://myrole:swordfish@example01.xyzzy.us-west-1.rds.amazonaws.com/testdb\")\nif err != nil {\n\treturn err\n}\ndefer db.Close()\n\n// Use database in your program.\ndb.ExecContext(ctx, \"CREATE TABLE foo (bar INT);\")" }, "gocloud.dev/mysql/azuremysql.Example": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/mysql\"\n\t_ \"gocloud.dev/mysql/azuremysql\"\n)", "code": "// Replace this with your actual settings.\ndb, err := mysql.Open(ctx,\n\t\"azuremysql://user:password@example00.mysql.database.azure.com/testdb\")\nif err != nil {\n\treturn err\n}\ndefer db.Close()\n\n// Use database in your program.\ndb.Exec(\"CREATE TABLE foo (bar INT);\")" }, "gocloud.dev/mysql/gcpmysql.Example": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/mysql\"\n\t_ \"gocloud.dev/mysql/gcpmysql\"\n)", "code": "// Replace this with your actual settings.\ndb, err := mysql.Open(ctx,\n\t\"gcpmysql://user:password@example-project/region/my-instance01/testdb\")\nif err != nil {\n\treturn err\n}\ndefer db.Close()\n\n// Use database in your program.\ndb.Exec(\"CREATE TABLE foo (bar INT);\")" }, "gocloud.dev/postgres.ExampleOpen": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/postgres\"\n)", "code": "// Replace this with your actual settings.\ndb, err := postgres.Open(ctx, \"postgres://user:password@localhost/testdb\")\nif err != nil {\n\treturn err\n}\ndefer db.Close()\n\n// Use database in your program.\ndb.Exec(\"CREATE TABLE foo (bar INT);\")" }, "gocloud.dev/postgres/awspostgres.Example": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/postgres\"\n\t_ \"gocloud.dev/postgres/awspostgres\"\n)", "code": "// Replace these with your actual settings.\ndb, err := postgres.Open(ctx,\n\t\"awspostgres://myrole:swordfish@example01.xyzzy.us-west-1.rds.amazonaws.com/testdb\")\nif err != nil {\n\treturn err\n}\ndefer db.Close()\n\n// Use database in your program.\ndb.ExecContext(ctx, \"CREATE TABLE foo (bar INT);\")" }, "gocloud.dev/postgres/gcppostgres.Example": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/postgres\"\n\t_ \"gocloud.dev/postgres/gcppostgres\"\n)", "code": "// Replace this with your actual settings.\ndb, err := postgres.Open(ctx,\n\t\"gcppostgres://user:password@example-project/region/my-instance01/testdb\")\nif err != nil {\n\treturn err\n}\ndefer db.Close()\n\n// Use database in your program.\ndb.Exec(\"CREATE TABLE foo (bar INT);\")" }, "gocloud.dev/pubsub.ExampleSubscription_Receive": { "imports": "import (\n\t\"context\"\n\t\"fmt\"\n\n\t\"gocloud.dev/pubsub\"\n)", "code": "// Loop on received messages.\nfor {\n\tmsg, err := subscription.Receive(ctx)\n\tif err != nil {\n\t\t// Errors from Receive indicate that Receive will no longer succeed.\n\t\tlog.Printf(\"Receiving message: %v\", err)\n\t\tbreak\n\t}\n\t// Do work based on the message, for example:\n\tfmt.Printf(\"Got message: %q\\n\", msg.Body)\n\t// Messages must always be acknowledged with Ack.\n\tmsg.Ack()\n}" }, "gocloud.dev/pubsub.ExampleSubscription_Receive_concurrent": { "imports": "import (\n\t\"context\"\n\t\"fmt\"\n\n\t\"gocloud.dev/pubsub\"\n)", "code": "// Loop on received messages. We can use a channel as a semaphore to limit how\n// many goroutines we have active at a time as well as wait on the goroutines\n// to finish before exiting.\nconst maxHandlers = 10\nsem := make(chan struct{}, maxHandlers)\nrecvLoop:\nfor {\n\tmsg, err := subscription.Receive(ctx)\n\tif err != nil {\n\t\t// Errors from Receive indicate that Receive will no longer succeed.\n\t\tlog.Printf(\"Receiving message: %v\", err)\n\t\tbreak\n\t}\n\n\t// Wait if there are too many active handle goroutines and acquire the\n\t// semaphore. If the context is canceled, stop waiting and start shutting\n\t// down.\n\tselect {\n\tcase sem \u003c- struct{}{}:\n\tcase \u003c-ctx.Done():\n\t\tbreak recvLoop\n\t}\n\n\t// Handle the message in a new goroutine.\n\tgo func() {\n\t\tdefer func() { \u003c-sem }() // Release the semaphore.\n\t\tdefer msg.Ack() // Messages must always be acknowledged with Ack.\n\n\t\t// Do work based on the message, for example:\n\t\tfmt.Printf(\"Got message: %q\\n\", msg.Body)\n\t}()\n}\n\n// We're no longer receiving messages. Wait to finish handling any\n// unacknowledged messages by totally acquiring the semaphore.\nfor range maxHandlers {\n\tsem \u003c- struct{}{}\n}" }, "gocloud.dev/pubsub.ExampleTopic_Send": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/pubsub\"\n)", "code": "err := topic.Send(ctx, \u0026pubsub.Message{\n\tBody: []byte(\"Hello, World!\\n\"),\n\t// Metadata is optional and can be nil.\n\tMetadata: map[string]string{\n\t\t// These are examples of metadata.\n\t\t// There is nothing special about the key names.\n\t\t\"language\": \"en\",\n\t\t\"importance\": \"high\",\n\t},\n})\nif err != nil {\n\treturn err\n}" }, "gocloud.dev/pubsub/awssnssqs.ExampleOpenSNSTopic": { "imports": "import (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/config\"\n\t\"github.com/aws/aws-sdk-go-v2/service/sns\"\n\t\"gocloud.dev/pubsub/awssnssqs\"\n)", "code": "// Establish a AWS V2 Config.\n// See https://aws.github.io/aws-sdk-go-v2/docs/configuring-sdk/ for more info.\ncfg, err := config.LoadDefaultConfig(ctx)\nif err != nil {\n\treturn err\n}\n\n// Create a *pubsub.Topic.\nconst topicARN = \"arn:aws:sns:us-east-2:123456789012:mytopic\"\nclient := sns.NewFromConfig(cfg)\ntopic := awssnssqs.OpenSNSTopic(ctx, client, topicARN, nil)\ndefer topic.Shutdown(ctx)" }, "gocloud.dev/pubsub/awssnssqs.ExampleOpenSQSTopic": { "imports": "import (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/config\"\n\t\"github.com/aws/aws-sdk-go-v2/service/sqs\"\n\t\"gocloud.dev/pubsub/awssnssqs\"\n)", "code": "// Establish a AWS V2 Config.\n// See https://aws.github.io/aws-sdk-go-v2/docs/configuring-sdk/ for more info.\ncfg, err := config.LoadDefaultConfig(ctx)\nif err != nil {\n\treturn err\n}\n\n// Create a *pubsub.Topic.\nconst queueURL = \"https://sqs.us-east-2.amazonaws.com/123456789012/myqueue\"\nclient := sqs.NewFromConfig(cfg)\ntopic := awssnssqs.OpenSQSTopic(ctx, client, queueURL, nil)\ndefer topic.Shutdown(ctx)" }, "gocloud.dev/pubsub/awssnssqs.ExampleOpenSubscription": { "imports": "import (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/config\"\n\t\"github.com/aws/aws-sdk-go-v2/service/sqs\"\n\t\"gocloud.dev/pubsub/awssnssqs\"\n)", "code": "// Establish a AWS V2 Config.\n// See https://aws.github.io/aws-sdk-go-v2/docs/configuring-sdk/ for more info.\ncfg, err := config.LoadDefaultConfig(ctx)\nif err != nil {\n\treturn err\n}\n\n// Construct a *pubsub.Subscription.\n// https://docs.aws.amazon.com/sdk-for-net/v2/developer-guide/QueueURL.html\nconst queueURL = \"https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue\"\nclient := sqs.NewFromConfig(cfg)\nsubscription := awssnssqs.OpenSubscription(ctx, client, queueURL, nil)\ndefer subscription.Shutdown(ctx)" }, "gocloud.dev/pubsub/awssnssqs.Example_openSNSTopicFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/pubsub\"\n\t_ \"gocloud.dev/pubsub/awssnssqs\"\n)", "code": "const topicARN = \"arn:aws:sns:us-east-2:123456789012:mytopic\"\n// Note the 3 slashes; ARNs have multiple colons and therefore aren't valid\n// as hostnames in the URL.\ntopic, err := pubsub.OpenTopic(ctx, \"awssns:///\"+topicARN+\"?region=us-east-2\")\nif err != nil {\n\treturn err\n}\ndefer topic.Shutdown(ctx)" }, "gocloud.dev/pubsub/awssnssqs.Example_openSQSTopicFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/pubsub\"\n\t_ \"gocloud.dev/pubsub/awssnssqs\"\n)", "code": "// https://docs.aws.amazon.com/sdk-for-net/v2/developer-guide/QueueURL.html\nconst queueURL = \"sqs.us-east-2.amazonaws.com/123456789012/myqueue\"\ntopic, err := pubsub.OpenTopic(ctx, \"awssqs://\"+queueURL+\"?region=us-east-2\")\nif err != nil {\n\treturn err\n}\ndefer topic.Shutdown(ctx)" }, "gocloud.dev/pubsub/awssnssqs.Example_openSubscriptionFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/pubsub\"\n\t_ \"gocloud.dev/pubsub/awssnssqs\"\n)", "code": "// pubsub.OpenSubscription creates a *pubsub.Subscription from a URL.\n// This URL will open the subscription with the URL\n// \"https://sqs.us-east-2.amazonaws.com/123456789012/myqueue\".\nsubscription, err := pubsub.OpenSubscription(ctx,\n\t\"awssqs://sqs.us-east-2.amazonaws.com/123456789012/\"+\n\t\t\"myqueue?region=us-east-2\")\nif err != nil {\n\treturn err\n}\ndefer subscription.Shutdown(ctx)" }, "gocloud.dev/pubsub/azuresb.ExampleOpenSubscription": { "imports": "import (\n\t\"context\"\n\t\"os\"\n\n\t\"gocloud.dev/pubsub/azuresb\"\n)", "code": "// Change these as needed for your application.\nserviceBusConnString := os.Getenv(\"SERVICEBUS_CONNECTION_STRING\")\nconst topicName = \"test-topic\"\nconst subscriptionName = \"test-subscription\"\n\n// Connect to Azure Service Bus for the given subscription.\nsbClient, err := azuresb.NewClientFromConnectionString(serviceBusConnString, nil)\nif err != nil {\n\treturn err\n}\nsbReceiver, err := azuresb.NewReceiver(sbClient, topicName, subscriptionName, nil)\nif err != nil {\n\treturn err\n}\ndefer sbReceiver.Close(ctx)\n\n// Construct a *pubsub.Subscription.\nsubscription, err := azuresb.OpenSubscription(ctx, sbClient, sbReceiver, nil)\nif err != nil {\n\treturn err\n}\ndefer subscription.Shutdown(ctx)" }, "gocloud.dev/pubsub/azuresb.ExampleOpenTopic": { "imports": "import (\n\t\"context\"\n\t\"os\"\n\n\t\"gocloud.dev/pubsub/azuresb\"\n)", "code": "// Change these as needed for your application.\nconnString := os.Getenv(\"SERVICEBUS_CONNECTION_STRING\")\ntopicName := \"test-topic\"\n\nif connString == \"\" {\n\tlog.Fatal(\"Service Bus ConnectionString is not set\")\n}\n\n// Connect to Azure Service Bus for the given topic.\nsbClient, err := azuresb.NewClientFromConnectionString(connString, nil)\nif err != nil {\n\treturn err\n}\nsbSender, err := azuresb.NewSender(sbClient, topicName, nil)\nif err != nil {\n\treturn err\n}\ndefer sbSender.Close(ctx)\n\n// Construct a *pubsub.Topic.\ntopic, err := azuresb.OpenTopic(ctx, sbSender, nil)\nif err != nil {\n\treturn err\n}\ndefer topic.Shutdown(ctx)" }, "gocloud.dev/pubsub/azuresb.Example_openSubscriptionFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/pubsub\"\n\t_ \"gocloud.dev/pubsub/azuresb\"\n)", "code": "// pubsub.OpenSubscription creates a *pubsub.Subscription from a URL.\n// This URL will open the subscription \"mysubscription\" for the topic\n// \"mytopic\" using a connection string from the environment variable\n// SERVICEBUS_CONNECTION_STRING.\nsubscription, err := pubsub.OpenSubscription(ctx,\n\t\"azuresb://mytopic?subscription=mysubscription\")\nif err != nil {\n\treturn err\n}\ndefer subscription.Shutdown(ctx)" }, "gocloud.dev/pubsub/azuresb.Example_openTopicFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/pubsub\"\n\t_ \"gocloud.dev/pubsub/azuresb\"\n)", "code": "// pubsub.OpenTopic creates a *pubsub.Topic from a URL.\n// This URL will open the topic \"mytopic\" using a connection string\n// from the environment variable SERVICEBUS_CONNECTION_STRING.\ntopic, err := pubsub.OpenTopic(ctx, \"azuresb://mytopic\")\nif err != nil {\n\treturn err\n}\ndefer topic.Shutdown(ctx)" }, "gocloud.dev/pubsub/gcppubsub.ExampleOpenSubscription": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/gcp\"\n\t\"gocloud.dev/pubsub/gcppubsub\"\n)", "code": "// Your GCP credentials.\n// See https://cloud.google.com/docs/authentication/production\n// for more info on alternatives.\ncreds, err := gcp.DefaultCredentials(ctx)\nif err != nil {\n\treturn err\n}\n\n// Open a gRPC connection to the GCP Pub/Sub API.\nconn, cleanup, err := gcppubsub.Dial(ctx, creds.TokenSource)\nif err != nil {\n\treturn err\n}\ndefer cleanup()\n\n// Construct a SubscriberClient using the connection.\nsubClient, err := gcppubsub.SubscriberClient(ctx, conn)\nif err != nil {\n\treturn err\n}\ndefer subClient.Close()\n\n// Construct a *pubsub.Subscription.\nsubscription, err := gcppubsub.OpenSubscriptionByPath(\n\tsubClient, \"projects/myprojectID/subscriptions/example-subscription\", nil)\nif err != nil {\n\treturn err\n}\ndefer subscription.Shutdown(ctx)" }, "gocloud.dev/pubsub/gcppubsub.ExampleOpenTopic": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/gcp\"\n\t\"gocloud.dev/pubsub/gcppubsub\"\n)", "code": "// Your GCP credentials.\n// See https://cloud.google.com/docs/authentication/production\n// for more info on alternatives.\ncreds, err := gcp.DefaultCredentials(ctx)\nif err != nil {\n\treturn err\n}\n// Open a gRPC connection to the GCP Pub/Sub API.\nconn, cleanup, err := gcppubsub.Dial(ctx, creds.TokenSource)\nif err != nil {\n\treturn err\n}\ndefer cleanup()\n\n// Construct a PublisherClient using the connection.\npubClient, err := gcppubsub.PublisherClient(ctx, conn)\nif err != nil {\n\treturn err\n}\ndefer pubClient.Close()\n\n// Construct a *pubsub.Topic.\ntopic, err := gcppubsub.OpenTopicByPath(pubClient, \"projects/myprojectID/topics/example-topic\", nil)\nif err != nil {\n\treturn err\n}\ndefer topic.Shutdown(ctx)" }, "gocloud.dev/pubsub/gcppubsub.Example_openSubscriptionFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/pubsub\"\n\t_ \"gocloud.dev/pubsub/gcppubsub\"\n)", "code": "subscription, err := pubsub.OpenSubscription(ctx,\n\t\"gcppubsub://projects/my-project/subscriptions/my-subscription\")\nif err != nil {\n\treturn err\n}\ndefer subscription.Shutdown(ctx)" }, "gocloud.dev/pubsub/gcppubsub.Example_openTopicFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/pubsub\"\n\t_ \"gocloud.dev/pubsub/gcppubsub\"\n)", "code": "topic, err := pubsub.OpenTopic(ctx, \"gcppubsub://projects/myproject/topics/mytopic\")\nif err != nil {\n\treturn err\n}\ndefer topic.Shutdown(ctx)" }, "gocloud.dev/pubsub/gcppubsubv2.ExampleOpenSubscription": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/gcp\"\n\t\"gocloud.dev/pubsub/gcppubsubv2\"\n)", "code": "// Your GCP credentials.\n// See https://cloud.google.com/docs/authentication/production\n// for more info on alternatives.\ncreds, err := gcp.DefaultCredentials(ctx)\nif err != nil {\n\treturn err\n}\n\n// Open a gRPC connection to the GCP Pub/Sub API.\n// Alternatively, skip this and pass nil to Client below to use the default.\nconn, cleanup, err := gcppubsubv2.Dial(ctx, creds.TokenSource)\nif err != nil {\n\treturn err\n}\ndefer cleanup()\n\n// Construct a Client using the connection.\nclient, err := gcppubsubv2.Client(ctx, \"myprojectID\", conn)\nif err != nil {\n\treturn err\n}\ndefer client.Close()\n\n// Construct a *pubsub.Subscription.\nsubscription := gcppubsubv2.OpenSubscription(client, \"example-subscription\", nil)\ndefer subscription.Shutdown(ctx)" }, "gocloud.dev/pubsub/gcppubsubv2.ExampleOpenTopic": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/gcp\"\n\t\"gocloud.dev/pubsub/gcppubsubv2\"\n)", "code": "// Your GCP credentials.\n// See https://cloud.google.com/docs/authentication/production\n// for more info on alternatives.\ncreds, err := gcp.DefaultCredentials(ctx)\nif err != nil {\n\treturn err\n}\n// Open a gRPC connection to the GCP Pub/Sub API.\n// Alternatively, skip this and pass nil to Client below to use the default.\nconn, cleanup, err := gcppubsubv2.Dial(ctx, creds.TokenSource)\nif err != nil {\n\treturn err\n}\ndefer cleanup()\n\n// Construct a Client using the connection.\nclient, err := gcppubsubv2.Client(ctx, \"myprojectid\", conn)\nif err != nil {\n\treturn err\n}\ndefer client.Close()\n\n// Construct a *pubsub.Topic.\ntopic := gcppubsubv2.OpenTopic(client, \"example-topic\", nil)\ndefer topic.Shutdown(ctx)" }, "gocloud.dev/pubsub/gcppubsubv2.Example_openSubscriptionFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/pubsub\"\n\t_ \"gocloud.dev/pubsub/gcppubsubv2\"\n)", "code": "subscription, err := pubsub.OpenSubscription(ctx,\n\t\"gcppubsubv2://projects/my-project/subscriptions/my-subscription\")\nif err != nil {\n\treturn err\n}\ndefer subscription.Shutdown(ctx)" }, "gocloud.dev/pubsub/gcppubsubv2.Example_openTopicFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/pubsub\"\n\t_ \"gocloud.dev/pubsub/gcppubsubv2\"\n)", "code": "topic, err := pubsub.OpenTopic(ctx, \"gcppubsubv2://projects/myproject/topics/mytopic\")\nif err != nil {\n\treturn err\n}\ndefer topic.Shutdown(ctx)" }, "gocloud.dev/pubsub/kafkapubsub.ExampleOpenSubscription": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/pubsub/kafkapubsub\"\n)", "code": "// The set of brokers in the Kafka cluster.\naddrs := []string{\"1.2.3.4:9092\"}\n// The Kafka client configuration to use.\nconfig := kafkapubsub.MinimalConfig()\n\n// Construct a *pubsub.Subscription, joining the consumer group \"my-group\"\n// and receiving messages from \"my-topic\".\nsubscription, err := kafkapubsub.OpenSubscription(\n\taddrs, config, \"my-group\", []string{\"my-topic\"}, nil)\nif err != nil {\n\treturn err\n}\ndefer subscription.Shutdown(ctx)" }, "gocloud.dev/pubsub/kafkapubsub.ExampleOpenTopic": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/pubsub/kafkapubsub\"\n)", "code": "// The set of brokers in the Kafka cluster.\naddrs := []string{\"1.2.3.4:9092\"}\n// The Kafka client configuration to use.\nconfig := kafkapubsub.MinimalConfig()\n\n// Construct a *pubsub.Topic.\ntopic, err := kafkapubsub.OpenTopic(addrs, config, \"my-topic\", nil)\nif err != nil {\n\treturn err\n}\ndefer topic.Shutdown(ctx)" }, "gocloud.dev/pubsub/kafkapubsub.Example_openSubscriptionFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/pubsub\"\n\t_ \"gocloud.dev/pubsub/kafkapubsub\"\n)", "code": "// pubsub.OpenSubscription creates a *pubsub.Subscription from a URL.\n// The host + path are used as the consumer group name.\n// The \"topic\" query parameter sets one or more topics to subscribe to.\n// The set of brokers must be in an environment variable KAFKA_BROKERS.\nsubscription, err := pubsub.OpenSubscription(ctx,\n\t\"kafka://my-group?topic=my-topic\")\nif err != nil {\n\treturn err\n}\ndefer subscription.Shutdown(ctx)" }, "gocloud.dev/pubsub/kafkapubsub.Example_openTopicFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/pubsub\"\n\t_ \"gocloud.dev/pubsub/kafkapubsub\"\n)", "code": "// pubsub.OpenTopic creates a *pubsub.Topic from a URL.\n// The host + path are the topic name to send to.\n// The set of brokers must be in an environment variable KAFKA_BROKERS.\ntopic, err := pubsub.OpenTopic(ctx, \"kafka://my-topic?key_name=x-partition-key\")\nif err != nil {\n\treturn err\n}\ndefer topic.Shutdown(ctx)" }, "gocloud.dev/pubsub/mempubsub.ExampleNewSubscription": { "imports": "import (\n\t\"context\"\n\t\"time\"\n\n\t\"gocloud.dev/pubsub/mempubsub\"\n)", "code": "// Construct a *pubsub.Topic.\ntopic := mempubsub.NewTopic()\ndefer topic.Shutdown(ctx)\n\n// Construct a *pubsub.Subscription for the topic.\nsubscription := mempubsub.NewSubscription(topic, 1*time.Minute /* ack deadline */)\ndefer subscription.Shutdown(ctx)" }, "gocloud.dev/pubsub/mempubsub.ExampleNewTopic": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/pubsub/mempubsub\"\n)", "code": "topic := mempubsub.NewTopic()\ndefer topic.Shutdown(ctx)" }, "gocloud.dev/pubsub/mempubsub.Example_openSubscriptionFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/pubsub\"\n\t_ \"gocloud.dev/pubsub/mempubsub\"\n)", "code": "// Create a topic.\ntopic, err := pubsub.OpenTopic(ctx, \"mem://topicA\")\nif err != nil {\n\treturn err\n}\ndefer topic.Shutdown(ctx)\n\n// Create a subscription connected to that topic.\nsubscription, err := pubsub.OpenSubscription(ctx, \"mem://topicA\")\nif err != nil {\n\treturn err\n}\ndefer subscription.Shutdown(ctx)" }, "gocloud.dev/pubsub/mempubsub.Example_openTopicFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/pubsub\"\n\t_ \"gocloud.dev/pubsub/mempubsub\"\n)", "code": "topic, err := pubsub.OpenTopic(ctx, \"mem://topicA\")\nif err != nil {\n\treturn err\n}\ndefer topic.Shutdown(ctx)" }, "gocloud.dev/pubsub/natspubsub.ExampleOpenSubscription": { "imports": "import (\n\t\"context\"\n\n\t\"github.com/nats-io/nats.go\"\n\t\"gocloud.dev/pubsub/natspubsub\"\n)", "code": "natsConn, err := nats.Connect(\"nats://nats.example.com\")\nif err != nil {\n\treturn err\n}\ndefer natsConn.Close()\n\nsubscription, err := natspubsub.OpenSubscription(\n\tnatsConn,\n\t\"example.mysubject\",\n\tnil)\nif err != nil {\n\treturn err\n}\ndefer subscription.Shutdown(ctx)" }, "gocloud.dev/pubsub/natspubsub.ExampleOpenSubscriptionV2": { "imports": "import (\n\t\"context\"\n\n\t\"github.com/nats-io/nats.go\"\n\t\"gocloud.dev/pubsub/natspubsub\"\n)", "code": "subscription, err := natspubsub.OpenSubscriptionV2(\n\tnatsConn,\n\t\"example.mysubject\",\n\tnil)\nif err != nil {\n\treturn err\n}\ndefer subscription.Shutdown(ctx)" }, "gocloud.dev/pubsub/natspubsub.ExampleOpenSubscription_queue": { "imports": "import (\n\t\"context\"\n\n\t\"github.com/nats-io/nats.go\"\n\t\"gocloud.dev/pubsub/natspubsub\"\n)", "code": "natsConn, err := nats.Connect(\"nats://nats.example.com\")\nif err != nil {\n\treturn err\n}\ndefer natsConn.Close()\n\nsubscription, err := natspubsub.OpenSubscription(\n\tnatsConn,\n\t\"example.mysubject\",\n\t\u0026natspubsub.SubscriptionOptions{Queue: \"queue1\"})\nif err != nil {\n\treturn err\n}\ndefer subscription.Shutdown(ctx)" }, "gocloud.dev/pubsub/natspubsub.ExampleOpenTopic": { "imports": "import (\n\t\"context\"\n\n\t\"github.com/nats-io/nats.go\"\n\t\"gocloud.dev/pubsub/natspubsub\"\n)", "code": "natsConn, err := nats.Connect(\"nats://nats.example.com\")\nif err != nil {\n\treturn err\n}\ndefer natsConn.Close()\n\ntopic, err := natspubsub.OpenTopic(natsConn, \"example.mysubject\", nil)\nif err != nil {\n\treturn err\n}\ndefer topic.Shutdown(ctx)" }, "gocloud.dev/pubsub/natspubsub.ExampleOpenTopicV2": { "imports": "import (\n\t\"context\"\n\n\t\"github.com/nats-io/nats.go\"\n\t\"gocloud.dev/pubsub/natspubsub\"\n)", "code": "natsConn, err := nats.Connect(\"nats://nats.example.com\")\nif err != nil {\n\treturn err\n}\ndefer natsConn.Close()\n\ntopic, err := natspubsub.OpenTopicV2(natsConn, \"example.mysubject\", nil)\nif err != nil {\n\treturn err\n}\ndefer topic.Shutdown(ctx)" }, "gocloud.dev/pubsub/natspubsub.Example_openQueueSubscriptionFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/pubsub\"\n\t_ \"gocloud.dev/pubsub/natspubsub\"\n)", "code": "// pubsub.OpenSubscription creates a *pubsub.Subscription from a URL.\n// This URL will Dial the NATS server at the URL in the environment variable\n// NATS_SERVER_URL and receive messages with subject \"example.mysubject\"\n// This URL will be parsed and the queue attribute will be used as the Queue parameter when creating the NATS Subscription.\nsubscription, err := pubsub.OpenSubscription(ctx, \"nats://example.mysubject?queue=myqueue\")\nif err != nil {\n\treturn err\n}\ndefer subscription.Shutdown(ctx)" }, "gocloud.dev/pubsub/natspubsub.Example_openSubscriptionFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/pubsub\"\n\t_ \"gocloud.dev/pubsub/natspubsub\"\n)", "code": "// pubsub.OpenSubscription creates a *pubsub.Subscription from a URL.\n// This URL will Dial the NATS server at the URL in the environment variable\n// NATS_SERVER_URL and receive messages with subject \"example.mysubject\".\nsubscription, err := pubsub.OpenSubscription(ctx, \"nats://example.mysubject\")\nif err != nil {\n\treturn err\n}\ndefer subscription.Shutdown(ctx)" }, "gocloud.dev/pubsub/natspubsub.Example_openSubscriptionV2FromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/pubsub\"\n\t_ \"gocloud.dev/pubsub/natspubsub\"\n)", "code": "// pubsub.OpenSubscription creates a *pubsub.Subscription from a URL.\n// This URL will Dial the NATS server at the URL in the environment variable\n// NATS_SERVER_URL and receive messages with subject \"example.mysubject\".\n// This URL will be parsed and the natsv2 attribute will be used to\n// use NATS v2.2.0+ native message headers as the message metadata.\nsubscription, err := pubsub.OpenSubscription(ctx, \"nats://example.mysubject?natsv2\")\nif err != nil {\n\treturn err\n}\ndefer subscription.Shutdown(ctx)" }, "gocloud.dev/pubsub/natspubsub.Example_openTopicFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/pubsub\"\n\t_ \"gocloud.dev/pubsub/natspubsub\"\n)", "code": "// pubsub.OpenTopic creates a *pubsub.Topic from a URL.\n// This URL will Dial the NATS server at the URL in the environment variable\n// NATS_SERVER_URL and send messages with subject \"example.mysubject\".\ntopic, err := pubsub.OpenTopic(ctx, \"nats://example.mysubject\")\nif err != nil {\n\treturn err\n}\ndefer topic.Shutdown(ctx)" }, "gocloud.dev/pubsub/natspubsub.Example_openTopicV2FromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/pubsub\"\n\t_ \"gocloud.dev/pubsub/natspubsub\"\n)", "code": "// pubsub.OpenTopic creates a *pubsub.Topic from a URL.\n// This URL will Dial the NATS server at the URL in the environment variable\n// NATS_SERVER_URL and send messages with subject \"example.mysubject\".\n// This URL will be parsed and the natsv2 attribute will be used to\n// use NATS v2.2.0+ native message headers as the message metadata.\ntopic, err := pubsub.OpenTopic(ctx, \"nats://example.mysubject?natsv2\")\nif err != nil {\n\treturn err\n}\ndefer topic.Shutdown(ctx)" }, "gocloud.dev/pubsub/rabbitpubsub.ExampleOpenSubscription": { "imports": "import (\n\t\"context\"\n\n\tamqp \"github.com/rabbitmq/amqp091-go\"\n\t\"gocloud.dev/pubsub/rabbitpubsub\"\n)", "code": "rabbitConn, err := amqp.Dial(\"amqp://guest:guest@localhost:5672/\")\nif err != nil {\n\treturn err\n}\ndefer rabbitConn.Close()\nsubscription := rabbitpubsub.OpenSubscription(rabbitConn, \"myqueue\", nil)\ndefer subscription.Shutdown(ctx)" }, "gocloud.dev/pubsub/rabbitpubsub.ExampleOpenTopic": { "imports": "import (\n\t\"context\"\n\n\tamqp \"github.com/rabbitmq/amqp091-go\"\n\t\"gocloud.dev/pubsub/rabbitpubsub\"\n)", "code": "rabbitConn, err := amqp.Dial(\"amqp://guest:guest@localhost:5672/\")\nif err != nil {\n\treturn err\n}\ndefer rabbitConn.Close()\ntopic := rabbitpubsub.OpenTopic(rabbitConn, \"myexchange\", nil)\ndefer topic.Shutdown(ctx)" }, "gocloud.dev/pubsub/rabbitpubsub.Example_openSubscriptionFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/pubsub\"\n\t_ \"gocloud.dev/pubsub/rabbitpubsub\"\n)", "code": "// pubsub.OpenSubscription creates a *pubsub.Subscription from a URL.\n// This URL will Dial the RabbitMQ server at the URL in the environment\n// variable RABBIT_SERVER_URL and open the queue \"myqueue\".\nsubscription, err := pubsub.OpenSubscription(ctx, \"rabbit://myqueue\")\nif err != nil {\n\treturn err\n}\ndefer subscription.Shutdown(ctx)" }, "gocloud.dev/pubsub/rabbitpubsub.Example_openTopicFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/pubsub\"\n\t_ \"gocloud.dev/pubsub/rabbitpubsub\"\n)", "code": "// pubsub.OpenTopic creates a *pubsub.Topic from a URL.\n// This URL will Dial the RabbitMQ server at the URL in the environment\n// variable RABBIT_SERVER_URL and open the exchange \"myexchange\".\ntopic, err := pubsub.OpenTopic(ctx, \"rabbit://myexchange\")\nif err != nil {\n\treturn err\n}\ndefer topic.Shutdown(ctx)" }, "gocloud.dev/runtimevar.ExampleDecryptDecode": { "imports": "import (\n\t\"gocloud.dev/runtimevar\"\n\t\"gocloud.dev/secrets\"\n)", "code": "decodeFunc := runtimevar.DecryptDecode(keeper, runtimevar.StringDecode)\ndecoder := runtimevar.NewDecoder(\"\", decodeFunc)" }, "gocloud.dev/runtimevar.ExampleVariable_Latest": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/runtimevar\"\n)", "code": "snapshot, err := v.Latest(context.Background())\nif err != nil {\n\tlog.Fatalf(\"Error in retrieving variable: %v\", err)\n}" }, "gocloud.dev/runtimevar.Example_jsonDecoder": { "imports": "import (\n\t\"context\"\n\t\"fmt\"\n\n\t\"gocloud.dev/runtimevar\"\n\t\"gocloud.dev/runtimevar/constantvar\"\n)", "code": "// Config is the sample config struct we're going to parse our JSON into.\ntype Config struct {\n\tHost string\n\tPort int\n}\n\n// A sample JSON config that will decode into Config.\nconst jsonConfig = `{\"Host\": \"gocloud.dev\", \"Port\": 8080}`\n\n// Construct a Decoder that decodes raw bytes into our config.\ndecoder := runtimevar.NewDecoder(Config{}, runtimevar.JSONDecode)\n\n// Next, a construct a *Variable using a constructor or URL opener.\n// This example uses constantvar.\n// If you're using a URL opener, you can't decode JSON into a struct, but\n// you can use the query parameter \"decoder=jsonmap\" to decode into a map.\nv := constantvar.NewBytes([]byte(jsonConfig), decoder)\ndefer v.Close()\n// snapshot.Value will be of type Config." }, "gocloud.dev/runtimevar/awsparamstore.ExampleOpenVariable": { "imports": "import (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/config\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ssm\"\n\t\"gocloud.dev/runtimevar\"\n\t\"gocloud.dev/runtimevar/awsparamstore\"\n)", "code": "// Establish a AWS V2 Config.\n// See https://aws.github.io/aws-sdk-go-v2/docs/configuring-sdk/ for more info.\nctx := context.Background()\ncfg, err := config.LoadDefaultConfig(ctx)\nif err != nil {\n\treturn err\n}\n\n// Construct a *runtimevar.Variable that watches the variable.\nclient := ssm.NewFromConfig(cfg)\nv, err := awsparamstore.OpenVariable(client, \"cfg-variable-name\", runtimevar.StringDecoder, nil)\nif err != nil {\n\treturn err\n}\ndefer v.Close()" }, "gocloud.dev/runtimevar/awsparamstore.Example_openVariableFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/runtimevar\"\n\t_ \"gocloud.dev/runtimevar/awsparamstore\"\n)", "code": "// runtimevar.OpenVariable creates a *runtimevar.Variable from a URL.\nv, err := runtimevar.OpenVariable(ctx, \"awsparamstore://myvar?region=us-west-1\u0026decoder=string\")\nif err != nil {\n\treturn err\n}\ndefer v.Close()" }, "gocloud.dev/runtimevar/awssecretsmanager.ExampleOpenVariable": { "imports": "import (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/config\"\n\t\"github.com/aws/aws-sdk-go-v2/service/secretsmanager\"\n\t\"gocloud.dev/runtimevar\"\n\t\"gocloud.dev/runtimevar/awssecretsmanager\"\n)", "code": "// Establish a AWS V2 Config.\n// See https://aws.github.io/aws-sdk-go-v2/docs/configuring-sdk/ for more info.\nctx := context.Background()\ncfg, err := config.LoadDefaultConfig(ctx)\nif err != nil {\n\treturn err\n}\n\n// Construct a *runtimevar.Variable that watches the variable.\n// `secret-variable-name` must be a friendly name of the secret, NOT the Amazon Resource Name (ARN).\nclient := secretsmanager.NewFromConfig(cfg)\nv, err := awssecretsmanager.OpenVariable(client, \"secret-variable-name\", runtimevar.StringDecoder, nil)\nif err != nil {\n\treturn err\n}\ndefer v.Close()" }, "gocloud.dev/runtimevar/awssecretsmanager.Example_openVariableFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/runtimevar\"\n\t_ \"gocloud.dev/runtimevar/awssecretsmanager\"\n)", "code": "// runtimevar.OpenVariable creates a *runtimevar.Variable from a URL.\n// `secret-variable-name` must be a friendly name of the secret, NOT the Amazon Resource Name (ARN).\nv, err := runtimevar.OpenVariable(ctx, \"awssecretsmanager://secret-variable-name?region=us-east-2\u0026decoder=string\")\nif err != nil {\n\treturn err\n}\ndefer v.Close()" }, "gocloud.dev/runtimevar/blobvar.Example_openVariableFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/runtimevar\"\n\t_ \"gocloud.dev/runtimevar/blobvar\"\n)", "code": "// runtimevar.OpenVariable creates a *runtimevar.Variable from a URL.\n// The default opener opens a blob.Bucket via a URL, based on the environment\n// variable BLOBVAR_BUCKET_URL.\n\nv, err := runtimevar.OpenVariable(ctx, \"blob://myvar.txt?decoder=string\")\nif err != nil {\n\treturn err\n}\ndefer v.Close()" }, "gocloud.dev/runtimevar/constantvar.Example_openVariableFromURL": { "imports": "import (\n\t\"context\"\n\t\"fmt\"\n\n\t\"gocloud.dev/runtimevar\"\n\t_ \"gocloud.dev/runtimevar/constantvar\"\n)", "code": "// runtimevar.OpenVariable creates a *runtimevar.Variable from a URL.\n// The constant value is in the URL param \"val\".\nv, err := runtimevar.OpenVariable(ctx, \"constant://?val=hello+world\u0026decoder=string\")\nif err != nil {\n\treturn err\n}\ndefer v.Close()\n\n// The constant value is read from an environment variable specified in \"envvar\".\nv2, err := runtimevar.OpenVariable(ctx, \"constant://?envvar=MY_ENVIRONMENT_VARIABLE\u0026decoder=string\")\nif err != nil {\n\treturn err\n}\ndefer v2.Close()" }, "gocloud.dev/runtimevar/etcdvar.ExampleOpenVariable": { "imports": "import (\n\t\"go.etcd.io/etcd/client/v3\"\n\t\"gocloud.dev/runtimevar\"\n\t\"gocloud.dev/runtimevar/etcdvar\"\n)", "code": "// Connect to the etcd server.\nclient, err := clientv3.NewFromURL(\"http://your.etcd.server:9999\")\nif err != nil {\n\treturn err\n}\n\n// Construct a *runtimevar.Variable that watches the variable.\nv, err := etcdvar.OpenVariable(client, \"cfg-variable-name\", runtimevar.StringDecoder, nil)\nif err != nil {\n\treturn err\n}\ndefer v.Close()" }, "gocloud.dev/runtimevar/etcdvar.Example_openVariableFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/runtimevar\"\n\t_ \"gocloud.dev/runtimevar/etcdvar\"\n)", "code": "// runtimevar.OpenVariable creates a *runtimevar.Variable from a URL.\n// The default opener connects to an etcd server based on the environment\n// variable ETCD_SERVER_URL.\n\nv, err := runtimevar.OpenVariable(ctx, \"etcd://myvarname?decoder=string\")\nif err != nil {\n\treturn err\n}\ndefer v.Close()" }, "gocloud.dev/runtimevar/filevar.Example_openVariableFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/runtimevar\"\n\t_ \"gocloud.dev/runtimevar/filevar\"\n)", "code": "// runtimevar.OpenVariable creates a *runtimevar.Variable from a URL.\n\nv, err := runtimevar.OpenVariable(ctx, \"file:///path/to/config.txt?decoder=string\")\nif err != nil {\n\treturn err\n}\ndefer v.Close()" }, "gocloud.dev/runtimevar/gcpruntimeconfig.ExampleOpenVariable": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/gcp\"\n\t\"gocloud.dev/runtimevar\"\n\t\"gocloud.dev/runtimevar/gcpruntimeconfig\"\n)", "code": "// Your GCP credentials.\n// See https://cloud.google.com/docs/authentication/production\n// for more info on alternatives.\ncreds, err := gcp.DefaultCredentials(ctx)\nif err != nil {\n\treturn err\n}\n\n// Connect to the Runtime Configurator service.\nclient, cleanup, err := gcpruntimeconfig.Dial(ctx, creds.TokenSource)\nif err != nil {\n\treturn err\n}\ndefer cleanup()\n\n// You can use the VariableKey helper to construct a Variable key from\n// your project ID, config ID, and the variable name; alternatively,\n// you can construct the full string yourself (e.g.,\n// \"projects/gcp-project-id/configs/config-id/variables/variable-name\").\n// See https://cloud.google.com/deployment-manager/runtime-configurator/\n// for more details.\n//\n// For this example, the GCP Cloud Runtime Configurator variable being\n// referenced should have a JSON string that decodes into MyConfig.\nvariableKey := gcpruntimeconfig.VariableKey(\"gcp-project-id\", \"config-id\", \"variable-name\")\n\n// Construct a *runtimevar.Variable that watches the variable.\nv, err := gcpruntimeconfig.OpenVariable(client, variableKey, runtimevar.StringDecoder, nil)\nif err != nil {\n\treturn err\n}\ndefer v.Close()" }, "gocloud.dev/runtimevar/gcpruntimeconfig.Example_openVariableFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/runtimevar\"\n\t_ \"gocloud.dev/runtimevar/gcpruntimeconfig\"\n)", "code": "// runtimevar.OpenVariable creates a *runtimevar.Variable from a URL.\n// The URL Host+Path are used as the GCP Runtime Configurator Variable key;\n// see https://cloud.google.com/deployment-manager/runtime-configurator/\n// for more details.\n\nv, err := runtimevar.OpenVariable(ctx, \"gcpruntimeconfig://projects/myproject/configs/myconfigid/variables/myvar?decoder=string\")\nif err != nil {\n\treturn err\n}\ndefer v.Close()" }, "gocloud.dev/runtimevar/gcpsecretmanager.ExampleOpenVariable": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/gcp\"\n\t\"gocloud.dev/runtimevar\"\n\t\"gocloud.dev/runtimevar/gcpsecretmanager\"\n)", "code": "// Your GCP credentials.\n// See https://cloud.google.com/docs/authentication/production\n// for more info on alternatives.\ncreds, err := gcp.DefaultCredentials(ctx)\nif err != nil {\n\treturn err\n}\n\n// Connect to the GCP Secret Manager service.\nclient, cleanup, err := gcpsecretmanager.Dial(ctx, creds.TokenSource)\nif err != nil {\n\treturn err\n}\ndefer cleanup()\n\n// You can use the SecretKey helper to construct a secret key from\n// your project ID and the secret ID; alternatively,\n// you can construct the full string yourself (e.g.,\n// \"projects/gcp-project-id/secrets/secret-id\").\n// gcpsecretmanager package will always use the latest secret value,\n// so `/version/latest` postfix must NOT be added to the secret key.\n// See https://cloud.google.com/secret-manager\n// for more details.\n//\n// For this example, the GCP Secret Manager secret being\n// referenced should have a JSON string that decodes into MyConfig.\nvariableKey := gcpsecretmanager.SecretKey(\"gcp-project-id\", \"secret-id\")\n\n// Construct a *runtimevar.Variable that watches the variable.\nv, err := gcpsecretmanager.OpenVariable(client, variableKey, runtimevar.StringDecoder, nil)\nif err != nil {\n\treturn err\n}\ndefer v.Close()" }, "gocloud.dev/runtimevar/gcpsecretmanager.Example_openVariableFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/runtimevar\"\n\t_ \"gocloud.dev/runtimevar/gcpsecretmanager\"\n)", "code": "// runtimevar.OpenVariable creates a *runtimevar.Variable from a URL.\n// The URL Host+Path are used as the GCP Secret Manager secret key;\n// see https://cloud.google.com/secret-manager\n// for more details.\n\nv, err := runtimevar.OpenVariable(ctx, \"gcpsecretmanager://projects/myproject/secrets/mysecret?decoder=string\")\nif err != nil {\n\treturn err\n}\ndefer v.Close()" }, "gocloud.dev/runtimevar/hashivault.ExampleOpenVariable": { "imports": "import (\n\t\"context\"\n\n\t\"github.com/hashicorp/vault/api\"\n\t\"gocloud.dev/runtimevar\"\n\t\"gocloud.dev/runtimevar/hashivault\"\n)", "code": "// Get a client to use with the Vault API.\nclient, err := hashivault.Dial(ctx, \u0026hashivault.Config{\n\tToken: \"CLIENT_TOKEN\",\n\tAPIConfig: api.Config{\n\t\tAddress: \"http://127.0.0.1:8200\",\n\t},\n})\nif err != nil {\n\treturn err\n}\n\n// Construct a *runtimevar.Variable that watches the secret.\nv, err := hashivault.OpenVariable(client, \"myapp/config\", runtimevar.StringDecoder, nil)\nif err != nil {\n\treturn err\n}\ndefer v.Close()" }, "gocloud.dev/runtimevar/hashivault.Example_openVariableFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/runtimevar\"\n\t_ \"gocloud.dev/runtimevar/hashivault\"\n)", "code": "// runtimevar.OpenVariable creates a *runtimevar.Variable from a URL.\n// The default opener connects to a Vault server based on the environment\n// variables VAULT_SERVER_URL/VAULT_ADDR and VAULT_SERVER_TOKEN/VAULT_TOKEN.\nv, err := runtimevar.OpenVariable(ctx, \"hashivault://myapp/config?decoder=string\")\nif err != nil {\n\treturn err\n}\ndefer v.Close()" }, "gocloud.dev/runtimevar/httpvar.ExampleOpenVariable": { "imports": "import (\n\t\"net/http\"\n\n\t\"gocloud.dev/runtimevar\"\n\t\"gocloud.dev/runtimevar/httpvar\"\n)", "code": "// Create an HTTP.Client\nhttpClient := http.DefaultClient\n\n// Construct a *runtimevar.Variable that watches the page.\nv, err := httpvar.OpenVariable(httpClient, \"http://example.com\", runtimevar.StringDecoder, nil)\nif err != nil {\n\treturn err\n}\ndefer v.Close()" }, "gocloud.dev/runtimevar/httpvar.Example_openVariableFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/runtimevar\"\n\t_ \"gocloud.dev/runtimevar/httpvar\"\n)", "code": "// runtimevar.OpenVariable creates a *runtimevar.Variable from a URL.\n// The default opener connects to an etcd server based on the environment\n// variable ETCD_SERVER_URL.\n\nv, err := runtimevar.OpenVariable(ctx, \"http://myserver.com/foo.txt?decoder=string\")\nif err != nil {\n\treturn err\n}\ndefer v.Close()" }, "gocloud.dev/secrets.ExampleKeeper_Decrypt": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/secrets\"\n)", "code": "var cipherText []byte // obtained from elsewhere and random-looking\nplainText, err := keeper.Decrypt(ctx, cipherText)\nif err != nil {\n\treturn err\n}" }, "gocloud.dev/secrets.ExampleKeeper_Encrypt": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/secrets\"\n)", "code": "plainText := []byte(\"Secrets secrets...\")\ncipherText, err := keeper.Encrypt(ctx, plainText)\nif err != nil {\n\treturn err\n}" }, "gocloud.dev/secrets/awskms.ExampleOpenKeeper": { "imports": "import (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/config\"\n\t\"gocloud.dev/secrets/awskms\"\n)", "code": "// Establish a AWS V2 Config.\n// See https://aws.github.io/aws-sdk-go-v2/docs/configuring-sdk/ for more info.\nctx := context.Background()\ncfg, err := config.LoadDefaultConfig(ctx)\nif err != nil {\n\treturn err\n}\n\n// Get a client to use with the KMS API.\nclient, err := awskms.Dial(cfg)\nif err != nil {\n\treturn err\n}\n\n// Construct a *secrets.Keeper.\nkeeper := awskms.OpenKeeper(client, \"alias/test-secrets\", nil)\ndefer keeper.Close()" }, "gocloud.dev/secrets/awskms.Example_openFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/secrets\"\n\t_ \"gocloud.dev/secrets/awskms\"\n)", "code": "// Use one of the following:\n\n// 1. By ID.\nkeeperByID, err := secrets.OpenKeeper(ctx,\n\t\"awskms://1234abcd-12ab-34cd-56ef-1234567890ab?region=us-east-1\")\nif err != nil {\n\treturn err\n}\ndefer keeperByID.Close()\n\n// 2. By alias.\nkeeperByAlias, err := secrets.OpenKeeper(ctx,\n\t\"awskms://alias/ExampleAlias?region=us-east-1\")\nif err != nil {\n\treturn err\n}\ndefer keeperByAlias.Close()\n\n// 3. By ARN. Note that ARN may contain \":\" characters, which cannot be escaped\n// in the Host part of a URL, so the \"awskms:///\u003cARN\u003e\" form should be used.\nconst arn = \"arn:aws:kms:us-east-1:111122223333:key/\" +\n\t\"1234abcd-12ab-34bc-56ef-1234567890ab\"\nkeeperByARN, err := secrets.OpenKeeper(ctx,\n\t\"awskms:///\"+arn+\"?region=us-east-1\")\nif err != nil {\n\treturn err\n}\ndefer keeperByARN.Close()" }, "gocloud.dev/secrets/azurekeyvault.ExampleOpenKeeper": { "imports": "import \"gocloud.dev/secrets/azurekeyvault\"", "code": "// Makes a client to use with the Azure KeyVault API, using default\n// authorization from the environment.\nclientMaker := azurekeyvault.DefaultClientMaker\n\n// Construct a *secrets.Keeper.\nkeeper, err := azurekeyvault.OpenKeeper(clientMaker, \"https://mykeyvaultname.vault.azure.net/keys/mykeyname\", nil)\nif err != nil {\n\treturn err\n}\ndefer keeper.Close()" }, "gocloud.dev/secrets/azurekeyvault.Example_openFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/secrets\"\n\t_ \"gocloud.dev/secrets/azurekeyvault\"\n)", "code": "// The \"azurekeyvault\" URL scheme is replaced with \"https\" to construct an Azure\n// Key Vault keyID, as described in https://docs.microsoft.com/en-us/azure/key-vault/about-keys-secrets-and-certificates.\n// You can add an optional \"/{key-version}\" to the path to use a specific\n// version of the key; it defaults to the latest version.\nkeeper, err := secrets.OpenKeeper(ctx, \"azurekeyvault://mykeyvaultname.vault.azure.net/keys/mykeyname\")\nif err != nil {\n\treturn err\n}\ndefer keeper.Close()" }, "gocloud.dev/secrets/gcpkms.ExampleOpenKeeper": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/secrets/gcpkms\"\n)", "code": "// Get a client to use with the KMS API.\nclient, done, err := gcpkms.Dial(ctx, nil)\nif err != nil {\n\treturn err\n}\n// Close the connection when done.\ndefer done()\n\n// You can also use gcpkms.KeyResourceID to construct this string.\nconst keyID = \"projects/MYPROJECT/\" +\n\t\"locations/MYLOCATION/\" +\n\t\"keyRings/MYKEYRING/\" +\n\t\"cryptoKeys/MYKEY\"\n\n// Construct a *secrets.Keeper.\nkeeper := gcpkms.OpenKeeper(client, keyID, nil)\ndefer keeper.Close()" }, "gocloud.dev/secrets/gcpkms.Example_openFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/secrets\"\n\t_ \"gocloud.dev/secrets/gcpkms\"\n)", "code": "keeper, err := secrets.OpenKeeper(ctx,\n\t\"gcpkms://projects/MYPROJECT/\"+\n\t\t\"locations/MYLOCATION/\"+\n\t\t\"keyRings/MYKEYRING/\"+\n\t\t\"cryptoKeys/MYKEY\")\nif err != nil {\n\treturn err\n}\ndefer keeper.Close()" }, "gocloud.dev/secrets/hashivault.ExampleOpenKeeper": { "imports": "import (\n\t\"context\"\n\n\t\"github.com/hashicorp/vault/api\"\n\t\"gocloud.dev/secrets/hashivault\"\n)", "code": "// Get a client to use with the Vault API.\nclient, err := hashivault.Dial(ctx, \u0026hashivault.Config{\n\tToken: \"CLIENT_TOKEN\",\n\tAPIConfig: api.Config{\n\t\tAddress: \"http://127.0.0.1:8200\",\n\t},\n})\nif err != nil {\n\treturn err\n}\n\n// Construct a *secrets.Keeper.\nkeeper := hashivault.OpenKeeper(client, \"my-key\", nil)\ndefer keeper.Close()" }, "gocloud.dev/secrets/hashivault.Example_openFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/secrets\"\n\t_ \"gocloud.dev/secrets/hashivault\"\n)", "code": "keeper, err := secrets.OpenKeeper(ctx, \"hashivault://mykey\")\nif err != nil {\n\treturn err\n}\ndefer keeper.Close()" }, "gocloud.dev/secrets/localsecrets.ExampleNewKeeper": { "imports": "import \"gocloud.dev/secrets/localsecrets\"", "code": "secretKey, err := localsecrets.NewRandomKey()\nif err != nil {\n\treturn err\n}\nkeeper := localsecrets.NewKeeper(secretKey)\ndefer keeper.Close()" }, "gocloud.dev/secrets/localsecrets.Example_openFromURL": { "imports": "import (\n\t\"context\"\n\n\t\"gocloud.dev/secrets\"\n\t_ \"gocloud.dev/secrets/localsecrets\"\n)", "code": "// Using \"base64key://\", a new random key will be generated.\nrandomKeyKeeper, err := secrets.OpenKeeper(ctx, \"base64key://\")\nif err != nil {\n\treturn err\n}\ndefer randomKeyKeeper.Close()\n\n// Otherwise, the URL hostname must be a base64-encoded key, of length 32 bytes when decoded.\n// Note that base64.URLEncode should be used, to avoid URL-unsafe characters.\nsavedKeyKeeper, err := secrets.OpenKeeper(ctx, \"base64key://smGbjm71Nxd1Ig5FS0wj9SlbzAIrnolCz9bQQ6uAhl4=\")\nif err != nil {\n\treturn err\n}\ndefer savedKeyKeeper.Close()" }, "gocloud.dev/server.ExampleServer": { "imports": "import (\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"gocloud.dev/server\"\n)", "code": "// Use the constructor function to create the server.\nsrv := server.New(http.DefaultServeMux, nil)\n\n// Register a route.\nhttp.HandleFunc(\"/\", func(w http.ResponseWriter, r *http.Request) {\n\tfmt.Fprintln(w, \"Hello, World!\")\n})\n\n// Start the server. If ListenAndServe returns an error, print it and exit.\nif err := srv.ListenAndServe(\":8080\"); err != nil {\n\tlog.Fatalf(\"%v\", err)\n}" }, "gocloud.dev/server.ExampleServer_withHealthChecks": { "imports": "import (\n\t\"fmt\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"gocloud.dev/server\"\n\t\"gocloud.dev/server/health\"\n)", "code": "// Create a health.Checker from the type we defined for our application.\n// In this example, healthCheck will report the server is unhealthy for 10 seconds\n// after startup, and as healthy henceforth. Check the /healthz/readiness\n// HTTP path to see readiness.\nhealthCheck := new(customHealthCheck)\ntime.AfterFunc(10*time.Second, func() {\n\thealthCheck.mu.Lock()\n\tdefer healthCheck.mu.Unlock()\n\thealthCheck.healthy = true\n})\n\n// The server.Options struct takes a slice of health checks, because you\n// may need to check several things.\nsrvOptions := \u0026server.Options{\n\tHealthChecks: []health.Checker{healthCheck},\n}\n\n// Pass the options to the Server constructor.\nsrv := server.New(http.DefaultServeMux, srvOptions)\n\n// Register a route.\nhttp.HandleFunc(\"/\", func(w http.ResponseWriter, r *http.Request) {\n\tfmt.Fprintln(w, \"Hello, World!\")\n})\n\n// Start the server. You will see requests logged to STDOUT.\nif err := srv.ListenAndServe(\":8080\"); err != nil {\n\tlog.Fatalf(\"%v\", err)\n}" }, "gocloud.dev/server.ExampleServer_withRequestLogger": { "imports": "import (\n\t\"fmt\"\n\t\"net/http\"\n\t\"os\"\n\n\t\"gocloud.dev/server\"\n\t\"gocloud.dev/server/requestlog\"\n)", "code": "// Create a logger, and assign it to the RequestLogger field of a\n// server.Options struct.\nsrvOptions := \u0026server.Options{\n\tRequestLogger: requestlog.NewNCSALogger(os.Stdout, func(error) {}),\n}\n\n// Pass the options to the Server constructor.\nsrv := server.New(http.DefaultServeMux, srvOptions)\n\n// Register a route.\nhttp.HandleFunc(\"/\", func(w http.ResponseWriter, r *http.Request) {\n\tfmt.Fprintln(w, \"Hello, World!\")\n})\n\n// Start the server. You will see requests logged to STDOUT.\nif err := srv.ListenAndServe(\":8080\"); err != nil {\n\tlog.Fatalf(\"%v\", err)\n}" } } ================================================ FILE: internal/website/gatherexamples/gatherexamples.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Command gatherexamples extracts examples in a Go module into a JSON-formatted // object. This is used as input for building the Go CDK Hugo website. // // Examples must include a comment // "// PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored." // somewhere in the function body in order to be included in this tool's output. // // gatherexamples does some minimal rewriting of the example source code for // presentation: // // - Any imports the example uses will be prepended to the code. // - log.Fatal(err) -> return err // - A comment line "// PRAGMA: On gocloud.dev, hide lines until the next blank line." will // remove any code up to the next blank line. This is intended for // compiler-mandated setup like `ctx := context.Background()`. // - A comment line "// PRAGMA: On gocloud.dev, hide the rest of the function." will // remove any code until the end of the function. This is intended for // compiler-mandated assignments like `_ = bucket`. // - A comment line "// PRAGMA: On gocloud.dev, add a blank import: _ "example.com/foo"" // will add the blank import to the example's imports. // // The key of each JSON object entry will be the import path of the package, // followed by a dot ("."), followed by the name of the example function. The // value of each JSON object entry is an object like // {"imports": "import (\n\t\"fmt\"\n)", "code": "/* ... */"}. These are // separated so that templating can format or show them separately. package main import ( "encoding/json" "flag" "fmt" "go/ast" "go/format" "go/printer" "go/types" "os" "sort" "strconv" "strings" "golang.org/x/tools/go/packages" ) func main() { flag.Usage = func() { out := flag.CommandLine.Output() fmt.Fprintln(out, "usage: gatherexamples [options] DIR [...]") fmt.Fprintln(out) fmt.Fprintln(out, "Options:") flag.PrintDefaults() } pattern := flag.String("pattern", "./...", "Go package pattern to use at each directory argument") flag.Parse() if flag.NArg() == 0 { flag.Usage() os.Exit(2) // matches with flag package } // Load packages in each module named on the command line and find // all examples. allExamples := make(map[string]example) for _, dir := range flag.Args() { cfg := &packages.Config{ Mode: gatherLoadMode, Dir: dir, Tests: true, } pkgs, err := packages.Load(cfg, *pattern) if err != nil { fmt.Fprintf(os.Stderr, "gatherexamples: load %s: %v\n", dir, err) os.Exit(1) } examples, err := gather(pkgs) if err != nil { fmt.Fprintf(os.Stderr, "gatherexamples: gather: %v", err) os.Exit(1) } for exampleName, ex := range examples { allExamples[exampleName] = ex } } // Write all examples as a JSON object. data, err := json.MarshalIndent(allExamples, "", "\t") if err != nil { fmt.Fprintf(os.Stderr, "gatherexamples: generate JSON: %v\n", err) os.Exit(1) } data = append(data, '\n') if _, err := os.Stdout.Write(data); err != nil { fmt.Fprintf(os.Stderr, "gatherexamples: write output: %v\n", err) os.Exit(1) } } const gatherLoadMode packages.LoadMode = packages.NeedName | packages.NeedFiles | packages.NeedTypes | packages.NeedSyntax | packages.NeedTypesInfo | packages.NeedImports | // TODO(light): We really only need name from deps, but there's no way to // specify that in the current go/packages API. This sadly makes this program // 10x slower. Reported as https://github.com/golang/go/issues/31699. packages.NeedDeps // pragmaPrefix is the prefix for all comments in examples that are used as // directives for formatting. const pragmaPrefix = "// PRAGMA: " // inclusionComment is the comment used to signify whether the example should be // included in the output. const inclusionComment = pragmaPrefix + "This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored." type example struct { Imports string `json:"imports"` Code string `json:"code"` } // gather extracts the code from the example functions in the given packages // and returns a map like the one described in the package documentation. func gather(pkgs []*packages.Package) (map[string]example, error) { examples := make(map[string]example) for _, pkg := range pkgs { for _, file := range pkg.Syntax { for _, decl := range file.Decls { // Determine whether this declaration is an example function. fn, ok := decl.(*ast.FuncDecl) if !ok || !strings.HasPrefix(fn.Name.Name, "Example") || len(fn.Type.Params.List) > 0 { continue } // Format example into string. sb := new(strings.Builder) err := format.Node(sb, pkg.Fset, &printer.CommentedNode{ Node: fn.Body, Comments: file.Comments, }) if err != nil { return nil, err // will only occur for bad invocations of Fprint } original := sb.String() if !strings.Contains(original, inclusionComment) { // Does not contain the inclusion comment. Skip it, but first verify // that it doesn't contain any PRAGMA comments; only examples with // the inclusion comment should include pragmas. if strings.Contains(original, pragmaPrefix) { return nil, fmt.Errorf("%s in package %s has PRAGMA(s) for gatherexamples, but is not marked for inclusion with %q", fn.Name.Name, pkg.PkgPath, inclusionComment) } continue } exampleCode, blankImports := rewriteBlock(original) // Gather map of imported packages to overridden identifier. usedPackages := make(map[string]string) for _, path := range blankImports { usedPackages[path] = "_" } ast.Inspect(fn.Body, func(node ast.Node) bool { id, ok := node.(*ast.Ident) if !ok { return true } refPkg, ok := pkg.TypesInfo.ObjectOf(id).(*types.PkgName) if !ok { return true } overrideName := "" if id.Name != refPkg.Imported().Name() { overrideName = id.Name } usedPackages[refPkg.Imported().Path()] = overrideName return true }) // Remove "log" import since it's almost always used for log.Fatal(err). delete(usedPackages, "log") pkgPath := strings.TrimSuffix(pkg.PkgPath, "_test") exampleName := pkgPath + "." + fn.Name.Name examples[exampleName] = example{ Imports: formatImports(usedPackages), Code: exampleCode, } } } } return examples, nil } // rewriteBlock reformats a Go block statement for display as an example. // It also extracts any blank imports found func rewriteBlock(block string) (_ string, blankImports []string) { // Trim block. block = strings.TrimPrefix(block, "{") block = strings.TrimSuffix(block, "}") // Rewrite line-by-line. sb := new(strings.Builder) rewrite: for len(block) > 0 { var line string line, block = nextLine(block) // Dedent line. // TODO(light): In the case of a multi-line raw string literal, // this can produce incorrect rewrites. line = strings.TrimPrefix(line, "\t") // Write the line to sb, performing textual substitutions as needed. start := strings.IndexFunc(line, func(r rune) bool { return r != ' ' && r != '\t' }) if start == -1 { // Blank. sb.WriteString(line) sb.WriteByte('\n') continue } const importBlankPrefix = pragmaPrefix + "On gocloud.dev, add a blank import: _ " indent, lineContent := line[:start], line[start:] switch { case lineContent == pragmaPrefix+"On gocloud.dev, hide lines until the next blank line.": // Skip lines until we hit a blank line. for len(block) > 0 { var next string next, block = nextLine(block) if strings.TrimSpace(next) == "" { break } } case lineContent == pragmaPrefix+"On gocloud.dev, hide the rest of the function.": // Ignore remaining lines. break rewrite case lineContent == "log.Fatal(err)": sb.WriteString(indent) sb.WriteString("return err") sb.WriteByte('\n') case strings.HasPrefix(lineContent, importBlankPrefix): // Blank import. path, err := strconv.Unquote(lineContent[len(importBlankPrefix):]) if err == nil { blankImports = append(blankImports, path) } case strings.Contains(lineContent, inclusionComment): // inclusion comment. Skip it. default: // Ordinary line, write as-is. sb.WriteString(line) sb.WriteByte('\n') } } return strings.TrimSpace(sb.String()), blankImports } // nextLine splits the string at the next linefeed. func nextLine(s string) (line, tail string) { i := strings.IndexByte(s, '\n') if i == -1 { return s, "" } return s[:i], s[i+1:] } // formatImports formats a map of imports to their package identifiers into a // Go import declaration. func formatImports(usedPackages map[string]string) string { if len(usedPackages) == 0 { return "" } if len(usedPackages) == 1 { // Special case: one-line import. for path, id := range usedPackages { if id != "" { return fmt.Sprintf("import %s %q", id, path) } return fmt.Sprintf("import %q", path) } } // Typical case: multiple imports in factored declaration form. // Group into standard library imports then third-party imports. sortedStdlib := make([]string, 0, len(usedPackages)) sortedThirdParty := make([]string, 0, len(usedPackages)) for path := range usedPackages { if strings.ContainsRune(path, '.') { // Third-party imports almost always contain a dot for a domain name, // especially in GOPATH/Go modules workspaces. sortedThirdParty = append(sortedThirdParty, path) } else { sortedStdlib = append(sortedStdlib, path) } } sort.Strings(sortedStdlib) sort.Strings(sortedThirdParty) sb := new(strings.Builder) sb.WriteString("import (\n") printImports := func(paths []string) { for _, path := range paths { id := usedPackages[path] if id == "" { fmt.Fprintf(sb, "\t%q\n", path) } else { fmt.Fprintf(sb, "\t%s %q\n", id, path) } } } printImports(sortedStdlib) if len(sortedStdlib) > 0 && len(sortedThirdParty) > 0 { // Insert blank line to separate. sb.WriteByte('\n') } printImports(sortedThirdParty) sb.WriteString(")") return sb.String() } ================================================ FILE: internal/website/gatherexamples/gatherexamples_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package main import ( "testing" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "golang.org/x/tools/go/packages" "golang.org/x/tools/go/packages/packagestest" ) func TestGather(t *testing.T) { tests := []struct { name string module packagestest.Module want map[string]example wantErr bool }{ { name: "NoExamples", module: packagestest.Module{ Name: "example.com/foo", Files: map[string]any{ "foo.go": "package foo\nfunc main() {}\n", }, }, want: map[string]example{}, }, { name: "EmptyExample", module: packagestest.Module{ Name: "example.com/foo", Files: map[string]any{ "foo.go": "package foo\n", "example_test.go": `package foo_test func Example() {}`, }, }, want: map[string]example{}, }, { name: "EmptyExampleFoo", module: packagestest.Module{ Name: "example.com/foo", Files: map[string]any{ "foo.go": "package foo\n", "example_test.go": `package foo_test func ExampleFoo() { }`, }, }, want: map[string]example{}, }, { name: "NonSignifiedExampleWithPragma", module: packagestest.Module{ Name: "example.com/foo", Files: map[string]any{ "foo.go": "package foo\n", "example_test.go": `package foo_test func ExampleFoo() { // PRAGMA: Do something. }`, }, }, want: map[string]example{}, wantErr: true, }, { name: "EmptyExampleWithComment", module: packagestest.Module{ Name: "example.com/foo", Files: map[string]any{ "foo.go": "package foo\n", "example_test.go": `package foo_test func Example() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. }`, }, }, want: map[string]example{ "example.com/foo.Example": {Code: ""}, }, }, { name: "EmptyExampleFooWithComment", module: packagestest.Module{ Name: "example.com/foo", Files: map[string]any{ "foo.go": "package foo\n", "example_test.go": `package foo_test func ExampleFoo() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. }`, }, }, want: map[string]example{ "example.com/foo.ExampleFoo": {Code: ""}, }, }, { name: "NoImportsExample", module: packagestest.Module{ Name: "example.com/foo", Files: map[string]any{ "foo.go": "package foo\n", "example_test.go": `package foo_test func Example() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // Unattached comment. // Outside inner block comment. panic("ohai") if false { // something } return }`, }, }, want: map[string]example{ "example.com/foo.Example": {Code: "// Unattached comment.\n\n" + "// Outside inner block comment.\n" + "panic(\"ohai\")\n" + "if false {\n\t// something\n}\n" + "return"}, }, }, { name: "OneImportExample", module: packagestest.Module{ Name: "example.com/foo", Files: map[string]any{ "foo.go": "package foo\n", "example_test.go": `package foo_test import "fmt" func Example() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. fmt.Println(42) }`, }, }, want: map[string]example{ "example.com/foo.Example": { Imports: "import \"fmt\"", Code: "fmt.Println(42)", }, }, }, { name: "TwoImportsExample", module: packagestest.Module{ Name: "example.com/foo", Files: map[string]any{ "foo.go": "package foo\n", "example_test.go": `package foo_test import "fmt" import "math" func Example() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. fmt.Println(math.Pi) }`, }, }, want: map[string]example{ "example.com/foo.Example": { Imports: "import (\n\t\"fmt\"\n\t\"math\"\n)", Code: "fmt.Println(math.Pi)", }, }, }, { name: "LogFatalToReturnErr", module: packagestest.Module{ Name: "example.com/foo", Files: map[string]any{ "foo.go": "package foo\n", "example_test.go": `package foo_test import "log" func Example() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. var err error if err != nil { log.Fatal(err) } }`, }, }, want: map[string]example{ "example.com/foo.Example": {Code: "var err error\n" + "if err != nil {\n\treturn err\n}"}, }, }, { name: "IgnoreSections", module: packagestest.Module{ Name: "example.com/foo", Files: map[string]any{ "foo.go": "package foo\n", "example_test.go": `package foo_test import "context" func Example() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // do something // PRAGMA: On gocloud.dev, hide the rest of the function. _ = ctx }`, }, }, want: map[string]example{ "example.com/foo.Example": { Imports: "import \"context\"", Code: "// do something", }, }, }, { name: "BlankImports", module: packagestest.Module{ Name: "example.com/foo", Files: map[string]any{ "foo.go": "package foo\n", "example_test.go": `package foo_test func Example() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "example.com/bar" _ = 42 }`, }, }, want: map[string]example{ "example.com/foo.Example": { Imports: "import _ \"example.com/bar\"", Code: "_ = 42", }, }, }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { exported := packagestest.Export(t, packagestest.Modules, []packagestest.Module{test.module}) defer exported.Cleanup() exported.Config.Mode = gatherLoadMode pkgs, err := packages.Load(exported.Config, "./...") if err != nil { t.Fatal(err) } got, err := gather(pkgs) if (err != nil) != test.wantErr { t.Errorf("gather(pkgs) got err %v want err? %v", err, test.wantErr) } if diff := cmp.Diff(test.want, got, cmpopts.EquateEmpty()); diff != "" { t.Errorf("gather(pkgs) diff (-want +got):\n%s", diff) } }) } } func TestFormatImports(t *testing.T) { tests := []struct { name string usedPackages map[string]string want string }{ { name: "Empty", usedPackages: nil, want: "", }, { name: "One", usedPackages: map[string]string{"fmt": ""}, want: "import \"fmt\"", }, { name: "Two", usedPackages: map[string]string{ "fmt": "", "log": "", }, want: "import (\n\t\"fmt\"\n\t\"log\"\n)", }, { name: "Renamed", usedPackages: map[string]string{ "fmt": "zzz", "log": "aaa", }, want: "import (\n\tzzz \"fmt\"\n\taaa \"log\"\n)", }, { name: "StdlibSeparateFromThirdParty", usedPackages: map[string]string{ "context": "", "fmt": "", "log": "", "github.com/google/go-cmp/cmp": "", "gocloud.dev/blob": "", }, want: "import (\n" + "\t\"context\"\n" + "\t\"fmt\"\n" + "\t\"log\"\n" + "\n" + "\t\"github.com/google/go-cmp/cmp\"\n" + "\t\"gocloud.dev/blob\"\n" + ")", }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { got := formatImports(test.usedPackages) if got != test.want { t.Errorf("formatImports(%+v) =\n%s\n// want:\n%s", test.usedPackages, got, test.want) } }) } } ================================================ FILE: internal/website/gatherexamples/run.sh ================================================ #!/usr/bin/env bash # Copyright 2019 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Run gatherexamples for the project. # The output of this script should be piped into # internal/website/data/examples.json, where it's picked up by Hugo. set -eo pipefail cd "$(dirname "${BASH_SOURCE[0]}")/../../.." cd internal/website/gatherexamples go build gatherexamples.go cd ../../.. sed -e '/^#/d' -e '/^$/d' allmodules | awk '{print $1}' | xargs internal/website/gatherexamples/gatherexamples ================================================ FILE: internal/website/go.mod ================================================ module gocloud.dev/internal/website go 1.25.0 require ( github.com/google/go-cmp v0.6.0 golang.org/x/tools v0.43.0 golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated ) require ( golang.org/x/mod v0.34.0 // indirect golang.org/x/sync v0.20.0 // indirect golang.org/x/tools/go/expect v0.1.0-deprecated // indirect ) ================================================ FILE: internal/website/go.sum ================================================ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= golang.org/x/mod v0.34.0 h1:xIHgNUUnW6sYkcM5Jleh05DvLOtwc6RitGHbDk4akRI= golang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY= golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/tools v0.43.0 h1:12BdW9CeB3Z+J/I/wj34VMl8X+fEXBxVR90JeMX5E7s= golang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0= golang.org/x/tools/go/expect v0.1.0-deprecated h1:jY2C5HGYR5lqex3gEniOQL0r7Dq5+VGVgY1nudX5lXY= golang.org/x/tools/go/expect v0.1.0-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM= golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated/go.mod h1:RVAQXBGNv1ib0J382/DPCRS/BPnsGebyM1Gj5VSDpG8= ================================================ FILE: internal/website/layouts/404.html ================================================ {{ define "main" }}

404: Page not found

Sorry, we've misplaced that URL or it's pointing to something that doesn't exist. Head back home to try finding it again.

{{ end }} ================================================ FILE: internal/website/layouts/_default/baseof.html ================================================ {{ .Hugo.Generator }} {{ if .IsHome -}} {{ .Site.Title }} {{- else -}} {{ .Title }} · {{ .Site.Title }} {{- end }} {{- range .AlternativeOutputFormats }} {{- end }} {{- if .Page.Params.pkgmeta }} {{- end }} {{ template "_internal/google_analytics_async.html" . }}
{{- block "main" .}}{{end -}}
================================================ FILE: internal/website/layouts/_default/li.html ================================================ ================================================ FILE: internal/website/layouts/_default/list.html ================================================ {{ define "main" -}}

{{ .Title }}

{{ partial "page-toc.html" . }} {{ partial "header-link.html" .Content }} {{ with .Data.Pages.GroupBy "Weight" }}
{{- range .}} {{- range .Pages.ByTitle}} {{.Render "li"}} {{- end }} {{- end }}
{{end}} {{- end }} ================================================ FILE: internal/website/layouts/_default/single.html ================================================ {{ define "main" -}}

{{ .Title }}

{{ partial "page-toc.html" . }} {{ partial "header-link.html" .Content }} {{- end }} ================================================ FILE: internal/website/layouts/_default/sitemap.xml ================================================ {{ printf "" | safeHTML }} {{ range sort .Data.Pages "Permalink" }} {{ .Permalink }}{{ if not .Lastmod.IsZero }} {{ safeHTML ( .Lastmod.Format "2006-01-02T15:04:05-07:00" ) }}{{ end }}{{ with .Sitemap.ChangeFreq }} {{ . }}{{ end }}{{ if ge .Sitemap.Priority 0.0 }} {{ .Sitemap.Priority }}{{ end }}{{ if .IsTranslated }}{{ range .Translations }} {{ end }} {{ end }} {{ end }} ================================================ FILE: internal/website/layouts/howto/li.html ================================================
  • {{ .LinkTitle }}
  • ================================================ FILE: internal/website/layouts/howto/list.html ================================================ {{ define "main" -}}

    {{ .Title }}

    {{ partial "page-toc.html" . }} {{ partial "header-link.html" .Content }} {{ if or .Data.Pages }}
      {{- range .Data.Pages.GroupBy "Weight" }} {{- range .ByTitle }} {{.Render "li"}} {{- end }} {{- end }}
    {{- end }} {{- end }} ================================================ FILE: internal/website/layouts/index.html ================================================ {{ define "main" -}} {{ partial "header-link.html" .Content }} {{- end }} ================================================ FILE: internal/website/layouts/partials/header-link.html ================================================ {{- /* https://zwbetz.com/create-header-links-hugo-vs-javascript/ */ -}} {{ . | replaceRE "()(.+)()" `${1} ${3}🔗${4}` | safeHTML -}} ================================================ FILE: internal/website/layouts/partials/hook_head_end.html ================================================ {{if .Page.Params.pkgmeta}} {{end}} ================================================ FILE: internal/website/layouts/partials/page-toc.html ================================================ {{if .Page.Params.toc}} {{end -}} ================================================ FILE: internal/website/layouts/pkg/list.html ================================================ Nothing to see here; see the package on godoc. ================================================ FILE: internal/website/layouts/pkg/single.html ================================================ Nothing to see here; see the package on godoc. ================================================ FILE: internal/website/layouts/shortcodes/goexample.html ================================================ {{/* Usage: goexample "gocloud.dev/foo.ExampleBar" goexample src="gocloud.dev/foo.ExampleBar" goexample src="gocloud.dev/foo.ExampleBar" imports="0" */ -}} {{ if .IsNamedParams -}} {{ with index .Site.Data.examples (.Get "src") -}} {{ if and .imports (ne ($.Get "imports") "0") -}} {{ highlight (printf "%s\n\n%s\n" .imports .code) "go" "" -}} {{ else -}} {{ highlight (printf "%s\n" .code) "go" "" -}} {{ end -}} {{ else -}} {{ errorf "%s: Example %q does not exist" ($.Page.File.Path) (.Get "src") -}} {{end -}} {{ else -}} {{ with index .Site.Data.examples (.Get 0) -}} {{ if .imports -}} {{ highlight (printf "%s\n\n%s\n" .imports .code) "go" "" -}} {{ else -}} {{ highlight (printf "%s\n" .code) "go" "" -}} {{ end -}} {{ else -}} {{ errorf "%s: Example %q does not exist" ($.Page.File.Path) (.Get 0) -}} {{end -}} {{ end -}} ================================================ FILE: internal/website/layouts/shortcodes/snippet.html ================================================ {{ readFile (.Get 0 | printf "/snippets/%s") | markdownify -}} ================================================ FILE: internal/website/listnewpkgs.sh ================================================ #!/usr/bin/env bash # Copyright 2019 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # This script lists the package names that makeimports.sh would create # _index.md files for, one per line. # https://coderwall.com/p/fkfaqq/safer-bash-scripts-with-set-euxo-pipefail # except x is too verbose set -euo pipefail # Change into repository root. cd "$(dirname "$0")/../.." OUTDIR=internal/website/content shopt -s nullglob # glob patterns that don't match turn into the empty string, instead of themselves function files_exist() { # assumes nullglob [[ ${1:-""} != "" ]] } # Find all directories that do not begin with '.' or '_' or contain 'testdata'. Use the %P printf # directive to remove the initial './'. for pkg in $(find . -type d \( -name '[._]?*' -prune -o -name testdata -prune -o -printf '%P ' \)); do # Only consider directories that contain Go source files. outfile="$OUTDIR/$pkg/_index.md" if files_exist $pkg/*.go && [[ ! -e "$outfile" ]]; then echo "$pkg" fi done ================================================ FILE: internal/website/makeimports.sh ================================================ #!/usr/bin/env bash # Copyright 2018 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # This script generates Markdown files that will include suitable for # "go get"'s import path redirection feature (see # https://golang.org/cmd/go/#hdr-Remote_import_paths) in the final Hugo output. # https://coderwall.com/p/fkfaqq/safer-bash-scripts-with-set-euxo-pipefail # except x is too verbose set -euo pipefail # Change into repository root. cd "$(dirname "$0")/../.." OUTDIR=internal/website/content for pkg in $(internal/website/listnewpkgs.sh); do # Only consider directories that contain Go source files. outfile="$OUTDIR/$pkg/_index.md" mkdir -p "$OUTDIR/$pkg" echo "Generating gocloud.dev/$pkg" echo "---" >> "$outfile" echo "title: gocloud.dev/$pkg" >> "$outfile" echo "type: pkg" >> "$outfile" echo "---" >> "$outfile" done ================================================ FILE: internal/website/static/css/style.css ================================================ /* Copyright 2019 The Go Cloud Development Kit Authors Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ /* Basic layout {{{1 */ html { font: 14px/1.5 'Roboto', sans-serif; margin: 0; padding: 0; } @media (min-width: 768px) { html { font-size: 16px; } } body { background: #fff; color: #000; margin: 0; padding: 0; } .PageLayout { display: grid; grid-template-columns: 15rem 1fr; grid-template-rows: minmax(4rem, auto) 1fr minmax(4rem, auto); grid-template-areas: 'hd hd' 'sd main' 'ft ft'; margin: 0; min-height: 100vh; padding: 0; width: 100vw; } @media (max-width: 768px) { .PageLayout { grid-template-columns: 100%; grid-template-areas: 'hd' 'main' 'sd' 'ft'; } } .PageHeader { background: #00add8; grid-area: hd; margin: 0; padding: 0; } .PageLogo { box-sizing: border-box; margin: 0 auto; padding: 1.25rem 0; text-align: center; width: 20rem; } .PageLogo-image { height: 80px; } @media (max-width: 768px) { .PageLogo-image { height: 72px; } } .MainContent { box-sizing: border-box; grid-area: main; margin: 0; overflow-x: hidden; /* creates a new block formatting context for children overflows */ padding: 2rem 2rem 3rem; } .MainContent-bounds { box-sizing: border-box; margin: 0; padding: 0; max-width: 50rem; } .Sidenav { background: #dbd9d6; box-sizing: border-box; font-family: 'Work Sans', 'Roboto', sans-serif; font-size: 0.8rem; grid-area: sd; margin: 0; padding: 1rem 2rem 2rem 1rem; } .Sidenav-list { margin: 0; padding: 0; list-style: none; } .Sidenav-pageList { margin: 0 0 0 2rem; padding: 0; list-style: none; } .Sidenav-section { margin: 0.5rem 0 0; padding: 0; } .Sidenav-sectionLink { color: #000; font-weight: bold; text-decoration: none; } .Sidenav-page { margin: 0.3rem 0 0; padding: 0; } .Sidenav-pageLink { color: #000; font-weight: normal; text-decoration: none; } .Sidenav-sectionLink:hover, .Sidenav-sectionLink:active, .Sidenav-pageLink:hover, .Sidenav-pageLink:active { text-decoration: underline; } .PageTOC { border-left: 2px solid #dbd9d6; float: right; margin: 0.25rem 0 1rem 2rem; max-width: 25%; min-width: 15%; padding: 0.5rem 0 0.5rem 1rem; } @media (max-width: 1024px) { .PageTOC { border: none; float: none; margin: 1.5rem 0 0.5rem; max-width: none; min-width: none; padding: 0; } } .PageTOC { font-size: 0.85rem; } .PageTOC-heading { font: 700 1rem/1.25 'Work Sans', 'Roboto', sans-serif; margin: 0 0 0.5rem; text-rendering: optimizeLegibility; } .PageTOC>nav>ul>li>ul { /* Don't indent top-level list. */ margin: 0; } .PageTOC ul { list-style: none; margin: 0 0 0 1rem; padding: 0; } .PageTOC li { margin: 0.3rem 0; padding: 0; } .PageTOC>nav>ul { /* CSS trick to remove h1 level from TOC. * https://github.com/gohugoio/hugo/issues/1778 */ display: block; margin: 0; padding: 0; } .PageTOC>nav>ul>li { /* CSS trick to remove h1 level from TOC. * https://github.com/gohugoio/hugo/issues/1778 */ display: block; margin: 0; padding: 0; } .PageFooter { background: #555759; box-sizing: border-box; color: #ffffff; font-size: 0.95rem; grid-area: ft; line-height: 1; margin: 0; padding: 2rem 2rem 1rem; } .PageFooter-paragraph { margin: 1em auto; max-width: 40rem; text-align: justify; } .PageFooter-link { color: #ffffff; text-decoration: underline; } .FooterLinks { box-sizing: border-box; font-size: 1rem; line-height: 1.5; list-style: none; margin: 0 auto 2rem; padding: 0; max-width: 40rem; } .FooterLinks-item { margin: 0; padding: 0; text-align: justify; } .FooterLinks-link { color: #9eecff; text-decoration: none; } .FooterLinks-link:hover, .FooterLinks-link:active { text-decoration: underline; } .PageList { box-sizing: border-box; display: grid; grid-auto-rows: fit-content(5rem); grid-template-columns: repeat(2, minmax(15rem, 1fr)); margin: 0; padding: 0; } @media (max-width: 768px) { .PageList { grid-template-columns: minmax(15rem, 1fr); } } .PageList-item { box-sizing: border-box; display: flex; flex-direction: column; margin: 0 0.5rem; padding: 0 1rem; place-content: start; } .PageList-itemTitle { color: #000; } .PageList-summary { flex: 1; margin: 0; padding: 0; } .PageList-readMore { margin: 1rem 0 0; padding: 0; } .HowtoList { font: 300 1.5rem/1.25 'Roboto', sans-serif; margin: 1rem 0 0; padding: 0; } .HowtoList-item { margin: 0.5rem 0 0.5rem 2rem; padding: 0; } /* Content styling {{{1 */ /* Headings */ .MainContent h1 { font: 700 2rem/1.25 'Work Sans', 'Roboto', sans-serif; margin: 0 0 0.5rem; text-rendering: optimizeLegibility; } .MainContent h2 { font: 700 1.5rem/1.25 'Work Sans', 'Roboto', sans-serif; margin: 2rem 0 0.5rem; text-rendering: optimizeLegibility; } .MainContent h3 { font: 700 1.25rem/1.25 'Work Sans', 'Roboto', sans-serif; margin: 3rem 0 0.5rem; text-rendering: optimizeLegibility; } .MainContent h4, .MainContent h5, .MainContent h6 { font: 700 1rem/1.25 'Work Sans', 'Roboto', sans-serif; margin: 2rem 0 0.5rem; text-rendering: optimizeLegibility; } .MainContent h1 .anchor, .MainContent h2 .anchor, .MainContent h3 .anchor, .MainContent h4 .anchor, .MainContent h5 .anchor, .MainContent h6 .anchor { display: none; font-size: 1rem; margin: 0 0.2rem; } .MainContent h1 :link:hover, .MainContent h2 :link:hover, .MainContent h3 :link:hover, .MainContent h4 :link:hover, .MainContent h5 :link:hover, .MainContent h6 :link:hover { text-decoration: none; } .MainContent h1:hover .anchor, .MainContent h2:hover .anchor, .MainContent h3:hover .anchor, .MainContent h4:hover .anchor, .MainContent h5:hover .anchor, .MainContent h6:hover .anchor { display: inline; } /* Code */ .MainContent code { font-size: 85%; font-family: 'Source Code Pro', monospace; } .MainContent pre { box-sizing: border-box; background: #f9f9f9; border-radius: 4px; display: block; font: 0.8rem/1.4 'Source Code Pro', monospace; margin: 0 0 1rem; overflow-x: auto; padding: 1rem; white-space: pre; width: 100%; } .MainContent pre code { font-size: 100%; } .highlight { box-sizing: border-box; margin: 0; padding: 0; width: 100%; } /* Figures */ .FullWidthFigure { border: thin solid #dbd9d6; border-radius: 4px; margin: 1rem 0; padding: 0.5rem 0; } .FullWidthFigure img { width: 100%; } /* Links */ .MainContent :link { color: #00758d; text-decoration: none; } .MainContent :visited { color: #00758d; text-decoration: none; } .MainContent :link:hover, .MainContent :link:focus, .MainContent :visited:hover, .MainContent :visited:focus { text-decoration: underline; } ================================================ FILE: internal/website/static/css/syntax.css ================================================ /* Keyword */ .chroma .k { color: #00758d; font-weight: bold } /* KeywordConstant */ .chroma .kc { color: #00758d; font-weight: bold } /* KeywordDeclaration */ .chroma .kd { color: #00758d; font-weight: bold } /* KeywordNamespace */ .chroma .kn { color: #00758d; font-weight: bold } /* KeywordPseudo */ .chroma .kp { color: #00758d } /* KeywordReserved */ .chroma .kr { color: #00758d; font-weight: bold } /* KeywordType */ .chroma .kt { color: #00758d } /* NameBuiltin */ .chroma .nb { color: #00758d } /* LiteralString */ .chroma .s { color: #ce3262 } /* LiteralStringAffix */ .chroma .sa { color: #ce3262 } /* LiteralStringBacktick */ .chroma .sb { color: #ce3262 } /* LiteralStringChar */ .chroma .sc { color: #ce3262 } /* LiteralStringDelimiter */ .chroma .dl { color: #ce3262 } /* LiteralStringDoc */ .chroma .sd { color: #ce3262; font-style: italic } /* LiteralStringDouble */ .chroma .s2 { color: #ce3262 } /* LiteralStringEscape */ .chroma .se { color: #ce3262; font-weight: bold } /* LiteralStringHeredoc */ .chroma .sh { color: #ce3262 } /* LiteralStringInterpol */ .chroma .si { color: #ce3262; font-style: italic } /* LiteralStringOther */ .chroma .sx { color: #ce3262 } /* LiteralStringRegex */ .chroma .sr { color: #ce3262 } /* LiteralStringSingle */ .chroma .s1 { color: #ce3262 } /* LiteralStringSymbol */ .chroma .ss { color: #ce3262 } /* LiteralNumber */ .chroma .m { color: #ce3262 } /* LiteralNumberBin */ .chroma .mb { color: #ce3262 } /* LiteralNumberFloat */ .chroma .mf { color: #ce3262 } /* LiteralNumberHex */ .chroma .mh { color: #ce3262 } /* LiteralNumberInteger */ .chroma .mi { color: #ce3262 } /* LiteralNumberIntegerLong */ .chroma .il { color: #ce3262 } /* LiteralNumberOct */ .chroma .mo { color: #ce3262 } /* Comment */ .chroma .c { color: #555759; font-style: italic } /* CommentHashbang */ .chroma .ch { color: #555759; font-style: italic } /* CommentMultiline */ .chroma .cm { color: #555759; font-style: italic } /* CommentSingle */ .chroma .c1 { color: #555759; font-style: italic } /* CommentSpecial */ .chroma .cs { color: #555759; font-style: italic } /* CommentPreproc */ .chroma .cp { color: #555759; font-style: italic } /* CommentPreprocFile */ .chroma .cpf { color: #555759; font-style: italic } /* GenericDeleted */ .chroma .gd { color: #a00000 } /* GenericEmph */ .chroma .ge { font-style: italic } /* GenericError */ .chroma .gr { color: #ff0000 } /* GenericHeading */ .chroma .gh { font-weight: bold } /* GenericInserted */ .chroma .gi { color: #00a000 } /* GenericPrompt */ .chroma .gp { font-weight: bold } /* GenericStrong */ .chroma .gs { font-weight: bold } /* GenericSubheading */ .chroma .gu { font-weight: bold } /* GenericUnderline */ .chroma .gl { text-decoration: underline } ================================================ FILE: mysql/awsmysql/awsmysql.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package awsmysql provides connections to AWS RDS MySQL instances. // // # URLs // // For mysql.Open, awsmysql registers for the scheme "awsmysql". // The default URL opener will create a connection using the default // credentials from the environment, as described in // https://docs.aws.amazon.com/sdk-for-go/api/aws/session/. // To customize the URL opener, or for more details on the URL format, // see URLOpener. // // See https://gocloud.dev/concepts/urls/ for background information. package awsmysql // import "gocloud.dev/mysql/awsmysql" import ( "context" "crypto/tls" "database/sql" "database/sql/driver" "fmt" "net/http" "net/url" "github.com/XSAM/otelsql" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/credentials/stscreds" "github.com/aws/aws-sdk-go-v2/feature/rds/auth" "github.com/aws/aws-sdk-go-v2/service/sts" "github.com/go-sql-driver/mysql" "github.com/google/wire" "gocloud.dev/aws/rds" gcmysql "gocloud.dev/mysql" ) // Set is a Wire provider set that provides a *sql.DB given // *Params and an HTTP client. var Set = wire.NewSet( wire.Struct(new(URLOpener), "CertSource", "HTTPClient"), rds.CertFetcherSet, ) // URLOpener opens RDS MySQL URLs // like "awsmysql://user:password@myinstance.borkxyzzy.us-west-1.rds.amazonaws.com:3306/mydb". // // To use IAM authentication, omit the password: // // awsmysql://iam-user@myinstance.borkxyzzy.us-west-1.rds.amazonaws.com:3306/mydb // // To specify an AWS profile or assume a role, add the following query parameters: // // - aws_profile: the AWS shared config profile to use // - aws_role_arn: the ARN of the role to assume type URLOpener struct { // HTTPClient is the HTTP client used to fetch RDS certificates, // and IAM authentication tokens. HTTPClient *http.Client // CertSource specifies how the opener will obtain the RDS Certificate // Authority. If nil, it will use the default *rds.CertFetcher. CertSource rds.CertPoolProvider // TraceOpts contains options for OpenTelemetry. TraceOpts []otelsql.Option } // Scheme is the URL scheme awsmysql registers its URLOpener under on // mysql.DefaultMux. const Scheme = "awsmysql" func init() { gcmysql.DefaultURLMux().RegisterMySQL(Scheme, &URLOpener{}) } // OpenMySQLURL opens a new RDS database connection wrapped with OpenTelemetry instrumentation. func (uo *URLOpener) OpenMySQLURL(ctx context.Context, u *url.URL) (*sql.DB, error) { source := uo.CertSource if source == nil { source = &rds.CertFetcher{Client: uo.HTTPClient} } if u.Host == "" { return nil, fmt.Errorf("open OpenMySQLURL: empty endpoint") } // If no password provided, assume it's AWS IAM authentication. // awsmysql://iam-user@host:port/dbname var iam func(context.Context) (string, error) if _, ok := u.User.Password(); !ok { var ( q = u.Query() profile = q.Get("aws_profile") ) q.Del("aws_profile") cfg, err := config.LoadDefaultConfig(ctx, config.WithHTTPClient(uo.HTTPClient), // Ignored if nil. config.WithSharedConfigProfile(profile)) // Ignored if empty. if err != nil { return nil, fmt.Errorf("open OpenMySQLURL: load AWS config: %v", err) } creds := cfg.Credentials if roleARN := q.Get("aws_role_arn"); roleARN != "" { // If a RoleARN is specified, replace the credentials with AssumeRole provider. creds = stscreds.NewAssumeRoleProvider(sts.NewFromConfig(cfg), roleARN) q.Del("aws_role_arn") } u.RawQuery = q.Encode() creds = aws.NewCredentialsCache(creds) iam = func(ctx context.Context) (string, error) { // BuildAuthToken is local-operation // and does not make network calls. // The credentials provider may make network calls, // but we are wrapped it with caching. return auth.BuildAuthToken(ctx, u.Host, cfg.Region, u.User.Username(), creds) } } cfg, err := gcmysql.ConfigFromURL(u) if err != nil { return nil, err } c := &connector{ cfg: cfg, iam: iam, provider: source, sem: make(chan struct{}, 1), ready: make(chan struct{}), } c.sem <- struct{}{} return otelsql.OpenDB(c, uo.TraceOpts...), nil } type connector struct { sem chan struct{} // receive to acquire, send to release provider CertPoolProvider ready chan struct{} // closed after resolving dsn cfg *mysql.Config iam func(context.Context) (string, error) } func (c *connector) Connect(ctx context.Context) (driver.Conn, error) { select { case <-c.sem: certPool, err := c.provider.RDSCertPool(ctx) if err != nil { c.sem <- struct{}{} // release return nil, fmt.Errorf("connect RDS: %v", err) } c.cfg.TLS = &tls.Config{RootCAs: certPool} close(c.ready) // Don't release sem: make it block forever, so this case won't be run again. case <-c.ready: // Already succeeded. case <-ctx.Done(): return nil, fmt.Errorf("connect RDS: waiting for certificates: %v", ctx.Err()) } cfg := c.cfg.Clone() if c.iam != nil { var err error if cfg.Passwd, err = c.iam(ctx); err != nil { return nil, fmt.Errorf("connect RDS: refresh auth token: %v", err) } } inner, err := mysql.NewConnector(cfg) if err != nil { return nil, fmt.Errorf("connect RDS: create connector: %v", err) } return inner.Connect(ctx) } func (c *connector) Driver() driver.Driver { return mysql.MySQLDriver{} } // A CertPoolProvider obtains a certificate pool that contains the RDS CA certificate. type CertPoolProvider = rds.CertPoolProvider // CertFetcher pulls the RDS CA certificates from Amazon's servers. The zero // value will fetch certificates using the default HTTP client. type CertFetcher = rds.CertFetcher ================================================ FILE: mysql/awsmysql/awsmysql_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package awsmysql import ( "context" "fmt" "testing" "gocloud.dev/internal/testing/terraform" "gocloud.dev/mysql" ) func TestOpen(t *testing.T) { // This test will be skipped unless the project is set up with Terraform. // Before running go test, run in this directory: // // terraform init // terraform apply tfOut, err := terraform.ReadOutput(".") if err != nil || len(tfOut) == 0 { t.Skipf("Could not obtain harness info: %v", err) } endpoint, _ := tfOut["endpoint"].Value.(string) username, _ := tfOut["username"].Value.(string) password, _ := tfOut["password"].Value.(string) databaseName, _ := tfOut["database"].Value.(string) if endpoint == "" || username == "" || databaseName == "" { t.Fatalf("Missing one or more required Terraform outputs; got endpoint=%q username=%q database=%q", endpoint, username, databaseName) } ctx := context.Background() urlstr := fmt.Sprintf("awsmysql://%s:%s@%s/%s", username, password, endpoint, databaseName) t.Log("Connecting to:", urlstr) db, err := mysql.Open(ctx, urlstr) if err != nil { t.Fatal(err) } if err := db.Ping(); err != nil { t.Error("Ping:", err) } if err := db.Close(); err != nil { t.Error("Close:", err) } } func TestOpenIAM(t *testing.T) { // This test will be skipped unless the project is set up with Terraform. // Before running go test, run in this directory: // // terraform init // terraform apply tfOut, err := terraform.ReadOutput(".") if err != nil || len(tfOut) == 0 { t.Skipf("Could not obtain harness info: %v", err) } endpoint, _ := tfOut["endpoint"].Value.(string) username, _ := tfOut["iam_db_username"].Value.(string) roleARN, _ := tfOut["iam_role_arn"].Value.(string) databaseName, _ := tfOut["database"].Value.(string) if endpoint == "" || username == "" || databaseName == "" { t.Fatalf("Missing one or more required Terraform outputs; got endpoint=%q iam_db_username=%q database=%q", endpoint, username, databaseName) } ctx := context.Background() urlstr := fmt.Sprintf("awsmysql://%s@%s/%s?aws_role_arn=%s", username, endpoint, databaseName, roleARN) t.Log("Connecting to:", urlstr) db, err := mysql.Open(ctx, urlstr) if err != nil { t.Fatal(err) } if err := db.Ping(); err != nil { t.Error("Ping:", err) } if err := db.Close(); err != nil { t.Error("Close:", err) } } ================================================ FILE: mysql/awsmysql/example_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package awsmysql_test import ( "context" "log" "gocloud.dev/mysql" _ "gocloud.dev/mysql/awsmysql" ) func Example() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/mysql/awsmysql" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // Replace these with your actual settings. db, err := mysql.Open(ctx, "awsmysql://myrole:swordfish@example01.xyzzy.us-west-1.rds.amazonaws.com/testdb") if err != nil { log.Fatal(err) } defer db.Close() // Use database in your program. db.ExecContext(ctx, "CREATE TABLE foo (bar INT);") } ================================================ FILE: mysql/awsmysql/main.tf ================================================ # Copyright 2018 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Harness for MySQL tests. terraform { required_version = "~>1.13.2" required_providers { aws = { source = "hashicorp/aws" version = "~> 6.0" } random = { source = "hashicorp/random" } } } provider "aws" { region = var.region } provider "random" { } variable "region" { type = string description = "Region to create resources in. See https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.RegionsAndAvailabilityZones.html for valid values." } resource "aws_security_group" "main" { name_prefix = "testdb" description = "Security group for the Go CDK MySQL test database." ingress { from_port = 3306 to_port = 3306 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] description = "Public MySQL access" } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] description = "All outgoing traffic allowed" } } resource "random_string" "db_password" { keepers = { region = var.region } special = false length = 20 } locals { iamUser = "iam-user" } resource "aws_db_instance" "main" { identifier_prefix = "go-cloud-test" engine = "mysql" engine_version = "8.0.43" instance_class = "db.t3.micro" allocated_storage = 20 username = "root" password = random_string.db_password.result db_name = "testdb" publicly_accessible = true vpc_security_group_ids = [aws_security_group.main.id] skip_final_snapshot = true iam_database_authentication_enabled = true } # Data source to get current AWS account information data "aws_caller_identity" "current" {} # IAM Role that can be assumed to connect to the database resource "aws_iam_role" "rds_connect" { name_prefix = "rds-connect-" assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [ { Action = "sts:AssumeRole" Effect = "Allow" Principal = { AWS = data.aws_caller_identity.current.arn } } ] }) } # IAM Policy to allow RDS connection using IAM authentication resource "aws_iam_policy" "rds_connect" { name_prefix = "rds-connect-" description = "Allow connecting to RDS MySQL instance using IAM authentication" policy = jsonencode({ Version = "2012-10-17" Statement = [ { Effect = "Allow" Action = [ "rds-db:connect" ] Resource = format("arn:aws:rds-db:%s:%s:dbuser:%s/%s", var.region, data.aws_caller_identity.current.account_id, aws_db_instance.main.resource_id, local.iamUser, ) } ] }) } # Attach the policy to the role resource "aws_iam_role_policy_attachment" "rds_connect" { role = aws_iam_role.rds_connect.name policy_arn = aws_iam_policy.rds_connect.arn } # Automatically create the IAM database user resource "null_resource" "create_iam_user" { depends_on = [aws_db_instance.main] provisioner "local-exec" { command = <<-EOT docker run --rm mysql:8.0 \ mysql -h ${split(":", aws_db_instance.main.endpoint)[0]} \ -P ${split(":", aws_db_instance.main.endpoint)[1]} \ -u ${aws_db_instance.main.username} \ -p${random_string.db_password.result} \ -e "CREATE USER IF NOT EXISTS '${local.iamUser}' IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS'; GRANT ALL PRIVILEGES ON ${aws_db_instance.main.db_name}.* TO 'iam-user'@'%'; FLUSH PRIVILEGES;" EOT } triggers = { endpoint = aws_db_instance.main.endpoint } } output "endpoint" { value = aws_db_instance.main.endpoint description = "The RDS instance's host/port." } output "username" { value = "root" description = "The MySQL username to connect with." } output "password" { value = random_string.db_password.result sensitive = true description = "The RDS instance password for the user." } output "database" { value = "testdb" description = "The name of the database inside the RDS instance." } output "iam_role_arn" { value = aws_iam_role.rds_connect.arn description = "The ARN of the IAM role that can connect to the database" } output "iam_db_username" { value = local.iamUser description = "The IAM database username to use for IAM authentication" } ================================================ FILE: mysql/awsmysql/otel_test.go ================================================ // Copyright 2019-2025 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package awsmysql_test import ( "context" "fmt" "log/slog" "testing" "time" "github.com/google/go-cmp/cmp" "go.opentelemetry.io/otel/attribute" "gocloud.dev/internal/testing/oteltest" "gocloud.dev/internal/testing/terraform" "gocloud.dev/mysql" ) func TestOpenTelemetry(t *testing.T) { // This test will be skipped unless the project is set up with Terraform. // Before running go test, run in this directory: // // terraform init // terraform apply tfOut, err := terraform.ReadOutput(".") if err != nil || len(tfOut) == 0 { t.Skipf("Could not obtain harness info: %v", err) } endpoint, _ := tfOut["endpoint"].Value.(string) username, _ := tfOut["iam_db_username"].Value.(string) roleARN, _ := tfOut["iam_role_arn"].Value.(string) databaseName, _ := tfOut["database"].Value.(string) if endpoint == "" || username == "" || databaseName == "" { t.Fatalf("Missing one or more required Terraform outputs; got endpoint=%q iam_db_username=%q database=%q", endpoint, username, databaseName) } ctx := context.Background() // Setup the test exporter for both trace and metrics. te := oteltest.NewTestExporter(t, nil) defer te.Shutdown(ctx) // Open the database with otelsql. urlstr := fmt.Sprintf("awsmysql://%s@%s/%s?parseTime=true&aws_role_arn=%s", username, endpoint, databaseName, roleARN) t.Log("Connecting to:", urlstr) db, err := mysql.Open(ctx, urlstr) if err != nil { t.Fatal(err) } defer db.Close() query := func() error { rows, err := db.QueryContext(ctx, `SELECT CURRENT_TIMESTAMP`) if err != nil { return err } defer func() { _ = rows.Close() }() var currentTime time.Time for rows.Next() { err = rows.Scan(¤tTime) if err != nil { return err } } // Check for errors from iterating over rows if err = rows.Err(); err != nil { return err } slog.Info("Current time", "time", currentTime) return nil } if err = query(); err != nil { t.Error("QueryContext:", err) } spans := te.GetSpans().Snapshots() if !cmp.Equal(3, len(spans)) { t.Errorf("expected 3 spans, got %d: %v", len(spans), spans) } if !cmp.Equal("sql.connector.connect", spans[0].Name()) { t.Errorf("expected first span name to be sql.connector.connect, got %q", spans[0].Name()) } if !cmp.Equal("sql.conn.query", spans[1].Name()) { t.Errorf("expected second span name to be sql.conn.query, got %q", spans[1].Name()) } else { attrs := spans[1].Attributes() slog.Info("Span Attributes", "attributes", attrs) if !cmp.Equal(1, len(attrs)) { t.Errorf("expected 1 attribute, got %d: %v", len(attrs), attrs) } if !cmp.Equal(attribute.Key("db.statement"), attrs[0].Key) { t.Errorf("expected attribute key to be db.statement, got %q", attrs[0].Key) } if !cmp.Equal("SELECT CURRENT_TIMESTAMP", attrs[0].Value.AsString()) { t.Errorf("expected attribute value to be 'SELECT CURRENT_TIMESTAMP', got %q", attrs[0].Value.AsString()) } } if !cmp.Equal("sql.rows", spans[2].Name()) { t.Errorf("expected second span name to be sql.rows, got %q", spans[2].Name()) } else { attrs := spans[2].Attributes() slog.Info("Span Attributes", "attributes", attrs) if !cmp.Equal(0, len(attrs)) { t.Errorf("expected 0 attribute, got %d: %v", len(attrs), attrs) } } } ================================================ FILE: mysql/azuremysql/azuremysql.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package azuremysql provides connections to Azure Database for MySQL. // See https://docs.microsoft.com/en-us/azure/mysql. // // # URLs // // For mysql.Open, azuremysql registers for the scheme "azuremysql". // To customize the URL opener, or for more details on the URL format, // see URLOpener. // // See https://gocloud.dev/concepts/urls/ for background information. package azuremysql // import "gocloud.dev/mysql/azuremysql" import ( "context" "crypto/tls" "database/sql" "database/sql/driver" "fmt" "net/url" "strings" "github.com/XSAM/otelsql" "github.com/go-sql-driver/mysql" "gocloud.dev/azure/azuredb" cdkmysql "gocloud.dev/mysql" ) // URLOpener opens Azure MySQL URLs // like "azuremysql://user:password@myinstance.mysql.database.azure.com/mydb". type URLOpener struct { // CertSource specifies how the opener will obtain the Azure Certificate // Authority. If nil, it will use the default *azuredb.CertFetcher. CertSource azuredb.CertPoolProvider // TraceOpts contains options for OpenTelemetry. TraceOpts []otelsql.Option } // Scheme is the URL scheme azuremysql registers its URLOpener under on // mysql.DefaultMux. const Scheme = "azuremysql" func init() { cdkmysql.DefaultURLMux().RegisterMySQL(Scheme, &URLOpener{}) } // OpenMySQLURL opens an encrypted connection to an Azure MySQL database. func (uo *URLOpener) OpenMySQLURL(ctx context.Context, u *url.URL) (*sql.DB, error) { source := uo.CertSource if source == nil { source = new(azuredb.CertFetcher) } if u.Host == "" { return nil, fmt.Errorf("open Azure database: empty endpoint") } password, _ := u.User.Password() c := &connector{ cfg: &mysql.Config{ Net: "tcp", Addr: u.Host, User: u.User.Username(), Passwd: password, AllowCleartextPasswords: true, AllowNativePasswords: true, DBName: strings.TrimPrefix(u.Path, "/"), }, provider: source, sem: make(chan struct{}, 1), ready: make(chan struct{}), } c.sem <- struct{}{} return otelsql.OpenDB(c, uo.TraceOpts...), nil } type connector struct { sem chan struct{} // receive to acquire, send to release provider CertPoolProvider // provides the CA certificate pool ready chan struct{} // closed after fetching certs successfully cfg *mysql.Config } func (c *connector) Connect(ctx context.Context) (driver.Conn, error) { select { case <-c.sem: certPool, err := c.provider.AzureCertPool(ctx) if err != nil { c.sem <- struct{}{} // release return nil, fmt.Errorf("connect Azure MySql: %v", err) } c.cfg.TLS = &tls.Config{RootCAs: certPool} close(c.ready) // Don't release sem: make it block forever, so this case won't be run again. case <-c.ready: // Already succeeded. case <-ctx.Done(): return nil, fmt.Errorf("connect Azure MySql: waiting for certificates: %v", ctx.Err()) } inner, err := mysql.NewConnector(c.cfg) if err != nil { return nil, fmt.Errorf("connect Azure MySql: create connector: %v", err) } return inner.Connect(ctx) } func (c *connector) Driver() driver.Driver { return mysql.MySQLDriver{} } var tlsConfigCounter uint32 // A CertPoolProvider obtains a certificate pool that contains the Azure CA certificate. type CertPoolProvider = azuredb.CertPoolProvider // CertFetcher is a default CertPoolProvider that can fetch CA certificates from // any publicly accessible URI or File. type CertFetcher = azuredb.CertFetcher ================================================ FILE: mysql/azuremysql/azuremysql_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Read the documentation on Azure Database for MySql for more information. // See https://docs.microsoft.com/en-us/azure/mysql/howto-configure-ssl. // To run this test, create a MySQL instance using Azure Portal or Terraform. // For Azure Portal, see https://docs.microsoft.com/en-us/azure/mysql/quickstart-create-mysql-server-database-using-azure-portal. // For Terraform, see https://www.terraform.io/docs/providers/azurerm/r/mysql_database.html. package azuremysql import ( "context" "fmt" "testing" "gocloud.dev/internal/testing/terraform" "gocloud.dev/mysql" ) func TestURLOpener(t *testing.T) { // This test will be skipped unless the project is set up with Terraform. // Before running go test: // // 1. Install Azure CLI (az) (https://docs.microsoft.com/en-us/cli/azure/install-azure-cli-linux) // 2. Run "az login" // 3. terraform init // 4. terraform apply tfOut, err := terraform.ReadOutput(".") if err != nil || len(tfOut) == 0 { t.Skipf("Could not obtain harness info: %v", err) } serverName, _ := tfOut["servername"].Value.(string) username, _ := tfOut["username"].Value.(string) password, _ := tfOut["password"].Value.(string) databaseName, _ := tfOut["database"].Value.(string) ctx := context.Background() db, err := mysql.Open(ctx, fmt.Sprintf("azuremysql://%s:%s@%s/%s", username, password, serverName, databaseName)) if err != nil { t.Fatal(err) } if err := db.Ping(); err != nil { t.Error("Ping: ", err) } if _, err = db.ExecContext(ctx, "CREATE TABLE tblTester (id INT NOT NULL, PRIMARY KEY(id))"); err != nil { t.Error("ExecContext: ", err) } if _, err = db.ExecContext(ctx, "DROP TABLE tblTester"); err != nil { t.Error("ExecContext: ", err) } if err := db.Close(); err != nil { t.Error("Close: ", err) } } ================================================ FILE: mysql/azuremysql/example_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package azuremysql_test import ( "context" "log" "gocloud.dev/mysql" _ "gocloud.dev/mysql/azuremysql" ) func Example() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/mysql/azuremysql" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // Replace this with your actual settings. db, err := mysql.Open(ctx, "azuremysql://user:password@example00.mysql.database.azure.com/testdb") if err != nil { log.Fatal(err) } defer db.Close() // Use database in your program. db.Exec("CREATE TABLE foo (bar INT);") } ================================================ FILE: mysql/azuremysql/main.tf ================================================ terraform { required_version = "~>0.12" } # See documentation for more info: https://www.terraform.io/docs/providers/azurerm/auth/azure_cli.html provider "azurerm" { version = "~> 1.22" } provider "random" { version = "~> 2.1" } # Run Azure CLI command "az account list-locations" to see list of all locations. variable "location" { description = "The Azure Region in which all resources in this example should be created." } # See documentation for more info: https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-overview variable "resourcegroup" { description = "The Azure Resource Group Name within your Subscription in which this resource will be created." } resource "random_string" "db_password" { keepers = { region = var.location } special = false length = 20 } resource "random_id" "serverid" { keepers = { region = var.location } byte_length = 2 } resource "azurerm_resource_group" "mysqlrg" { name = var.resourcegroup location = var.location } resource "azurerm_mysql_server" "mysqlserver" { name = format("go-cdk-test-%v", random_id.serverid.dec) location = azurerm_resource_group.mysqlrg.location resource_group_name = azurerm_resource_group.mysqlrg.name sku { name = "B_Gen5_2" capacity = 2 tier = "Basic" family = "Gen5" } storage_profile { storage_mb = 5120 backup_retention_days = 7 geo_redundant_backup = "Disabled" } administrator_login = "gocloudadmin" administrator_login_password = random_string.db_password.result version = "5.7" ssl_enforcement = "Enabled" } # See documentation for more info: https://www.terraform.io/docs/providers/azurerm/r/sql_firewall_rule.html resource "azurerm_mysql_firewall_rule" "addrule" { name = "ClientIPAddress" resource_group_name = azurerm_resource_group.mysqlrg.name server_name = azurerm_mysql_server.mysqlserver.name start_ip_address = "0.0.0.0" end_ip_address = "255.255.255.255" } resource "azurerm_mysql_database" "mysqldb" { name = "testdb" resource_group_name = azurerm_resource_group.mysqlrg.name server_name = azurerm_mysql_server.mysqlserver.name charset = "utf8" collation = "utf8_unicode_ci" } output "username" { value = "${azurerm_mysql_server.mysqlserver.administrator_login}@${azurerm_mysql_server.mysqlserver.name}" description = "The MySQL username to connect with." } output "password" { value = random_string.db_password.result sensitive = true description = "The MySQL instance password for the user." } output "servername" { value = azurerm_mysql_server.mysqlserver.fqdn description = "The host name of the Azure Database for MySQL instance." } output "database" { value = "testdb" description = "The databasename of the Azure Database for MySQL instance." } ================================================ FILE: mysql/example_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package mysql_test import ( "context" "log" "gocloud.dev/mysql" ) func ExampleOpen() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // Replace this with your actual settings. db, err := mysql.Open(ctx, "mysql://user:password@localhost/testdb") if err != nil { log.Fatal(err) } defer db.Close() // Use database in your program. db.Exec("CREATE TABLE foo (bar INT);") } ================================================ FILE: mysql/gcpmysql/example_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcpmysql_test import ( "context" "log" "gocloud.dev/mysql" _ "gocloud.dev/mysql/gcpmysql" ) func Example() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/mysql/gcpmysql" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // Replace this with your actual settings. db, err := mysql.Open(ctx, "gcpmysql://user:password@example-project/region/my-instance01/testdb") if err != nil { log.Fatal(err) } defer db.Close() // Use database in your program. db.Exec("CREATE TABLE foo (bar INT);") } ================================================ FILE: mysql/gcpmysql/gcpmysql.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package gcpmysql provides connections to managed MySQL Cloud SQL instances. // See https://cloud.google.com/sql/docs/mysql/ for more information. // // # URLs // // For mysql.Open, gcpmysql registers for the scheme "gcpmysql". // The default URL opener will create a connection using the default // credentials from the environment, as described in // https://cloud.google.com/docs/authentication/production. // To customize the URL opener, or for more details on the URL format, // see URLOpener. // // See https://gocloud.dev/concepts/urls/ for background information. package gcpmysql // import "gocloud.dev/mysql/gcpmysql" import ( "context" "database/sql" "fmt" "net" "net/url" "slices" "strings" "sync" "github.com/GoogleCloudPlatform/cloudsql-proxy/proxy/proxy" "github.com/XSAM/otelsql" "github.com/go-sql-driver/mysql" "gocloud.dev/gcp" "gocloud.dev/gcp/cloudsql" cdkmysql "gocloud.dev/mysql" ) // Scheme is the URL scheme gcpmysql registers its URLOpener under on // mysql.DefaultMux. const Scheme = "gcpmysql" func init() { cdkmysql.DefaultURLMux().RegisterMySQL(Scheme, new(lazyCredsOpener)) } // lazyCredsOpener obtains Application Default Credentials on the first call // to OpenMySQLURL. type lazyCredsOpener struct { init sync.Once opener *URLOpener err error } func (o *lazyCredsOpener) OpenMySQLURL(ctx context.Context, u *url.URL) (*sql.DB, error) { o.init.Do(func() { creds, err := gcp.DefaultCredentials(ctx) if err != nil { o.err = err return } client, err := gcp.NewHTTPClient(gcp.DefaultTransport(), creds.TokenSource) if err != nil { o.err = err return } certSource := cloudsql.NewCertSource(client) o.opener = &URLOpener{CertSource: certSource} }) if o.err != nil { return nil, fmt.Errorf("gcpmysql open %v: %v", u, o.err) } return o.opener.OpenMySQLURL(ctx, u) } // URLOpener opens Cloud MySQL URLs like // "gcpmysql://user:password@project/region/instance/dbname". type URLOpener struct { // CertSource specifies how the opener will obtain authentication information. // CertSource must not be nil. CertSource proxy.CertSource // TraceOpts contains options for OpenTelemetry. TraceOpts []otelsql.Option } // OpenMySQLURL opens a new GCP database connection wrapped with OpenTelemetry instrumentation. func (uo *URLOpener) OpenMySQLURL(ctx context.Context, u *url.URL) (*sql.DB, error) { if uo.CertSource == nil { return nil, fmt.Errorf("gcpmysql: URLOpener CertSource is nil") } var ( client = &proxy.Client{Certs: uo.CertSource, Port: 3307} cfg, err = configFromURL(u) ) if err != nil { return nil, fmt.Errorf("gcpmysql: open config %v", err) } cfg.DialFunc = func(ctx context.Context, _, addr string) (net.Conn, error) { // MySQL driver's addr is in the form "[host]:3306" after normalized. // https://github.com/go-sql-driver/mysql/blob/76c00e35a8d48f8f70f0e7dffe584692bd3fa612/dsn.go#L193-L195 instance, _, err := net.SplitHostPort(addr) if err != nil { return nil, err } return client.DialContext(ctx, instance) } c, err := mysql.NewConnector(cfg) if err != nil { return nil, fmt.Errorf("gcpmysql: open connector %v", err) } return otelsql.OpenDB(c, uo.TraceOpts...), nil } func configFromURL(u *url.URL) (*mysql.Config, error) { instance, dbName, err := instanceFromURL(u) if err != nil { return nil, err } var cfg *mysql.Config switch { case len(u.RawQuery) > 0: optDsn := fmt.Sprintf("/%s?%s", dbName, u.RawQuery) if cfg, err = mysql.ParseDSN(optDsn); err != nil { return nil, err } default: cfg = mysql.NewConfig() } password, _ := u.User.Password() cfg.AllowNativePasswords = true cfg.Net = "tcp" cfg.Addr = instance cfg.User = u.User.Username() cfg.Passwd = password cfg.DBName = dbName return cfg, nil } func instanceFromURL(u *url.URL) (instance, db string, _ error) { path := u.Host + u.Path // everything after scheme but before query or fragment parts := strings.SplitN(path, "/", 4) if len(parts) < 4 { return "", "", fmt.Errorf("%s is not in the form project/region/instance/dbname", path) } if slices.Contains(parts, "") { return "", "", fmt.Errorf("%s is not in the form project/region/instance/dbname", path) } return parts[0] + ":" + parts[1] + ":" + parts[2], parts[3], nil } ================================================ FILE: mysql/gcpmysql/gcpmysql_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcpmysql import ( "context" "fmt" "net/url" "reflect" "testing" drvr "github.com/go-sql-driver/mysql" "gocloud.dev/internal/testing/terraform" "gocloud.dev/mysql" ) func TestOpen(t *testing.T) { // This test will be skipped unless the project is set up with Terraform. // Before running go test, run in this directory: // // terraform init // terraform apply tfOut, err := terraform.ReadOutput(".") if err != nil || len(tfOut) == 0 { t.Skipf("Could not obtain harness info: %v", err) } project, _ := tfOut["project"].Value.(string) region, _ := tfOut["region"].Value.(string) instance, _ := tfOut["instance"].Value.(string) username, _ := tfOut["username"].Value.(string) password, _ := tfOut["password"].Value.(string) databaseName, _ := tfOut["database"].Value.(string) if project == "" || region == "" || instance == "" || username == "" || databaseName == "" { t.Fatalf("Missing one or more required Terraform outputs; got project=%q region=%q instance=%q username=%q database=%q", project, region, instance, username, databaseName) } ctx := context.Background() urlstr := fmt.Sprintf("gcpmysql://%s:%s@%s/%s/%s/%s", username, password, project, region, instance, databaseName) t.Log("Connecting to", urlstr) db, err := mysql.Open(ctx, urlstr) if err != nil { t.Fatal(err) } if err := db.Ping(); err != nil { t.Error("Ping:", err) } if err := db.Close(); err != nil { t.Error("Close:", err) } } func TestInstanceFromURL(t *testing.T) { tests := []struct { name string urlString string wantInstance string wantDatabase string wantErr bool }{ { name: "AllValuesSpecified", urlString: "gcpmysql://username:password@my-project-id/us-central1/my-instance-id/my-db?foo=bar&baz=quux", wantInstance: "my-project-id:us-central1:my-instance-id", wantDatabase: "my-db", }, { name: "OptionalValuesOmitted", urlString: "gcpmysql://my-project-id/us-central1/my-instance-id/my-db", wantInstance: "my-project-id:us-central1:my-instance-id", wantDatabase: "my-db", }, { name: "DatabaseNameEmpty", urlString: "gcpmysql://my-project-id/us-central1/my-instance-id/", wantErr: true, }, { name: "InstanceEmpty", urlString: "gcpmysql://my-project-id/us-central1//my-db", wantErr: true, }, { name: "RegionEmpty", urlString: "gcpmysql://my-project-id//my-instance-id/my-db", wantErr: true, }, { name: "ProjectEmpty", urlString: "gcpmysql:///us-central1/my-instance-id/my-db", wantErr: true, }, { name: "DatabaseNameWithSlashes", urlString: "gcpmysql://my-project-id/us-central1/my-instance-id/foo/bar/baz", wantInstance: "my-project-id:us-central1:my-instance-id", wantDatabase: "foo/bar/baz", }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { u, err := url.Parse(test.urlString) if err != nil { t.Fatalf("failed to parse URL %q: %v", test.urlString, err) } instance, database, err := instanceFromURL(u) if err != nil { t.Logf("instanceFromURL(url.Parse(%q)): %v", u, err) if !test.wantErr { t.Fail() } return } if test.wantErr { t.Fatalf("instanceFromURL(url.Parse(%q)) = %q, %q, ; want error", test.urlString, instance, database) } if instance != test.wantInstance || database != test.wantDatabase { t.Errorf("instanceFromURL(url.Parse(%q)) = %q, %q, ; want %q, %q, ", test.urlString, instance, database, test.wantInstance, test.wantDatabase) } }) } } func Test_configFromURL(t *testing.T) { type args struct { urlStr string } tests := []struct { name string args args want *drvr.Config wantErr bool }{ { name: "ConfigWithNoOptions", args: args{ urlStr: "gcpmysql://user:password@my-project-id/us-central1/my-instance-id/my-db", }, want: func() *drvr.Config { cfg := drvr.NewConfig() cfg.AllowNativePasswords = true cfg.Net = "tcp" cfg.Addr = "my-project-id:us-central1:my-instance-id" cfg.User = "user" cfg.Passwd = "password" cfg.DBName = "my-db" return cfg }(), wantErr: false, }, { name: "ConfigWithSignalOptions", args: args{ urlStr: "gcpmysql://user:password@my-project-id/us-central1/my-instance-id/my-db?parseTime=true", }, want: func() *drvr.Config { cfg := drvr.NewConfig() cfg.AllowNativePasswords = true cfg.ParseTime = true cfg.Net = "tcp" cfg.Addr = "my-project-id:us-central1:my-instance-id" cfg.User = "user" cfg.Passwd = "password" cfg.DBName = "my-db" return cfg }(), wantErr: false, }, { name: "ConfigWithMultipleOptions", args: args{ urlStr: "gcpmysql://user:password@my-project-id/us-central1/my-instance-id/my-db?columnsWithAlias=true&parseTime=true", }, want: func() *drvr.Config { cfg := drvr.NewConfig() cfg.AllowNativePasswords = true cfg.ColumnsWithAlias = true cfg.ParseTime = true cfg.Net = "tcp" cfg.Addr = "my-project-id:us-central1:my-instance-id" cfg.User = "user" cfg.Passwd = "password" cfg.DBName = "my-db" return cfg }(), wantErr: false, }, { name: "InstanceFromURLError", args: args{ urlStr: "gcpmysql://user:password@my-project-id/us-central1/my-db", }, want: nil, wantErr: true, }, { name: "DNSParseError", args: args{ urlStr: "gcpmysql://user:password@my-project-id/us-central1/my-instance-id/my-db?parseTime=nope", }, want: nil, wantErr: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { u, err := url.Parse(tt.args.urlStr) if err != nil { t.Fatalf("failed to parse URL %q: %v", tt.args.urlStr, err) } got, err := configFromURL(u) if (err != nil) != tt.wantErr { t.Errorf("configFromURL() error = %v, wantErr %v", err, tt.wantErr) return } if !reflect.DeepEqual(got, tt.want) { t.Errorf("configFromURL() = %v, want %v", got, tt.want) } }) } } ================================================ FILE: mysql/gcpmysql/main.tf ================================================ # Copyright 2018 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Harness for MySQL tests. terraform { required_version = "~>1.13.2" required_providers { google = { source = "hashicorp/google" version = "7.9.0" } random = { source = "random" version = "3.7.2" } } } provider "google" { project = var.project } variable "project" { type = string description = "Project to set up." } variable "region" { default = "us-central1" description = "GCP region to create database and storage in, for example 'us-central1'. See https://cloud.google.com/compute/docs/regions-zones/ for valid values." } locals { sql_instance = "go-cloud-test-${random_id.sql_instance.hex}" } resource "google_project_service" "sql" { service = "sql-component.googleapis.com" disable_on_destroy = false } resource "google_project_service" "sqladmin" { service = "sqladmin.googleapis.com" disable_on_destroy = false } resource "random_id" "sql_instance" { keepers = { project = var.project region = var.region } byte_length = 12 } resource "google_sql_database_instance" "main" { name = local.sql_instance database_version = "MYSQL_5_6" region = var.region project = var.project deletion_protection = false settings { tier = "db-f1-micro" disk_size = 10 # GiB } depends_on = [ google_project_service.sql, google_project_service.sqladmin, ] } resource "google_sql_database" "main" { name = "testdb" instance = google_sql_database_instance.main.name } resource "random_string" "db_password" { keepers = { project = var.project db_name = local.sql_instance region = var.region } special = false length = 20 } resource "google_sql_user" "root" { name = "root" instance = google_sql_database_instance.main.name password = random_string.db_password.result } output "project" { value = var.project description = "The GCP project ID." } output "region" { value = var.region description = "The Cloud SQL instance region." } output "instance" { value = local.sql_instance description = "The Cloud SQL instance region." } output "username" { value = "root" description = "The Cloud SQL username to connect with." } output "password" { value = random_string.db_password.result sensitive = true description = "The Cloud SQL instance password for the user." } output "database" { value = "testdb" description = "The name of the database inside the Cloud SQL instance." } ================================================ FILE: mysql/main.tf ================================================ # Copyright 2020 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Harness for MySQL tests. terraform { required_version = ">= 0.13" required_providers { docker = { source = "terraform-providers/docker" version = "~> 2.0" } random = { source = "hashicorp/random" version = "~> 2.0" } } } variable port { type = number description = "Port exposed out of the MySQL container." default = 3306 } resource random_pet mysql {} resource random_password db_password { special = false length = 20 } locals { db_name = "testdb" } resource docker_container mysql { name = random_pet.mysql.id image = docker_image.mysql.latest env = [ "MYSQL_ROOT_PASSWORD=${random_password.db_password.result}", "MYSQL_DATABASE=${local.db_name}", ] ports { internal = 3306 external = var.port } } resource docker_image mysql { name = "mysql" } output endpoint { value = "localhost:${var.port}" description = "The MySQL instance's host/port." } output username { value = "root" description = "The MySQL username to connect with." } output password { value = random_password.db_password.result sensitive = true description = "The MySQL instance password for the user." } output database { value = local.db_name description = "The name of the database inside the MySQL instance." } ================================================ FILE: mysql/mysql.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package mysql provides functions to open MySQL databases with OpenTelemetry instrumentation. package mysql import ( "context" "database/sql" "fmt" "net/url" "regexp" "strings" "github.com/XSAM/otelsql" "github.com/go-sql-driver/mysql" "gocloud.dev/internal/openurl" ) // Scheme is the URL scheme this package registers its URLOpener under on // DefaultMux. const Scheme = "mysql" func init() { DefaultURLMux().RegisterMySQL(Scheme, &URLOpener{}) } // URLOpener opens URLs like "mysql://" by using the underlying MySQL driver. // like "mysql://user:password@localhost:3306/mydb". type URLOpener struct { TraceOpts []otelsql.Option } // OpenMySQLURL opens a new database connection wrapped with OpenTelemetry instrumentation. func (uo *URLOpener) OpenMySQLURL(_ context.Context, u *url.URL) (*sql.DB, error) { cfg, err := ConfigFromURL(u) if err != nil { return nil, err } c, err := mysql.NewConnector(cfg) if err != nil { return nil, fmt.Errorf("mysql: could not create connector: %v", err) } return otelsql.OpenDB(c, uo.TraceOpts...), nil } var netAddrRE = regexp.MustCompile(`^(.+)\((.+)\)$`) // ConfigFromURL creates a mysql.Config from URL. func ConfigFromURL(u *url.URL) (cfg *mysql.Config, err error) { dbName := strings.TrimPrefix(u.Path, "/") if u.RawQuery != "" { optDsn := fmt.Sprintf("/%s?%s", dbName, u.RawQuery) if cfg, err = mysql.ParseDSN(optDsn); err != nil { return nil, err } } else { cfg = mysql.NewConfig() } if matches := netAddrRE.FindStringSubmatch(u.Host); len(matches) == 3 { cfg.Net = matches[1] cfg.Addr = matches[2] } else { cfg.Net = "tcp" cfg.Addr = u.Host } cfg.User = u.User.Username() cfg.Passwd, _ = u.User.Password() cfg.DBName = dbName cfg.AllowCleartextPasswords = true cfg.AllowNativePasswords = true return cfg, nil } // MySQLURLOpener implements MySQLURLOpener and can open connections based on a URL. // The opener must not modify the URL argument. OpenMySQLURL must be safe to // call from multiple goroutines. // // This interface is generally implemented by types in driver packages. type MySQLURLOpener interface { OpenMySQLURL(ctx context.Context, u *url.URL) (*sql.DB, error) } // URLMux is a URL opener multiplexer. It matches the scheme of the URLs // against a set of registered schemes and calls the opener that matches the // URL's scheme. // // The zero value is a multiplexer with no registered schemes. type URLMux struct { schemes openurl.SchemeMap } // RegisterMySQL registers the opener with the given scheme. If an opener // already exists for the scheme, RegisterMySQL panics. func (mux *URLMux) RegisterMySQL(scheme string, opener MySQLURLOpener) { mux.schemes.Register("mysql", "DB", scheme, opener) } // OpenMySQL calls OpenMySQLURL with the URL parsed from urlstr. // OpenMySQL is safe to call from multiple goroutines. func (mux *URLMux) OpenMySQL(ctx context.Context, urlstr string) (*sql.DB, error) { opener, u, err := mux.schemes.FromString("DB", urlstr) if err != nil { return nil, err } return opener.(MySQLURLOpener).OpenMySQLURL(ctx, u) } // OpenMySQLURL dispatches the URL to the opener that is registered with the // URL's scheme. OpenMySQLURL is safe to call from multiple goroutines. func (mux *URLMux) OpenMySQLURL(ctx context.Context, u *url.URL) (*sql.DB, error) { opener, err := mux.schemes.FromURL("DB", u) if err != nil { return nil, err } return opener.(MySQLURLOpener).OpenMySQLURL(ctx, u) } var defaultURLMux = new(URLMux) // DefaultURLMux returns the URLMux used by OpenMySql. // // Driver packages can use this to register their MySQLURLOpener on the mux. func DefaultURLMux() *URLMux { return defaultURLMux } // Open opens the bucket identified by the URL given. URL openers must be // registered in the DefaultURLMux, which is typically done in driver // packages' initialization. // // See the URLOpener documentation in driver subpackages for more // details on supported scheme(s) and URL parameter(s). func Open(ctx context.Context, urlstr string) (*sql.DB, error) { return defaultURLMux.OpenMySQL(ctx, urlstr) } ================================================ FILE: mysql/mysql_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package mysql import ( "context" "fmt" "net/url" "testing" "gocloud.dev/internal/testing/terraform" ) func TestOpen(t *testing.T) { // This test will be skipped unless the project is set up with Terraform. // Before running go test, run in this directory: // // terraform init // terraform apply tfOut, err := terraform.ReadOutput(".") if err != nil || len(tfOut) == 0 { t.Skipf("Could not obtain harness info: %v", err) } endpoint, _ := tfOut["endpoint"].Value.(string) username, _ := tfOut["username"].Value.(string) password, _ := tfOut["password"].Value.(string) databaseName, _ := tfOut["database"].Value.(string) if endpoint == "" || username == "" || databaseName == "" { t.Fatalf("Missing one or more required Terraform outputs; got endpoint=%q username=%q database=%q", endpoint, username, databaseName) } ctx := context.Background() urlstr := fmt.Sprintf("%s://%s:%s@%s/%s", Scheme, username, password, endpoint, databaseName) t.Log("Connecting to:", urlstr) db, err := Open(ctx, urlstr) if err != nil { t.Fatal(err) } if err := db.Ping(); err != nil { t.Error("Ping:", err) } if err := db.Close(); err != nil { t.Error("Close:", err) } } func TestConfigFromURL(t *testing.T) { for _, host := range []string{ "localhost", "tcp(localhost)", } { urlstr := "mysql://user:password@" + host + "/db?parseTime=true&interpolateParams=true" u, err := url.Parse(urlstr) if err != nil { t.Fatal(err) } cfg, err := ConfigFromURL(u) if err != nil { t.Fatal(err) } if got, want := cfg.User, "user"; got != want { t.Errorf(`User = %q; want %q`, got, want) } if got, want := cfg.Passwd, "password"; got != want { t.Errorf(`Passwd = %q; want %q`, got, want) } if got, want := cfg.Net, "tcp"; got != want { t.Errorf(`Net = %q; want %q`, got, want) } if got, want := cfg.Addr, "localhost"; got != want { t.Errorf(`Addr = %q; want %q`, got, want) } if !cfg.ParseTime { t.Error("ParseTime = false; want true") } if !cfg.InterpolateParams { t.Error("InterpolateParams = false; want true") } } } ================================================ FILE: postgres/awspostgres/awspostgres.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package awspostgres provides connections to AWS RDS PostgreSQL instances. // // # URLs // // For postgres.Open, awspostgres registers for the scheme "awspostgres". // The default URL opener will create a connection using the default // credentials from the environment, as described in // https://docs.aws.amazon.com/sdk-for-go/api/aws/session/. // To customize the URL opener, or for more details on the URL format, // see URLOpener. // // See https://gocloud.dev/concepts/urls/ for background information. package awspostgres // import "gocloud.dev/postgres/awspostgres" import ( "context" "crypto/tls" "database/sql" "database/sql/driver" "fmt" "io" "net" "net/url" "time" "github.com/XSAM/otelsql" "github.com/lib/pq" "gocloud.dev/aws/rds" "gocloud.dev/postgres" ) // URLOpener opens RDS PostgreSQL URLs // like "awspostgres://user:password@myinstance.borkxyzzy.us-west-1.rds.amazonaws.com:5432/mydb". type URLOpener struct { // CertSource specifies how the opener will obtain the RDS Certificate // Authority. If nil, it will use the default *rds.CertFetcher. CertSource rds.CertPoolProvider // TraceOpts contains options for OpenTelemetry. TraceOpts []otelsql.Option } // Scheme is the URL scheme awspostgres registers its URLOpener under on // postgres.DefaultMux. const Scheme = "awspostgres" func init() { postgres.DefaultURLMux().RegisterPostgres(Scheme, &URLOpener{}) } // OpenPostgresURL opens a new RDS database connection wrapped with OpenTelemetry instrumentation. func (uo *URLOpener) OpenPostgresURL(ctx context.Context, u *url.URL) (*sql.DB, error) { source := uo.CertSource if source == nil { source = new(rds.CertFetcher) } query := u.Query() for k := range query { // Forbid SSL-related parameters. if k == "sslmode" || k == "sslcert" || k == "sslkey" || k == "sslrootcert" { return nil, fmt.Errorf("awspostgres: open: parameter %q not allowed; sslmode must be disabled because the underlying dialer is already providing TLS", k) } } // sslmode must be disabled because the underlying dialer is already providing TLS. query.Set("sslmode", "disable") u2 := new(url.URL) *u2 = *u u2.Scheme = "postgres" u2.RawQuery = query.Encode() db := sql.OpenDB(connector{ provider: source, pqConn: u2.String(), traceOpts: append([]otelsql.Option(nil), uo.TraceOpts...), }) return db, nil } type pqDriver struct { provider rds.CertPoolProvider traceOpts []otelsql.Option } func (d pqDriver) Open(name string) (driver.Conn, error) { c, _ := d.OpenConnector(name) return c.Connect(context.Background()) } func (d pqDriver) OpenConnector(name string) (driver.Connector, error) { return connector{d.provider, name + " sslmode=disable", d.traceOpts}, nil } type connector struct { provider rds.CertPoolProvider pqConn string traceOpts []otelsql.Option } func (c connector) Connect(context.Context) (driver.Conn, error) { conn, err := pq.DialOpen(dialer{c.provider}, c.pqConn) if err != nil { return nil, err } return conn, nil } func (c connector) Driver() driver.Driver { return otelsql.WrapDriver(pqDriver{c.provider, c.traceOpts}, c.traceOpts...) } type dialer struct { provider rds.CertPoolProvider } func (d dialer) dial(ctx context.Context, network, address string) (net.Conn, error) { host, _, err := net.SplitHostPort(address) if err != nil { return nil, fmt.Errorf("awspostgres: parse address: %v", err) } certPool, err := d.provider.RDSCertPool(ctx) if err != nil { return nil, err } conn, err := new(net.Dialer).DialContext(ctx, network, address) if err != nil { return nil, err } // Write the PostgreSQL SSLRequest message described in // https://www.postgresql.org/docs/11/protocol-message-formats.html // to upgrade to a TLS connection. _, err = conn.Write([]byte{ // Message length (Int32), including message length. 0x00, 0x00, 0x00, 0x08, // Magic number: 80877103. 0x04, 0xd2, 0x16, 0x2f, }) if err != nil { return nil, err } // Server must respond back with 'S'. var readBuf [1]byte if _, err := io.ReadFull(conn, readBuf[:]); err != nil { return nil, err } if readBuf[0] != 'S' { return nil, pq.ErrSSLNotSupported } // Begin TLS communication. crypt := tls.Client(conn, &tls.Config{ ServerName: host, RootCAs: certPool, Renegotiation: tls.RenegotiateFreelyAsClient, }) err = crypt.Handshake() if err != nil { return nil, err } return crypt, nil } func (d dialer) Dial(network, address string) (net.Conn, error) { return d.dial(context.Background(), network, address) } func (d dialer) DialTimeout(network, address string, timeout time.Duration) (net.Conn, error) { ctx, cancel := context.WithTimeout(context.Background(), timeout) conn, err := d.dial(ctx, network, address) cancel() return conn, err } ================================================ FILE: postgres/awspostgres/awspostgres_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package awspostgres import ( "context" "fmt" "testing" "gocloud.dev/internal/testing/terraform" "gocloud.dev/postgres" ) func TestURLOpener(t *testing.T) { // This test will be skipped unless the project is set up with Terraform. // Before running go test, run in this directory: // // terraform init // terraform apply tfOut, err := terraform.ReadOutput(".") if err != nil || len(tfOut) == 0 { t.Skipf("Could not obtain harness info: %v", err) } endpoint, _ := tfOut["endpoint"].Value.(string) username, _ := tfOut["username"].Value.(string) password, _ := tfOut["password"].Value.(string) databaseName, _ := tfOut["database"].Value.(string) if endpoint == "" || username == "" || databaseName == "" { t.Fatalf("Missing one or more required Terraform outputs; got endpoint=%q username=%q database=%q", endpoint, username, databaseName) } tests := []struct { urlstr string wantErr bool wantPingErr bool }{ // OK. {fmt.Sprintf("awspostgres://%s:%s@%s/%s", username, password, endpoint, databaseName), false, false}, // Invalid URL parameters: db creation fails. {fmt.Sprintf("awspostgres://%s:%s@%s/%s?sslcert=foo", username, password, endpoint, databaseName), true, false}, {fmt.Sprintf("awspostgres://%s:%s@%s/%s?sslkey=foo", username, password, endpoint, databaseName), true, false}, {fmt.Sprintf("awspostgres://%s:%s@%s/%s?sslrootcert=foo", username, password, endpoint, databaseName), true, false}, {fmt.Sprintf("awspostgres://%s:%s@%s/%s?sslmode=require", username, password, endpoint, databaseName), true, false}, // Invalid connection info: db is created, but Ping fails. {fmt.Sprintf("awspostgres://%s:badpwd@%s/%s", username, endpoint, databaseName), false, true}, {fmt.Sprintf("awspostgres://badusername:%s@%s/%s", password, endpoint, databaseName), false, true}, {fmt.Sprintf("awspostgres://%s:%s@localhost:9999/%s", username, password, databaseName), false, true}, {fmt.Sprintf("awspostgres://%s:%s@%s/wrongdbname", username, password, endpoint), false, true}, {fmt.Sprintf("awspostgres://%s:%s@%s/%s?foo=bar", username, password, endpoint, databaseName), false, true}, } ctx := context.Background() for _, test := range tests { t.Run(test.urlstr, func(t *testing.T) { db, err := postgres.Open(ctx, test.urlstr) if err != nil != test.wantErr { t.Fatalf("got err %v, wanted error? %v", err, test.wantErr) } if err != nil { return } defer func() { if err := db.Close(); err != nil { t.Error("Close:", err) } }() err = db.Ping() if err != nil != test.wantPingErr { t.Errorf("ping got err %v, wanted error? %v", err, test.wantPingErr) } }) } } ================================================ FILE: postgres/awspostgres/example_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package awspostgres_test import ( "context" "log" "gocloud.dev/postgres" _ "gocloud.dev/postgres/awspostgres" ) func Example() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/postgres/awspostgres" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // Replace these with your actual settings. db, err := postgres.Open(ctx, "awspostgres://myrole:swordfish@example01.xyzzy.us-west-1.rds.amazonaws.com/testdb") if err != nil { log.Fatal(err) } defer db.Close() // Use database in your program. db.ExecContext(ctx, "CREATE TABLE foo (bar INT);") } ================================================ FILE: postgres/awspostgres/main.tf ================================================ # Copyright 2018 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Harness for RDS PostgreSQL tests. terraform { required_version = "~>0.12" } provider "aws" { version = "~> 2.7" region = var.region } provider "random" { version = "~> 2.1" } variable "region" { type = string description = "Region to create resources in. See https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.RegionsAndAvailabilityZones.html for valid values." } resource "aws_security_group" "main" { name_prefix = "testdb" description = "Security group for the Go CDK Postgres test database." ingress { from_port = 5432 to_port = 5432 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] description = "Public Postgres access" } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] description = "All outgoing traffic allowed" } } resource "random_string" "db_password" { keepers = { region = var.region } special = false length = 20 } resource "aws_db_instance" "main" { identifier_prefix = "go-cloud-test" engine = "postgres" engine_version = "10.5" instance_class = "db.t2.micro" allocated_storage = 20 username = "root" password = random_string.db_password.result name = "testdb" publicly_accessible = true vpc_security_group_ids = [aws_security_group.main.id] skip_final_snapshot = true parameter_group_name = aws_db_parameter_group.main.name } resource "aws_db_parameter_group" "main" { name_prefix = "go-cloud-test" family = "postgres10" parameter { name = "rds.force_ssl" value = "1" } } output "endpoint" { value = aws_db_instance.main.endpoint description = "The RDS instance's host/port." } output "username" { value = "root" description = "The PostgreSQL username to connect with." } output "password" { value = random_string.db_password.result sensitive = true description = "The RDS instance password for the user." } output "database" { value = "testdb" description = "The name of the database inside the RDS instance." } ================================================ FILE: postgres/example_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package postgres_test import ( "context" "log" "gocloud.dev/postgres" ) func ExampleOpen() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // Replace this with your actual settings. db, err := postgres.Open(ctx, "postgres://user:password@localhost/testdb") if err != nil { log.Fatal(err) } defer db.Close() // Use database in your program. db.Exec("CREATE TABLE foo (bar INT);") } ================================================ FILE: postgres/gcppostgres/example_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcppostgres_test import ( "context" "log" "gocloud.dev/postgres" _ "gocloud.dev/postgres/gcppostgres" ) func Example() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/postgres/gcppostgres" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // Replace this with your actual settings. db, err := postgres.Open(ctx, "gcppostgres://user:password@example-project/region/my-instance01/testdb") if err != nil { log.Fatal(err) } defer db.Close() // Use database in your program. db.Exec("CREATE TABLE foo (bar INT);") } ================================================ FILE: postgres/gcppostgres/gcppostgres.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package gcppostgres provides connections to managed PostgreSQL Cloud SQL instances. // See https://cloud.google.com/sql/docs/postgres/ for more information. // // # URLs // // For postgres.Open, gcppostgres registers for the scheme "gcppostgres". // The default URL opener will create a connection using the default // credentials from the environment, as described in // https://cloud.google.com/docs/authentication/production. // To customize the URL opener, or for more details on the URL format, // see URLOpener. // // See https://gocloud.dev/concepts/urls/ for background information. package gcppostgres // import "gocloud.dev/postgres/gcppostgres" import ( "context" "database/sql" "database/sql/driver" "errors" "fmt" "net" "net/url" "slices" "strings" "sync" "time" "github.com/GoogleCloudPlatform/cloudsql-proxy/proxy/proxy" "github.com/XSAM/otelsql" "github.com/lib/pq" "gocloud.dev/gcp" "gocloud.dev/gcp/cloudsql" "gocloud.dev/postgres" ) // Scheme is the URL scheme gcppostgres registers its URLOpener under on // postgres.DefaultMux. const Scheme = "gcppostgres" func init() { postgres.DefaultURLMux().RegisterPostgres(Scheme, new(lazyCredsOpener)) } // lazyCredsOpener obtains Application Default Credentials on the first call // to OpenPostgresURL. type lazyCredsOpener struct { init sync.Once opener *URLOpener err error } func (o *lazyCredsOpener) OpenPostgresURL(ctx context.Context, u *url.URL) (*sql.DB, error) { o.init.Do(func() { creds, err := gcp.DefaultCredentials(ctx) if err != nil { o.err = err return } client, err := gcp.NewHTTPClient(gcp.DefaultTransport(), creds.TokenSource) if err != nil { o.err = err return } certSource := cloudsql.NewCertSourceWithIAM(client, creds.TokenSource) o.opener = &URLOpener{CertSource: certSource} }) if o.err != nil { return nil, fmt.Errorf("gcppostgres open %v: %v", u, o.err) } return o.opener.OpenPostgresURL(ctx, u) } // URLOpener opens GCP PostgreSQL URLs // like "gcppostgres://user:password@myproject/us-central1/instanceId/mydb". type URLOpener struct { // CertSource specifies how the opener will obtain authentication information. // CertSource must not be nil. CertSource proxy.CertSource // TraceOpts contains options for OpenTelemetry. TraceOpts []otelsql.Option } // OpenPostgresURL opens a new GCP database connection wrapped with OpenTelemetry instrumentation. func (uo *URLOpener) OpenPostgresURL(ctx context.Context, u *url.URL) (*sql.DB, error) { if uo.CertSource == nil { return nil, fmt.Errorf("gcppostgres: URLOpener CertSource is nil") } instance, dbName, err := instanceFromURL(u) if err != nil { return nil, fmt.Errorf("gcppostgres: open %v: %v", u, err) } query := u.Query() for k := range query { // Only permit parameters that do not conflict with other behavior. if k == "sslmode" || k == "sslcert" || k == "sslkey" || k == "sslrootcert" { return nil, fmt.Errorf("gcppostgres: open: extra parameter %s not allowed", k) } } query.Set("sslmode", "disable") u2 := new(url.URL) *u2 = *u u2.Scheme = "postgres" u2.Host = "cloudsql" u2.Path = "/" + dbName u2.RawQuery = query.Encode() db := sql.OpenDB(connector{ client: &proxy.Client{ Port: 3307, Certs: uo.CertSource, }, instance: instance, pqConn: u2.String(), traceOpts: append([]otelsql.Option(nil), uo.TraceOpts...), }) return db, nil } func instanceFromURL(u *url.URL) (instance, db string, _ error) { path := u.Host + u.Path // everything after scheme but before query or fragment parts := strings.SplitN(path, "/", 4) if len(parts) < 4 { return "", "", fmt.Errorf("%s is not in the form project/region/instance/dbname", path) } if slices.Contains(parts, "") { return "", "", fmt.Errorf("%s is not in the form project/region/instance/dbname", path) } return parts[0] + ":" + parts[1] + ":" + parts[2], parts[3], nil } type pqDriver struct { client *proxy.Client instance string traceOpts []otelsql.Option } func (d pqDriver) Open(name string) (driver.Conn, error) { c, _ := d.OpenConnector(name) return c.Connect(context.Background()) } func (d pqDriver) OpenConnector(name string) (driver.Connector, error) { return connector{d.client, d.instance, name, d.traceOpts}, nil } type connector struct { client *proxy.Client instance string pqConn string traceOpts []otelsql.Option } func (c connector) Connect(context.Context) (driver.Conn, error) { conn, err := pq.DialOpen(dialer{c.client, c.instance}, c.pqConn) if err != nil { return nil, err } return conn, nil } func (c connector) Driver() driver.Driver { return otelsql.WrapDriver(pqDriver{c.client, c.instance, c.traceOpts}, c.traceOpts...) } type dialer struct { client *proxy.Client instance string } func (d dialer) Dial(network, address string) (net.Conn, error) { return d.client.Dial(d.instance) } func (d dialer) DialTimeout(network, address string, timeout time.Duration) (net.Conn, error) { return nil, errors.New("gcppostgres: DialTimeout not supported") } ================================================ FILE: postgres/gcppostgres/gcppostgres_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcppostgres import ( "context" "fmt" "net/url" "testing" "gocloud.dev/internal/testing/terraform" "gocloud.dev/postgres" ) func TestURLOpener(t *testing.T) { // This test will be skipped unless the project is set up with Terraform. // Before running go test, run in this directory: // // terraform init // terraform apply tfOut, err := terraform.ReadOutput(".") if err != nil || len(tfOut) == 0 { t.Skipf("Could not obtain harness info: %v", err) } project, _ := tfOut["project"].Value.(string) region, _ := tfOut["region"].Value.(string) instance, _ := tfOut["instance"].Value.(string) username, _ := tfOut["username"].Value.(string) password, _ := tfOut["password"].Value.(string) databaseName, _ := tfOut["database"].Value.(string) userEmail, _ := tfOut["user_email"].Value.(string) if project == "" || region == "" || instance == "" || username == "" || databaseName == "" || userEmail == "" { t.Fatalf("Missing one or more required Terraform outputs; got project=%q region=%q instance=%q username=%q database=%q userEmail=%q", project, region, instance, username, databaseName, userEmail) } tests := []struct { name string urlstr string wantErr bool }{ { name: "SuccessIam", urlstr: fmt.Sprintf("gcppostgres://%s@%s/%s/%s/%s", userEmail, project, region, instance, databaseName), }, { name: "SuccessBuiltin", urlstr: fmt.Sprintf("gcppostgres://%s:%s@%s/%s/%s/%s", username, password, project, region, instance, databaseName), }, { name: "SSLModeForbidden", urlstr: fmt.Sprintf("gcppostgres://%s:%s@%s/%s/%s/%s?sslmode=require", username, password, project, region, instance, databaseName), wantErr: true, }, } ctx := context.Background() for _, test := range tests { t.Run(test.name, func(t *testing.T) { db, err := postgres.Open(ctx, test.urlstr) if err != nil { t.Log(err) if !test.wantErr { t.Fail() } return } if test.wantErr { db.Close() t.Fatal("Open succeeded; want error") } if err := db.Ping(); err != nil { t.Error("Ping:", err) } if err := db.Close(); err != nil { t.Error("Close:", err) } }) } } func TestInstanceFromURL(t *testing.T) { tests := []struct { name string urlString string wantInstance string wantDatabase string wantErr bool }{ { name: "AllValuesSpecified", urlString: "gcppostgres://username:password@my-project-id/us-central1/my-instance-id/my-db?foo=bar&baz=quux", wantInstance: "my-project-id:us-central1:my-instance-id", wantDatabase: "my-db", }, { name: "OptionalValuesOmitted", urlString: "gcppostgres://my-project-id/us-central1/my-instance-id/my-db", wantInstance: "my-project-id:us-central1:my-instance-id", wantDatabase: "my-db", }, { name: "DatabaseNameEmpty", urlString: "gcppostgres://my-project-id/us-central1/my-instance-id/", wantErr: true, }, { name: "InstanceEmpty", urlString: "gcppostgres://my-project-id/us-central1//my-db", wantErr: true, }, { name: "RegionEmpty", urlString: "gcppostgres://my-project-id//my-instance-id/my-db", wantErr: true, }, { name: "ProjectEmpty", urlString: "gcppostgres:///us-central1/my-instance-id/my-db", wantErr: true, }, { name: "DatabaseNameWithSlashes", urlString: "gcppostgres://my-project-id/us-central1/my-instance-id/foo/bar/baz", wantInstance: "my-project-id:us-central1:my-instance-id", wantDatabase: "foo/bar/baz", }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { u, err := url.Parse(test.urlString) if err != nil { t.Fatalf("failed to parse URL %q: %v", test.urlString, err) } instance, database, err := instanceFromURL(u) if err != nil { t.Logf("instanceFromURL(url.Parse(%q)): %v", u, err) if !test.wantErr { t.Fail() } return } if test.wantErr { t.Fatalf("instanceFromURL(url.Parse(%q)) = %q, %q, ; want error", test.urlString, instance, database) } if instance != test.wantInstance || database != test.wantDatabase { t.Errorf("instanceFromURL(url.Parse(%q)) = %q, %q, ; want %q, %q, ", test.urlString, instance, database, test.wantInstance, test.wantDatabase) } }) } } ================================================ FILE: postgres/gcppostgres/main.tf ================================================ # Copyright 2018 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Harness for Cloud SQL Postgres tests. terraform { required_version = ">= 1.1.0" required_providers { google = { version = "4.40.0" } random = { version = "3.4.3" } } } provider "google" { project = var.project region = var.region } variable "project" { type = string description = "Project ID - Google Cloud project ID in which to create resources." } variable "user_email" { type = string description = "User email address - Google identity to be used for testing IAM authentication." } variable "region" { default = "us-central1" description = "GCP region to create database and storage in, for example 'us-central1'. See https://cloud.google.com/compute/docs/regions-zones/ for valid values." } locals { sql_instance = "go-cloud-test-${random_id.sql_instance.hex}" } resource "google_project_service" "sql" { service = "sql-component.googleapis.com" disable_on_destroy = false } resource "google_project_service" "sqladmin" { service = "sqladmin.googleapis.com" disable_on_destroy = false } resource "random_id" "sql_instance" { keepers = { project = var.project region = var.region } byte_length = 12 } resource "google_project_iam_member" "cloudsql_client" { project = var.project role = "roles/cloudsql.client" member = "user:${var.user_email}" } resource "google_project_iam_member" "cloudsql_instanceUser" { project = var.project role = "roles/cloudsql.instanceUser" member = "user:${var.user_email}" } resource "google_sql_database_instance" "main" { name = local.sql_instance database_version = "POSTGRES_9_6" region = var.region project = var.project settings { tier = "db-f1-micro" disk_size = 10 # GiB database_flags { name = "cloudsql.iam_authentication" value = "on" } } depends_on = [ google_project_service.sql, google_project_service.sqladmin, ] } resource "google_sql_database" "main" { project = var.project name = "testdb" instance = google_sql_database_instance.main.name } resource "random_string" "db_password" { keepers = { project = var.project db_name = local.sql_instance region = var.region } special = false length = 20 } resource "google_sql_user" "root" { type = "BUILT_IN" name = "root" instance = google_sql_database_instance.main.name password = random_string.db_password.result } resource "google_sql_user" "user_account" { type = "CLOUD_IAM_USER" name = var.user_email instance = google_sql_database_instance.main.name } output "project" { value = var.project description = "The GCP project ID." } output "region" { value = var.region description = "The Cloud SQL instance region." } output "instance" { value = local.sql_instance description = "The Cloud SQL instance region." } output "username" { value = "root" description = "The Cloud SQL username to connect with." } output "password" { value = random_string.db_password.result sensitive = true description = "The Cloud SQL instance password for the user." } output "database" { value = "testdb" description = "The name of the database inside the Cloud SQL instance." } output "user_email" { value = var.user_email description = "The email of a GCP service account used for testing connections." } ================================================ FILE: postgres/postgres.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package postgres provides functions to open PostgreSQL databases with OpenTelemetry instrumentation. package postgres import ( "context" "database/sql" "database/sql/driver" "net/url" "github.com/XSAM/otelsql" "github.com/lib/pq" "gocloud.dev/internal/openurl" ) // Scheme is the URL scheme this package registers its URLOpener under on // DefaultMux. const Scheme = "postgres" func init() { DefaultURLMux().RegisterPostgres(Scheme, &URLOpener{}) } // URLOpener opens URLs like "postgres://" by using the underlying PostgreSQL driver. // See https://godoc.org/github.com/lib/pq#hdr-Connection_String_Parameters for details. type URLOpener struct { TraceOpts []otelsql.Option } // OpenPostgresURL opens a new database connection wrapped with OpenTelemetry instrumentation. func (uo *URLOpener) OpenPostgresURL(ctx context.Context, u *url.URL) (*sql.DB, error) { u2 := new(url.URL) *u2 = *u u2.Scheme = "postgres" return sql.OpenDB(connector{dsn: u2.String(), traceOpts: append([]otelsql.Option(nil), uo.TraceOpts...)}), nil } type connector struct { dsn string traceOpts []otelsql.Option } func (c connector) Connect(ctx context.Context) (driver.Conn, error) { return c.Driver().Open(c.dsn) } func (c connector) Driver() driver.Driver { return otelsql.WrapDriver(&pq.Driver{}, c.traceOpts...) } // PostgresURLOpener can open Postgres connections based on a URL. // The opener must not modify the URL argument. OpenPostgresURL must be safe to // call from multiple goroutines. // // This interface is generally implemented by types in driver packages. type PostgresURLOpener interface { // OpenPostgresURL opens a Postgres connection based on the URL. OpenPostgresURL(ctx context.Context, u *url.URL) (*sql.DB, error) } // URLMux is a URL opener multiplexer. It matches the scheme of the URLs // against a set of registered schemes and calls the opener that matches the // URL's scheme. // // The zero value is a multiplexer with no registered schemes. type URLMux struct { schemes openurl.SchemeMap } // RegisterPostgres registers the opener with the given scheme. If an opener // already exists for the scheme, RegisterPostgres panics. func (mux *URLMux) RegisterPostgres(scheme string, opener PostgresURLOpener) { mux.schemes.Register("postgres", "DB", scheme, opener) } // OpenPostgres calls OpenPostgresURL with the URL parsed from urlstr. // OpenPostgres is safe to call from multiple goroutines. func (mux *URLMux) OpenPostgres(ctx context.Context, urlstr string) (*sql.DB, error) { opener, u, err := mux.schemes.FromString("DB", urlstr) if err != nil { return nil, err } return opener.(PostgresURLOpener).OpenPostgresURL(ctx, u) } // OpenPostgresURL dispatches the URL to the opener that is registered with the // URL's scheme. OpenPostgresURL is safe to call from multiple goroutines. func (mux *URLMux) OpenPostgresURL(ctx context.Context, u *url.URL) (*sql.DB, error) { opener, err := mux.schemes.FromURL("DB", u) if err != nil { return nil, err } return opener.(PostgresURLOpener).OpenPostgresURL(ctx, u) } var defaultURLMux = new(URLMux) // DefaultURLMux returns the URLMux used by OpenPostgres. // // Driver packages can use this to register their PostgresURLOpener on the mux. func DefaultURLMux() *URLMux { return defaultURLMux } // Open opens the bucket identified by the URL given. URL openers must be // registered in the DefaultURLMux, which is typically done in driver // packages' initialization. // // See the URLOpener documentation in driver subpackages for more // details on supported scheme(s) and URL parameter(s). func Open(ctx context.Context, urlstr string) (*sql.DB, error) { return defaultURLMux.OpenPostgres(ctx, urlstr) } ================================================ FILE: postgres/postgres_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package postgres import ( "bytes" "context" "fmt" "net/url" "os" "os/exec" "os/user" "path/filepath" "runtime" "testing" "time" ) func TestOpen(t *testing.T) { if runtime.GOOS == "windows" { t.Skip("Can't use Unix sockets on Windows") } postgresPath, err := exec.LookPath("postgres") if err != nil { t.Skip("Can't find postgres:", err) } initdbPath, err := exec.LookPath("initdb") if err != nil { t.Skip("Can't find initdb:", err) } // Create a temporary database data directory. currUser, err := user.Current() if err != nil { t.Fatal(err) } dir := t.TempDir() dataDir := filepath.Join(dir, "data") initdbCmd := exec.Command(initdbPath, "-U", currUser.Username, "-D", dataDir) initdbOutput := new(bytes.Buffer) initdbCmd.Stdout = initdbOutput initdbCmd.Stderr = initdbOutput err = initdbCmd.Run() if err != nil { t.Log(initdbOutput) t.Fatal(err) } // Configure the database server to listen on a Unix socket located in the temporary directory. socketDir, err := filepath.Abs(filepath.Join(dir, "socket")) if err != nil { t.Fatal(err) } if err := os.Mkdir(socketDir, 0o777); err != nil { t.Fatal(err) } confData := new(bytes.Buffer) fmt.Fprintf(confData, "unix_socket_directories = '%s'\n", socketDir) err = os.WriteFile(filepath.Join(dataDir, "postgresql.conf"), confData.Bytes(), 0o666) if err != nil { t.Fatal(err) } // Start the database server (and arrange for it to be stopped at test end). server := exec.Command(postgresPath, "-D", dataDir) serverOutput := new(bytes.Buffer) server.Stdout = serverOutput server.Stderr = serverOutput if err := server.Start(); err != nil { t.Fatal(err) } serverSignaled := false defer func() { if !serverSignaled { if err := server.Process.Kill(); err != nil { t.Error("Stopping server:", err) } } // Wait for server to exit, but ignore the expected failure error code. server.Wait() if t.Failed() { t.Log(serverOutput) } }() // Now the actual test: can we connect to the database via URL opener? ctx := context.Background() dbURL := &url.URL{ Scheme: "blablabla", // Intentionally not "postgres" to ensure any scheme works. User: url.User(currUser.Username), Path: "/postgres", // Use the query parameter to avoid https://github.com/lib/pq/issues/796 RawQuery: url.Values{"host": {socketDir}}.Encode(), } t.Logf("PostgreSQL URL: %s", dbURL) db, err := new(URLOpener).OpenPostgresURL(ctx, dbURL) if err != nil { t.Fatal(err) } // Developing a realistic query would be hard, so instead we trust that the // PostgreSQL library reports healthy correctly. Since there's no way to // synchronize the server start and the ping, we might have to ping a few // times before it is healthy. (The overall test runner timeout will interrupt // if this takes too long.) for { err := db.Ping() if err == nil { break } t.Log("Ping:", err) time.Sleep(100 * time.Millisecond) } if err := db.Close(); err != nil { t.Error("Close:", err) } server.Process.Signal(os.Interrupt) serverSignaled = true } ================================================ FILE: pubsub/acks_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package pubsub_test import ( "context" "errors" "math/rand" "sync" "testing" "time" "gocloud.dev/gcerrors" "gocloud.dev/internal/gcerr" "gocloud.dev/pubsub" "gocloud.dev/pubsub/driver" ) type ackingDriverSub struct { driver.Subscription q []*driver.Message sendAcks func(context.Context, []driver.AckID) error } func (s *ackingDriverSub) ReceiveBatch(ctx context.Context, maxMessages int) ([]*driver.Message, error) { if len(s.q) <= maxMessages { ms := s.q s.q = nil return ms, nil } ms := s.q[:maxMessages] s.q = s.q[maxMessages:] return ms, nil } func (s *ackingDriverSub) SendAcks(ctx context.Context, ackIDs []driver.AckID) error { return s.sendAcks(ctx, ackIDs) } func (*ackingDriverSub) IsRetryable(error) bool { return false } func (*ackingDriverSub) ErrorCode(error) gcerrors.ErrorCode { return gcerrors.Internal } func (*ackingDriverSub) CanNack() bool { return false } func (*ackingDriverSub) Close() error { return nil } func TestAckTriggersDriverSendAcksForOneMessage(t *testing.T) { ctx := context.Background() var mu sync.Mutex var sentAcks []driver.AckID id := rand.Int() m := &driver.Message{AckID: id} ackChan := make(chan struct{}) ds := &ackingDriverSub{ q: []*driver.Message{m}, sendAcks: func(_ context.Context, ackIDs []driver.AckID) error { mu.Lock() defer mu.Unlock() sentAcks = ackIDs ackChan <- struct{}{} return nil }, } sub := pubsub.NewSubscription(ds, nil, nil) defer sub.Shutdown(ctx) m2, err := sub.Receive(ctx) if err != nil { t.Fatal(err) } m2.Ack() <-ackChan if len(sentAcks) != 1 { t.Fatalf("len(sentAcks) = %d, want exactly 1", len(sentAcks)) } if sentAcks[0] != id { t.Errorf("sentAcks[0] = %d, want %d", sentAcks[0], id) } } func TestMultipleAcksCanGoIntoASingleBatch(t *testing.T) { ctx := context.Background() var wg sync.WaitGroup var mu sync.Mutex sentAcks := make(map[driver.AckID]int) ids := []int{1, 2} ds := &ackingDriverSub{ q: []*driver.Message{{AckID: ids[0]}, {AckID: ids[1]}}, sendAcks: func(_ context.Context, ackIDs []driver.AckID) error { mu.Lock() defer mu.Unlock() for _, id := range ackIDs { sentAcks[id]++ wg.Done() } return nil }, } sub := pubsub.NewSubscription(ds, nil, nil) defer sub.Shutdown(ctx) // Receive and ack the messages concurrently. for range 2 { wg.Add(1) go func() { mr, err := sub.Receive(ctx) if err != nil { t.Error(err) return } mr.Ack() }() } wg.Wait() if len(sentAcks) != 2 { t.Errorf("len(sentAcks) = %d, want exactly 2", len(sentAcks)) } for _, id := range ids { if sentAcks[id] != 1 { t.Errorf("sentAcks[%v] = %d, want 1", id, sentAcks[id]) } } } func TestTooManyAcksForASingleBatchGoIntoMultipleBatches(t *testing.T) { ctx := context.Background() var mu sync.Mutex var wg sync.WaitGroup var sentAckBatches [][]driver.AckID // This value of n is chosen large enough that it should create more // than one batch. Admittedly, there is currently no explicit guarantee // of this. n := 1000 var ms []*driver.Message for i := range n { ms = append(ms, &driver.Message{AckID: i}) } ds := &ackingDriverSub{ q: ms, sendAcks: func(_ context.Context, ackIDs []driver.AckID) error { mu.Lock() defer mu.Unlock() sentAckBatches = append(sentAckBatches, ackIDs) for range ackIDs { wg.Done() } return nil }, } sub := pubsub.NewSubscription(ds, nil, nil) defer sub.Shutdown(ctx) errs := make(chan error, n) // Receive and ack the messages concurrently. recv := func() { mr, err := sub.Receive(ctx) if err != nil { errs <- err } mr.Ack() } wg.Add(n) for range n { go recv() } wg.Wait() close(errs) if len(sentAckBatches) < 2 { t.Errorf("got %d batches, want at least 2", len(sentAckBatches)) } for err := range errs { t.Fatalf("got error from goroutine: %v", err) } } func TestAckDoesNotBlock(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) m := &driver.Message{AckID: 0} // the batcher doesn't like nil interfaces ds := &ackingDriverSub{ q: []*driver.Message{m}, sendAcks: func(_ context.Context, ackIDs []driver.AckID) error { <-ctx.Done() return nil }, } sub := pubsub.NewSubscription(ds, nil, nil) defer sub.Shutdown(ctx) defer cancel() mr, err := sub.Receive(ctx) if err != nil { t.Fatal(err) } // If Ack blocks here, waiting for sendAcks to finish, then the // deferred cancel() will never run, so sendAcks can never finish. That // would cause the test to hang. Thus hanging is how this test signals // failure. mr.Ack() } func TestDoubleAckCausesPanic(t *testing.T) { ctx := context.Background() m := &driver.Message{AckID: 0} // the batcher doesn't like nil interfaces ds := &ackingDriverSub{ q: []*driver.Message{m}, sendAcks: func(_ context.Context, ackIDs []driver.AckID) error { return nil }, } sub := pubsub.NewSubscription(ds, nil, nil) defer sub.Shutdown(ctx) mr, err := sub.Receive(ctx) if err != nil { t.Fatal(err) } mr.Ack() defer func() { if r := recover(); r != nil { // ok, panic was expected. return } t.Errorf("second ack failed to panic") }() mr.Ack() } // For best results, run this test with -race. func TestConcurrentDoubleAckCausesPanic(t *testing.T) { ctx := context.Background() m := &driver.Message{AckID: 0} // the batcher doesn't like nil interfaces ds := &ackingDriverSub{ q: []*driver.Message{m}, sendAcks: func(_ context.Context, ackIDs []driver.AckID) error { return nil }, } sub := pubsub.NewSubscription(ds, nil, nil) defer sub.Shutdown(ctx) mr, err := sub.Receive(ctx) if err != nil { t.Fatal(err) } // Spin up some goroutines to ack the message. var mu sync.Mutex panics := 0 var wg sync.WaitGroup for range 2 { wg.Add(1) go func() { defer wg.Done() defer func() { if r := recover(); r != nil { mu.Lock() defer mu.Unlock() panics++ } }() mr.Ack() }() } wg.Wait() // Check that one of the goroutines panicked. if panics != 1 { t.Errorf("panics = %d, want %d", panics, 1) } } func TestSubShutdownCanBeCanceledEvenWithHangingSendAcks(t *testing.T) { ctx := context.Background() m := &driver.Message{AckID: 0} // the batcher doesn't like nil interfaces ds := &ackingDriverSub{ q: []*driver.Message{m}, sendAcks: func(ctx context.Context, ackIDs []driver.AckID) error { <-ctx.Done() return ctx.Err() }, } sub := pubsub.NewSubscription(ds, nil, nil) mr, err := sub.Receive(ctx) if err != nil { t.Fatal(err) } mr.Ack() done := make(chan struct{}) go func() { ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond) defer cancel() sub.Shutdown(ctx) close(done) }() tooLong := 5 * time.Second select { case <-done: case <-time.After(tooLong): t.Fatalf("waited too long (%v) for Shutdown to run", tooLong) } } func TestReceiveReturnsErrorFromSendAcks(t *testing.T) { // If SendAcks fails, the error is returned via receive. ctx := context.Background() serr := errors.New("SendAcks failed") ackChan := make(chan struct{}) ds := &ackingDriverSub{ q: []*driver.Message{ {AckID: 0}, {AckID: 1}, {AckID: 2}, {AckID: 3}, }, sendAcks: func(context.Context, []driver.AckID) error { close(ackChan) return serr }, } sub := pubsub.NewSubscription(ds, nil, nil) defer sub.Shutdown(ctx) m, err := sub.Receive(ctx) if err != nil { t.Fatal(err) } m.Ack() // Wait for the ack to be sent. <-ackChan // It might take a bit longer for the logic after SendAcks returns to happen, so // keep calling Receive. ctx, cancel := context.WithTimeout(ctx, 5*time.Second) defer cancel() for { _, err = sub.Receive(ctx) if gcerrors.Code(err) == gcerrors.Internal && err.(*gcerr.Error).Unwrap() == serr { break // success } if err != nil { t.Fatalf("got %v, want %v", err, serr) } } } // callbackDriverSub implements driver.Subscription and allows something like // monkey patching of both its ReceiveBatch and SendAcks methods. type callbackDriverSub struct { driver.Subscription mu sync.Mutex receiveBatch func(context.Context) ([]*driver.Message, error) sendAcks func(context.Context, []driver.AckID) error } func (s *callbackDriverSub) ReceiveBatch(ctx context.Context, maxMessages int) ([]*driver.Message, error) { return s.receiveBatch(ctx) } func (s *callbackDriverSub) SendAcks(ctx context.Context, acks []driver.AckID) error { return s.sendAcks(ctx, acks) } func (*callbackDriverSub) IsRetryable(error) bool { return false } func (*callbackDriverSub) ErrorCode(error) gcerrors.ErrorCode { return gcerrors.Internal } func (*callbackDriverSub) CanNack() bool { return false } func (*callbackDriverSub) Close() error { return nil } // This test detects the root cause of // https://github.com/google/go-cloud/issues/1238. // If the issue is present, this test times out. The problem was that when // there were no messages available from the driver, // pubsub.Subscription.Receive would spin trying to get more messages without // checking to see if an unrecoverable error had occurred while sending a batch // of acks to the driver. func TestReceiveReturnsAckErrorOnNoMoreMessages(t *testing.T) { // If SendAcks fails, the error is returned via receive. ctx := context.Background() serr := errors.New("unrecoverable error") receiveHappened := make(chan struct{}) ackHappened := make(chan struct{}) ds := &callbackDriverSub{ // First call to receiveBatch will return a single message. receiveBatch: func(context.Context) ([]*driver.Message, error) { ms := []*driver.Message{{AckID: 1}} return ms, nil }, sendAcks: func(context.Context, []driver.AckID) error { ackHappened <- struct{}{} return serr }, } sub := pubsub.NewSubscription(ds, nil, nil) defer sub.Shutdown(ctx) m, err := sub.Receive(ctx) if err != nil { t.Fatal(err) } m.Ack() // Second call to receiveBatch will wait for the pull from the // receiveHappened channel below, and return a nil slice of messages. ds.mu.Lock() ds.receiveBatch = func(context.Context) ([]*driver.Message, error) { ds.mu.Lock() // Subsequent calls to receiveBatch won't wait on receiveHappened, // and will also return nil slices of messages. ds.receiveBatch = func(context.Context) ([]*driver.Message, error) { return nil, nil } ds.mu.Unlock() receiveHappened <- struct{}{} return nil, nil } ds.mu.Unlock() errc := make(chan error) go func() { _, err := sub.Receive(ctx) errc <- err }() // sub.Receive has to start running first and then we need to trigger the unrecoverable error. <-receiveHappened // Trigger the unrecoverable error. <-ackHappened // Wait for sub.Receive to return so we can check the error it returns against serr. err = <-errc // Check the error returned from sub.Receive. if got := gcerrors.Code(err); got != gcerrors.Internal { t.Fatalf("error code = %v; want %v", got, gcerrors.Internal) } if got := errors.Unwrap(err); got != serr { t.Errorf("error = %v; want %v", got, serr) } } ================================================ FILE: pubsub/awssnssqs/awssnssqs.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package awssnssqs provides two implementations of pubsub.Topic, one that // sends messages to AWS SNS (Simple Notification Service), and one that sends // messages to SQS (Simple Queuing Service). It also provides an implementation // of pubsub.Subscription that receives messages from SQS. // // # URLs // // For pubsub.OpenTopic, awssnssqs registers for the scheme "awssns" for // an SNS topic, and "awssqs" for an SQS topic. For pubsub.OpenSubscription, // it registers for the scheme "awssqs". // // The default URL opener will use an AWS session with the default credentials // and configuration. // // To customize the URL opener, or for more details on the URL format, // see URLOpener. // See https://gocloud.dev/concepts/urls/ for background information. // // # Message Delivery Semantics // // AWS SQS supports at-least-once semantics; applications must call Message.Ack // after processing a message, or it will be redelivered. // See https://godoc.org/gocloud.dev/pubsub#hdr-At_most_once_and_At_least_once_Delivery // for more background. // // # Escaping // // Go CDK supports all UTF-8 strings; to make this work with services lacking // full UTF-8 support, strings must be escaped (during writes) and unescaped // (during reads). The following escapes are required for awssnssqs: // - Metadata keys: Characters other than "a-zA-z0-9_-.", and additionally "." // when it's at the start of the key or the previous character was ".", // are escaped using "__0x__". These characters were determined by // experimentation. // - Metadata values: Escaped using URL encoding. // - Message body: AWS SNS/SQS only supports UTF-8 strings. See the // BodyBase64Encoding enum in TopicOptions for strategies on how to send // non-UTF-8 message bodies. By default, non-UTF-8 message bodies are base64 // encoded. // // # As // // awssnssqs exposes the following types for As: // - Topic: *sns.Client for OpenSNSTopic, *sqs.Client for OpenSQSTopic // - Subscription: *sqs.Client // - Message: sqstypes.Message // - Message.BeforeSend: *sns.PublishBatchRequestEntry or *sns.PublishInput (deprecated) for OpenSNSTopic, *sqstypes.SendMessageBatchRequestEntry for OpenSQSTopic // - Message.AfterSend: snstypes.PublishBatchResultEntry or *sns.PublishOutput (deprecated) for OpenSNSTopic, sqstypes.SendMessageBatchResultEntry for OpenSQSTopic // - Error: any error type returned by the service, notably smithy.APIError package awssnssqs // import "gocloud.dev/pubsub/awssnssqs" import ( "context" "encoding/base64" "encoding/json" "errors" "fmt" "net/url" "path" "strconv" "strings" "sync" "time" "unicode/utf8" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/sns" snstypes "github.com/aws/aws-sdk-go-v2/service/sns/types" "github.com/aws/aws-sdk-go-v2/service/sqs" sqstypes "github.com/aws/aws-sdk-go-v2/service/sqs/types" "github.com/aws/smithy-go" "github.com/google/wire" gcaws "gocloud.dev/aws" "gocloud.dev/gcerrors" "gocloud.dev/internal/escape" "gocloud.dev/pubsub" "gocloud.dev/pubsub/batcher" "gocloud.dev/pubsub/driver" ) const ( // base64EncodedKey is the Message Attribute key used to flag that the // message body is base64 encoded. base64EncodedKey = "base64encoded" // How long ReceiveBatch should wait if no messages are available; controls // the poll interval of requests to SQS. noMessagesPollDuration = 250 * time.Millisecond ) var sendBatcherOptsSNS = &batcher.Options{ MaxBatchSize: 10, // SNS SendBatch supports 10 message at a time MaxHandlers: 100, // max concurrency for sends } var sendBatcherOptsSQS = &batcher.Options{ MaxBatchSize: 10, // SQS SendBatch supports 10 messages at a time MaxHandlers: 100, // max concurrency for sends } var recvBatcherOpts = &batcher.Options{ // SQS supports receiving at most 10 messages at a time: // https://godoc.org/github.com/aws/aws-sdk-go/service/sqs#SQS.ReceiveMessage MaxBatchSize: 10, MaxHandlers: 100, // max concurrency for receives } var ackBatcherOpts = &batcher.Options{ // SQS supports deleting/updating at most 10 messages at a time: // https://godoc.org/github.com/aws/aws-sdk-go/service/sqs#SQS.DeleteMessageBatch // https://godoc.org/github.com/aws/aws-sdk-go/service/sqs#SQS.ChangeMessageVisibilityBatch MaxBatchSize: 10, MaxHandlers: 100, // max concurrency for acks } func init() { lazy := new(lazySessionOpener) pubsub.DefaultURLMux().RegisterTopic(SNSScheme, lazy) pubsub.DefaultURLMux().RegisterTopic(SQSScheme, lazy) pubsub.DefaultURLMux().RegisterSubscription(SQSScheme, lazy) } // Set holds Wire providers for this package. var Set = wire.NewSet( DialSNS, DialSQS, ) // DialSNS gets an AWS SNS service client using the AWS SDK V2. func DialSNS(cfg aws.Config) *sns.Client { return sns.NewFromConfig(cfg) } // DialSQS gets an AWS SQS service client using the AWS SDK V2. func DialSQS(cfg aws.Config) *sqs.Client { return sqs.NewFromConfig(cfg) } // lazySessionOpener obtains the AWS session from the environment on the first // call to OpenXXXURL. type lazySessionOpener struct { init sync.Once opener *URLOpener err error } func (o *lazySessionOpener) defaultOpener(u *url.URL) (*URLOpener, error) { return &URLOpener{}, nil } func (o *lazySessionOpener) OpenTopicURL(ctx context.Context, u *url.URL) (*pubsub.Topic, error) { opener, err := o.defaultOpener(u) if err != nil { return nil, fmt.Errorf("open topic %v: failed to open default session: %v", u, err) } return opener.OpenTopicURL(ctx, u) } func (o *lazySessionOpener) OpenSubscriptionURL(ctx context.Context, u *url.URL) (*pubsub.Subscription, error) { opener, err := o.defaultOpener(u) if err != nil { return nil, fmt.Errorf("open subscription %v: failed to open default session: %v", u, err) } return opener.OpenSubscriptionURL(ctx, u) } // SNSScheme is the URL scheme for pubsub.OpenTopic (for an SNS topic) that // awssnssqs registers its URLOpeners under on pubsub.DefaultMux. const SNSScheme = "awssns" // SQSScheme is the URL scheme for pubsub.OpenTopic (for an SQS topic) and for // pubsub.OpenSubscription that awssnssqs registers its URLOpeners under on // pubsub.DefaultMux. const SQSScheme = "awssqs" // URLOpener opens AWS SNS/SQS URLs like "awssns:///sns-topic-arn" for // SNS topics or "awssqs://sqs-queue-url" for SQS topics and subscriptions. // // For SNS topics, the URL's host+path is used as the topic Amazon Resource Name // (ARN). Since ARNs have ":" in them, and ":" precedes a port in URL // hostnames, leave the host blank and put the ARN in the path // (e.g., "awssns:///arn:aws:service:region:accountid:resourceType/resourcePath"). // // For SQS topics and subscriptions, the URL's host+path is prefixed with // "https://" to create the queue URL. // // See https://pkg.go.dev/gocloud.dev/aws#V2ConfigFromURLParams. // // In addition, the following query parameters are supported: // // - raw (for "awssqs" Subscriptions only): sets SubscriberOptions.Raw. The // value must be parseable by `strconv.ParseBool`. // - nacklazy (for "awssqs" Subscriptions only): sets SubscriberOptions.NackLazy. The // value must be parseable by `strconv.ParseBool`. // - waittime: sets SubscriberOptions.WaitTime, in time.ParseDuration formats. type URLOpener struct { // TopicOptions specifies the options to pass to OpenTopic. TopicOptions TopicOptions // SubscriptionOptions specifies the options to pass to OpenSubscription. SubscriptionOptions SubscriptionOptions } // OpenTopicURL opens a pubsub.Topic based on u. func (o *URLOpener) OpenTopicURL(ctx context.Context, u *url.URL) (*pubsub.Topic, error) { // Trim leading "/" if host is empty, so that // awssns:///arn:aws:service:region:accountid:resourceType/resourcePath // gives "arn:..." instead of "/arn:...". topicARN := strings.TrimPrefix(path.Join(u.Host, u.Path), "/") qURL := "https://" + path.Join(u.Host, u.Path) cfg, err := gcaws.V2ConfigFromURLParams(ctx, u.Query()) if err != nil { return nil, fmt.Errorf("open topic %v: %v", u, err) } switch u.Scheme { case SNSScheme: return OpenSNSTopic(ctx, sns.NewFromConfig(cfg), topicARN, &o.TopicOptions), nil case SQSScheme: return OpenSQSTopic(ctx, sqs.NewFromConfig(cfg), qURL, &o.TopicOptions), nil default: return nil, fmt.Errorf("open topic %v: unsupported scheme", u) } } // OpenSubscriptionURL opens a pubsub.Subscription based on u. func (o *URLOpener) OpenSubscriptionURL(ctx context.Context, u *url.URL) (*pubsub.Subscription, error) { // Clone the options since we might override Raw. opts := o.SubscriptionOptions q := u.Query() if rawStr := q.Get("raw"); rawStr != "" { var err error opts.Raw, err = strconv.ParseBool(rawStr) if err != nil { return nil, fmt.Errorf("invalid value %q for raw: %v", rawStr, err) } q.Del("raw") } if nackLazyStr := q.Get("nacklazy"); nackLazyStr != "" { var err error opts.NackLazy, err = strconv.ParseBool(nackLazyStr) if err != nil { return nil, fmt.Errorf("invalid value %q for nacklazy: %v", nackLazyStr, err) } q.Del("nacklazy") } if waitTimeStr := q.Get("waittime"); waitTimeStr != "" { var err error opts.WaitTime, err = time.ParseDuration(waitTimeStr) if err != nil { return nil, fmt.Errorf("invalid value %q for waittime: %v", waitTimeStr, err) } q.Del("waittime") } qURL := "https://" + path.Join(u.Host, u.Path) cfg, err := gcaws.V2ConfigFromURLParams(ctx, q) if err != nil { return nil, fmt.Errorf("open subscription %v: %v", u, err) } return OpenSubscription(ctx, sqs.NewFromConfig(cfg), qURL, &opts), nil } type snsTopic struct { client *sns.Client arn string opts *TopicOptions } // BodyBase64Encoding is an enum of strategies for when to base64 message // bodies. type BodyBase64Encoding int const ( // NonUTF8Only means that message bodies that are valid UTF-8 encodings are // sent as-is. Invalid UTF-8 message bodies are base64 encoded, and a // MessageAttribute with key "base64encoded" is added to the message. // When receiving messages, the "base64encoded" attribute is used to determine // whether to base64 decode, and is then filtered out. NonUTF8Only BodyBase64Encoding = 0 // Always means that all message bodies are base64 encoded. // A MessageAttribute with key "base64encoded" is added to the message. // When receiving messages, the "base64encoded" attribute is used to determine // whether to base64 decode, and is then filtered out. Always BodyBase64Encoding = 1 // Never means that message bodies are never base64 encoded. Non-UTF-8 // bytes in message bodies may be modified by SNS/SQS. Never BodyBase64Encoding = 2 ) func (e BodyBase64Encoding) wantEncode(b []byte) bool { switch e { case Always: return true case Never: return false case NonUTF8Only: return !utf8.Valid(b) } panic("unreachable") } // TopicOptions contains configuration options for topics. type TopicOptions struct { // BodyBase64Encoding determines when message bodies are base64 encoded. // The default is NonUTF8Only. BodyBase64Encoding BodyBase64Encoding // BatcherOptions adds constraints to the default batching done for sends. BatcherOptions batcher.Options } // OpenSNSTopic opens a topic that sends to the SNS topic with the given Amazon // Resource Name (ARN), using AWS SDK V2. func OpenSNSTopic(ctx context.Context, client *sns.Client, topicARN string, opts *TopicOptions) *pubsub.Topic { if opts == nil { opts = &TopicOptions{} } bo := sendBatcherOptsSNS.NewMergedOptions(&opts.BatcherOptions) return pubsub.NewTopic(openSNSTopic(ctx, client, topicARN, opts), bo) } var OpenSNSTopicV2 = OpenSNSTopic // openSNSTopic returns the driver for OpenSNSTopic. This function exists so the test // harness can get the driver interface implementation if it needs to. func openSNSTopic(ctx context.Context, client *sns.Client, topicARN string, opts *TopicOptions) driver.Topic { return &snsTopic{ client: client, arn: topicARN, opts: opts, } } var stringDataType = aws.String("String") // encodeMetadata encodes the keys and values of md as needed. func encodeMetadata(md map[string]string) map[string]string { retval := map[string]string{} for k, v := range md { // See the package comments for more details on escaping of metadata // keys & values. k = escape.HexEscape(k, func(runes []rune, i int) bool { c := runes[i] switch { case escape.IsASCIIAlphanumeric(c): return false case c == '_' || c == '-': return false case c == '.' && i != 0 && runes[i-1] != '.': return false } return true }) retval[k] = escape.URLEscape(v) } return retval } // maybeEncodeBody decides whether body should base64-encoded based on opt, and // returns the (possibly encoded) body as a string, along with a boolean // indicating whether encoding occurred. func maybeEncodeBody(body []byte, opt BodyBase64Encoding) (string, bool) { if opt.wantEncode(body) { return base64.StdEncoding.EncodeToString(body), true } return string(body), false } // Defines values for Metadata keys used by the driver for setting message // attributes on SNS ([sns.PublishBatchRequestEntry]/[snstypes.PublishBatchRequestEntry]) // and SQS ([sqs.SendMessageBatchRequestEntry]/[sqstypes.SendMessageBatchRequestEntry]) // messages. // // For example, to set a deduplication ID and message group ID on a message: // // import ( // "gocloud.dev/pubsub" // "gocloud.dev/pubsub/awssnssqs" // ) // // message := pubsub.Message{ // Body: []byte("Hello, World!"), // Metadata: map[string]string{ // awssnssqs.MetadataKeyDeduplicationID: "my-dedup-id", // awssnssqs.MetadataKeyMessageGroupID: "my-group-id", // }, // } const ( MetadataKeyDeduplicationID = "DeduplicationId" MetadataKeyMessageGroupID = "MessageGroupId" ) // reviseSnsEntryAttributes sets attributes on a [snstypes.PublishBatchRequestEntry] based on [driver.Message.Metadata]. func reviseSnsEntryAttributes(dm *driver.Message, entry *snstypes.PublishBatchRequestEntry) { if dedupID, ok := dm.Metadata[MetadataKeyDeduplicationID]; ok { entry.MessageDeduplicationId = aws.String(dedupID) } if groupID, ok := dm.Metadata[MetadataKeyMessageGroupID]; ok { entry.MessageGroupId = aws.String(groupID) } } // SendBatch implements driver.Topic.SendBatch. func (t *snsTopic) SendBatch(ctx context.Context, dms []*driver.Message) error { req := &sns.PublishBatchInput{ TopicArn: &t.arn, } for _, dm := range dms { attrs := map[string]snstypes.MessageAttributeValue{} for k, v := range encodeMetadata(dm.Metadata) { attrs[k] = snstypes.MessageAttributeValue{ DataType: stringDataType, StringValue: aws.String(v), } } body, didEncode := maybeEncodeBody(dm.Body, t.opts.BodyBase64Encoding) if didEncode { attrs[base64EncodedKey] = snstypes.MessageAttributeValue{ DataType: stringDataType, StringValue: aws.String("true"), } } if len(attrs) == 0 { attrs = nil } entry := &snstypes.PublishBatchRequestEntry{ Id: aws.String(strconv.Itoa(len(req.PublishBatchRequestEntries))), MessageAttributes: attrs, Message: aws.String(body), } reviseSnsEntryAttributes(dm, entry) if dm.BeforeSend != nil { // A previous revision used the non-batch API PublishInput, which takes // a *sns.PublishInput. For backwards compatibility for As, continue // to support that type. If it is requested, create a PublishInput // with the fields from PublishBatchRequestEntry that were set, and // then copy all of the matching fields back after calling dm.BeforeSend. var pi *sns.PublishInput asFunc := func(i any) bool { if p, ok := i.(**sns.PublishInput); ok { pi = &sns.PublishInput{ // Id does not exist on PublishInput. MessageAttributes: entry.MessageAttributes, Message: entry.Message, } *p = pi return true } if p, ok := i.(**snstypes.PublishBatchRequestEntry); ok { *p = entry return true } return false } if err := dm.BeforeSend(asFunc); err != nil { return err } if pi != nil { // Copy all of the fields that may have been modified back to the entry. entry.MessageAttributes = pi.MessageAttributes entry.Message = pi.Message entry.MessageDeduplicationId = pi.MessageDeduplicationId entry.MessageGroupId = pi.MessageGroupId entry.MessageStructure = pi.MessageStructure entry.Subject = pi.Subject } } req.PublishBatchRequestEntries = append(req.PublishBatchRequestEntries, *entry) } resp, err := t.client.PublishBatch(ctx, req) if err != nil { return err } if numFailed := len(resp.Failed); numFailed > 0 { first := resp.Failed[0] return fmt.Errorf("sns.PublishBatch failed for %d message(s): %s, %s", numFailed, aws.ToString(first.Code), aws.ToString(first.Message)) } if len(resp.Successful) == len(dms) { for n, dm := range dms { if dm.AfterSend != nil { asFunc := func(i any) bool { if p, ok := i.(*snstypes.PublishBatchResultEntry); ok { *p = resp.Successful[n] return true } if p, ok := i.(**sns.PublishOutput); ok { // For backwards compability. *p = &sns.PublishOutput{ MessageId: resp.Successful[n].MessageId, SequenceNumber: resp.Successful[n].SequenceNumber, } return true } return false } if err := dm.AfterSend(asFunc); err != nil { return err } } } } return nil } // IsRetryable implements driver.Topic.IsRetryable. func (t *snsTopic) IsRetryable(error) bool { // The client handles retries. return false } // As implements driver.Topic.As. func (t *snsTopic) As(i any) bool { c, ok := i.(**sns.Client) if !ok { return false } *c = t.client return true } // ErrorAs implements driver.Topic.ErrorAs. func (t *snsTopic) ErrorAs(err error, i any) bool { return errorAs(err, i) } // ErrorCode implements driver.Topic.ErrorCode. func (t *snsTopic) ErrorCode(err error) gcerrors.ErrorCode { return errorCode(err) } // Close implements driver.Topic.Close. func (*snsTopic) Close() error { return nil } type sqsTopic struct { client *sqs.Client qURL string opts *TopicOptions } // OpenSQSTopic opens a topic that sends to the SQS topic with the given SQS // queue URL, using AWS SDK V2. func OpenSQSTopic(ctx context.Context, client *sqs.Client, qURL string, opts *TopicOptions) *pubsub.Topic { if opts == nil { opts = &TopicOptions{} } bo := sendBatcherOptsSQS.NewMergedOptions(&opts.BatcherOptions) return pubsub.NewTopic(openSQSTopic(ctx, client, qURL, opts), bo) } var OpenSQSTopicV2 = OpenSQSTopic // openSQSTopic returns the driver for OpenSQSTopic. This function exists so the test // harness can get the driver interface implementation if it needs to. func openSQSTopic(ctx context.Context, client *sqs.Client, qURL string, opts *TopicOptions) driver.Topic { return &sqsTopic{ client: client, qURL: qURL, opts: opts, } } // reviseSqsEntryAttributes sets attributes on a [sqstypes.SendMessageBatchRequestEntry] based on [driver.Message.Metadata]. func reviseSqsEntryAttributes(dm *driver.Message, entry *sqstypes.SendMessageBatchRequestEntry) { if dedupID, ok := dm.Metadata[MetadataKeyDeduplicationID]; ok { entry.MessageDeduplicationId = aws.String(dedupID) } if groupID, ok := dm.Metadata[MetadataKeyMessageGroupID]; ok { entry.MessageGroupId = aws.String(groupID) } } // SendBatch implements driver.Topic.SendBatch. func (t *sqsTopic) SendBatch(ctx context.Context, dms []*driver.Message) error { req := &sqs.SendMessageBatchInput{ QueueUrl: aws.String(t.qURL), } for _, dm := range dms { attrs := map[string]sqstypes.MessageAttributeValue{} for k, v := range encodeMetadata(dm.Metadata) { attrs[k] = sqstypes.MessageAttributeValue{ DataType: stringDataType, StringValue: aws.String(v), } } body, didEncode := maybeEncodeBody(dm.Body, t.opts.BodyBase64Encoding) if didEncode { attrs[base64EncodedKey] = sqstypes.MessageAttributeValue{ DataType: stringDataType, StringValue: aws.String("true"), } } if len(attrs) == 0 { attrs = nil } entry := &sqstypes.SendMessageBatchRequestEntry{ Id: aws.String(strconv.Itoa(len(req.Entries))), MessageAttributes: attrs, MessageBody: aws.String(body), } reviseSqsEntryAttributes(dm, entry) if dm.BeforeSend != nil { asFunc := func(i any) bool { if p, ok := i.(**sqstypes.SendMessageBatchRequestEntry); ok { *p = entry return true } return false } if err := dm.BeforeSend(asFunc); err != nil { return err } } req.Entries = append(req.Entries, *entry) } resp, err := t.client.SendMessageBatch(ctx, req) if err != nil { return err } if numFailed := len(resp.Failed); numFailed > 0 { first := resp.Failed[0] return fmt.Errorf("sqs.SendMessageBatch failed for %d message(s): %s, %s", numFailed, aws.ToString(first.Code), aws.ToString(first.Message)) } if len(resp.Successful) == len(dms) { for n, dm := range dms { if dm.AfterSend != nil { asFunc := func(i any) bool { if p, ok := i.(*sqstypes.SendMessageBatchResultEntry); ok { *p = resp.Successful[n] return true } return false } if err := dm.AfterSend(asFunc); err != nil { return err } } } } return nil } // IsRetryable implements driver.Topic.IsRetryable. func (t *sqsTopic) IsRetryable(error) bool { // The client handles retries. return false } // As implements driver.Topic.As. func (t *sqsTopic) As(i any) bool { c, ok := i.(**sqs.Client) if !ok { return false } *c = t.client return true } // ErrorAs implements driver.Topic.ErrorAs. func (t *sqsTopic) ErrorAs(err error, i any) bool { return errorAs(err, i) } // ErrorCode implements driver.Topic.ErrorCode. func (t *sqsTopic) ErrorCode(err error) gcerrors.ErrorCode { return errorCode(err) } // Close implements driver.Topic.Close. func (*sqsTopic) Close() error { return nil } func errorCode(err error) gcerrors.ErrorCode { var code string var ae smithy.APIError if errors.As(err, &ae) { code = ae.ErrorCode() } else { return gcerrors.Unknown } ec, ok := errorCodeMap[code] if !ok { return gcerrors.Unknown } return ec } var errorCodeMap = map[string]gcerrors.ErrorCode{ (&snstypes.AuthorizationErrorException{}).ErrorCode(): gcerrors.PermissionDenied, (&snstypes.KMSAccessDeniedException{}).ErrorCode(): gcerrors.PermissionDenied, (&snstypes.KMSDisabledException{}).ErrorCode(): gcerrors.FailedPrecondition, (&snstypes.KMSInvalidStateException{}).ErrorCode(): gcerrors.FailedPrecondition, (&snstypes.KMSOptInRequired{}).ErrorCode(): gcerrors.FailedPrecondition, (&sqstypes.MessageNotInflight{}).ErrorCode(): gcerrors.FailedPrecondition, (&sqstypes.PurgeQueueInProgress{}).ErrorCode(): gcerrors.FailedPrecondition, (&sqstypes.QueueDeletedRecently{}).ErrorCode(): gcerrors.FailedPrecondition, (&sqstypes.QueueNameExists{}).ErrorCode(): gcerrors.FailedPrecondition, (&snstypes.InternalErrorException{}).ErrorCode(): gcerrors.Internal, (&snstypes.InvalidParameterException{}).ErrorCode(): gcerrors.InvalidArgument, (&snstypes.InvalidParameterValueException{}).ErrorCode(): gcerrors.InvalidArgument, (&sqstypes.BatchEntryIdsNotDistinct{}).ErrorCode(): gcerrors.InvalidArgument, (&sqstypes.BatchRequestTooLong{}).ErrorCode(): gcerrors.InvalidArgument, (&sqstypes.EmptyBatchRequest{}).ErrorCode(): gcerrors.InvalidArgument, (&sqstypes.InvalidAttributeName{}).ErrorCode(): gcerrors.InvalidArgument, (&sqstypes.InvalidBatchEntryId{}).ErrorCode(): gcerrors.InvalidArgument, (&sqstypes.InvalidIdFormat{}).ErrorCode(): gcerrors.InvalidArgument, (&sqstypes.InvalidMessageContents{}).ErrorCode(): gcerrors.InvalidArgument, (&sqstypes.ReceiptHandleIsInvalid{}).ErrorCode(): gcerrors.InvalidArgument, (&sqstypes.TooManyEntriesInBatchRequest{}).ErrorCode(): gcerrors.InvalidArgument, (&sqstypes.UnsupportedOperation{}).ErrorCode(): gcerrors.InvalidArgument, (&snstypes.InvalidSecurityException{}).ErrorCode(): gcerrors.PermissionDenied, (&snstypes.KMSNotFoundException{}).ErrorCode(): gcerrors.NotFound, (&snstypes.NotFoundException{}).ErrorCode(): gcerrors.NotFound, (&sqstypes.QueueDoesNotExist{}).ErrorCode(): gcerrors.NotFound, "AWS.SimpleQueueService.NonExistentQueue": gcerrors.NotFound, (&snstypes.FilterPolicyLimitExceededException{}).ErrorCode(): gcerrors.ResourceExhausted, (&snstypes.SubscriptionLimitExceededException{}).ErrorCode(): gcerrors.ResourceExhausted, (&snstypes.TopicLimitExceededException{}).ErrorCode(): gcerrors.ResourceExhausted, (&sqstypes.OverLimit{}).ErrorCode(): gcerrors.ResourceExhausted, (&snstypes.KMSThrottlingException{}).ErrorCode(): gcerrors.ResourceExhausted, (&snstypes.ThrottledException{}).ErrorCode(): gcerrors.ResourceExhausted, "RequestCanceled": gcerrors.Canceled, (&snstypes.EndpointDisabledException{}).ErrorCode(): gcerrors.Unknown, (&snstypes.PlatformApplicationDisabledException{}).ErrorCode(): gcerrors.Unknown, } type subscription struct { client *sqs.Client qURL string opts *SubscriptionOptions } // SubscriptionOptions will contain configuration for subscriptions. type SubscriptionOptions struct { // Raw determines how the Subscription will process message bodies. // // If the subscription is expected to process messages sent directly to // SQS, or messages from SNS topics configured to use "raw" delivery, // set this to true. Message bodies will be passed through untouched. // // If false, the Subscription will use best-effort heuristics to // identify whether message bodies are raw or SNS JSON; this may be // inefficient for raw messages. // // See https://aws.amazon.com/sns/faqs/#Raw_message_delivery. Raw bool // NackLazy determines what Nack does. // // By default, Nack uses ChangeMessageVisibility to set the VisibilityTimeout // for the nacked message to 0, so that it will be redelivered immediately. // Set NackLazy to true to bypass this behavior; Nack will do nothing, // and the message will be redelivered after the existing VisibilityTimeout // expires (defaults to 30s, but can be configured per queue). // // See https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html. NackLazy bool // WaitTime passed to ReceiveMessage to enable long polling. // https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-short-and-long-polling.html#sqs-long-polling. // Note that a non-zero WaitTime can delay delivery of messages // by up to that duration. WaitTime time.Duration // ReceiveBatcherOptions adds constraints to the default batching done for receives. ReceiveBatcherOptions batcher.Options // AckBatcherOptions adds constraints to the default batching done for acks. AckBatcherOptions batcher.Options } // OpenSubscription opens a subscription based on AWS SQS for the given SQS // queue URL, using AWS SDK V2. The queue is assumed to be subscribed to some SNS topic, though // there is no check for this. func OpenSubscription(ctx context.Context, client *sqs.Client, qURL string, opts *SubscriptionOptions) *pubsub.Subscription { if opts == nil { opts = &SubscriptionOptions{} } rbo := recvBatcherOpts.NewMergedOptions(&opts.ReceiveBatcherOptions) abo := ackBatcherOpts.NewMergedOptions(&opts.AckBatcherOptions) return pubsub.NewSubscription(openSubscription(ctx, client, qURL, opts), rbo, abo) } var OpenSubscriptionV2 = OpenSubscription // openSubscription returns a driver.Subscription. func openSubscription(ctx context.Context, client *sqs.Client, qURL string, opts *SubscriptionOptions) driver.Subscription { return &subscription{ client: client, qURL: qURL, opts: opts, } } // ReceiveBatch implements driver.Subscription.ReceiveBatch. func (s *subscription) ReceiveBatch(ctx context.Context, maxMessages int) ([]*driver.Message, error) { var ms []*driver.Message req := &sqs.ReceiveMessageInput{ QueueUrl: aws.String(s.qURL), MaxNumberOfMessages: int32(maxMessages), MessageAttributeNames: []string{"All"}, AttributeNames: []sqstypes.QueueAttributeName{"All"}, } if s.opts.WaitTime != 0 { req.WaitTimeSeconds = int32(s.opts.WaitTime.Seconds()) } output, err := s.client.ReceiveMessage(ctx, req) if err != nil { return nil, err } for _, m := range output.Messages { bodyStr := aws.ToString(m.Body) rawAttrs := map[string]string{} for k, v := range m.MessageAttributes { rawAttrs[k] = aws.ToString(v.StringValue) } bodyStr, rawAttrs = extractBody(bodyStr, rawAttrs, s.opts.Raw) decodeIt := false attrs := map[string]string{} for k, v := range rawAttrs { // See BodyBase64Encoding for details on when we base64 decode message bodies. if k == base64EncodedKey { decodeIt = true continue } // See the package comments for more details on escaping of metadata // keys & values. attrs[escape.HexUnescape(k)] = escape.URLUnescape(v) } var b []byte if decodeIt { var err error b, err = base64.StdEncoding.DecodeString(bodyStr) if err != nil { // Fall back to using the raw message. b = []byte(bodyStr) } } else { b = []byte(bodyStr) } m2 := &driver.Message{ LoggableID: aws.ToString(m.MessageId), Body: b, Metadata: attrs, AckID: m.ReceiptHandle, AsFunc: func(i any) bool { p, ok := i.(*sqstypes.Message) if !ok { return false } *p = m return true }, } ms = append(ms, m2) } if len(ms) == 0 { // When we return no messages and no error, the portable type will call // ReceiveBatch again immediately. Sleep for a bit to avoid hammering SQS // with RPCs. time.Sleep(noMessagesPollDuration) } return ms, nil } func extractBody(bodyStr string, rawAttrs map[string]string, raw bool) (body string, attributes map[string]string) { // If the user told us that message bodies are raw, or if there are // top-level MessageAttributes, then it's raw. // (SNS JSON message can have attributes, but they are encoded in // the JSON instead of being at the top level). raw = raw || len(rawAttrs) > 0 if raw { // For raw messages, the attributes are at the top level // and we leave bodyStr alone. return bodyStr, rawAttrs } // It might be SNS JSON; try to parse the raw body as such. // https://aws.amazon.com/sns/faqs/#Raw_message_delivery // If it parses as JSON and has a TopicArn field, assume it's SNS JSON. var bodyJSON struct { TopicArn string Message string MessageAttributes map[string]struct{ Value string } } if err := json.Unmarshal([]byte(bodyStr), &bodyJSON); err == nil && bodyJSON.TopicArn != "" { // It looks like SNS JSON. Get attributes from the decoded struct, // and update the body to be the JSON Message field. for k, v := range bodyJSON.MessageAttributes { rawAttrs[k] = v.Value } return bodyJSON.Message, rawAttrs } // It doesn't look like SNS JSON, either because it // isn't JSON or because the JSON doesn't have a TopicArn // field. Treat it as raw. // // As above in the other "raw" case, we leave bodyStr // alone. There can't be any top-level attributes (because // then we would have known it was raw earlier). return bodyStr, rawAttrs } // SendAcks implements driver.Subscription.SendAcks. func (s *subscription) SendAcks(ctx context.Context, ids []driver.AckID) error { req := &sqs.DeleteMessageBatchInput{QueueUrl: aws.String(s.qURL)} for _, id := range ids { req.Entries = append(req.Entries, sqstypes.DeleteMessageBatchRequestEntry{ Id: aws.String(strconv.Itoa(len(req.Entries))), ReceiptHandle: id.(*string), }) } resp, err := s.client.DeleteMessageBatch(ctx, req) if err != nil { return err } // Note: DeleteMessageBatch doesn't return failures when you try // to Delete an id that isn't found. if numFailed := len(resp.Failed); numFailed > 0 { first := resp.Failed[0] return fmt.Errorf("sqs.DeleteMessageBatch failed for %d message(s): %s, %s", numFailed, aws.ToString(first.Code), aws.ToString(first.Message)) } return nil } // CanNack implements driver.CanNack. func (s *subscription) CanNack() bool { return true } // SendNacks implements driver.Subscription.SendNacks. func (s *subscription) SendNacks(ctx context.Context, ids []driver.AckID) error { if s.opts.NackLazy { return nil } req := &sqs.ChangeMessageVisibilityBatchInput{QueueUrl: aws.String(s.qURL)} for _, id := range ids { req.Entries = append(req.Entries, sqstypes.ChangeMessageVisibilityBatchRequestEntry{ Id: aws.String(strconv.Itoa(len(req.Entries))), ReceiptHandle: id.(*string), VisibilityTimeout: 1, }) } resp, err := s.client.ChangeMessageVisibilityBatch(ctx, req) if err != nil { return err } // Note: ChangeMessageVisibilityBatch returns failures when you try to // modify an id that isn't found; drop those. var firstFail sqstypes.BatchResultErrorEntry numFailed := 0 for _, fail := range resp.Failed { if aws.ToString(fail.Code) == (&sqstypes.ReceiptHandleIsInvalid{}).ErrorCode() { continue } if numFailed == 0 { firstFail = fail } numFailed++ } if numFailed > 0 { return fmt.Errorf("sqs.ChangeMessageVisibilityBatch failed for %d message(s): %s, %s", numFailed, aws.ToString(firstFail.Code), aws.ToString(firstFail.Message)) } return nil } // IsRetryable implements driver.Subscription.IsRetryable. func (*subscription) IsRetryable(error) bool { // The client handles retries. return false } // As implements driver.Subscription.As. func (s *subscription) As(i any) bool { c, ok := i.(**sqs.Client) if !ok { return false } *c = s.client return true } // ErrorAs implements driver.Subscription.ErrorAs. func (s *subscription) ErrorAs(err error, i any) bool { return errorAs(err, i) } // ErrorCode implements driver.Subscription.ErrorCode. func (s *subscription) ErrorCode(err error) gcerrors.ErrorCode { return errorCode(err) } func errorAs(err error, i any) bool { return errors.As(err, i) } // Close implements driver.Subscription.Close. func (*subscription) Close() error { return nil } ================================================ FILE: pubsub/awssnssqs/awssnssqs_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package awssnssqs import ( "context" "errors" "fmt" "maps" "net/http" "strings" "sync/atomic" "testing" "time" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/sns" snstypes "github.com/aws/aws-sdk-go-v2/service/sns/types" "github.com/aws/aws-sdk-go-v2/service/sqs" sqstypes "github.com/aws/aws-sdk-go-v2/service/sqs/types" "github.com/aws/smithy-go" "github.com/google/go-cmp/cmp" "gocloud.dev/internal/testing/setup" "gocloud.dev/pubsub" "gocloud.dev/pubsub/driver" "gocloud.dev/pubsub/drivertest" ) const ( region = "us-east-2" accountNumber = "456752665576" ) // We run conformance tests against multiple kinds of topics; this enum // represents which one we're doing. type topicKind string const ( topicKindSNS = topicKind("SNS") // send through an SNS topic topicKindSNSRaw = topicKind("SNSRaw") // send through an SNS topic using RawMessageDelivery=true topicKindSQS = topicKind("SQS") // send directly to an SQS queue ) type harness struct { snsClient *sns.Client sqsClient *sqs.Client topicKind topicKind rt http.RoundTripper closer func() numTopics uint32 numSubs uint32 useFIFO bool topicAttributes map[string]string } type harnessOption func(h *harness) func newHarness(ctx context.Context, t *testing.T, topicKind topicKind) (drivertest.Harness, error) { t.Helper() cfg, rt, closer, _ := setup.NewAWSv2Config(context.Background(), t, region, false) return &harness{snsClient: sns.NewFromConfig(cfg), sqsClient: sqs.NewFromConfig(cfg), rt: rt, topicKind: topicKind, closer: closer}, nil } func (h *harness) CreateTopic(ctx context.Context, testName string) (dt driver.Topic, cleanup func(), err error) { topicName := sanitize(fmt.Sprintf("%s-top-%d", testName, atomic.AddUint32(&h.numTopics, 1))) if h.useFIFO { topicName += ".fifo" } return createTopic(ctx, topicName, h.snsClient, h.sqsClient, h.topicKind, h.topicAttributes) } func convertStringToPtrMap(m map[string]string) map[string]*string { if m == nil { return nil } out := make(map[string]*string, len(m)) for k, v := range m { out[k] = aws.String(v) } return out } func createTopic(ctx context.Context, topicName string, snsClient *sns.Client, sqsClient *sqs.Client, topicKind topicKind, attributes map[string]string) (dt driver.Topic, cleanup func(), err error) { switch topicKind { case topicKindSNS, topicKindSNSRaw: // Create an SNS topic. input := &sns.CreateTopicInput{Name: aws.String(topicName), Attributes: attributes} out, err := snsClient.CreateTopic(ctx, input) if err != nil { return nil, nil, fmt.Errorf("creating SNS topic %q: %v", topicName, err) } dt = openSNSTopic(ctx, snsClient, *out.TopicArn, &TopicOptions{}) cleanup = func() { snsClient.DeleteTopic(ctx, &sns.DeleteTopicInput{TopicArn: out.TopicArn}) } return dt, cleanup, nil case topicKindSQS: // Create an SQS queue. qURL, _, err := createSQSQueue(ctx, sqsClient, topicName, attributes) if err != nil { return nil, nil, fmt.Errorf("creating SQS queue %q: %v", topicName, err) } dt = openSQSTopic(ctx, sqsClient, qURL, &TopicOptions{}) cleanup = func() { sqsClient.DeleteQueue(ctx, &sqs.DeleteQueueInput{QueueUrl: aws.String(qURL)}) } return dt, cleanup, nil default: panic("unreachable") } } func (h *harness) MakeNonexistentTopic(ctx context.Context) (driver.Topic, error) { switch h.topicKind { case topicKindSNS, topicKindSNSRaw: const fakeTopicARN = "arn:aws:sns:" + region + ":" + accountNumber + ":nonexistenttopic" return openSNSTopic(ctx, h.snsClient, fakeTopicARN, &TopicOptions{}), nil case topicKindSQS: const fakeQueueURL = "https://" + region + ".amazonaws.com/" + accountNumber + "/nonexistent-queue" return openSQSTopic(ctx, h.sqsClient, fakeQueueURL, &TopicOptions{}), nil default: panic("unreachable") } } func (h *harness) CreateSubscription(ctx context.Context, dt driver.Topic, testName string) (ds driver.Subscription, cleanup func(), err error) { subName := sanitize(fmt.Sprintf("%s-sub-%d", testName, atomic.AddUint32(&h.numSubs, 1))) return createSubscription(ctx, dt, subName, h.snsClient, h.sqsClient, h.topicKind) } func createSubscription(ctx context.Context, dt driver.Topic, subName string, snsClient *sns.Client, sqsClient *sqs.Client, topicKind topicKind) (ds driver.Subscription, cleanup func(), err error) { switch topicKind { case topicKindSNS, topicKindSNSRaw: // Create an SQS queue, and subscribe it to the SNS topic. qURL, qARN, err := createSQSQueue(ctx, sqsClient, subName, nil) if err != nil { return nil, nil, fmt.Errorf("creating SQS queue %q: %v", subName, err) } ds = openSubscription(ctx, sqsClient, qURL, &SubscriptionOptions{}) snsTopicARN := dt.(*snsTopic).arn var cleanup func() req := &sns.SubscribeInput{ TopicArn: aws.String(snsTopicARN), Endpoint: aws.String(qARN), Protocol: aws.String("sqs"), } // Enable RawMessageDelivery on the subscription if needed. if topicKind == topicKindSNSRaw { req.Attributes = map[string]string{"RawMessageDelivery": "true"} } out, err := snsClient.Subscribe(ctx, req) if err != nil { return nil, nil, fmt.Errorf("subscribing: %v", err) } cleanup = func() { snsClient.Unsubscribe(ctx, &sns.UnsubscribeInput{SubscriptionArn: out.SubscriptionArn}) sqsClient.DeleteQueue(ctx, &sqs.DeleteQueueInput{QueueUrl: aws.String(qURL)}) } return ds, cleanup, nil case topicKindSQS: // The SQS queue already exists; we created it for the topic. Re-use it // for the subscription. qURL := dt.(*sqsTopic).qURL return openSubscription(ctx, sqsClient, qURL, &SubscriptionOptions{}), func() {}, nil default: panic("unreachable") } } func createSQSQueue(ctx context.Context, sqsClient *sqs.Client, topicName string, attributes map[string]string) (string, string, error) { out, err := sqsClient.CreateQueue(ctx, &sqs.CreateQueueInput{QueueName: aws.String(topicName), Attributes: attributes}) if err != nil { return "", "", fmt.Errorf("creating SQS queue %q: %v", topicName, err) } qURL := aws.ToString(out.QueueUrl) // Get the ARN. out2, err := sqsClient.GetQueueAttributes(ctx, &sqs.GetQueueAttributesInput{ QueueUrl: aws.String(qURL), AttributeNames: []sqstypes.QueueAttributeName{"QueueArn"}, }) if err != nil { return "", "", fmt.Errorf("getting queue ARN for %s: %v", qURL, err) } qARN := out2.Attributes["QueueArn"] queuePolicy := `{ "Version": "2012-10-17", "Id": "AllowQueue", "Statement": [ { "Sid": "MySQSPolicy001", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "sqs:SendMessage", "Resource": "` + qARN + `" } ] }` if _, err := sqsClient.SetQueueAttributes(ctx, &sqs.SetQueueAttributesInput{ Attributes: map[string]string{"Policy": queuePolicy}, QueueUrl: aws.String(qURL), }); err != nil { return "", "", fmt.Errorf("setting policy: %v", err) } return qURL, qARN, nil } func (h *harness) MakeNonexistentSubscription(ctx context.Context) (driver.Subscription, func(), error) { const fakeSubscriptionQueueURL = "https://" + region + ".amazonaws.com/" + accountNumber + "/nonexistent-subscription" return openSubscription(ctx, h.sqsClient, fakeSubscriptionQueueURL, &SubscriptionOptions{}), func() {}, nil } func (h *harness) Close() { h.closer() } func (h *harness) MaxBatchSizes() (int, int) { if h.topicKind == topicKindSQS { return sendBatcherOptsSQS.MaxBatchSize, ackBatcherOpts.MaxBatchSize } return sendBatcherOptsSNS.MaxBatchSize, ackBatcherOpts.MaxBatchSize } func (h *harness) SupportsMultipleSubscriptions() bool { // If we're publishing to an SQS topic, we're reading from the same topic, // so there's no way to get multiple subscriptions. return h.topicKind != topicKindSQS } func TestConformanceSNSTopic(t *testing.T) { asTests := []drivertest.AsTest{awsAsTest{topicKind: topicKindSNS}} newSNSHarness := func(ctx context.Context, t *testing.T) (drivertest.Harness, error) { t.Helper() return newHarness(ctx, t, topicKindSNS) } drivertest.RunConformanceTests(t, newSNSHarness, asTests) } func TestConformanceSNSTopicRaw(t *testing.T) { asTests := []drivertest.AsTest{awsAsTest{topicKind: topicKindSNSRaw}} newSNSHarness := func(ctx context.Context, t *testing.T) (drivertest.Harness, error) { t.Helper() return newHarness(ctx, t, topicKindSNSRaw) } drivertest.RunConformanceTests(t, newSNSHarness, asTests) } func TestConformanceSQSTopic(t *testing.T) { asTests := []drivertest.AsTest{awsAsTest{topicKind: topicKindSQS}} newSQSHarness := func(ctx context.Context, t *testing.T) (drivertest.Harness, error) { t.Helper() return newHarness(ctx, t, topicKindSQS) } drivertest.RunConformanceTests(t, newSQSHarness, asTests) } type awsAsTest struct { topicKind topicKind } func (awsAsTest) Name() string { return "aws test" } func (t awsAsTest) TopicCheck(topic *pubsub.Topic) error { switch t.topicKind { case topicKindSNS, topicKindSNSRaw: var s *sns.Client if !topic.As(&s) { return fmt.Errorf("cast failed for %T", s) } case topicKindSQS: var s *sqs.Client if !topic.As(&s) { return fmt.Errorf("cast failed for %T", s) } default: panic("unreachable") } return nil } func (t awsAsTest) SubscriptionCheck(sub *pubsub.Subscription) error { var s *sqs.Client if !sub.As(&s) { return fmt.Errorf("cast failed for %T", s) } return nil } func (t awsAsTest) TopicErrorCheck(topic *pubsub.Topic, err error) error { var e smithy.APIError if !topic.ErrorAs(err, &e) { return errors.New("Topic.ErrorAs failed") } switch t.topicKind { case topicKindSNS, topicKindSNSRaw: if got, want := e.ErrorCode(), (&snstypes.NotFoundException{}).ErrorCode(); want != got { return fmt.Errorf("got %q, want %q", got, want) } case topicKindSQS: if got, want := e.ErrorCode(), "AWS.SimpleQueueService.NonExistentQueue"; got != want { return fmt.Errorf("got %q, want %q", got, want) } default: panic("unreachable") } return nil } func (t awsAsTest) SubscriptionErrorCheck(s *pubsub.Subscription, err error) error { var e smithy.APIError if !s.ErrorAs(err, &e) { return errors.New("Subscription.ErrorAs failed") } if got, want := e.ErrorCode(), "AWS.SimpleQueueService.NonExistentQueue"; got != want { return fmt.Errorf("got %q, want %q", got, want) } return nil } func (t awsAsTest) MessageCheck(m *pubsub.Message) error { var sm sqstypes.Message if !m.As(&sm) { return fmt.Errorf("cast failed for %T", &sm) } return nil } func (t awsAsTest) BeforeSend(as func(any) bool) error { switch t.topicKind { case topicKindSNS, topicKindSNSRaw: var pub *sns.PublishInput if !as(&pub) { return fmt.Errorf("cast failed for %T", &pub) } var entry *snstypes.PublishBatchRequestEntry if !as(&entry) { return fmt.Errorf("cast failed for %T", &entry) } case topicKindSQS: var entry *sqstypes.SendMessageBatchRequestEntry if !as(&entry) { return fmt.Errorf("cast failed for %T", &entry) } default: panic("unreachable") } return nil } func (t awsAsTest) AfterSend(as func(any) bool) error { switch t.topicKind { case topicKindSNS, topicKindSNSRaw: var pub *sns.PublishOutput if !as(&pub) { return fmt.Errorf("cast failed for %T", &pub) } var entry snstypes.PublishBatchResultEntry if !as(&entry) { return fmt.Errorf("cast failed for %T", &entry) } case topicKindSQS: var entry sqstypes.SendMessageBatchResultEntry if !as(&entry) { return fmt.Errorf("cast failed for %T", &entry) } default: panic("unreachable") } return nil } func sanitize(s string) string { // AWS doesn't like names that are too long; trim some not-so-useful stuff. const maxNameLen = 80 s = strings.Replace(s, "TestConformance", "", 1) s = strings.Replace(s, "/Test", "", 1) s = strings.Replace(s, "/", "_", -1) if len(s) > maxNameLen { // Drop prefix, not suffix, because suffix includes something to make // entities unique within a test. s = s[len(s)-maxNameLen:] } return s } func BenchmarkSNSSQS(b *testing.B) { benchmark(b, topicKindSNS) } func BenchmarkSQS(b *testing.B) { benchmark(b, topicKindSQS) } func benchmark(b *testing.B, topicKind topicKind) { b.Helper() ctx := context.Background() cfg, err := config.LoadDefaultConfig(ctx) if err != nil { b.Fatal(err) } topicName := fmt.Sprintf("%s-topic", b.Name()) snsClient := sns.NewFromConfig(cfg) sqsClient := sqs.NewFromConfig(cfg) dt, cleanup1, err := createTopic(ctx, topicName, snsClient, sqsClient, topicKind, nil) if err != nil { b.Fatal(err) } defer cleanup1() sendBatcherOpts := sendBatcherOptsSNS if topicKind == topicKindSQS { sendBatcherOpts = sendBatcherOptsSQS } topic := pubsub.NewTopic(dt, sendBatcherOpts) defer topic.Shutdown(ctx) subName := fmt.Sprintf("%s-subscription", b.Name()) ds, cleanup2, err := createSubscription(ctx, dt, subName, snsClient, sqsClient, topicKind) if err != nil { b.Fatal(err) } defer cleanup2() sub := pubsub.NewSubscription(ds, recvBatcherOpts, ackBatcherOpts) defer sub.Shutdown(ctx) drivertest.RunBenchmarks(b, topic, sub) } func TestOpenTopicFromURL(t *testing.T) { tests := []struct { URL string WantErr bool }{ // SNS... // OK. {"awssns:///arn:aws:service:region:accountid:resourceType/resourcePath", false}, // OK, setting region. {"awssns:///arn:aws:service:region:accountid:resourceType/resourcePath?region=us-east-2", false}, // Invalid parameter. {"awssns:///arn:aws:service:region:accountid:resourceType/resourcePath?param=value", true}, // SQS... // OK. {"awssqs://sqs.us-east-2.amazonaws.com/99999/my-queue", false}, // OK, setting region. {"awssqs://sqs.us-east-2.amazonaws.com/99999/my-queue?region=us-east-2", false}, // Invalid parameter. {"awssqs://sqs.us-east-2.amazonaws.com/99999/my-queue?param=value", true}, } ctx := context.Background() for _, test := range tests { topic, err := pubsub.OpenTopic(ctx, test.URL) if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } if topic != nil { topic.Shutdown(ctx) } } } func TestOpenSubscriptionFromURL(t *testing.T) { tests := []struct { URL string WantErr bool }{ // OK. {"awssqs://sqs.us-east-2.amazonaws.com/99999/my-queue", false}, // OK, setting region. {"awssqs://sqs.us-east-2.amazonaws.com/99999/my-queue?region=us-east-2", false}, // OK, setting raw. {"awssqs://sqs.us-east-2.amazonaws.com/99999/my-queue?raw=true", false}, // OK, setting raw. {"awssqs://sqs.us-east-2.amazonaws.com/99999/my-queue?raw=1", false}, // Invalid raw. {"awssqs://sqs.us-east-2.amazonaws.com/99999/my-queue?raw=foo", true}, // OK, setting nacklazy. {"awssqs://sqs.us-east-2.amazonaws.com/99999/my-queue?nacklazy=1", false}, // Invalid nacklazy. {"awssqs://sqs.us-east-2.amazonaws.com/99999/my-queue?nacklazy=foo", true}, // OK, setting waittime. {"awssqs://sqs.us-east-2.amazonaws.com/99999/my-queue?waittime=5s", false}, // Invalid waittime. {"awssqs://sqs.us-east-2.amazonaws.com/99999/my-queue?waittime=foo", true}, // Invalid parameter. {"awssqs://sqs.us-east-2.amazonaws.com/99999/my-queue?param=value", true}, } ctx := context.Background() for _, test := range tests { sub, err := pubsub.OpenSubscription(ctx, test.URL) if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } if sub != nil { sub.Shutdown(ctx) } } } func TestFIFO(t *testing.T) { for _, tt := range []struct { name string kind topicKind }{ { name: "TestSNSTopic", kind: topicKindSNS, }, // This test is flaky because it sets 2 attributes for CreateTopic, // and the HTTP record/replay randomly re-sorts them. I'm not sure how // to fix that, so disabling the test. It's also unclear why only // this test appears affected, maybe the AWS code iterates over the // map here and doesn't in other cases? /* { name: "TestSQSTopic", kind: topicKindSQS, }, */ } { t.Run(tt.name, func(t *testing.T) { testFIFOTopic(t, tt.kind) }) } } // testFIFOTopic tests FIFO topics. // // FIFO topics require a message group ID to be set on the message. // // The content-based deduplication attribute must be set to true on the topic. // - If set to true, the message deduplication ID is generated using the message body (sha256 hash). // - If not set, then the DeduplicationID must be set on the message. // // For more information see: // - https://pkg.go.dev/github.com/aws/aws-sdk-go/service/sns#CreateTopicInput.Attributes // - https://pkg.go.dev/github.com/aws/aws-sdk-go/service/sqs#CreateQueueInput.Attributes func testFIFOTopic(t *testing.T, kind topicKind) { t.Helper() type harnessArgs struct { attributes map[string]string } const ( attributeKeyContentBasedDeduplication = "ContentBasedDeduplication" attributeKeyFifoTopic = "FifoTopic" attributeKeyFifoQueue = "FifoQueue" ) tests := []struct { name string harness harnessArgs message *pubsub.Message wantErr bool }{ { name: "TestSendReceiveValid", harness: harnessArgs{ attributes: map[string]string{ attributeKeyContentBasedDeduplication: "true", }, }, message: &pubsub.Message{ Body: []byte("hello world"), Metadata: map[string]string{ MetadataKeyMessageGroupID: "1", }, }, wantErr: false, }, { name: "TestSendReceiveInvalidNoMessageGroupID", harness: harnessArgs{ attributes: map[string]string{ attributeKeyContentBasedDeduplication: "true", }, }, message: &pubsub.Message{ Body: []byte("hello world"), Metadata: map[string]string{ MetadataKeyDeduplicationID: "1", }, }, wantErr: true, }, { name: "TestSendReceiveInvalidNoDeduplicationID", // We dont set the ContentBasedDeduplication attribute to trigger the error. harness: harnessArgs{}, message: &pubsub.Message{ Body: []byte("hello world"), Metadata: map[string]string{}, }, wantErr: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { // Create the harness. ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second) defer cancel() h, err := newHarness(ctx, t, kind) if err != nil { t.Fatal(err) } defer h.Close() // Set the FIFO attributes. attributes := make(map[string]string) maps.Copy(attributes, tt.harness.attributes) switch kind { case topicKindSNS: attributes[attributeKeyFifoTopic] = "true" case topicKindSQS: attributes[attributeKeyFifoQueue] = "true" } h.(*harness).topicAttributes = attributes h.(*harness).useFIFO = true // Create the topic and subscription. dt, cleanup, err := h.CreateTopic(ctx, t.Name()) if err != nil { t.Errorf("harness.CreateTopic() error = %v", err) return } defer cleanup() topic := pubsub.NewTopic(dt, sendBatcherOptsSNS) defer topic.Shutdown(ctx) ds, cleanup, err := h.CreateSubscription(ctx, dt, t.Name()) if err != nil { t.Errorf("harness.CreateSubscription() error = %v", err) return } defer cleanup() sub := pubsub.NewSubscription(ds, recvBatcherOpts, ackBatcherOpts) defer sub.Shutdown(ctx) // Send and receive the message. err = topic.Send(ctx, tt.message) if (err != nil) != tt.wantErr { t.Errorf("Topic.Send() error = %v, wantErr %v", err, tt.wantErr) return } if tt.wantErr { return } m, err := sub.Receive(ctx) if err != nil { t.Errorf("Subscription.Receive() error = %v", err) return } if diff := cmp.Diff(tt.message.Body, m.Body); diff != "" { t.Errorf("Received message body: -got, +want: %s", diff) } m.Ack() }) } } ================================================ FILE: pubsub/awssnssqs/example_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package awssnssqs_test import ( "context" "log" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/sns" "github.com/aws/aws-sdk-go-v2/service/sqs" "gocloud.dev/pubsub" "gocloud.dev/pubsub/awssnssqs" ) func ExampleOpenSNSTopic() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // Establish a AWS V2 Config. // See https://aws.github.io/aws-sdk-go-v2/docs/configuring-sdk/ for more info. cfg, err := config.LoadDefaultConfig(ctx) if err != nil { log.Fatal(err) } // Create a *pubsub.Topic. const topicARN = "arn:aws:sns:us-east-2:123456789012:mytopic" client := sns.NewFromConfig(cfg) topic := awssnssqs.OpenSNSTopic(ctx, client, topicARN, nil) defer topic.Shutdown(ctx) } func ExampleOpenSQSTopic() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // Establish a AWS V2 Config. // See https://aws.github.io/aws-sdk-go-v2/docs/configuring-sdk/ for more info. cfg, err := config.LoadDefaultConfig(ctx) if err != nil { log.Fatal(err) } // Create a *pubsub.Topic. const queueURL = "https://sqs.us-east-2.amazonaws.com/123456789012/myqueue" client := sqs.NewFromConfig(cfg) topic := awssnssqs.OpenSQSTopic(ctx, client, queueURL, nil) defer topic.Shutdown(ctx) } func Example_openSNSTopicFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/pubsub/awssnssqs" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() const topicARN = "arn:aws:sns:us-east-2:123456789012:mytopic" // Note the 3 slashes; ARNs have multiple colons and therefore aren't valid // as hostnames in the URL. topic, err := pubsub.OpenTopic(ctx, "awssns:///"+topicARN+"?region=us-east-2") if err != nil { log.Fatal(err) } defer topic.Shutdown(ctx) } func Example_openSQSTopicFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/pubsub/awssnssqs" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // https://docs.aws.amazon.com/sdk-for-net/v2/developer-guide/QueueURL.html const queueURL = "sqs.us-east-2.amazonaws.com/123456789012/myqueue" topic, err := pubsub.OpenTopic(ctx, "awssqs://"+queueURL+"?region=us-east-2") if err != nil { log.Fatal(err) } defer topic.Shutdown(ctx) } func ExampleOpenSubscription() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // Establish a AWS V2 Config. // See https://aws.github.io/aws-sdk-go-v2/docs/configuring-sdk/ for more info. cfg, err := config.LoadDefaultConfig(ctx) if err != nil { log.Fatal(err) } // Construct a *pubsub.Subscription. // https://docs.aws.amazon.com/sdk-for-net/v2/developer-guide/QueueURL.html const queueURL = "https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue" client := sqs.NewFromConfig(cfg) subscription := awssnssqs.OpenSubscription(ctx, client, queueURL, nil) defer subscription.Shutdown(ctx) } func Example_openSubscriptionFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/pubsub/awssnssqs" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // pubsub.OpenSubscription creates a *pubsub.Subscription from a URL. // This URL will open the subscription with the URL // "https://sqs.us-east-2.amazonaws.com/123456789012/myqueue". subscription, err := pubsub.OpenSubscription(ctx, "awssqs://sqs.us-east-2.amazonaws.com/123456789012/"+ "myqueue?region=us-east-2") if err != nil { log.Fatal(err) } defer subscription.Shutdown(ctx) } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSNSTopic/TestAs/aws_test.replay ================================================ { "Initial": "AQAAAA7hTg2fGPSxkQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "51c5d0bc966be3c9", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "68" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPUNyZWF0ZVRvcGljJk5hbWU9U05TVG9waWNBc19hd3NfdGVzdC10b3AtMSZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "332" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:39 GMT" ], "X-Amzn-Requestid": [ "74680f87-9ba5-59e5-9687-6db1837a81ad" ] }, "Body": "PENyZWF0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxDcmVhdGVUb3BpY1Jlc3VsdD4KICAgIDxUb3BpY0Fybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljQXNfYXdzX3Rlc3QtdG9wLTE8L1RvcGljQXJuPgogIDwvQ3JlYXRlVG9waWNSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjc0NjgwZjg3LTliYTUtNTllNS05Njg3LTZkYjE4MzdhODFhZDwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9DcmVhdGVUb3BpY1Jlc3BvbnNlPgo=" } }, { "ID": "adb2731fc901ea78", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "41" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTTlNUb3BpY0FzX2F3c190ZXN0LXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "89" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:40 GMT" ], "X-Amzn-Requestid": [ "45c9262c-9467-5298-b263-441a8cb8a2c8" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0FzX2F3c190ZXN0LXN1Yi0xIn0=" } }, { "ID": "c583a255cad58a58", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "119" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0FzX2F3c190ZXN0LXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "90" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:40 GMT" ], "X-Amzn-Requestid": [ "b9e98d17-3eed-5356-96fe-ef21260db306" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY0FzX2F3c190ZXN0LXN1Yi0xIn19" } }, { "ID": "6fa64c38fc7012f9", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "464" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljQXNfYXdzX3Rlc3Qtc3ViLTFcIlxuXHRcdH1cblx0XHRdXG5cdFx0fSJ9LCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0FzX2F3c190ZXN0LXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:40 GMT" ], "X-Amzn-Requestid": [ "e5f312da-c3b0-5c4e-b31e-70ecdb50ac1e" ] }, "Body": "" } }, { "ID": "b9087982d150c434", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "208" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVN1YnNjcmliZSZFbmRwb2ludD1hcm4lM0Fhd3MlM0FzcXMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY0FzX2F3c190ZXN0LXN1Yi0xJlByb3RvY29sPXNxcyZUb3BpY0Fybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY0FzX2F3c190ZXN0LXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "375" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:40 GMT" ], "X-Amzn-Requestid": [ "86bf96ad-eab1-5f71-9847-f49bf2510739" ] }, "Body": "PFN1YnNjcmliZVJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8U3Vic2NyaWJlUmVzdWx0PgogICAgPFN1YnNjcmlwdGlvbkFybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljQXNfYXdzX3Rlc3QtdG9wLTE6ZWEwYWMxODAtZjQzOC00ODhiLWE3N2UtNzg0M2MzMTk1ODRiPC9TdWJzY3JpcHRpb25Bcm4+CiAgPC9TdWJzY3JpYmVSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjg2YmY5NmFkLWVhYjEtNWY3MS05ODQ3LWY0OWJmMjUxMDczOTwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9TdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "33ac38a87cca6b77", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "205" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9eCZUb3BpY0Fybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY0FzX2F3c190ZXN0LXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:40 GMT" ], "X-Amzn-Requestid": [ "fc709954-6ac7-5fbf-ad7b-fb62722727f7" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPjE5MTA5MTg2LTU4ZTAtNWY5ZC04YWZhLWYzYjA0MDAwNzdkNTwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPmZjNzA5OTU0LTZhYzctNWZiZi1hZDdiLWZiNjI3MjI3MjdmNzwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "a0d45804f986f0aa", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "170" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0FzX2F3c190ZXN0LXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1734" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:40 GMT" ], "X-Amzn-Requestid": [ "d9692197-f87b-5b58-bc48-43a1e09b3b08" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjQwNTYzIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNDA1MjEifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCIxOTEwOTE4Ni01OGUwLTVmOWQtOGFmYS1mM2IwNDAwMDc3ZDVcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljQXNfYXdzX3Rlc3QtdG9wLTFcIixcbiAgXCJNZXNzYWdlXCIgOiBcInhcIixcbiAgXCJUaW1lc3RhbXBcIiA6IFwiMjAyNi0wMy0xOVQxNTozMDo0MC40OTJaXCIsXG4gIFwiU2lnbmF0dXJlVmVyc2lvblwiIDogXCIxXCIsXG4gIFwiU2lnbmF0dXJlXCIgOiBcIkR0eWl2V0pLYkdjR2YwNU5EbXhSVTlOOExadHUyK3Z0d0t2UkFFUHV6WmJkUDd4VTJQRXdnS1VoTFF4dDY2aTRQempGTWF1blZEYkk5V245Mkc5Q0VMMEV1a1FKaTJxZDJSRklPbVN3M09vUmFycGxSL25BazJ5cjNoS2J5c1NFZ216aWlwYXZEQ0FQSTBKUmxZcHp0SWQyREhET1NqTldOa3dCT0J2K2dlQXZ5YmpsbXVoS1BjTmIwSXB5UzY2d2RWNW5jV3B3R3AxRkE5K2JPODI3RXo5UjlVUS9zSmk4UVpXZ1d3WG0zWnBrKzdXVm5WZWd2eGtHNk1pc0FFTHZPYVMweE8zb1MyY2ZxaTNHUzNQRnlLOVBTQXlPTDdORzRUUDlmQkZSNENUOHRVQTVKdTdKMHRHMVpBbkhwSUtSRnFuVHN2Rllpb2FqbUNVc1Zmb0JaZz09XCIsXG4gIFwiU2lnbmluZ0NlcnRVUkxcIiA6IFwiaHR0cHM6Ly9zbnMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vU2ltcGxlTm90aWZpY2F0aW9uU2VydmljZS03NTA2YTFlMzViMzZlZjVhNDQ0ZGQxYThlN2NjM2VkOC5wZW1cIixcbiAgXCJVbnN1YnNjcmliZVVSTFwiIDogXCJodHRwczovL3Nucy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS8/QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljQXNfYXdzX3Rlc3QtdG9wLTE6ZWEwYWMxODAtZjQzOC00ODhiLWE3N2UtNzg0M2MzMTk1ODRiXCJcbn0iLCJNRDVPZkJvZHkiOiJhZmIzNGVmNmU3YTk3MTAwZDk5OTVkM2Y5NmYxYTI3NSIsIk1lc3NhZ2VJZCI6ImQ4NTAxMzZkLTRmNmEtNDE3My1iMzVhLWJmMDg1N2I1MzBmZSIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCNGdLcDNyNmVleDhmM3BuM3Y4aGJydkNCZEhCRWduY1dQbkFlWXJEZ3ZqMjE5MGdsbzdDL0hkUCtwQUdJWmxpYUNTVkkxZ1E1VDNicnFBb2xoZUx3WWxLVFhWUm16aXl6M2RlMzFNQWs5NnpQc05RemRCbk43d3Brall3WkU3VWVRNUsvWk9tb3ZxQ1ZEN0JHVC9GQWJlVk91YkdVTGgxb0sxWW1iaFpqa2V4TDBBcFN5TERuRVZhOVcrQnprcFhzMlEwdEVNck8zRUthU2o3dCsyQzFnb1RjTXdSNnBNbVEzMW9rdTg3Z0RCMU8xVG00bTB4OE1FU21NOVVsTmQwRG4xNU5BaVFPOW5RR2UrTHRHU3l4d2pweEZpSFc1L0NkR1FqUkdldU1EY21zSFlQK281VEIvMURNY1h0RU1nNXM0ZGFrTTBsNm5MU2thNm9WK3lPbk5COTVkT2tQMGpqNld2Mjg1SWJZR1FkYUpYT1M3UVhiNkNJemhVdFpFOEgwL2NLOWRsS3RPa01MTjRUcHBpVFYwTzBYSmdHeDh2QmIxWEs5RmJMNGE0bz0ifV19" } }, { "ID": "1e0dcf3625f04c4e", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "195" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9JlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQW5vbmV4aXN0ZW50dG9waWMmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "259" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:40 GMT" ], "X-Amzn-Requestid": [ "abd76304-a8a6-56b5-8707-0132b046defd" ] }, "Body": "PEVycm9yUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxFcnJvcj4KICAgIDxUeXBlPlNlbmRlcjwvVHlwZT4KICAgIDxDb2RlPk5vdEZvdW5kPC9Db2RlPgogICAgPE1lc3NhZ2U+VG9waWMgZG9lcyBub3QgZXhpc3Q8L01lc3NhZ2U+CiAgPC9FcnJvcj4KICA8UmVxdWVzdElkPmFiZDc2MzA0LWE4YTYtNTZiNS04NzA3LTAxMzJiMDQ2ZGVmZDwvUmVxdWVzdElkPgo8L0Vycm9yUmVzcG9uc2U+Cg==" } }, { "ID": "1812f8d81f6e2c4a", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "563" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQjRnS3AzcjZlZXg4ZjNwbjN2OGhicnZDQmRIQkVnbmNXUG5BZVlyRGd2ajIxOTBnbG83Qy9IZFArcEFHSVpsaWFDU1ZJMWdRNVQzYnJxQW9saGVMd1lsS1RYVlJteml5ejNkZTMxTUFrOTZ6UHNOUXpkQm5ON3dwa2pZd1pFN1VlUTVLL1pPbW92cUNWRDdCR1QvRkFiZVZPdWJHVUxoMW9LMVltYmhaamtleEwwQXBTeUxEbkVWYTlXK0J6a3BYczJRMHRFTXJPM0VLYVNqN3QrMkMxZ29UY013UjZwTW1RMzFva3U4N2dEQjFPMVRtNG0weDhNRVNtTTlVbE5kMERuMTVOQWlRTzluUUdlK0x0R1N5eHdqcHhGaUhXNS9DZEdRalJHZXVNRGNtc0hZUCtvNVRCLzFETWNYdEVNZzVzNGRha00wbDZuTFNrYTZvVit5T25OQjk1ZE9rUDBqajZXdjI4NUliWUdRZGFKWE9TN1FYYjZDSXpoVXRaRThIMC9jSzlkbEt0T2tNTE40VHBwaVRWME8wWEpnR3g4dkJiMVhLOUZiTDRhNG89In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0FzX2F3c190ZXN0LXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:40 GMT" ], "X-Amzn-Requestid": [ "1fea5ec1-41f9-5207-8534-3cf759192257" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "ccd1308ac6641891", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "165" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vdXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vNDU2NzUyNjY1NTc2L25vbmV4aXN0ZW50LXN1YnNjcmlwdGlvbiJ9" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "96" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:40 GMT" ], "X-Amzn-Query-Error": [ "AWS.SimpleQueueService.NonExistentQueue;Sender" ], "X-Amzn-Requestid": [ "573b1c23-24d5-5a5b-9df3-7e153c35ba0b" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLnNxcyNRdWV1ZURvZXNOb3RFeGlzdCIsIm1lc3NhZ2UiOiJUaGUgc3BlY2lmaWVkIHF1ZXVlIGRvZXMgbm90IGV4aXN0LiJ9" } }, { "ID": "1addb601dafea6d2", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "163" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY0FzX2F3c190ZXN0LXRvcC0xJTNBZWEwYWMxODAtZjQzOC00ODhiLWE3N2UtNzg0M2MzMTk1ODRiJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:40 GMT" ], "X-Amzn-Requestid": [ "65030c87-bd82-5ead-a655-6eb1a56276e5" ] }, "Body": "PFVuc3Vic2NyaWJlUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD42NTAzMGM4Ny1iZDgyLTVlYWQtYTY1NS02ZWIxYTU2Mjc2ZTU8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvVW5zdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "f9b2b5e254b8c975", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "89" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0FzX2F3c190ZXN0LXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:40 GMT" ], "X-Amzn-Requestid": [ "34b57b06-24e1-5bea-8c00-19303c017bba" ] }, "Body": "" } }, { "ID": "0c2506313f6d421a", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "117" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPURlbGV0ZVRvcGljJlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQVNOU1RvcGljQXNfYXdzX3Rlc3QtdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:41 GMT" ], "X-Amzn-Requestid": [ "c60b452a-28f1-5fbf-b777-271c301097f7" ] }, "Body": "PERlbGV0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD5jNjBiNDUyYS0yOGYxLTVmYmYtYjc3Ny0yNzFjMzAxMDk3Zjc8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvRGVsZXRlVG9waWNSZXNwb25zZT4K" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSNSTopic/TestAs/verify_As_returns_false_when_passed_nil.replay ================================================ { "Initial": "AQAAAA7hTg2hCDOUQAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "6491494d11baaea8", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "99" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPUNyZWF0ZVRvcGljJk5hbWU9U05TVG9waWNBc192ZXJpZnlfQXNfcmV0dXJuc19mYWxzZV93aGVuX3Bhc3NlZF9uaWwtdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "363" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:41 GMT" ], "X-Amzn-Requestid": [ "8f203960-2327-5392-8740-5b563bc672f6" ] }, "Body": "PENyZWF0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxDcmVhdGVUb3BpY1Jlc3VsdD4KICAgIDxUb3BpY0Fybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljQXNfdmVyaWZ5X0FzX3JldHVybnNfZmFsc2Vfd2hlbl9wYXNzZWRfbmlsLXRvcC0xPC9Ub3BpY0Fybj4KICA8L0NyZWF0ZVRvcGljUmVzdWx0PgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD44ZjIwMzk2MC0yMzI3LTUzOTItODc0MC01YjU2M2JjNjcyZjY8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvQ3JlYXRlVG9waWNSZXNwb25zZT4K" } }, { "ID": "a22212ec88c97fc5", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "72" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTTlNUb3BpY0FzX3ZlcmlmeV9Bc19yZXR1cm5zX2ZhbHNlX3doZW5fcGFzc2VkX25pbC1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "120" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:41 GMT" ], "X-Amzn-Requestid": [ "62ff2d0d-9877-5031-83f1-4f3b8096b403" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0FzX3ZlcmlmeV9Bc19yZXR1cm5zX2ZhbHNlX3doZW5fcGFzc2VkX25pbC1zdWItMSJ9" } }, { "ID": "8b69877c0875b77f", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "150" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0FzX3ZlcmlmeV9Bc19yZXR1cm5zX2ZhbHNlX3doZW5fcGFzc2VkX25pbC1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "121" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:41 GMT" ], "X-Amzn-Requestid": [ "7af79273-5c4e-5624-8342-f04544aff216" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY0FzX3ZlcmlmeV9Bc19yZXR1cm5zX2ZhbHNlX3doZW5fcGFzc2VkX25pbC1zdWItMSJ9fQ==" } }, { "ID": "c491c7d999699bbd", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "526" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljQXNfdmVyaWZ5X0FzX3JldHVybnNfZmFsc2Vfd2hlbl9wYXNzZWRfbmlsLXN1Yi0xXCJcblx0XHR9XG5cdFx0XVxuXHRcdH0ifSwiUXVldWVVcmwiOiJodHRwczovL3Nxcy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS80NTY3NTI2NjU1NzYvU05TVG9waWNBc192ZXJpZnlfQXNfcmV0dXJuc19mYWxzZV93aGVuX3Bhc3NlZF9uaWwtc3ViLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:42 GMT" ], "X-Amzn-Requestid": [ "3acc26b2-613d-59fe-9d0a-448479df7dcc" ] }, "Body": "" } }, { "ID": "a918ba91cbfceccd", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "270" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVN1YnNjcmliZSZFbmRwb2ludD1hcm4lM0Fhd3MlM0FzcXMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY0FzX3ZlcmlmeV9Bc19yZXR1cm5zX2ZhbHNlX3doZW5fcGFzc2VkX25pbC1zdWItMSZQcm90b2NvbD1zcXMmVG9waWNBcm49YXJuJTNBYXdzJTNBc25zJTNBdXMtZWFzdC0yJTNBNDU2NzUyNjY1NTc2JTNBU05TVG9waWNBc192ZXJpZnlfQXNfcmV0dXJuc19mYWxzZV93aGVuX3Bhc3NlZF9uaWwtdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "406" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:42 GMT" ], "X-Amzn-Requestid": [ "a8ab0fea-e757-5013-9b04-6ddcffb5f177" ] }, "Body": "PFN1YnNjcmliZVJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8U3Vic2NyaWJlUmVzdWx0PgogICAgPFN1YnNjcmlwdGlvbkFybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljQXNfdmVyaWZ5X0FzX3JldHVybnNfZmFsc2Vfd2hlbl9wYXNzZWRfbmlsLXRvcC0xOmI2OWE3ZDAwLTI4ZjMtNDhmMy05MmYwLTkwNDUwYTY4ZjJjZDwvU3Vic2NyaXB0aW9uQXJuPgogIDwvU3Vic2NyaWJlUmVzdWx0PgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD5hOGFiMGZlYS1lNzU3LTUwMTMtOWIwNC02ZGRjZmZiNWYxNzc8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvU3Vic2NyaWJlUmVzcG9uc2U+Cg==" } }, { "ID": "3ebbaa37fa249fe0", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "236" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9eCZUb3BpY0Fybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY0FzX3ZlcmlmeV9Bc19yZXR1cm5zX2ZhbHNlX3doZW5fcGFzc2VkX25pbC10b3AtMSZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:42 GMT" ], "X-Amzn-Requestid": [ "9bb8879d-a363-5f03-8788-e5abbb812e67" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPjJkYzYyMzkzLTViNzItNTYwMC04ZWY5LTQxYTU0MzkwNTc2NDwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjliYjg4NzlkLWEzNjMtNWYwMy04Nzg4LWU1YWJiYjgxMmU2NzwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "6929608e9b61b283", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "201" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0FzX3ZlcmlmeV9Bc19yZXR1cm5zX2ZhbHNlX3doZW5fcGFzc2VkX25pbC1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1816" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:42 GMT" ], "X-Amzn-Requestid": [ "d9a34a54-46f8-59ee-b26d-28625e1aeddc" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjQyMzk1IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNDIzNTcifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCIyZGM2MjM5My01YjcyLTU2MDAtOGVmOS00MWE1NDM5MDU3NjRcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljQXNfdmVyaWZ5X0FzX3JldHVybnNfZmFsc2Vfd2hlbl9wYXNzZWRfbmlsLXRvcC0xXCIsXG4gIFwiTWVzc2FnZVwiIDogXCJ4XCIsXG4gIFwiVGltZXN0YW1wXCIgOiBcIjIwMjYtMDMtMTlUMTU6MzA6NDIuMzI0WlwiLFxuICBcIlNpZ25hdHVyZVZlcnNpb25cIiA6IFwiMVwiLFxuICBcIlNpZ25hdHVyZVwiIDogXCJZWS8rWXFrR2JCQjRmZHZpUWhySHJxTklTR2wwNHdsaXl1YWl2c1lKM21HYUpDYVhJMXRxcTdvQmZnL2w3UlhBU0FQUXZxQXl3RU5PYkFRUm9CMjNZRU05eXdzRlNwMmk1c1lkUE5aUndSUE1INDFGTS94dktqOWcyakR5UC9BMFJpNS84VnFidDNrN0UrdkRlTDR0UzNpR2syUXBVSjlpWlZZNTVxRlA5MUcwb1pBLytrZS9Fd2Fpd2ZjdFhZQ2U0ME5IbWZDTXFjNGRIRS9EMEtvNUtnbHBzSU9ZWjkxMFBIbGxLaDJqQnMxYTRySmlobXJpUTgxZ0cwaFBhNUF6T3Z3Nm9HWVRjNWZMKzUyMUhndlNvQVBaVFJYbk81K2RtVmlGbVd0dVVOT1hZK1R6OFFJNEt3bmNMWmd2bFJiSGFhM0RYeUtkdlp3RCs4d0FIaFBQOWc9PVwiLFxuICBcIlNpZ25pbmdDZXJ0VVJMXCIgOiBcImh0dHBzOi8vc25zLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tL1NpbXBsZU5vdGlmaWNhdGlvblNlcnZpY2UtNzUwNmExZTM1YjM2ZWY1YTQ0NGRkMWE4ZTdjYzNlZDgucGVtXCIsXG4gIFwiVW5zdWJzY3JpYmVVUkxcIiA6IFwiaHR0cHM6Ly9zbnMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vP0FjdGlvbj1VbnN1YnNjcmliZSZTdWJzY3JpcHRpb25Bcm49YXJuOmF3czpzbnM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY0FzX3ZlcmlmeV9Bc19yZXR1cm5zX2ZhbHNlX3doZW5fcGFzc2VkX25pbC10b3AtMTpiNjlhN2QwMC0yOGYzLTQ4ZjMtOTJmMC05MDQ1MGE2OGYyY2RcIlxufSIsIk1ENU9mQm9keSI6ImRmMmY1ZjBkNWNjNDc5ZWYxYTExYWU4YWM1NDQ1Y2Q4IiwiTWVzc2FnZUlkIjoiMDlmMThkZjUtMjExZC00YTNjLWExZmUtNDA0Y2I4ZWQ2MjkxIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJDU2VRK0htS0RiNTZjN2VaaUN4bXl1NVR0T01sZVJsRFMxL2lpb3B3amJ3L3hJaXVMNUszMW1IQkV3NVVyVGtmcWdTdmUxSWJZOFNnUDQ0V0gwbzBhMXNockdtVmNPSWo4TktwVUJETkd2bkk4ZEROcWZUdFNxWDI2WVE5ZVNIVG1FM3I5R1psTVpnYVZNQXBWZ3hROFNTeVhhbm1pbTQ0WDBsYjFuR0JYNWc2dHZaU3N4ajZHV2VuR0lVYjFhTXMvaStNaEg3Rk0rdEZGUk54d1VIMFpMbzJTa09QWklicXVHcVZqQ0RGWWthUzhJeUhuZ3FFaXdmbUFOOFpXcDNVNjdTNkVnN0oxWC82Z1pMSkZHeGFLZzEzb3RXZW4vN2Q3c1diZ0xyNGpuQkJvTUVTREtzQ0Y2dHIrQVZGaGhaK0RJUnkrbTB3VGlJMVBVUkt1ZUVmUjZUSnRSVitBcVlQelo0RC9RZHVKWnBSV0lLOEdkWXJ1Nm51KzgrN21LSlp5SEg0UFRYZER3ZWNETHBUdXF6ZUZacWJFTFExY0RYbGo3amVEN3FaZEZxK3ltbllFZ3ZyZjV0VFNPbktINnVHIn1dfQ==" } }, { "ID": "651972947adf7287", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "195" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9JlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQW5vbmV4aXN0ZW50dG9waWMmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "259" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:42 GMT" ], "X-Amzn-Requestid": [ "ad62c327-d025-5970-86d3-a111c8c76814" ] }, "Body": "PEVycm9yUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxFcnJvcj4KICAgIDxUeXBlPlNlbmRlcjwvVHlwZT4KICAgIDxDb2RlPk5vdEZvdW5kPC9Db2RlPgogICAgPE1lc3NhZ2U+VG9waWMgZG9lcyBub3QgZXhpc3Q8L01lc3NhZ2U+CiAgPC9FcnJvcj4KICA8UmVxdWVzdElkPmFkNjJjMzI3LWQwMjUtNTk3MC04NmQzLWExMTFjOGM3NjgxNDwvUmVxdWVzdElkPgo8L0Vycm9yUmVzcG9uc2U+Cg==" } }, { "ID": "97bfe240fffdc9c3", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "614" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQkNTZVErSG1LRGI1NmM3ZVppQ3hteXU1VHRPTWxlUmxEUzEvaWlvcHdqYncveElpdUw1SzMxbUhCRXc1VXJUa2ZxZ1N2ZTFJYlk4U2dQNDRXSDBvMGExc2hyR21WY09JajhOS3BVQkROR3ZuSThkRE5xZlR0U3FYMjZZUTllU0hUbUUzcjlHWmxNWmdhVk1BcFZneFE4U1N5WGFubWltNDRYMGxiMW5HQlg1ZzZ0dlpTc3hqNkdXZW5HSVViMWFNcy9pK01oSDdGTSt0RkZSTnh3VUgwWkxvMlNrT1BaSWJxdUdxVmpDREZZa2FTOEl5SG5ncUVpd2ZtQU44WldwM1U2N1M2RWc3SjFYLzZnWkxKRkd4YUtnMTNvdFdlbi83ZDdzV2JnTHI0am5CQm9NRVNES3NDRjZ0citBVkZoaForRElSeSttMHdUaUkxUFVSS3VlRWZSNlRKdFJWK0FxWVB6WjREL1FkdUpacFJXSUs4R2RZcnU2bnUrOCs3bUtKWnlISDRQVFhkRHdlY0RMcFR1cXplRlpxYkVMUTFjRFhsajdqZUQ3cVpkRnEreW1uWUVndnJmNXRUU09uS0g2dUcifV0sIlF1ZXVlVXJsIjoiaHR0cHM6Ly9zcXMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vNDU2NzUyNjY1NTc2L1NOU1RvcGljQXNfdmVyaWZ5X0FzX3JldHVybnNfZmFsc2Vfd2hlbl9wYXNzZWRfbmlsLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:42 GMT" ], "X-Amzn-Requestid": [ "d2d72a35-ba74-5b89-96fd-4803a2967fbb" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "0c1e4d67db5c50ed", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "165" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vdXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vNDU2NzUyNjY1NTc2L25vbmV4aXN0ZW50LXN1YnNjcmlwdGlvbiJ9" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "96" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:42 GMT" ], "X-Amzn-Query-Error": [ "AWS.SimpleQueueService.NonExistentQueue;Sender" ], "X-Amzn-Requestid": [ "db076a21-1f23-577c-9f09-081707c1334e" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLnNxcyNRdWV1ZURvZXNOb3RFeGlzdCIsIm1lc3NhZ2UiOiJUaGUgc3BlY2lmaWVkIHF1ZXVlIGRvZXMgbm90IGV4aXN0LiJ9" } }, { "ID": "1e1ca6fc38277b6a", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "194" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY0FzX3ZlcmlmeV9Bc19yZXR1cm5zX2ZhbHNlX3doZW5fcGFzc2VkX25pbC10b3AtMSUzQWI2OWE3ZDAwLTI4ZjMtNDhmMy05MmYwLTkwNDUwYTY4ZjJjZCZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:42 GMT" ], "X-Amzn-Requestid": [ "74119de2-05de-5194-8689-ffd41d3cf0f0" ] }, "Body": "PFVuc3Vic2NyaWJlUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD43NDExOWRlMi0wNWRlLTUxOTQtODY4OS1mZmQ0MWQzY2YwZjA8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvVW5zdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "8015857d038e9748", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "120" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0FzX3ZlcmlmeV9Bc19yZXR1cm5zX2ZhbHNlX3doZW5fcGFzc2VkX25pbC1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:42 GMT" ], "X-Amzn-Requestid": [ "cf09c61d-55a7-5664-9de0-a42b4d456256" ] }, "Body": "" } }, { "ID": "fbec26d76f4a7d1b", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "148" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPURlbGV0ZVRvcGljJlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQVNOU1RvcGljQXNfdmVyaWZ5X0FzX3JldHVybnNfZmFsc2Vfd2hlbl9wYXNzZWRfbmlsLXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:42 GMT" ], "X-Amzn-Requestid": [ "e865cae1-0272-5861-9b4c-a8d71a907905" ] }, "Body": "PERlbGV0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD5lODY1Y2FlMS0wMjcyLTU4NjEtOWI0Yy1hOGQ3MWE5MDc5MDU8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvRGVsZXRlVG9waWNSZXNwb25zZT4K" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSNSTopic/TestBatching.replay ================================================ { "Initial": "AQAAAA7hTg2PCkOLMgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "fcba94a5662149db", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "65" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPUNyZWF0ZVRvcGljJk5hbWU9U05TVG9waWNCYXRjaGluZy10b3AtMSZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "329" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:23 GMT" ], "X-Amzn-Requestid": [ "120c9848-bdf7-5366-8de1-fa7ea5381a20" ] }, "Body": "PENyZWF0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxDcmVhdGVUb3BpY1Jlc3VsdD4KICAgIDxUb3BpY0Fybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljQmF0Y2hpbmctdG9wLTE8L1RvcGljQXJuPgogIDwvQ3JlYXRlVG9waWNSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjEyMGM5ODQ4LWJkZjctNTM2Ni04ZGUxLWZhN2VhNTM4MWEyMDwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9DcmVhdGVUb3BpY1Jlc3BvbnNlPgo=" } }, { "ID": "ce460cb78ab2959f", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "38" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTTlNUb3BpY0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "86" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:23 GMT" ], "X-Amzn-Requestid": [ "c9a70633-4726-567c-92ab-64055fe9ffae" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0JhdGNoaW5nLXN1Yi0xIn0=" } }, { "ID": "59d5c632ce7fa493", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "116" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "87" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:23 GMT" ], "X-Amzn-Requestid": [ "dbb1d1f3-3920-51b7-bcaa-b3c521ef7865" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY0JhdGNoaW5nLXN1Yi0xIn19" } }, { "ID": "5c726ec906eb4cb0", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "458" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljQmF0Y2hpbmctc3ViLTFcIlxuXHRcdH1cblx0XHRdXG5cdFx0fSJ9LCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:23 GMT" ], "X-Amzn-Requestid": [ "3479ae4c-1684-5608-9160-cc7a0e4b0fda" ] }, "Body": "" } }, { "ID": "efe9eb9998323a19", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "202" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVN1YnNjcmliZSZFbmRwb2ludD1hcm4lM0Fhd3MlM0FzcXMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY0JhdGNoaW5nLXN1Yi0xJlByb3RvY29sPXNxcyZUb3BpY0Fybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY0JhdGNoaW5nLXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "372" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:24 GMT" ], "X-Amzn-Requestid": [ "c534699c-cf33-58b5-8d59-0baad7e311f3" ] }, "Body": "PFN1YnNjcmliZVJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8U3Vic2NyaWJlUmVzdWx0PgogICAgPFN1YnNjcmlwdGlvbkFybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljQmF0Y2hpbmctdG9wLTE6ZTViZjFjMGQtMTI4MC00ZWQ4LWI3ZWUtZDIyMWIwMDA1ZGM4PC9TdWJzY3JpcHRpb25Bcm4+CiAgPC9TdWJzY3JpYmVSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPmM1MzQ2OTljLWNmMzMtNThiNS04ZDU5LTBiYWFkN2UzMTFmMzwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9TdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "025aebfa34815702", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "697" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9aGVsbG8rd29ybGQmUHVibGlzaEJhdGNoUmVxdWVzdEVudHJpZXMubWVtYmVyLjIuSWQ9MSZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMi5NZXNzYWdlPWhlbGxvK3dvcmxkJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4zLklkPTImUHVibGlzaEJhdGNoUmVxdWVzdEVudHJpZXMubWVtYmVyLjMuTWVzc2FnZT1oZWxsbyt3b3JsZCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuNC5JZD0zJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci40Lk1lc3NhZ2U9aGVsbG8rd29ybGQmUHVibGlzaEJhdGNoUmVxdWVzdEVudHJpZXMubWVtYmVyLjUuSWQ9NCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuNS5NZXNzYWdlPWhlbGxvK3dvcmxkJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci42LklkPTUmUHVibGlzaEJhdGNoUmVxdWVzdEVudHJpZXMubWVtYmVyLjYuTWVzc2FnZT1oZWxsbyt3b3JsZCZUb3BpY0Fybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY0JhdGNoaW5nLXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1007" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:24 GMT" ], "X-Amzn-Requestid": [ "05b33fe8-6804-5331-bf82-5dde70d4aa77" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPjc3YzBhNTlhLTkwNDgtNWM5Mi05Zjc2LWM3YWM4ODk4ZjVkNDwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICAgIDxtZW1iZXI+CiAgICAgICAgPE1lc3NhZ2VJZD43MWQyNTlhZC1lZTEzLTU5YmMtYjQ1Zi0zYjliZjZjM2YwZmE8L01lc3NhZ2VJZD4KICAgICAgICA8SWQ+MTwvSWQ+CiAgICAgIDwvbWVtYmVyPgogICAgICA8bWVtYmVyPgogICAgICAgIDxNZXNzYWdlSWQ+NWVkMjJmZTAtNGM1Ny01MTIyLThmNGQtNGRkNjU0ODcwODY0PC9NZXNzYWdlSWQ+CiAgICAgICAgPElkPjI8L0lkPgogICAgICA8L21lbWJlcj4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPjRmOWZkZjNjLWM1MDgtNWMyZC1iNzkxLWJkMGFkZGQ4ZTU2YjwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4zPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICAgIDxtZW1iZXI+CiAgICAgICAgPE1lc3NhZ2VJZD41Y2E5ZmZjOS05MzFjLTVhNWMtYTg4Yy05ZGZmOGJjYzIzMWE8L01lc3NhZ2VJZD4KICAgICAgICA8SWQ+NDwvSWQ+CiAgICAgIDwvbWVtYmVyPgogICAgICA8bWVtYmVyPgogICAgICAgIDxNZXNzYWdlSWQ+NDRiMzgzYjYtNzNiMi01NjUzLTgxYTItZTE4MDZiNjI4ZjE1PC9NZXNzYWdlSWQ+CiAgICAgICAgPElkPjU8L0lkPgogICAgICA8L21lbWJlcj4KICAgIDwvU3VjY2Vzc2Z1bD4KICA8L1B1Ymxpc2hCYXRjaFJlc3VsdD4KICA8UmVzcG9uc2VNZXRhZGF0YT4KICAgIDxSZXF1ZXN0SWQ+MDViMzNmZTgtNjgwNC01MzMxLWJmODItNWRkZTcwZDRhYTc3PC9SZXF1ZXN0SWQ+CiAgPC9SZXNwb25zZU1ldGFkYXRhPgo8L1B1Ymxpc2hCYXRjaFJlc3BvbnNlPgo=" } }, { "ID": "8323595469278099", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "697" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9aGVsbG8rd29ybGQmUHVibGlzaEJhdGNoUmVxdWVzdEVudHJpZXMubWVtYmVyLjIuSWQ9MSZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMi5NZXNzYWdlPWhlbGxvK3dvcmxkJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4zLklkPTImUHVibGlzaEJhdGNoUmVxdWVzdEVudHJpZXMubWVtYmVyLjMuTWVzc2FnZT1oZWxsbyt3b3JsZCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuNC5JZD0zJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci40Lk1lc3NhZ2U9aGVsbG8rd29ybGQmUHVibGlzaEJhdGNoUmVxdWVzdEVudHJpZXMubWVtYmVyLjUuSWQ9NCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuNS5NZXNzYWdlPWhlbGxvK3dvcmxkJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci42LklkPTUmUHVibGlzaEJhdGNoUmVxdWVzdEVudHJpZXMubWVtYmVyLjYuTWVzc2FnZT1oZWxsbyt3b3JsZCZUb3BpY0Fybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY0JhdGNoaW5nLXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1007" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:24 GMT" ], "X-Amzn-Requestid": [ "d4f55e89-cb7d-5ffd-80b8-3cbfd3ade6bb" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPmFiNjFjZjY4LTc0ZDYtNTg0OC04OGE1LWFkNWU2YzA2YjEwZTwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICAgIDxtZW1iZXI+CiAgICAgICAgPE1lc3NhZ2VJZD5kMzI1YzMxMi00MTA1LTU5NjktYTA1NC1hMTI0NTlkNTIwMmY8L01lc3NhZ2VJZD4KICAgICAgICA8SWQ+MTwvSWQ+CiAgICAgIDwvbWVtYmVyPgogICAgICA8bWVtYmVyPgogICAgICAgIDxNZXNzYWdlSWQ+NWUyNzZkYjItM2NkMy01Y2NjLWFiZGEtMGY4NDI0MDMwNThhPC9NZXNzYWdlSWQ+CiAgICAgICAgPElkPjI8L0lkPgogICAgICA8L21lbWJlcj4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPjJhMzFmZWVmLTMyN2ItNWU5Ni05N2U1LTljZDkyYWFiNjdkMDwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4zPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICAgIDxtZW1iZXI+CiAgICAgICAgPE1lc3NhZ2VJZD5iYTcxM2Q5Mi1iMTAwLTU2NjktYTc2MS01ZmE0YTlkMGRmMmY8L01lc3NhZ2VJZD4KICAgICAgICA8SWQ+NDwvSWQ+CiAgICAgIDwvbWVtYmVyPgogICAgICA8bWVtYmVyPgogICAgICAgIDxNZXNzYWdlSWQ+OWI2ZGQyY2MtNzljYi01ZWExLThhNzktYjBmYTYxMWIyN2U3PC9NZXNzYWdlSWQ+CiAgICAgICAgPElkPjU8L0lkPgogICAgICA8L21lbWJlcj4KICAgIDwvU3VjY2Vzc2Z1bD4KICA8L1B1Ymxpc2hCYXRjaFJlc3VsdD4KICA8UmVzcG9uc2VNZXRhZGF0YT4KICAgIDxSZXF1ZXN0SWQ+ZDRmNTVlODktY2I3ZC01ZmZkLTgwYjgtM2NiZmQzYWRlNmJiPC9SZXF1ZXN0SWQ+CiAgPC9SZXNwb25zZU1ldGFkYXRhPgo8L1B1Ymxpc2hCYXRjaFJlc3BvbnNlPgo=" } }, { "ID": "2d1a269c0ee2d468", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "167" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1718" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:24 GMT" ], "X-Amzn-Requestid": [ "fab082ad-079e-5c2c-8088-e09b1f4eb5fe" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjI0NDA0IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMjQyODEifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCI3MWQyNTlhZC1lZTEzLTU5YmMtYjQ1Zi0zYjliZjZjM2YwZmFcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljQmF0Y2hpbmctdG9wLTFcIixcbiAgXCJNZXNzYWdlXCIgOiBcImhlbGxvIHdvcmxkXCIsXG4gIFwiVGltZXN0YW1wXCIgOiBcIjIwMjYtMDMtMTlUMTU6MzA6MjQuMjQ4WlwiLFxuICBcIlNpZ25hdHVyZVZlcnNpb25cIiA6IFwiMVwiLFxuICBcIlNpZ25hdHVyZVwiIDogXCJMVEN4eFcreklBQk81MFF0dGhHY29XREhabFlIbkY0enFVdGswU051eERWM2lyMld4L1RmbmJPdXJtZCsvbkVBNUlnMGtZQktHdk5MakppVEYxRkx0RDR3RUh1SjRNS1BCQ0Nnb25GWVlwTC9IekhaeW80WGhwWnZBVVBqTmRhYm1HakRKL3d0WnhpckZjK0FmM2l6Y3QxN29Jd1VuVTV1b3VYRVJVZHRYTEN4Vy9TK01vbFNNc05jaHRxVEpxdTI2clVGK3c1aHgvUG94dnVXOHpUQVlsazZQUlhLekIzYTN1RkdCRThsTjI4aXpXL0J4QWovRFBCSVlwblRxTEUvejV5K25tTFI0cUhjcEVUU2Jza1U1eHJCWGxKdVUzUnVYaXBBY3BOWUUwdFdNZWkyUkRscE5Kdnd0TjRLVTQ2Y0hsdmZPQzlvbDhvY2hHSGdNSlpqaWc9PVwiLFxuICBcIlNpZ25pbmdDZXJ0VVJMXCIgOiBcImh0dHBzOi8vc25zLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tL1NpbXBsZU5vdGlmaWNhdGlvblNlcnZpY2UtNzUwNmExZTM1YjM2ZWY1YTQ0NGRkMWE4ZTdjYzNlZDgucGVtXCIsXG4gIFwiVW5zdWJzY3JpYmVVUkxcIiA6IFwiaHR0cHM6Ly9zbnMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vP0FjdGlvbj1VbnN1YnNjcmliZSZTdWJzY3JpcHRpb25Bcm49YXJuOmF3czpzbnM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY0JhdGNoaW5nLXRvcC0xOmU1YmYxYzBkLTEyODAtNGVkOC1iN2VlLWQyMjFiMDAwNWRjOFwiXG59IiwiTUQ1T2ZCb2R5IjoiOGI3NmJlYjY1OWM2ZDc1MmZiYmU4ZDI2NzM4YTE0NGQiLCJNZXNzYWdlSWQiOiI2NjczZWRhYS1jZWFmLTQ4NmYtOGFiNS1mNzAwYjUzYjExZDQiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQnA4ZFNUVmVydTZ4US8zTzFrUGl1ZEtUVko1aC9XQmdqTVFiRDhZU0VQSWlnemxYR3hFbElIaU1iOEkwT1hKSldJTzhROFVKSm5mN0hya1JBdEVaclVQbHhCMUViRmRzMTRKUEg2Q00wSmZKM1dtdy9Yakp2NXZOZDRUcVdGSVc3dmZ4NVJzbldhbDQ0TlNqZFFjT3IzbmUzTEVBSDBMQnlvMUllNW1sS0lEaEVZNHN4ZXpVa2RTSFg2aEViSW9zZURkSm5paGRrSXMxYlU1WVozUFYrMkF2OUhkME9Qa2VWMFVIOENINk81WktNUWxTM2hTdjRSaFpDRVgrTUVvbDRtWElrY1Q2Szl3Ty9vdXBVYlpCbElHdFpja3ZPa1U1czBOUS9BRU1rSVdjZ3ZXQkpPQXB3Z1J6cFp3L1dLNDNUdXdxK3dHRkl2U0FoQTVIbTBDY0pheUcwWHdrR1BGYm9mTTY3c2NFNUt1NVkwalJ3bU4yU0xrbTdNWkhzbjgrY1FjUzcrMGlMSTVMcDRJbVdUYzAxeXc9PSJ9XX0=" } }, { "ID": "da526e4e47221f2f", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "167" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1718" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:24 GMT" ], "X-Amzn-Requestid": [ "ac969a74-d577-58cd-a5f3-f842cda7e11f" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjI0NDcxIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMjQyODIifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCI0ZjlmZGYzYy1jNTA4LTVjMmQtYjc5MS1iZDBhZGRkOGU1NmJcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljQmF0Y2hpbmctdG9wLTFcIixcbiAgXCJNZXNzYWdlXCIgOiBcImhlbGxvIHdvcmxkXCIsXG4gIFwiVGltZXN0YW1wXCIgOiBcIjIwMjYtMDMtMTlUMTU6MzA6MjQuMjQ4WlwiLFxuICBcIlNpZ25hdHVyZVZlcnNpb25cIiA6IFwiMVwiLFxuICBcIlNpZ25hdHVyZVwiIDogXCJEUW1qczNDR213L2htZ1lVNWh6MkRPUS9ScGl3TXYrWEFoR09PZm45WHdZbGJNWUxqWlZ1UTdvN3c5RnlNTExUaVhwSHVqS3VVVCtGSjVibWlOL3VsVkFkd2ZPUTZleGExY3FvOEZxZk94K2xHTFZkRUxWbkVCNlI1VG5vR1BESmluanFjZUdLMjRwRWNFMjUxSXdXZ2txbHNSVUZveGJ5eFh5dytRQjg4TUtrd1BITW0yUy96S2RNUk9rSXBVL2xnUzRWc2phRnA3ZG5naGJaVHpoZUExSUtnTk5FZnpOOFoyUGdqem16bzdEZzZsNTFXcmhLUWxxVXorUlljQ0x1U2hxWDZFdENCY1A5SGxkb0dGWnNRaythMWh2WnZVcnh5NDJFdVR3MitOM0FOQTdLV1hTQVJBM0NhR0diVXlGU3JnQWRDV1o4MGRKYVM1SlppMjBvdEE9PVwiLFxuICBcIlNpZ25pbmdDZXJ0VVJMXCIgOiBcImh0dHBzOi8vc25zLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tL1NpbXBsZU5vdGlmaWNhdGlvblNlcnZpY2UtNzUwNmExZTM1YjM2ZWY1YTQ0NGRkMWE4ZTdjYzNlZDgucGVtXCIsXG4gIFwiVW5zdWJzY3JpYmVVUkxcIiA6IFwiaHR0cHM6Ly9zbnMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vP0FjdGlvbj1VbnN1YnNjcmliZSZTdWJzY3JpcHRpb25Bcm49YXJuOmF3czpzbnM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY0JhdGNoaW5nLXRvcC0xOmU1YmYxYzBkLTEyODAtNGVkOC1iN2VlLWQyMjFiMDAwNWRjOFwiXG59IiwiTUQ1T2ZCb2R5IjoiOWMxNjE0MDdiNTU5MzM1ZmI1MTAxMTE3NjhjMmU4ZWQiLCJNZXNzYWdlSWQiOiJiNTBlNmI1Mi1hYzVlLTQ2YjktODQ5Zi1mMTg1ODU3YzQ4MzYiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQm9SeVE1b3ZnWUdwVUN5UmplcnlmN1dRb3hvTEZLQW93K0cyRnV3TUhyVXluQ0xMdFhXd2pNalE4Yyt6K0lJWGdtYlFtRE9PSlR6eE1jVkhhalJWWkpEVjd1eGdEMXBBZVhEM1VZM3ROU3g2dTB6bk5RZkU4cU1YRmh6N3ZSSmxaTDYzRDZPbVFqTjdaNGI5VUVtTFVHN1ArbS9UczlBdXlxMTl5Wno1Z3I2dERWMklqSHd0MDBlSUVteDV0Y0hiQTI3WW9xWjRaODNDOXhJalM0NGZOdE4rM1pGMEtLdTJ0OGRjTExLREJIbjUrS0xTK3RYQlhtM2xONXY4RzNhL0htci9ZVnNMQ1JYTHhUcmwvY29pd1FSZXEvbjd4bTVFd2xnVk5haUc0aXp3SC8zTStpUFEzYWM3cFZwRUZWWE5NcEpBdGk0aVlNWmt5U05HZklSb3RpNUtrVXdmMWR5c0k0Uy9jWFZDemZXd1BHMENEQlUxWnMxVzJDNE9FUFhWbWJpRFRKNTdaNTlpYTV6eEluRkpFdnc9PSJ9XX0=" } }, { "ID": "cac82ea3f6eb5f2d", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "167" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1718" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:24 GMT" ], "X-Amzn-Requestid": [ "c00e2295-ed33-546f-bb2b-40a3f5e30dbd" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjI0NTM5IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMjQyODIifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCI1ZWQyMmZlMC00YzU3LTUxMjItOGY0ZC00ZGQ2NTQ4NzA4NjRcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljQmF0Y2hpbmctdG9wLTFcIixcbiAgXCJNZXNzYWdlXCIgOiBcImhlbGxvIHdvcmxkXCIsXG4gIFwiVGltZXN0YW1wXCIgOiBcIjIwMjYtMDMtMTlUMTU6MzA6MjQuMjQ4WlwiLFxuICBcIlNpZ25hdHVyZVZlcnNpb25cIiA6IFwiMVwiLFxuICBcIlNpZ25hdHVyZVwiIDogXCJFQmQ1MjdBbXEzR3pqUEU5d2tvTXF6ZlR6dE5CQkNCajhqanB5aCtEdmxXU2puRzdIak9tU29FcGVFMFh3M2xzdHJvSjZJRWVRWjJCckMrK2R1bG4rSzNTcks1R2cwT0FNeWQ0dTJic0Q4dUttOWJ2QUJyRGpFZVNnNDJmbFNaUjdoWlBQWVc1U1V3VVJuWHdSV202aG5vaEYwVVMrRDdKUE5NdWxEODEveVpwTjJOMkpmaW5IdmV6ZHd5U0kvT0c3SFZEaGZkbUpJVXRnaGkrdzVoWU8ydG5GV2NxaU42VUZDOCtRVEVJR2pURmNUZ25nNmErcGhTQlhESE5raTJkcnhLUXpmVTlqYzdrV3h4dVZJUmlrZHhYL1BoY1U3QTZLamdMNVZEQ0VITlcyaW92MGtaVE5OMDFPOGVTc3R0aVlMb2pzN0NvOTFCd0hGNlR1N2VqYkE9PVwiLFxuICBcIlNpZ25pbmdDZXJ0VVJMXCIgOiBcImh0dHBzOi8vc25zLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tL1NpbXBsZU5vdGlmaWNhdGlvblNlcnZpY2UtNzUwNmExZTM1YjM2ZWY1YTQ0NGRkMWE4ZTdjYzNlZDgucGVtXCIsXG4gIFwiVW5zdWJzY3JpYmVVUkxcIiA6IFwiaHR0cHM6Ly9zbnMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vP0FjdGlvbj1VbnN1YnNjcmliZSZTdWJzY3JpcHRpb25Bcm49YXJuOmF3czpzbnM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY0JhdGNoaW5nLXRvcC0xOmU1YmYxYzBkLTEyODAtNGVkOC1iN2VlLWQyMjFiMDAwNWRjOFwiXG59IiwiTUQ1T2ZCb2R5IjoiMjczY2JlNTI2ZjRhZDZhNTVjMzBjY2I4MjY5M2RiNzQiLCJNZXNzYWdlSWQiOiI2ZGVkOTE0ZC0zZjQ2LTQ0ZjktODU0OC03ZDljNzRmNzNmMjQiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQkcwKzh5NzZjMnJYTSs1SVdNSVBwYTU5dnVvK3JYdEdtVlBhQ1FsblAvRzNaUEVsbjlzSDRVMExkcE5kdkJhWW1iVXBPQmh4OTZyaEVlMHF0bTFiTDhRdE9sbjMreGx2U3hVZG5UcTQxY2ZWNHV6cWF0c1djZW5qbWZGWTd5aFRYUjRZOFJCT1lyaUt0SmNZT1RFQ1RoWHljMTE2cC9Wc3c0cThOR2VDSGlJckV5TjQ3clpESmdURnJGTUZUV2FoUDJ0ajZ3dis3ZFNzWWs5WDdBS2c5SVk3S2NHYU5MdHBMTjJxU0RzaEJjNWFvdU90T1FLbXlsSVllUUU4dWIwTnNnclRkSVlGN0ZYTGltcnNhMHZBVEJHTldwM080OUJFL1dXL29jRTNGUDBzZ3lIMmVMUkZNejZabUNMaHJBMHp2TnR6QkpndUNvMUY3em4vSGxJenFKcXRiajgxbTgvdlMzRk5LRityeXdMQ21SWGg2aktOU0wyVmxxYmxQdjIzNDhWWm1IeW4yWXYrZWZzam1xMCt4L3c9PSJ9XX0=" } }, { "ID": "9bbceb0f12bcf2f2", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "167" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1718" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:24 GMT" ], "X-Amzn-Requestid": [ "a05a53c1-8861-5807-affc-31f790b1e1d5" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjI0NjA3IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMjQzNTUifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCJiYTcxM2Q5Mi1iMTAwLTU2NjktYTc2MS01ZmE0YTlkMGRmMmZcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljQmF0Y2hpbmctdG9wLTFcIixcbiAgXCJNZXNzYWdlXCIgOiBcImhlbGxvIHdvcmxkXCIsXG4gIFwiVGltZXN0YW1wXCIgOiBcIjIwMjYtMDMtMTlUMTU6MzA6MjQuMzI1WlwiLFxuICBcIlNpZ25hdHVyZVZlcnNpb25cIiA6IFwiMVwiLFxuICBcIlNpZ25hdHVyZVwiIDogXCJXRngwUFRacGMxZy9MdjJLNVJlWm42Tkx3ZGtEY1c1akd5QSsxMmdoZEVCZGFPT1UyaTJyUFRCZHd4c2pBZ2VYbVM3ZWdsYWpXdHFuVS9OeDdud3prK1VzdEYwekUwd1k2UWhvUmlySEZLUUFtdkFkbDBka1EvWnVoSktrQ3VZS1FnVlpQVEU5NWl1K0xpYzg3emlwUmM1TVpXd3dPalA2VEh0MEhuL2gzRldjMWM3L2ozaUV5ell5SllaMVlHdkRpWnBrL2RQUmRoakJQaFdIeCs0NkJkNUVsOHBJZU9CVTBhRnFEVnpXZDRqd0RJM2JlOUNSZlB2KzExYUFqeDkwcWpJd0lUYzB0OTNDZ1pNb05kRUsyRnRjUHo5Um9aVUsxMTlHUTlpeFY3ZUllQ1lub0hBaXExSHdqQ2tYbFVWbWFrOE5qVm04dTFSQTRLb0hhZTdJSlE9PVwiLFxuICBcIlNpZ25pbmdDZXJ0VVJMXCIgOiBcImh0dHBzOi8vc25zLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tL1NpbXBsZU5vdGlmaWNhdGlvblNlcnZpY2UtNzUwNmExZTM1YjM2ZWY1YTQ0NGRkMWE4ZTdjYzNlZDgucGVtXCIsXG4gIFwiVW5zdWJzY3JpYmVVUkxcIiA6IFwiaHR0cHM6Ly9zbnMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vP0FjdGlvbj1VbnN1YnNjcmliZSZTdWJzY3JpcHRpb25Bcm49YXJuOmF3czpzbnM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY0JhdGNoaW5nLXRvcC0xOmU1YmYxYzBkLTEyODAtNGVkOC1iN2VlLWQyMjFiMDAwNWRjOFwiXG59IiwiTUQ1T2ZCb2R5IjoiMWVkYzk2M2EwNDMzNDAwMDU5MzExYTI2M2E4NWJhN2YiLCJNZXNzYWdlSWQiOiJjZTUwMmViMC01MGVhLTRkMWUtYTcwMC1jZDZhNjk2Nzg0NTMiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQnJvVnAwZnBFS1FHS1BmV1BJQnd3TGdiVUZOSndqL2RXWEV6bkVCK1JBV2g4L0FYRHhxbGUvTlFNNWQxLzJjMFNiR09hcjN3NlFyU21GUXVsdi93TFIrSUNsK0J3NW1mZVFRT0xOQmJlQ2l6SDJhaHZYZTM4Z0pKQXpOeHRQN0pSNDdnYUdnQXZMOXA4QnhqT3NtV1pEV3czNFJiUmdyUzBKWnI4aXplWXJqUDRvQmoxendLUm84TitVa0V5M091NWlTQlJNYlBlMzlWQzYwd0NEcTVhSVVRQ3VSVTRnelBYZDRwYU5hZjkzRU9CNjE1SmZsZFh3dnd2aVg2UG1xWndQL2RnbStmSGh5TFM0VkpFSUkxanp6ZzRua2RXSU4yeExxbTFabHd2UzBPWjc1bWR3d01EQ3BOWU9HamVGQXZ1ZGZIVFk3dUZ0ZFByb1QyQXpkVk1ickE3cDA4U2x6M2hTb2hXQ2VwTXNLRHQ4ZXUybmZXNlJqWHRGSEJuOFEzbHp3MXA4TTQzWkd4NDdtTEpEYWt3bHc9PSJ9XX0=" } }, { "ID": "04c657022fd59aa4", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "167" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1718" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:24 GMT" ], "X-Amzn-Requestid": [ "e6c4b60b-3eb9-55e4-8215-d43d2669fc36" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjI0Njc1IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMjQzNTYifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCI1ZTI3NmRiMi0zY2QzLTVjY2MtYWJkYS0wZjg0MjQwMzA1OGFcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljQmF0Y2hpbmctdG9wLTFcIixcbiAgXCJNZXNzYWdlXCIgOiBcImhlbGxvIHdvcmxkXCIsXG4gIFwiVGltZXN0YW1wXCIgOiBcIjIwMjYtMDMtMTlUMTU6MzA6MjQuMzI1WlwiLFxuICBcIlNpZ25hdHVyZVZlcnNpb25cIiA6IFwiMVwiLFxuICBcIlNpZ25hdHVyZVwiIDogXCJHN0c4M0RtaFJGZExZb3hVaG1KcEhMUVBHYVFYQjRaWjkrQVkxNmVaaHVlM1ArcisrWk85NmdrYTdlaFlSSXNTZ1JXMTVMR0hsMlJzOCtEUDVZRkdib01US1BYMHd4SnU5WVNJa1pqQ2lXblZrOUl5M0hLemw1a3l3QTY1YlF2aDRzMHlSc25GbGRZUjNtV1ZWYllBYzFZN0JwOGxER045TlQ3OGExdmZiTHF4YTFRSWRSS3N4SElKSTk1dTFrcTlsTjhUL1hPL3ViRWRzZHp6TjBVeWkwOW1lcnpDaVg4N0xHNUtGOGYyZjdTL1Yxa0NPWC9WRWU0RTdPcGdORFdkSUZ1WWs3VWVnR3QwcDB5bFVGNlI5a2YwZG9wek5WRXhRS1RGVXFqRnZYU25BUitsdllDS1hjS09NZ0dFa0s1SjZwV3ZzLzhPZS9nSUNxK001SHNYWnc9PVwiLFxuICBcIlNpZ25pbmdDZXJ0VVJMXCIgOiBcImh0dHBzOi8vc25zLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tL1NpbXBsZU5vdGlmaWNhdGlvblNlcnZpY2UtNzUwNmExZTM1YjM2ZWY1YTQ0NGRkMWE4ZTdjYzNlZDgucGVtXCIsXG4gIFwiVW5zdWJzY3JpYmVVUkxcIiA6IFwiaHR0cHM6Ly9zbnMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vP0FjdGlvbj1VbnN1YnNjcmliZSZTdWJzY3JpcHRpb25Bcm49YXJuOmF3czpzbnM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY0JhdGNoaW5nLXRvcC0xOmU1YmYxYzBkLTEyODAtNGVkOC1iN2VlLWQyMjFiMDAwNWRjOFwiXG59IiwiTUQ1T2ZCb2R5IjoiOTliNGIyM2QzODZmZjhlODkyMTY2MzQzOGFhNmMzYmYiLCJNZXNzYWdlSWQiOiIwOWJiYjMxYS0yZDMxLTRhYzAtYjMyMi00MGYxZjcyYTYzNmQiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQjZDb1lkV3g1QTRKaUUyY3AwaHFmWWtvOGpHV2oxY21vUW1Gb29OVGc2TjZaOXZyclBsaFp3MFhSQU15eENkYllwNWQzUSt5blN5NjBMTENLTXpzZk9ScDlqRnRjbjNZOE5HMWRyOFowaFIrbTlSUGtmaHlUeS9mc1VxZ0dIWXVYeXI4SGx6eDd0ZG9wUGR3UVhLMExURHdIS2FqcGRXK0xDYVBZSjFxVGJYRzdmdStuVWRYcGFxSnB1bXM5b21seXpnSSsrWVVXK254S3hhRzlqdDRZdmxDWS9nUjJteldSaUZmOC9oQk9CRUUxeFZIcHpLL2JNbUM3Q2QxWnJ4ellnMUZCZlFwWkZHb0ZKNHdnU0RiNkZFQVh6bHdQem9MWWpYVi9lWWdEKzNrblNQazJMaEZZdnhKcTVZc2Rhejl2K0dLZ3R6TUREZHRTS2RaU2wySGxmMkQ0dkN3emVpaGV1ejc5aEFxSFV3QnR2SElpOXk1NVVSR3hzelhCcGZoTWFLWUVYV1RjOEEzajVVYzJGOEZDR0E9PSJ9XX0=" } }, { "ID": "32b70854418741d9", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "167" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1718" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:24 GMT" ], "X-Amzn-Requestid": [ "eeb8dcc8-e6fb-580b-8c0f-befefe2b61d9" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjI0NzQ3IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMjQyODEifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCI3N2MwYTU5YS05MDQ4LTVjOTItOWY3Ni1jN2FjODg5OGY1ZDRcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljQmF0Y2hpbmctdG9wLTFcIixcbiAgXCJNZXNzYWdlXCIgOiBcImhlbGxvIHdvcmxkXCIsXG4gIFwiVGltZXN0YW1wXCIgOiBcIjIwMjYtMDMtMTlUMTU6MzA6MjQuMjQ4WlwiLFxuICBcIlNpZ25hdHVyZVZlcnNpb25cIiA6IFwiMVwiLFxuICBcIlNpZ25hdHVyZVwiIDogXCJBdU9BbHQ5NTNQcmUyaTZFc3RZMzl5OWhtZTN2V1huNDJyWUQ2RE5uZFJwZW1ULy9NTzM5QzdIWlpBUVorclJNeE94d3k0NWpWRGRzNzhNWlFUVEU3WXJJbUFVYTU3cFQ2U3ZTQXBYOWtBUHpSWi93a0hPYW9OWVc3bmlKejlUSFoxSW8rWUxyQk01VkVwZ1NIRWxWZEdzVjVaanNNRnNYY011TWNJdi9tQmpFRzBDUFh6NTZkY3hhKy9kb0tZVmxCWWU0UmxDbDRlNlpwUkRrUWVoNzNteGcyK1g1Y29wZysxYWtIQmx0WEZjYlFYRGgwR1BvdFQycFA2VWpwRTJnc25wSWs0blJ5UExucmFzNWpRS2w2aDlIajR0MGo2QUpCQjlXQjN0UFk2T3NiTlBOQWFGSjBWSHBhYjFibE55WjJjUlN1YUwrTlhHbUtPTkRyTHpaUnc9PVwiLFxuICBcIlNpZ25pbmdDZXJ0VVJMXCIgOiBcImh0dHBzOi8vc25zLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tL1NpbXBsZU5vdGlmaWNhdGlvblNlcnZpY2UtNzUwNmExZTM1YjM2ZWY1YTQ0NGRkMWE4ZTdjYzNlZDgucGVtXCIsXG4gIFwiVW5zdWJzY3JpYmVVUkxcIiA6IFwiaHR0cHM6Ly9zbnMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vP0FjdGlvbj1VbnN1YnNjcmliZSZTdWJzY3JpcHRpb25Bcm49YXJuOmF3czpzbnM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY0JhdGNoaW5nLXRvcC0xOmU1YmYxYzBkLTEyODAtNGVkOC1iN2VlLWQyMjFiMDAwNWRjOFwiXG59IiwiTUQ1T2ZCb2R5IjoiMTZlOTgzY2ExNTEwMzk4MmY4ZmMyNGJhMDU2ZmU1ODYiLCJNZXNzYWdlSWQiOiI4ZDViOTVkYi03Y2IzLTQyZDEtOTNjZS1kNzU5NDY4ZTE1ZTQiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQm5VYld1S0syZXNMTDN0UVlMMU5zLzNZQkJ2VVFiUkpSdU9xbHNRVm1jUERnRjNjMHNhQ1Jhc3ovZ212ZjNUTVNZd2NnTmZsRFhHZFIxL1NNbm84bW9rb3FmTy91dERhenFOU1JYZ1NMY0d5aEdRWVdicStZNVBSV3BhdE41V1A0dGplbHNyWU9PUjhxTjc4Rm1WcGo5bDJmZFRDMVZmTk5zYmVnM3RtOU5qb0ZyaW9YYnFaSk16bUsrVzF0U2Mxa0VvOEMxblBHbGRWaW9MRkNVOEdmUjZwZi9rMHh2Z2dkUyswT3RqVjdXdjFPRkhYa3RpMXBZaFdKeUd0K282bEo3OUpYNjNuK0xZWkpQc2UwVk9WUlpCMFNmeGdsS2Nmc016SzZDeEpNeGlKZ1I5QW5LT1YrMG1VNTBWa0FzUjlNM2dOL001Z2NSMEl4NXBqUFppb3pMSzlsN3Uzc0tsUEtYM1lXNURXVlRiZ2dHejBhTHlVeWx3NnVjcnN1aXA0b3luTUhiajBtYVF5eWQ3V3kxOWtHbnc9PSJ9XX0=" } }, { "ID": "b509744d38283b40", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "2750" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQnA4ZFNUVmVydTZ4US8zTzFrUGl1ZEtUVko1aC9XQmdqTVFiRDhZU0VQSWlnemxYR3hFbElIaU1iOEkwT1hKSldJTzhROFVKSm5mN0hya1JBdEVaclVQbHhCMUViRmRzMTRKUEg2Q00wSmZKM1dtdy9Yakp2NXZOZDRUcVdGSVc3dmZ4NVJzbldhbDQ0TlNqZFFjT3IzbmUzTEVBSDBMQnlvMUllNW1sS0lEaEVZNHN4ZXpVa2RTSFg2aEViSW9zZURkSm5paGRrSXMxYlU1WVozUFYrMkF2OUhkME9Qa2VWMFVIOENINk81WktNUWxTM2hTdjRSaFpDRVgrTUVvbDRtWElrY1Q2Szl3Ty9vdXBVYlpCbElHdFpja3ZPa1U1czBOUS9BRU1rSVdjZ3ZXQkpPQXB3Z1J6cFp3L1dLNDNUdXdxK3dHRkl2U0FoQTVIbTBDY0pheUcwWHdrR1BGYm9mTTY3c2NFNUt1NVkwalJ3bU4yU0xrbTdNWkhzbjgrY1FjUzcrMGlMSTVMcDRJbVdUYzAxeXc9PSJ9LHsiSWQiOiIxIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJvUnlRNW92Z1lHcFVDeVJqZXJ5ZjdXUW94b0xGS0FvdytHMkZ1d01IclV5bkNMTHRYV3dqTWpROGMreitJSVhnbWJRbURPT0pUenhNY1ZIYWpSVlpKRFY3dXhnRDFwQWVYRDNVWTN0TlN4NnUwem5OUWZFOHFNWEZoejd2UkpsWkw2M0Q2T21Rak43WjRiOVVFbUxVRzdQK20vVHM5QXV5cTE5eVp6NWdyNnREVjJJakh3dDAwZUlFbXg1dGNIYkEyN1lvcVo0WjgzQzl4SWpTNDRmTnROKzNaRjBLS3UydDhkY0xMS0RCSG41K0tMUyt0WEJYbTNsTjV2OEczYS9IbXIvWVZzTENSWEx4VHJsL2NvaXdRUmVxL243eG01RXdsZ1ZOYWlHNGl6d0gvM00raVBRM2FjN3BWcEVGVlhOTXBKQXRpNGlZTVpreVNOR2ZJUm90aTVLa1V3ZjFkeXNJNFMvY1hWQ3pmV3dQRzBDREJVMVpzMVcyQzRPRVBYVm1iaURUSjU3WjU5aWE1enhJbkZKRXZ3PT0ifSx7IklkIjoiMiIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCRzArOHk3NmMyclhNKzVJV01JUHBhNTl2dW8rclh0R21WUGFDUWxuUC9HM1pQRWxuOXNINFUwTGRwTmR2QmFZbWJVcE9CaHg5NnJoRWUwcXRtMWJMOFF0T2xuMyt4bHZTeFVkblRxNDFjZlY0dXpxYXRzV2NlbmptZkZZN3loVFhSNFk4UkJPWXJpS3RKY1lPVEVDVGhYeWMxMTZwL1ZzdzRxOE5HZUNIaUlyRXlONDdyWkRKZ1RGckZNRlRXYWhQMnRqNnd2KzdkU3NZazlYN0FLZzlJWTdLY0dhTkx0cExOMnFTRHNoQmM1YW91T3RPUUtteWxJWWVRRTh1YjBOc2dyVGRJWUY3RlhMaW1yc2EwdkFUQkdOV3AzTzQ5QkUvV1cvb2NFM0ZQMHNneUgyZUxSRk16NlptQ0xockEwenZOdHpCSmd1Q28xRjd6bi9IbEl6cUpxdGJqODFtOC92UzNGTktGK3J5d0xDbVJYaDZqS05TTDJWbHFibFB2MjM0OFZabUh5bjJZditlZnNqbXEwK3gvdz09In0seyJJZCI6IjMiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQnJvVnAwZnBFS1FHS1BmV1BJQnd3TGdiVUZOSndqL2RXWEV6bkVCK1JBV2g4L0FYRHhxbGUvTlFNNWQxLzJjMFNiR09hcjN3NlFyU21GUXVsdi93TFIrSUNsK0J3NW1mZVFRT0xOQmJlQ2l6SDJhaHZYZTM4Z0pKQXpOeHRQN0pSNDdnYUdnQXZMOXA4QnhqT3NtV1pEV3czNFJiUmdyUzBKWnI4aXplWXJqUDRvQmoxendLUm84TitVa0V5M091NWlTQlJNYlBlMzlWQzYwd0NEcTVhSVVRQ3VSVTRnelBYZDRwYU5hZjkzRU9CNjE1SmZsZFh3dnd2aVg2UG1xWndQL2RnbStmSGh5TFM0VkpFSUkxanp6ZzRua2RXSU4yeExxbTFabHd2UzBPWjc1bWR3d01EQ3BOWU9HamVGQXZ1ZGZIVFk3dUZ0ZFByb1QyQXpkVk1ickE3cDA4U2x6M2hTb2hXQ2VwTXNLRHQ4ZXUybmZXNlJqWHRGSEJuOFEzbHp3MXA4TTQzWkd4NDdtTEpEYWt3bHc9PSJ9LHsiSWQiOiI0IiwiUmVjZWlwdEhhbmRsZSI6IkFRRUI2Q29ZZFd4NUE0SmlFMmNwMGhxZllrbzhqR1dqMWNtb1FtRm9vTlRnNk42Wjl2cnJQbGhadzBYUkFNeXhDZGJZcDVkM1EreW5TeTYwTExDS016c2ZPUnA5akZ0Y24zWThORzFkcjhaMGhSK205UlBrZmh5VHkvZnNVcWdHSFl1WHlyOEhseng3dGRvcFBkd1FYSzBMVER3SEthanBkVytMQ2FQWUoxcVRiWEc3ZnUrblVkWHBhcUpwdW1zOW9tbHl6Z0krK1lVVytueEt4YUc5anQ0WXZsQ1kvZ1IybXpXUmlGZjgvaEJPQkVFMXhWSHB6Sy9iTW1DN0NkMVpyeHpZZzFGQmZRcFpGR29GSjR3Z1NEYjZGRUFYemx3UHpvTFlqWFYvZVlnRCsza25TUGsyTGhGWXZ4SnE1WXNkYXo5ditHS2d0ek1ERGR0U0tkWlNsMkhsZjJENHZDd3plaWhldXo3OWhBcUhVd0J0dkhJaTl5NTVVUkd4c3pYQnBmaE1hS1lFWFdUYzhBM2o1VWMyRjhGQ0dBPT0ifSx7IklkIjoiNSIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCblViV3VLSzJlc0xMM3RRWUwxTnMvM1lCQnZVUWJSSlJ1T3Fsc1FWbWNQRGdGM2Mwc2FDUmFzei9nbXZmM1RNU1l3Y2dOZmxEWEdkUjEvU01ubzhtb2tvcWZPL3V0RGF6cU5TUlhnU0xjR3loR1FZV2JxK1k1UFJXcGF0TjVXUDR0amVsc3JZT09SOHFONzhGbVZwajlsMmZkVEMxVmZOTnNiZWczdG05TmpvRnJpb1hicVpKTXptSytXMXRTYzFrRW84QzFuUEdsZFZpb0xGQ1U4R2ZSNnBmL2sweHZnZ2RTKzBPdGpWN1d2MU9GSFhrdGkxcFloV0p5R3QrbzZsSjc5Slg2M24rTFlaSlBzZTBWT1ZSWkIwU2Z4Z2xLY2ZzTXpLNkN4Sk14aUpnUjlBbktPViswbVU1MFZrQXNSOU0zZ04vTTVnY1IwSXg1cGpQWmlvekxLOWw3dTNzS2xQS1gzWVc1RFdWVGJnZ0d6MGFMeVV5bHc2dWNyc3VpcDRveW5NSGJqMG1hUXl5ZDdXeTE5a0dudz09In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "82" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:24 GMT" ], "X-Amzn-Requestid": [ "4ea84a4e-d892-5f64-b373-2878c042a6b6" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjMifSx7IklkIjoiNCJ9LHsiSWQiOiIxIn0seyJJZCI6IjIifSx7IklkIjoiMCJ9LHsiSWQiOiI1In1dfQ==" } }, { "ID": "c92670946a4aadf5", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "167" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1718" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:24 GMT" ], "X-Amzn-Requestid": [ "5c817278-2d7e-5a19-a333-104e35ae23cb" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjI0ODgyIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMjQzNTcifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCJhYjYxY2Y2OC03NGQ2LTU4NDgtODhhNS1hZDVlNmMwNmIxMGVcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljQmF0Y2hpbmctdG9wLTFcIixcbiAgXCJNZXNzYWdlXCIgOiBcImhlbGxvIHdvcmxkXCIsXG4gIFwiVGltZXN0YW1wXCIgOiBcIjIwMjYtMDMtMTlUMTU6MzA6MjQuMzI1WlwiLFxuICBcIlNpZ25hdHVyZVZlcnNpb25cIiA6IFwiMVwiLFxuICBcIlNpZ25hdHVyZVwiIDogXCJjL3A5d0ZLRHUyYy9QMExSRDJvZ3QrekRYWnJwSWdDdHFjRXUxRlRMT1lzZXRUTzR0VmNJcmZrenFIUUJvaU91YmxNSnJoZUdNVGtuL2hLb3M0OWtMbkVWZzh2L2ZrUmk0dmtiWGdsSDF0dmZaT1Z6TVZnWnozbExubCs2YVE3Sk5PelVxTVF5S0VTZEYzcHdiNEE5dU5jT3FoakU4bVY5NjUzUFJTQXoxTjJVUFcwR0R2aTQ3TXNBVVgyZGMyak15c285eU55bGNTSWdDdjFpUFhzR2NBM2JKWWFRQXZZZkNqUURhMWQxUGdNVVNtOE1RWmhqeGE5czZZODVyT0lVckR4Vms4aUpDME5zK1lEcVRjTkNVUVBoN1V6akRNS3hwejhCR3p1TTdGMlk5U1dGcy94WnJNWWxNSU1LVUFZOUd3N3JaQ09TZTlvWXNFdllkRmpJOWc9PVwiLFxuICBcIlNpZ25pbmdDZXJ0VVJMXCIgOiBcImh0dHBzOi8vc25zLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tL1NpbXBsZU5vdGlmaWNhdGlvblNlcnZpY2UtNzUwNmExZTM1YjM2ZWY1YTQ0NGRkMWE4ZTdjYzNlZDgucGVtXCIsXG4gIFwiVW5zdWJzY3JpYmVVUkxcIiA6IFwiaHR0cHM6Ly9zbnMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vP0FjdGlvbj1VbnN1YnNjcmliZSZTdWJzY3JpcHRpb25Bcm49YXJuOmF3czpzbnM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY0JhdGNoaW5nLXRvcC0xOmU1YmYxYzBkLTEyODAtNGVkOC1iN2VlLWQyMjFiMDAwNWRjOFwiXG59IiwiTUQ1T2ZCb2R5IjoiYjY5MjZjZTBlZWNhNjQyMzg4MDQ5YjM5ZTU3Y2ViYWQiLCJNZXNzYWdlSWQiOiJjMWE3YjI3NS05ODBjLTQ0NGMtOGU4Ni1mYWRlYTM1ODFlZjMiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQmowOEpGUDc3RFZ4aGkxVWNISURnTDhNNDJBUUJYSHltMW42OStFc2hOY1FmTkdQbDYwL2ZwT2NERWZpYUdyNHlISk51UDdraEFWRXNIUHhObzdWNnZRVnpPUER6ZGpyVmhxaDllY1BiRVAxRHRxZ05aOE5ucVQwcDExRGpwTm1Na3NaQUZEdTZ0SmcxNDNoT1k2WTJVZTF2dldFNkJldXlLaVVodmhWNVBhbXN1Q21tNm1jVWdJdnFhbGFWMlhvMFZjL0xWOHA5U1oyY1E3WU54bVlPcGZQUWpQb1R4Qll1bjc3VXU1R3JoSkhKTEFqWm03cWt6T215b3I1Z1NWRlM2NE5oeVVPbC90d2VnL0RyWXNaSmRhVlp1blB0M1BOeW5WLzlLQTBHekNIeTV4Y21XMTN3bnBhbWdYcEMvKzJXc1NsSVZJNGFsSVcxZER2VjQya01tUWFjNUx0L1BPL0JIN1JZNkg0OHFvcHhNVE5pQUsvSThvZlBZT2huNEtoK0cxUnlFMWhTakVlK3piWDQrTyt6ZGc9PSJ9XX0=" } }, { "ID": "bf8a91a7c0ce76c7", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "167" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1718" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:24 GMT" ], "X-Amzn-Requestid": [ "075ac407-873c-566c-898e-a6319fecefbe" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjI0OTUwIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMjQzNTgifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCI5YjZkZDJjYy03OWNiLTVlYTEtOGE3OS1iMGZhNjExYjI3ZTdcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljQmF0Y2hpbmctdG9wLTFcIixcbiAgXCJNZXNzYWdlXCIgOiBcImhlbGxvIHdvcmxkXCIsXG4gIFwiVGltZXN0YW1wXCIgOiBcIjIwMjYtMDMtMTlUMTU6MzA6MjQuMzI1WlwiLFxuICBcIlNpZ25hdHVyZVZlcnNpb25cIiA6IFwiMVwiLFxuICBcIlNpZ25hdHVyZVwiIDogXCJGaTR1RjVvUVhhUFBqYVBvZWYvd1gyK0hCL0JjNWVrdFN6T0RMUGhGZW51bjRuSUhCVXQ0TlZpSWx3UTJlK2FwUGpaZllHdmdzS2dPWW4xNHBaWitGVXJKYnRQOHdENXdiSkl0WjZLM0VWUDhNZ3dPM21URXYvMkNBbXdiK3ZJQys5THYyZmdqWVZzWVNPRFpoWjkzN0JZSW9Ma1dTWWc2OWNRRDliNHFKZXpGbldiZHFMWVMvM1VPdEU4REgxK05EWHdOQndkMkVXTFpKTVZmWXVxUWF0TjBWeUl6Mjhrd0lUaForb0xOK3RjMGRRZFpWckVzSW52UUx0RHQ1eUQwTFRzUW5oYUNZVEZvYU9Qakt3TTM2VWY0ZXp3YzFjdHBUZGtNWjhBSDFjSzluSVpva1BqajI4UXVFMHRqVHdxc1UvZXB3Rm5xdFNxUkNrOGEvWktJQ2c9PVwiLFxuICBcIlNpZ25pbmdDZXJ0VVJMXCIgOiBcImh0dHBzOi8vc25zLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tL1NpbXBsZU5vdGlmaWNhdGlvblNlcnZpY2UtNzUwNmExZTM1YjM2ZWY1YTQ0NGRkMWE4ZTdjYzNlZDgucGVtXCIsXG4gIFwiVW5zdWJzY3JpYmVVUkxcIiA6IFwiaHR0cHM6Ly9zbnMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vP0FjdGlvbj1VbnN1YnNjcmliZSZTdWJzY3JpcHRpb25Bcm49YXJuOmF3czpzbnM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY0JhdGNoaW5nLXRvcC0xOmU1YmYxYzBkLTEyODAtNGVkOC1iN2VlLWQyMjFiMDAwNWRjOFwiXG59IiwiTUQ1T2ZCb2R5IjoiMDNjM2Q4YzI1MGM1NTVlM2FlN2Y1Yjk4ZTVjOWE5NjUiLCJNZXNzYWdlSWQiOiJmZWM1NTJmYS0wNDAyLTQ2MDQtOWJlOC1kN2ZmNmZmYzRjNzIiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQlR4a1FiQ0ZKbUVxdUhJTnZrODg1bGw2Z0s3dll6UnI2NEhqR09hZ3ZUL0tjREQvYll0MkpQVDZCREpOem5iSkhrWURpU3ZaZzFEUjNLNEhHTWdVMWVyOWdEcXJtWjEyZVRyVng3TDBjellkWVpxeDlGYU1qdUZWc1lrYnhIVVROdnF6dVVKYnNkREFTREtMcnFhRDBQWlFubkI0MU4wbTJhSW1LUFBrRFV6ZGd2TWlvVGFFTXEwRDNCRUxVQ2piYzk3azBkL3dHbGNoYjREVUpjNkdFOVVaVlgwWEVOMDVGSHhrQ3ZNVDJPWlI4Zlh3N3RjZ1VMZ0FwWmZxMVBZK1dyeW82bnRneElraWl4SDZBRmgrYWVwQ3lZUnJlVDFONGRFaWZ1ZHZvY0kwRit6LzRQSm1QSS8wTHpDSzV2ZEFycnJtOXNQaExnVThqMklUZldnTFo4V1hBb2IxandFVWUyTUJNR0RCbS9ucVJVNC9yUEViZDZhK0YxZWFkWmF1L095L25LSkxGU2JieHFLOEVzOHAzRFE9PSJ9XX0=" } }, { "ID": "6ae140efb95f3abc", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "167" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1718" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:25 GMT" ], "X-Amzn-Requestid": [ "3e5f6908-b8d7-540f-bbbe-0b3ea0065ddd" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjI1MDE3IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMjQyODEifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCI0NGIzODNiNi03M2IyLTU2NTMtODFhMi1lMTgwNmI2MjhmMTVcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljQmF0Y2hpbmctdG9wLTFcIixcbiAgXCJNZXNzYWdlXCIgOiBcImhlbGxvIHdvcmxkXCIsXG4gIFwiVGltZXN0YW1wXCIgOiBcIjIwMjYtMDMtMTlUMTU6MzA6MjQuMjQ4WlwiLFxuICBcIlNpZ25hdHVyZVZlcnNpb25cIiA6IFwiMVwiLFxuICBcIlNpZ25hdHVyZVwiIDogXCJHQk1XY2hEOEtHajhxY0JhcFhHZ0F3RmZKMU96UnZpSlV6RDBZT2RCdnI4UE5mMTZCWUVKRkR6UlFaem05NHp4Q3llNkQwcUQ3YnBkSDBnS21zQnZ1OHhmUW5ZZkRyU0szbnpUa2JrREtraFc0VEJvTmloSEZjOGRRMUhTZzR4bEg0NXpsR2xFNklCVlR4VWZnV09ndktYczJjbDFWa1BET3F5MXJTRnlEZmtIYW9IYWRPT2RCUGhUSEZLVmpuc1pVTVRPajZBaHQyN0pNK0ZiVDNGZHRXangwYThLc1NTU2dFa29VSGN5Tll1NDdhTkRsWTd0Z0ZwQld2dDBZYVFubG5FelIwWVJhTlRkeUpKZUtaN3JleXViUmJyT2xpNit0U3dSYVZQK21YZWsyajBWQjNsclRoMVlXYVhiLzVOQjBYR2V2UjhtUktxNGVKMUxMQnBNWWc9PVwiLFxuICBcIlNpZ25pbmdDZXJ0VVJMXCIgOiBcImh0dHBzOi8vc25zLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tL1NpbXBsZU5vdGlmaWNhdGlvblNlcnZpY2UtNzUwNmExZTM1YjM2ZWY1YTQ0NGRkMWE4ZTdjYzNlZDgucGVtXCIsXG4gIFwiVW5zdWJzY3JpYmVVUkxcIiA6IFwiaHR0cHM6Ly9zbnMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vP0FjdGlvbj1VbnN1YnNjcmliZSZTdWJzY3JpcHRpb25Bcm49YXJuOmF3czpzbnM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY0JhdGNoaW5nLXRvcC0xOmU1YmYxYzBkLTEyODAtNGVkOC1iN2VlLWQyMjFiMDAwNWRjOFwiXG59IiwiTUQ1T2ZCb2R5IjoiYWI5NDFkNDRiNjY0ZGE5N2M0NDhjYmVkMDVmY2Y1NTUiLCJNZXNzYWdlSWQiOiJlYjFmYjAxMS1mNTBlLTRkYjItODhiYS00OWRmMDRjOGY4OTUiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQmtWOXdYSEtXL0N0UmEzNHlQRlJYaE5lbjVESGVST3ZEZG43MFpTd3RkNktwL01KKzRwb1kyQjZqbmd2N3Jwck9SV2JDR3FVd2VXMlRhTmZuR3diek5jdVlTdEQwbEx5dm1ZUzRjaldBUUpmM1ZtOFh1dXZWTHRXUGkrYXlSUnVhbHFyTW5ERURqSXF5VmJvZ1dabXJNOXh5Z01uVk1RV004cnRwNklSUUhEMk5PQ01kTlJSaUl4STRwSklqdERPNmlUcllzV1FlOFA5R2xXZVJtTHpxNU1HL05kWnN1a0w3Q0pON2lxa2dHUkQzREt1b0lLZW16T3pFN3pOdnJUSmgwOFZWNU4xY3NaU3ZFZVZIVWJ4UGpBSnlBS05IN0MydmNPb2lNc0FERnA2OWxzMXdqTU5MSEIraEtKRk8zS1BVcnpkRFVtMWIvTjNlMEg2OTROZlhVdUMvQldGdUZ6MlcxMEdwaXRiVUEweGFYc2MvT2FVQkloZDBiU2ovRjBkcHNHaFA2VkVoeTU4TS95cGRYMlN4NlE9PSJ9XX0=" } }, { "ID": "641ffa87acae6dd3", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "167" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1718" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:25 GMT" ], "X-Amzn-Requestid": [ "cc990056-c392-5f0b-9fa1-6260db4316d9" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjI1MDg2IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMjQyODQifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCI1Y2E5ZmZjOS05MzFjLTVhNWMtYTg4Yy05ZGZmOGJjYzIzMWFcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljQmF0Y2hpbmctdG9wLTFcIixcbiAgXCJNZXNzYWdlXCIgOiBcImhlbGxvIHdvcmxkXCIsXG4gIFwiVGltZXN0YW1wXCIgOiBcIjIwMjYtMDMtMTlUMTU6MzA6MjQuMjQ4WlwiLFxuICBcIlNpZ25hdHVyZVZlcnNpb25cIiA6IFwiMVwiLFxuICBcIlNpZ25hdHVyZVwiIDogXCJKQXR3d0kzQlpqTmtrdmdtV21LYlhZNzYwQkY0NVc1MGNBZ01Eejc5bjFlWVV6VUI5MTBFR0NxZ29icmlVNm5YMytUQmRqVzNsWWo4ZllEM3FSVmVkVWNLSEEveW4vT1F2M1NJVUpLN2pZWXgrM3Z5cUdKclZBQS9lQ0cveWIwWk9LK1hyUCtzV1MzS09oWlduUnY3RDBPem1sT3hheVJLWW1hdFJkQ3ZoY1BCazhBbGdsVGZNczlZUXJ1VC9YZEhiQ3E2Z3Vnazd6dFdGTnVwMDl4djV3ajJrNDQ2eTVtbkxSM2t2TnArdXhmTXpZR292M281cTFiOVlqdFdtYzVENmtLaVFDOFZTV0ZhOW40eXpsUzh0RU0zbHozSnM0WGorbmVVcjZpNHd2Zjh5TEZyK2tEMG5sU2oyNzU2bitScFB4ZVhPT0ZIY0FuOFBmRUFoZ1p0UEE9PVwiLFxuICBcIlNpZ25pbmdDZXJ0VVJMXCIgOiBcImh0dHBzOi8vc25zLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tL1NpbXBsZU5vdGlmaWNhdGlvblNlcnZpY2UtNzUwNmExZTM1YjM2ZWY1YTQ0NGRkMWE4ZTdjYzNlZDgucGVtXCIsXG4gIFwiVW5zdWJzY3JpYmVVUkxcIiA6IFwiaHR0cHM6Ly9zbnMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vP0FjdGlvbj1VbnN1YnNjcmliZSZTdWJzY3JpcHRpb25Bcm49YXJuOmF3czpzbnM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY0JhdGNoaW5nLXRvcC0xOmU1YmYxYzBkLTEyODAtNGVkOC1iN2VlLWQyMjFiMDAwNWRjOFwiXG59IiwiTUQ1T2ZCb2R5IjoiMjliNzI1ZWVmNTI2NmU4YmMwZTZhOTJmNjg3YmU0MGMiLCJNZXNzYWdlSWQiOiJiMTM0NWNhMi0wZDlkLTRlYmEtYjYxYS03MTRmM2MzZTQ1OWIiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQkI0K0IrSm9HV21HTTgzZDJKbGJFWEZGb1NvOXZIaytudUJBYktobkx0aHJ3M05DSkFDK2pEQW1VM3lPZTdyVGJjUE5kUjIycnhoTW1XREdERlRSMXZwOEJPaXV1N2N4WXZyc3lZVkhid3FFUzhRUUpqeUNLSGNGaytqT2xJR2lxY0JOejQvalI4V0ZIZ2F5dmJESVRQSVFmWTBqOXFoMnMva2doNVZVMW8wanVFdVdyYTdzSVdYZ1lhZFdLcWc5bC9McnVwREtRbjdTWlJPR2J1b3ZFNUM1WG5kWGUrZW5ubDd5NjZkOFc4N2VocjZYVFp2c2ZsZEhFcWNVZkI5bExLaHpTbW1hQmdZRWhKc2hVU0pOZVdUZkVxY3VnVVFXSFVSdFkzUDR6em1IOTVqcFBDUExLNVVKejI2aTlyc1pRaVpzTWZYcmhTNFRKM0Z4M2E2OUdZVzU4aGU2dWxvVHpYL2JEek1RV3FrMEtkZ09EM1NWa2p3UVMwT1BIK0V3Z05LVW55bXBBWG9ZbmFUVC9ZVmd2ZEE9PSJ9XX0=" } }, { "ID": "d23501108fa946a2", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "167" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1718" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:25 GMT" ], "X-Amzn-Requestid": [ "1d4d53e0-d348-521f-ad77-31d6cb993bcd" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjI1MTUzIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMjQzNjUifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCJkMzI1YzMxMi00MTA1LTU5NjktYTA1NC1hMTI0NTlkNTIwMmZcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljQmF0Y2hpbmctdG9wLTFcIixcbiAgXCJNZXNzYWdlXCIgOiBcImhlbGxvIHdvcmxkXCIsXG4gIFwiVGltZXN0YW1wXCIgOiBcIjIwMjYtMDMtMTlUMTU6MzA6MjQuMzI1WlwiLFxuICBcIlNpZ25hdHVyZVZlcnNpb25cIiA6IFwiMVwiLFxuICBcIlNpZ25hdHVyZVwiIDogXCJuVk9TaXduVzRXeWJtRWVCSU4rMVVJRXdRSjRSbEY0YWJOd2U5M1dWTDhpWDVWSmptc1d2WlFnMzdJa3dLeGdzUHMvdjBha0IwNW8yYyttNmFScG56NTRxRXhYQ0tMSE1ldWFTeTYrTGMyWlV1WjQrUWY2eWZkVFhoNEtjNnBSckMxT2FCWHpsUWNoK0wvdkpjWTEybllqRCtHcUhGUUtNempVaFpnT3cxWDIrYktEeDBDZGFlcmFoNTJDZkdUMHpWQUhzd1hsQmhEMDJVWjdjVGJTRHZtSm5ocXdPbHhXbEhIUlNnTVBFOXFhZHFBN21iejljTXBsY0YwY1lFMVJHd01wYURTRld0MzU1dC9nNkJFMEtqQXlEZHJzLzFMdVZLTmxhT2VmUDluajhvd3Z0bDJsRkpjNVZlTFQrN09xZjlKbEV6YUNIc0ZvS09zKzRwWTAxMFE9PVwiLFxuICBcIlNpZ25pbmdDZXJ0VVJMXCIgOiBcImh0dHBzOi8vc25zLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tL1NpbXBsZU5vdGlmaWNhdGlvblNlcnZpY2UtNzUwNmExZTM1YjM2ZWY1YTQ0NGRkMWE4ZTdjYzNlZDgucGVtXCIsXG4gIFwiVW5zdWJzY3JpYmVVUkxcIiA6IFwiaHR0cHM6Ly9zbnMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vP0FjdGlvbj1VbnN1YnNjcmliZSZTdWJzY3JpcHRpb25Bcm49YXJuOmF3czpzbnM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY0JhdGNoaW5nLXRvcC0xOmU1YmYxYzBkLTEyODAtNGVkOC1iN2VlLWQyMjFiMDAwNWRjOFwiXG59IiwiTUQ1T2ZCb2R5IjoiZmJlMTQ2ODE5NzQ4NDM4ZDVhZWVmMTgzMjdiY2YyOTQiLCJNZXNzYWdlSWQiOiI5YWVjNjMxMC05N2YwLTQ5ZTItYjAxYS01NzEyZDQ5MzFiNTMiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQnpIbkE3WnBUMnFvUjQyZmF6b1NrUmpWN2paazh1Q1dDUGhWNEdOYmZCY3l3Z08wRTBqdmlLdHZPT1E5bnlmcGJxQUlkeFFPbi9EM1g4RFJuMGFORzBEVkd2d2lHc3ZaYWZ1QkxoVmJ0TGIweWg3WWs1TU5tVWhXbk5HZm9iUGcvK1ZrYTd6cnBxLzBnSmRWMVNBY0JJR0J6Y3lxbmRqWFc3S0lzVll1aHc2V0hSY3BRLys4NVo0S0s1RVV6QWYrd2ZIRkt4U0tGOFZOb3pMa2dEcmx5c3ljSVVmRFBHNnBVNHUrV1dRTFdZSkNWcWlUWXRFYTNxWlpoaGNjK2N4ck9WbUY3N3l4T05CUXpab0s5a2pZOGp4WmVWWlNlYVpqeU5kOEZIUmVYU3ZjLytHbFVpTi9teDQ0NERyQ1dpK3RYS1lxaVMvTTdzVVJrZFRFRWw2V21wZzBucFJUQ2Y0ZGwzYWwxb25HRENGZU85MTBKZFAxZS8xZWlSOFpSTHBCc1BadTAvZjNjMzNYenhDait4Q0lod0E9PSJ9XX0=" } }, { "ID": "4a9cfa4a55c12016", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "167" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1718" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:25 GMT" ], "X-Amzn-Requestid": [ "c6696c9d-3016-509e-8743-0eab28c7c94c" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjI1MjI2IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMjQzNTQifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCIyYTMxZmVlZi0zMjdiLTVlOTYtOTdlNS05Y2Q5MmFhYjY3ZDBcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljQmF0Y2hpbmctdG9wLTFcIixcbiAgXCJNZXNzYWdlXCIgOiBcImhlbGxvIHdvcmxkXCIsXG4gIFwiVGltZXN0YW1wXCIgOiBcIjIwMjYtMDMtMTlUMTU6MzA6MjQuMzI1WlwiLFxuICBcIlNpZ25hdHVyZVZlcnNpb25cIiA6IFwiMVwiLFxuICBcIlNpZ25hdHVyZVwiIDogXCJETnh6eUpWN2FrTzhxU2swSnhZZjNBYTVWeDlrNkwyWkVHUWpBUEs3RmtjRCs5V0Y0aXNxTXVMeWVUN2ppK3hsbHBmNTU4aDdzckRTOU1KclhxTENoOVFTaG4yTUxuZU8xSWZDTGxDeWc0YytacFhXbjZ2UkVYTHhuZ1JNV1RlQW01VzlUY2dabENwb095bUNEckdKNUxPWjNPaEY2N2twMWh0U2JaSXgxM1dSSHZvdkwvTUJVVU80c1lWY2ppU3B2cFIxaWJWd2JidDBkaVJKSk55eDF0cTNCeU9iVHF1alExelc3NEduVkFNcDdzRyt0YkJ2VGlBVCtaczBMdE5XMFFSS0p2RFAxRyt1NXVKbDhmWG9sandOU1E2VzZrV1F1Rk12VFI2WnRmOWs3RGQ3SkJ3NHp0QndpeDhiY3VPVnpENkd4SE1lMGgvUmVWZzRtcDhHZXc9PVwiLFxuICBcIlNpZ25pbmdDZXJ0VVJMXCIgOiBcImh0dHBzOi8vc25zLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tL1NpbXBsZU5vdGlmaWNhdGlvblNlcnZpY2UtNzUwNmExZTM1YjM2ZWY1YTQ0NGRkMWE4ZTdjYzNlZDgucGVtXCIsXG4gIFwiVW5zdWJzY3JpYmVVUkxcIiA6IFwiaHR0cHM6Ly9zbnMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vP0FjdGlvbj1VbnN1YnNjcmliZSZTdWJzY3JpcHRpb25Bcm49YXJuOmF3czpzbnM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY0JhdGNoaW5nLXRvcC0xOmU1YmYxYzBkLTEyODAtNGVkOC1iN2VlLWQyMjFiMDAwNWRjOFwiXG59IiwiTUQ1T2ZCb2R5IjoiM2VlYjY2YjM0MGU1MWU2MjZkMTRlM2YyYWNhYjA1MzgiLCJNZXNzYWdlSWQiOiI4YWZhYzMyYy0wYTVjLTRkMTktOGRkMi04YjkzNzExMmI1NjYiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQlVoZkR0SVEzVDYvZmVYelVPNVFaR2t5d1pVcGRTamtCUjFDY256aFBTak8zeThwR2dqMmxFVTZqNVN2MHY4Z2FKWmV2UCtmaFBONkRoVk5yeVlsaU4xdkh1K2NVdGVHTFovT2lUN0VrRElzRlZSSUpKZktVSUxRL21acXVTRHVtcURkYnJ4ZVp3VDJTMlhaeFZPajA3S212WGkrMUtqUTNvMjFKTGR3M3NOY1RQRXd2VWR5Sk53VlJkczZ3SkIzanlkOHcxeWJNdXpySWpudngzZ0kvSnJxQzJKQXBMbFJiUnhSZE9FaWVhcWNQV1dzRGpFUUwybzRXcEpVeHk5SGJPSUdmc2RWT1VqUFAwT0lSNVdxUXVXSWQ4ZDFuQk1md2JFT2VKLzVJUUIrUVorNk9scFRKUkVQOGdUUy9pd3lvZTFpaSs4aWdXOEIySW5LUCsyTE1xRHZKc014UkkrTUlLQk51RGh1dThPYzN2WnRoZ003Wi8zenJEL1lHZWRaUWZjR09pb2NiRUhtQS92Sk9Sd3lNeEE9PSJ9XX0=" } }, { "ID": "e260ecaecdebb899", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "2750" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQmowOEpGUDc3RFZ4aGkxVWNISURnTDhNNDJBUUJYSHltMW42OStFc2hOY1FmTkdQbDYwL2ZwT2NERWZpYUdyNHlISk51UDdraEFWRXNIUHhObzdWNnZRVnpPUER6ZGpyVmhxaDllY1BiRVAxRHRxZ05aOE5ucVQwcDExRGpwTm1Na3NaQUZEdTZ0SmcxNDNoT1k2WTJVZTF2dldFNkJldXlLaVVodmhWNVBhbXN1Q21tNm1jVWdJdnFhbGFWMlhvMFZjL0xWOHA5U1oyY1E3WU54bVlPcGZQUWpQb1R4Qll1bjc3VXU1R3JoSkhKTEFqWm03cWt6T215b3I1Z1NWRlM2NE5oeVVPbC90d2VnL0RyWXNaSmRhVlp1blB0M1BOeW5WLzlLQTBHekNIeTV4Y21XMTN3bnBhbWdYcEMvKzJXc1NsSVZJNGFsSVcxZER2VjQya01tUWFjNUx0L1BPL0JIN1JZNkg0OHFvcHhNVE5pQUsvSThvZlBZT2huNEtoK0cxUnlFMWhTakVlK3piWDQrTyt6ZGc9PSJ9LHsiSWQiOiIxIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJUeGtRYkNGSm1FcXVISU52azg4NWxsNmdLN3ZZelJyNjRIakdPYWd2VC9LY0REL2JZdDJKUFQ2QkRKTnpuYkpIa1lEaVN2WmcxRFIzSzRIR01nVTFlcjlnRHFybVoxMmVUclZ4N0wwY3pZZFlacXg5RmFNanVGVnNZa2J4SFVUTnZxenVVSmJzZERBU0RLTHJxYUQwUFpRbm5CNDFOMG0yYUltS1BQa0RVemRndk1pb1RhRU1xMEQzQkVMVUNqYmM5N2swZC93R2xjaGI0RFVKYzZHRTlVWlZYMFhFTjA1Rkh4a0N2TVQyT1pSOGZYdzd0Y2dVTGdBcFpmcTFQWStXcnlvNm50Z3hJa2lpeEg2QUZoK2FlcEN5WVJyZVQxTjRkRWlmdWR2b2NJMEYrei80UEptUEkvMEx6Q0s1dmRBcnJybTlzUGhMZ1U4ajJJVGZXZ0xaOFdYQW9iMWp3RVVlMk1CTUdEQm0vbnFSVTQvclBFYmQ2YStGMWVhZFphdS9PeS9uS0pMRlNiYnhxSzhFczhwM0RRPT0ifSx7IklkIjoiMiIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCa1Y5d1hIS1cvQ3RSYTM0eVBGUlhoTmVuNURIZVJPdkRkbjcwWlN3dGQ2S3AvTUorNHBvWTJCNmpuZ3Y3cnByT1JXYkNHcVV3ZVcyVGFOZm5Hd2J6TmN1WVN0RDBsTHl2bVlTNGNqV0FRSmYzVm04WHV1dlZMdFdQaStheVJSdWFscXJNbkRFRGpJcXlWYm9nV1ptck05eHlnTW5WTVFXTThydHA2SVJRSEQyTk9DTWROUlJpSXhJNHBKSWp0RE82aVRyWXNXUWU4UDlHbFdlUm1MenE1TUcvTmRac3VrTDdDSk43aXFrZ0dSRDNES3VvSUtlbXpPekU3ek52clRKaDA4VlY1TjFjc1pTdkVlVkhVYnhQakFKeUFLTkg3QzJ2Y09vaU1zQURGcDY5bHMxd2pNTkxIQitoS0pGTzNLUFVyemREVW0xYi9OM2UwSDY5NE5mWFV1Qy9CV0Z1RnoyVzEwR3BpdGJVQTB4YVhzYy9PYVVCSWhkMGJTai9GMGRwc0doUDZWRWh5NThNL3lwZFgyU3g2UT09In0seyJJZCI6IjMiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQkI0K0IrSm9HV21HTTgzZDJKbGJFWEZGb1NvOXZIaytudUJBYktobkx0aHJ3M05DSkFDK2pEQW1VM3lPZTdyVGJjUE5kUjIycnhoTW1XREdERlRSMXZwOEJPaXV1N2N4WXZyc3lZVkhid3FFUzhRUUpqeUNLSGNGaytqT2xJR2lxY0JOejQvalI4V0ZIZ2F5dmJESVRQSVFmWTBqOXFoMnMva2doNVZVMW8wanVFdVdyYTdzSVdYZ1lhZFdLcWc5bC9McnVwREtRbjdTWlJPR2J1b3ZFNUM1WG5kWGUrZW5ubDd5NjZkOFc4N2VocjZYVFp2c2ZsZEhFcWNVZkI5bExLaHpTbW1hQmdZRWhKc2hVU0pOZVdUZkVxY3VnVVFXSFVSdFkzUDR6em1IOTVqcFBDUExLNVVKejI2aTlyc1pRaVpzTWZYcmhTNFRKM0Z4M2E2OUdZVzU4aGU2dWxvVHpYL2JEek1RV3FrMEtkZ09EM1NWa2p3UVMwT1BIK0V3Z05LVW55bXBBWG9ZbmFUVC9ZVmd2ZEE9PSJ9LHsiSWQiOiI0IiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJ6SG5BN1pwVDJxb1I0MmZhem9Ta1JqVjdqWms4dUNXQ1BoVjRHTmJmQmN5d2dPMEUwanZpS3R2T09ROW55ZnBicUFJZHhRT24vRDNYOERSbjBhTkcwRFZHdndpR3N2WmFmdUJMaFZidExiMHloN1lrNU1ObVVoV25OR2ZvYlBnLytWa2E3enJwcS8wZ0pkVjFTQWNCSUdCemN5cW5kalhXN0tJc1ZZdWh3NldIUmNwUS8rODVaNEtLNUVVekFmK3dmSEZLeFNLRjhWTm96TGtnRHJseXN5Y0lVZkRQRzZwVTR1K1dXUUxXWUpDVnFpVFl0RWEzcVpaaGhjYytjeHJPVm1GNzd5eE9OQlF6Wm9LOWtqWThqeFplVlpTZWFaanlOZDhGSFJlWFN2Yy8rR2xVaU4vbXg0NDREckNXaSt0WEtZcWlTL003c1VSa2RURUVsNldtcGcwbnBSVENmNGRsM2FsMW9uR0RDRmVPOTEwSmRQMWUvMWVpUjhaUkxwQnNQWnUwL2YzYzMzWHp4Q2oreENJaHdBPT0ifSx7IklkIjoiNSIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCVWhmRHRJUTNUNi9mZVh6VU81UVpHa3l3WlVwZFNqa0JSMUNjbnpoUFNqTzN5OHBHZ2oybEVVNmo1U3YwdjhnYUpaZXZQK2ZoUE42RGhWTnJ5WWxpTjF2SHUrY1V0ZUdMWi9PaVQ3RWtESXNGVlJJSkpmS1VJTFEvbVpxdVNEdW1xRGRicnhlWndUMlMyWFp4Vk9qMDdLbXZYaSsxS2pRM28yMUpMZHczc05jVFBFd3ZVZHlKTndWUmRzNndKQjNqeWQ4dzF5Yk11enJJam52eDNnSS9KcnFDMkpBcExsUmJSeFJkT0VpZWFxY1BXV3NEakVRTDJvNFdwSlV4eTlIYk9JR2ZzZFZPVWpQUDBPSVI1V3FRdVdJZDhkMW5CTWZ3YkVPZUovNUlRQitRWis2T2xwVEpSRVA4Z1RTL2l3eW9lMWlpKzhpZ1c4QjJJbktQKzJMTXFEdkpzTXhSSStNSUtCTnVEaHV1OE9jM3ZadGhnTTdaLzN6ckQvWUdlZFpRZmNHT2lvY2JFSG1BL3ZKT1J3eU14QT09In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "82" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:25 GMT" ], "X-Amzn-Requestid": [ "cd9fd249-fba5-5696-9514-b07fe374af44" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjMifSx7IklkIjoiNSJ9LHsiSWQiOiIwIn0seyJJZCI6IjEifSx7IklkIjoiMiJ9LHsiSWQiOiI0In1dfQ==" } }, { "ID": "232100d87fb7dc9e", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "160" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY0JhdGNoaW5nLXRvcC0xJTNBZTViZjFjMGQtMTI4MC00ZWQ4LWI3ZWUtZDIyMWIwMDA1ZGM4JlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:25 GMT" ], "X-Amzn-Requestid": [ "119596c7-10c6-5ba4-ace8-f4f1081702e2" ] }, "Body": "PFVuc3Vic2NyaWJlUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD4xMTk1OTZjNy0xMGM2LTViYTQtYWNlOC1mNGYxMDgxNzAyZTI8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvVW5zdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "cf8f8bab406165d3", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "86" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:25 GMT" ], "X-Amzn-Requestid": [ "461c178f-590d-5d2e-946d-75b941dc34fc" ] }, "Body": "" } }, { "ID": "40639601191d7217", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "114" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPURlbGV0ZVRvcGljJlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQVNOU1RvcGljQmF0Y2hpbmctdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:25 GMT" ], "X-Amzn-Requestid": [ "d45d3588-5fc7-5be5-a6d8-57be471622a3" ] }, "Body": "PERlbGV0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD5kNDVkMzU4OC01ZmM3LTViZTUtYTZkOC01N2JlNDcxNjIyYTM8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvRGVsZXRlVG9waWNSZXNwb25zZT4K" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSNSTopic/TestCancelSendReceive.replay ================================================ { "Initial": "AQAAAA7hTg2VHt+RkAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "fcab75f8775b3384", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "74" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPUNyZWF0ZVRvcGljJk5hbWU9U05TVG9waWNDYW5jZWxTZW5kUmVjZWl2ZS10b3AtMSZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "338" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:29 GMT" ], "X-Amzn-Requestid": [ "1430cbc6-e0fd-5187-9fde-a9f0f828e423" ] }, "Body": "PENyZWF0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxDcmVhdGVUb3BpY1Jlc3VsdD4KICAgIDxUb3BpY0Fybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljQ2FuY2VsU2VuZFJlY2VpdmUtdG9wLTE8L1RvcGljQXJuPgogIDwvQ3JlYXRlVG9waWNSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjE0MzBjYmM2LWUwZmQtNTE4Ny05ZmRlLWE5ZjBmODI4ZTQyMzwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9DcmVhdGVUb3BpY1Jlc3BvbnNlPgo=" } }, { "ID": "beb729f1fb9e4a53", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "47" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTTlNUb3BpY0NhbmNlbFNlbmRSZWNlaXZlLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "95" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:30 GMT" ], "X-Amzn-Requestid": [ "af3105f6-530e-569d-9dd6-67c04bd8e270" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0NhbmNlbFNlbmRSZWNlaXZlLXN1Yi0xIn0=" } }, { "ID": "d0d6f19505dff1d9", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "125" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0NhbmNlbFNlbmRSZWNlaXZlLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "96" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:30 GMT" ], "X-Amzn-Requestid": [ "1a4b56f4-8b0f-5b23-91d3-34c293d98fce" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY0NhbmNlbFNlbmRSZWNlaXZlLXN1Yi0xIn19" } }, { "ID": "80b397f4de78b7c8", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "476" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljQ2FuY2VsU2VuZFJlY2VpdmUtc3ViLTFcIlxuXHRcdH1cblx0XHRdXG5cdFx0fSJ9LCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0NhbmNlbFNlbmRSZWNlaXZlLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:30 GMT" ], "X-Amzn-Requestid": [ "8b7a36be-5dd7-5258-96ea-5488450196b5" ] }, "Body": "" } }, { "ID": "ca2268eafc7d4d0a", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "220" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVN1YnNjcmliZSZFbmRwb2ludD1hcm4lM0Fhd3MlM0FzcXMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY0NhbmNlbFNlbmRSZWNlaXZlLXN1Yi0xJlByb3RvY29sPXNxcyZUb3BpY0Fybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY0NhbmNlbFNlbmRSZWNlaXZlLXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "381" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:30 GMT" ], "X-Amzn-Requestid": [ "64e1b1b2-33d0-56bc-8c4e-d3842b06d318" ] }, "Body": "PFN1YnNjcmliZVJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8U3Vic2NyaWJlUmVzdWx0PgogICAgPFN1YnNjcmlwdGlvbkFybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljQ2FuY2VsU2VuZFJlY2VpdmUtdG9wLTE6YWFkZjg5NTktYmUxNy00OWJkLWI1ZjEtOWQ0NDhiYjc0NDBlPC9TdWJzY3JpcHRpb25Bcm4+CiAgPC9TdWJzY3JpYmVSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjY0ZTFiMWIyLTMzZDAtNTZiYy04YzRlLWQzODQyYjA2ZDMxODwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9TdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "5089b6bfd513de8f", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "169" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY0NhbmNlbFNlbmRSZWNlaXZlLXRvcC0xJTNBYWFkZjg5NTktYmUxNy00OWJkLWI1ZjEtOWQ0NDhiYjc0NDBlJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:30 GMT" ], "X-Amzn-Requestid": [ "784b6f9e-6044-5d7b-9ab6-0da87892d8df" ] }, "Body": "PFVuc3Vic2NyaWJlUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD43ODRiNmY5ZS02MDQ0LTVkN2ItOWFiNi0wZGE4Nzg5MmQ4ZGY8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvVW5zdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "7e70a5f8e8a58e78", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "95" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0NhbmNlbFNlbmRSZWNlaXZlLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:30 GMT" ], "X-Amzn-Requestid": [ "5e2e3488-5dcb-531d-8a9c-56be451d07f0" ] }, "Body": "" } }, { "ID": "e5e24533b0ead1d1", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "123" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPURlbGV0ZVRvcGljJlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQVNOU1RvcGljQ2FuY2VsU2VuZFJlY2VpdmUtdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:30 GMT" ], "X-Amzn-Requestid": [ "566d5b6f-041c-5640-b0e2-39591cca83e4" ] }, "Body": "PERlbGV0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD41NjZkNWI2Zi0wNDFjLTU2NDAtYjBlMi0zOTU5MWNjYTgzZTQ8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvRGVsZXRlVG9waWNSZXNwb25zZT4K" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSNSTopic/TestDoubleAck.replay ================================================ { "Initial": "AQAAAA7hTg2RKgYQ3wAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "b93bd36140057a0c", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "66" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPUNyZWF0ZVRvcGljJk5hbWU9U05TVG9waWNEb3VibGVBY2stdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "330" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:26 GMT" ], "X-Amzn-Requestid": [ "061d318c-41e0-54d9-a153-53ba593156b2" ] }, "Body": "PENyZWF0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxDcmVhdGVUb3BpY1Jlc3VsdD4KICAgIDxUb3BpY0Fybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljRG91YmxlQWNrLXRvcC0xPC9Ub3BpY0Fybj4KICA8L0NyZWF0ZVRvcGljUmVzdWx0PgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD4wNjFkMzE4Yy00MWUwLTU0ZDktYTE1My01M2JhNTkzMTU2YjI8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvQ3JlYXRlVG9waWNSZXNwb25zZT4K" } }, { "ID": "3238c63f6f96c72f", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "39" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTTlNUb3BpY0RvdWJsZUFjay1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "87" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:26 GMT" ], "X-Amzn-Requestid": [ "30a0de53-a8b2-5220-bbde-bc65b0600c49" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0RvdWJsZUFjay1zdWItMSJ9" } }, { "ID": "815b1385543f362c", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "117" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0RvdWJsZUFjay1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "88" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:26 GMT" ], "X-Amzn-Requestid": [ "bcae3575-17fd-5b94-8158-57430f2ff5fd" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY0RvdWJsZUFjay1zdWItMSJ9fQ==" } }, { "ID": "f9cce731e1a7b652", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "460" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljRG91YmxlQWNrLXN1Yi0xXCJcblx0XHR9XG5cdFx0XVxuXHRcdH0ifSwiUXVldWVVcmwiOiJodHRwczovL3Nxcy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS80NTY3NTI2NjU1NzYvU05TVG9waWNEb3VibGVBY2stc3ViLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:26 GMT" ], "X-Amzn-Requestid": [ "311fd5c8-8aeb-555a-9d90-b7fe92393b33" ] }, "Body": "" } }, { "ID": "e467491eb7820fde", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "204" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVN1YnNjcmliZSZFbmRwb2ludD1hcm4lM0Fhd3MlM0FzcXMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY0RvdWJsZUFjay1zdWItMSZQcm90b2NvbD1zcXMmVG9waWNBcm49YXJuJTNBYXdzJTNBc25zJTNBdXMtZWFzdC0yJTNBNDU2NzUyNjY1NTc2JTNBU05TVG9waWNEb3VibGVBY2stdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "373" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:26 GMT" ], "X-Amzn-Requestid": [ "e3b64400-5551-53da-aa2b-26364d8311b1" ] }, "Body": "PFN1YnNjcmliZVJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8U3Vic2NyaWJlUmVzdWx0PgogICAgPFN1YnNjcmlwdGlvbkFybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljRG91YmxlQWNrLXRvcC0xOjAwMmY5NmRlLTE4MjEtNDlmNS05NzVhLTE5MmI2MDM2NTk1NDwvU3Vic2NyaXB0aW9uQXJuPgogIDwvU3Vic2NyaWJlUmVzdWx0PgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD5lM2I2NDQwMC01NTUxLTUzZGEtYWEyYi0yNjM2NGQ4MzExYjE8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvU3Vic2NyaWJlUmVzcG9uc2U+Cg==" } }, { "ID": "6fb16c75a305f026", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "203" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9MCZUb3BpY0Fybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY0RvdWJsZUFjay10b3AtMSZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:26 GMT" ], "X-Amzn-Requestid": [ "704783d7-a08d-54dd-aa7a-e1e1b85fb6b6" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPmMwMjI1NGI4LTI3NmMtNWY0ZS05ZDAzLTM2OGUzZmJlNWQyNTwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjcwNDc4M2Q3LWEwOGQtNTRkZC1hYTdhLWUxZTFiODVmYjZiNjwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "cb3688748a094564", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "203" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9MSZUb3BpY0Fybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY0RvdWJsZUFjay10b3AtMSZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:26 GMT" ], "X-Amzn-Requestid": [ "028879a5-9ae1-5adb-a31c-1b938233c8b0" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPjgzODAwMmI2LTVlMGUtNTViNS05YmFjLTYwODA0NmRjNzdkZTwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjAyODg3OWE1LTlhZTEtNWFkYi1hMzFjLTFiOTM4MjMzYzhiMDwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "7a49df02c5fed5c3", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "203" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9MiZUb3BpY0Fybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY0RvdWJsZUFjay10b3AtMSZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:27 GMT" ], "X-Amzn-Requestid": [ "f071348f-6235-5610-917c-56b97ae6a47b" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPmE4MjljNDNkLWQzZjgtNTdlOS1hMDBiLWE2MGJjYjJiZjU4MjwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPmYwNzEzNDhmLTYyMzUtNTYxMC05MTdjLTU2Yjk3YWU2YTQ3YjwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "0395c4b293818d4c", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "168" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MywiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0RvdWJsZUFjay1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1710" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:27 GMT" ], "X-Amzn-Requestid": [ "191add92-3a50-5f97-8a8b-bfa42283b1fe" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjI3MTI0IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMjcwNjkifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCJhODI5YzQzZC1kM2Y4LTU3ZTktYTAwYi1hNjBiY2IyYmY1ODJcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljRG91YmxlQWNrLXRvcC0xXCIsXG4gIFwiTWVzc2FnZVwiIDogXCIyXCIsXG4gIFwiVGltZXN0YW1wXCIgOiBcIjIwMjYtMDMtMTlUMTU6MzA6MjcuMDQ4WlwiLFxuICBcIlNpZ25hdHVyZVZlcnNpb25cIiA6IFwiMVwiLFxuICBcIlNpZ25hdHVyZVwiIDogXCJGU0R3L0xDekVsZ1N6NjI1OExNWjdBRTRlMXNGdVZGWURUTVFvSWlJK09UUWpidm1FNVRRVDdlSFdpNlNkSXNxblg4cjhRdHUxSk5samxraUJueXBnNW1ZSkovSFJodmVVaS9LYVUwKzNkMEkxYnVCand4T2gwYlF6b1lmV0tPdlNtbmp2Y0d3V0NQQUh0NnRWTTFsRUk2bUpwTTBhdFB1a2FQNFpHZ0RlcDBGQzE3SmJXVjdMeDNxYmUyNUM4dGtkZVdLNEl4SjRuVWh5eDd4MVhmb3hNNUY0L2s5MmZFY1JreWNDVktYRFRiVjllVGxQcHJuSHIzK0t5UWI4b2tyeVFmWXMyS2hqN0liWkpCNjY1MUw0VEFwVzhXVXFwa1lmOUhBT2FiY0JDK2xVQk1wcndKaU45VHVEQ1JkdHlKZy9lUUhDNjRhd3dsZVFjSWtUckZTdnc9PVwiLFxuICBcIlNpZ25pbmdDZXJ0VVJMXCIgOiBcImh0dHBzOi8vc25zLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tL1NpbXBsZU5vdGlmaWNhdGlvblNlcnZpY2UtNzUwNmExZTM1YjM2ZWY1YTQ0NGRkMWE4ZTdjYzNlZDgucGVtXCIsXG4gIFwiVW5zdWJzY3JpYmVVUkxcIiA6IFwiaHR0cHM6Ly9zbnMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vP0FjdGlvbj1VbnN1YnNjcmliZSZTdWJzY3JpcHRpb25Bcm49YXJuOmF3czpzbnM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY0RvdWJsZUFjay10b3AtMTowMDJmOTZkZS0xODIxLTQ5ZjUtOTc1YS0xOTJiNjAzNjU5NTRcIlxufSIsIk1ENU9mQm9keSI6IjRlZTUwZTU1ZGM4NTA1MmExODZjMTJiY2UyZDM1Mjg1IiwiTWVzc2FnZUlkIjoiOGVmNTgzMDQtYWY2Yy00ZmVlLTk0MWItNmYzYTVjNmM2MDU5IiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJpWWZYZjNKOHZOTWFuOWk1VTg4RWtqZXYvODh2UitzTEZaMlRJT3QxY3FGc0owY0JQMGJxZnA3S0lXM3FuOHVtSGU1a1lJSDlOaThONEhwbllTdXVJWFVVeWU0Y3JLSkpCUFdtbk5XVHVHcmEwdS9wNDIyRFhpY2xLZ2M4TlBWbUFSbjRoa01SU25uUjFKaDVHd05UZWlWZk5MRmZ1MjlsY0JlKzZyUUd3YzYrc1JjdSs3UllNWkNXcDZJNFcvZzI5RlF5Y3hma0xKdmNGZ3E3WS9BMWFNaUwxc3lYUHNvWmNKQXZFRUZJd21qejRneHhaYjZLOVRaWmNmbElpVU9GUWVUdUltOWN3b3MvNE5YNmYxRTZxVmZCbENLUy9EZWExUGl6blgxWUhwbVVvd0tBVGZYdUhmek5CcTgyanFCSEZGbTFkNTVVOFJJTlF5RUo3V3FaMldNekFGVVI5bUJtN3liQ3gzR3ViYmZ4YlNKSGhEY2NYNi9MbDRDaVd0UjZxLzlSQTVRZlZ1MkthQjVDeFNCUjhRPT0ifV19" } }, { "ID": "a7923f00260d1ebb", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "168" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MywiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0RvdWJsZUFjay1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1710" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:27 GMT" ], "X-Amzn-Requestid": [ "f12003e3-6f44-5579-94f3-61d577977b10" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjI3MTk1IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMjcwMDgifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCI4MzgwMDJiNi01ZTBlLTU1YjUtOWJhYy02MDgwNDZkYzc3ZGVcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljRG91YmxlQWNrLXRvcC0xXCIsXG4gIFwiTWVzc2FnZVwiIDogXCIxXCIsXG4gIFwiVGltZXN0YW1wXCIgOiBcIjIwMjYtMDMtMTlUMTU6MzA6MjYuOTczWlwiLFxuICBcIlNpZ25hdHVyZVZlcnNpb25cIiA6IFwiMVwiLFxuICBcIlNpZ25hdHVyZVwiIDogXCJHK2o5TGF0TDcyL0oxUUczL25uRnNmWHhmWjkzS2s5KzZUenpFNXVBY3lEbk52eStvM2dLZVJmNkh0bW84QlFnYit4aGRsQlZJUlFYbjRpSWZmemV4ZXc2VmdNZkhVVm5zV0JOZFZHMTUrMURBTjdYbldlcXdJRkxKZmh4RkYyQk1XblMrT21nZ1BYQW44TytQRzZ4dm1Tc0R4R0tPa2xEdVJOaXF4bDA4cmJld2Fya1YyWlRNQmp4YjhMTmxiMFNCbFpORWMvZmZJTzRIYU0wUjJhSTJiSU5SOU1UQ3JNQjllRUZ1b1ZTUVVBdEx6WXZlYno4Y1FPTkI1WjJ0SEZPbGpWM0FwZkRzaVhhdEpQWlBKelR0UnZweVFoS04xTWs0VVkyNFd2WUhCUi85MFpWWE1zL3JhSEd1TnJmRnJiYk5QMkJpWUltZzBzN1VXZDhkMTJNT0E9PVwiLFxuICBcIlNpZ25pbmdDZXJ0VVJMXCIgOiBcImh0dHBzOi8vc25zLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tL1NpbXBsZU5vdGlmaWNhdGlvblNlcnZpY2UtNzUwNmExZTM1YjM2ZWY1YTQ0NGRkMWE4ZTdjYzNlZDgucGVtXCIsXG4gIFwiVW5zdWJzY3JpYmVVUkxcIiA6IFwiaHR0cHM6Ly9zbnMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vP0FjdGlvbj1VbnN1YnNjcmliZSZTdWJzY3JpcHRpb25Bcm49YXJuOmF3czpzbnM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY0RvdWJsZUFjay10b3AtMTowMDJmOTZkZS0xODIxLTQ5ZjUtOTc1YS0xOTJiNjAzNjU5NTRcIlxufSIsIk1ENU9mQm9keSI6IjU1OGIwZDlhYjYzZTk3YzcyNDg4ZWFhZGQ0OGQ1NjE3IiwiTWVzc2FnZUlkIjoiNTIyZDlmOWEtOGM2Zi00MDhiLTllMGYtOWExNjhlODg3OTk4IiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJJZ0ErTjVjSGtHTlVIR0x4SDNyd0FaYWxaWVNZbm9wQ2tmT2xzcEhVamluMlc2bFRvZUxUWm9IeENOVUN2Q1IvQWk4aXZwUXhkbGhCUjFaQnVHbEJhR0w5dFZBQTl4V3NGcVBBRWtBQ1NVMTJqdGxNellOTHVCTHhvY0N5RWVWQUViTHczbTZ5aDZkOERHRm5HbjIvM0dseThDRStNMnpoQzFKRWUyamJ6dDNjQlpnemxZSVZCSGYxVTR0cmFYUGZMVjdaNU5PaGppRUJUdHdUc1ZYL21JNklsTXkyTEZBbTQrNVhlbTYyN0lrMStqeERPVHNsNnBVclFJQkNmcm1tQjR3c2FmK3E2Wllxbmg1T28wVS91c0kzVWlOZ1JnUUhtL2g0QVVSTWdJRlZFQThxa1ZYbG5OeDRvZ2NTVUUvQXNQOGEvdll4d0J5RFVPUEZCWkgyY1Vua3hCRlplMFVYVnlHeWxOSXRVRHRheGNTUlVHS2VDOW13Z1FnL3ArbUVsZTkrNTBvcHdCUjNXYWRQQTZvMlVRPT0ifV19" } }, { "ID": "ae155f9a4f393c7f", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "168" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MywiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0RvdWJsZUFjay1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1710" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:27 GMT" ], "X-Amzn-Requestid": [ "966bbc06-cf7e-5c9c-bff7-de30d7ad32f5" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjI3MjYzIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMjY5MjkifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCJjMDIyNTRiOC0yNzZjLTVmNGUtOWQwMy0zNjhlM2ZiZTVkMjVcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljRG91YmxlQWNrLXRvcC0xXCIsXG4gIFwiTWVzc2FnZVwiIDogXCIwXCIsXG4gIFwiVGltZXN0YW1wXCIgOiBcIjIwMjYtMDMtMTlUMTU6MzA6MjYuODg4WlwiLFxuICBcIlNpZ25hdHVyZVZlcnNpb25cIiA6IFwiMVwiLFxuICBcIlNpZ25hdHVyZVwiIDogXCJTUjdwZ0hoZWV2SkZVd1g0SjlYbWgyS0QrSk5LZ0lraDZJL0xkS0tySXVZR3pQdkdORlVtK0s4NzFveUw2djUvVzJGWlRkVm5nb1JIa0dhdUY4OS9WdkRBTDd4eWRyWlFhcVRRZnZnTmpkWm9rRk5wbWp6bGpub21MajZWcVV1N0ExNGRVUkoyQWRZbytWNUU0V0JQcnVCaFdoaDF2NTBiWHlZMkU5d2tRZkU5OVk2cFo3TW1HYS92YnlBZGRKd1VvN1RUa1JQb09SZS9waE01THZqSnFGTzFrbWNSR2d3c3NaNEh6Q1RPMWd3bS9CZllFYmk1U3pIc3NpOGxpNVozTGRSMGlPdW5PQjFjWEVpa3B5ZDh6V0JEYjRBU0FDTCtaSDd6S2QybHljenY5RWJhS2dkOE41di9aQ04xSzl2ZWhLd0M1N1hlUnI0VnVBSTlJalF0bmc9PVwiLFxuICBcIlNpZ25pbmdDZXJ0VVJMXCIgOiBcImh0dHBzOi8vc25zLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tL1NpbXBsZU5vdGlmaWNhdGlvblNlcnZpY2UtNzUwNmExZTM1YjM2ZWY1YTQ0NGRkMWE4ZTdjYzNlZDgucGVtXCIsXG4gIFwiVW5zdWJzY3JpYmVVUkxcIiA6IFwiaHR0cHM6Ly9zbnMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vP0FjdGlvbj1VbnN1YnNjcmliZSZTdWJzY3JpcHRpb25Bcm49YXJuOmF3czpzbnM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY0RvdWJsZUFjay10b3AtMTowMDJmOTZkZS0xODIxLTQ5ZjUtOTc1YS0xOTJiNjAzNjU5NTRcIlxufSIsIk1ENU9mQm9keSI6ImQxM2QyOWE5MGQxNWFjY2RkYThkYTc3NGY1MTI1N2NjIiwiTWVzc2FnZUlkIjoiNDU2MDcwNjQtMTk1Zi00YWYwLWEyNDMtZWVkZGIzNWM1MmJkIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJQNE03ZSttZFRzYTZGOVVBMXA3MVJraWx5UUw5aGhvemdhMzVmdmtyNmNCek1sZGRhOVdxaGQ1Q2hVblFNeENNa3VhR3F1L3pRSGd1cGdjdUJET2FlMUdacG9oYWhkekdsc1hFRndFZTZRZzJHendGZjdWZHdhenE5MUttZXA2aGtTSitRTnp3dURKMSs2Q2l2eDI0aWdycktqOGtwaWZCV0s5cERYRCtsd2c3YkZIeFlSQ0tubFo1dmV3aGpPMi83VlRFVkdRbmR6UkRDN1JFYnRCdnlHQWY5ZWNJOENpSUtMSnZNczEwMWxlUndoWXd2b1NmRFI2KzVvcnBQQVhlQ2JHeHlkRHRVczZKeVBsN3VqQUcxaUlndCtxVDNSclRLSEtIeHZDVEIvcTQyYlByWGl1UnJGQ0UwcTYrSmhZQVFXRUZUemVobm5mQ2RTZ1UzREZQbWhkdUdydS9zOG1jRE03SGZqVXMyVXR2d2x3R1NBaUsybFJKWTUvM0gzSG9Cc00vSmd5aFZ2Mk1XSkFFTGJ4ZFl3PT0ifV19" } }, { "ID": "b561e1b34300c6a6", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "983" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQmlZZlhmM0o4dk5NYW45aTVVODhFa2pldi84OHZSK3NMRloyVElPdDFjcUZzSjBjQlAwYnFmcDdLSVczcW44dW1IZTVrWUlIOU5pOE40SHBuWVN1dUlYVVV5ZTRjcktKSkJQV21uTldUdUdyYTB1L3A0MjJEWGljbEtnYzhOUFZtQVJuNGhrTVJTbm5SMUpoNUd3TlRlaVZmTkxGZnUyOWxjQmUrNnJRR3djNitzUmN1KzdSWU1aQ1dwNkk0Vy9nMjlGUXljeGZrTEp2Y0ZncTdZL0ExYU1pTDFzeVhQc29aY0pBdkVFRkl3bWp6NGd4eFpiNks5VFpaY2ZsSWlVT0ZRZVR1SW05Y3dvcy80Tlg2ZjFFNnFWZkJsQ0tTL0RlYTFQaXpuWDFZSHBtVW93S0FUZlh1SGZ6TkJxODJqcUJIRkZtMWQ1NVU4UklOUXlFSjdXcVoyV016QUZVUjltQm03eWJDeDNHdWJiZnhiU0pIaERjY1g2L0xsNENpV3RSNnEvOVJBNVFmVnUyS2FCNUN4U0JSOFE9PSJ9LHsiSWQiOiIxIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJJZ0ErTjVjSGtHTlVIR0x4SDNyd0FaYWxaWVNZbm9wQ2tmT2xzcEhVamluMlc2bFRvZUxUWm9IeENOVUN2Q1IvQWk4aXZwUXhkbGhCUjFaQnVHbEJhR0w5dFZBQTl4V3NGcVBBRWtBQ1NVMTJqdGxNellOTHVCTHhvY0N5RWVWQUViTHczbTZ5aDZkOERHRm5HbjIvM0dseThDRStNMnpoQzFKRWUyamJ6dDNjQlpnemxZSVZCSGYxVTR0cmFYUGZMVjdaNU5PaGppRUJUdHdUc1ZYL21JNklsTXkyTEZBbTQrNVhlbTYyN0lrMStqeERPVHNsNnBVclFJQkNmcm1tQjR3c2FmK3E2Wllxbmg1T28wVS91c0kzVWlOZ1JnUUhtL2g0QVVSTWdJRlZFQThxa1ZYbG5OeDRvZ2NTVUUvQXNQOGEvdll4d0J5RFVPUEZCWkgyY1Vua3hCRlplMFVYVnlHeWxOSXRVRHRheGNTUlVHS2VDOW13Z1FnL3ArbUVsZTkrNTBvcHdCUjNXYWRQQTZvMlVRPT0ifV0sIlF1ZXVlVXJsIjoiaHR0cHM6Ly9zcXMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vNDU2NzUyNjY1NTc2L1NOU1RvcGljRG91YmxlQWNrLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "38" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:27 GMT" ], "X-Amzn-Requestid": [ "34dbc014-8458-5ef0-9b33-a2229c8b5099" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjEifSx7IklkIjoiMCJ9XX0=" } }, { "ID": "33e1f69a3152a477", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "983" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQmlZZlhmM0o4dk5NYW45aTVVODhFa2pldi84OHZSK3NMRloyVElPdDFjcUZzSjBjQlAwYnFmcDdLSVczcW44dW1IZTVrWUlIOU5pOE40SHBuWVN1dUlYVVV5ZTRjcktKSkJQV21uTldUdUdyYTB1L3A0MjJEWGljbEtnYzhOUFZtQVJuNGhrTVJTbm5SMUpoNUd3TlRlaVZmTkxGZnUyOWxjQmUrNnJRR3djNitzUmN1KzdSWU1aQ1dwNkk0Vy9nMjlGUXljeGZrTEp2Y0ZncTdZL0ExYU1pTDFzeVhQc29aY0pBdkVFRkl3bWp6NGd4eFpiNks5VFpaY2ZsSWlVT0ZRZVR1SW05Y3dvcy80Tlg2ZjFFNnFWZkJsQ0tTL0RlYTFQaXpuWDFZSHBtVW93S0FUZlh1SGZ6TkJxODJqcUJIRkZtMWQ1NVU4UklOUXlFSjdXcVoyV016QUZVUjltQm03eWJDeDNHdWJiZnhiU0pIaERjY1g2L0xsNENpV3RSNnEvOVJBNVFmVnUyS2FCNUN4U0JSOFE9PSJ9LHsiSWQiOiIxIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJJZ0ErTjVjSGtHTlVIR0x4SDNyd0FaYWxaWVNZbm9wQ2tmT2xzcEhVamluMlc2bFRvZUxUWm9IeENOVUN2Q1IvQWk4aXZwUXhkbGhCUjFaQnVHbEJhR0w5dFZBQTl4V3NGcVBBRWtBQ1NVMTJqdGxNellOTHVCTHhvY0N5RWVWQUViTHczbTZ5aDZkOERHRm5HbjIvM0dseThDRStNMnpoQzFKRWUyamJ6dDNjQlpnemxZSVZCSGYxVTR0cmFYUGZMVjdaNU5PaGppRUJUdHdUc1ZYL21JNklsTXkyTEZBbTQrNVhlbTYyN0lrMStqeERPVHNsNnBVclFJQkNmcm1tQjR3c2FmK3E2Wllxbmg1T28wVS91c0kzVWlOZ1JnUUhtL2g0QVVSTWdJRlZFQThxa1ZYbG5OeDRvZ2NTVUUvQXNQOGEvdll4d0J5RFVPUEZCWkgyY1Vua3hCRlplMFVYVnlHeWxOSXRVRHRheGNTUlVHS2VDOW13Z1FnL3ArbUVsZTkrNTBvcHdCUjNXYWRQQTZvMlVRPT0ifV0sIlF1ZXVlVXJsIjoiaHR0cHM6Ly9zcXMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vNDU2NzUyNjY1NTc2L1NOU1RvcGljRG91YmxlQWNrLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "38" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:27 GMT" ], "X-Amzn-Requestid": [ "0ae53306-be7c-5c45-b576-5130a6aff22c" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjEifSx7IklkIjoiMCJ9XX0=" } }, { "ID": "5c1cce841570d072", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "1491" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ChangeMessageVisibilityBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQmlZZlhmM0o4dk5NYW45aTVVODhFa2pldi84OHZSK3NMRloyVElPdDFjcUZzSjBjQlAwYnFmcDdLSVczcW44dW1IZTVrWUlIOU5pOE40SHBuWVN1dUlYVVV5ZTRjcktKSkJQV21uTldUdUdyYTB1L3A0MjJEWGljbEtnYzhOUFZtQVJuNGhrTVJTbm5SMUpoNUd3TlRlaVZmTkxGZnUyOWxjQmUrNnJRR3djNitzUmN1KzdSWU1aQ1dwNkk0Vy9nMjlGUXljeGZrTEp2Y0ZncTdZL0ExYU1pTDFzeVhQc29aY0pBdkVFRkl3bWp6NGd4eFpiNks5VFpaY2ZsSWlVT0ZRZVR1SW05Y3dvcy80Tlg2ZjFFNnFWZkJsQ0tTL0RlYTFQaXpuWDFZSHBtVW93S0FUZlh1SGZ6TkJxODJqcUJIRkZtMWQ1NVU4UklOUXlFSjdXcVoyV016QUZVUjltQm03eWJDeDNHdWJiZnhiU0pIaERjY1g2L0xsNENpV3RSNnEvOVJBNVFmVnUyS2FCNUN4U0JSOFE9PSIsIlZpc2liaWxpdHlUaW1lb3V0IjoxfSx7IklkIjoiMSIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCSWdBK041Y0hrR05VSEdMeEgzcndBWmFsWllTWW5vcENrZk9sc3BIVWppbjJXNmxUb2VMVFpvSHhDTlVDdkNSL0FpOGl2cFF4ZGxoQlIxWkJ1R2xCYUdMOXRWQUE5eFdzRnFQQUVrQUNTVTEyanRsTXpZTkx1Qkx4b2NDeUVlVkFFYkx3M202eWg2ZDhER0ZuR24yLzNHbHk4Q0UrTTJ6aEMxSkVlMmpienQzY0JaZ3psWUlWQkhmMVU0dHJhWFBmTFY3WjVOT2hqaUVCVHR3VHNWWC9tSTZJbE15MkxGQW00KzVYZW02MjdJazEranhET1RzbDZwVXJRSUJDZnJtbUI0d3NhZitxNlpZcW5oNU9vMFUvdXNJM1VpTmdSZ1FIbS9oNEFVUk1nSUZWRUE4cWtWWGxuTng0b2djU1VFL0FzUDhhL3ZZeHdCeURVT1BGQlpIMmNVbmt4QkZaZTBVWFZ5R3lsTkl0VUR0YXhjU1JVR0tlQzltd2dRZy9wK21FbGU5KzUwb3B3QlIzV2FkUEE2bzJVUT09IiwiVmlzaWJpbGl0eVRpbWVvdXQiOjF9LHsiSWQiOiIyIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJQNE03ZSttZFRzYTZGOVVBMXA3MVJraWx5UUw5aGhvemdhMzVmdmtyNmNCek1sZGRhOVdxaGQ1Q2hVblFNeENNa3VhR3F1L3pRSGd1cGdjdUJET2FlMUdacG9oYWhkekdsc1hFRndFZTZRZzJHendGZjdWZHdhenE5MUttZXA2aGtTSitRTnp3dURKMSs2Q2l2eDI0aWdycktqOGtwaWZCV0s5cERYRCtsd2c3YkZIeFlSQ0tubFo1dmV3aGpPMi83VlRFVkdRbmR6UkRDN1JFYnRCdnlHQWY5ZWNJOENpSUtMSnZNczEwMWxlUndoWXd2b1NmRFI2KzVvcnBQQVhlQ2JHeHlkRHRVczZKeVBsN3VqQUcxaUlndCtxVDNSclRLSEtIeHZDVEIvcTQyYlByWGl1UnJGQ0UwcTYrSmhZQVFXRUZUemVobm5mQ2RTZ1UzREZQbWhkdUdydS9zOG1jRE03SGZqVXMyVXR2d2x3R1NBaUsybFJKWTUvM0gzSG9Cc00vSmd5aFZ2Mk1XSkFFTGJ4ZFl3PT0iLCJWaXNpYmlsaXR5VGltZW91dCI6MX1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0RvdWJsZUFjay1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "332" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:27 GMT" ], "X-Amzn-Requestid": [ "8700eda6-7089-5d74-ab2e-8f90685aa31d" ] }, "Body": "eyJGYWlsZWQiOlt7IkNvZGUiOiJSZWNlaXB0SGFuZGxlSXNJbnZhbGlkIiwiSWQiOiIxIiwiTWVzc2FnZSI6Ik1lc3NhZ2UgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGF2YWlsYWJsZSBmb3IgdmlzaWJpbGl0eSB0aW1lb3V0IGNoYW5nZSIsIlNlbmRlckZhdWx0Ijp0cnVlfSx7IkNvZGUiOiJSZWNlaXB0SGFuZGxlSXNJbnZhbGlkIiwiSWQiOiIwIiwiTWVzc2FnZSI6Ik1lc3NhZ2UgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGF2YWlsYWJsZSBmb3IgdmlzaWJpbGl0eSB0aW1lb3V0IGNoYW5nZSIsIlNlbmRlckZhdWx0Ijp0cnVlfV0sIlN1Y2Nlc3NmdWwiOlt7IklkIjoiMiJ9XX0=" } }, { "ID": "c81a7e3ae1ac127e", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "168" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0RvdWJsZUFjay1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:27 GMT" ], "X-Amzn-Requestid": [ "fca0c37c-ebfb-560a-9c98-a14af328d863" ] }, "Body": "e30=" } }, { "ID": "d8796a6966bbfce5", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "168" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0RvdWJsZUFjay1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:27 GMT" ], "X-Amzn-Requestid": [ "7f0cf594-f376-5a0d-8b67-97a2eba5f464" ] }, "Body": "e30=" } }, { "ID": "dd6956508dba5caf", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "168" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0RvdWJsZUFjay1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:28 GMT" ], "X-Amzn-Requestid": [ "ef90ca83-3472-59b4-a454-a8b52ca637dd" ] }, "Body": "e30=" } }, { "ID": "07a94dc19f8d962f", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "168" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0RvdWJsZUFjay1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1710" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:28 GMT" ], "X-Amzn-Requestid": [ "46febcec-361b-5d2e-a1a8-deda2ecf1347" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjI3MjYzIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIyIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMjY5MjkifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCJjMDIyNTRiOC0yNzZjLTVmNGUtOWQwMy0zNjhlM2ZiZTVkMjVcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljRG91YmxlQWNrLXRvcC0xXCIsXG4gIFwiTWVzc2FnZVwiIDogXCIwXCIsXG4gIFwiVGltZXN0YW1wXCIgOiBcIjIwMjYtMDMtMTlUMTU6MzA6MjYuODg4WlwiLFxuICBcIlNpZ25hdHVyZVZlcnNpb25cIiA6IFwiMVwiLFxuICBcIlNpZ25hdHVyZVwiIDogXCJTUjdwZ0hoZWV2SkZVd1g0SjlYbWgyS0QrSk5LZ0lraDZJL0xkS0tySXVZR3pQdkdORlVtK0s4NzFveUw2djUvVzJGWlRkVm5nb1JIa0dhdUY4OS9WdkRBTDd4eWRyWlFhcVRRZnZnTmpkWm9rRk5wbWp6bGpub21MajZWcVV1N0ExNGRVUkoyQWRZbytWNUU0V0JQcnVCaFdoaDF2NTBiWHlZMkU5d2tRZkU5OVk2cFo3TW1HYS92YnlBZGRKd1VvN1RUa1JQb09SZS9waE01THZqSnFGTzFrbWNSR2d3c3NaNEh6Q1RPMWd3bS9CZllFYmk1U3pIc3NpOGxpNVozTGRSMGlPdW5PQjFjWEVpa3B5ZDh6V0JEYjRBU0FDTCtaSDd6S2QybHljenY5RWJhS2dkOE41di9aQ04xSzl2ZWhLd0M1N1hlUnI0VnVBSTlJalF0bmc9PVwiLFxuICBcIlNpZ25pbmdDZXJ0VVJMXCIgOiBcImh0dHBzOi8vc25zLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tL1NpbXBsZU5vdGlmaWNhdGlvblNlcnZpY2UtNzUwNmExZTM1YjM2ZWY1YTQ0NGRkMWE4ZTdjYzNlZDgucGVtXCIsXG4gIFwiVW5zdWJzY3JpYmVVUkxcIiA6IFwiaHR0cHM6Ly9zbnMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vP0FjdGlvbj1VbnN1YnNjcmliZSZTdWJzY3JpcHRpb25Bcm49YXJuOmF3czpzbnM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY0RvdWJsZUFjay10b3AtMTowMDJmOTZkZS0xODIxLTQ5ZjUtOTc1YS0xOTJiNjAzNjU5NTRcIlxufSIsIk1ENU9mQm9keSI6ImQxM2QyOWE5MGQxNWFjY2RkYThkYTc3NGY1MTI1N2NjIiwiTWVzc2FnZUlkIjoiNDU2MDcwNjQtMTk1Zi00YWYwLWEyNDMtZWVkZGIzNWM1MmJkIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJKVHdOdVlVdlZTd2xWZU41UVZ6K1ltaHgxS1JwcHBTVGNuMHJtRkhDeDBnY0NBanN5a0E3WUs2dEtac2pJd0ZtMnFhaStXWklFZXNvS2tSbngxYnp3RXltUXZzeWlodlpXYlZJQ0ZtU1dYSk9zb0dnNEljTGFwSmErYlE4a1JoeG9zbmtEbzA1WHVyL0FCay9JMWM1aGJaeTZQZzVwMDhMSlZEd2o1NWF3TFlTb2E5VkgxOEYrT283VTN1a0xaWkZmblFxQVFnN3Y5Z3dack9WVXZSRVE2cDVvQk9yRitWZTd6c3N5WkxIK3JZL29ZTURQWmpSOENtZDkvMXozU29lYlo1aWszV3lWaExxMVFKVUJFNWZxM0syVWQ1SmU4a0xtcjZYV05zL3F4KzQvZlJ0ejByYzBHMGhJWTFqWnZWVThLYmVBZFpJOWtUcU5oaWJtSEpyNGk2N1BvZkRhUzZyRkU2eG4vWlg3RGtPYlI4Y0VEbVdteXd4VlJaWlJxUzdwTzJudjU4enhaNE1qUlVBcC9Ta2hnPT0ifV19" } }, { "ID": "13f35d4e563ee232", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "161" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY0RvdWJsZUFjay10b3AtMSUzQTAwMmY5NmRlLTE4MjEtNDlmNS05NzVhLTE5MmI2MDM2NTk1NCZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:28 GMT" ], "X-Amzn-Requestid": [ "2f696ab0-c28f-511c-b1a3-0886da5b0377" ] }, "Body": "PFVuc3Vic2NyaWJlUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD4yZjY5NmFiMC1jMjhmLTUxMWMtYjFhMy0wODg2ZGE1YjAzNzc8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvVW5zdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "384f60137b3a6331", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "87" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0RvdWJsZUFjay1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:28 GMT" ], "X-Amzn-Requestid": [ "369817af-e399-5d57-bb8b-7599fb4d333e" ] }, "Body": "" } }, { "ID": "9c9512a7a0b458f7", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "115" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPURlbGV0ZVRvcGljJlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQVNOU1RvcGljRG91YmxlQWNrLXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:29 GMT" ], "X-Amzn-Requestid": [ "cd212763-9717-5767-ac37-45558fc3450c" ] }, "Body": "PERlbGV0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD5jZDIxMjc2My05NzE3LTU3NjctYWMzNy00NTU1OGZjMzQ1MGM8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvRGVsZXRlVG9waWNSZXNwb25zZT4K" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSNSTopic/TestErrorOnReceiveFromClosedSubscription.replay ================================================ { "Initial": "AQAAAA7hTg2cCA1yGQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "9705d681fd309a16", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "93" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPUNyZWF0ZVRvcGljJk5hbWU9U05TVG9waWNFcnJvck9uUmVjZWl2ZUZyb21DbG9zZWRTdWJzY3JpcHRpb24tdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "357" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:36 GMT" ], "X-Amzn-Requestid": [ "8858cc18-cc2d-5f1e-97d3-ae2ed4f1f0b9" ] }, "Body": "PENyZWF0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxDcmVhdGVUb3BpY1Jlc3VsdD4KICAgIDxUb3BpY0Fybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljRXJyb3JPblJlY2VpdmVGcm9tQ2xvc2VkU3Vic2NyaXB0aW9uLXRvcC0xPC9Ub3BpY0Fybj4KICA8L0NyZWF0ZVRvcGljUmVzdWx0PgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD44ODU4Y2MxOC1jYzJkLTVmMWUtOTdkMy1hZTJlZDRmMWYwYjk8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvQ3JlYXRlVG9waWNSZXNwb25zZT4K" } }, { "ID": "c5e8eec3daff7232", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "66" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTTlNUb3BpY0Vycm9yT25SZWNlaXZlRnJvbUNsb3NlZFN1YnNjcmlwdGlvbi1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "114" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:36 GMT" ], "X-Amzn-Requestid": [ "7d3ce990-6bac-5b1d-a4d5-8ba6737053c8" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0Vycm9yT25SZWNlaXZlRnJvbUNsb3NlZFN1YnNjcmlwdGlvbi1zdWItMSJ9" } }, { "ID": "fae7f3b072a8ac69", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "144" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0Vycm9yT25SZWNlaXZlRnJvbUNsb3NlZFN1YnNjcmlwdGlvbi1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "115" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:36 GMT" ], "X-Amzn-Requestid": [ "3b182fe6-a851-5c2f-841f-4dd0b08d64fa" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY0Vycm9yT25SZWNlaXZlRnJvbUNsb3NlZFN1YnNjcmlwdGlvbi1zdWItMSJ9fQ==" } }, { "ID": "a4e223d663195428", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "514" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljRXJyb3JPblJlY2VpdmVGcm9tQ2xvc2VkU3Vic2NyaXB0aW9uLXN1Yi0xXCJcblx0XHR9XG5cdFx0XVxuXHRcdH0ifSwiUXVldWVVcmwiOiJodHRwczovL3Nxcy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS80NTY3NTI2NjU1NzYvU05TVG9waWNFcnJvck9uUmVjZWl2ZUZyb21DbG9zZWRTdWJzY3JpcHRpb24tc3ViLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:37 GMT" ], "X-Amzn-Requestid": [ "2a605884-e569-53ea-bee5-3ab2fdb56b3f" ] }, "Body": "" } }, { "ID": "0d6bdb00c395183a", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "258" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVN1YnNjcmliZSZFbmRwb2ludD1hcm4lM0Fhd3MlM0FzcXMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY0Vycm9yT25SZWNlaXZlRnJvbUNsb3NlZFN1YnNjcmlwdGlvbi1zdWItMSZQcm90b2NvbD1zcXMmVG9waWNBcm49YXJuJTNBYXdzJTNBc25zJTNBdXMtZWFzdC0yJTNBNDU2NzUyNjY1NTc2JTNBU05TVG9waWNFcnJvck9uUmVjZWl2ZUZyb21DbG9zZWRTdWJzY3JpcHRpb24tdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "400" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:37 GMT" ], "X-Amzn-Requestid": [ "edccac5c-aaa2-586a-a59e-ce6ab27ff7cd" ] }, "Body": "PFN1YnNjcmliZVJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8U3Vic2NyaWJlUmVzdWx0PgogICAgPFN1YnNjcmlwdGlvbkFybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljRXJyb3JPblJlY2VpdmVGcm9tQ2xvc2VkU3Vic2NyaXB0aW9uLXRvcC0xOmViZjY5NDAxLWFiZGQtNGEzNi1hMjE5LTNjZmIxNThlYTdkMTwvU3Vic2NyaXB0aW9uQXJuPgogIDwvU3Vic2NyaWJlUmVzdWx0PgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD5lZGNjYWM1Yy1hYWEyLTU4NmEtYTU5ZS1jZTZhYjI3ZmY3Y2Q8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvU3Vic2NyaWJlUmVzcG9uc2U+Cg==" } }, { "ID": "f7a6de5c94c84850", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "188" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY0Vycm9yT25SZWNlaXZlRnJvbUNsb3NlZFN1YnNjcmlwdGlvbi10b3AtMSUzQWViZjY5NDAxLWFiZGQtNGEzNi1hMjE5LTNjZmIxNThlYTdkMSZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:37 GMT" ], "X-Amzn-Requestid": [ "7eab00fd-733e-5eb6-8310-62cb6be3f111" ] }, "Body": "PFVuc3Vic2NyaWJlUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD43ZWFiMDBmZC03MzNlLTVlYjYtODMxMC02MmNiNmJlM2YxMTE8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvVW5zdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "5231c2f4dfb7161e", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "114" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY0Vycm9yT25SZWNlaXZlRnJvbUNsb3NlZFN1YnNjcmlwdGlvbi1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:37 GMT" ], "X-Amzn-Requestid": [ "31e15182-b939-5e6a-b68f-33b4a1e4d6bf" ] }, "Body": "" } }, { "ID": "32a6ea57ce31ad48", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "142" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPURlbGV0ZVRvcGljJlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQVNOU1RvcGljRXJyb3JPblJlY2VpdmVGcm9tQ2xvc2VkU3Vic2NyaXB0aW9uLXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:37 GMT" ], "X-Amzn-Requestid": [ "59ba6831-8624-541f-9088-0a079ef9abb8" ] }, "Body": "PERlbGV0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD41OWJhNjgzMS04NjI0LTU0MWYtOTA4OC0wYTA3OWVmOWFiYjg8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvRGVsZXRlVG9waWNSZXNwb25zZT4K" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSNSTopic/TestErrorOnSendToClosedTopic.replay ================================================ { "Initial": "AQAAAA7hTg2VA9S8oQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "9c6c0baa020e2f9b", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "81" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPUNyZWF0ZVRvcGljJk5hbWU9U05TVG9waWNFcnJvck9uU2VuZFRvQ2xvc2VkVG9waWMtdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "345" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:29 GMT" ], "X-Amzn-Requestid": [ "d86b9d8d-8274-50cb-ac6c-ffbb9aa15d66" ] }, "Body": "PENyZWF0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxDcmVhdGVUb3BpY1Jlc3VsdD4KICAgIDxUb3BpY0Fybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljRXJyb3JPblNlbmRUb0Nsb3NlZFRvcGljLXRvcC0xPC9Ub3BpY0Fybj4KICA8L0NyZWF0ZVRvcGljUmVzdWx0PgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD5kODZiOWQ4ZC04Mjc0LTUwY2ItYWM2Yy1mZmJiOWFhMTVkNjY8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvQ3JlYXRlVG9waWNSZXNwb25zZT4K" } }, { "ID": "3b76ec15da4cbf81", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "130" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPURlbGV0ZVRvcGljJlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQVNOU1RvcGljRXJyb3JPblNlbmRUb0Nsb3NlZFRvcGljLXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:29 GMT" ], "X-Amzn-Requestid": [ "50f98775-99de-5eb8-800c-e543810b3315" ] }, "Body": "PERlbGV0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD41MGY5ODc3NS05OWRlLTVlYjgtODAwYy1lNTQzODEwYjMzMTU8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvRGVsZXRlVG9waWNSZXNwb25zZT4K" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSNSTopic/TestMetadata.replay ================================================ { "Initial": "AQAAAA7hTg2dJVGm0AAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "4fc76a4e42945540", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "65" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPUNyZWF0ZVRvcGljJk5hbWU9U05TVG9waWNNZXRhZGF0YS10b3AtMSZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "329" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:37 GMT" ], "X-Amzn-Requestid": [ "f8dcba84-f651-511e-8eb5-d8b2ee8ccf9e" ] }, "Body": "PENyZWF0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxDcmVhdGVUb3BpY1Jlc3VsdD4KICAgIDxUb3BpY0Fybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljTWV0YWRhdGEtdG9wLTE8L1RvcGljQXJuPgogIDwvQ3JlYXRlVG9waWNSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPmY4ZGNiYTg0LWY2NTEtNTExZS04ZWI1LWQ4YjJlZThjY2Y5ZTwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9DcmVhdGVUb3BpY1Jlc3BvbnNlPgo=" } }, { "ID": "08b66cc5b9b27262", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "38" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTTlNUb3BpY01ldGFkYXRhLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "86" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:38 GMT" ], "X-Amzn-Requestid": [ "b795fce1-122a-5f0c-b6b5-9ed70af4f51d" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY01ldGFkYXRhLXN1Yi0xIn0=" } }, { "ID": "1e26b63e76e6e8cf", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "116" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY01ldGFkYXRhLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "87" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:38 GMT" ], "X-Amzn-Requestid": [ "71145bc7-290c-5aab-81f4-39f131d2a0ba" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY01ldGFkYXRhLXN1Yi0xIn19" } }, { "ID": "68fb70729fd598d1", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "458" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljTWV0YWRhdGEtc3ViLTFcIlxuXHRcdH1cblx0XHRdXG5cdFx0fSJ9LCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY01ldGFkYXRhLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:38 GMT" ], "X-Amzn-Requestid": [ "74ac2684-7db6-5aed-8103-44b2656840fc" ] }, "Body": "" } }, { "ID": "85ca2993fe0042e2", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "202" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVN1YnNjcmliZSZFbmRwb2ludD1hcm4lM0Fhd3MlM0FzcXMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY01ldGFkYXRhLXN1Yi0xJlByb3RvY29sPXNxcyZUb3BpY0Fybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY01ldGFkYXRhLXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "372" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:38 GMT" ], "X-Amzn-Requestid": [ "a1571e25-f3c9-548a-8f8d-7c13eb174a0a" ] }, "Body": "PFN1YnNjcmliZVJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8U3Vic2NyaWJlUmVzdWx0PgogICAgPFN1YnNjcmlwdGlvbkFybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljTWV0YWRhdGEtdG9wLTE6YzlkMDUyZWUtOTQ5Zi00Yjk0LTg4ODQtMjQ5ZjlhNjc3NGI3PC9TdWJzY3JpcHRpb25Bcm4+CiAgPC9TdWJzY3JpYmVSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPmExNTcxZTI1LWYzYzktNTQ4YS04ZjhkLTdjMTNlYjE3NGEwYTwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9TdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "2dd01c2d9312e6ea", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "3730" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9aGVsbG8rd29ybGQmUHVibGlzaEJhdGNoUmVxdWVzdEVudHJpZXMubWVtYmVyLjEuQ0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:38 GMT" ], "X-Amzn-Requestid": [ "0286f128-04ea-519e-8473-931e1c347f1e" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPjg4YTAzYzUwLTRjNzUtNTFjZC1iZjE1LTVlNjY1NGFiZGY0ZDwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjAyODZmMTI4LTA0ZWEtNTE5ZS04NDczLTkzMWUxYzM0N2YxZTwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "3ab9d9b2dee403cb", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "167" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY01ldGFkYXRhLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "3283" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:38 GMT" ], "X-Amzn-Requestid": [ "40ac3fe8-6270-5085-b0a6-5dde7aae5a94" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjM4NzcwIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMzg3MTUifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCI4OGEwM2M1MC00Yzc1LTUxY2QtYmYxNS01ZTY2NTRhYmRmNGRcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljTWV0YWRhdGEtdG9wLTFcIixcbiAgXCJNZXNzYWdlXCIgOiBcImhlbGxvIHdvcmxkXCIsXG4gIFwiVGltZXN0YW1wXCIgOiBcIjIwMjYtMDMtMTlUMTU6MzA6MzguNjgxWlwiLFxuICBcIlNpZ25hdHVyZVZlcnNpb25cIiA6IFwiMVwiLFxuICBcIlNpZ25hdHVyZVwiIDogXCJCRnJwWlpYbVpCRjZ6cTJCYVQrdkcyalh6djYzU2lZMzNDNkRRQ0tjOGppeHVUVTZPbUJ4QUc0aWtWSkFZYmxFbjRTbGREWVphazJnSUFQWU1YaWNDM3kvc1pDTm15dGZJSWpWN1dXTGJZMEQ2REtRbHczOFFKZ216WlpFUWhobVIxV0dtd0c2ZGtUeStzRkUyZXNwelJjNmRVY2ZhUUNLWTJpTmdnKytFM3BpdUR5aW5vRGZ6WXFvNDlwK2I4WmNrWE13ZExmbSs3WitGQ1FIRmNDS2dGeDF5cXhMQ0owMk5OR3kvd0EyRzRjWk9jYWEzczl6SEh1OFFYMFdkYUJmci9FZXk4VEdOZElhTDY0TkY0dzVzcHdzN3BackRLQUNSL2hPQVQvYXJ4VFkwQ3UzWm96RjVscVdkanoxekJzclVpa1NvOXlDMlF3aEEvVkV6YkdOamc9PVwiLFxuICBcIlNpZ25pbmdDZXJ0VVJMXCIgOiBcImh0dHBzOi8vc25zLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tL1NpbXBsZU5vdGlmaWNhdGlvblNlcnZpY2UtNzUwNmExZTM1YjM2ZWY1YTQ0NGRkMWE4ZTdjYzNlZDgucGVtXCIsXG4gIFwiVW5zdWJzY3JpYmVVUkxcIiA6IFwiaHR0cHM6Ly9zbnMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vP0FjdGlvbj1VbnN1YnNjcmliZSZTdWJzY3JpcHRpb25Bcm49YXJuOmF3czpzbnM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY01ldGFkYXRhLXRvcC0xOmM5ZDA1MmVlLTk0OWYtNGI5NC04ODg0LTI0OWY5YTY3NzRiN1wiLFxuICBcIk1lc3NhZ2VBdHRyaWJ1dGVzXCIgOiB7XG4gICAgXCJfXzB4MmVfX19fMHgyZV9fX18weDVjX19mb29fXzB4NWNfX19fMHg1Y19fYmFyX18weDVjX19fXzB4NWNfX19fMHg1Y19fYmF6XCIgOiB7XCJUeXBlXCI6XCJTdHJpbmdcIixcIlZhbHVlXCI6XCIuLiU1Q2ZvbyU1QyU1Q2JhciU1QyU1QyU1Q2JhelwifSxcbiAgICBcIl9fMHgxMF9fX18weDExX19fXzB4MTJfX19fMHgxM19fX18weDE0X19fXzB4MTVfX19fMHgxNl9fX18weDE3X19fXzB4MThfX19fMHgxOV9fX18weDFhX19fXzB4MWJfX19fMHgxY19fX18weDFkX19fXzB4MWVfX19fMHgxZl9fXCIgOiB7XCJUeXBlXCI6XCJTdHJpbmdcIixcIlZhbHVlXCI6XCIlMTAlMTElMTIlMTMlMTQlMTUlMTYlMTclMTglMTklMUElMUIlMUMlMUQlMUUlMUZcIn0sXG4gICAgXCJfXzB4MmVfX19fMHgyZV9fX18weDVjX19mb29fXzB4NWNfXy5fXzB4MmVfX19fMHg1Y19fYmFyX18weDVjX18uX18weDJlX19fXzB4NWNfXy5fXzB4MmVfX19fMHg1Y19fYmF6Ll9fMHgyZV9fX18weDVjX19cIiA6IHtcIlR5cGVcIjpcIlN0cmluZ1wiLFwiVmFsdWVcIjpcIi4uJTVDZm9vJTVDLi4lNUNiYXIlNUMuLiU1Qy4uJTVDYmF6Li4lNUNcIn0sXG4gICAgXCJfXzB4M2FfX19fMHgzYl9fX18weDNjX19fXzB4M2RfX19fMHgzZV9fX18weDNmX19cIiA6IHtcIlR5cGVcIjpcIlN0cmluZ1wiLFwiVmFsdWVcIjpcIjolM0IlM0M9JTNFJTNGXCJ9LFxuICAgIFwiX18weDBfX19fMHgxX19fXzB4Ml9fX18weDNfX19fMHg0X19fXzB4NV9fX18weDZfX19fMHg3X19fXzB4OF9fX18weDlfX19fMHhhX19fXzB4Yl9fX18weGNfX19fMHhkX19fXzB4ZV9fX18weGZfX1wiIDoge1wiVHlwZVwiOlwiU3RyaW5nXCIsXCJWYWx1ZVwiOlwiJTAwJTAxJTAyJTAzJTA0JTA1JTA2JTA3JTA4JTA5JTBBJTBCJTBDJTBEJTBFJTBGXCJ9LFxuICAgIFwiX18weDJlX19fXzB4MmVfX19fMHgyZl9fZm9vX18weDJmX18uX18weDJlX19fXzB4MmZfX2Jhcl9fMHgyZl9fLl9fMHgyZV9fX18weDJmX18uX18weDJlX19fXzB4MmZfX2Jhei5fXzB4MmVfX19fMHgyZl9fXCIgOiB7XCJUeXBlXCI6XCJTdHJpbmdcIixcIlZhbHVlXCI6XCIuLiUyRmZvbyUyRi4uJTJGYmFyJTJGLi4lMkYuLiUyRmJhei4uJTJGXCJ9LFxuICAgIFwiX18weDIwX19fXzB4MjFfX19fMHgyMl9fX18weDIzX19fXzB4MjRfX19fMHgyNV9fX18weDI2X19fXzB4MjdfX19fMHgyOF9fX18weDI5X19fXzB4MmFfX19fMHgyYl9fX18weDJjX18tLl9fMHgyZl9fXCIgOiB7XCJUeXBlXCI6XCJTdHJpbmdcIixcIlZhbHVlXCI6XCIlMjAlMjElMjIlMjMkJTI1JiUyNyUyOCUyOSUyQSslMkMtLiUyRlwifSxcbiAgICBcIjEyMzQ1XCIgOiB7XCJUeXBlXCI6XCJTdHJpbmdcIixcIlZhbHVlXCI6XCIxMjM0NVwifSxcbiAgICBcIl9fMHg0MF9fXCIgOiB7XCJUeXBlXCI6XCJTdHJpbmdcIixcIlZhbHVlXCI6XCJAXCJ9LFxuICAgIFwiX18weDViX19fXzB4NWNfX19fMHg1ZF9fX18weDVlX19fXCIgOiB7XCJUeXBlXCI6XCJTdHJpbmdcIixcIlZhbHVlXCI6XCIlNUIlNUMlNUQlNUVfXCJ9XG4gIH1cbn0iLCJNRDVPZkJvZHkiOiIzNjVhZGY4ZWI4MWQ4Y2U3NTUzZjQzNDIwYjNlYjk2OSIsIk1lc3NhZ2VJZCI6ImNlYTQ1MWRjLTc1ODgtNDQ1My05ZjcwLWQ4NTJkYjk3OGRlMCIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCQTlVNUxlQS83OUhvNXZIZ3hvaDdHaW11NE5YTm00MnRSdGdCT25VUEN3M1FQQm92cXlnYUl3aWYwcFN2Y2xjRSthVktYTzFLWWt0Nng4eTIzZ2UrZ0RxZFY5MkFqQVkwdzZURktZbGlXSnZuQzZVaFloQmRXSjNSR212NTVXVkhWVUE2Y1UvTlBRQ3BGbjFEelNkN0FVdzZUYWRodlBRUEp4UG5QSDJydlptc1Z1UE5iNlIwbUlNeDJoMklJczR2d0lMNlJKV0xGbHNpWTVDK3lhSjdZRnRPYTQxUDV1SlhwOFVRUEUxNUVTRjVqdFBiUFRsZ0p2bTRxYUlNeEwzOFBaalk4YUxkbWY4RlVrUThxdUZOUmxVajM3S0NmaEhjc2RMcm0yWDBuWGJnSksvY2xTWTJqaURSREQ5Y3doS0sxaHZGU1V6c1J5OWZnd2ZqZi9oRzRQbGdlU0lka1pUNFJvTzh2QklsVlhWQ0diQld3SUczam5xc2ZhU1k5bjJNYkQ1UnprcVp6ZGZOZG5HYnQ1d1VkQT09In1dfQ==" } }, { "ID": "40967c1e95fbfcc5", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "540" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQkE5VTVMZUEvNzlIbzV2SGd4b2g3R2ltdTROWE5tNDJ0UnRnQk9uVVBDdzNRUEJvdnF5Z2FJd2lmMHBTdmNsY0UrYVZLWE8xS1lrdDZ4OHkyM2dlK2dEcWRWOTJBakFZMHc2VEZLWWxpV0p2bkM2VWhZaEJkV0ozUkdtdjU1V1ZIVlVBNmNVL05QUUNwRm4xRHpTZDdBVXc2VGFkaHZQUVBKeFBuUEgycnZabXNWdVBOYjZSMG1JTXgyaDJJSXM0dndJTDZSSldMRmxzaVk1Qyt5YUo3WUZ0T2E0MVA1dUpYcDhVUVBFMTVFU0Y1anRQYlBUbGdKdm00cWFJTXhMMzhQWmpZOGFMZG1mOEZVa1E4cXVGTlJsVWozN0tDZmhIY3NkTHJtMlgwblhiZ0pLL2NsU1kyamlEUkREOWN3aEtLMWh2RlNVenNSeTlmZ3dmamYvaEc0UGxnZVNJZGtaVDRSb084dkJJbFZYVkNHYkJXd0lHM2pucXNmYVNZOW4yTWJENVJ6a3FaemRmTmRuR2J0NXdVZEE9PSJ9XSwiUXVldWVVcmwiOiJodHRwczovL3Nxcy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS80NTY3NTI2NjU1NzYvU05TVG9waWNNZXRhZGF0YS1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:38 GMT" ], "X-Amzn-Requestid": [ "ad058c8c-76d9-5df7-af81-eeba6e07e7e6" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "1e2c6e4689e63965", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "2484" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9aGVsbG8rd29ybGQmUHVibGlzaEJhdGNoUmVxdWVzdEVudHJpZXMubWVtYmVyLjEuQ0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:38 GMT" ], "X-Amzn-Requestid": [ "96746cf5-cddc-5caa-9c03-0ec3d502422a" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPmIyMzI1Y2Q4LWM3MjAtNWQ5Ni1iMTJkLTNlZWVkZmZlNDMxNjwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjk2NzQ2Y2Y1LWNkZGMtNWNhYS05YzAzLTBlYzNkNTAyNDIyYTwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "769ed6fcb7221f34", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "167" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY01ldGFkYXRhLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2506" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:38 GMT" ], "X-Amzn-Requestid": [ "79f3d765-6e63-5666-8a3b-b55376bd1c77" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjM4OTE5IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMzg4NzUifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCJiMjMyNWNkOC1jNzIwLTVkOTYtYjEyZC0zZWVlZGZmZTQzMTZcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljTWV0YWRhdGEtdG9wLTFcIixcbiAgXCJNZXNzYWdlXCIgOiBcImhlbGxvIHdvcmxkXCIsXG4gIFwiVGltZXN0YW1wXCIgOiBcIjIwMjYtMDMtMTlUMTU6MzA6MzguODQyWlwiLFxuICBcIlNpZ25hdHVyZVZlcnNpb25cIiA6IFwiMVwiLFxuICBcIlNpZ25hdHVyZVwiIDogXCJhOE5JRkt5SWtrVEVnTE1ra3d4RExLQ3dXZGJIR3JlOUhSWTl1TXdRQkoyQzlyYlRCV1E0V2xnYzBvZmtFNml6UmF4cUUrZTBnam14TjFDM3gzRnNMUVY1aWpDYU5Cd2U4SUNwK3hUdTlZRUMxWFBHNUdDb3liSlpJS3FNRGo0bGZ5WnFvQzhKSy9oc1plaGYwV2p5b1lHR09IQnQxOWw2V0FZVmN3bE1TcXRJRjI3L29BekRiL3B4UDl6UU1taUlxWkM2VS92TnJUc2lwMXNQMjRiTklpNVBkTGZtZUFiSDZXMS9MNExZUWYyZXFvZ3JuOVNOUUtoeFdQL2Jncy9HVzZxVndCNC9mRklNZ2dlaThyamxLd3NaY3FheWhOL2V3SUtETXJKY25va3o4YjB2bVN5NFlZT0hRakZWZ1hRRk5WdW05NDRHWGg1VnJOQVhibTBYTlE9PVwiLFxuICBcIlNpZ25pbmdDZXJ0VVJMXCIgOiBcImh0dHBzOi8vc25zLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tL1NpbXBsZU5vdGlmaWNhdGlvblNlcnZpY2UtNzUwNmExZTM1YjM2ZWY1YTQ0NGRkMWE4ZTdjYzNlZDgucGVtXCIsXG4gIFwiVW5zdWJzY3JpYmVVUkxcIiA6IFwiaHR0cHM6Ly9zbnMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vP0FjdGlvbj1VbnN1YnNjcmliZSZTdWJzY3JpcHRpb25Bcm49YXJuOmF3czpzbnM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY01ldGFkYXRhLXRvcC0xOmM5ZDA1MmVlLTk0OWYtNGI5NC04ODg0LTI0OWY5YTY3NzRiN1wiLFxuICBcIk1lc3NhZ2VBdHRyaWJ1dGVzXCIgOiB7XG4gICAgXCJmb29fXzB4MjBfX2Jhcl9fMHgyMF9fYmF6XCIgOiB7XCJUeXBlXCI6XCJTdHJpbmdcIixcIlZhbHVlXCI6XCJmb28lMjBiYXIlMjBiYXpcIn0sXG4gICAgXCJmb29fXzB4MjJfX2Jhcl9fMHgyMl9fYmF6XCIgOiB7XCJUeXBlXCI6XCJTdHJpbmdcIixcIlZhbHVlXCI6XCJmb28lMjJiYXIlMjJiYXpcIn0sXG4gICAgXCJmb29fXzB4MmZfX2Jhcl9fMHgyZl9fYmF6XCIgOiB7XCJUeXBlXCI6XCJTdHJpbmdcIixcIlZhbHVlXCI6XCJmb28lMkZiYXIlMkZiYXpcIn0sXG4gICAgXCJfXzB4N2JfX19fMHg3Y19fX18weDdkX19fXzB4N2VfX19fMHg3Zl9fXCIgOiB7XCJUeXBlXCI6XCJTdHJpbmdcIixcIlZhbHVlXCI6XCIlN0IlN0MlN0R+JTdGXCJ9LFxuICAgIFwiZm9vX18weDVjX19iYXJfXzB4NWNfX2JhelwiIDoge1wiVHlwZVwiOlwiU3RyaW5nXCIsXCJWYWx1ZVwiOlwiZm9vJTVDYmFyJTVDYmF6XCJ9LFxuICAgIFwiX18weDYwX19cIiA6IHtcIlR5cGVcIjpcIlN0cmluZ1wiLFwiVmFsdWVcIjpcIiU2MFwifSxcbiAgICBcIl9fMHgyNjNhX19fXzB4MjYzYV9fX18weDI2M2FfX1wiIDoge1wiVHlwZVwiOlwiU3RyaW5nXCIsXCJWYWx1ZVwiOlwiJUUyJTk4JUJBJUUyJTk4JUJBJUUyJTk4JUJBXCJ9LFxuICAgIFwiZm9vX18weDJmX19fXzB4MmZfX2Jhcl9fMHgyZl9fX18weDJmX19fXzB4MmZfX2JhelwiIDoge1wiVHlwZVwiOlwiU3RyaW5nXCIsXCJWYWx1ZVwiOlwiZm9vJTJGJTJGYmFyJTJGJTJGJTJGYmF6XCJ9XG4gIH1cbn0iLCJNRDVPZkJvZHkiOiJjNGI0MTE5Y2E2MzE3OTJjZTNjMzJkZDAwNDdlOWY3NSIsIk1lc3NhZ2VJZCI6IjhhYzllYWZmLWRiNjctNGFhNi1iMWMxLTMxODRkNmVlMTM3MyIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCV0l6V0NSYTNXVUxKT0tad2NZbUlHbmpjdDF3MG8vN2drSEkrZmZ2ZmRhekZiNUlPUm0vUzU0OVh1VE5WUnZEV2Nrbm9Qc0tia2U0ckVNOXU4dGxIbTVlV2l1c1FtZHVwckNianhIRklIbWtOMXdkY2w3d09UdVI5NlQwejg4Z003K1BCd2o5TEhRYUcwUTVVTTJaYVM1aFhkK2hqcVlxeWJGcFIyMG0xNGFTQkdqSWhJY05TSW8vZTRQYllTeEQ5WkZjZzBFT3ZZb1g2ckFnWngra2tXeE9LOXNKQnlOTk5tTmtrelUrdTFhV2cwb01GREdvMmNkc0lreWxmamRGOVVCUUttZHNMR3ltSGg5UWU1YithaGZQbTM5TWVOV2dzSnVGSHBTRWJKeDlXSllWN29EZVVORkUyZkZqajFUUDFkNE9GM0paQlhnak1JNGJkZjl5Y09GWk5LM2t3U1p3bEhNMlppME5MVUNIRVdKSjlHT1IxOFlDMlBtakQzMmd4NFFSTTIyODNSeU5jRnRoTWxsQm9VZz09In1dfQ==" } }, { "ID": "d38c740c9e3b2375", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "540" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQldJeldDUmEzV1VMSk9LWndjWW1JR25qY3QxdzBvLzdna0hJK2ZmdmZkYXpGYjVJT1JtL1M1NDlYdVROVlJ2RFdja25vUHNLYmtlNHJFTTl1OHRsSG01ZVdpdXNRbWR1cHJDYmp4SEZJSG1rTjF3ZGNsN3dPVHVSOTZUMHo4OGdNNytQQndqOUxIUWFHMFE1VU0yWmFTNWhYZCtoanFZcXliRnBSMjBtMTRhU0JHakloSWNOU0lvL2U0UGJZU3hEOVpGY2cwRU92WW9YNnJBZ1p4K2trV3hPSzlzSkJ5Tk5ObU5ra3pVK3UxYVdnMG9NRkRHbzJjZHNJa3lsZmpkRjlVQlFLbWRzTEd5bUhoOVFlNWIrYWhmUG0zOU1lTldnc0p1RkhwU0ViSng5V0pZVjdvRGVVTkZFMmZGamoxVFAxZDRPRjNKWkJYZ2pNSTRiZGY5eWNPRlpOSzNrd1Nad2xITTJaaTBOTFVDSEVXSko5R09SMThZQzJQbWpEMzJneDRRUk0yMjgzUnlOY0Z0aE1sbEJvVWc9PSJ9XSwiUXVldWVVcmwiOiJodHRwczovL3Nxcy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS80NTY3NTI2NjU1NzYvU05TVG9waWNNZXRhZGF0YS1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:38 GMT" ], "X-Amzn-Requestid": [ "4984d8c1-6e36-564d-ad40-baf776e89c5c" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "b00d3e360590a5d6", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "160" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY01ldGFkYXRhLXRvcC0xJTNBYzlkMDUyZWUtOTQ5Zi00Yjk0LTg4ODQtMjQ5ZjlhNjc3NGI3JlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:39 GMT" ], "X-Amzn-Requestid": [ "a5b6f428-7f22-5a3a-9b9a-961e67fd44ba" ] }, "Body": "PFVuc3Vic2NyaWJlUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD5hNWI2ZjQyOC03ZjIyLTVhM2EtOWI5YS05NjFlNjdmZDQ0YmE8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvVW5zdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "b5e80ce6bf6e4dc0", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "86" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY01ldGFkYXRhLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:39 GMT" ], "X-Amzn-Requestid": [ "b32227ef-3c9a-5b66-a611-45d92445ac8f" ] }, "Body": "" } }, { "ID": "95e119e6cdbdd479", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "114" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPURlbGV0ZVRvcGljJlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQVNOU1RvcGljTWV0YWRhdGEtdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:39 GMT" ], "X-Amzn-Requestid": [ "c516baaa-4231-575b-b171-d89c5aee59db" ] }, "Body": "PERlbGV0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD5jNTE2YmFhYS00MjMxLTU3NWItYjE3MS1kODljNWFlZTU5ZGI8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvRGVsZXRlVG9waWNSZXNwb25zZT4K" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSNSTopic/TestNack.replay ================================================ { "Initial": "AQAAAA7hTg2MCUZYngAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "5fde0d86714993b2", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "61" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPUNyZWF0ZVRvcGljJk5hbWU9U05TVG9waWNOYWNrLXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "325" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:20 GMT" ], "X-Amzn-Requestid": [ "e93785c2-c608-55db-9dcf-e7f4dec4c65e" ] }, "Body": "PENyZWF0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxDcmVhdGVUb3BpY1Jlc3VsdD4KICAgIDxUb3BpY0Fybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljTmFjay10b3AtMTwvVG9waWNBcm4+CiAgPC9DcmVhdGVUb3BpY1Jlc3VsdD4KICA8UmVzcG9uc2VNZXRhZGF0YT4KICAgIDxSZXF1ZXN0SWQ+ZTkzNzg1YzItYzYwOC01NWRiLTlkY2YtZTdmNGRlYzRjNjVlPC9SZXF1ZXN0SWQ+CiAgPC9SZXNwb25zZU1ldGFkYXRhPgo8L0NyZWF0ZVRvcGljUmVzcG9uc2U+Cg==" } }, { "ID": "7002c9a82dbf0aea", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "34" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTTlNUb3BpY05hY2stc3ViLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "82" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:20 GMT" ], "X-Amzn-Requestid": [ "8b005967-e39f-5cfb-8104-3b51fb5365d3" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY05hY2stc3ViLTEifQ==" } }, { "ID": "c8e997dacd52d89f", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "112" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY05hY2stc3ViLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "83" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:20 GMT" ], "X-Amzn-Requestid": [ "e9d4422d-9800-5050-81b5-201b80ccc978" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY05hY2stc3ViLTEifX0=" } }, { "ID": "474ba6d79cd6ea8a", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "450" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljTmFjay1zdWItMVwiXG5cdFx0fVxuXHRcdF1cblx0XHR9In0sIlF1ZXVlVXJsIjoiaHR0cHM6Ly9zcXMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vNDU2NzUyNjY1NTc2L1NOU1RvcGljTmFjay1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:20 GMT" ], "X-Amzn-Requestid": [ "291dab45-8786-583b-a217-c9739f4a9113" ] }, "Body": "" } }, { "ID": "d8394c97ec39e1c7", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "194" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVN1YnNjcmliZSZFbmRwb2ludD1hcm4lM0Fhd3MlM0FzcXMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY05hY2stc3ViLTEmUHJvdG9jb2w9c3FzJlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQVNOU1RvcGljTmFjay10b3AtMSZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "368" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:21 GMT" ], "X-Amzn-Requestid": [ "a2d9b353-95e9-5eb6-b821-d1658d256d33" ] }, "Body": "PFN1YnNjcmliZVJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8U3Vic2NyaWJlUmVzdWx0PgogICAgPFN1YnNjcmlwdGlvbkFybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljTmFjay10b3AtMTphYzUxN2Q1Zi02ZmI2LTQ0NmEtODExMS03ZmQ4NmUzYjk0MGQ8L1N1YnNjcmlwdGlvbkFybj4KICA8L1N1YnNjcmliZVJlc3VsdD4KICA8UmVzcG9uc2VNZXRhZGF0YT4KICAgIDxSZXF1ZXN0SWQ+YTJkOWIzNTMtOTVlOS01ZWI2LWI4MjEtZDE2NThkMjU2ZDMzPC9SZXF1ZXN0SWQ+CiAgPC9SZXNwb25zZU1ldGFkYXRhPgo8L1N1YnNjcmliZVJlc3BvbnNlPgo=" } }, { "ID": "75efdb0e0e53b9c7", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "433" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9MCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5DTEVBUkVE" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:21 GMT" ], "X-Amzn-Requestid": [ "a87c2b5d-dd89-5317-b276-496bc5449092" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPjQyNjIxM2Y3LTcwYWEtNWRiZi1hMmU1LTcxYzE2ODY3OGUzYTwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPmE4N2MyYjVkLWRkODktNTMxNy1iMjc2LTQ5NmJjNTQ0OTA5MjwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "0b97cac62e1bc411", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "433" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9MSZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5DTEVBUkVE" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:21 GMT" ], "X-Amzn-Requestid": [ "16798922-2fac-53ad-a5c5-eb143761f028" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPmNiYmEwM2M5LTQwN2MtNTI4NS05ZmM5LTYxZmY1OGIxODEwMDwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjE2Nzk4OTIyLTJmYWMtNTNhZC1hNWM1LWViMTQzNzYxZjAyODwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "b7c1723c1a1203fd", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "163" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY05hY2stc3ViLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1786" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:21 GMT" ], "X-Amzn-Requestid": [ "78400465-78f1-54d2-b834-6653603cedfa" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjIxMzUyIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMjEyNDIifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCI0MjYyMTNmNy03MGFhLTVkYmYtYTJlNS03MWMxNjg2NzhlM2FcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljTmFjay10b3AtMVwiLFxuICBcIk1lc3NhZ2VcIiA6IFwiMFwiLFxuICBcIlRpbWVzdGFtcFwiIDogXCIyMDI2LTAzLTE5VDE1OjMwOjIxLjIwN1pcIixcbiAgXCJTaWduYXR1cmVWZXJzaW9uXCIgOiBcIjFcIixcbiAgXCJTaWduYXR1cmVcIiA6IFwiRW5IUFpKaFBxKzBJWGNkQjZHMUpLd2dqUlRxYmd0M0xrcktSeFZZOWp6SlpUVjI0dFovREZTNVVrWEplQ0w1bkE4eFlBZS9xeG9YOVlYNndjTDFzUDU5aWh6MXBKMm0zRlRoeXU5WUpZZVNGZ2UyM3lHQ3B3RSsrRkQvTk56UHBRM1JzSldjcnFnYURSSEtHdUt2S0lYWm9CNFNmL0lRdnQvQ3hoL3hhZjFCeVFaeXBBU2gwVmV6REZtUEkyY1JreVVoeVpIV2o2a0FiYS9BVTRRTlZqYXExS3IyTzJ2MEJ5dHR5R25KUm5DN3NMczFTSXZpRzBVRjQ0Z0UycmVDdzEzZ2dIalhnaXV4Z0wvUmlsUGVBRHNDTnRoN3BnUVlPc0ZIS1hKZWlENW9ENkZtSEExWUhlakc2eFZXd1YvZTdhUCt4aGJFYUIyVmY5TEh0OVBnU2NRPT1cIixcbiAgXCJTaWduaW5nQ2VydFVSTFwiIDogXCJodHRwczovL3Nucy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS9TaW1wbGVOb3RpZmljYXRpb25TZXJ2aWNlLTc1MDZhMWUzNWIzNmVmNWE0NDRkZDFhOGU3Y2MzZWQ4LnBlbVwiLFxuICBcIlVuc3Vic2NyaWJlVVJMXCIgOiBcImh0dHBzOi8vc25zLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLz9BY3Rpb249VW5zdWJzY3JpYmUmU3Vic2NyaXB0aW9uQXJuPWFybjphd3M6c25zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6U05TVG9waWNOYWNrLXRvcC0xOmFjNTE3ZDVmLTZmYjYtNDQ2YS04MTExLTdmZDg2ZTNiOTQwZFwiLFxuICBcIk1lc3NhZ2VBdHRyaWJ1dGVzXCIgOiB7XG4gICAgXCJhXCIgOiB7XCJUeXBlXCI6XCJTdHJpbmdcIixcIlZhbHVlXCI6XCIwXCJ9XG4gIH1cbn0iLCJNRDVPZkJvZHkiOiJjMmRlMmQwZTA0Y2M0MzM4YzYwNjAwYWRhOWIxM2VjZiIsIk1lc3NhZ2VJZCI6Ijg2Njc4ZDhkLTI2YTctNGM5MS04MWU4LWQ4OTRjYThjNDQ0MyIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCa0dKaGM0RGpEZDliQzFhSjZlVVh3N2JwNzM2UHZJSS9yUXorMll0RHpvNUNVTjE0SHVQY2RSQ2pPcFVEL2ZHYml3eUFkWkdXeS9kd3RzNzUzOG9FaEJoeEJEamhSNkIvbU5kVFBVS2xNMEVmekJ5WHhCZkV5Z1VYYnlUNWRrSmxPMlpSWGJWTHdudE1aQ1RoL2RCOVczcHhhTFNaa3VsNEd6c1NlZXVwdWZpUnhzbkxhdGJOY1oyTVFsOXdkVU1nOWMvaUNYa2pTYU9aQk01WENtMUJ2UzBBWkhuRWp4SUkwd2FIVnZWZWZPdjh6Q2ZBZGVEUFN5bHlNQnRKcXVLbzlUOWFEZVRyTXV4cVhYbVV2WnFITlpTR2grQTNQdVkvd2VCWHpJQkh0UVNmSTQxTUNrV2Yzb1JxWjBxZG1OZi9ZR3MwTzN0cU16UWNRLzFNakxmQ1BFOEtWbFRYSnlnSitCNytEU2VNTHpMUWlNNHFlczdRWmtYeWVieUJsWlNrUkxmV3RpNlZLdHNWUW5LS1FxOUV2Zz09In1dfQ==" } }, { "ID": "d85241fa4e0c64ac", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "163" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY05hY2stc3ViLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1786" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:21 GMT" ], "X-Amzn-Requestid": [ "5b6db47e-e519-58c2-ba93-d648fdd4d1ea" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjIxNDIwIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMjEzMDMifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCJjYmJhMDNjOS00MDdjLTUyODUtOWZjOS02MWZmNThiMTgxMDBcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljTmFjay10b3AtMVwiLFxuICBcIk1lc3NhZ2VcIiA6IFwiMVwiLFxuICBcIlRpbWVzdGFtcFwiIDogXCIyMDI2LTAzLTE5VDE1OjMwOjIxLjI4MFpcIixcbiAgXCJTaWduYXR1cmVWZXJzaW9uXCIgOiBcIjFcIixcbiAgXCJTaWduYXR1cmVcIiA6IFwiUVhiRnlld0pSMDVQSTM0NWg4V0xqYkoxR1gzSGZpWXdpZ3NjRUtBVGViUG5XejV6bXg5SEN3VHUwTEY5R1BTbmdqcm80VUFIcTRwYi84SzlJT2lmNUhvaG5DM0FERnJKdU94K2pSbEVKSFFaYjVZVWxQd1Z6bkxBd0tUVXNhTWVZdWRMdzh4UFFFVmYwNlBIU05wQ2FGVmFjSm9wWEJFUStFa1JaOENpZEdnS0dRWit1N2VEWWxHNkdFVHRVWWxqOFF1UWpKVTcvOHZJQWNVdmwzaEl2L2Q4Wk5sRFBvOHplVGJUV2wvdzhwQUtZK28wRC9wOEkyUHo1OUlWdndtQ0FMRzRyODJtcENTQ0FranQ1RlJMa2pnS25neSs5ak5qZGgvVHV1eFJiNUxrdXBqd3h5MHRoT01mWE95a3NpSytPRUE4aTRnQS92T241Nzl5RUNGOERRPT1cIixcbiAgXCJTaWduaW5nQ2VydFVSTFwiIDogXCJodHRwczovL3Nucy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS9TaW1wbGVOb3RpZmljYXRpb25TZXJ2aWNlLTc1MDZhMWUzNWIzNmVmNWE0NDRkZDFhOGU3Y2MzZWQ4LnBlbVwiLFxuICBcIlVuc3Vic2NyaWJlVVJMXCIgOiBcImh0dHBzOi8vc25zLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLz9BY3Rpb249VW5zdWJzY3JpYmUmU3Vic2NyaXB0aW9uQXJuPWFybjphd3M6c25zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6U05TVG9waWNOYWNrLXRvcC0xOmFjNTE3ZDVmLTZmYjYtNDQ2YS04MTExLTdmZDg2ZTNiOTQwZFwiLFxuICBcIk1lc3NhZ2VBdHRyaWJ1dGVzXCIgOiB7XG4gICAgXCJhXCIgOiB7XCJUeXBlXCI6XCJTdHJpbmdcIixcIlZhbHVlXCI6XCIxXCJ9XG4gIH1cbn0iLCJNRDVPZkJvZHkiOiJjOTkwODM2OGFiOGU4ZTczZDRlYTM0NWNkOTllYzRlNiIsIk1lc3NhZ2VJZCI6IjFjY2MyZWE5LTU0MmEtNDMwMS1iYTZhLTk5OTI3MTIwMmNiMCIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCUHJ3ODN5Nnc0Y2dLcXFCVG9DMUtHVGc4MzFTRlpyYWJnak5WRnJ1YnMwNURFTnlNR09GTlFtMzhvRFRZanRlRmRnZmpNZWYvajQwb2VDVDg4VENWWDJxa2kvcHJ0NDJja2p3WVZPd1piMjRDQS85SDRjcmNHMUdnd0ZuZlhNQzVId2ZHc05MRy95WFE2dklCeDZadjZiTHd2bEtya1BSLzVDZnNIbWpVU0R3NFNZM3N5Mys2ZWlxQWVGM3R3R013NzhTcWxsQXNIZ0JxMmZOL0pDYWdJMXpMQXZhdWZsQlBwYVJoSWREVTQrNXVYdFRBdTdLRkxPTXB3akI3dXlOZUNQNWNscDFtdmpua0hsd1Y1MmQwS1N5RTVLd0RZV1hKU2ozK2Q2MThlR21wVEkyVVhoak1jQTJVcGZKamNJMExuVitGWnA3dUxnUUFKTWFBZTBSL25UTFZwWDBNakE1L2s4ejhFN3RneWgzaHRuckl3V01nYmdhR3BFaTEyaUFxSC92QlEyQ0VZSEE2UVMwUURYdkNqQT09In1dfQ==" } }, { "ID": "c3dfb12d7cf80318", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "163" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY05hY2stc3ViLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:21 GMT" ], "X-Amzn-Requestid": [ "b105a4df-2876-54fd-a1e3-c6e930bbfdd5" ] }, "Body": "e30=" } }, { "ID": "ae4c03ec3c468db5", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "558" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ChangeMessageVisibilityBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQmtHSmhjNERqRGQ5YkMxYUo2ZVVYdzdicDczNlB2SUkvclF6KzJZdER6bzVDVU4xNEh1UGNkUkNqT3BVRC9mR2Jpd3lBZFpHV3kvZHd0czc1MzhvRWhCaHhCRGpoUjZCL21OZFRQVUtsTTBFZnpCeVh4QmZFeWdVWGJ5VDVka0psTzJaUlhiVkx3bnRNWkNUaC9kQjlXM3B4YUxTWmt1bDRHenNTZWV1cHVmaVJ4c25MYXRiTmNaMk1RbDl3ZFVNZzljL2lDWGtqU2FPWkJNNVhDbTFCdlMwQVpIbkVqeElJMHdhSFZ2VmVmT3Y4ekNmQWRlRFBTeWx5TUJ0SnF1S285VDlhRGVUck11eHFYWG1VdlpxSE5aU0doK0EzUHVZL3dlQlh6SUJIdFFTZkk0MU1Da1dmM29ScVowcWRtTmYvWUdzME8zdHFNelFjUS8xTWpMZkNQRThLVmxUWEp5Z0orQjcrRFNlTUx6TFFpTTRxZXM3UVprWHllYnlCbFpTa1JMZld0aTZWS3RzVlFuS0tRcTlFdmc9PSIsIlZpc2liaWxpdHlUaW1lb3V0IjoxfV0sIlF1ZXVlVXJsIjoiaHR0cHM6Ly9zcXMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vNDU2NzUyNjY1NTc2L1NOU1RvcGljTmFjay1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:21 GMT" ], "X-Amzn-Requestid": [ "0a3d290e-f075-52d8-9b82-4b38e8b89bf0" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "08df83b96e2c3845", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "558" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ChangeMessageVisibilityBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQlBydzgzeTZ3NGNnS3FxQlRvQzFLR1RnODMxU0ZacmFiZ2pOVkZydWJzMDVERU55TUdPRk5RbTM4b0RUWWp0ZUZkZ2ZqTWVmL2o0MG9lQ1Q4OFRDVlgycWtpL3BydDQyY2tqd1lWT3daYjI0Q0EvOUg0Y3JjRzFHZ3dGbmZYTUM1SHdmR3NOTEcveVhRNnZJQng2WnY2Ykx3dmxLcmtQUi81Q2ZzSG1qVVNEdzRTWTNzeTMrNmVpcUFlRjN0d0dNdzc4U3FsbEFzSGdCcTJmTi9KQ2FnSTF6TEF2YXVmbEJQcGFSaElkRFU0KzV1WHRUQXU3S0ZMT01wd2pCN3V5TmVDUDVjbHAxbXZqbmtIbHdWNTJkMEtTeUU1S3dEWVdYSlNqMytkNjE4ZUdtcFRJMlVYaGpNY0EyVXBmSmpjSTBMblYrRlpwN3VMZ1FBSk1hQWUwUi9uVExWcFgwTWpBNS9rOHo4RTd0Z3loM2h0bnJJd1dNZ2JnYUdwRWkxMmlBcUgvdkJRMkNFWUhBNlFTMFFEWHZDakE9PSIsIlZpc2liaWxpdHlUaW1lb3V0IjoxfV0sIlF1ZXVlVXJsIjoiaHR0cHM6Ly9zcXMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vNDU2NzUyNjY1NTc2L1NOU1RvcGljTmFjay1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:21 GMT" ], "X-Amzn-Requestid": [ "1b8d4fbf-a03f-51b6-9aca-2d89b8f2689e" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "1546a538f080aedc", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "163" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY05hY2stc3ViLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:21 GMT" ], "X-Amzn-Requestid": [ "828da438-bc47-5719-968f-c60ea48a03a8" ] }, "Body": "e30=" } }, { "ID": "adf3880d561c3355", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "163" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY05hY2stc3ViLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:22 GMT" ], "X-Amzn-Requestid": [ "977d4de0-52ad-58f5-8e09-2fd64a631c44" ] }, "Body": "e30=" } }, { "ID": "6b0535824a68eb0f", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "163" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY05hY2stc3ViLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1786" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:22 GMT" ], "X-Amzn-Requestid": [ "8fa50613-fbfe-51ac-ba99-6425e330151d" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjIxMzUyIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIyIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMjEyNDIifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCI0MjYyMTNmNy03MGFhLTVkYmYtYTJlNS03MWMxNjg2NzhlM2FcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljTmFjay10b3AtMVwiLFxuICBcIk1lc3NhZ2VcIiA6IFwiMFwiLFxuICBcIlRpbWVzdGFtcFwiIDogXCIyMDI2LTAzLTE5VDE1OjMwOjIxLjIwN1pcIixcbiAgXCJTaWduYXR1cmVWZXJzaW9uXCIgOiBcIjFcIixcbiAgXCJTaWduYXR1cmVcIiA6IFwiRW5IUFpKaFBxKzBJWGNkQjZHMUpLd2dqUlRxYmd0M0xrcktSeFZZOWp6SlpUVjI0dFovREZTNVVrWEplQ0w1bkE4eFlBZS9xeG9YOVlYNndjTDFzUDU5aWh6MXBKMm0zRlRoeXU5WUpZZVNGZ2UyM3lHQ3B3RSsrRkQvTk56UHBRM1JzSldjcnFnYURSSEtHdUt2S0lYWm9CNFNmL0lRdnQvQ3hoL3hhZjFCeVFaeXBBU2gwVmV6REZtUEkyY1JreVVoeVpIV2o2a0FiYS9BVTRRTlZqYXExS3IyTzJ2MEJ5dHR5R25KUm5DN3NMczFTSXZpRzBVRjQ0Z0UycmVDdzEzZ2dIalhnaXV4Z0wvUmlsUGVBRHNDTnRoN3BnUVlPc0ZIS1hKZWlENW9ENkZtSEExWUhlakc2eFZXd1YvZTdhUCt4aGJFYUIyVmY5TEh0OVBnU2NRPT1cIixcbiAgXCJTaWduaW5nQ2VydFVSTFwiIDogXCJodHRwczovL3Nucy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS9TaW1wbGVOb3RpZmljYXRpb25TZXJ2aWNlLTc1MDZhMWUzNWIzNmVmNWE0NDRkZDFhOGU3Y2MzZWQ4LnBlbVwiLFxuICBcIlVuc3Vic2NyaWJlVVJMXCIgOiBcImh0dHBzOi8vc25zLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLz9BY3Rpb249VW5zdWJzY3JpYmUmU3Vic2NyaXB0aW9uQXJuPWFybjphd3M6c25zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6U05TVG9waWNOYWNrLXRvcC0xOmFjNTE3ZDVmLTZmYjYtNDQ2YS04MTExLTdmZDg2ZTNiOTQwZFwiLFxuICBcIk1lc3NhZ2VBdHRyaWJ1dGVzXCIgOiB7XG4gICAgXCJhXCIgOiB7XCJUeXBlXCI6XCJTdHJpbmdcIixcIlZhbHVlXCI6XCIwXCJ9XG4gIH1cbn0iLCJNRDVPZkJvZHkiOiJjMmRlMmQwZTA0Y2M0MzM4YzYwNjAwYWRhOWIxM2VjZiIsIk1lc3NhZ2VJZCI6Ijg2Njc4ZDhkLTI2YTctNGM5MS04MWU4LWQ4OTRjYThjNDQ0MyIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCRWNqeitMdEY3KzVBRHNUMUFvdjFuWThCUHNEbEI0OXJDT3hsSTRKQnFWVytRQk9SS0JMcjM1ajNDT3lYM3IzUUFQc3lIaFVmaE0zelhINHNNelpYeFdrdGN1aTd1ZHZaTzVndnhUdStSdnZ1RVdkRmVKZmllSW90bHZxdGIvNnJtaE04dFhKb1orQWJWU1pTcE5ISHgzQkVqSXNvb1FvSjVMRlFUdTJ1NFlrbVZEVTZncmVDTzd1T05FNzNReHBrOSszd1lENXorL21LK1pucG43ZWlwdjMyYldaTWU5dmV5S0ppM01UM2VERkt2Vk1scjBMdURsaDlhM1FqRXNKMXFLODlUeVRDM0hZMytFSGZDRlBRa1JtcFZhVGxZdjZ2UFp3a0tvbFA2R3hobjhiL3RMU1ZhemV0ckxyc1lFTkdWWjZBUndHbkNuMnBMUmQ1VWsrNUozczBadkFueitjcHljb0RQenI0eWRsWWkvamlEdDhvaEZURWFWT3Q4blMycEtQZnlFbGZHSGRTL0VCS09YdGI0QT09In1dfQ==" } }, { "ID": "4ab17d95f006ec6d", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "163" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY05hY2stc3ViLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1786" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:22 GMT" ], "X-Amzn-Requestid": [ "c169e034-66b7-5754-8fe7-82027e79e3e5" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjIxNDIwIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIyIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMjEzMDMifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCJjYmJhMDNjOS00MDdjLTUyODUtOWZjOS02MWZmNThiMTgxMDBcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljTmFjay10b3AtMVwiLFxuICBcIk1lc3NhZ2VcIiA6IFwiMVwiLFxuICBcIlRpbWVzdGFtcFwiIDogXCIyMDI2LTAzLTE5VDE1OjMwOjIxLjI4MFpcIixcbiAgXCJTaWduYXR1cmVWZXJzaW9uXCIgOiBcIjFcIixcbiAgXCJTaWduYXR1cmVcIiA6IFwiUVhiRnlld0pSMDVQSTM0NWg4V0xqYkoxR1gzSGZpWXdpZ3NjRUtBVGViUG5XejV6bXg5SEN3VHUwTEY5R1BTbmdqcm80VUFIcTRwYi84SzlJT2lmNUhvaG5DM0FERnJKdU94K2pSbEVKSFFaYjVZVWxQd1Z6bkxBd0tUVXNhTWVZdWRMdzh4UFFFVmYwNlBIU05wQ2FGVmFjSm9wWEJFUStFa1JaOENpZEdnS0dRWit1N2VEWWxHNkdFVHRVWWxqOFF1UWpKVTcvOHZJQWNVdmwzaEl2L2Q4Wk5sRFBvOHplVGJUV2wvdzhwQUtZK28wRC9wOEkyUHo1OUlWdndtQ0FMRzRyODJtcENTQ0FranQ1RlJMa2pnS25neSs5ak5qZGgvVHV1eFJiNUxrdXBqd3h5MHRoT01mWE95a3NpSytPRUE4aTRnQS92T241Nzl5RUNGOERRPT1cIixcbiAgXCJTaWduaW5nQ2VydFVSTFwiIDogXCJodHRwczovL3Nucy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS9TaW1wbGVOb3RpZmljYXRpb25TZXJ2aWNlLTc1MDZhMWUzNWIzNmVmNWE0NDRkZDFhOGU3Y2MzZWQ4LnBlbVwiLFxuICBcIlVuc3Vic2NyaWJlVVJMXCIgOiBcImh0dHBzOi8vc25zLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLz9BY3Rpb249VW5zdWJzY3JpYmUmU3Vic2NyaXB0aW9uQXJuPWFybjphd3M6c25zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6U05TVG9waWNOYWNrLXRvcC0xOmFjNTE3ZDVmLTZmYjYtNDQ2YS04MTExLTdmZDg2ZTNiOTQwZFwiLFxuICBcIk1lc3NhZ2VBdHRyaWJ1dGVzXCIgOiB7XG4gICAgXCJhXCIgOiB7XCJUeXBlXCI6XCJTdHJpbmdcIixcIlZhbHVlXCI6XCIxXCJ9XG4gIH1cbn0iLCJNRDVPZkJvZHkiOiJjOTkwODM2OGFiOGU4ZTczZDRlYTM0NWNkOTllYzRlNiIsIk1lc3NhZ2VJZCI6IjFjY2MyZWE5LTU0MmEtNDMwMS1iYTZhLTk5OTI3MTIwMmNiMCIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCZnkwY3hrM0laVnZTSHQvOXN5MkpNODMycDhMWjZJZDArNlNFb0V3UUpLYkhDS250YlRSRTBiRGpwbWNud2JTZjM3bTJVSDYyNEhsSnAvU3hLMHFCSFBqMVFkejRZbFNOUkdRekp1Q0V5SDNJdS9xNWVvcDdjMjQrRjlienVCSXJ6NGFqSnNVVmhXYXBEalBqRDJFNWJqSSt2T1I2TEY1aExoYzBHeXQ1Uis0bStFbENHa2R4QmxJdkVVVnlQdmdkK0dxTmxDYlkxY05BeENrY1M5SmVjdkJIby9aUXV2UlQvSzdGdFdOY0ZYZEk4RS9SQlVNS2tiZDJoVzRGZGllMlFYeFFnR29YeVZtcGJJbjVySjhLd29sMzJkU1JXelRTNWlUTnM1eUZpM29HcjV5UFpIVy9USi8wb3ZFT2tPZElhbHk4MzluWVI0NmMvbW95ZG1qb3lrNU9RQWFEQ08vYXhKNDJXdENyZGtGNTV2eUs5aFo3MU1TQWUzbWlGbEQxRDdvYklaeE9ORWdoejNScWZTNnZnUT09In1dfQ==" } }, { "ID": "fb00b86bf3985343", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "536" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQkVjanorTHRGNys1QURzVDFBb3Yxblk4QlBzRGxCNDlyQ094bEk0SkJxVlcrUUJPUktCTHIzNWozQ095WDNyM1FBUHN5SGhVZmhNM3pYSDRzTXpaWHhXa3RjdWk3dWR2Wk81Z3Z4VHUrUnZ2dUVXZEZlSmZpZUlvdGx2cXRiLzZybWhNOHRYSm9aK0FiVlNaU3BOSEh4M0JFaklzb29Rb0o1TEZRVHUydTRZa21WRFU2Z3JlQ083dU9ORTczUXhwazkrM3dZRDV6Ky9tSytabnBuN2VpcHYzMmJXWk1lOXZleUtKaTNNVDNlREZLdlZNbHIwTHVEbGg5YTNRakVzSjFxSzg5VHlUQzNIWTMrRUhmQ0ZQUWtSbXBWYVRsWXY2dlBad2tLb2xQNkd4aG44Yi90TFNWYXpldHJMcnNZRU5HVlo2QVJ3R25DbjJwTFJkNVVrKzVKM3MwWnZBbnorY3B5Y29EUHpyNHlkbFlpL2ppRHQ4b2hGVEVhVk90OG5TMnBLUGZ5RWxmR0hkUy9FQktPWHRiNEE9PSJ9XSwiUXVldWVVcmwiOiJodHRwczovL3Nxcy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS80NTY3NTI2NjU1NzYvU05TVG9waWNOYWNrLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:22 GMT" ], "X-Amzn-Requestid": [ "4ae6c7b1-2ef4-5114-83a1-a587363ab83c" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "b3028de0e5e1c44a", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "536" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQmZ5MGN4azNJWlZ2U0h0LzlzeTJKTTgzMnA4TFo2SWQwKzZTRW9Fd1FKS2JIQ0tudGJUUkUwYkRqcG1jbndiU2YzN20yVUg2MjRIbEpwL1N4SzBxQkhQajFRZHo0WWxTTlJHUXpKdUNFeUgzSXUvcTVlb3A3YzI0K0Y5Ynp1QklyejRhakpzVVZoV2FwRGpQakQyRTViakkrdk9SNkxGNWhMaGMwR3l0NVIrNG0rRWxDR2tkeEJsSXZFVVZ5UHZnZCtHcU5sQ2JZMWNOQXhDa2NTOUplY3ZCSG8vWlF1dlJUL0s3RnRXTmNGWGRJOEUvUkJVTUtrYmQyaFc0RmRpZTJRWHhRZ0dvWHlWbXBiSW41cko4S3dvbDMyZFNSV3pUUzVpVE5zNXlGaTNvR3I1eVBaSFcvVEovMG92RU9rT2RJYWx5ODM5bllSNDZjL21veWRtam95azVPUUFhRENPL2F4SjQyV3RDcmRrRjU1dnlLOWhaNzFNU0FlM21pRmxEMUQ3b2JJWnhPTkVnaHozUnFmUzZ2Z1E9PSJ9XSwiUXVldWVVcmwiOiJodHRwczovL3Nxcy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS80NTY3NTI2NjU1NzYvU05TVG9waWNOYWNrLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:22 GMT" ], "X-Amzn-Requestid": [ "4bd14180-3c84-5e65-8788-23b6244a4ad4" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "e01f7da408595173", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "156" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY05hY2stdG9wLTElM0FhYzUxN2Q1Zi02ZmI2LTQ0NmEtODExMS03ZmQ4NmUzYjk0MGQmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:22 GMT" ], "X-Amzn-Requestid": [ "23270ffe-ac76-5d50-83fe-6dc8b4b8ded5" ] }, "Body": "PFVuc3Vic2NyaWJlUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD4yMzI3MGZmZS1hYzc2LTVkNTAtODNmZS02ZGM4YjRiOGRlZDU8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvVW5zdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "c0d9f6c7f7bd3d74", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "82" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY05hY2stc3ViLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:23 GMT" ], "X-Amzn-Requestid": [ "e241f169-fb55-58ca-b354-935fe39bec7b" ] }, "Body": "" } }, { "ID": "c3d53aeedf1f6b05", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "110" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPURlbGV0ZVRvcGljJlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQVNOU1RvcGljTmFjay10b3AtMSZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:23 GMT" ], "X-Amzn-Requestid": [ "4c9132ad-e6a1-5082-960e-509bfe6eb307" ] }, "Body": "PERlbGV0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD40YzkxMzJhZC1lNmExLTUwODItOTYwZS01MDliZmU2ZWIzMDc8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvRGVsZXRlVG9waWNSZXNwb25zZT4K" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSNSTopic/TestNonExistentSubscriptionSucceedsOnOpenButFailsOnReceive.replay ================================================ { "Initial": "AQAAAA7hTg2XDWg59wAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "77b8479a3062b5e8", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "165" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vdXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vNDU2NzUyNjY1NTc2L25vbmV4aXN0ZW50LXN1YnNjcmlwdGlvbiJ9" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "96" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:31 GMT" ], "X-Amzn-Query-Error": [ "AWS.SimpleQueueService.NonExistentQueue;Sender" ], "X-Amzn-Requestid": [ "ea15933b-fedc-5c35-b802-f10de60b6745" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLnNxcyNRdWV1ZURvZXNOb3RFeGlzdCIsIm1lc3NhZ2UiOiJUaGUgc3BlY2lmaWVkIHF1ZXVlIGRvZXMgbm90IGV4aXN0LiJ9" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSNSTopic/TestNonExistentTopicSucceedsOnOpenButFailsOnSend.replay ================================================ { "Initial": "AQAAAA7hTg2WODQnpAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "b7218e4ac58d12a7", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "195" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9JlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQW5vbmV4aXN0ZW50dG9waWMmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "259" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:31 GMT" ], "X-Amzn-Requestid": [ "0d44054a-11cf-5e49-9d46-677c091883e2" ] }, "Body": "PEVycm9yUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxFcnJvcj4KICAgIDxUeXBlPlNlbmRlcjwvVHlwZT4KICAgIDxDb2RlPk5vdEZvdW5kPC9Db2RlPgogICAgPE1lc3NhZ2U+VG9waWMgZG9lcyBub3QgZXhpc3Q8L01lc3NhZ2U+CiAgPC9FcnJvcj4KICA8UmVxdWVzdElkPjBkNDQwNTRhLTExY2YtNWU0OS05ZDQ2LTY3N2MwOTE4ODNlMjwvUmVxdWVzdElkPgo8L0Vycm9yUmVzcG9uc2U+Cg==" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSNSTopic/TestNonUTF8MessageBody.replay ================================================ { "Initial": "AQAAAA7hTg2IBmOzGgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "542ac56408e73b92", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "75" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPUNyZWF0ZVRvcGljJk5hbWU9U05TVG9waWNOb25VVEY4TWVzc2FnZUJvZHktdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "339" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:16 GMT" ], "X-Amzn-Requestid": [ "856ed4dd-7c61-534a-b75e-b6eb64a9aba2" ] }, "Body": "PENyZWF0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxDcmVhdGVUb3BpY1Jlc3VsdD4KICAgIDxUb3BpY0Fybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljTm9uVVRGOE1lc3NhZ2VCb2R5LXRvcC0xPC9Ub3BpY0Fybj4KICA8L0NyZWF0ZVRvcGljUmVzdWx0PgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD44NTZlZDRkZC03YzYxLTUzNGEtYjc1ZS1iNmViNjRhOWFiYTI8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvQ3JlYXRlVG9waWNSZXNwb25zZT4K" } }, { "ID": "b7c41345da52887c", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "48" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTTlNUb3BpY05vblVURjhNZXNzYWdlQm9keS1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "96" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:17 GMT" ], "X-Amzn-Requestid": [ "6da09e16-5d2d-59f3-b203-fc2045e4747c" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY05vblVURjhNZXNzYWdlQm9keS1zdWItMSJ9" } }, { "ID": "75960f0509298409", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "126" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY05vblVURjhNZXNzYWdlQm9keS1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "97" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:17 GMT" ], "X-Amzn-Requestid": [ "889416dd-dd02-58dd-b6dc-74ebc5cbe552" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY05vblVURjhNZXNzYWdlQm9keS1zdWItMSJ9fQ==" } }, { "ID": "7d946ff1f8ec0036", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "478" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljTm9uVVRGOE1lc3NhZ2VCb2R5LXN1Yi0xXCJcblx0XHR9XG5cdFx0XVxuXHRcdH0ifSwiUXVldWVVcmwiOiJodHRwczovL3Nxcy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS80NTY3NTI2NjU1NzYvU05TVG9waWNOb25VVEY4TWVzc2FnZUJvZHktc3ViLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:17 GMT" ], "X-Amzn-Requestid": [ "d78855b9-7628-5021-8771-378f6ee1ddae" ] }, "Body": "" } }, { "ID": "17a8e4cd04d75264", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "222" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVN1YnNjcmliZSZFbmRwb2ludD1hcm4lM0Fhd3MlM0FzcXMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY05vblVURjhNZXNzYWdlQm9keS1zdWItMSZQcm90b2NvbD1zcXMmVG9waWNBcm49YXJuJTNBYXdzJTNBc25zJTNBdXMtZWFzdC0yJTNBNDU2NzUyNjY1NTc2JTNBU05TVG9waWNOb25VVEY4TWVzc2FnZUJvZHktdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "382" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:17 GMT" ], "X-Amzn-Requestid": [ "bf0d45e3-5a47-5952-af0b-27d5428e71ba" ] }, "Body": "PFN1YnNjcmliZVJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8U3Vic2NyaWJlUmVzdWx0PgogICAgPFN1YnNjcmlwdGlvbkFybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljTm9uVVRGOE1lc3NhZ2VCb2R5LXRvcC0xOjMzY2FiN2Q3LTQwYTEtNGE5OC1hOTU5LTM2OTQwOWZiZjdiMTwvU3Vic2NyaXB0aW9uQXJuPgogIDwvU3Vic2NyaWJlUmVzdWx0PgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD5iZjBkNDVlMy01YTQ3LTU5NTItYWYwYi0yN2Q1NDI4ZTcxYmE8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvU3Vic2NyaWJlUmVzcG9uc2U+Cg==" } }, { "ID": "03914a06cdcb9453", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "747" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9QUFFQ0F3UUZCZ2NJQ1FvTERBME9EeEFSRWhNVUZSWVhHQmthR3h3ZEhoOGdJU0lqSkNVbUp5Z3BLaXNzTFM0dk9qczhQVDQlMkZRRnRjWFY1ZllIdDhmWDUlMkZabTl2WEdKaGNseGlZWG91TGx4bWIyOWNMaTVjWW1GeVhDNHVYQzR1WEdKaGVpNHVYQzR1TDJadmJ5OHVMaTlpWVhJdkxpNHZMaTR2WW1GNkxpNHZabTl2TDJKaGNpOWlZWHBtYjI4aVltRnlJbUpoZWk0dVhHWnZiMXhjWW1GeVhGeGNZbUY2Wm05dkx5OWlZWEl2THk5aVlYcG1iMjhnWW1GeUlHSmhlakV5TXpRMTRwaTY0cGk2NHBpNnZiSSUzRCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5DTEVBUkVE" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:17 GMT" ], "X-Amzn-Requestid": [ "c98cf159-3251-55e7-9815-936f2a98cd0f" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPmIxNWRlMjM3LTUxYWEtNTI0Yi05ZjVjLTgwMDE0OTYzYmFhMzwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPmM5OGNmMTU5LTMyNTEtNTVlNy05ODE1LTkzNmYyYTk4Y2QwZjwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "44e31cbbd43b0ce4", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "177" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY05vblVURjhNZXNzYWdlQm9keS1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2128" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:17 GMT" ], "X-Amzn-Requestid": [ "a7c76d48-205f-5c53-82af-0f7e3896b1dc" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjE3NjQwIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMTc1OTIifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCJiMTVkZTIzNy01MWFhLTUyNGItOWY1Yy04MDAxNDk2M2JhYTNcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljTm9uVVRGOE1lc3NhZ2VCb2R5LXRvcC0xXCIsXG4gIFwiTWVzc2FnZVwiIDogXCJBQUVDQXdRRkJnY0lDUW9MREEwT0R4QVJFaE1VRlJZWEdCa2FHeHdkSGg4Z0lTSWpKQ1VtSnlncEtpc3NMUzR2T2pzOFBUNC9RRnRjWFY1ZllIdDhmWDUvWm05dlhHSmhjbHhpWVhvdUxseG1iMjljTGk1Y1ltRnlYQzR1WEM0dVhHSmhlaTR1WEM0dUwyWnZieTh1TGk5aVlYSXZMaTR2TGk0dlltRjZMaTR2Wm05dkwySmhjaTlpWVhwbWIyOGlZbUZ5SW1KaGVpNHVYR1p2YjF4Y1ltRnlYRnhjWW1GNlptOXZMeTlpWVhJdkx5OWlZWHBtYjI4Z1ltRnlJR0poZWpFeU16UTE0cGk2NHBpNjRwaTZ2Ykk9XCIsXG4gIFwiVGltZXN0YW1wXCIgOiBcIjIwMjYtMDMtMTlUMTU6MzA6MTcuNTYyWlwiLFxuICBcIlNpZ25hdHVyZVZlcnNpb25cIiA6IFwiMVwiLFxuICBcIlNpZ25hdHVyZVwiIDogXCJvRTVQRHNsYmFnZUozakRINmE4MjB3T2p5bGNZdzlndXFENkdDSHhsSHNCa09LK0t5U0xDVzBiQ2hWVVJnSEs4Mm0zanlRK1Bzd0QzQXhtZ09KNmkvL29wK0JLSzdxcGl0M1h3SlBONnltMWVqeGpBc0RjUldXUjJvTHJOWm9qSHJHMWRtdytZNXBveVBTaEVHdXNVWGRrZ09Ha2hhaVZMY0tINlRDWUg2b3plOG1qMTlWaGJUZEg4RGlRaUVjWW1lamF6UHRvU05hcW5GT2RLaTE0N3B1RzlwTjdpVUFEbEJXZWFxSHUzTVFkR1lYM1ZILzJtUWxTcjZZK0VGbGh3S1lKdXhOU1FLNEVkdnptMWtKTmZheEtXNW9FQ2JKaWc5WDFSNWN4eFZheDJCcjBZMUtZSmpGTm5UV0JpWXdYam56eE5ZWWdjVWI2c2NHSGp6UTAzVEE9PVwiLFxuICBcIlNpZ25pbmdDZXJ0VVJMXCIgOiBcImh0dHBzOi8vc25zLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tL1NpbXBsZU5vdGlmaWNhdGlvblNlcnZpY2UtNzUwNmExZTM1YjM2ZWY1YTQ0NGRkMWE4ZTdjYzNlZDgucGVtXCIsXG4gIFwiVW5zdWJzY3JpYmVVUkxcIiA6IFwiaHR0cHM6Ly9zbnMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vP0FjdGlvbj1VbnN1YnNjcmliZSZTdWJzY3JpcHRpb25Bcm49YXJuOmF3czpzbnM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY05vblVURjhNZXNzYWdlQm9keS10b3AtMTozM2NhYjdkNy00MGExLTRhOTgtYTk1OS0zNjk0MDlmYmY3YjFcIixcbiAgXCJNZXNzYWdlQXR0cmlidXRlc1wiIDoge1xuICAgIFwiYmFzZTY0ZW5jb2RlZFwiIDoge1wiVHlwZVwiOlwiU3RyaW5nXCIsXCJWYWx1ZVwiOlwidHJ1ZVwifVxuICB9XG59IiwiTUQ1T2ZCb2R5IjoiODU3Y2Q2YzA0MzgxOWUxNDdlMzg1NDRhMzRiZWFlZjMiLCJNZXNzYWdlSWQiOiJiYzYxM2U3MC1iYzhjLTQ2MjgtODFjOS0wYjY5NTU3ODA0YTUiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQldGaFNYTFg4M2ZxVkhwbG83Y1pjZldVbVJHeWVMdWx6Y0xLbm9SZFgweTcxSEYwMXUxZ09yaVZiTjJSUmRlcTBleWR1aVlWTnhKRlI3SFZnUUtqMS94V3QxYnk1bEdVazZCaFoyTkFLb1hmTGlSUm9MTHFRM01WWjE2UzMvdDJQd2tKR29oWHVDVWloU3JINkdVL0JUVUNMU3g5dlV3aFRqLzVBM2h6bWQ1cVBySVd0RlNqZ1h4REJQdzNHY29udHBVQ1FZc1lPZlZlSWZEWENJMDdyRW9qNDBEQWhhY3VRQmNucExxazhnUEl2R1ptSHdhMVlSQWxwalUwNnEyb0I2SlhKL0RuTmo1ckRRVkh4V1FEYVF2dVJ5N2tRVWpmZlo5dW1zWVI1N2ZLRmt0UzZVSEYzVWdTU1A3OUQwMUVTRkRQU0JLZFNEYlc0UlVnM3p6TFpsT1lvZHRMOVBreitsR3FDRFpET2c5V0d6MjJ3cWFPS2RLbTlpeXdoQTdZajRRSndqV0RFTm51Wkp3UUVHVnBRVDM1bEVIREhjVlQ2OExQZVRScXArckU9In1dfQ==" } }, { "ID": "7333e340fce595dd", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "570" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQldGaFNYTFg4M2ZxVkhwbG83Y1pjZldVbVJHeWVMdWx6Y0xLbm9SZFgweTcxSEYwMXUxZ09yaVZiTjJSUmRlcTBleWR1aVlWTnhKRlI3SFZnUUtqMS94V3QxYnk1bEdVazZCaFoyTkFLb1hmTGlSUm9MTHFRM01WWjE2UzMvdDJQd2tKR29oWHVDVWloU3JINkdVL0JUVUNMU3g5dlV3aFRqLzVBM2h6bWQ1cVBySVd0RlNqZ1h4REJQdzNHY29udHBVQ1FZc1lPZlZlSWZEWENJMDdyRW9qNDBEQWhhY3VRQmNucExxazhnUEl2R1ptSHdhMVlSQWxwalUwNnEyb0I2SlhKL0RuTmo1ckRRVkh4V1FEYVF2dVJ5N2tRVWpmZlo5dW1zWVI1N2ZLRmt0UzZVSEYzVWdTU1A3OUQwMUVTRkRQU0JLZFNEYlc0UlVnM3p6TFpsT1lvZHRMOVBreitsR3FDRFpET2c5V0d6MjJ3cWFPS2RLbTlpeXdoQTdZajRRSndqV0RFTm51Wkp3UUVHVnBRVDM1bEVIREhjVlQ2OExQZVRScXArckU9In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY05vblVURjhNZXNzYWdlQm9keS1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:17 GMT" ], "X-Amzn-Requestid": [ "7b95edcc-23dd-5dc3-9b91-8ffa3b14204c" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "fdb55c81fb179496", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "170" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY05vblVURjhNZXNzYWdlQm9keS10b3AtMSUzQTMzY2FiN2Q3LTQwYTEtNGE5OC1hOTU5LTM2OTQwOWZiZjdiMSZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:17 GMT" ], "X-Amzn-Requestid": [ "304b8f1c-1157-5610-8c95-ed2a099e9ef8" ] }, "Body": "PFVuc3Vic2NyaWJlUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD4zMDRiOGYxYy0xMTU3LTU2MTAtOGM5NS1lZDJhMDk5ZTllZjg8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvVW5zdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "bd5d211b8bcc1ded", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "96" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY05vblVURjhNZXNzYWdlQm9keS1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:17 GMT" ], "X-Amzn-Requestid": [ "1d1012b3-cf1b-5820-b46f-7085d7d295af" ] }, "Body": "" } }, { "ID": "a120b643f01ba941", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "124" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPURlbGV0ZVRvcGljJlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQVNOU1RvcGljTm9uVVRGOE1lc3NhZ2VCb2R5LXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:18 GMT" ], "X-Amzn-Requestid": [ "b283afb3-de61-5761-9efc-cd85c6ab8f89" ] }, "Body": "PERlbGV0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD5iMjgzYWZiMy1kZTYxLTU3NjEtOWVmYy1jZDg1YzZhYjhmODk8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvRGVsZXRlVG9waWNSZXNwb25zZT4K" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSNSTopic/TestSendReceive.replay ================================================ { "Initial": "AQAAAA7hTg2KCLMU6gAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "ba0dcf67a85355f3", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "68" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPUNyZWF0ZVRvcGljJk5hbWU9U05TVG9waWNTZW5kUmVjZWl2ZS10b3AtMSZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "332" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:18 GMT" ], "X-Amzn-Requestid": [ "62bff471-9268-5a71-a7ff-96478aa2e1d2" ] }, "Body": "PENyZWF0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxDcmVhdGVUb3BpY1Jlc3VsdD4KICAgIDxUb3BpY0Fybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljU2VuZFJlY2VpdmUtdG9wLTE8L1RvcGljQXJuPgogIDwvQ3JlYXRlVG9waWNSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjYyYmZmNDcxLTkyNjgtNWE3MS1hN2ZmLTk2NDc4YWEyZTFkMjwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9DcmVhdGVUb3BpY1Jlc3BvbnNlPgo=" } }, { "ID": "5b36751ac4517970", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "41" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTTlNUb3BpY1NlbmRSZWNlaXZlLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "89" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:18 GMT" ], "X-Amzn-Requestid": [ "e4f9b3f9-efee-568b-8576-d1cff724f1c2" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlLXN1Yi0xIn0=" } }, { "ID": "6d849e9c5941419a", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "119" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "90" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:18 GMT" ], "X-Amzn-Requestid": [ "f1789df3-810d-5939-8a73-ffc599c71e70" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY1NlbmRSZWNlaXZlLXN1Yi0xIn19" } }, { "ID": "f424b153e43105f5", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "464" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljU2VuZFJlY2VpdmUtc3ViLTFcIlxuXHRcdH1cblx0XHRdXG5cdFx0fSJ9LCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:18 GMT" ], "X-Amzn-Requestid": [ "fc64a2ce-b199-5e7f-80f0-c0f8a9532936" ] }, "Body": "" } }, { "ID": "de255d15366d5fb3", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "208" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVN1YnNjcmliZSZFbmRwb2ludD1hcm4lM0Fhd3MlM0FzcXMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1NlbmRSZWNlaXZlLXN1Yi0xJlByb3RvY29sPXNxcyZUb3BpY0Fybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1NlbmRSZWNlaXZlLXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "375" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:19 GMT" ], "X-Amzn-Requestid": [ "242a8587-9029-566e-a451-e7b188e38dcd" ] }, "Body": "PFN1YnNjcmliZVJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8U3Vic2NyaWJlUmVzdWx0PgogICAgPFN1YnNjcmlwdGlvbkFybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljU2VuZFJlY2VpdmUtdG9wLTE6NWVkM2QwZTYtNTY4ZS00ODAzLTllMGUtNjE5M2Q4YmE1ODY3PC9TdWJzY3JpcHRpb25Bcm4+CiAgPC9TdWJzY3JpYmVSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjI0MmE4NTg3LTkwMjktNTY2ZS1hNDUxLWU3YjE4OGUzOGRjZDwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9TdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "efc3c6a7982ce832", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "440" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9MCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5DTEVBUkVE" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:19 GMT" ], "X-Amzn-Requestid": [ "a037e80c-5a60-5f81-832e-8a3a42aba422" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPmMyZDUzZmQ4LTg2YWYtNTdmZi1hYWUyLTVkZWU5ZTY0OGM1YzwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPmEwMzdlODBjLTVhNjAtNWY4MS04MzJlLThhM2E0MmFiYTQyMjwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "59953c7ce935d785", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "440" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9MSZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5DTEVBUkVE" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:19 GMT" ], "X-Amzn-Requestid": [ "fddbf8ea-67af-5e66-bd2c-9adc7f6415c5" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPmI2ZmUyN2EyLTJlMDgtNTcxZi04YmZiLTQ1OTQzNmMzY2NiYzwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPmZkZGJmOGVhLTY3YWYtNWU2Ni1iZDJjLTlhZGM3ZjY0MTVjNTwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "7d8f0863bb301378", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "440" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9MiZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5DTEVBUkVE" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:19 GMT" ], "X-Amzn-Requestid": [ "5c8d4d5d-8d75-5f98-8eaa-2f6b95be043b" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPjZlMzgwM2FmLWUxZWItNWY5MC1iZDE1LTYxOTlmOTIwMTQzMzwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjVjOGQ0ZDVkLThkNzUtNWY5OC04ZWFhLTJmNmI5NWJlMDQzYjwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "df34ba90d28afc5e", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "170" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1820" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:19 GMT" ], "X-Amzn-Requestid": [ "7a1f09a4-caa0-5144-a1e8-6b92d26b360d" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjE5MzkzIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMTkzNDcifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCI2ZTM4MDNhZi1lMWViLTVmOTAtYmQxNS02MTk5ZjkyMDE0MzNcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljU2VuZFJlY2VpdmUtdG9wLTFcIixcbiAgXCJNZXNzYWdlXCIgOiBcIjJcIixcbiAgXCJUaW1lc3RhbXBcIiA6IFwiMjAyNi0wMy0xOVQxNTozMDoxOS4zMjFaXCIsXG4gIFwiU2lnbmF0dXJlVmVyc2lvblwiIDogXCIxXCIsXG4gIFwiU2lnbmF0dXJlXCIgOiBcIklCWndIRlpsQXNpdW9EUDREMjM0UXBJUG9KckdUdDh4ZGhLT0lCaW52cVptNWNwOC9HaUlDMHdIUmJDYStodjhxWktkU0ZVbm1SZlhIR1lSL0FPcW9DNVpZMHJXd0VUK2RqRkFpNzk4OE81aG56cmFnTGJkSVUyaStwNE0xM1hSS0hKcmMxV1BMbmxNWmYzMmI5WlV4MFV4NkdET0ZWNkZqb1YzMjlheW1VZUZsMmFCMDAxNVJ6SzZIMlVrekFtdC9lUWtiVjNGa2pqRHFwQWErY1pTcmVHcVlRaXpXNXlmdTNNMFlHNnlTRjQvRGdPdCtLZWk0Wncrc0o1ZGxmWVAxQzlSSUsrS2FHRDcxdzYrUWFhdzBNYll0OWJBMEk5Y1B2TGwzUmdsVFBvNUMvQlZVQUJpTDlseXZzZ3J0ZjBwZHFONHkxY2ZJTm1waUdSR0RkQjd3Zz09XCIsXG4gIFwiU2lnbmluZ0NlcnRVUkxcIiA6IFwiaHR0cHM6Ly9zbnMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vU2ltcGxlTm90aWZpY2F0aW9uU2VydmljZS03NTA2YTFlMzViMzZlZjVhNDQ0ZGQxYThlN2NjM2VkOC5wZW1cIixcbiAgXCJVbnN1YnNjcmliZVVSTFwiIDogXCJodHRwczovL3Nucy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS8/QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljU2VuZFJlY2VpdmUtdG9wLTE6NWVkM2QwZTYtNTY4ZS00ODAzLTllMGUtNjE5M2Q4YmE1ODY3XCIsXG4gIFwiTWVzc2FnZUF0dHJpYnV0ZXNcIiA6IHtcbiAgICBcImFcIiA6IHtcIlR5cGVcIjpcIlN0cmluZ1wiLFwiVmFsdWVcIjpcIjJcIn1cbiAgfVxufSIsIk1ENU9mQm9keSI6IjlhNWRjNDcwZWY5MTI2NjZiZDY3Zjg1MmU5NWIxMjljIiwiTWVzc2FnZUlkIjoiODcyNTMxMDItYmI0My00YmIyLWIxMDctZTc2NTI0MDlkOGU1IiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJLMXZiMGhaNkdMeEx3dXQyR3ZtSStWcnBCaGJDWFQ2ZWw3Q05XT28wSGlPdGxxY2pqa0JjQkdXVEhLNHZjL0M1NmxzZEtqOVd3anU2ckk2eHpydGU4UlRDcHo0UDZic1c0blFlNGVrK3BXYWU2akpsMTIwZU9tTFlnK3dyb1Y0T0dwMzM5QURobzNYVk16MEVhOGhxMXVwRHJLVmI1NklJOVVURTBMNFVZOStHMW9vUmRNdmR1cmFxYXFFSzZqWWZyN1JDdEh5eXN2SFJGSVhmSlEyZnZVSUdUSEk0WjZDdGJBdGhhL0FrZDlCL1JudnF4VHJwb3ZKMlMzTlZ5Nkp0SjYyTDZUbmxCb0JKcUtNdDZhczNrWGVkWHAxRzFKYk15YTZJTWFkK1JPeVpDUHBsNGRldVFGVWtwQ1FGU0pMSnpKMWZqOS9tV3lzVzdKNzNkSGxyUWlFMm1yeVBGQVRHS3h1VVZOZ1NST3ZuVm5uYlB0VlJ4eXhiWE5QdEtlK3Nsam9ObkdpZFVRSXlKTVhQcXVFMXlEYXM0VUVLZHJQV3NpTktTMk5ha3BFPSJ9XX0=" } }, { "ID": "46213374434da905", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "170" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1820" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:19 GMT" ], "X-Amzn-Requestid": [ "5fe0d6c5-561b-56e8-8e2b-b4f34ed0f1a1" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjE5NDY2IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMTkyNzgifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCJiNmZlMjdhMi0yZTA4LTU3MWYtOGJmYi00NTk0MzZjM2NjYmNcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljU2VuZFJlY2VpdmUtdG9wLTFcIixcbiAgXCJNZXNzYWdlXCIgOiBcIjFcIixcbiAgXCJUaW1lc3RhbXBcIiA6IFwiMjAyNi0wMy0xOVQxNTozMDoxOS4yNDlaXCIsXG4gIFwiU2lnbmF0dXJlVmVyc2lvblwiIDogXCIxXCIsXG4gIFwiU2lnbmF0dXJlXCIgOiBcIk9TN0R1eFBFdDl4aUY0bE8wbStUWDRqNmRjRnZzWFpmUXBWRndqNkxLMTYxMnhycU94SnlyczUrc2lHZWtoWWtsTnowNDJpQVJGK3RiSmtDbmErak16MmRFTXZHb2JIS1J1QmgrYnZIbXR4Q05pWWZ2Rm5BNU5GWUtlUGN5SVZkTG4wMmhuZ3pqR09UN21MZmFKanZrc2o4SHpibWVyWS9XalR3Q05MSWJJNHhXN0xmK1prT3RLSGd5LzAwbU95MHY1SDFsWmd1dU5manRtN3MxQWtBenhCWlU5VGhRT1Q4c1RLa2FWdE1nOWpoTGlNRXA3bHNKa1dDMjZYcCs1MXljNUlndUYxckNabDRDMmkwOVEvYWRsZzJkZnJLWDJtc3pSaEhLeisrbE9Sc3NRdEZZamREVzN2R0xjKzM0V2J1M2JZM1B1aGNUNGczckpQaUx4N1paQT09XCIsXG4gIFwiU2lnbmluZ0NlcnRVUkxcIiA6IFwiaHR0cHM6Ly9zbnMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vU2ltcGxlTm90aWZpY2F0aW9uU2VydmljZS03NTA2YTFlMzViMzZlZjVhNDQ0ZGQxYThlN2NjM2VkOC5wZW1cIixcbiAgXCJVbnN1YnNjcmliZVVSTFwiIDogXCJodHRwczovL3Nucy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS8/QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljU2VuZFJlY2VpdmUtdG9wLTE6NWVkM2QwZTYtNTY4ZS00ODAzLTllMGUtNjE5M2Q4YmE1ODY3XCIsXG4gIFwiTWVzc2FnZUF0dHJpYnV0ZXNcIiA6IHtcbiAgICBcImFcIiA6IHtcIlR5cGVcIjpcIlN0cmluZ1wiLFwiVmFsdWVcIjpcIjFcIn1cbiAgfVxufSIsIk1ENU9mQm9keSI6IjI2ZDQyMjNlZGNjMDM1YTNjYzdhZTg0Yzg3MDk3NmQ3IiwiTWVzc2FnZUlkIjoiYTFlMjMyZTAtNTg1ZC00NjgwLWEyMDEtNDBkMTBmYmJkMGFhIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJFb1FQaFBTZ0lXa2N0UmJOZ2w3ZWU4WGphTWJGdXVSNmFYWlpEb0ticGxJa1B1dWYxM0IwdGIwT1hqT3JNcFhzQzAxWW9jRi9aVWpmZXVUblFhL2YyNHd1M0FZbXRYWXJuM044UU8zcnk5djVnQmF5WDduRi9mVjNBUDF6aWpwdUZOOEY4cGFTMlo4d2lPMi9HbGdqVXdOMVJiY0k4MWhYYzNiVWVxQUVoRytBczBmN1prRWxjUFVwU0FaaUJ1eitheVR1eFpuZGdrZmd1UGpqNGl4SVIyZGp4TDhyT3VWQVJ1aHNKM0ZQQVhORG1xcE9hNTVBYnRSUlUxOG5hTU9hS3Y2NmQ5MXpvOWJEUEV1UThpbWNPY2lSUHJNbXc5emJPajZXaloxejhIS2NVZk1mRXhTdnpXNVVHR0FzSVRMcFFQQ2VsZE11YW96STRHTHdRbVYxWGlrSENuNG56NnFVV3RZblRCRlp0a2UyeE9SVmpFcUZKZEI0ZDYyWUQxWFBneHJzL3FFa0h4RXdxY0wzMlE1WmNRNnlPQVN4b0dLS0dVMytuanFvUkdJPSJ9XX0=" } }, { "ID": "da58e9655a707da9", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "563" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQksxdmIwaFo2R0x4THd1dDJHdm1JK1ZycEJoYkNYVDZlbDdDTldPbzBIaU90bHFjamprQmNCR1dUSEs0dmMvQzU2bHNkS2o5V3dqdTZySTZ4enJ0ZThSVENwejRQNmJzVzRuUWU0ZWsrcFdhZTZqSmwxMjBlT21MWWcrd3JvVjRPR3AzMzlBRGhvM1hWTXowRWE4aHExdXBEcktWYjU2SUk5VVRFMEw0VVk5K0cxb29SZE12ZHVyYXFhcUVLNmpZZnI3UkN0SHl5c3ZIUkZJWGZKUTJmdlVJR1RISTRaNkN0YkF0aGEvQWtkOUIvUm52cXhUcnBvdkoyUzNOVnk2SnRKNjJMNlRubEJvQkpxS010NmFzM2tYZWRYcDFHMUpiTXlhNklNYWQrUk95WkNQcGw0ZGV1UUZVa3BDUUZTSkxKekoxZmo5L21XeXNXN0o3M2RIbHJRaUUybXJ5UEZBVEdLeHVVVk5nU1JPdm5Wbm5iUHRWUnh5eGJYTlB0S2Urc2xqb05uR2lkVVFJeUpNWFBxdUUxeURhczRVRUtkclBXc2lOS1MyTmFrcEU9In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:19 GMT" ], "X-Amzn-Requestid": [ "501cb789-63ee-593f-9dc1-d5bf7b250e76" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "7249b9bf27b20f31", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "170" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1820" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:19 GMT" ], "X-Amzn-Requestid": [ "ce102289-d755-5b58-b6b7-40bfcf9e0c11" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjE5NjAxIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMTkyMTAifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCJjMmQ1M2ZkOC04NmFmLTU3ZmYtYWFlMi01ZGVlOWU2NDhjNWNcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljU2VuZFJlY2VpdmUtdG9wLTFcIixcbiAgXCJNZXNzYWdlXCIgOiBcIjBcIixcbiAgXCJUaW1lc3RhbXBcIiA6IFwiMjAyNi0wMy0xOVQxNTozMDoxOS4xNzZaXCIsXG4gIFwiU2lnbmF0dXJlVmVyc2lvblwiIDogXCIxXCIsXG4gIFwiU2lnbmF0dXJlXCIgOiBcImc4ZWxKM2RTdldTMzkvTnRZR2UxTStKUGJHVzJVcWMvSnBka3pCRGp5bWp3Z2VYUVZ4Rk83L2lMa0RwamNvaDRYZlQrRnZobGt2ZHh0T29BelM4ZVpuRFRrZHI5MTBkOUVhSkVHUklCTlNOVWU2ZWlQRUg4dDNvQ0VEZHJ6RjVGYzBTa1psUlBrZnQ5WWZDeWFYR2ZTbmE2VC95YkluemxVSGFJbElHNGJPOGtlWnVla3EvTnFQUlBvRWdNcVQzUW9JNHcxSHRGYmRHMFoyMzMwZ1pLSWh1ektHOVhWZFRlMVphR3VzdmNldGcxaDBNVHZnMTBxRnE4YW9TMFZJRWJsZnFDNnBacVdMcTJhSUJEckMrdDI3SStDZE42dWYySEhNZUVyOHRFZTRHOG5HckR3ZGJlaXhhODlUM2FvS1BKYTVPcTlEcTJObUhYNjlENk5hdGpKdz09XCIsXG4gIFwiU2lnbmluZ0NlcnRVUkxcIiA6IFwiaHR0cHM6Ly9zbnMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vU2ltcGxlTm90aWZpY2F0aW9uU2VydmljZS03NTA2YTFlMzViMzZlZjVhNDQ0ZGQxYThlN2NjM2VkOC5wZW1cIixcbiAgXCJVbnN1YnNjcmliZVVSTFwiIDogXCJodHRwczovL3Nucy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS8/QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljU2VuZFJlY2VpdmUtdG9wLTE6NWVkM2QwZTYtNTY4ZS00ODAzLTllMGUtNjE5M2Q4YmE1ODY3XCIsXG4gIFwiTWVzc2FnZUF0dHJpYnV0ZXNcIiA6IHtcbiAgICBcImFcIiA6IHtcIlR5cGVcIjpcIlN0cmluZ1wiLFwiVmFsdWVcIjpcIjBcIn1cbiAgfVxufSIsIk1ENU9mQm9keSI6ImI5MjJlMjEyOTE5ZTE4NzE3OWY4ZGU0YTJmMjNjZDdhIiwiTWVzc2FnZUlkIjoiYzRmMWI4ODUtZDBmMC00YzI3LWEyMTUtMmIzNzE3ZjA3MjM1IiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJaQWNZN2ZmK2tUYzc2QVFPS2lHRnU2dEFYZ1JnVENBWFFlR3IwQWgzeFhrZHVFeHl3NEQ5a1ZIYmNSQitYd25ITXg2M0RrYVdEcXBBTktnTlpSZUY5S0ZUM3BHVzJSOW9GN2NQNmNzQ2FYdEZieGdMUGJObjhwekdQZUZYaXJXdUw4Sm12OWFlcUhsS1NyOGhuRGtoa0QwL0E4cFUzNUh1aEhXSnFvdGova01nOU9rMWtYSm5oZmlLL3NOY1g3cjU5VzVLb0E5UTN5c3JmcEsvQzhucXBzeEVWQjFicktXQzVmR0R5c2QrbkhVcENOSG0zN29DTFNPc0ZGVGUxVVBZdlpGZHB0a043R1A1b3dwYStnaSsyRHYzeGtrSWo0RjMyZE9kZ3N1SkFiVldjYUxCVm4wRk5Xck43Uk1tdmRPbHZYQ21KV1VGdW1aT0NkR2t6cnZ4cUNyVnRaNzBYT2NHaVhlZkRzNEJxcGNSVDZnQlRwWlluMnMvQTBYYktIam5MdTUvVU1LTStxWmwvUmhNblJNcU9XcG9lN2krakJXQWlBaGhMMXFBRXU0PSJ9XX0=" } }, { "ID": "8afe6b28dc0afc4f", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "563" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQkVvUVBoUFNnSVdrY3RSYk5nbDdlZThYamFNYkZ1dVI2YVhaWkRvS2JwbElrUHV1ZjEzQjB0YjBPWGpPck1wWHNDMDFZb2NGL1pVamZldVRuUWEvZjI0d3UzQVltdFhZcm4zTjhRTzNyeTl2NWdCYXlYN25GL2ZWM0FQMXppanB1Rk44RjhwYVMyWjh3aU8yL0dsZ2pVd04xUmJjSTgxaFhjM2JVZXFBRWhHK0FzMGY3WmtFbGNQVXBTQVppQnV6K2F5VHV4Wm5kZ2tmZ3VQamo0aXhJUjJkanhMOHJPdVZBUnVoc0ozRlBBWE5EbXFwT2E1NUFidFJSVTE4bmFNT2FLdjY2ZDkxem85YkRQRXVROGltY09jaVJQck1tdzl6Yk9qNldqWjF6OEhLY1VmTWZFeFN2elc1VUdHQXNJVExwUVBDZWxkTXVhb3pJNEdMd1FtVjFYaWtIQ240bno2cVVXdFluVEJGWnRrZTJ4T1JWakVxRkpkQjRkNjJZRDFYUGd4cnMvcUVrSHhFd3FjTDMyUTVaY1E2eU9BU3hvR0tLR1UzK25qcW9SR0k9In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:19 GMT" ], "X-Amzn-Requestid": [ "d43cb79e-f3f0-503b-9a75-d5a8eb3bad8a" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "c2040a259cb5e03a", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "563" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQlpBY1k3ZmYra1RjNzZBUU9LaUdGdTZ0QVhnUmdUQ0FYUWVHcjBBaDN4WGtkdUV4eXc0RDlrVkhiY1JCK1h3bkhNeDYzRGthV0RxcEFOS2dOWlJlRjlLRlQzcEdXMlI5b0Y3Y1A2Y3NDYVh0RmJ4Z0xQYk5uOHB6R1BlRlhpcld1TDhKbXY5YWVxSGxLU3I4aG5Ea2hrRDAvQThwVTM1SHVoSFdKcW90ai9rTWc5T2sxa1hKbmhmaUsvc05jWDdyNTlXNUtvQTlRM3lzcmZwSy9DOG5xcHN4RVZCMWJyS1dDNWZHRHlzZCtuSFVwQ05IbTM3b0NMU09zRkZUZTFVUFl2WkZkcHRrTjdHUDVvd3BhK2dpKzJEdjN4a2tJajRGMzJkT2Rnc3VKQWJWV2NhTEJWbjBGTldyTjdSTW12ZE9sdlhDbUpXVUZ1bVpPQ2RHa3pydnhxQ3JWdFo3MFhPY0dpWGVmRHM0QnFwY1JUNmdCVHBaWW4ycy9BMFhiS0hqbkx1NS9VTUtNK3FabC9SaE1uUk1xT1dwb2U3aStqQldBaUFoaEwxcUFFdTQ9In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:19 GMT" ], "X-Amzn-Requestid": [ "8dea3615-e3e3-5ea7-a446-5423fb283f94" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "7f1cc71dd88284cf", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "163" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1NlbmRSZWNlaXZlLXRvcC0xJTNBNWVkM2QwZTYtNTY4ZS00ODAzLTllMGUtNjE5M2Q4YmE1ODY3JlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:19 GMT" ], "X-Amzn-Requestid": [ "0b47f7ba-c548-5585-918e-958cdd837e26" ] }, "Body": "PFVuc3Vic2NyaWJlUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD4wYjQ3ZjdiYS1jNTQ4LTU1ODUtOTE4ZS05NThjZGQ4MzdlMjY8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvVW5zdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "ccb91fb7c4aeec81", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "89" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:20 GMT" ], "X-Amzn-Requestid": [ "fea6f454-dc05-5fe5-9023-9662c4ce490e" ] }, "Body": "" } }, { "ID": "1399e4cf3bc56bf7", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "117" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPURlbGV0ZVRvcGljJlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQVNOU1RvcGljU2VuZFJlY2VpdmUtdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:20 GMT" ], "X-Amzn-Requestid": [ "0e1e5b12-2a7f-5124-8222-392432b3da87" ] }, "Body": "PERlbGV0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD4wZTFlNWIxMi0yYTdmLTUxMjQtODIyMi0zOTI0MzJiM2RhODc8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvRGVsZXRlVG9waWNSZXNwb25zZT4K" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSNSTopic/TestSendReceiveJSON.replay ================================================ { "Initial": "AQAAAA7hTg2aH0+M1AAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "f9016d6670879b9e", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "72" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPUNyZWF0ZVRvcGljJk5hbWU9U05TVG9waWNTZW5kUmVjZWl2ZUpTT04tdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "336" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:34 GMT" ], "X-Amzn-Requestid": [ "79e7f919-9f50-5018-afe7-9b2f878a1814" ] }, "Body": "PENyZWF0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxDcmVhdGVUb3BpY1Jlc3VsdD4KICAgIDxUb3BpY0Fybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljU2VuZFJlY2VpdmVKU09OLXRvcC0xPC9Ub3BpY0Fybj4KICA8L0NyZWF0ZVRvcGljUmVzdWx0PgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD43OWU3ZjkxOS05ZjUwLTUwMTgtYWZlNy05YjJmODc4YTE4MTQ8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvQ3JlYXRlVG9waWNSZXNwb25zZT4K" } }, { "ID": "70d2f7ceaa21bee9", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "45" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTTlNUb3BpY1NlbmRSZWNlaXZlSlNPTi1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "93" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:35 GMT" ], "X-Amzn-Requestid": [ "387750d6-d2b7-52d0-8029-32e0ca6cff5f" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlSlNPTi1zdWItMSJ9" } }, { "ID": "c96fa533138e7a5b", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "123" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlSlNPTi1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "94" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:35 GMT" ], "X-Amzn-Requestid": [ "da752c4b-9d25-58bb-acef-4e7d85fef534" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY1NlbmRSZWNlaXZlSlNPTi1zdWItMSJ9fQ==" } }, { "ID": "5c676600227cbef9", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "472" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljU2VuZFJlY2VpdmVKU09OLXN1Yi0xXCJcblx0XHR9XG5cdFx0XVxuXHRcdH0ifSwiUXVldWVVcmwiOiJodHRwczovL3Nxcy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS80NTY3NTI2NjU1NzYvU05TVG9waWNTZW5kUmVjZWl2ZUpTT04tc3ViLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:35 GMT" ], "X-Amzn-Requestid": [ "d3fc46a7-3064-5618-8305-249128bf1b97" ] }, "Body": "" } }, { "ID": "991c0e90f192aa7f", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "216" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVN1YnNjcmliZSZFbmRwb2ludD1hcm4lM0Fhd3MlM0FzcXMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1NlbmRSZWNlaXZlSlNPTi1zdWItMSZQcm90b2NvbD1zcXMmVG9waWNBcm49YXJuJTNBYXdzJTNBc25zJTNBdXMtZWFzdC0yJTNBNDU2NzUyNjY1NTc2JTNBU05TVG9waWNTZW5kUmVjZWl2ZUpTT04tdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "379" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:35 GMT" ], "X-Amzn-Requestid": [ "841eed9d-06e6-53e9-9b0c-8fab1e3dabe5" ] }, "Body": "PFN1YnNjcmliZVJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8U3Vic2NyaWJlUmVzdWx0PgogICAgPFN1YnNjcmlwdGlvbkFybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljU2VuZFJlY2VpdmVKU09OLXRvcC0xOjhhZjAzZjkwLWZjM2UtNDc3MC1hODQzLWZjOWIxYjJlNjM5MjwvU3Vic2NyaXB0aW9uQXJuPgogIDwvU3Vic2NyaWJlUmVzdWx0PgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD44NDFlZWQ5ZC0wNmU2LTUzZTktOWIwYy04ZmFiMWUzZGFiZTU8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvU3Vic2NyaWJlUmVzcG9uc2U+Cg==" } }, { "ID": "994393780ab90b6f", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "236" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9JTdCJTIyRm9vJTIyJTNBKyUyMkJhciUyMiU3RCZUb3BpY0Fybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1NlbmRSZWNlaXZlSlNPTi10b3AtMSZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:35 GMT" ], "X-Amzn-Requestid": [ "608b4d71-3ba3-5d60-8a02-2f472378056c" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPjE2NzI0ZjAwLTcxM2UtNWI0ZC1hMzBjLTJkMzY2OWU1MDM0MTwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjYwOGI0ZDcxLTNiYTMtNWQ2MC04YTAyLTJmNDcyMzc4MDU2YzwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "2674eee2075a4e8d", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "174" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlSlNPTi1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1767" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:35 GMT" ], "X-Amzn-Requestid": [ "1465dfee-06ed-5614-ab4a-bdd81e36ab9b" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjM1NjYxIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMzU2MTkifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCIxNjcyNGYwMC03MTNlLTViNGQtYTMwYy0yZDM2NjllNTAzNDFcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljU2VuZFJlY2VpdmVKU09OLXRvcC0xXCIsXG4gIFwiTWVzc2FnZVwiIDogXCJ7XFxcIkZvb1xcXCI6IFxcXCJCYXJcXFwifVwiLFxuICBcIlRpbWVzdGFtcFwiIDogXCIyMDI2LTAzLTE5VDE1OjMwOjM1LjU4MVpcIixcbiAgXCJTaWduYXR1cmVWZXJzaW9uXCIgOiBcIjFcIixcbiAgXCJTaWduYXR1cmVcIiA6IFwiY0JFMTZpbCtOSnNlVUFLbzVhKzVvYjBxcHN2YjRic2NOWTFsS3grb3dhWjlUc1BwVkhmVGx0aXRBYStwSTI2b2MrR1dGUnFzU3BkT0VmdjVrTktvY3R0S05sbFFFRm1JbEFsK3dPS0M5NEJxT0oySDBCYnppNGdjZ3ZjUmQ5MmE5c0oxcmZvV0l5eTZTRjBYc3h2SnViaW1XL3pNRFNTeVVaQktYdXUwSDFTTVlXUVhXU2xtOVdSZlcwbGxYMkJzTkFlNjM5MVFBYjczeVZMYzB4eCtRVUk4TExIeW15TXhRUHlJMllMRTdsbjhRNnZHMG5iL1MwYjJPZm1PNUlpVzFRa29pSVE1c2FLN1dYWlcyUVJFS01jSCt4a0w3T1hTV3B3ZkwxdW9xUUc3K05hb1VjL0RjVURqWVFoSFRDTFErUWwyRXY0TjlCdmVNcU5EQkFvT1N3PT1cIixcbiAgXCJTaWduaW5nQ2VydFVSTFwiIDogXCJodHRwczovL3Nucy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS9TaW1wbGVOb3RpZmljYXRpb25TZXJ2aWNlLTc1MDZhMWUzNWIzNmVmNWE0NDRkZDFhOGU3Y2MzZWQ4LnBlbVwiLFxuICBcIlVuc3Vic2NyaWJlVVJMXCIgOiBcImh0dHBzOi8vc25zLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLz9BY3Rpb249VW5zdWJzY3JpYmUmU3Vic2NyaXB0aW9uQXJuPWFybjphd3M6c25zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6U05TVG9waWNTZW5kUmVjZWl2ZUpTT04tdG9wLTE6OGFmMDNmOTAtZmMzZS00NzcwLWE4NDMtZmM5YjFiMmU2MzkyXCJcbn0iLCJNRDVPZkJvZHkiOiI4ZTcwMzQ3YzNjYjRkYWVkODI3ZjI1ODg5NDY2MjFkZCIsIk1lc3NhZ2VJZCI6IjY4MTEwODQwLTBhMWYtNDljYi1hZmM3LThkMzM3ZjQxNThlNyIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCR0RmMlZpTGg2eXllakRHWHRnbzJDSWpDZjNLKy9RY0I0WmszdFV2Q01uVHFGY2hXYTByc2F0MWVyNkRITnFkYUdtVmJ5V1dvRS9jN1R5T2toTGVYTkIzanJJOE5QU3paL3dhdFNHSDk3OEsxOWxDSW02bk5nbVF4YjByZWYzNGh5aEZDRmNWMmYzakdTK2lSdmpzMG5ra0dUQWxnWWZGS2MzTmU4Y2RndFhzWjJORzdrT2ZoWGhYVGdyeHdxc2t0ZEszSzd4VnBCOUtYK3NKb1JKajNENjA1YVhDR3ViSWJ3RENNclJTbndRK0RvTTU0eHl0cFN2QWhmUXQ5V25ncVZrb1llNVhCR3I3cTdWWWk1VGE5VlpHVUJ6NjlwU0RSeUxIWWFXTGVJNFFSYnB4SElVYVBrOEF5ekdVK1hzMy9BRkFLam9PZmZ1anBiOGg2UVFsNDNMM1RESCtuSHlXZm96dHlraW8za3Y4ZHI4TXpnL1orc21GS3ZnbVkxOW8vRW5XSjJ1NjNhSXJZL2N0UFN1OS9GL2xiT25vV2NqT0ZRYk1zU1E2QUhmQT0ifV19" } }, { "ID": "edfd66069f78c50e", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "567" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQkdEZjJWaUxoNnl5ZWpER1h0Z28yQ0lqQ2YzSysvUWNCNFprM3RVdkNNblRxRmNoV2EwcnNhdDFlcjZESE5xZGFHbVZieVdXb0UvYzdUeU9raExlWE5CM2pySThOUFN6Wi93YXRTR0g5NzhLMTlsQ0ltNm5OZ21ReGIwcmVmMzRoeWhGQ0ZjVjJmM2pHUytpUnZqczBua2tHVEFsZ1lmRktjM05lOGNkZ3RYc1oyTkc3a09maFhoWFRncnh3cXNrdGRLM0s3eFZwQjlLWCtzSm9SSmozRDYwNWFYQ0d1Yklid0RDTXJSU253UStEb001NHh5dHBTdkFoZlF0OVduZ3FWa29ZZTVYQkdyN3E3VllpNVRhOVZaR1VCejY5cFNEUnlMSFlhV0xlSTRRUmJweEhJVWFQazhBeXpHVStYczMvQUZBS2pvT2ZmdWpwYjhoNlFRbDQzTDNUREgrbkh5V2ZvenR5a2lvM2t2OGRyOE16Zy9aK3NtRkt2Z21ZMTlvL0VuV0oydTYzYUlyWS9jdFBTdTkvRi9sYk9ub1djak9GUWJNc1NRNkFIZkE9In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlSlNPTi1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:35 GMT" ], "X-Amzn-Requestid": [ "9b8fca3d-c179-5410-ae9d-a80bd9a2999f" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "1368106a1023c827", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "167" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1NlbmRSZWNlaXZlSlNPTi10b3AtMSUzQThhZjAzZjkwLWZjM2UtNDc3MC1hODQzLWZjOWIxYjJlNjM5MiZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:35 GMT" ], "X-Amzn-Requestid": [ "b518754d-b3cf-596a-a357-177bab144166" ] }, "Body": "PFVuc3Vic2NyaWJlUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD5iNTE4NzU0ZC1iM2NmLTU5NmEtYTM1Ny0xNzdiYWIxNDQxNjY8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvVW5zdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "c70df52ba539f77f", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "93" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlSlNPTi1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:35 GMT" ], "X-Amzn-Requestid": [ "3f4bab05-f5cd-5a67-8800-c933ed1607e8" ] }, "Body": "" } }, { "ID": "39924012d4ba80c3", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "121" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPURlbGV0ZVRvcGljJlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQVNOU1RvcGljU2VuZFJlY2VpdmVKU09OLXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:36 GMT" ], "X-Amzn-Requestid": [ "754ed04c-3931-54ff-b79f-b27a21ed3cf3" ] }, "Body": "PERlbGV0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD43NTRlZDA0Yy0zOTMxLTU0ZmYtYjc5Zi1iMjdhMjFlZDNjZjM8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvRGVsZXRlVG9waWNSZXNwb25zZT4K" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSNSTopic/TestSendReceiveTwo.replay ================================================ { "Initial": "AQAAAA7hTg2XJNCNhAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "bc3758bbd805df8d", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "71" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPUNyZWF0ZVRvcGljJk5hbWU9U05TVG9waWNTZW5kUmVjZWl2ZVR3by10b3AtMSZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "335" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:31 GMT" ], "X-Amzn-Requestid": [ "12dbff4a-a58f-5ac5-aa43-9d7cbd58008e" ] }, "Body": "PENyZWF0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxDcmVhdGVUb3BpY1Jlc3VsdD4KICAgIDxUb3BpY0Fybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljU2VuZFJlY2VpdmVUd28tdG9wLTE8L1RvcGljQXJuPgogIDwvQ3JlYXRlVG9waWNSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjEyZGJmZjRhLWE1OGYtNWFjNS1hYTQzLTlkN2NiZDU4MDA4ZTwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9DcmVhdGVUb3BpY1Jlc3BvbnNlPgo=" } }, { "ID": "e274d2e5ff36e5d5", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "44" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTTlNUb3BpY1NlbmRSZWNlaXZlVHdvLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "92" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:32 GMT" ], "X-Amzn-Requestid": [ "757ce817-68e1-5ec9-9e6c-8a21703987e5" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlVHdvLXN1Yi0xIn0=" } }, { "ID": "876855229c9c56aa", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "122" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlVHdvLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "93" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:32 GMT" ], "X-Amzn-Requestid": [ "92dbad5f-02e9-59a2-8775-cf691a31d08e" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY1NlbmRSZWNlaXZlVHdvLXN1Yi0xIn19" } }, { "ID": "1e488f066af4469f", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "470" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljU2VuZFJlY2VpdmVUd28tc3ViLTFcIlxuXHRcdH1cblx0XHRdXG5cdFx0fSJ9LCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlVHdvLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:32 GMT" ], "X-Amzn-Requestid": [ "66c64f90-5c88-5835-83bd-2da64450d119" ] }, "Body": "" } }, { "ID": "f3022cbafeaabdee", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "214" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVN1YnNjcmliZSZFbmRwb2ludD1hcm4lM0Fhd3MlM0FzcXMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1NlbmRSZWNlaXZlVHdvLXN1Yi0xJlByb3RvY29sPXNxcyZUb3BpY0Fybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1NlbmRSZWNlaXZlVHdvLXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "378" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:32 GMT" ], "X-Amzn-Requestid": [ "59116369-09cb-5b2f-acdc-015f11134164" ] }, "Body": "PFN1YnNjcmliZVJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8U3Vic2NyaWJlUmVzdWx0PgogICAgPFN1YnNjcmlwdGlvbkFybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljU2VuZFJlY2VpdmVUd28tdG9wLTE6NTNhOTRmZTItNmFjYS00ZjgzLThiZmEtMDEyMjhlMDZjMWI5PC9TdWJzY3JpcHRpb25Bcm4+CiAgPC9TdWJzY3JpYmVSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjU5MTE2MzY5LTA5Y2ItNWIyZi1hY2RjLTAxNWYxMTEzNDE2NDwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9TdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "3e67d9915bd3ea02", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "44" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTTlNUb3BpY1NlbmRSZWNlaXZlVHdvLXN1Yi0yIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "92" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:32 GMT" ], "X-Amzn-Requestid": [ "24e5585f-07c1-5c30-9ef3-3a691f19b51c" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlVHdvLXN1Yi0yIn0=" } }, { "ID": "028071504f8d6bb7", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "122" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlVHdvLXN1Yi0yIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "93" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:32 GMT" ], "X-Amzn-Requestid": [ "e844a506-4d29-5ba8-880e-c73055f10284" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY1NlbmRSZWNlaXZlVHdvLXN1Yi0yIn19" } }, { "ID": "3b5b975ad8d98db8", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "470" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljU2VuZFJlY2VpdmVUd28tc3ViLTJcIlxuXHRcdH1cblx0XHRdXG5cdFx0fSJ9LCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlVHdvLXN1Yi0yIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:32 GMT" ], "X-Amzn-Requestid": [ "0b0f08ab-d06f-5f66-b091-6a9dc8b7964a" ] }, "Body": "" } }, { "ID": "d2d0196496d3e493", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "214" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVN1YnNjcmliZSZFbmRwb2ludD1hcm4lM0Fhd3MlM0FzcXMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1NlbmRSZWNlaXZlVHdvLXN1Yi0yJlByb3RvY29sPXNxcyZUb3BpY0Fybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1NlbmRSZWNlaXZlVHdvLXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "378" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:33 GMT" ], "X-Amzn-Requestid": [ "08cfc55b-4c0f-5144-8562-a76d54d78b0f" ] }, "Body": "PFN1YnNjcmliZVJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8U3Vic2NyaWJlUmVzdWx0PgogICAgPFN1YnNjcmlwdGlvbkFybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljU2VuZFJlY2VpdmVUd28tdG9wLTE6MjEwNWM0NWYtMzFhMC00Y2Q2LWI1YzEtYjY0MmU0ZDdhODllPC9TdWJzY3JpcHRpb25Bcm4+CiAgPC9TdWJzY3JpYmVSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjA4Y2ZjNTViLTRjMGYtNTE0NC04NTYyLWE3NmQ1NGQ3OGIwZjwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9TdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "32f98114386c38af", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "443" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9MCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5DTEVBUkVE" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:33 GMT" ], "X-Amzn-Requestid": [ "29bf97bd-39c5-5025-ab21-f58b211c4a6e" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPjE4MjM5ODZiLWZhN2QtNTEzZS04YzZkLWZhNWRlMmE0ZmI3NTwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjI5YmY5N2JkLTM5YzUtNTAyNS1hYjIxLWY1OGIyMTFjNGE2ZTwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "de4af3102d424f8f", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "443" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9MSZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5DTEVBUkVE" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:33 GMT" ], "X-Amzn-Requestid": [ "dd61fcc4-c103-57c1-80bc-9ef2d9da0d8a" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPjI5NWEwZjVhLWI2MTEtNWYyYy1iMDA1LTZkNmNhZWM4ZjU2NzwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPmRkNjFmY2M0LWMxMDMtNTdjMS04MGJjLTllZjJkOWRhMGQ4YTwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "1a7cd3b913276fe8", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "443" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9MiZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5DTEVBUkVE" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:33 GMT" ], "X-Amzn-Requestid": [ "ce453e1c-579e-598b-bc5b-5c2a4f47c3c0" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPjM1MzRhNjNmLTJmMWUtNWZjOC04NmQwLWM0MDkzN2M3ODU4MzwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPmNlNDUzZTFjLTU3OWUtNTk4Yi1iYzViLTVjMmE0ZjQ3YzNjMDwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "6c12a99d5084fbd7", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "173" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlVHdvLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1826" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:33 GMT" ], "X-Amzn-Requestid": [ "53ab705c-d167-55f1-9790-126ac9be4cdd" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjMzMzU3IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMzMxMTkifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCIxODIzOTg2Yi1mYTdkLTUxM2UtOGM2ZC1mYTVkZTJhNGZiNzVcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljU2VuZFJlY2VpdmVUd28tdG9wLTFcIixcbiAgXCJNZXNzYWdlXCIgOiBcIjBcIixcbiAgXCJUaW1lc3RhbXBcIiA6IFwiMjAyNi0wMy0xOVQxNTozMDozMy4wODJaXCIsXG4gIFwiU2lnbmF0dXJlVmVyc2lvblwiIDogXCIxXCIsXG4gIFwiU2lnbmF0dXJlXCIgOiBcIkRTOEsweXBnL29pTlY3OU91U0pDZzVUdUd4S1pmdTdHQjd3djdidGVjbEdlOTJVcGpaQ0ZYRUd6bWNaamY4R1JLY0dFUkZIRzVncE1pQ1BwSm4xbnljQTR0NkloeUhhdEZqQ0crT3VSS0pQL2hqNS8ydTgwQk9ZMHMxUnZBS3BRT2c2LzI1MzE3MFFiRkx0TU55UmgwdkY5K3ZRNVVPd0svTlp3Rk5hdk5hRmpKdlJGWnFrQ2pHbWFVVXhXQXVZSVBkMXU0VEFmbEZqWXVQUXFINHBuUmdmbnFyKzRHSFJaQ1gwamdXaysrZXhRRGxSNVNJczBXM29zZjlLSzIrMlM5SVRoSlFVSnRZeW1Kd3lyd0pIdkpsckl6QURxT3pSUm1tUmtBa3hQTERQNlNLNjFmbGhiUnpIdG1Cdk5kTVg2ckFPckNtWi9UeW1XWDFUamZjU21zdz09XCIsXG4gIFwiU2lnbmluZ0NlcnRVUkxcIiA6IFwiaHR0cHM6Ly9zbnMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vU2ltcGxlTm90aWZpY2F0aW9uU2VydmljZS03NTA2YTFlMzViMzZlZjVhNDQ0ZGQxYThlN2NjM2VkOC5wZW1cIixcbiAgXCJVbnN1YnNjcmliZVVSTFwiIDogXCJodHRwczovL3Nucy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS8/QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljU2VuZFJlY2VpdmVUd28tdG9wLTE6NTNhOTRmZTItNmFjYS00ZjgzLThiZmEtMDEyMjhlMDZjMWI5XCIsXG4gIFwiTWVzc2FnZUF0dHJpYnV0ZXNcIiA6IHtcbiAgICBcImFcIiA6IHtcIlR5cGVcIjpcIlN0cmluZ1wiLFwiVmFsdWVcIjpcIjBcIn1cbiAgfVxufSIsIk1ENU9mQm9keSI6IjZhMWRhZjUwY2IyYjg0YzQzNjE1MDNjNWFkY2YzYjg0IiwiTWVzc2FnZUlkIjoiYThkZTg1NWYtYTgzMS00YjBkLWI5YzktNTZlZjczMTY1MjQ3IiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJqZURMcTViQU5QSmZNTVk3ZlE0cm4vN1JyRklQb0s4U1FQdW1XN3lYTVhZQm5PQ2lvQWVuMlpVMlEyNXIyZGREaElTcUtuZHhjdWZXOGlIYzE4Nkw5Tm0weUdDdEpDSlV6TnpodlNCVGJrWUNVVDdIZGhOMmFJMnpPQXkycXBJb3MybnZ6SFBNcmRrUlJkcFgwcHcvdXo2R1MzbDhtOWpQMGV1SFBVSUxWVnhrTmljTWVnVk1aK3M2U1F2NmRsaDJxZkZjeXZzUDMwVTh2aThMNGdaVllGRnV0b2ZRdzBJN0trVFhLV252MEJzRGdoOUdmV0xMUE9wMXZnWUR3YzhlN2ZkNE13b0pJQWNCcncvREhxQ2VhalZ4ZFpLSWgxaHdZVTk5VXZkdWg4dkt2Y3JENmZtUi9NcjZPVjFTbWEvOHZLVmNnN1AybDJTSmxUWGJjNW1SeFdoeHBUQ3dzQmtzeFhjRHord0phWGJSQWtZUzYvOHRIOXoyYjVJOHBkaWVkdDI3cVR1S2R3ZmpkRzA4NUV4eS9GeUUvci9EdE1WczBPSTVCUTJJeHdrPSJ9XX0=" } }, { "ID": "206bcd7e6e47377d", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "173" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlVHdvLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1826" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:33 GMT" ], "X-Amzn-Requestid": [ "a8184be3-8b6a-547b-abfd-29d593b32d57" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjMzNDI0IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMzMxOTIifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCIyOTVhMGY1YS1iNjExLTVmMmMtYjAwNS02ZDZjYWVjOGY1NjdcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljU2VuZFJlY2VpdmVUd28tdG9wLTFcIixcbiAgXCJNZXNzYWdlXCIgOiBcIjFcIixcbiAgXCJUaW1lc3RhbXBcIiA6IFwiMjAyNi0wMy0xOVQxNTozMDozMy4xNTZaXCIsXG4gIFwiU2lnbmF0dXJlVmVyc2lvblwiIDogXCIxXCIsXG4gIFwiU2lnbmF0dXJlXCIgOiBcIk5ZRHoyaFd4WmtxUWJFS3AwbW5wQ3MzRU1ZaTNUd2JDMTFjYnk5MmRKOTNjTkJYNGNoWEYrV1JJWjJqNGlNT0F0d3lGVk41SHN2bExRR3Q1QjZnN0VFcWxpbEZlSDM1b0ZJQjZlQjBXbVVPL0NNSGNkR0NKcGFhNGc2ZlQ4cGdpaWhlSTNkaUtyR01WQnVUOFBNcFFIVEJ1cGdYT2pMQ25uNXB1VnBJTWt0TXlaYWhvOTlxZ1BxZFFkS050Q1pheHlXcWJucUUzeENvVHd6WTBYdkRJTmVpL1k4MnJ1VS9PeHBiNkRzbEd5bDU3TG5RM1VZWCtLdTlxcDE4YWtoeTFsZm1uUkJvc0FpTHpiREV6aVJ5MlozQUlxSFVVNi9tUUl2S1RXeUs4Yk4vaEYzeVBoODJwL1RFUTBWNmhjY3ZOUXhWZllPRXM3ZDl3MnlLQW1nS09WUT09XCIsXG4gIFwiU2lnbmluZ0NlcnRVUkxcIiA6IFwiaHR0cHM6Ly9zbnMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vU2ltcGxlTm90aWZpY2F0aW9uU2VydmljZS03NTA2YTFlMzViMzZlZjVhNDQ0ZGQxYThlN2NjM2VkOC5wZW1cIixcbiAgXCJVbnN1YnNjcmliZVVSTFwiIDogXCJodHRwczovL3Nucy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS8/QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljU2VuZFJlY2VpdmVUd28tdG9wLTE6NTNhOTRmZTItNmFjYS00ZjgzLThiZmEtMDEyMjhlMDZjMWI5XCIsXG4gIFwiTWVzc2FnZUF0dHJpYnV0ZXNcIiA6IHtcbiAgICBcImFcIiA6IHtcIlR5cGVcIjpcIlN0cmluZ1wiLFwiVmFsdWVcIjpcIjFcIn1cbiAgfVxufSIsIk1ENU9mQm9keSI6IjMzNTJmYzVkNTU2ZjUxMWNlN2Q4YzYyYTJmMTkxZmFkIiwiTWVzc2FnZUlkIjoiNzYyYmYyMmYtZThlNy00ZjlkLTljZDYtNjM2OTlkYWJmNTU5IiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJWQmc4akdKVUZ3SHppazNQVmI0S21xNHB6OUxCT1dSZEpUNEJuTlpLUzdjdkVZSWI0Y2FPMFpaQUF4RW52enF5dXVPS1VuazlnQlZZZU1HYXZqci9iTndnWmFualNvZEh6Mk1zMHZZZVU5VlZLVHoxZW5YUWZlWVRGdnlxejN5Ly9QZ1FzMm5qLzBTSGdtajNOZXhZSUhWSlkyL0IzTGx5Sk01NUdWeUJRZkZ2UnV2QmZxZkVqTFBLczhSVVZOREwzTDNKSjMyYXR1TXhReitmOGIwZi83MW84RTVxTGs4UGRHNjF1V3lVWEluL1dPM2RLZG5ta0phQnloUUZIRjBtMnJMenpDNW9tOHlhK0NieU8zWi9jWjcwT0lIZjQ1alVBUFJ6VXV4YUFHa3ZEakpsVm9ibFB1OEROK0JhQjQyYmVpOW5tZStnbzQ0MzBDaXI2MXBFUFZ3MWowM2w2QW5ka2dCRzdIa0F2cWEvV1NFQnZMSFNQM3VIZWdmVmNMR3RaOVpmTmxpRWhmUXNXZEJzd084ek0vNFlJQzRxY2p0eXJ6aGZ5L1pzaW5ZPSJ9XX0=" } }, { "ID": "af0c08a01e10f0d9", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "566" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQmplRExxNWJBTlBKZk1NWTdmUTRybi83UnJGSVBvSzhTUVB1bVc3eVhNWFlCbk9DaW9BZW4yWlUyUTI1cjJkZERoSVNxS25keGN1Zlc4aUhjMTg2TDlObTB5R0N0SkNKVXpOemh2U0JUYmtZQ1VUN0hkaE4yYUkyek9BeTJxcElvczJudnpIUE1yZGtSUmRwWDBwdy91ejZHUzNsOG05alAwZXVIUFVJTFZWeGtOaWNNZWdWTVorczZTUXY2ZGxoMnFmRmN5dnNQMzBVOHZpOEw0Z1pWWUZGdXRvZlF3MEk3S2tUWEtXbnYwQnNEZ2g5R2ZXTExQT3AxdmdZRHdjOGU3ZmQ0TXdvSklBY0Jydy9ESHFDZWFqVnhkWktJaDFod1lVOTlVdmR1aDh2S3ZjckQ2Zm1SL01yNk9WMVNtYS84dktWY2c3UDJsMlNKbFRYYmM1bVJ4V2h4cFRDd3NCa3N4WGNEeit3SmFYYlJBa1lTNi84dEg5ejJiNUk4cGRpZWR0MjdxVHVLZHdmamRHMDg1RXh5L0Z5RS9yL0R0TVZzME9JNUJRMkl4d2s9In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlVHdvLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:33 GMT" ], "X-Amzn-Requestid": [ "e7a69490-173b-5f36-84b5-f6a60fe2661a" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "3cd99b9938a0599d", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "173" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlVHdvLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1826" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:33 GMT" ], "X-Amzn-Requestid": [ "94ee3c83-302d-57c8-b7bb-5eb528f4fee4" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjMzNTYxIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMzMzMjIifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCIzNTM0YTYzZi0yZjFlLTVmYzgtODZkMC1jNDA5MzdjNzg1ODNcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljU2VuZFJlY2VpdmVUd28tdG9wLTFcIixcbiAgXCJNZXNzYWdlXCIgOiBcIjJcIixcbiAgXCJUaW1lc3RhbXBcIiA6IFwiMjAyNi0wMy0xOVQxNTozMDozMy4yMzFaXCIsXG4gIFwiU2lnbmF0dXJlVmVyc2lvblwiIDogXCIxXCIsXG4gIFwiU2lnbmF0dXJlXCIgOiBcImFRd0paWFJUZEJ2Y3lOb1lHZFlCNWljaTFDT0JhSm1VNW4vUkJiRVg1WllERG9lbzY0UEdYUU9IdGg2ODJYWmlneVRFa2JKQ0RzNnpVNVFKRGpIZ2lCcnBqb1daYTB4WllhUEE2eHBJM0JsejVvVitlZjNuMUlPZ0VlZFBQYUFVOCt1WmkySnRUYzN2QlpIQmMrYi9tOW85R3l4a3V0ZWFSK0hwSTF5dEU3Undxb081ZXFtNElLNVBxSmhuSDZFWUh4NnM2V3RqYW1PRjZZNVE2LzlLQklGMVRGaWNadmduemUxQ2RtbnhSdzFaZUN6Tms3eWJCTkpld0dvOVhNdzdjRUU1dmVYSFp5R1VtZTFyWVJmdXJnYXBKNVpEZnVZVDRyWXkvV3FnVDFiSFhCa05CaWJzUmpmY1VsWHNNZDlxaVBwdWNOYUNia2RxU3NPK2RkN29WQT09XCIsXG4gIFwiU2lnbmluZ0NlcnRVUkxcIiA6IFwiaHR0cHM6Ly9zbnMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vU2ltcGxlTm90aWZpY2F0aW9uU2VydmljZS03NTA2YTFlMzViMzZlZjVhNDQ0ZGQxYThlN2NjM2VkOC5wZW1cIixcbiAgXCJVbnN1YnNjcmliZVVSTFwiIDogXCJodHRwczovL3Nucy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS8/QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljU2VuZFJlY2VpdmVUd28tdG9wLTE6NTNhOTRmZTItNmFjYS00ZjgzLThiZmEtMDEyMjhlMDZjMWI5XCIsXG4gIFwiTWVzc2FnZUF0dHJpYnV0ZXNcIiA6IHtcbiAgICBcImFcIiA6IHtcIlR5cGVcIjpcIlN0cmluZ1wiLFwiVmFsdWVcIjpcIjJcIn1cbiAgfVxufSIsIk1ENU9mQm9keSI6ImI2NTA1Yjg2ZWI2ZmU3N2IwMzAwNDVjNjdhZTczNmIzIiwiTWVzc2FnZUlkIjoiNThhMjdlNWItZWU2ZS00YjVkLThjN2QtNDY5MjQzZWMwNzhhIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJCM2REb2srTzVrWk4zQ3Jqc2M5RVZ5ZHN3Y0pRM2d2TnQybitrMnlzS1ZPelQvMHBNTlpma1YwNStuV2Q5V1ZOU0pRdFNKSWtjcEcwR0U3WXB4R3NmbEswbjB0aDRnMzBWemQ0WWp4SDF3RWNUdzM3UnR0Z1F0eWJqaHlFS3lvQ1YvdDEzR2VzT1VORkw3Rk5HTDhudk5QM2JJNnJRQit4YVcxbmFQQ3JWRzlyRk5idnB0eGw1TmdZbmFDR0pPMlExZURvaUpHUlZqMHVXNFJHZEtCamxRd2h3WWw0U0swWGNWUHhpcDBrek9kNERFS1pTbnROUnBRRVBGbXRKZlg0L0l1cDI3ekl0MHl2QngxMWdlRXIzQkFpeXpNSjhUbEFaU2RqUEU5ZU9kaUJmb1A1MC9HUEtiQ01yQURNaVUyRUxkTXVsSEcyQytFV1dLV1VNaUluSTdxRW5rTVpqUU1CWDVIYkF1UnJQWFJGazMwNjA2TzUzYlkyYythOVl5WHhweS82bzFQeXluWVBiQ0p4eEh3eEUyc1FvNksyMVlCU3dUU21xRmNoTEJJPSJ9XX0=" } }, { "ID": "d63bf52a0ec81f75", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "566" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQlZCZzhqR0pVRndIemlrM1BWYjRLbXE0cHo5TEJPV1JkSlQ0Qm5OWktTN2N2RVlJYjRjYU8wWlpBQXhFbnZ6cXl1dU9LVW5rOWdCVlllTUdhdmpyL2JOd2daYW5qU29kSHoyTXMwdlllVTlWVktUejFlblhRZmVZVEZ2eXF6M3kvL1BnUXMybmovMFNIZ21qM05leFlJSFZKWTIvQjNMbHlKTTU1R1Z5QlFmRnZSdXZCZnFmRWpMUEtzOFJVVk5ETDNMM0pKMzJhdHVNeFF6K2Y4YjBmLzcxbzhFNXFMazhQZEc2MXVXeVVYSW4vV08zZEtkbm1rSmFCeWhRRkhGMG0yckx6ekM1b204eWErQ2J5TzNaL2NaNzBPSUhmNDVqVUFQUnpVdXhhQUdrdkRqSmxWb2JsUHU4RE4rQmFCNDJiZWk5bm1lK2dvNDQzMENpcjYxcEVQVncxajAzbDZBbmRrZ0JHN0hrQXZxYS9XU0VCdkxIU1AzdUhlZ2ZWY0xHdFo5WmZObGlFaGZRc1dkQnN3Tzh6TS80WUlDNHFjanR5cnpoZnkvWnNpblk9In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlVHdvLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:33 GMT" ], "X-Amzn-Requestid": [ "73dd394f-2f7d-535c-8a99-5b7937a4f5b5" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "23d3d71a18bec1a4", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "173" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlVHdvLXN1Yi0yIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1826" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:33 GMT" ], "X-Amzn-Requestid": [ "567a6596-ee1f-5018-9879-07a0f6c68934" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjMzNjMxIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMzMxMTYifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCIxODIzOTg2Yi1mYTdkLTUxM2UtOGM2ZC1mYTVkZTJhNGZiNzVcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljU2VuZFJlY2VpdmVUd28tdG9wLTFcIixcbiAgXCJNZXNzYWdlXCIgOiBcIjBcIixcbiAgXCJUaW1lc3RhbXBcIiA6IFwiMjAyNi0wMy0xOVQxNTozMDozMy4wODJaXCIsXG4gIFwiU2lnbmF0dXJlVmVyc2lvblwiIDogXCIxXCIsXG4gIFwiU2lnbmF0dXJlXCIgOiBcIkRTOEsweXBnL29pTlY3OU91U0pDZzVUdUd4S1pmdTdHQjd3djdidGVjbEdlOTJVcGpaQ0ZYRUd6bWNaamY4R1JLY0dFUkZIRzVncE1pQ1BwSm4xbnljQTR0NkloeUhhdEZqQ0crT3VSS0pQL2hqNS8ydTgwQk9ZMHMxUnZBS3BRT2c2LzI1MzE3MFFiRkx0TU55UmgwdkY5K3ZRNVVPd0svTlp3Rk5hdk5hRmpKdlJGWnFrQ2pHbWFVVXhXQXVZSVBkMXU0VEFmbEZqWXVQUXFINHBuUmdmbnFyKzRHSFJaQ1gwamdXaysrZXhRRGxSNVNJczBXM29zZjlLSzIrMlM5SVRoSlFVSnRZeW1Kd3lyd0pIdkpsckl6QURxT3pSUm1tUmtBa3hQTERQNlNLNjFmbGhiUnpIdG1Cdk5kTVg2ckFPckNtWi9UeW1XWDFUamZjU21zdz09XCIsXG4gIFwiU2lnbmluZ0NlcnRVUkxcIiA6IFwiaHR0cHM6Ly9zbnMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vU2ltcGxlTm90aWZpY2F0aW9uU2VydmljZS03NTA2YTFlMzViMzZlZjVhNDQ0ZGQxYThlN2NjM2VkOC5wZW1cIixcbiAgXCJVbnN1YnNjcmliZVVSTFwiIDogXCJodHRwczovL3Nucy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS8/QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljU2VuZFJlY2VpdmVUd28tdG9wLTE6MjEwNWM0NWYtMzFhMC00Y2Q2LWI1YzEtYjY0MmU0ZDdhODllXCIsXG4gIFwiTWVzc2FnZUF0dHJpYnV0ZXNcIiA6IHtcbiAgICBcImFcIiA6IHtcIlR5cGVcIjpcIlN0cmluZ1wiLFwiVmFsdWVcIjpcIjBcIn1cbiAgfVxufSIsIk1ENU9mQm9keSI6ImVhZjE0ZDJlOWQxZWNlMzZjYWUyOWQ4YmJlYzFmNDM1IiwiTWVzc2FnZUlkIjoiOTQ3MDQ2MzMtNmVkZC00ZTFjLTlmNTktYTA3ZDJkMmJjNmUzIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJYT3JmUGhHdk13MnovcDRLcjdXajNzUnVQOGdTaXl6Nnk3ZkVQNTA3V2QveTNrSWZ3Y09Zdm1jNGNvTFF3WHRiWVRwRWt4WkozY2RjZVV3L3YrRkRLOFVJakh1VHJhdXE2d2l1d2diOWhLTU54bUVEY0lzREFwN1pmL1M4WFFGakVIN3VFdHZWc2lVNjJNK2JZRTVxdk5nRU5sRUZGUEx0VjYxOGVnaFhaSWFmc0tUSHMwelRpS0NRZlRPMVhiSkEyOW9odG0wQmhXQkZZZlFYSWVpbUZNU2ZVV0JkME5IWXNUMGYvcDhjeWFacWN3ODZDY0RvZlRhQ2wrYjFNMHVnZjJtQXZJQThwK1pBY25SWitMT3NIRGczVnFZN050QW5SU01EZ0haZzhvOE5jK3pHVFJNT1pRQjA0NkxuQ0hPVmdSR0x1RzFnMFNqVjZPSUFYc3BmQlJiRHJ6MkdudjU5N1k5MG0vK3lYSmRtU2RCeTdqaWxSYWJCeDdLb3d1cFcrUVFOMTJ3OUxHYUIreGRpSmZqc3Y2SmU2UktmY2pkZGZydE0zNUU1TndjPSJ9XX0=" } }, { "ID": "d12b647466e7e188", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "566" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQlhPcmZQaEd2TXcyei9wNEtyN1dqM3NSdVA4Z1NpeXo2eTdmRVA1MDdXZC95M2tJZndjT1l2bWM0Y29MUXdYdGJZVHBFa3haSjNjZGNlVXcvditGREs4VUlqSHVUcmF1cTZ3aXV3Z2I5aEtNTnhtRURjSXNEQXA3WmYvUzhYUUZqRUg3dUV0dlZzaVU2Mk0rYllFNXF2TmdFTmxFRkZQTHRWNjE4ZWdoWFpJYWZzS1RIczB6VGlLQ1FmVE8xWGJKQTI5b2h0bTBCaFdCRllmUVhJZWltRk1TZlVXQmQwTkhZc1QwZi9wOGN5YVpxY3c4NkNjRG9mVGFDbCtiMU0wdWdmMm1BdklBOHArWkFjblJaK0xPc0hEZzNWcVk3TnRBblJTTURnSFpnOG84TmMrekdUUk1PWlFCMDQ2TG5DSE9WZ1JHTHVHMWcwU2pWNk9JQVhzcGZCUmJEcnoyR252NTk3WTkwbS8reVhKZG1TZEJ5N2ppbFJhYkJ4N0tvd3VwVytRUU4xMnc5TEdhQit4ZGlKZmpzdjZKZTZSS2ZjamRkZnJ0TTM1RTVOd2M9In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlVHdvLXN1Yi0yIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:33 GMT" ], "X-Amzn-Requestid": [ "4090a27f-d14f-51e7-995d-c049c99618cb" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "d3757d22bfd6513d", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "173" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlVHdvLXN1Yi0yIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1826" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:33 GMT" ], "X-Amzn-Requestid": [ "34504d70-acfb-53ba-b1a0-2f46b4225b76" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjMzNzIwIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMzMzMTIifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCIzNTM0YTYzZi0yZjFlLTVmYzgtODZkMC1jNDA5MzdjNzg1ODNcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljU2VuZFJlY2VpdmVUd28tdG9wLTFcIixcbiAgXCJNZXNzYWdlXCIgOiBcIjJcIixcbiAgXCJUaW1lc3RhbXBcIiA6IFwiMjAyNi0wMy0xOVQxNTozMDozMy4yMzFaXCIsXG4gIFwiU2lnbmF0dXJlVmVyc2lvblwiIDogXCIxXCIsXG4gIFwiU2lnbmF0dXJlXCIgOiBcImFRd0paWFJUZEJ2Y3lOb1lHZFlCNWljaTFDT0JhSm1VNW4vUkJiRVg1WllERG9lbzY0UEdYUU9IdGg2ODJYWmlneVRFa2JKQ0RzNnpVNVFKRGpIZ2lCcnBqb1daYTB4WllhUEE2eHBJM0JsejVvVitlZjNuMUlPZ0VlZFBQYUFVOCt1WmkySnRUYzN2QlpIQmMrYi9tOW85R3l4a3V0ZWFSK0hwSTF5dEU3Undxb081ZXFtNElLNVBxSmhuSDZFWUh4NnM2V3RqYW1PRjZZNVE2LzlLQklGMVRGaWNadmduemUxQ2RtbnhSdzFaZUN6Tms3eWJCTkpld0dvOVhNdzdjRUU1dmVYSFp5R1VtZTFyWVJmdXJnYXBKNVpEZnVZVDRyWXkvV3FnVDFiSFhCa05CaWJzUmpmY1VsWHNNZDlxaVBwdWNOYUNia2RxU3NPK2RkN29WQT09XCIsXG4gIFwiU2lnbmluZ0NlcnRVUkxcIiA6IFwiaHR0cHM6Ly9zbnMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vU2ltcGxlTm90aWZpY2F0aW9uU2VydmljZS03NTA2YTFlMzViMzZlZjVhNDQ0ZGQxYThlN2NjM2VkOC5wZW1cIixcbiAgXCJVbnN1YnNjcmliZVVSTFwiIDogXCJodHRwczovL3Nucy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS8/QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljU2VuZFJlY2VpdmVUd28tdG9wLTE6MjEwNWM0NWYtMzFhMC00Y2Q2LWI1YzEtYjY0MmU0ZDdhODllXCIsXG4gIFwiTWVzc2FnZUF0dHJpYnV0ZXNcIiA6IHtcbiAgICBcImFcIiA6IHtcIlR5cGVcIjpcIlN0cmluZ1wiLFwiVmFsdWVcIjpcIjJcIn1cbiAgfVxufSIsIk1ENU9mQm9keSI6Ijk2M2RjYjI3ZDQzMDhkZTRlNzMxNDAwNjVjYjkwNDgyIiwiTWVzc2FnZUlkIjoiOTVhNWYxOTItZGIyNy00YzRlLTg5NDItMGQxNDExMTk3OGZhIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJ6ZG9BSVdLSWp1RzFua3BrbWRaRW5oNkYxSEpmaTlGT2ZYMVNobzFLY0x1TUpGeWE4R1p5cDVSK2RXc1ViOWJFR0dvNll3bEh6L2xGYXR6OElxY0FOcSt3cU9JS2tldnk1eldzUGtXNWxXcEk5WTRoWkxmWU4xSFczempMMXViL3RidFJRcnF6MG5qMXdSS1VmT3FJbnJQbFZmY1JWM2M3TGtUbFloUGF3OWRSOWJneFZDQ05OR0d4YWs1Nmh2dXpRZG12bmdPMDU2ajlWaTd5WGFvc2R5QTlaNW9tSjgyOW1xV0JJL0R2ZVBKVHU3MXJRTzgvKzVOdU1ZdHVCNTB6Yzhhck9oVnBmb1kwQ1kyZEs2cTgxRS93aVVRZmFuYkJFQitkZHBQNlNrMU9JZ2dOdFp6VUp0OWlKSXcxdjFzSGxORXRYRUc5WUMzR21WN0N2ZDN5dzBaSUFlZ0UySmd4Tm1PRUFHVVRqc1JMVGcyRzZjekIvNUJURzJhTUlERkkyVGdsRUtoYUNLTXc4TFhJcWZ5allvbUxoSGtxT21JVHdzaC9uT0l0NzlFPSJ9XX0=" } }, { "ID": "2f6a9d4b429e1519", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "566" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQkIzZERvaytPNWtaTjNDcmpzYzlFVnlkc3djSlEzZ3ZOdDJuK2syeXNLVk96VC8wcE1OWmZrVjA1K25XZDlXVk5TSlF0U0pJa2NwRzBHRTdZcHhHc2ZsSzBuMHRoNGczMFZ6ZDRZanhIMXdFY1R3MzdSdHRnUXR5YmpoeUVLeW9DVi90MTNHZXNPVU5GTDdGTkdMOG52TlAzYkk2clFCK3hhVzFuYVBDclZHOXJGTmJ2cHR4bDVOZ1luYUNHSk8yUTFlRG9pSkdSVmowdVc0UkdkS0JqbFF3aHdZbDRTSzBYY1ZQeGlwMGt6T2Q0REVLWlNudE5ScFFFUEZtdEpmWDQvSXVwMjd6SXQweXZCeDExZ2VFcjNCQWl5ek1KOFRsQVpTZGpQRTllT2RpQmZvUDUwL0dQS2JDTXJBRE1pVTJFTGRNdWxIRzJDK0VXV0tXVU1pSW5JN3FFbmtNWmpRTUJYNUhiQXVSclBYUkZrMzA2MDZPNTNiWTJjK2E5WXlYeHB5LzZvMVB5eW5ZUGJDSnh4SHd4RTJzUW82SzIxWUJTd1RTbXFGY2hMQkk9In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlVHdvLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:33 GMT" ], "X-Amzn-Requestid": [ "ff15d722-615d-5ae6-99f3-b51479847c0f" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "02e479e5c799c2a1", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "173" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlVHdvLXN1Yi0yIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1826" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:33 GMT" ], "X-Amzn-Requestid": [ "a0e017a1-ab70-5bf3-86d2-7597b3a962df" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjMzNzkwIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyMzMxODYifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCIyOTVhMGY1YS1iNjExLTVmMmMtYjAwNS02ZDZjYWVjOGY1NjdcIixcbiAgXCJUb3BpY0FyblwiIDogXCJhcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljU2VuZFJlY2VpdmVUd28tdG9wLTFcIixcbiAgXCJNZXNzYWdlXCIgOiBcIjFcIixcbiAgXCJUaW1lc3RhbXBcIiA6IFwiMjAyNi0wMy0xOVQxNTozMDozMy4xNTZaXCIsXG4gIFwiU2lnbmF0dXJlVmVyc2lvblwiIDogXCIxXCIsXG4gIFwiU2lnbmF0dXJlXCIgOiBcIk5ZRHoyaFd4WmtxUWJFS3AwbW5wQ3MzRU1ZaTNUd2JDMTFjYnk5MmRKOTNjTkJYNGNoWEYrV1JJWjJqNGlNT0F0d3lGVk41SHN2bExRR3Q1QjZnN0VFcWxpbEZlSDM1b0ZJQjZlQjBXbVVPL0NNSGNkR0NKcGFhNGc2ZlQ4cGdpaWhlSTNkaUtyR01WQnVUOFBNcFFIVEJ1cGdYT2pMQ25uNXB1VnBJTWt0TXlaYWhvOTlxZ1BxZFFkS050Q1pheHlXcWJucUUzeENvVHd6WTBYdkRJTmVpL1k4MnJ1VS9PeHBiNkRzbEd5bDU3TG5RM1VZWCtLdTlxcDE4YWtoeTFsZm1uUkJvc0FpTHpiREV6aVJ5MlozQUlxSFVVNi9tUUl2S1RXeUs4Yk4vaEYzeVBoODJwL1RFUTBWNmhjY3ZOUXhWZllPRXM3ZDl3MnlLQW1nS09WUT09XCIsXG4gIFwiU2lnbmluZ0NlcnRVUkxcIiA6IFwiaHR0cHM6Ly9zbnMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vU2ltcGxlTm90aWZpY2F0aW9uU2VydmljZS03NTA2YTFlMzViMzZlZjVhNDQ0ZGQxYThlN2NjM2VkOC5wZW1cIixcbiAgXCJVbnN1YnNjcmliZVVSTFwiIDogXCJodHRwczovL3Nucy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS8/QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljU2VuZFJlY2VpdmVUd28tdG9wLTE6MjEwNWM0NWYtMzFhMC00Y2Q2LWI1YzEtYjY0MmU0ZDdhODllXCIsXG4gIFwiTWVzc2FnZUF0dHJpYnV0ZXNcIiA6IHtcbiAgICBcImFcIiA6IHtcIlR5cGVcIjpcIlN0cmluZ1wiLFwiVmFsdWVcIjpcIjFcIn1cbiAgfVxufSIsIk1ENU9mQm9keSI6ImYxMDY1ZGRhYmJkZTU4ZmE3OGViZTZjNzAwODkxNjIyIiwiTWVzc2FnZUlkIjoiNTM4NjViNjgtYTMzOC00OWRjLTlhMmYtNTJiZjE5MDcxMDk5IiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJEOHZjYTdZVVhBS2lyeEd4Z1NHNjRzK1Q0VDUrZ1lsMlhTbkZBRFJySHVyZUJWdU0zKzYrWmJwNWprQUZrNTRNTFo0NElhNGxVVDQ1dm8vTWhGSjV5ZXRkZ240blJmTUJ0K091dHFrWFEyMFZoNS9FOTV5cWZlMXBlYWFaTDZmUFNSVlBRRk0yQ0Ria3Rmb04zZ0p0czREZkVxTENjNmlYT1lRd1pyNnExR1lIRjkxcTdpUXNFR3JaelZKanNPUEVKUmN5NEQvOXRqZk5vanV4dnpIUW5qOGM4cFlEWk96WHFkejRqR1N5TUJMSFJjYUxPKyt0VDZacjEvQ0J1UU1IbFpIQk1kL0JjTlpXVjc2WFBXanc5VFlZcjZOaUk5cDNDTklaY1lJMDFqTGpNZkkybzNTUDQ0SGJ0S1czYmZEb0tES25sMUZuRXBQM1lKWkgya2xsMGhQSjhKTE43ZlI3Y3czL0wwTnJzcko4QUVSYjBIYUlocUoxa0VTTmNCTHlGYlh6N0lFZDd4TmtXSDlySm50NmluUVZjZXlINm9kRlJPTHp6SzR5NVBnPSJ9XX0=" } }, { "ID": "779b048fd0a844c7", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "566" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQnpkb0FJV0tJanVHMW5rcGttZFpFbmg2RjFISmZpOUZPZlgxU2hvMUtjTHVNSkZ5YThHWnlwNVIrZFdzVWI5YkVHR282WXdsSHovbEZhdHo4SXFjQU5xK3dxT0lLa2V2eTV6V3NQa1c1bFdwSTlZNGhaTGZZTjFIVzN6akwxdWIvdGJ0UlFycXowbmoxd1JLVWZPcUluclBsVmZjUlYzYzdMa1RsWWhQYXc5ZFI5Ymd4VkNDTk5HR3hhazU2aHZ1elFkbXZuZ08wNTZqOVZpN3lYYW9zZHlBOVo1b21KODI5bXFXQkkvRHZlUEpUdTcxclFPOC8rNU51TVl0dUI1MHpjOGFyT2hWcGZvWTBDWTJkSzZxODFFL3dpVVFmYW5iQkVCK2RkcFA2U2sxT0lnZ050WnpVSnQ5aUpJdzF2MXNIbE5FdFhFRzlZQzNHbVY3Q3ZkM3l3MFpJQWVnRTJKZ3hObU9FQUdVVGpzUkxUZzJHNmN6Qi81QlRHMmFNSURGSTJUZ2xFS2hhQ0tNdzhMWElxZnlqWW9tTGhIa3FPbUlUd3NoL25PSXQ3OUU9In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlVHdvLXN1Yi0yIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:33 GMT" ], "X-Amzn-Requestid": [ "fe69ae35-bfd1-58f7-b060-cc03a708c558" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "93eac516378ad146", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "566" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQkQ4dmNhN1lVWEFLaXJ4R3hnU0c2NHMrVDRUNStnWWwyWFNuRkFEUnJIdXJlQlZ1TTMrNitaYnA1amtBRms1NE1MWjQ0SWE0bFVUNDV2by9NaEZKNXlldGRnbjRuUmZNQnQrT3V0cWtYUTIwVmg1L0U5NXlxZmUxcGVhYVpMNmZQU1JWUFFGTTJDRGJrdGZvTjNnSnRzNERmRXFMQ2M2aVhPWVF3WnI2cTFHWUhGOTFxN2lRc0VHclp6Vkpqc09QRUpSY3k0RC85dGpmTm9qdXh2ekhRbmo4YzhwWURaT3pYcWR6NGpHU3lNQkxIUmNhTE8rK3RUNlpyMS9DQnVRTUhsWkhCTWQvQmNOWldWNzZYUFdqdzlUWVlyNk5pSTlwM0NOSVpjWUkwMWpMak1mSTJvM1NQNDRIYnRLVzNiZkRvS0RLbmwxRm5FcFAzWUpaSDJrbGwwaFBKOEpMTjdmUjdjdzMvTDBOcnNySjhBRVJiMEhhSWhxSjFrRVNOY0JMeUZiWHo3SUVkN3hOa1dIOXJKbnQ2aW5RVmNleUg2b2RGUk9MenpLNHk1UGc9In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlVHdvLXN1Yi0yIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:33 GMT" ], "X-Amzn-Requestid": [ "17c6cc73-4634-5c87-96b1-ae455eeda128" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "a2650142786ebd5d", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "166" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1NlbmRSZWNlaXZlVHdvLXRvcC0xJTNBMjEwNWM0NWYtMzFhMC00Y2Q2LWI1YzEtYjY0MmU0ZDdhODllJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:34 GMT" ], "X-Amzn-Requestid": [ "fe6386f9-2c2f-5aeb-b51b-e4cf34f600a0" ] }, "Body": "PFVuc3Vic2NyaWJlUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD5mZTYzODZmOS0yYzJmLTVhZWItYjUxYi1lNGNmMzRmNjAwYTA8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvVW5zdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "03991f573091fa38", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "92" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlVHdvLXN1Yi0yIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:34 GMT" ], "X-Amzn-Requestid": [ "bdc012dc-9c9a-5639-89ee-70ea84401b96" ] }, "Body": "" } }, { "ID": "14ae9d18ece7507f", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "166" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1NlbmRSZWNlaXZlVHdvLXRvcC0xJTNBNTNhOTRmZTItNmFjYS00ZjgzLThiZmEtMDEyMjhlMDZjMWI5JlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:34 GMT" ], "X-Amzn-Requestid": [ "63db955b-d114-5cf0-a7f6-f76dc9ceb6bb" ] }, "Body": "PFVuc3Vic2NyaWJlUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD42M2RiOTU1Yi1kMTE0LTVjZjAtYTdmNi1mNzZkYzljZWI2YmI8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvVW5zdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "3cc82e3dfa371c3f", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "92" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1NlbmRSZWNlaXZlVHdvLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:34 GMT" ], "X-Amzn-Requestid": [ "e48a99e4-a3bd-50e1-906b-fbd2bb677d4e" ] }, "Body": "" } }, { "ID": "179d3323fe66afac", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "120" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPURlbGV0ZVRvcGljJlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQVNOU1RvcGljU2VuZFJlY2VpdmVUd28tdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:34 GMT" ], "X-Amzn-Requestid": [ "03bb2e42-bacf-52c4-b435-4c74a215a88f" ] }, "Body": "PERlbGV0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD4wM2JiMmU0Mi1iYWNmLTUyYzQtYjQzNS00Yzc0YTIxNWE4OGY8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvRGVsZXRlVG9waWNSZXNwb25zZT4K" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSNSTopicRaw/TestAs/aws_test.replay ================================================ { "Initial": "AQAAAA7hTg26G3FSRgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "25ee6afb5ae6874c", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "71" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPUNyZWF0ZVRvcGljJk5hbWU9U05TVG9waWNSYXdBc19hd3NfdGVzdC10b3AtMSZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "335" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:06 GMT" ], "X-Amzn-Requestid": [ "446a6c8a-034f-52d8-818f-0ebc1bb56493" ] }, "Body": "PENyZWF0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxDcmVhdGVUb3BpY1Jlc3VsdD4KICAgIDxUb3BpY0Fybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3QXNfYXdzX3Rlc3QtdG9wLTE8L1RvcGljQXJuPgogIDwvQ3JlYXRlVG9waWNSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjQ0NmE2YzhhLTAzNGYtNTJkOC04MThmLTBlYmMxYmI1NjQ5MzwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9DcmVhdGVUb3BpY1Jlc3BvbnNlPgo=" } }, { "ID": "216e4e329e7559b9", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "44" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTTlNUb3BpY1Jhd0FzX2F3c190ZXN0LXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "92" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:07 GMT" ], "X-Amzn-Requestid": [ "aad48159-fc9d-54a4-adc2-e36fe4668f51" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0FzX2F3c190ZXN0LXN1Yi0xIn0=" } }, { "ID": "a468ae90d1add578", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "122" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0FzX2F3c190ZXN0LXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "93" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:07 GMT" ], "X-Amzn-Requestid": [ "4b8c2575-8ef0-5dbb-8416-4743960bc64e" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY1Jhd0FzX2F3c190ZXN0LXN1Yi0xIn19" } }, { "ID": "a8bdca13fef6a678", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "470" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3QXNfYXdzX3Rlc3Qtc3ViLTFcIlxuXHRcdH1cblx0XHRdXG5cdFx0fSJ9LCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0FzX2F3c190ZXN0LXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:07 GMT" ], "X-Amzn-Requestid": [ "9229a865-e435-5969-8ae1-ca53fccef29c" ] }, "Body": "" } }, { "ID": "8db15e6b15576155", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "286" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVN1YnNjcmliZSZBdHRyaWJ1dGVzLmVudHJ5LjEua2V5PVJhd01lc3NhZ2VEZWxpdmVyeSZBdHRyaWJ1dGVzLmVudHJ5LjEudmFsdWU9dHJ1ZSZFbmRwb2ludD1hcm4lM0Fhd3MlM0FzcXMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd0FzX2F3c190ZXN0LXN1Yi0xJlByb3RvY29sPXNxcyZUb3BpY0Fybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd0FzX2F3c190ZXN0LXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "378" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:07 GMT" ], "X-Amzn-Requestid": [ "e46a1e4e-6eba-5772-a140-7c7876415139" ] }, "Body": "PFN1YnNjcmliZVJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8U3Vic2NyaWJlUmVzdWx0PgogICAgPFN1YnNjcmlwdGlvbkFybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3QXNfYXdzX3Rlc3QtdG9wLTE6YTczZDc4NDktY2E3Ny00NmVlLTkyYjUtNjQ5NzVjNWUyMDA2PC9TdWJzY3JpcHRpb25Bcm4+CiAgPC9TdWJzY3JpYmVSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPmU0NmExZTRlLTZlYmEtNTc3Mi1hMTQwLTdjNzg3NjQxNTEzOTwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9TdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "b1c6bec528a33ec8", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "208" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9eCZUb3BpY0Fybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd0FzX2F3c190ZXN0LXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:07 GMT" ], "X-Amzn-Requestid": [ "a348b10f-9d27-5f3e-b64b-d33985dc3975" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPjA3NWM5Y2I4LTBlNWItNTE3MC04NjJmLWZlOGUxNmEwOTczYjwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPmEzNDhiMTBmLTlkMjctNWYzZS1iNjRiLWQzMzk4NWRjMzk3NTwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "fad17a67b432be8f", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "173" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0FzX2F3c190ZXN0LXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "753" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:07 GMT" ], "X-Amzn-Requestid": [ "7ed6fae8-5948-5775-81cc-98de41b33c80" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjY3NzA3IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNjc2NjgifSwiQm9keSI6IngiLCJNRDVPZkJvZHkiOiI5ZGQ0ZTQ2MTI2OGM4MDM0ZjVjODU2NGUxNTVjNjdhNiIsIk1lc3NhZ2VJZCI6IjI1YWZiMGI4LTRkYzctNGJhYy1hZWRiLTk1MDQwMzE5MDEzNSIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCNksxbUdWNzUvaWtxd2picFNIWUFnVGtnY05ZaHVqN0JDL3kxUlc4V0NkRkZYcU9GN2lZUE5abFVBNnp6aklWM2s1RlFzM051RkZSVW03cVZJLytwQklKWGIvN2dvU3VsOWlZZERlYlN1bjBZQ3oveklsNTVpN0FESkIzcy80Tk9ySDIydFNnNklHVHFMa29oT3dYais2N2U1ZFcyZWFWaElWdWRCaFhrcGlTdVJWTEhFR1VPeU9xM1BVaVBHbURLYnNoUDJkRU1qWERUcXB2bFNFWTJQMjNpZ3dldWo1Wk0ybVh0V2x5RW8xOEpXT2FaZGQ2bEtGbi9xYUt4aEpZd2REeEg4TkVQcTQvekZuTHdSVjZ4eGZCaWw1aGR5YXZhd0dOM0hDTWV1SjNTRjJ4YzhCNjdoNU5TTkQ1MlcvNmpNVmo3WkpTOEtCcWRpak1ySjMzUlpoVzZ6THhVUW8wWENNNDNnU0xOOUtHOEE3bDBpZENOV2tra21YdWdLTFF4RnBvWjAzeUZYQVZ2ZWdSNmFLMmhSSFV4S3llTXlVYjEydW9sTTB0YzlNbz0ifV19" } }, { "ID": "88c492c3090a5d47", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "566" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQjZLMW1HVjc1L2lrcXdqYnBTSFlBZ1RrZ2NOWWh1ajdCQy95MVJXOFdDZEZGWHFPRjdpWVBOWmxVQTZ6empJVjNrNUZRczNOdUZGUlVtN3FWSS8rcEJJSlhiLzdnb1N1bDlpWWREZWJTdW4wWUN6L3pJbDU1aTdBREpCM3MvNE5PckgyMnRTZzZJR1RxTGtvaE93WGorNjdlNWRXMmVhVmhJVnVkQmhYa3BpU3VSVkxIRUdVT3lPcTNQVWlQR21ES2JzaFAyZEVNalhEVHFwdmxTRVkyUDIzaWd3ZXVqNVpNMm1YdFdseUVvMThKV09hWmRkNmxLRm4vcWFLeGhKWXdkRHhIOE5FUHE0L3pGbkx3UlY2eHhmQmlsNWhkeWF2YXdHTjNIQ01ldUozU0YyeGM4QjY3aDVOU05ENTJXLzZqTVZqN1pKUzhLQnFkaWpNckozM1JaaFc2ekx4VVFvMFhDTTQzZ1NMTjlLRzhBN2wwaWRDTldra2ttWHVnS0xReEZwb1owM3lGWEFWdmVnUjZhSzJoUkhVeEt5ZU15VWIxMnVvbE0wdGM5TW89In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0FzX2F3c190ZXN0LXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:07 GMT" ], "X-Amzn-Requestid": [ "405490e0-cae3-53f9-8845-f2d6d218680c" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "1026a8179391de20", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "195" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9JlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQW5vbmV4aXN0ZW50dG9waWMmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "259" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:07 GMT" ], "X-Amzn-Requestid": [ "0ca59de3-89ae-5883-89d4-ffd59155bec8" ] }, "Body": "PEVycm9yUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxFcnJvcj4KICAgIDxUeXBlPlNlbmRlcjwvVHlwZT4KICAgIDxDb2RlPk5vdEZvdW5kPC9Db2RlPgogICAgPE1lc3NhZ2U+VG9waWMgZG9lcyBub3QgZXhpc3Q8L01lc3NhZ2U+CiAgPC9FcnJvcj4KICA8UmVxdWVzdElkPjBjYTU5ZGUzLTg5YWUtNTg4My04OWQ0LWZmZDU5MTU1YmVjODwvUmVxdWVzdElkPgo8L0Vycm9yUmVzcG9uc2U+Cg==" } }, { "ID": "9d2eead93b78d17c", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "165" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vdXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vNDU2NzUyNjY1NTc2L25vbmV4aXN0ZW50LXN1YnNjcmlwdGlvbiJ9" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "96" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:07 GMT" ], "X-Amzn-Query-Error": [ "AWS.SimpleQueueService.NonExistentQueue;Sender" ], "X-Amzn-Requestid": [ "305cd798-7479-58bc-a5b0-b5ae6c825349" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLnNxcyNRdWV1ZURvZXNOb3RFeGlzdCIsIm1lc3NhZ2UiOiJUaGUgc3BlY2lmaWVkIHF1ZXVlIGRvZXMgbm90IGV4aXN0LiJ9" } }, { "ID": "a55866dfda9e0f44", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "166" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd0FzX2F3c190ZXN0LXRvcC0xJTNBYTczZDc4NDktY2E3Ny00NmVlLTkyYjUtNjQ5NzVjNWUyMDA2JlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:07 GMT" ], "X-Amzn-Requestid": [ "6556f658-26fc-5df5-899a-946e3e072bbe" ] }, "Body": "PFVuc3Vic2NyaWJlUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD42NTU2ZjY1OC0yNmZjLTVkZjUtODk5YS05NDZlM2UwNzJiYmU8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvVW5zdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "8c3c460c65c6b80f", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "92" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0FzX2F3c190ZXN0LXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:08 GMT" ], "X-Amzn-Requestid": [ "a93f6295-4eb4-51b4-b6b0-00a356487a41" ] }, "Body": "" } }, { "ID": "b5f570113dcd44f9", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "120" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPURlbGV0ZVRvcGljJlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQVNOU1RvcGljUmF3QXNfYXdzX3Rlc3QtdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:08 GMT" ], "X-Amzn-Requestid": [ "0a1f7591-6fed-5b66-925e-17a777110d2d" ] }, "Body": "PERlbGV0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD4wYTFmNzU5MS02ZmVkLTViNjYtOTI1ZS0xN2E3NzcxMTBkMmQ8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvRGVsZXRlVG9waWNSZXNwb25zZT4K" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSNSTopicRaw/TestAs/verify_As_returns_false_when_passed_nil.replay ================================================ { "Initial": "AQAAAA7hTg28D8BHdgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "6913021f3c35094a", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "102" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPUNyZWF0ZVRvcGljJk5hbWU9U05TVG9waWNSYXdBc192ZXJpZnlfQXNfcmV0dXJuc19mYWxzZV93aGVuX3Bhc3NlZF9uaWwtdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "366" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:08 GMT" ], "X-Amzn-Requestid": [ "cc237bb5-e8b7-52cd-b030-1983f04be362" ] }, "Body": "PENyZWF0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxDcmVhdGVUb3BpY1Jlc3VsdD4KICAgIDxUb3BpY0Fybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3QXNfdmVyaWZ5X0FzX3JldHVybnNfZmFsc2Vfd2hlbl9wYXNzZWRfbmlsLXRvcC0xPC9Ub3BpY0Fybj4KICA8L0NyZWF0ZVRvcGljUmVzdWx0PgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD5jYzIzN2JiNS1lOGI3LTUyY2QtYjAzMC0xOTgzZjA0YmUzNjI8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvQ3JlYXRlVG9waWNSZXNwb25zZT4K" } }, { "ID": "0b89daa0e2d5d333", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "75" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTTlNUb3BpY1Jhd0FzX3ZlcmlmeV9Bc19yZXR1cm5zX2ZhbHNlX3doZW5fcGFzc2VkX25pbC1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "123" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:08 GMT" ], "X-Amzn-Requestid": [ "55fdf54e-f377-5e2f-a7d6-9778eb8b7780" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0FzX3ZlcmlmeV9Bc19yZXR1cm5zX2ZhbHNlX3doZW5fcGFzc2VkX25pbC1zdWItMSJ9" } }, { "ID": "9132c1d5df4773bb", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "153" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0FzX3ZlcmlmeV9Bc19yZXR1cm5zX2ZhbHNlX3doZW5fcGFzc2VkX25pbC1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "124" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:08 GMT" ], "X-Amzn-Requestid": [ "a8017608-fca8-51ef-b0ef-143ee454a840" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY1Jhd0FzX3ZlcmlmeV9Bc19yZXR1cm5zX2ZhbHNlX3doZW5fcGFzc2VkX25pbC1zdWItMSJ9fQ==" } }, { "ID": "1aabe7c7c81a6cf9", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "532" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3QXNfdmVyaWZ5X0FzX3JldHVybnNfZmFsc2Vfd2hlbl9wYXNzZWRfbmlsLXN1Yi0xXCJcblx0XHR9XG5cdFx0XVxuXHRcdH0ifSwiUXVldWVVcmwiOiJodHRwczovL3Nxcy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS80NTY3NTI2NjU1NzYvU05TVG9waWNSYXdBc192ZXJpZnlfQXNfcmV0dXJuc19mYWxzZV93aGVuX3Bhc3NlZF9uaWwtc3ViLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:09 GMT" ], "X-Amzn-Requestid": [ "1032fc5d-ae9f-5de9-9944-9e6bb6621446" ] }, "Body": "" } }, { "ID": "ab2dd224ff907940", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "348" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVN1YnNjcmliZSZBdHRyaWJ1dGVzLmVudHJ5LjEua2V5PVJhd01lc3NhZ2VEZWxpdmVyeSZBdHRyaWJ1dGVzLmVudHJ5LjEudmFsdWU9dHJ1ZSZFbmRwb2ludD1hcm4lM0Fhd3MlM0FzcXMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd0FzX3ZlcmlmeV9Bc19yZXR1cm5zX2ZhbHNlX3doZW5fcGFzc2VkX25pbC1zdWItMSZQcm90b2NvbD1zcXMmVG9waWNBcm49YXJuJTNBYXdzJTNBc25zJTNBdXMtZWFzdC0yJTNBNDU2NzUyNjY1NTc2JTNBU05TVG9waWNSYXdBc192ZXJpZnlfQXNfcmV0dXJuc19mYWxzZV93aGVuX3Bhc3NlZF9uaWwtdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "409" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:09 GMT" ], "X-Amzn-Requestid": [ "0ef285d3-11a5-5d6a-bad1-e7e509584cc5" ] }, "Body": "PFN1YnNjcmliZVJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8U3Vic2NyaWJlUmVzdWx0PgogICAgPFN1YnNjcmlwdGlvbkFybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3QXNfdmVyaWZ5X0FzX3JldHVybnNfZmFsc2Vfd2hlbl9wYXNzZWRfbmlsLXRvcC0xOjI5M2E3ZTI3LWE3ODItNDZiMS1iYjJlLTQ1NThlNzM3YTJkYTwvU3Vic2NyaXB0aW9uQXJuPgogIDwvU3Vic2NyaWJlUmVzdWx0PgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD4wZWYyODVkMy0xMWE1LTVkNmEtYmFkMS1lN2U1MDk1ODRjYzU8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvU3Vic2NyaWJlUmVzcG9uc2U+Cg==" } }, { "ID": "9a32cd0c374f9f4f", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "239" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9eCZUb3BpY0Fybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd0FzX3ZlcmlmeV9Bc19yZXR1cm5zX2ZhbHNlX3doZW5fcGFzc2VkX25pbC10b3AtMSZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:09 GMT" ], "X-Amzn-Requestid": [ "b2ba7b79-e4cc-58fe-ba8c-194ffc318951" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPmFhZjAyOGZjLTA3ODItNWRkMi05NDViLTRhY2ExZjdmNmM3ZDwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPmIyYmE3Yjc5LWU0Y2MtNThmZS1iYThjLTE5NGZmYzMxODk1MTwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "ca4c6d1501448a6a", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "204" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0FzX3ZlcmlmeV9Bc19yZXR1cm5zX2ZhbHNlX3doZW5fcGFzc2VkX25pbC1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "797" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:09 GMT" ], "X-Amzn-Requestid": [ "44db08bf-5fdc-5e51-a2d2-6a894721f7fe" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjY5NDU0IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNjk0MTQifSwiQm9keSI6IngiLCJNRDVPZkJvZHkiOiI5ZGQ0ZTQ2MTI2OGM4MDM0ZjVjODU2NGUxNTVjNjdhNiIsIk1lc3NhZ2VJZCI6ImVjNGJmZWRjLWI0YTktNDJlNi1hYzliLThhZmNjNzNiNmIyZCIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCNGgwMjVBWUh1a0dqbURtYlpsVFpvaTdsZllvSnhRQ2xsQnV2a3hKUmRrNklsb2d5NEtYVzhRNXM4MlF3ZGtXQjBXMmVQd3ZGVGNuQkNGMzBDc2c5dFR6eG1BdCtEWGxkd1dvMmtNck51Q0Y2c0Z6TzZ6THFzSXhGRWhYamU2R2x5a0NOUk5HRGtGRWpTcnFXcHNzcE9NcnRMd0RQKzFncXdlVzJCR1U3M3hwQzhMT05JTi9zcTRiU1VxOS96QjQ5VXorTmVSTkFnMTJrdjBpMlNHWTFoTDFhSVhPUTFDaEY3VHpIQVBUcldBc3hvNU9rcUFrdnlrMW8rS0ZzTEpJOXVESHl5ZThWZXU4d3RFL2lVL0NWQzFONWpYdUtib3EzZHZ3ZWdtZitDVS9SQzlIU2F1UWZoUDY0RGJaalB0bjhyeG52UEtMQ052TGxkcWRlRU5UQnBaRTR3OWVNTUZzR2h6V3BXRE00OXlzYWlJY3paVk51VytFMDVwT2R6UUkrVkh5bndtWUNpTnMrM0FqcGd0ZjZnUXJTRjBTaDBEcjh6OWdBZU1TaEtzMGcxK2F5YVhOblUwWDdtMXpZNkZFaEpOUldHRld0UEtBOURLRW50UzFyMmc9PSJ9XX0=" } }, { "ID": "a06d362b35214444", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "195" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9JlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQW5vbmV4aXN0ZW50dG9waWMmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "259" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:09 GMT" ], "X-Amzn-Requestid": [ "8ca3212a-4c1c-5d4e-95ef-431c54e16ce1" ] }, "Body": "PEVycm9yUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxFcnJvcj4KICAgIDxUeXBlPlNlbmRlcjwvVHlwZT4KICAgIDxDb2RlPk5vdEZvdW5kPC9Db2RlPgogICAgPE1lc3NhZ2U+VG9waWMgZG9lcyBub3QgZXhpc3Q8L01lc3NhZ2U+CiAgPC9FcnJvcj4KICA8UmVxdWVzdElkPjhjYTMyMTJhLTRjMWMtNWQ0ZS05NWVmLTQzMWM1NGUxNmNlMTwvUmVxdWVzdElkPgo8L0Vycm9yUmVzcG9uc2U+Cg==" } }, { "ID": "43c97a79b73c5091", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "641" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQjRoMDI1QVlIdWtHam1EbWJabFRab2k3bGZZb0p4UUNsbEJ1dmt4SlJkazZJbG9neTRLWFc4UTVzODJRd2RrV0IwVzJlUHd2RlRjbkJDRjMwQ3NnOXRUenhtQXQrRFhsZHdXbzJrTXJOdUNGNnNGek82ekxxc0l4RkVoWGplNkdseWtDTlJOR0RrRkVqU3JxV3Bzc3BPTXJ0THdEUCsxZ3F3ZVcyQkdVNzN4cEM4TE9OSU4vc3E0YlNVcTkvekI0OVV6K05lUk5BZzEya3YwaTJTR1kxaEwxYUlYT1ExQ2hGN1R6SEFQVHJXQXN4bzVPa3FBa3Z5azFvK0tGc0xKSTl1REh5eWU4VmV1OHd0RS9pVS9DVkMxTjVqWHVLYm9xM2R2d2VnbWYrQ1UvUkM5SFNhdVFmaFA2NERiWmpQdG44cnhudlBLTENOdkxsZHFkZUVOVEJwWkU0dzllTU1Gc0doeldwV0RNNDl5c2FpSWN6WlZOdVcrRTA1cE9kelFJK1ZIeW53bVlDaU5zKzNBanBndGY2Z1FyU0YwU2gwRHI4ejlnQWVNU2hLczBnMStheWFYTm5VMFg3bTF6WTZGRWhKTlJXR0ZXdFBLQTlES0VudFMxcjJnPT0ifV0sIlF1ZXVlVXJsIjoiaHR0cHM6Ly9zcXMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vNDU2NzUyNjY1NTc2L1NOU1RvcGljUmF3QXNfdmVyaWZ5X0FzX3JldHVybnNfZmFsc2Vfd2hlbl9wYXNzZWRfbmlsLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:09 GMT" ], "X-Amzn-Requestid": [ "e930401b-9e51-59de-b360-222d86ac2071" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "dcd803644c472738", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "165" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vdXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vNDU2NzUyNjY1NTc2L25vbmV4aXN0ZW50LXN1YnNjcmlwdGlvbiJ9" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "96" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:09 GMT" ], "X-Amzn-Query-Error": [ "AWS.SimpleQueueService.NonExistentQueue;Sender" ], "X-Amzn-Requestid": [ "09142bc7-9110-5f4d-be67-49f189ed36e2" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLnNxcyNRdWV1ZURvZXNOb3RFeGlzdCIsIm1lc3NhZ2UiOiJUaGUgc3BlY2lmaWVkIHF1ZXVlIGRvZXMgbm90IGV4aXN0LiJ9" } }, { "ID": "5332c5bca68160a0", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "197" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd0FzX3ZlcmlmeV9Bc19yZXR1cm5zX2ZhbHNlX3doZW5fcGFzc2VkX25pbC10b3AtMSUzQTI5M2E3ZTI3LWE3ODItNDZiMS1iYjJlLTQ1NThlNzM3YTJkYSZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:09 GMT" ], "X-Amzn-Requestid": [ "c127deb9-4f27-5524-a379-bc8f57da148b" ] }, "Body": "PFVuc3Vic2NyaWJlUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD5jMTI3ZGViOS00ZjI3LTU1MjQtYTM3OS1iYzhmNTdkYTE0OGI8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvVW5zdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "a1d3e51f8cc44bc9", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "123" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0FzX3ZlcmlmeV9Bc19yZXR1cm5zX2ZhbHNlX3doZW5fcGFzc2VkX25pbC1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:09 GMT" ], "X-Amzn-Requestid": [ "dcdfedb5-51a8-5b33-bb5d-8f834955f29c" ] }, "Body": "" } }, { "ID": "69200afb743e7faf", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "151" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPURlbGV0ZVRvcGljJlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQVNOU1RvcGljUmF3QXNfdmVyaWZ5X0FzX3JldHVybnNfZmFsc2Vfd2hlbl9wYXNzZWRfbmlsLXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:09 GMT" ], "X-Amzn-Requestid": [ "b7c8a487-4b5a-5e4e-941e-c6b153a70fe1" ] }, "Body": "PERlbGV0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD5iN2M4YTQ4Ny00YjVhLTVlNGUtOTQxZS1jNmIxNTNhNzBmZTE8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvRGVsZXRlVG9waWNSZXNwb25zZT4K" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSNSTopicRaw/TestBatching.replay ================================================ { "Initial": "AQAAAA7hTg2tLtjMKwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "617b1da1700e72dd", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "68" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPUNyZWF0ZVRvcGljJk5hbWU9U05TVG9waWNSYXdCYXRjaGluZy10b3AtMSZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "332" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:54 GMT" ], "X-Amzn-Requestid": [ "5d991f84-7021-55fd-873e-7db268cfee73" ] }, "Body": "PENyZWF0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxDcmVhdGVUb3BpY1Jlc3VsdD4KICAgIDxUb3BpY0Fybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3QmF0Y2hpbmctdG9wLTE8L1RvcGljQXJuPgogIDwvQ3JlYXRlVG9waWNSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjVkOTkxZjg0LTcwMjEtNTVmZC04NzNlLTdkYjI2OGNmZWU3MzwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9DcmVhdGVUb3BpY1Jlc3BvbnNlPgo=" } }, { "ID": "07c5957b5f3576f4", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "41" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTTlNUb3BpY1Jhd0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "89" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:54 GMT" ], "X-Amzn-Requestid": [ "8cef8a00-1fac-51bf-aa84-e8360742804d" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0JhdGNoaW5nLXN1Yi0xIn0=" } }, { "ID": "c1f57f888604809e", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "119" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "90" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:54 GMT" ], "X-Amzn-Requestid": [ "a0214fdf-4836-55a3-9e34-2de950d8b451" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY1Jhd0JhdGNoaW5nLXN1Yi0xIn19" } }, { "ID": "1b24af2ba4046acd", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "464" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3QmF0Y2hpbmctc3ViLTFcIlxuXHRcdH1cblx0XHRdXG5cdFx0fSJ9LCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:54 GMT" ], "X-Amzn-Requestid": [ "a9fef604-cb9a-5be3-a441-9432d3747a11" ] }, "Body": "" } }, { "ID": "ecb84fba42fd0599", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "280" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVN1YnNjcmliZSZBdHRyaWJ1dGVzLmVudHJ5LjEua2V5PVJhd01lc3NhZ2VEZWxpdmVyeSZBdHRyaWJ1dGVzLmVudHJ5LjEudmFsdWU9dHJ1ZSZFbmRwb2ludD1hcm4lM0Fhd3MlM0FzcXMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd0JhdGNoaW5nLXN1Yi0xJlByb3RvY29sPXNxcyZUb3BpY0Fybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd0JhdGNoaW5nLXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "375" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:54 GMT" ], "X-Amzn-Requestid": [ "209df884-30a5-53f2-b857-9ab2284bb87c" ] }, "Body": "PFN1YnNjcmliZVJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8U3Vic2NyaWJlUmVzdWx0PgogICAgPFN1YnNjcmlwdGlvbkFybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3QmF0Y2hpbmctdG9wLTE6NzE5N2QxNTYtMmQ1MC00YmExLWE3NjYtNzEwOTBlZDRhYzg5PC9TdWJzY3JpcHRpb25Bcm4+CiAgPC9TdWJzY3JpYmVSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjIwOWRmODg0LTMwYTUtNTNmMi1iODU3LTlhYjIyODRiYjg3YzwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9TdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "ca661149bc8ca948", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "700" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9aGVsbG8rd29ybGQmUHVibGlzaEJhdGNoUmVxdWVzdEVudHJpZXMubWVtYmVyLjIuSWQ9MSZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMi5NZXNzYWdlPWhlbGxvK3dvcmxkJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4zLklkPTImUHVibGlzaEJhdGNoUmVxdWVzdEVudHJpZXMubWVtYmVyLjMuTWVzc2FnZT1oZWxsbyt3b3JsZCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuNC5JZD0zJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci40Lk1lc3NhZ2U9aGVsbG8rd29ybGQmUHVibGlzaEJhdGNoUmVxdWVzdEVudHJpZXMubWVtYmVyLjUuSWQ9NCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuNS5NZXNzYWdlPWhlbGxvK3dvcmxkJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci42LklkPTUmUHVibGlzaEJhdGNoUmVxdWVzdEVudHJpZXMubWVtYmVyLjYuTWVzc2FnZT1oZWxsbyt3b3JsZCZUb3BpY0Fybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd0JhdGNoaW5nLXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1007" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:55 GMT" ], "X-Amzn-Requestid": [ "92348ec7-ff5b-57b0-85aa-ecf1e7b5cc3e" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPjM2NTIxODExLThmNDQtNTg0Ny1hYjhhLTdhMjc5N2FhNTNjOTwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICAgIDxtZW1iZXI+CiAgICAgICAgPE1lc3NhZ2VJZD45NWZmMWJjMy1lZDk2LTVkZTktYjI1OS03OWY1ZjU3ODE2Njc8L01lc3NhZ2VJZD4KICAgICAgICA8SWQ+MTwvSWQ+CiAgICAgIDwvbWVtYmVyPgogICAgICA8bWVtYmVyPgogICAgICAgIDxNZXNzYWdlSWQ+OWU0ZGEwYzYtOTdjNS01Yzg5LWJmODEtYzJmMDhmMmIzNzA3PC9NZXNzYWdlSWQ+CiAgICAgICAgPElkPjI8L0lkPgogICAgICA8L21lbWJlcj4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPjM3ZTUwZTYyLThmZTQtNTkwMy1iNDk3LTZjNTQ5NzBhOTI4ZDwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4zPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICAgIDxtZW1iZXI+CiAgICAgICAgPE1lc3NhZ2VJZD40ZTFiZjZmOC1hYmE1LTViM2ItOTYzMi05NGNlYjM0YjcwYjU8L01lc3NhZ2VJZD4KICAgICAgICA8SWQ+NDwvSWQ+CiAgICAgIDwvbWVtYmVyPgogICAgICA8bWVtYmVyPgogICAgICAgIDxNZXNzYWdlSWQ+ZGFkN2Q5OWQtYzg1Yi01YmU2LWJiMDctYmJhYmQwYjVkMDY4PC9NZXNzYWdlSWQ+CiAgICAgICAgPElkPjU8L0lkPgogICAgICA8L21lbWJlcj4KICAgIDwvU3VjY2Vzc2Z1bD4KICA8L1B1Ymxpc2hCYXRjaFJlc3VsdD4KICA8UmVzcG9uc2VNZXRhZGF0YT4KICAgIDxSZXF1ZXN0SWQ+OTIzNDhlYzctZmY1Yi01N2IwLTg1YWEtZWNmMWU3YjVjYzNlPC9SZXF1ZXN0SWQ+CiAgPC9SZXNwb25zZU1ldGFkYXRhPgo8L1B1Ymxpc2hCYXRjaFJlc3BvbnNlPgo=" } }, { "ID": "6904627ed7f9a753", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "700" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9aGVsbG8rd29ybGQmUHVibGlzaEJhdGNoUmVxdWVzdEVudHJpZXMubWVtYmVyLjIuSWQ9MSZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMi5NZXNzYWdlPWhlbGxvK3dvcmxkJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4zLklkPTImUHVibGlzaEJhdGNoUmVxdWVzdEVudHJpZXMubWVtYmVyLjMuTWVzc2FnZT1oZWxsbyt3b3JsZCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuNC5JZD0zJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci40Lk1lc3NhZ2U9aGVsbG8rd29ybGQmUHVibGlzaEJhdGNoUmVxdWVzdEVudHJpZXMubWVtYmVyLjUuSWQ9NCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuNS5NZXNzYWdlPWhlbGxvK3dvcmxkJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci42LklkPTUmUHVibGlzaEJhdGNoUmVxdWVzdEVudHJpZXMubWVtYmVyLjYuTWVzc2FnZT1oZWxsbyt3b3JsZCZUb3BpY0Fybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd0JhdGNoaW5nLXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1007" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:55 GMT" ], "X-Amzn-Requestid": [ "a6cac920-c0f7-587f-b68a-ab16d81873f1" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPjA1MGFjOWYxLTE3MDItNTAzMS1iYTE3LWFiYzcwZmVkNmJiZjwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICAgIDxtZW1iZXI+CiAgICAgICAgPE1lc3NhZ2VJZD42YjVhYTBiZi1iNTNiLTViMTYtODYwYi1jMjg5YWRkNDgwOTg8L01lc3NhZ2VJZD4KICAgICAgICA8SWQ+MTwvSWQ+CiAgICAgIDwvbWVtYmVyPgogICAgICA8bWVtYmVyPgogICAgICAgIDxNZXNzYWdlSWQ+OTBlYmQyZTItZDdkZi01M2ZkLWIxNjMtYjBkNGNmMzA5ODczPC9NZXNzYWdlSWQ+CiAgICAgICAgPElkPjI8L0lkPgogICAgICA8L21lbWJlcj4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPjg0YzkyYzI3LTA4N2MtNTcyNi04NDA0LTRlMTExMDkzOWNhODwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4zPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICAgIDxtZW1iZXI+CiAgICAgICAgPE1lc3NhZ2VJZD4yZDQyODcwOS0zZDgxLTVmMTMtOWQyZC1lNTNmMjU2ZWM0OWQ8L01lc3NhZ2VJZD4KICAgICAgICA8SWQ+NDwvSWQ+CiAgICAgIDwvbWVtYmVyPgogICAgICA8bWVtYmVyPgogICAgICAgIDxNZXNzYWdlSWQ+MTJjN2IzMzAtZTczNi01OWM5LTk3N2UtZDEwNmZmZDkwMjQ3PC9NZXNzYWdlSWQ+CiAgICAgICAgPElkPjU8L0lkPgogICAgICA8L21lbWJlcj4KICAgIDwvU3VjY2Vzc2Z1bD4KICA8L1B1Ymxpc2hCYXRjaFJlc3VsdD4KICA8UmVzcG9uc2VNZXRhZGF0YT4KICAgIDxSZXF1ZXN0SWQ+YTZjYWM5MjAtYzBmNy01ODdmLWI2OGEtYWIxNmQ4MTg3M2YxPC9SZXF1ZXN0SWQ+CiAgPC9SZXNwb25zZU1ldGFkYXRhPgo8L1B1Ymxpc2hCYXRjaFJlc3BvbnNlPgo=" } }, { "ID": "4cf4ab6f59ebebd3", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "170" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "763" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:55 GMT" ], "X-Amzn-Requestid": [ "14332cf4-d272-5f22-930e-4ec2ca9d4ed0" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjU1MTU1IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNTUxMDMifSwiQm9keSI6ImhlbGxvIHdvcmxkIiwiTUQ1T2ZCb2R5IjoiNWViNjNiYmJlMDFlZWVkMDkzY2IyMmJiOGY1YWNkYzMiLCJNZXNzYWdlSWQiOiI3MjU1NmJmOS04YzA2LTQxNDYtOWQwOS05NjlmNDc0OGU5NmYiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQlZnNTI0R0tsdyt5UTlyRWk5WjRqdUZHbkRtV25pMEdsWnA4VzdySXBUVWZsaU1HSXZKdU9SaDIzQlYyT0VJRGN2QzF5encwcjZUbFY5SmtXVEJxcTh3bU9VRWYzL1RXWUpqRWt1TnU0OWN3YXJTNzZpUkRJaE5iY2RJTGZHaDN0cUpOZVcyZVoyOUhHamtzNW55eXJuM2N1ZW9jOUxRcnZzcHFaSUpWdWR4eWoydTB1bzgxZEtQT2JNanpJWE1jTXdVWFdSZnhvM0FyRk9yajltRmQyR29NckhzMytxMitvVytGQnRnSHlueEJBTUtQN2RpcGU5UkFnRGpHRUIvczdsYWdiSngzcFNSa1VjL25FOE9SeXFZREE2UjJJNGZ2VEJRR2dOS1o0TVo3SmZ1YWdaQWZMMjNLTXJhc01JT3NBditNN2IwQlNjY1BFRjNCL2RBN0FQdW5ubmxYMGhEWDcxUUExTjFZVCtvVC8zc0lxcXlOdktrQ2FrVVdsUS9VTGVBR2FnajJOblpzaFJST2dwZVRCUlFxdjNVUzdqREFRRmM2bFBrYXVndkk9In1dfQ==" } }, { "ID": "4b0de20d073ff3e7", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "170" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "763" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:55 GMT" ], "X-Amzn-Requestid": [ "6a1a328a-c665-54b4-abd8-50bcde8ab546" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjU1MjIzIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNTUwMzAifSwiQm9keSI6ImhlbGxvIHdvcmxkIiwiTUQ1T2ZCb2R5IjoiNWViNjNiYmJlMDFlZWVkMDkzY2IyMmJiOGY1YWNkYzMiLCJNZXNzYWdlSWQiOiIyMGQyYmUxYS1hZmQ3LTQ2ODYtODlkOC02ZDgwNzhlZDVjMTgiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQnVkd3o4TVhqQ3NpeEwvVkRZVFJLS0lpMmRkSmluMi96WHRISUtxSDdoeEl3NUU4WVp5WTlocU9yT0dLa2ZDSDBBV1BqNFUyNCtDUjcySDNXaW9DSXNtOW1wOUtScDhyZHNSTUF5M0o5bTFqbWJzNzJOWFFrMGp5MldBR2FId3VlUnZmYWpINTMxNm1JVUN1QUlBbDBPWVNSUkVKdldBWU5LVlp1Wk53QU1zT3NPSG9taXA2RWFxR2ZjNW15U3hFRmlhSEROdDZBOXB6ZVp5U2FpZzIrZnljUE9Sek1PU0g2SnFOMmNPaUFSRkhqeGNKYWpGc29ITWM4VVo4eWRwTTczTFgvME54elVPWG1tT3hzMWI0RForTG9BSExWWjFBamRPaXd0T1RDMkxsbWgzNGxzandUa1M1ZlVtVkNGWW5LV0hDV3VzTWQ5bWpoYjFmemhUYXExRWdHMGV0cnptRURwdEZ2dFRuQmlGMmlUOGJpNWhabm96eTJ2YS96cks5UW96WFBhZVVwTlhpQ2NQY3hMOU5DaHlucWlJQmdKRjkxTmZZcms2L2M3THc9In1dfQ==" } }, { "ID": "5d1fc061f827959e", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "170" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "763" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:55 GMT" ], "X-Amzn-Requestid": [ "a6359456-d587-58e9-b98b-f660cd68391b" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjU1MjkxIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNTUwMzUifSwiQm9keSI6ImhlbGxvIHdvcmxkIiwiTUQ1T2ZCb2R5IjoiNWViNjNiYmJlMDFlZWVkMDkzY2IyMmJiOGY1YWNkYzMiLCJNZXNzYWdlSWQiOiJmZGRmNTUyNC0wNjUyLTRhY2YtYTBlMS0xZDBlZGFkNmU5MGUiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQnBTVDZEZjBKeXVuK0VvMnFKMzllUmVZMmVBWGd6WHRzS2lTSEN0QlYwaDJiUUE1VmFVanFnUWUvUUtEaXp5VkFSWjNqTmRqd1I4aDRidHlDeTR2Z0xhdUdYcXhKWlFpKzVtNm5zUzJENVlBYU9pVHBvMHRkS3pIdnMwWDNTZHdNMlV6RnQrV1FGY1lHWG52NnY1RHQzSkhjMjkvVWpTTkY3bEtUTVYwK0Fxb1dadE03RFZNcDE5MEx6ak8vakhhWmIwR0NWVzUvQWtzN0swc3BYYnIzNDdnRkZWNFgvMGtNRjFkdmYwVlliODEyS1lVcDZSSGh6R3QzWkVHZWFwQmdaZ1FLcGdFN3gwWEw2SjNWUUErQ1ZWL0ZEUkZYVlRqaDZ2RXhaT3FUZ21xa08ybHBmWktOREl1ZTNLeEpXY3pJRkdVbzQrV2h4UndrNlkyRGpGblVtRjJXRmhKTXVyaG5GS0FPTU9LUGVKc3JDaFoyRXhDc2NVczNKT2V0SEp1MU85SzBKdVUvM3BlR2tRNFhVU3VLK0lWQW4yQkJZV0FEcEkvdUpjclYrb1U9In1dfQ==" } }, { "ID": "fda81aaabdc06906", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "170" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "763" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:55 GMT" ], "X-Amzn-Requestid": [ "6edd8045-fc54-5429-a151-e273e4bb05db" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjU1MzU4IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNTUwMzAifSwiQm9keSI6ImhlbGxvIHdvcmxkIiwiTUQ1T2ZCb2R5IjoiNWViNjNiYmJlMDFlZWVkMDkzY2IyMmJiOGY1YWNkYzMiLCJNZXNzYWdlSWQiOiJjNWM2ZjYzOC02NTM2LTQ1YjQtOWQ5NC05NTY5OThmYTdkMjMiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQnJrY0pqTnMyUEZpeTB1b09UdkNFMHY4OXNzRnhNWmZEVkxmR0RyVUg5d290ZnE5bGVXR2wrR01leXdRRGZLL3lKbHJKd0gzK2ZmeUxLdlhwWS9jd09sbGwwR2MrYVFnYnNtTVRrS1N2NFFJRFgySlRQc3RHZXEvRnBzSGZmSURsc3dKc2RXSzdtTFphaHZ2UkVSc1hMSU5Eem12dDlWeEZLSjhFeU9GdjZkZnp2V20zWFhuQVdBM2FKdEZQZkJoVS9UYng2WkpRRUx6VG40MlhpeDVFbUl6Sm51MHhmV2RFMm5nenJCd0I0b0s4b2dJd21lZUhWRkthWUlZSno4b0lvZWpEV3JZZGxKZWpBY1dFWkZnbjJYREVSRklaRTc4UE5sN3JnbTVTT1FWSlpMRlBhSnIrdFAvOVNQR1dnVEs1R1dLZVRrODQ2NUs2TEQvSTQ4cC9zL29LQ1Flajl2MUJjb0lTbXoveTZQSHI3VUZiVkZYcHpTWVJST0Z2cGw3T1N6b3JPRmNBS1BrSUZkQU5GNE1tdW56dDRPUC9EbFMrdnhtL0NzNFZHanc9In1dfQ==" } }, { "ID": "31dd12590a3b363e", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "170" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "763" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:55 GMT" ], "X-Amzn-Requestid": [ "0061f1e2-9186-54a6-85a7-93d48969c554" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjU1NDI1IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNTUxMDQifSwiQm9keSI6ImhlbGxvIHdvcmxkIiwiTUQ1T2ZCb2R5IjoiNWViNjNiYmJlMDFlZWVkMDkzY2IyMmJiOGY1YWNkYzMiLCJNZXNzYWdlSWQiOiJhNWE5MDUwZi1iZWMzLTQ0OTYtOTFkZC0wMGM4NWVjMDRiYjgiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQkZXRWVhTnF6dndTbElJcVV3TkYrT25XbVdTYW5WTURtd0hmM290c3RqUms0RG02SDRZcmw1VElTbXlxQkRSejAwOUloVGNLQ3dtTmZNTGQ5MmRvTzMwOFNDR2NjQVFvNllxdnpVNisyeHRweXN1UlpadFRyUGZBN0xrU3Qyb1o2TUdPaVlqbldaY2Z5VW5ENUw1dmE1RytINTd5eHFOcnV4ZDRPek1JcVNJREI1bTVwc1d6bUQySTNHZ0YwMU82QnFoVjlPWXFtWUFNcThIclAySGszaE9NNS9aTzlmbWRQVUNrSlg3bFNjN1hNcGFkQ2lJRnhSSk5URjFOTkhQTDVNWmsvRW54T0hVUWxTTnFTWWhCdjVIZWZZZ1VsREVlY1dRN1RWV05LSXlvQmc3M0FjQnA2a2o1bGNNVnIwRVZoTmtZMlViSkJHajkwcy9oWERwWXpQUnZPMzNCRnN4ajRKUjR5QmVJQlk3NlJ4WndoWHR0UnVZdENSM2FZejRzckFRTmZOV2tQcTdGNzArMmd0RVBTL0Y4SkZETml3V3Vrdkt3eU5FNWxFSXM9In1dfQ==" } }, { "ID": "0fb49c1924c46035", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "170" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "763" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:55 GMT" ], "X-Amzn-Requestid": [ "fdcc2857-c7ad-5209-8c81-4a61df42d3fb" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjU1NDkyIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNTUwMzMifSwiQm9keSI6ImhlbGxvIHdvcmxkIiwiTUQ1T2ZCb2R5IjoiNWViNjNiYmJlMDFlZWVkMDkzY2IyMmJiOGY1YWNkYzMiLCJNZXNzYWdlSWQiOiI4YWQxNGQ0YS1mNGVkLTRmMDAtYTIyMS1lNmVmZTRjYzM4ZTAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQmo4NlFuTi9DVUpnVys4b0lQb09CcndXci9SbUxBVG5ya0hidWU1RE1YL2MzU3FOK1JrZ0VrZXlvWXJCU1ZaeU00Um5RVS8zSXJvd3JCRjBZNjZoK241K0lPenFPY0pkV294amoveE03YkdVK0V4djhINDZwTUhSeUxHTS9ZYVlJcDBoN08rZUt2dUFFTzVKSEh4L3lJZVpkVlVNNU5valJVdHBBOFRiaTY0KzVTYjZPTy9oaU5uSjYwRm0wK2gzL1hYS2JmVWVXSFZyQm5VZUtMak5WUUhXYXJTZ2lzaXloQXVlbllSZlh3MFYzV1dzR2o0WGM1TFpEQ3hwODNXRUJ4ODl5LytNZXdqQkZEbklaYWRzNmF5bmw1a0s2ZHlaSmIxenM3N3NzRERqOW5VMEhxcFpFVzJMK0I5U2haeWRPUWZ5bW1wSkVzdUMweXBabHowNzFDMGFFelV3eG1ISnZybndzKzdqTG5oWGtkZTBDdUsyd3FOZXo0M2xtL0l0U3dtMHlma0J0OW1oYXd5K05aTVVyMTRITDZScGp2NTNLWnozZTVReml0ZVk9In1dfQ==" } }, { "ID": "b8a0c10d5f9620e6", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "170" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "763" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:55 GMT" ], "X-Amzn-Requestid": [ "d1c0523e-e112-556c-a9ea-3008f9fd349e" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjU1NTYwIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNTUxMTMifSwiQm9keSI6ImhlbGxvIHdvcmxkIiwiTUQ1T2ZCb2R5IjoiNWViNjNiYmJlMDFlZWVkMDkzY2IyMmJiOGY1YWNkYzMiLCJNZXNzYWdlSWQiOiI3OWU2YzVkYi03OTczLTQ0OGItYjg0MS1mYzU2ZDcxY2IxZTIiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQmZoa29iaWpYLzJQQnNMRFpoWmsySXB3Zmk5SHNUNFFySU90aHBRN29yYkVpTmZQS0pnNTFGNkFEMEhZQVhIVkcyYTRMSG5YZUgzWFIvcEtVajhnallzOFEvZFovazNkV3R3amRJcjNoKytzcmh3U0NMbEo1cUUxajhXd1BVRXN6OXh6MkNMenhpOUVZTHNzVFUwT1ZjNWNPWHFqcWhGR1VEcjFxa1hqQjI0b3ZMaFF2OGxldlk0ZmFNZ2NmNGRMc2dnWTg4YWcwRmJqQzZiTTR0Y0haUkgvamxiZGMxQy85NzVXdm9SMGZ2SDhKUW5EQ3YyemlIZEJHT3M5azhub1ZuUWl2Q3pPUDlzWU5PK1NSaitNOE5iRmcvZVJtditqblNNQ1NiOWszeE0vUFNJeWVGOHlEb0RUanBINDB4SExnVTFISytEZ2twc3BIZGF0MEd1OWpwZWR1KzVCbkFldUU0Z2l6QU9iSFlxdUJsR3FhTVdLSDZ1ek5kK1IzMHJ1N3FQMG5xSWV5YnlPcTVNWmx4Y0U5ZnNqOW4rdUhJVVp6T2RtNjB1QmxSVXc9In1dfQ==" } }, { "ID": "f6c574c5ced8ea3e", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "2873" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQlZnNTI0R0tsdyt5UTlyRWk5WjRqdUZHbkRtV25pMEdsWnA4VzdySXBUVWZsaU1HSXZKdU9SaDIzQlYyT0VJRGN2QzF5encwcjZUbFY5SmtXVEJxcTh3bU9VRWYzL1RXWUpqRWt1TnU0OWN3YXJTNzZpUkRJaE5iY2RJTGZHaDN0cUpOZVcyZVoyOUhHamtzNW55eXJuM2N1ZW9jOUxRcnZzcHFaSUpWdWR4eWoydTB1bzgxZEtQT2JNanpJWE1jTXdVWFdSZnhvM0FyRk9yajltRmQyR29NckhzMytxMitvVytGQnRnSHlueEJBTUtQN2RpcGU5UkFnRGpHRUIvczdsYWdiSngzcFNSa1VjL25FOE9SeXFZREE2UjJJNGZ2VEJRR2dOS1o0TVo3SmZ1YWdaQWZMMjNLTXJhc01JT3NBditNN2IwQlNjY1BFRjNCL2RBN0FQdW5ubmxYMGhEWDcxUUExTjFZVCtvVC8zc0lxcXlOdktrQ2FrVVdsUS9VTGVBR2FnajJOblpzaFJST2dwZVRCUlFxdjNVUzdqREFRRmM2bFBrYXVndkk9In0seyJJZCI6IjEiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQnVkd3o4TVhqQ3NpeEwvVkRZVFJLS0lpMmRkSmluMi96WHRISUtxSDdoeEl3NUU4WVp5WTlocU9yT0dLa2ZDSDBBV1BqNFUyNCtDUjcySDNXaW9DSXNtOW1wOUtScDhyZHNSTUF5M0o5bTFqbWJzNzJOWFFrMGp5MldBR2FId3VlUnZmYWpINTMxNm1JVUN1QUlBbDBPWVNSUkVKdldBWU5LVlp1Wk53QU1zT3NPSG9taXA2RWFxR2ZjNW15U3hFRmlhSEROdDZBOXB6ZVp5U2FpZzIrZnljUE9Sek1PU0g2SnFOMmNPaUFSRkhqeGNKYWpGc29ITWM4VVo4eWRwTTczTFgvME54elVPWG1tT3hzMWI0RForTG9BSExWWjFBamRPaXd0T1RDMkxsbWgzNGxzandUa1M1ZlVtVkNGWW5LV0hDV3VzTWQ5bWpoYjFmemhUYXExRWdHMGV0cnptRURwdEZ2dFRuQmlGMmlUOGJpNWhabm96eTJ2YS96cks5UW96WFBhZVVwTlhpQ2NQY3hMOU5DaHlucWlJQmdKRjkxTmZZcms2L2M3THc9In0seyJJZCI6IjIiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQnBTVDZEZjBKeXVuK0VvMnFKMzllUmVZMmVBWGd6WHRzS2lTSEN0QlYwaDJiUUE1VmFVanFnUWUvUUtEaXp5VkFSWjNqTmRqd1I4aDRidHlDeTR2Z0xhdUdYcXhKWlFpKzVtNm5zUzJENVlBYU9pVHBvMHRkS3pIdnMwWDNTZHdNMlV6RnQrV1FGY1lHWG52NnY1RHQzSkhjMjkvVWpTTkY3bEtUTVYwK0Fxb1dadE03RFZNcDE5MEx6ak8vakhhWmIwR0NWVzUvQWtzN0swc3BYYnIzNDdnRkZWNFgvMGtNRjFkdmYwVlliODEyS1lVcDZSSGh6R3QzWkVHZWFwQmdaZ1FLcGdFN3gwWEw2SjNWUUErQ1ZWL0ZEUkZYVlRqaDZ2RXhaT3FUZ21xa08ybHBmWktOREl1ZTNLeEpXY3pJRkdVbzQrV2h4UndrNlkyRGpGblVtRjJXRmhKTXVyaG5GS0FPTU9LUGVKc3JDaFoyRXhDc2NVczNKT2V0SEp1MU85SzBKdVUvM3BlR2tRNFhVU3VLK0lWQW4yQkJZV0FEcEkvdUpjclYrb1U9In0seyJJZCI6IjMiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQnJrY0pqTnMyUEZpeTB1b09UdkNFMHY4OXNzRnhNWmZEVkxmR0RyVUg5d290ZnE5bGVXR2wrR01leXdRRGZLL3lKbHJKd0gzK2ZmeUxLdlhwWS9jd09sbGwwR2MrYVFnYnNtTVRrS1N2NFFJRFgySlRQc3RHZXEvRnBzSGZmSURsc3dKc2RXSzdtTFphaHZ2UkVSc1hMSU5Eem12dDlWeEZLSjhFeU9GdjZkZnp2V20zWFhuQVdBM2FKdEZQZkJoVS9UYng2WkpRRUx6VG40MlhpeDVFbUl6Sm51MHhmV2RFMm5nenJCd0I0b0s4b2dJd21lZUhWRkthWUlZSno4b0lvZWpEV3JZZGxKZWpBY1dFWkZnbjJYREVSRklaRTc4UE5sN3JnbTVTT1FWSlpMRlBhSnIrdFAvOVNQR1dnVEs1R1dLZVRrODQ2NUs2TEQvSTQ4cC9zL29LQ1Flajl2MUJjb0lTbXoveTZQSHI3VUZiVkZYcHpTWVJST0Z2cGw3T1N6b3JPRmNBS1BrSUZkQU5GNE1tdW56dDRPUC9EbFMrdnhtL0NzNFZHanc9In0seyJJZCI6IjQiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQkZXRWVhTnF6dndTbElJcVV3TkYrT25XbVdTYW5WTURtd0hmM290c3RqUms0RG02SDRZcmw1VElTbXlxQkRSejAwOUloVGNLQ3dtTmZNTGQ5MmRvTzMwOFNDR2NjQVFvNllxdnpVNisyeHRweXN1UlpadFRyUGZBN0xrU3Qyb1o2TUdPaVlqbldaY2Z5VW5ENUw1dmE1RytINTd5eHFOcnV4ZDRPek1JcVNJREI1bTVwc1d6bUQySTNHZ0YwMU82QnFoVjlPWXFtWUFNcThIclAySGszaE9NNS9aTzlmbWRQVUNrSlg3bFNjN1hNcGFkQ2lJRnhSSk5URjFOTkhQTDVNWmsvRW54T0hVUWxTTnFTWWhCdjVIZWZZZ1VsREVlY1dRN1RWV05LSXlvQmc3M0FjQnA2a2o1bGNNVnIwRVZoTmtZMlViSkJHajkwcy9oWERwWXpQUnZPMzNCRnN4ajRKUjR5QmVJQlk3NlJ4WndoWHR0UnVZdENSM2FZejRzckFRTmZOV2tQcTdGNzArMmd0RVBTL0Y4SkZETml3V3Vrdkt3eU5FNWxFSXM9In0seyJJZCI6IjUiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQmo4NlFuTi9DVUpnVys4b0lQb09CcndXci9SbUxBVG5ya0hidWU1RE1YL2MzU3FOK1JrZ0VrZXlvWXJCU1ZaeU00Um5RVS8zSXJvd3JCRjBZNjZoK241K0lPenFPY0pkV294amoveE03YkdVK0V4djhINDZwTUhSeUxHTS9ZYVlJcDBoN08rZUt2dUFFTzVKSEh4L3lJZVpkVlVNNU5valJVdHBBOFRiaTY0KzVTYjZPTy9oaU5uSjYwRm0wK2gzL1hYS2JmVWVXSFZyQm5VZUtMak5WUUhXYXJTZ2lzaXloQXVlbllSZlh3MFYzV1dzR2o0WGM1TFpEQ3hwODNXRUJ4ODl5LytNZXdqQkZEbklaYWRzNmF5bmw1a0s2ZHlaSmIxenM3N3NzRERqOW5VMEhxcFpFVzJMK0I5U2haeWRPUWZ5bW1wSkVzdUMweXBabHowNzFDMGFFelV3eG1ISnZybndzKzdqTG5oWGtkZTBDdUsyd3FOZXo0M2xtL0l0U3dtMHlma0J0OW1oYXd5K05aTVVyMTRITDZScGp2NTNLWnozZTVReml0ZVk9In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "82" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:55 GMT" ], "X-Amzn-Requestid": [ "caad7384-785f-52bb-89b7-11b260b04349" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjIifSx7IklkIjoiMCJ9LHsiSWQiOiI1In0seyJJZCI6IjEifSx7IklkIjoiMyJ9LHsiSWQiOiI0In1dfQ==" } }, { "ID": "87e1526a3c52636c", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "170" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "763" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:55 GMT" ], "X-Amzn-Requestid": [ "307c5815-7166-56f8-905e-3a236989b70a" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjU1Njk0IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNTUxMDcifSwiQm9keSI6ImhlbGxvIHdvcmxkIiwiTUQ1T2ZCb2R5IjoiNWViNjNiYmJlMDFlZWVkMDkzY2IyMmJiOGY1YWNkYzMiLCJNZXNzYWdlSWQiOiI5ZmM1ZjJjZC1mOTJlLTRlNjEtOTA4Yi1jOGY0MmY4MWYzZWEiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQmYvdUQ3c3Z6V3FWNkYvWmsvWnV3aVZhdFRVZFRnalNjZTlBVVVnMERjbUhyMUZkUkVXdWp5RGkyNU5rRnNSV01MeEZMNnl5VUdGd0xqZHBUNUtvdUxjbVV3MjVyK1NXYXdGYXNud01PVGRqVi9paWZoakdlR2ppVmM1d1E3WkVjWVYxR3ljZm1vclUvS2IrTjFhSlRVM2R0WW5RNXVtK1RRenRTa0JjSS9mY0I3elltaDJ2TnBha3BOZ2c2WEtDcXd5K21jYkhtMTFNTFNpME5XNENvSTM4UnRiQ1hIczR5bjcvYVFwU0k4bmlGZHArT1ZxVnNmUmpxYTZFMTE1aWRPT3lMLzRtcWxoL015dDZXczhqamNjWnZmd25lMlp0WUdpenIvMy9TN1JCV1Q2blNuNHBnaWtTNmVaWlBhZGs0TU9xOCt5UHZ1dFdzL2x0eTlYc3lXZGo2azdEcHFLYVpWR21iU2hIVnd2UFRRci9wak5XSVR1V0JGb0NSK0RYRkRNVDIwbld1UHJDaUV5M0Q1dzh2Njd2b2ovVTF4N2NQcWVqQ2pRYk12Zms9In1dfQ==" } }, { "ID": "7dbf1d3fb931bc9a", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "170" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "763" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:55 GMT" ], "X-Amzn-Requestid": [ "6141664a-4ca2-58f6-9717-047c544d8904" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjU1NzYxIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNTUwMzIifSwiQm9keSI6ImhlbGxvIHdvcmxkIiwiTUQ1T2ZCb2R5IjoiNWViNjNiYmJlMDFlZWVkMDkzY2IyMmJiOGY1YWNkYzMiLCJNZXNzYWdlSWQiOiI2ZmEzZWMzYi05OTZkLTQ2Y2YtYTI2Yy03YWEwNTYxNmUzMGEiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQjNZV2VFRFU1UnB2YTM1bklsSlNnNTRxTFY4NkVDcmpzNTBJeitZa0c1WEJ0WWo0YmEwcU1IUlBLNFU5dGVBdmtONk94RUNKcDNwWER5MTUvM3l0eVRaT0lzWGs3NW1VWE9pOTZaYmx3SU1HUHpJeGEyYkNzSmdVWmNmcXQvaXR5dFhyTlhvdEZuazZHNkVIdndVMmg5RGZBK1NzZDlLZVZDZzM4eHNKaWhOQit1QkI3VnlzSG5Wa2ZlbkRzY3hlNWpvZ3kreDNmLy8yTnZ2enRVQktpdTd6OGoyYWhqZlpBNnBQd0NBY3NrNVZOQVoybWh5ZmlMeVkzUFJ0WFQxT3hadnd0cWc2VHptMkhJdGk2bFRYT3JIVXF2T3V4SVZJMUowR0xXdVFHbThWMnlIMTc3Ym1xa3AyVzlZdjZ1MjJzRE55bG5sdGhSUjFNZmFrTHg3OXh6d091ZloyMDBFaUZQbzYvVi9kYzNEUjJtR21zTkZ5TThkL0lSRldBZUxocUtzcXJWQzloTUlpbS9aVW5YcHRlbWVqRkxNbGFjbktnSWZvR0tybWNGeTA9In1dfQ==" } }, { "ID": "7768ce6282248f30", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "170" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "763" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:55 GMT" ], "X-Amzn-Requestid": [ "35e32569-5dbd-5e7c-9c6c-475f455214f7" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjU1ODQ3IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNTUxMDYifSwiQm9keSI6ImhlbGxvIHdvcmxkIiwiTUQ1T2ZCb2R5IjoiNWViNjNiYmJlMDFlZWVkMDkzY2IyMmJiOGY1YWNkYzMiLCJNZXNzYWdlSWQiOiJlZTNjYTZhMS0yOGM5LTQ4OWYtYmEwNS1iMjM1M2VmZjE1NjMiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQmJFUGFIdUVFNXg2ZDFWekhqb3k3T0FiRXhWWUlseWVWcjhta1NQWTRsZTJnRHVjbzBXck9nRFZHcjZpaGdlRVlkTklDajJwRStvWTNjMTZvaEt0SGw5cUptbUQ3UnM1dGJxa3NibUJ4UFZ1cWhxaFE1azM0WEYwTy9mQTFZWHdYckgrOU9UYmI2U0RoU2oyaGRuTFV5eDB5K3NrcmtUM1hmSEsxOWhnWGFtR0pjSjZUL3p0dWY2V2VKWjRuSGg2WmNZQTNPMkRkT1BnRUlkdlNSRFEzbDlUQXFwTVIrV3NKMnJkN1FVdjR0V0J3dlhwM0RMbzkvclZDS0U0bDVHL1d1MVZxckdhS1BnNndQb3RHb2I3QWpWK1U0SGJMaHZNZXpiSk1pY0Yvb3JiTjlTSmJKWDdXVzRTSndELzdtRlBtbHBiZkROYTdWZE8zeEdEOXc5WVpWMGN4aU8vNjdZR1hKMGd0bzVDWmJsSDRmK3hTNmJ4QWlhcjh4d1NwOWJsaU43NTc2R2pROVdWZllhYlRpQ2JNUHphN3ZLWlhBZDhoN1NsMnl2SXJoNGM9In1dfQ==" } }, { "ID": "050a4918ecc085ca", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "170" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "763" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:55 GMT" ], "X-Amzn-Requestid": [ "b7d56890-4b40-58d8-be3d-0aa653afa253" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjU1OTIwIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNTUwMzMifSwiQm9keSI6ImhlbGxvIHdvcmxkIiwiTUQ1T2ZCb2R5IjoiNWViNjNiYmJlMDFlZWVkMDkzY2IyMmJiOGY1YWNkYzMiLCJNZXNzYWdlSWQiOiJlZjRjOTNhOC1iNmNlLTQ0MDItOGI3YS0yNzRjMTQyZGQ5NGEiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQlJoelBoUkJKZ0JZYXZHaTlwMzg2NmFQUmFrbEQ5YTBSeHpDNllEU2FMTEpjendtSmhOTzZQbUdVQjNqNng0Y1NXanRobUY5VUlXRnJpZXd0QzBLaGdkajJyVnNSMVc0S25INFk0eElxUkRhUkUva05SbUVNNjFKUnh5QWVIdEdwWVdmKzRJU0dQZExpYkhITDBqaFJ2eU52eXhheVFLczFWdzg2bjFMR3JWY0FTWWljR2dTZ05VUHFsbE5qbkovR2FIc2ZnL2hkcG1ycklMVnppRE5WNUVDTTVQVzdZQ2ZCM0krdWQxeXJSNG5TWklDWERsOFAzUmp2UlNHaDFyVHhySEk2dGRabFNlaUN6V2gxajhaeE1Na3pBbDVFWWJmR2xzTGJqNUIzaUs3cGhGL3BGa0tsbVdLMjBPZmtKRkJTbi8vOUl1anpSek5nSzF1UjRIQ3Y3RnA5OHVXVVM2UmUxcjRpVFh4VjluOTZCeWx3cUNjSGJ6a21jYmVFNC96RjdJaGtjMGR2QURrd25OS3JDeHRtbjdoazBLVSthSnRuVzExQUZIK2NEbEk9In1dfQ==" } }, { "ID": "16ea7ede52459d1f", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "170" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "763" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:55 GMT" ], "X-Amzn-Requestid": [ "8095a827-936a-5b26-816b-ca118b8521ad" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjU1OTkxIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNTUxMTMifSwiQm9keSI6ImhlbGxvIHdvcmxkIiwiTUQ1T2ZCb2R5IjoiNWViNjNiYmJlMDFlZWVkMDkzY2IyMmJiOGY1YWNkYzMiLCJNZXNzYWdlSWQiOiI2ZTY3ODIwOS0wODI0LTRmZGQtYTFkMC1mMzgwOGEwMzBmMGUiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQk5SRkhLcFAzL3gvdkE0QTYyWlNSL2VLc0dGN2dsNWpkVEFOWDd0bWNBNWw2NDNMRU5objVNR0JJenBOZ2lSRUJjb3AyNnZQOEtMMXVJT0pYUHgyR2luKytpYkxGZ2J4T0d1eUVPcDhRRzlaVlBsMWZFMmM3U29YZE0wM1h0SUFxdlhCbThtQXlJRE9CZEttbWlzY0xKS3ptUElackxuK3hkV0JYNWg5bXp5TEtkT1BGOStwWVBJVHdGS3Eva2tDWGRjd2ZiL3ZGcWZUclJwV3FFeTl0MGxFUkUzYStOQ0lPZzlxbzE0YWdGOHpFWStsVDRDWHY2Y2dQYVBqOVFNZkJlMVFKYVdHc2JBd0kyVWlqcXlieTlFTVcrVXpDemJqTWh0Tzh4VHBUT2hvYitOZ3pkN1RsQVJtRmREWVlKQkNWT0NiMENBaVNienRnZVRhbGdGaGxuM1ZJVlBtWHZHREUvMTNwZjZ5THNjNHQ0S01WbjBnMUVCb2Y3Z0tVbnkwWmtVb0Z6RlQrY080Q2hHUDVkdnlSaXpncnk5SlpXUzhqeVh0eWpnWTF3Vzg9In1dfQ==" } }, { "ID": "4492fd572b49ad5d", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "2873" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQmZoa29iaWpYLzJQQnNMRFpoWmsySXB3Zmk5SHNUNFFySU90aHBRN29yYkVpTmZQS0pnNTFGNkFEMEhZQVhIVkcyYTRMSG5YZUgzWFIvcEtVajhnallzOFEvZFovazNkV3R3amRJcjNoKytzcmh3U0NMbEo1cUUxajhXd1BVRXN6OXh6MkNMenhpOUVZTHNzVFUwT1ZjNWNPWHFqcWhGR1VEcjFxa1hqQjI0b3ZMaFF2OGxldlk0ZmFNZ2NmNGRMc2dnWTg4YWcwRmJqQzZiTTR0Y0haUkgvamxiZGMxQy85NzVXdm9SMGZ2SDhKUW5EQ3YyemlIZEJHT3M5azhub1ZuUWl2Q3pPUDlzWU5PK1NSaitNOE5iRmcvZVJtditqblNNQ1NiOWszeE0vUFNJeWVGOHlEb0RUanBINDB4SExnVTFISytEZ2twc3BIZGF0MEd1OWpwZWR1KzVCbkFldUU0Z2l6QU9iSFlxdUJsR3FhTVdLSDZ1ek5kK1IzMHJ1N3FQMG5xSWV5YnlPcTVNWmx4Y0U5ZnNqOW4rdUhJVVp6T2RtNjB1QmxSVXc9In0seyJJZCI6IjEiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQmYvdUQ3c3Z6V3FWNkYvWmsvWnV3aVZhdFRVZFRnalNjZTlBVVVnMERjbUhyMUZkUkVXdWp5RGkyNU5rRnNSV01MeEZMNnl5VUdGd0xqZHBUNUtvdUxjbVV3MjVyK1NXYXdGYXNud01PVGRqVi9paWZoakdlR2ppVmM1d1E3WkVjWVYxR3ljZm1vclUvS2IrTjFhSlRVM2R0WW5RNXVtK1RRenRTa0JjSS9mY0I3elltaDJ2TnBha3BOZ2c2WEtDcXd5K21jYkhtMTFNTFNpME5XNENvSTM4UnRiQ1hIczR5bjcvYVFwU0k4bmlGZHArT1ZxVnNmUmpxYTZFMTE1aWRPT3lMLzRtcWxoL015dDZXczhqamNjWnZmd25lMlp0WUdpenIvMy9TN1JCV1Q2blNuNHBnaWtTNmVaWlBhZGs0TU9xOCt5UHZ1dFdzL2x0eTlYc3lXZGo2azdEcHFLYVpWR21iU2hIVnd2UFRRci9wak5XSVR1V0JGb0NSK0RYRkRNVDIwbld1UHJDaUV5M0Q1dzh2Njd2b2ovVTF4N2NQcWVqQ2pRYk12Zms9In0seyJJZCI6IjIiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQjNZV2VFRFU1UnB2YTM1bklsSlNnNTRxTFY4NkVDcmpzNTBJeitZa0c1WEJ0WWo0YmEwcU1IUlBLNFU5dGVBdmtONk94RUNKcDNwWER5MTUvM3l0eVRaT0lzWGs3NW1VWE9pOTZaYmx3SU1HUHpJeGEyYkNzSmdVWmNmcXQvaXR5dFhyTlhvdEZuazZHNkVIdndVMmg5RGZBK1NzZDlLZVZDZzM4eHNKaWhOQit1QkI3VnlzSG5Wa2ZlbkRzY3hlNWpvZ3kreDNmLy8yTnZ2enRVQktpdTd6OGoyYWhqZlpBNnBQd0NBY3NrNVZOQVoybWh5ZmlMeVkzUFJ0WFQxT3hadnd0cWc2VHptMkhJdGk2bFRYT3JIVXF2T3V4SVZJMUowR0xXdVFHbThWMnlIMTc3Ym1xa3AyVzlZdjZ1MjJzRE55bG5sdGhSUjFNZmFrTHg3OXh6d091ZloyMDBFaUZQbzYvVi9kYzNEUjJtR21zTkZ5TThkL0lSRldBZUxocUtzcXJWQzloTUlpbS9aVW5YcHRlbWVqRkxNbGFjbktnSWZvR0tybWNGeTA9In0seyJJZCI6IjMiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQmJFUGFIdUVFNXg2ZDFWekhqb3k3T0FiRXhWWUlseWVWcjhta1NQWTRsZTJnRHVjbzBXck9nRFZHcjZpaGdlRVlkTklDajJwRStvWTNjMTZvaEt0SGw5cUptbUQ3UnM1dGJxa3NibUJ4UFZ1cWhxaFE1azM0WEYwTy9mQTFZWHdYckgrOU9UYmI2U0RoU2oyaGRuTFV5eDB5K3NrcmtUM1hmSEsxOWhnWGFtR0pjSjZUL3p0dWY2V2VKWjRuSGg2WmNZQTNPMkRkT1BnRUlkdlNSRFEzbDlUQXFwTVIrV3NKMnJkN1FVdjR0V0J3dlhwM0RMbzkvclZDS0U0bDVHL1d1MVZxckdhS1BnNndQb3RHb2I3QWpWK1U0SGJMaHZNZXpiSk1pY0Yvb3JiTjlTSmJKWDdXVzRTSndELzdtRlBtbHBiZkROYTdWZE8zeEdEOXc5WVpWMGN4aU8vNjdZR1hKMGd0bzVDWmJsSDRmK3hTNmJ4QWlhcjh4d1NwOWJsaU43NTc2R2pROVdWZllhYlRpQ2JNUHphN3ZLWlhBZDhoN1NsMnl2SXJoNGM9In0seyJJZCI6IjQiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQlJoelBoUkJKZ0JZYXZHaTlwMzg2NmFQUmFrbEQ5YTBSeHpDNllEU2FMTEpjendtSmhOTzZQbUdVQjNqNng0Y1NXanRobUY5VUlXRnJpZXd0QzBLaGdkajJyVnNSMVc0S25INFk0eElxUkRhUkUva05SbUVNNjFKUnh5QWVIdEdwWVdmKzRJU0dQZExpYkhITDBqaFJ2eU52eXhheVFLczFWdzg2bjFMR3JWY0FTWWljR2dTZ05VUHFsbE5qbkovR2FIc2ZnL2hkcG1ycklMVnppRE5WNUVDTTVQVzdZQ2ZCM0krdWQxeXJSNG5TWklDWERsOFAzUmp2UlNHaDFyVHhySEk2dGRabFNlaUN6V2gxajhaeE1Na3pBbDVFWWJmR2xzTGJqNUIzaUs3cGhGL3BGa0tsbVdLMjBPZmtKRkJTbi8vOUl1anpSek5nSzF1UjRIQ3Y3RnA5OHVXVVM2UmUxcjRpVFh4VjluOTZCeWx3cUNjSGJ6a21jYmVFNC96RjdJaGtjMGR2QURrd25OS3JDeHRtbjdoazBLVSthSnRuVzExQUZIK2NEbEk9In0seyJJZCI6IjUiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQk5SRkhLcFAzL3gvdkE0QTYyWlNSL2VLc0dGN2dsNWpkVEFOWDd0bWNBNWw2NDNMRU5objVNR0JJenBOZ2lSRUJjb3AyNnZQOEtMMXVJT0pYUHgyR2luKytpYkxGZ2J4T0d1eUVPcDhRRzlaVlBsMWZFMmM3U29YZE0wM1h0SUFxdlhCbThtQXlJRE9CZEttbWlzY0xKS3ptUElackxuK3hkV0JYNWg5bXp5TEtkT1BGOStwWVBJVHdGS3Eva2tDWGRjd2ZiL3ZGcWZUclJwV3FFeTl0MGxFUkUzYStOQ0lPZzlxbzE0YWdGOHpFWStsVDRDWHY2Y2dQYVBqOVFNZkJlMVFKYVdHc2JBd0kyVWlqcXlieTlFTVcrVXpDemJqTWh0Tzh4VHBUT2hvYitOZ3pkN1RsQVJtRmREWVlKQkNWT0NiMENBaVNienRnZVRhbGdGaGxuM1ZJVlBtWHZHREUvMTNwZjZ5THNjNHQ0S01WbjBnMUVCb2Y3Z0tVbnkwWmtVb0Z6RlQrY080Q2hHUDVkdnlSaXpncnk5SlpXUzhqeVh0eWpnWTF3Vzg9In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "82" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:56 GMT" ], "X-Amzn-Requestid": [ "820706fb-5e04-56ec-89a8-64cd46f41c67" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjIifSx7IklkIjoiNCJ9LHsiSWQiOiI1In0seyJJZCI6IjAifSx7IklkIjoiMSJ9LHsiSWQiOiIzIn1dfQ==" } }, { "ID": "c4143f1170c30a16", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "163" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd0JhdGNoaW5nLXRvcC0xJTNBNzE5N2QxNTYtMmQ1MC00YmExLWE3NjYtNzEwOTBlZDRhYzg5JlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:56 GMT" ], "X-Amzn-Requestid": [ "c5f17f62-ca1c-5d03-87e1-1d54d2ec368d" ] }, "Body": "PFVuc3Vic2NyaWJlUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD5jNWYxN2Y2Mi1jYTFjLTVkMDMtODdlMS0xZDU0ZDJlYzM2OGQ8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvVW5zdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "9348eb275f18941b", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "89" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0JhdGNoaW5nLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:56 GMT" ], "X-Amzn-Requestid": [ "64b9f316-37bd-56b6-8596-91202f4dfc3d" ] }, "Body": "" } }, { "ID": "87d4ac28668626e0", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "117" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPURlbGV0ZVRvcGljJlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQVNOU1RvcGljUmF3QmF0Y2hpbmctdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:56 GMT" ], "X-Amzn-Requestid": [ "ebc59c1a-0a2a-57b1-af45-fe2c12da0c3f" ] }, "Body": "PERlbGV0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD5lYmM1OWMxYS0wYTJhLTU3YjEtYWY0NS1mZTJjMTJkYTBjM2Y8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvRGVsZXRlVG9waWNSZXNwb25zZT4K" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSNSTopicRaw/TestCancelSendReceive.replay ================================================ { "Initial": "AQAAAA7hTg2oBzhUkAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "c2e83b7337bf8a86", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "77" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPUNyZWF0ZVRvcGljJk5hbWU9U05TVG9waWNSYXdDYW5jZWxTZW5kUmVjZWl2ZS10b3AtMSZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "341" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:48 GMT" ], "X-Amzn-Requestid": [ "98e054eb-e9b3-57e9-be39-36ddf15b4900" ] }, "Body": "PENyZWF0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxDcmVhdGVUb3BpY1Jlc3VsdD4KICAgIDxUb3BpY0Fybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3Q2FuY2VsU2VuZFJlY2VpdmUtdG9wLTE8L1RvcGljQXJuPgogIDwvQ3JlYXRlVG9waWNSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjk4ZTA1NGViLWU5YjMtNTdlOS1iZTM5LTM2ZGRmMTViNDkwMDwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9DcmVhdGVUb3BpY1Jlc3BvbnNlPgo=" } }, { "ID": "11e71530123ab5c4", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "50" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTTlNUb3BpY1Jhd0NhbmNlbFNlbmRSZWNlaXZlLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "98" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:48 GMT" ], "X-Amzn-Requestid": [ "31f8b90b-d35e-5832-96ee-db3dcbb64c06" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0NhbmNlbFNlbmRSZWNlaXZlLXN1Yi0xIn0=" } }, { "ID": "100ea789a8a3653f", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "128" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0NhbmNlbFNlbmRSZWNlaXZlLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:48 GMT" ], "X-Amzn-Requestid": [ "5ae5e7d5-6892-5b15-97f8-85e3707a9f21" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY1Jhd0NhbmNlbFNlbmRSZWNlaXZlLXN1Yi0xIn19" } }, { "ID": "26f998b08b9178dd", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "482" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3Q2FuY2VsU2VuZFJlY2VpdmUtc3ViLTFcIlxuXHRcdH1cblx0XHRdXG5cdFx0fSJ9LCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0NhbmNlbFNlbmRSZWNlaXZlLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:49 GMT" ], "X-Amzn-Requestid": [ "dfeeb8de-a736-555e-b8b6-dae8bfde516a" ] }, "Body": "" } }, { "ID": "f97d60922b73ed6c", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "298" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVN1YnNjcmliZSZBdHRyaWJ1dGVzLmVudHJ5LjEua2V5PVJhd01lc3NhZ2VEZWxpdmVyeSZBdHRyaWJ1dGVzLmVudHJ5LjEudmFsdWU9dHJ1ZSZFbmRwb2ludD1hcm4lM0Fhd3MlM0FzcXMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd0NhbmNlbFNlbmRSZWNlaXZlLXN1Yi0xJlByb3RvY29sPXNxcyZUb3BpY0Fybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd0NhbmNlbFNlbmRSZWNlaXZlLXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "384" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:49 GMT" ], "X-Amzn-Requestid": [ "a7969a04-26d0-5070-a65e-f8323e39ae99" ] }, "Body": "PFN1YnNjcmliZVJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8U3Vic2NyaWJlUmVzdWx0PgogICAgPFN1YnNjcmlwdGlvbkFybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3Q2FuY2VsU2VuZFJlY2VpdmUtdG9wLTE6ODkwN2YwNDgtZGY0Zi00NjczLWFlZGItZmExNTcyYzhmNWFjPC9TdWJzY3JpcHRpb25Bcm4+CiAgPC9TdWJzY3JpYmVSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPmE3OTY5YTA0LTI2ZDAtNTA3MC1hNjVlLWY4MzIzZTM5YWU5OTwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9TdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "df21110af2b0bee9", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "172" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd0NhbmNlbFNlbmRSZWNlaXZlLXRvcC0xJTNBODkwN2YwNDgtZGY0Zi00NjczLWFlZGItZmExNTcyYzhmNWFjJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:49 GMT" ], "X-Amzn-Requestid": [ "f2e5d111-c55e-58f9-bf8b-b327ddb75610" ] }, "Body": "PFVuc3Vic2NyaWJlUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD5mMmU1ZDExMS1jNTVlLTU4ZjktYmY4Yi1iMzI3ZGRiNzU2MTA8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvVW5zdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "87e26d7718b964cd", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "98" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0NhbmNlbFNlbmRSZWNlaXZlLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:49 GMT" ], "X-Amzn-Requestid": [ "330bb533-3d80-5a88-848a-d7052569eebc" ] }, "Body": "" } }, { "ID": "22a36c6e5c29ac96", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "126" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPURlbGV0ZVRvcGljJlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQVNOU1RvcGljUmF3Q2FuY2VsU2VuZFJlY2VpdmUtdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:49 GMT" ], "X-Amzn-Requestid": [ "0683f4d4-5f5a-5fdd-8c35-96e247b3e134" ] }, "Body": "PERlbGV0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD4wNjgzZjRkNC01ZjVhLTVmZGQtOGMzNS05NmUyNDdiM2UxMzQ8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvRGVsZXRlVG9waWNSZXNwb25zZT4K" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSNSTopicRaw/TestDoubleAck.replay ================================================ { "Initial": "AQAAAA7hTg2iOUkiVAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "f5729c2cb116ece6", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "69" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPUNyZWF0ZVRvcGljJk5hbWU9U05TVG9waWNSYXdEb3VibGVBY2stdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "333" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:43 GMT" ], "X-Amzn-Requestid": [ "8bc56f2b-c300-5b01-9a5d-0d1ddbe3146d" ] }, "Body": "PENyZWF0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxDcmVhdGVUb3BpY1Jlc3VsdD4KICAgIDxUb3BpY0Fybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3RG91YmxlQWNrLXRvcC0xPC9Ub3BpY0Fybj4KICA8L0NyZWF0ZVRvcGljUmVzdWx0PgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD44YmM1NmYyYi1jMzAwLTViMDEtOWE1ZC0wZDFkZGJlMzE0NmQ8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvQ3JlYXRlVG9waWNSZXNwb25zZT4K" } }, { "ID": "41f1d5db8439ae1e", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "42" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTTlNUb3BpY1Jhd0RvdWJsZUFjay1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "90" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:43 GMT" ], "X-Amzn-Requestid": [ "8da384ee-256a-52c4-a0e6-e6d83d89db3c" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0RvdWJsZUFjay1zdWItMSJ9" } }, { "ID": "e943263d33d07592", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "120" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0RvdWJsZUFjay1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "91" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:43 GMT" ], "X-Amzn-Requestid": [ "eced53b7-4469-5298-96d7-31815c8a4b60" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY1Jhd0RvdWJsZUFjay1zdWItMSJ9fQ==" } }, { "ID": "1ae92f2c56396ae0", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "466" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3RG91YmxlQWNrLXN1Yi0xXCJcblx0XHR9XG5cdFx0XVxuXHRcdH0ifSwiUXVldWVVcmwiOiJodHRwczovL3Nxcy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS80NTY3NTI2NjU1NzYvU05TVG9waWNSYXdEb3VibGVBY2stc3ViLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:43 GMT" ], "X-Amzn-Requestid": [ "f6f9bde1-7250-5633-8433-dfd76ab36fcb" ] }, "Body": "" } }, { "ID": "eb1cad7847e50c28", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "282" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVN1YnNjcmliZSZBdHRyaWJ1dGVzLmVudHJ5LjEua2V5PVJhd01lc3NhZ2VEZWxpdmVyeSZBdHRyaWJ1dGVzLmVudHJ5LjEudmFsdWU9dHJ1ZSZFbmRwb2ludD1hcm4lM0Fhd3MlM0FzcXMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd0RvdWJsZUFjay1zdWItMSZQcm90b2NvbD1zcXMmVG9waWNBcm49YXJuJTNBYXdzJTNBc25zJTNBdXMtZWFzdC0yJTNBNDU2NzUyNjY1NTc2JTNBU05TVG9waWNSYXdEb3VibGVBY2stdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "376" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:43 GMT" ], "X-Amzn-Requestid": [ "d59f15d9-b90a-53f2-9abc-77efa1e9bc9e" ] }, "Body": "PFN1YnNjcmliZVJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8U3Vic2NyaWJlUmVzdWx0PgogICAgPFN1YnNjcmlwdGlvbkFybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3RG91YmxlQWNrLXRvcC0xOjRkYTc4NGVlLTU2NmMtNDE1ZC1iMmU5LWIzNGQyNDdmYmI1ZTwvU3Vic2NyaXB0aW9uQXJuPgogIDwvU3Vic2NyaWJlUmVzdWx0PgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD5kNTlmMTVkOS1iOTBhLTUzZjItOWFiYy03N2VmYTFlOWJjOWU8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvU3Vic2NyaWJlUmVzcG9uc2U+Cg==" } }, { "ID": "9556aa3f10edb812", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "206" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9MCZUb3BpY0Fybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd0RvdWJsZUFjay10b3AtMSZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:44 GMT" ], "X-Amzn-Requestid": [ "991693fe-80c8-551b-aa70-f1c8982caa77" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPmQ4YTc5MDA0LTFjZGEtNThmNS1hYmRlLWYyMzIwNDNlOTc5OTwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjk5MTY5M2ZlLTgwYzgtNTUxYi1hYTcwLWYxYzg5ODJjYWE3NzwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "17e948c0f1df9776", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "206" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9MSZUb3BpY0Fybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd0RvdWJsZUFjay10b3AtMSZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:44 GMT" ], "X-Amzn-Requestid": [ "6643724d-5fc7-5157-8c83-107b4723ee3b" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPjk3MGQzMzA0LWY5ZjItNWFiNy1hMDk5LTUxMzJlMTE2MDVkYjwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjY2NDM3MjRkLTVmYzctNTE1Ny04YzgzLTEwN2I0NzIzZWUzYjwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "35508df3310db5ec", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "206" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9MiZUb3BpY0Fybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd0RvdWJsZUFjay10b3AtMSZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:44 GMT" ], "X-Amzn-Requestid": [ "daa2deb6-eef0-5193-b6b1-bc80f6144eff" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPmMxNjM4NjMyLTM0YjktNWEzMy1hNTVjLWU0MDQyYzVkNDU1ZjwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPmRhYTJkZWI2LWVlZjAtNTE5My1iNmIxLWJjODBmNjE0NGVmZjwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "7b0b092ab37d147f", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "171" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MywiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0RvdWJsZUFjay1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1492" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:44 GMT" ], "X-Amzn-Requestid": [ "b31bbd26-f66e-5304-9dcb-df10ee8aeafc" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjQ0MjMxIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNDQxMTMifSwiQm9keSI6IjEiLCJNRDVPZkJvZHkiOiJjNGNhNDIzOGEwYjkyMzgyMGRjYzUwOWE2Zjc1ODQ5YiIsIk1lc3NhZ2VJZCI6IjIxMWQwZDM3LTNlZWUtNDYwMC1hYjMxLWU4MzFlMWM0YzVlNyIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCUE1JRnNTUEY4bkIwYVhXMmM1L0NiZGxMaE1seXZBNUI4cnVPazRVeVNsS3ovNjVzK2tabDRNZmNUSmZxekRxMDcybWRKTFFjTXpjRXJpTklScGJmWkVWelR4cWhzMFZqVEt3ODE1VVcyRnU1d0t2TXJhNnRrelFNN3VtQU5zOXFSRlUzeURLeVk1Vmk3QWlRL29WdWlRbkY5SEorenVUbVpLSnNzeXowZEd2WnNCMVlnOCtRZFUzV2U2SUVBaUlWcnpEd1VhVjZLemZrV3NFak9Zc00wanR3TU5mZytsM1kyR2pZRVJ4MTBSVmhUMXNIdGJ6ajRySndSQzF4NTZpRDNiZjRpSGtVQm9FaytoV21rb09sdTcxS01xZHRzWkVDdEdYSUdoOHR3NVZEM0J2cFVROUxzMHdDdUFhcDlrOVUxd1FUMjBweUw0NklMbUhyT1VINDZyYW0wSG5zeVRaeU83Z1ZKWTVqR0dZYjBnOWxueXZEeENFUDBsajNXdDArRDJSa2g3T1pmRHBOKzk4SVVJRUNyZUJ6dkVmcTRvNjA0cVl1RzFVVlRnVT0ifSx7IkF0dHJpYnV0ZXMiOnsiU2VuZGVySWQiOiJBUk9BM1RZTU8zQkdESEpGQkhUNzU6QVdTLUNMT1VEQ0FTVCIsIkFwcHJveGltYXRlRmlyc3RSZWNlaXZlVGltZXN0YW1wIjoiMTc3MzkzNDI0NDIzMSIsIkFwcHJveGltYXRlUmVjZWl2ZUNvdW50IjoiMSIsIlNlbnRUaW1lc3RhbXAiOiIxNzczOTM0MjQ0MTg3In0sIkJvZHkiOiIyIiwiTUQ1T2ZCb2R5IjoiYzgxZTcyOGQ5ZDRjMmY2MzZmMDY3Zjg5Y2MxNDg2MmMiLCJNZXNzYWdlSWQiOiIyYmU2YmU0Zi1mNzIyLTQ3NDUtYjEwNS1iNGZlZThlNmVhMzEiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQktYWHlFUVJnWER0NDhvV2Y2Q0ZZa1lpOGgwcDlQRmoxY2FtM0hvR2RZaGJ6VjBrSGtXMUFnUVR2cWd0NVVRaFY2NWt0NmFzOHN1bzdkNCtzcUhVVXZBdUVKR2tDdklzWlB0L2Z0SWtDVktQeG5uemhKM3J6ZkdOOC9Ncm5IQ21aRXBUaVRYTFpvd21CMnpqeWdEZW1zL05qcjE1aFViZGowZHNRVm9KTmZOR1l1WElJMzF1U2tzMFFKM3llL0NQdXMxWUd3LzBkOWRHSmwreVRkMkV1aFRYT0hjanlJYmk5aStVcUF2TEFFREo4S3NpVFFDTjBYUTFNcUlGV0M0U2U3aWlMb0FmSXNGUmVCYmRHZU5ocTNyUGd1OGcxcm1UN3RZYjk4YzlhTzk2dGp6R2NsckJIQ2g2RUxUMVVtWFllNEltTW1tQlg4VjA3bUM5Q3FiN1lCd1ZKSFE4NXd4TVYzMHRUQ3V6OU5nemZnck1UOXRVNS8yWTdOVTNtL2llMG56TEVUdDFObkc4aEhnRG1RcVExNWU2dndCREhVNllFUFVXM0dxSHkrS289In1dfQ==" } }, { "ID": "16a8eb3347597f64", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "171" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MywiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0RvdWJsZUFjay1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "753" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:44 GMT" ], "X-Amzn-Requestid": [ "a8fc571b-83af-593e-bdfd-352d9b4b10c6" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjQ0MzM2IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNDQwNDIifSwiQm9keSI6IjAiLCJNRDVPZkJvZHkiOiJjZmNkMjA4NDk1ZDU2NWVmNjZlN2RmZjlmOTg3NjRkYSIsIk1lc3NhZ2VJZCI6ImI0MTM3ZTk1LTJhMGUtNDllMy1hMzc0LTI1MDVlYTE4MTIwYyIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCNWh5YURqR1BJTTR0WlRYVy9CWi8xdWRRTEt2M3NwME9kNHZ1ZjA4MHE0bE1IcFZFUU9uclRFTlFvUVpSTzFTbks0MTZVMmVkb0RpK3VzRDdkNk1hNUF0NHBNWXJlTVdKTEN5dXhGWjNCdEV0SVZhRHdKUktvU0ErSUV1R2ExdGZGT1Jwb1ZnSklhY0hZUTdSd3RoTndJUmZZSHE1Z2FzY25Eaml4cmlKYnlKMHVpb2xXb0NNUjl1SnZLUFZ3c3RsK0ZzTlFzNjBFaURTVkFnRG05alZ0YXRrN2YxR3ZDeDNwSkFjY3ZVYzRSQU45bWRQZ3dqcWlWQisxa0RMbnNBR1p0RXNNWU55Q1Rad0tLUmlwekwxL2oyQVB3Yy9ScWJPTEZpVUZrZ0VaZ2IwSVEwMWJvaXhyQ3JXOW9QdHRKSmpWRDJzNHZIcEMvZ0VCMjd6UGNFbFFnRnRXRWlyNnkycnNxNDRISzZyWVkrdHlZSUR6bU4vT1ZMTXhlZkZUK2UxR0F2WGpoTjV3L2wzV0dzejVFbURaTGJrcGQ5TFlUQ20vTU9IWTJHaDhjdz0ifV19" } }, { "ID": "0aabe83da9929642", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "1026" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQlBNSUZzU1BGOG5CMGFYVzJjNS9DYmRsTGhNbHl2QTVCOHJ1T2s0VXlTbEt6LzY1cytrWmw0TWZjVEpmcXpEcTA3Mm1kSkxRY016Y0VyaU5JUnBiZlpFVnpUeHFoczBWalRLdzgxNVVXMkZ1NXdLdk1yYTZ0a3pRTTd1bUFOczlxUkZVM3lES3lZNVZpN0FpUS9vVnVpUW5GOUhKK3p1VG1aS0pzc3l6MGRHdlpzQjFZZzgrUWRVM1dlNklFQWlJVnJ6RHdVYVY2S3pma1dzRWpPWXNNMGp0d01OZmcrbDNZMkdqWUVSeDEwUlZoVDFzSHRiemo0ckp3UkMxeDU2aUQzYmY0aUhrVUJvRWsraFdta29PbHU3MUtNcWR0c1pFQ3RHWElHaDh0dzVWRDNCdnBVUTlMczB3Q3VBYXA5azlVMXdRVDIwcHlMNDZJTG1Ick9VSDQ2cmFtMEhuc3lUWnlPN2dWSlk1akdHWWIwZzlsbnl2RHhDRVAwbGozV3QwK0QyUmtoN09aZkRwTis5OElVSUVDcmVCenZFZnE0bzYwNHFZdUcxVVZUZ1U9In0seyJJZCI6IjEiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQktYWHlFUVJnWER0NDhvV2Y2Q0ZZa1lpOGgwcDlQRmoxY2FtM0hvR2RZaGJ6VjBrSGtXMUFnUVR2cWd0NVVRaFY2NWt0NmFzOHN1bzdkNCtzcUhVVXZBdUVKR2tDdklzWlB0L2Z0SWtDVktQeG5uemhKM3J6ZkdOOC9Ncm5IQ21aRXBUaVRYTFpvd21CMnpqeWdEZW1zL05qcjE1aFViZGowZHNRVm9KTmZOR1l1WElJMzF1U2tzMFFKM3llL0NQdXMxWUd3LzBkOWRHSmwreVRkMkV1aFRYT0hjanlJYmk5aStVcUF2TEFFREo4S3NpVFFDTjBYUTFNcUlGV0M0U2U3aWlMb0FmSXNGUmVCYmRHZU5ocTNyUGd1OGcxcm1UN3RZYjk4YzlhTzk2dGp6R2NsckJIQ2g2RUxUMVVtWFllNEltTW1tQlg4VjA3bUM5Q3FiN1lCd1ZKSFE4NXd4TVYzMHRUQ3V6OU5nemZnck1UOXRVNS8yWTdOVTNtL2llMG56TEVUdDFObkc4aEhnRG1RcVExNWU2dndCREhVNllFUFVXM0dxSHkrS289In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0RvdWJsZUFjay1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "38" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:44 GMT" ], "X-Amzn-Requestid": [ "260c4bcb-ad4d-5108-bfc9-29fdb5a9e8f0" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifSx7IklkIjoiMSJ9XX0=" } }, { "ID": "fa17a4ccca7da4a2", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "1026" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQlBNSUZzU1BGOG5CMGFYVzJjNS9DYmRsTGhNbHl2QTVCOHJ1T2s0VXlTbEt6LzY1cytrWmw0TWZjVEpmcXpEcTA3Mm1kSkxRY016Y0VyaU5JUnBiZlpFVnpUeHFoczBWalRLdzgxNVVXMkZ1NXdLdk1yYTZ0a3pRTTd1bUFOczlxUkZVM3lES3lZNVZpN0FpUS9vVnVpUW5GOUhKK3p1VG1aS0pzc3l6MGRHdlpzQjFZZzgrUWRVM1dlNklFQWlJVnJ6RHdVYVY2S3pma1dzRWpPWXNNMGp0d01OZmcrbDNZMkdqWUVSeDEwUlZoVDFzSHRiemo0ckp3UkMxeDU2aUQzYmY0aUhrVUJvRWsraFdta29PbHU3MUtNcWR0c1pFQ3RHWElHaDh0dzVWRDNCdnBVUTlMczB3Q3VBYXA5azlVMXdRVDIwcHlMNDZJTG1Ick9VSDQ2cmFtMEhuc3lUWnlPN2dWSlk1akdHWWIwZzlsbnl2RHhDRVAwbGozV3QwK0QyUmtoN09aZkRwTis5OElVSUVDcmVCenZFZnE0bzYwNHFZdUcxVVZUZ1U9In0seyJJZCI6IjEiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQktYWHlFUVJnWER0NDhvV2Y2Q0ZZa1lpOGgwcDlQRmoxY2FtM0hvR2RZaGJ6VjBrSGtXMUFnUVR2cWd0NVVRaFY2NWt0NmFzOHN1bzdkNCtzcUhVVXZBdUVKR2tDdklzWlB0L2Z0SWtDVktQeG5uemhKM3J6ZkdOOC9Ncm5IQ21aRXBUaVRYTFpvd21CMnpqeWdEZW1zL05qcjE1aFViZGowZHNRVm9KTmZOR1l1WElJMzF1U2tzMFFKM3llL0NQdXMxWUd3LzBkOWRHSmwreVRkMkV1aFRYT0hjanlJYmk5aStVcUF2TEFFREo4S3NpVFFDTjBYUTFNcUlGV0M0U2U3aWlMb0FmSXNGUmVCYmRHZU5ocTNyUGd1OGcxcm1UN3RZYjk4YzlhTzk2dGp6R2NsckJIQ2g2RUxUMVVtWFllNEltTW1tQlg4VjA3bUM5Q3FiN1lCd1ZKSFE4NXd4TVYzMHRUQ3V6OU5nemZnck1UOXRVNS8yWTdOVTNtL2llMG56TEVUdDFObkc4aEhnRG1RcVExNWU2dndCREhVNllFUFVXM0dxSHkrS289In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0RvdWJsZUFjay1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "38" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:44 GMT" ], "X-Amzn-Requestid": [ "e5b6bce6-48de-5a52-80ff-ded0503a73aa" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifSx7IklkIjoiMSJ9XX0=" } }, { "ID": "9660b93fcd8a9e82", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "1554" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ChangeMessageVisibilityBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQlBNSUZzU1BGOG5CMGFYVzJjNS9DYmRsTGhNbHl2QTVCOHJ1T2s0VXlTbEt6LzY1cytrWmw0TWZjVEpmcXpEcTA3Mm1kSkxRY016Y0VyaU5JUnBiZlpFVnpUeHFoczBWalRLdzgxNVVXMkZ1NXdLdk1yYTZ0a3pRTTd1bUFOczlxUkZVM3lES3lZNVZpN0FpUS9vVnVpUW5GOUhKK3p1VG1aS0pzc3l6MGRHdlpzQjFZZzgrUWRVM1dlNklFQWlJVnJ6RHdVYVY2S3pma1dzRWpPWXNNMGp0d01OZmcrbDNZMkdqWUVSeDEwUlZoVDFzSHRiemo0ckp3UkMxeDU2aUQzYmY0aUhrVUJvRWsraFdta29PbHU3MUtNcWR0c1pFQ3RHWElHaDh0dzVWRDNCdnBVUTlMczB3Q3VBYXA5azlVMXdRVDIwcHlMNDZJTG1Ick9VSDQ2cmFtMEhuc3lUWnlPN2dWSlk1akdHWWIwZzlsbnl2RHhDRVAwbGozV3QwK0QyUmtoN09aZkRwTis5OElVSUVDcmVCenZFZnE0bzYwNHFZdUcxVVZUZ1U9IiwiVmlzaWJpbGl0eVRpbWVvdXQiOjF9LHsiSWQiOiIxIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJLWFh5RVFSZ1hEdDQ4b1dmNkNGWWtZaThoMHA5UEZqMWNhbTNIb0dkWWhielYwa0hrVzFBZ1FUdnFndDVVUWhWNjVrdDZhczhzdW83ZDQrc3FIVVV2QXVFSkdrQ3ZJc1pQdC9mdElrQ1ZLUHhubnpoSjNyemZHTjgvTXJuSENtWkVwVGlUWExab3dtQjJ6anlnRGVtcy9OanIxNWhVYmRqMGRzUVZvSk5mTkdZdVhJSTMxdVNrczBRSjN5ZS9DUHVzMVlHdy8wZDlkR0psK3lUZDJFdWhUWE9IY2p5SWJpOWkrVXFBdkxBRURKOEtzaVRRQ04wWFExTXFJRldDNFNlN2lpTG9BZklzRlJlQmJkR2VOaHEzclBndThnMXJtVDd0WWI5OGM5YU85NnRqekdjbHJCSENoNkVMVDFVbVhZZTRJbU1tbUJYOFYwN21DOUNxYjdZQndWSkhRODV3eE1WMzB0VEN1ejlOZ3pmZ3JNVDl0VTUvMlk3TlUzbS9pZTBuekxFVHQxTm5HOGhIZ0RtUXFRMTVlNnZ3QkRIVTZZRVBVVzNHcUh5K0tvPSIsIlZpc2liaWxpdHlUaW1lb3V0IjoxfSx7IklkIjoiMiIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCNWh5YURqR1BJTTR0WlRYVy9CWi8xdWRRTEt2M3NwME9kNHZ1ZjA4MHE0bE1IcFZFUU9uclRFTlFvUVpSTzFTbks0MTZVMmVkb0RpK3VzRDdkNk1hNUF0NHBNWXJlTVdKTEN5dXhGWjNCdEV0SVZhRHdKUktvU0ErSUV1R2ExdGZGT1Jwb1ZnSklhY0hZUTdSd3RoTndJUmZZSHE1Z2FzY25Eaml4cmlKYnlKMHVpb2xXb0NNUjl1SnZLUFZ3c3RsK0ZzTlFzNjBFaURTVkFnRG05alZ0YXRrN2YxR3ZDeDNwSkFjY3ZVYzRSQU45bWRQZ3dqcWlWQisxa0RMbnNBR1p0RXNNWU55Q1Rad0tLUmlwekwxL2oyQVB3Yy9ScWJPTEZpVUZrZ0VaZ2IwSVEwMWJvaXhyQ3JXOW9QdHRKSmpWRDJzNHZIcEMvZ0VCMjd6UGNFbFFnRnRXRWlyNnkycnNxNDRISzZyWVkrdHlZSUR6bU4vT1ZMTXhlZkZUK2UxR0F2WGpoTjV3L2wzV0dzejVFbURaTGJrcGQ5TFlUQ20vTU9IWTJHaDhjdz0iLCJWaXNpYmlsaXR5VGltZW91dCI6MX1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0RvdWJsZUFjay1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "332" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:44 GMT" ], "X-Amzn-Requestid": [ "32e37070-65d6-5e95-9c19-12467d32676d" ] }, "Body": "eyJGYWlsZWQiOlt7IkNvZGUiOiJSZWNlaXB0SGFuZGxlSXNJbnZhbGlkIiwiSWQiOiIwIiwiTWVzc2FnZSI6Ik1lc3NhZ2UgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGF2YWlsYWJsZSBmb3IgdmlzaWJpbGl0eSB0aW1lb3V0IGNoYW5nZSIsIlNlbmRlckZhdWx0Ijp0cnVlfSx7IkNvZGUiOiJSZWNlaXB0SGFuZGxlSXNJbnZhbGlkIiwiSWQiOiIxIiwiTWVzc2FnZSI6Ik1lc3NhZ2UgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGF2YWlsYWJsZSBmb3IgdmlzaWJpbGl0eSB0aW1lb3V0IGNoYW5nZSIsIlNlbmRlckZhdWx0Ijp0cnVlfV0sIlN1Y2Nlc3NmdWwiOlt7IklkIjoiMiJ9XX0=" } }, { "ID": "cdb4ea50c1795881", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "171" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0RvdWJsZUFjay1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:44 GMT" ], "X-Amzn-Requestid": [ "12a3d769-adb7-56e3-b32f-b55fb553df1b" ] }, "Body": "e30=" } }, { "ID": "cd2c94ac0fabfd33", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "171" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0RvdWJsZUFjay1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:45 GMT" ], "X-Amzn-Requestid": [ "5d2d2de7-a973-50d8-a261-4fd1b1977920" ] }, "Body": "e30=" } }, { "ID": "ba4dbf9b2f2d9cc1", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "171" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0RvdWJsZUFjay1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:45 GMT" ], "X-Amzn-Requestid": [ "78e79350-1315-50c3-8a8a-f1660bf0093b" ] }, "Body": "e30=" } }, { "ID": "bd53da082654a111", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "171" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0RvdWJsZUFjay1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "753" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:45 GMT" ], "X-Amzn-Requestid": [ "10464bc6-56ab-5d36-8d05-29f04e4ef4ce" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjQ0MzM2IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIyIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNDQwNDIifSwiQm9keSI6IjAiLCJNRDVPZkJvZHkiOiJjZmNkMjA4NDk1ZDU2NWVmNjZlN2RmZjlmOTg3NjRkYSIsIk1lc3NhZ2VJZCI6ImI0MTM3ZTk1LTJhMGUtNDllMy1hMzc0LTI1MDVlYTE4MTIwYyIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCN2FPVGFtNnJTanE1ZGI1MnhjTStNTDRiOWpqd1VYcHFtMEFCbUpkbGFzOW00dEtwQ0dCc3VSZ1F6Zk9aYmR6TXpMVk1leHNoMmgxdlZOZVljTE9JUWdIMDlyWFNqTHZkb2lvb0YwdmJ3NjJnNmFYZmwycUFjR01SaEMvekw3djdocVhtbG5PQ1JpL2dFQ3FsemRyZWllYnZMRlIvaGxtRzkvUjRNbk5ESU8vZzNHaHkzVWFmdngyR212bjRVbjNuRFNmUSswMkZpcWdycG9XTzM4TzB2WllDRkMvalNwcHpXWk95RGZHemVHV05HMVh5dkl3aGViRjV6eWNUTFkrWEMvN253aGJHcU5TTkd1ZGQyZ2RxSHVZNm9aKzVzcDIvMHRNNU82VHQ4anZkRllnbEMyR3o3ZVhMUUxXMlJXbzFTOUtrQlhvdlE5c1lwbEhLUklzblp3REo4aWd6OWt1Y1ZOc0gxSDlpUTlOUzByN2FEb3FaTW81cnNBbUUyVVc2RXdFN2VWeFdGVTVpcWIvV20xa09Lem9kUjd1Z0E5WURJWi9LeFZ3NDZuVT0ifV19" } }, { "ID": "c939059dd7ecf4c1", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "164" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd0RvdWJsZUFjay10b3AtMSUzQTRkYTc4NGVlLTU2NmMtNDE1ZC1iMmU5LWIzNGQyNDdmYmI1ZSZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:45 GMT" ], "X-Amzn-Requestid": [ "f674ad00-286e-5603-b511-cf36308b196f" ] }, "Body": "PFVuc3Vic2NyaWJlUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD5mNjc0YWQwMC0yODZlLTU2MDMtYjUxMS1jZjM2MzA4YjE5NmY8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvVW5zdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "8f6509bfdf6999cf", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "90" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0RvdWJsZUFjay1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:45 GMT" ], "X-Amzn-Requestid": [ "c0d1c95b-d4d9-511b-b7cd-ab6dcc3c28e3" ] }, "Body": "" } }, { "ID": "2b11c4da9e4438f2", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "118" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPURlbGV0ZVRvcGljJlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQVNOU1RvcGljUmF3RG91YmxlQWNrLXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:46 GMT" ], "X-Amzn-Requestid": [ "9b5559ae-9e13-5446-9b6a-3b9886f5bb2a" ] }, "Body": "PERlbGV0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD45YjU1NTlhZS05ZTEzLTU0NDYtOWI2YS0zYjk4ODZmNWJiMmE8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvRGVsZXRlVG9waWNSZXNwb25zZT4K" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSNSTopicRaw/TestErrorOnReceiveFromClosedSubscription.replay ================================================ { "Initial": "AQAAAA7hTg2mI64HCgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "d8ccf1808e4bc741", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "96" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPUNyZWF0ZVRvcGljJk5hbWU9U05TVG9waWNSYXdFcnJvck9uUmVjZWl2ZUZyb21DbG9zZWRTdWJzY3JpcHRpb24tdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "360" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:46 GMT" ], "X-Amzn-Requestid": [ "f941cb4f-7862-5264-9318-a97960841a8e" ] }, "Body": "PENyZWF0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxDcmVhdGVUb3BpY1Jlc3VsdD4KICAgIDxUb3BpY0Fybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3RXJyb3JPblJlY2VpdmVGcm9tQ2xvc2VkU3Vic2NyaXB0aW9uLXRvcC0xPC9Ub3BpY0Fybj4KICA8L0NyZWF0ZVRvcGljUmVzdWx0PgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD5mOTQxY2I0Zi03ODYyLTUyNjQtOTMxOC1hOTc5NjA4NDFhOGU8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvQ3JlYXRlVG9waWNSZXNwb25zZT4K" } }, { "ID": "4f2a52b6805bb59c", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "69" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTTlNUb3BpY1Jhd0Vycm9yT25SZWNlaXZlRnJvbUNsb3NlZFN1YnNjcmlwdGlvbi1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "117" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:47 GMT" ], "X-Amzn-Requestid": [ "47fbf4b1-3db2-511f-bfc6-968725555b54" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0Vycm9yT25SZWNlaXZlRnJvbUNsb3NlZFN1YnNjcmlwdGlvbi1zdWItMSJ9" } }, { "ID": "c587c7ca19a253b4", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "147" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0Vycm9yT25SZWNlaXZlRnJvbUNsb3NlZFN1YnNjcmlwdGlvbi1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "118" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:47 GMT" ], "X-Amzn-Requestid": [ "0194390b-65bd-5c25-89cc-5b3d7d5ac66e" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY1Jhd0Vycm9yT25SZWNlaXZlRnJvbUNsb3NlZFN1YnNjcmlwdGlvbi1zdWItMSJ9fQ==" } }, { "ID": "3bb1708ff92f56fa", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "520" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3RXJyb3JPblJlY2VpdmVGcm9tQ2xvc2VkU3Vic2NyaXB0aW9uLXN1Yi0xXCJcblx0XHR9XG5cdFx0XVxuXHRcdH0ifSwiUXVldWVVcmwiOiJodHRwczovL3Nxcy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS80NTY3NTI2NjU1NzYvU05TVG9waWNSYXdFcnJvck9uUmVjZWl2ZUZyb21DbG9zZWRTdWJzY3JpcHRpb24tc3ViLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:47 GMT" ], "X-Amzn-Requestid": [ "ef931110-81ca-5d39-b697-7326992dd772" ] }, "Body": "" } }, { "ID": "5c24aac024165631", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "336" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVN1YnNjcmliZSZBdHRyaWJ1dGVzLmVudHJ5LjEua2V5PVJhd01lc3NhZ2VEZWxpdmVyeSZBdHRyaWJ1dGVzLmVudHJ5LjEudmFsdWU9dHJ1ZSZFbmRwb2ludD1hcm4lM0Fhd3MlM0FzcXMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd0Vycm9yT25SZWNlaXZlRnJvbUNsb3NlZFN1YnNjcmlwdGlvbi1zdWItMSZQcm90b2NvbD1zcXMmVG9waWNBcm49YXJuJTNBYXdzJTNBc25zJTNBdXMtZWFzdC0yJTNBNDU2NzUyNjY1NTc2JTNBU05TVG9waWNSYXdFcnJvck9uUmVjZWl2ZUZyb21DbG9zZWRTdWJzY3JpcHRpb24tdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "403" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:47 GMT" ], "X-Amzn-Requestid": [ "aa412d57-5450-5144-87f8-4f614cb799ae" ] }, "Body": "PFN1YnNjcmliZVJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8U3Vic2NyaWJlUmVzdWx0PgogICAgPFN1YnNjcmlwdGlvbkFybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3RXJyb3JPblJlY2VpdmVGcm9tQ2xvc2VkU3Vic2NyaXB0aW9uLXRvcC0xOmI4YmFmNTNmLTVkNGMtNGU4MS04MGFiLWZlYzVkYzgwMTFhMjwvU3Vic2NyaXB0aW9uQXJuPgogIDwvU3Vic2NyaWJlUmVzdWx0PgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD5hYTQxMmQ1Ny01NDUwLTUxNDQtODdmOC00ZjYxNGNiNzk5YWU8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvU3Vic2NyaWJlUmVzcG9uc2U+Cg==" } }, { "ID": "68a2d8ab863ead98", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "191" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd0Vycm9yT25SZWNlaXZlRnJvbUNsb3NlZFN1YnNjcmlwdGlvbi10b3AtMSUzQWI4YmFmNTNmLTVkNGMtNGU4MS04MGFiLWZlYzVkYzgwMTFhMiZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:47 GMT" ], "X-Amzn-Requestid": [ "9eb65bcf-7b07-5cb6-8d27-39f963e0245c" ] }, "Body": "PFVuc3Vic2NyaWJlUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD45ZWI2NWJjZi03YjA3LTVjYjYtOGQyNy0zOWY5NjNlMDI0NWM8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvVW5zdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "3252de58ed03e0de", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "117" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd0Vycm9yT25SZWNlaXZlRnJvbUNsb3NlZFN1YnNjcmlwdGlvbi1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:47 GMT" ], "X-Amzn-Requestid": [ "384356ec-27b6-50c3-ae50-34da3f514a88" ] }, "Body": "" } }, { "ID": "9d57cfa4573bc63a", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "145" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPURlbGV0ZVRvcGljJlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQVNOU1RvcGljUmF3RXJyb3JPblJlY2VpdmVGcm9tQ2xvc2VkU3Vic2NyaXB0aW9uLXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:48 GMT" ], "X-Amzn-Requestid": [ "6442ea80-c328-5f77-8cf9-88b6dbc0d79d" ] }, "Body": "PERlbGV0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD42NDQyZWE4MC1jMzI4LTVmNzctOGNmOS04OGI2ZGJjMGQ3OWQ8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvRGVsZXRlVG9waWNSZXNwb25zZT4K" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSNSTopicRaw/TestErrorOnSendToClosedTopic.replay ================================================ { "Initial": "AQAAAA7hTg2mBv8FJAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "689d698e98396bd7", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "84" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPUNyZWF0ZVRvcGljJk5hbWU9U05TVG9waWNSYXdFcnJvck9uU2VuZFRvQ2xvc2VkVG9waWMtdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "348" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:46 GMT" ], "X-Amzn-Requestid": [ "998e3d6a-ab20-5a3a-beec-5f5cb3c6ab5c" ] }, "Body": "PENyZWF0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxDcmVhdGVUb3BpY1Jlc3VsdD4KICAgIDxUb3BpY0Fybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3RXJyb3JPblNlbmRUb0Nsb3NlZFRvcGljLXRvcC0xPC9Ub3BpY0Fybj4KICA8L0NyZWF0ZVRvcGljUmVzdWx0PgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD45OThlM2Q2YS1hYjIwLTVhM2EtYmVlYy01ZjVjYjNjNmFiNWM8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvQ3JlYXRlVG9waWNSZXNwb25zZT4K" } }, { "ID": "f773d563432f486f", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "133" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPURlbGV0ZVRvcGljJlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQVNOU1RvcGljUmF3RXJyb3JPblNlbmRUb0Nsb3NlZFRvcGljLXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:46 GMT" ], "X-Amzn-Requestid": [ "02161f1e-a50d-5422-8b38-7d28bdeb2544" ] }, "Body": "PERlbGV0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD4wMjE2MWYxZS1hNTBkLTU0MjItOGIzOC03ZDI4YmRlYjI1NDQ8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvRGVsZXRlVG9waWNSZXNwb25zZT4K" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSNSTopicRaw/TestMetadata.replay ================================================ { "Initial": "AQAAAA7hTg2wLvMftgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "080ef99fd37d9e3b", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "68" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPUNyZWF0ZVRvcGljJk5hbWU9U05TVG9waWNSYXdNZXRhZGF0YS10b3AtMSZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "332" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:57 GMT" ], "X-Amzn-Requestid": [ "d9bd1ab9-131c-521c-9ae0-788f0bed1674" ] }, "Body": "PENyZWF0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxDcmVhdGVUb3BpY1Jlc3VsdD4KICAgIDxUb3BpY0Fybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3TWV0YWRhdGEtdG9wLTE8L1RvcGljQXJuPgogIDwvQ3JlYXRlVG9waWNSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPmQ5YmQxYWI5LTEzMWMtNTIxYy05YWUwLTc4OGYwYmVkMTY3NDwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9DcmVhdGVUb3BpY1Jlc3BvbnNlPgo=" } }, { "ID": "426d4ae958ebab6a", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "41" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTTlNUb3BpY1Jhd01ldGFkYXRhLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "89" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:57 GMT" ], "X-Amzn-Requestid": [ "f9e5b88d-44ad-5383-8851-dabb5c5cedb7" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd01ldGFkYXRhLXN1Yi0xIn0=" } }, { "ID": "4b5be636e0fa8b11", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "119" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd01ldGFkYXRhLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "90" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:57 GMT" ], "X-Amzn-Requestid": [ "de0f813c-9212-542c-839f-e30a8ae36a18" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY1Jhd01ldGFkYXRhLXN1Yi0xIn19" } }, { "ID": "e6712e124e62539e", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "464" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3TWV0YWRhdGEtc3ViLTFcIlxuXHRcdH1cblx0XHRdXG5cdFx0fSJ9LCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd01ldGFkYXRhLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:57 GMT" ], "X-Amzn-Requestid": [ "2746aab0-2037-5431-9f9a-c88638c6ba05" ] }, "Body": "" } }, { "ID": "bcd0df8fa702afbf", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "280" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVN1YnNjcmliZSZBdHRyaWJ1dGVzLmVudHJ5LjEua2V5PVJhd01lc3NhZ2VEZWxpdmVyeSZBdHRyaWJ1dGVzLmVudHJ5LjEudmFsdWU9dHJ1ZSZFbmRwb2ludD1hcm4lM0Fhd3MlM0FzcXMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd01ldGFkYXRhLXN1Yi0xJlByb3RvY29sPXNxcyZUb3BpY0Fybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd01ldGFkYXRhLXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "375" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:57 GMT" ], "X-Amzn-Requestid": [ "e7147a84-f596-5911-9229-18b2ed678d79" ] }, "Body": "PFN1YnNjcmliZVJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8U3Vic2NyaWJlUmVzdWx0PgogICAgPFN1YnNjcmlwdGlvbkFybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3TWV0YWRhdGEtdG9wLTE6YTBjZjMwYzktZGY2Yy00YzNkLTlkYTgtMTBmOGE4MzZjZDljPC9TdWJzY3JpcHRpb25Bcm4+CiAgPC9TdWJzY3JpYmVSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPmU3MTQ3YTg0LWY1OTYtNTkxMS05MjI5LTE4YjJlZDY3OGQ3OTwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9TdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "3747d5a7a21a6ae1", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "3733" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9aGVsbG8rd29ybGQmUHVibGlzaEJhdGNoUmVxdWVzdEVudHJpZXMubWVtYmVyLjEuQ0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:57 GMT" ], "X-Amzn-Requestid": [ "f1d8d6d7-07ef-53be-8734-b4e11f1e17d6" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPmVmNWMyYjFmLTdlODktNTczYy05YzdkLTQ5Mjk2Njc4YjM1NDwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPmYxZDhkNmQ3LTA3ZWYtNTNiZS04NzM0LWI0ZTExZjFlMTdkNjwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "dacf9ce074b825ee", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "170" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd01ldGFkYXRhLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2276" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:57 GMT" ], "X-Amzn-Requestid": [ "e26a8567-5278-5655-a785-e7514a89f861" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjU3OTI2IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNTc4ODcifSwiQm9keSI6ImhlbGxvIHdvcmxkIiwiTUQ1T2ZCb2R5IjoiNWViNjNiYmJlMDFlZWVkMDkzY2IyMmJiOGY1YWNkYzMiLCJNRDVPZk1lc3NhZ2VBdHRyaWJ1dGVzIjoiZjNmYmZkZTFlODI1MjRkZWMwOGU0YjVmNjYwYTEwNmMiLCJNZXNzYWdlQXR0cmlidXRlcyI6eyIxMjM0NSI6eyJEYXRhVHlwZSI6IlN0cmluZyIsIlN0cmluZ1ZhbHVlIjoiMTIzNDUifSwiX18weDBfX19fMHgxX19fXzB4Ml9fX18weDNfX19fMHg0X19fXzB4NV9fX18weDZfX19fMHg3X19fXzB4OF9fX18weDlfX19fMHhhX19fXzB4Yl9fX18weGNfX19fMHhkX19fXzB4ZV9fX18weGZfXyI6eyJEYXRhVHlwZSI6IlN0cmluZyIsIlN0cmluZ1ZhbHVlIjoiJTAwJTAxJTAyJTAzJTA0JTA1JTA2JTA3JTA4JTA5JTBBJTBCJTBDJTBEJTBFJTBGIn0sIl9fMHgxMF9fX18weDExX19fXzB4MTJfX19fMHgxM19fX18weDE0X19fXzB4MTVfX19fMHgxNl9fX18weDE3X19fXzB4MThfX19fMHgxOV9fX18weDFhX19fXzB4MWJfX19fMHgxY19fX18weDFkX19fXzB4MWVfX19fMHgxZl9fIjp7IkRhdGFUeXBlIjoiU3RyaW5nIiwiU3RyaW5nVmFsdWUiOiIlMTAlMTElMTIlMTMlMTQlMTUlMTYlMTclMTglMTklMUElMUIlMUMlMUQlMUUlMUYifSwiX18weDIwX19fXzB4MjFfX19fMHgyMl9fX18weDIzX19fXzB4MjRfX19fMHgyNV9fX18weDI2X19fXzB4MjdfX19fMHgyOF9fX18weDI5X19fXzB4MmFfX19fMHgyYl9fX18weDJjX18tLl9fMHgyZl9fIjp7IkRhdGFUeXBlIjoiU3RyaW5nIiwiU3RyaW5nVmFsdWUiOiIlMjAlMjElMjIlMjMkJTI1JiUyNyUyOCUyOSUyQSslMkMtLiUyRiJ9LCJfXzB4MmVfX19fMHgyZV9fX18weDJmX19mb29fXzB4MmZfXy5fXzB4MmVfX19fMHgyZl9fYmFyX18weDJmX18uX18weDJlX19fXzB4MmZfXy5fXzB4MmVfX19fMHgyZl9fYmF6Ll9fMHgyZV9fX18weDJmX18iOnsiRGF0YVR5cGUiOiJTdHJpbmciLCJTdHJpbmdWYWx1ZSI6Ii4uJTJGZm9vJTJGLi4lMkZiYXIlMkYuLiUyRi4uJTJGYmF6Li4lMkYifSwiX18weDJlX19fXzB4MmVfX19fMHg1Y19fZm9vX18weDVjX18uX18weDJlX19fXzB4NWNfX2Jhcl9fMHg1Y19fLl9fMHgyZV9fX18weDVjX18uX18weDJlX19fXzB4NWNfX2Jhei5fXzB4MmVfX19fMHg1Y19fIjp7IkRhdGFUeXBlIjoiU3RyaW5nIiwiU3RyaW5nVmFsdWUiOiIuLiU1Q2ZvbyU1Qy4uJTVDYmFyJTVDLi4lNUMuLiU1Q2Jhei4uJTVDIn0sIl9fMHgyZV9fX18weDJlX19fXzB4NWNfX2Zvb19fMHg1Y19fX18weDVjX19iYXJfXzB4NWNfX19fMHg1Y19fX18weDVjX19iYXoiOnsiRGF0YVR5cGUiOiJTdHJpbmciLCJTdHJpbmdWYWx1ZSI6Ii4uJTVDZm9vJTVDJTVDYmFyJTVDJTVDJTVDYmF6In0sIl9fMHgzYV9fX18weDNiX19fXzB4M2NfX19fMHgzZF9fX18weDNlX19fXzB4M2ZfXyI6eyJEYXRhVHlwZSI6IlN0cmluZyIsIlN0cmluZ1ZhbHVlIjoiOiUzQiUzQz0lM0UlM0YifSwiX18weDQwX18iOnsiRGF0YVR5cGUiOiJTdHJpbmciLCJTdHJpbmdWYWx1ZSI6IkAifSwiX18weDViX19fXzB4NWNfX19fMHg1ZF9fX18weDVlX19fIjp7IkRhdGFUeXBlIjoiU3RyaW5nIiwiU3RyaW5nVmFsdWUiOiIlNUIlNUMlNUQlNUVfIn19LCJNZXNzYWdlSWQiOiI2OTIzZjMyMy0xYjIyLTQyMzEtOTg4Yi00ZDJmMjEwZTQ3MzIiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQnJQa3MzTzJTSE5xOTU1dDd2RmtqaEcxbXJoN05STEVXVFovUEpjcFNBdzNpajEzb1RNUFk5eDFyN2dzRnJYbDQ0c3E0dHIyVTdvcTJPYzBGSkdFbTNjZittdm84U0FPdG5vYkNGRnRCRjlFZThJRjAzQ1VFTnFPYnh6VGtJSmo3VDhPU3M2SVU3eEhmTTlPekpSdjZVOUtFT3BnOVRHM1ZKVHFLMkhRZjRtN3NNWkN4QTRlREIrSGZ4Z002SVNlUU5YS2NaS0xaNVEwS1cxTDd0dWRoN3hISTRmU0p6cEdhNHFBNGVPdXdrUTR4VDVzVStwZHRHbGY0TWVINEh3QkxNYitvOE9Hc1BOK0d3aStRaXBXSGpDS2FXcVZGK0taY3ppeG5taVVwNTVsL3pCUm9ZWVJPaHg0alBRK2xxR08rMW5FWk5oR3JrRWFuTEZ4RHdJd2NXMGFpMVlYYy91RHhmcTZOVG5mVGEyUXRwMDJmRGxmUnFhaVBQb2tBb1RxZ241dHQ4VlZWUkNFY0o3RlNPSWxueGc9PSJ9XX0=" } }, { "ID": "e834c7312ddcf88d", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "543" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQnJQa3MzTzJTSE5xOTU1dDd2RmtqaEcxbXJoN05STEVXVFovUEpjcFNBdzNpajEzb1RNUFk5eDFyN2dzRnJYbDQ0c3E0dHIyVTdvcTJPYzBGSkdFbTNjZittdm84U0FPdG5vYkNGRnRCRjlFZThJRjAzQ1VFTnFPYnh6VGtJSmo3VDhPU3M2SVU3eEhmTTlPekpSdjZVOUtFT3BnOVRHM1ZKVHFLMkhRZjRtN3NNWkN4QTRlREIrSGZ4Z002SVNlUU5YS2NaS0xaNVEwS1cxTDd0dWRoN3hISTRmU0p6cEdhNHFBNGVPdXdrUTR4VDVzVStwZHRHbGY0TWVINEh3QkxNYitvOE9Hc1BOK0d3aStRaXBXSGpDS2FXcVZGK0taY3ppeG5taVVwNTVsL3pCUm9ZWVJPaHg0alBRK2xxR08rMW5FWk5oR3JrRWFuTEZ4RHdJd2NXMGFpMVlYYy91RHhmcTZOVG5mVGEyUXRwMDJmRGxmUnFhaVBQb2tBb1RxZ241dHQ4VlZWUkNFY0o3RlNPSWxueGc9PSJ9XSwiUXVldWVVcmwiOiJodHRwczovL3Nxcy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS80NTY3NTI2NjU1NzYvU05TVG9waWNSYXdNZXRhZGF0YS1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:57 GMT" ], "X-Amzn-Requestid": [ "d445c71b-f7f8-55d6-a415-a52def099be2" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "9ed22d950e97fdf3", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "2487" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9aGVsbG8rd29ybGQmUHVibGlzaEJhdGNoUmVxdWVzdEVudHJpZXMubWVtYmVyLjEuQ0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:57 GMT" ], "X-Amzn-Requestid": [ "8b7ea551-9e51-5eb0-8bd8-c76786a05ad8" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPjE0ZGRhYTY4LWE5OWEtNTJhZS05OTg5LWM4NWViMTZiYjZjNjwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjhiN2VhNTUxLTllNTEtNWViMC04YmQ4LWM3Njc4NmEwNWFkODwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "fab137da047753cd", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "170" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd01ldGFkYXRhLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1515" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:58 GMT" ], "X-Amzn-Requestid": [ "89e046dc-1082-56d6-b6b8-24ea087068e2" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjU4MDg0IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNTgwMjIifSwiQm9keSI6ImhlbGxvIHdvcmxkIiwiTUQ1T2ZCb2R5IjoiNWViNjNiYmJlMDFlZWVkMDkzY2IyMmJiOGY1YWNkYzMiLCJNRDVPZk1lc3NhZ2VBdHRyaWJ1dGVzIjoiZGU4YmE3MGUyOTA3NjljYTE4NTQzZGE5MjQwZGUwMjUiLCJNZXNzYWdlQXR0cmlidXRlcyI6eyJfXzB4MjYzYV9fX18weDI2M2FfX19fMHgyNjNhX18iOnsiRGF0YVR5cGUiOiJTdHJpbmciLCJTdHJpbmdWYWx1ZSI6IiVFMiU5OCVCQSVFMiU5OCVCQSVFMiU5OCVCQSJ9LCJfXzB4NjBfXyI6eyJEYXRhVHlwZSI6IlN0cmluZyIsIlN0cmluZ1ZhbHVlIjoiJTYwIn0sIl9fMHg3Yl9fX18weDdjX19fXzB4N2RfX19fMHg3ZV9fX18weDdmX18iOnsiRGF0YVR5cGUiOiJTdHJpbmciLCJTdHJpbmdWYWx1ZSI6IiU3QiU3QyU3RH4lN0YifSwiZm9vX18weDIwX19iYXJfXzB4MjBfX2JheiI6eyJEYXRhVHlwZSI6IlN0cmluZyIsIlN0cmluZ1ZhbHVlIjoiZm9vJTIwYmFyJTIwYmF6In0sImZvb19fMHgyMl9fYmFyX18weDIyX19iYXoiOnsiRGF0YVR5cGUiOiJTdHJpbmciLCJTdHJpbmdWYWx1ZSI6ImZvbyUyMmJhciUyMmJheiJ9LCJmb29fXzB4MmZfX19fMHgyZl9fYmFyX18weDJmX19fXzB4MmZfX19fMHgyZl9fYmF6Ijp7IkRhdGFUeXBlIjoiU3RyaW5nIiwiU3RyaW5nVmFsdWUiOiJmb28lMkYlMkZiYXIlMkYlMkYlMkZiYXoifSwiZm9vX18weDJmX19iYXJfXzB4MmZfX2JheiI6eyJEYXRhVHlwZSI6IlN0cmluZyIsIlN0cmluZ1ZhbHVlIjoiZm9vJTJGYmFyJTJGYmF6In0sImZvb19fMHg1Y19fYmFyX18weDVjX19iYXoiOnsiRGF0YVR5cGUiOiJTdHJpbmciLCJTdHJpbmdWYWx1ZSI6ImZvbyU1Q2JhciU1Q2JheiJ9fSwiTWVzc2FnZUlkIjoiMjExMDkzYzAtNzgyZC00ZmYzLThkYjItYTM3NjlkY2U2NTYwIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUIrd05ZWnZBWlRkWFU5SlQ4WkxNdDl4YXZvWXg3OTVIQnhRTHBzdlFKTHFvSmppbnJPbElaVEFKWTV4aHVMZUlmdDU2SDJ4YU1LMGc0cmM2dDdjUSsyaWhURUZFaDk4dE9uRUxZdHQrMnVaZjl4V1p4NjVwckVCYXFMUnd4QnYwSks1MUxPWUlZTVBmVEFXTjV2UFNienpxVUhYb0UrREM1M2dtRGYxS2w4bzA1ZlVHRDYxZEg2eU56YWhLVDFBWS84L3ZaYmNrT3VjUFJVUjZHL05hMVlvdVFDNnU5dXFCSFRaSzJaMGdkaWQ0WlNFaVlXanVBNzZkQlZxYlVyUDc3RjlQZHE3ZURQMHpnQkFDbVlFVFVCWldJbzk4MlVaYllqNm5aVEl1TzhYSXZtWHN5dllvM1VNd0JrUlY4cVRwU2hBRWV6NUV0WlBiZ3FBTW1zTzFnN2I3cVhBRWx6Ukl4SXZ0a3dmYzlDZlpaRTVqZDRhcGxiZzBZOHdrVkF6R0VRWWw2NDFrQkU3c3hidTVwbElQZnpBPT0ifV19" } }, { "ID": "c0b5e3822c345bae", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "543" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQit3TlladkFaVGRYVTlKVDhaTE10OXhhdm9ZeDc5NUhCeFFMcHN2UUpMcW9Kamluck9sSVpUQUpZNXhodUxlSWZ0NTZIMnhhTUswZzRyYzZ0N2NRKzJpaFRFRkVoOTh0T25FTFl0dCsydVpmOXhXWng2NXByRUJhcUxSd3hCdjBKSzUxTE9ZSVlNUGZUQVdONXZQU2J6enFVSFhvRStEQzUzZ21EZjFLbDhvMDVmVUdENjFkSDZ5TnphaEtUMUFZLzgvdlpiY2tPdWNQUlVSNkcvTmExWW91UUM2dTl1cUJIVFpLMlowZ2RpZDRaU0VpWVdqdUE3NmRCVnFiVXJQNzdGOVBkcTdlRFAwemdCQUNtWUVUVUJaV0lvOTgyVVpiWWo2blpUSXVPOFhJdm1Yc3l2WW8zVU13QmtSVjhxVHBTaEFFZXo1RXRaUGJncUFNbXNPMWc3YjdxWEFFbHpSSXhJdnRrd2ZjOUNmWlpFNWpkNGFwbGJnMFk4d2tWQXpHRVFZbDY0MWtCRTdzeGJ1NXBsSVBmekE9PSJ9XSwiUXVldWVVcmwiOiJodHRwczovL3Nxcy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS80NTY3NTI2NjU1NzYvU05TVG9waWNSYXdNZXRhZGF0YS1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:58 GMT" ], "X-Amzn-Requestid": [ "8a04fb67-15fa-5a6a-82b1-99510d08045e" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "02bb3e3ede4640de", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "163" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd01ldGFkYXRhLXRvcC0xJTNBYTBjZjMwYzktZGY2Yy00YzNkLTlkYTgtMTBmOGE4MzZjZDljJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:58 GMT" ], "X-Amzn-Requestid": [ "265667f7-5e27-5112-b76d-05c146d5857a" ] }, "Body": "PFVuc3Vic2NyaWJlUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD4yNjU2NjdmNy01ZTI3LTUxMTItYjc2ZC0wNWMxNDZkNTg1N2E8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvVW5zdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "bc8e22f7cbb24819", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "89" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd01ldGFkYXRhLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:58 GMT" ], "X-Amzn-Requestid": [ "7856596c-bbe3-500b-8132-3b5aa3115e3f" ] }, "Body": "" } }, { "ID": "9cbe5b1e58db824c", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "117" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPURlbGV0ZVRvcGljJlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQVNOU1RvcGljUmF3TWV0YWRhdGEtdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:58 GMT" ], "X-Amzn-Requestid": [ "5f3e58f4-b0af-59af-b6a6-3ac2a85dcdc7" ] }, "Body": "PERlbGV0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD41ZjNlNThmNC1iMGFmLTU5YWYtYjZhNi0zYWMyYTg1ZGNkYzc8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvRGVsZXRlVG9waWNSZXNwb25zZT4K" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSNSTopicRaw/TestNack.replay ================================================ { "Initial": "AQAAAA7hTg23ExuEIQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "bfd8043b7753c6e2", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "64" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPUNyZWF0ZVRvcGljJk5hbWU9U05TVG9waWNSYXdOYWNrLXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "328" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:03 GMT" ], "X-Amzn-Requestid": [ "704e927a-53f9-5810-b5fe-f04c4b0ebf17" ] }, "Body": "PENyZWF0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxDcmVhdGVUb3BpY1Jlc3VsdD4KICAgIDxUb3BpY0Fybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3TmFjay10b3AtMTwvVG9waWNBcm4+CiAgPC9DcmVhdGVUb3BpY1Jlc3VsdD4KICA8UmVzcG9uc2VNZXRhZGF0YT4KICAgIDxSZXF1ZXN0SWQ+NzA0ZTkyN2EtNTNmOS01ODEwLWI1ZmUtZjA0YzRiMGViZjE3PC9SZXF1ZXN0SWQ+CiAgPC9SZXNwb25zZU1ldGFkYXRhPgo8L0NyZWF0ZVRvcGljUmVzcG9uc2U+Cg==" } }, { "ID": "1d684e904de89ab8", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "37" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTTlNUb3BpY1Jhd05hY2stc3ViLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "85" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:03 GMT" ], "X-Amzn-Requestid": [ "8ba74e03-ea4c-506c-9b06-2c35f2bb227d" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd05hY2stc3ViLTEifQ==" } }, { "ID": "029294a89da34162", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "115" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd05hY2stc3ViLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "86" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:04 GMT" ], "X-Amzn-Requestid": [ "82a381e3-581c-5406-af53-e3d540e4b617" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY1Jhd05hY2stc3ViLTEifX0=" } }, { "ID": "d6619cd28bdf997d", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "456" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3TmFjay1zdWItMVwiXG5cdFx0fVxuXHRcdF1cblx0XHR9In0sIlF1ZXVlVXJsIjoiaHR0cHM6Ly9zcXMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vNDU2NzUyNjY1NTc2L1NOU1RvcGljUmF3TmFjay1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:04 GMT" ], "X-Amzn-Requestid": [ "f477b682-8cfd-5418-9bf9-d4b494057609" ] }, "Body": "" } }, { "ID": "0606f6d2aa9ebec9", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "272" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVN1YnNjcmliZSZBdHRyaWJ1dGVzLmVudHJ5LjEua2V5PVJhd01lc3NhZ2VEZWxpdmVyeSZBdHRyaWJ1dGVzLmVudHJ5LjEudmFsdWU9dHJ1ZSZFbmRwb2ludD1hcm4lM0Fhd3MlM0FzcXMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd05hY2stc3ViLTEmUHJvdG9jb2w9c3FzJlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQVNOU1RvcGljUmF3TmFjay10b3AtMSZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "371" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:04 GMT" ], "X-Amzn-Requestid": [ "b8d0926c-5e20-5231-853d-f05a46d8e536" ] }, "Body": "PFN1YnNjcmliZVJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8U3Vic2NyaWJlUmVzdWx0PgogICAgPFN1YnNjcmlwdGlvbkFybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3TmFjay10b3AtMTplZGRiOTE3Mi0wMzg1LTRhOWEtODBlNi05MTExZjE0MjQ4MmI8L1N1YnNjcmlwdGlvbkFybj4KICA8L1N1YnNjcmliZVJlc3VsdD4KICA8UmVzcG9uc2VNZXRhZGF0YT4KICAgIDxSZXF1ZXN0SWQ+YjhkMDkyNmMtNWUyMC01MjMxLTg1M2QtZjA1YTQ2ZDhlNTM2PC9SZXF1ZXN0SWQ+CiAgPC9SZXNwb25zZU1ldGFkYXRhPgo8L1N1YnNjcmliZVJlc3BvbnNlPgo=" } }, { "ID": "a38fb88e1afa5cda", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "436" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9MCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5DTEVBUkVE" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:04 GMT" ], "X-Amzn-Requestid": [ "ed0d7f92-b318-5f0e-b147-1da4abe05809" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPjFkZDU0NTMzLWJkMWUtNTNiZS04YzBjLTI3MDVhNWU2ZjRiOTwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPmVkMGQ3ZjkyLWIzMTgtNWYwZS1iMTQ3LTFkYTRhYmUwNTgwOTwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "693be16ca2cd8183", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "436" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9MSZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5DTEVBUkVE" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:04 GMT" ], "X-Amzn-Requestid": [ "1e4a4759-2543-55c5-a6eb-256f3dbbe2c2" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPmFjYjU1NWM5LWY2YmEtNTFjMy04MjI1LTM3ZmZlZTQyZDZjNDwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjFlNGE0NzU5LTI1NDMtNTVjNS1hNmViLTI1NmYzZGJiZTJjMjwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "2a6e85772a4c159a", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "166" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd05hY2stc3ViLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "859" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:04 GMT" ], "X-Amzn-Requestid": [ "a89c4d4e-d58f-5199-8442-2f78cd77f388" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjY0NTQwIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNjQ1MDIifSwiQm9keSI6IjEiLCJNRDVPZkJvZHkiOiJjNGNhNDIzOGEwYjkyMzgyMGRjYzUwOWE2Zjc1ODQ5YiIsIk1ENU9mTWVzc2FnZUF0dHJpYnV0ZXMiOiIzMTRjNzdiMjQ5ODkzYzZiM2M3NjVhNDJjYzA4YjI0NSIsIk1lc3NhZ2VBdHRyaWJ1dGVzIjp7ImEiOnsiRGF0YVR5cGUiOiJTdHJpbmciLCJTdHJpbmdWYWx1ZSI6IjEifX0sIk1lc3NhZ2VJZCI6ImFjNzdkOTMyLWE4ZWQtNDhjOS1iZWE4LWQ4NDdkZTdiOWYwOSIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCNWtNRnBPQ1lZU2JTQUl2R1Q5bU0xbW9CY0dlNUVDZzhwZzhSa1VkWWxDRHdGZit2bXR6dGhUVHZNOHRidDVEVzcwNzhRbEhrWGJuVUVZc3NHSUZXSHd6STlOYzc0QVpwUkRqQWhmZEhkb2EweWNiNG9IN2srVmsvcHQzVEI0YVdjUUFWL1F6b0hTYVZLN00xUG8zeEM4aXJMd2dUVUkvVHZQZk1BcllRRGV5ZVBiOFQ3MEJHQ3g4K0lXNHFpMGthcFRiWk42emxUMUlmYTZwS1ZVdnU4R0JzK1A1YWJUaXpTWXlmR21WQytERUNOQUhYaHI4VW9IUG8vQ0h6bHQ3MHNyMVJNRnJOVU1HTjRRdWhqbmEvY0lENFR1SHBRaEFLUi90aHRCVDFIWngvVjFGVzdnUGVjQlQ4L0dJTnFSTTFVSkFlck9tVnY5emY2RlZDdjV0SXBEakpqT0M0VXZDZEFkOTh0Q1VHVi90Y3htb1oxeTRlN04yanJsN1k3aThyVE1TOUxoeUtCVG0xbGVWS2FSMHU5QT09In1dfQ==" } }, { "ID": "5e1b8708af7a7083", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "166" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd05hY2stc3ViLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "859" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:04 GMT" ], "X-Amzn-Requestid": [ "0d5263e5-50db-5719-81d3-01d348239508" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjY0NjE5IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNjQ0MjUifSwiQm9keSI6IjAiLCJNRDVPZkJvZHkiOiJjZmNkMjA4NDk1ZDU2NWVmNjZlN2RmZjlmOTg3NjRkYSIsIk1ENU9mTWVzc2FnZUF0dHJpYnV0ZXMiOiI5YWE0Njg3YzhiNzU2N2JhYTM4MGQ5ZjMwMGZlMjgzYSIsIk1lc3NhZ2VBdHRyaWJ1dGVzIjp7ImEiOnsiRGF0YVR5cGUiOiJTdHJpbmciLCJTdHJpbmdWYWx1ZSI6IjAifX0sIk1lc3NhZ2VJZCI6ImQ0M2E3NzhlLTY4YjAtNDEwZS05MGExLWVjYjM2ZDNiMzUzNiIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCdjNQYmUrcWJtV2FxRmI0VXhNUHY3U3dQSTlFU2dMTnNoZmpKY1ZDc0hPR2J4ZmNJaE9MOU1HbU55bEs4dWFnVEhJbkF3UHo1dm5QSVRhYTJsQXNRUU5KSXY1bFc2dDg1bEJreUZGMXBsbzZOZTVxNFZFNkhZZTVoRzMrYXJUUEVlZjNZKzJHZ1VTcmRwSEY3NGxxMVZtU2ZRZ1d3VEtsRVp5N2VxNmZublorcmJtTDQrNk9kN3J1WEx1bXdEOE5TaVZtOG9tQUVvQlhBWVU0ZWowOS9mblpQQUt5S3NONDBYZ0pZVDd5V1FJMnhhOWZIS0VXTWdlY3RxY091a2Z1UzdPYjhJZ0JueTBhaXpMc2VheGpGYzdMcVlQVE5uc3NFU3ljMVFWd250WHp2N21mb3huWWZXejRWMWtFeWcwbjdtcStsVmR5QUtVNWxiRGFmMkV5aFVCMGlZRzk1OGtkZ1RPeHQxZS84Z0lMY3FLSUhPa3lBU0dxa2dyanVzUzNIL2s3UzNDc1FrSm4rSWZHazR6RnhmUT09In1dfQ==" } }, { "ID": "3e29ea171dcfb8c8", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "561" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ChangeMessageVisibilityBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQjVrTUZwT0NZWVNiU0FJdkdUOW1NMW1vQmNHZTVFQ2c4cGc4UmtVZFlsQ0R3RmYrdm10enRoVFR2TTh0YnQ1RFc3MDc4UWxIa1hiblVFWXNzR0lGV0h3ekk5TmM3NEFacFJEakFoZmRIZG9hMHljYjRvSDdrK1ZrL3B0M1RCNGFXY1FBVi9Rem9IU2FWSzdNMVBvM3hDOGlyTHdnVFVJL1R2UGZNQXJZUURleWVQYjhUNzBCR0N4OCtJVzRxaTBrYXBUYlpONnpsVDFJZmE2cEtWVXZ1OEdCcytQNWFiVGl6U1l5ZkdtVkMrREVDTkFIWGhyOFVvSFBvL0NIemx0NzBzcjFSTUZyTlVNR040UXVoam5hL2NJRDRUdUhwUWhBS1IvdGh0QlQxSFp4L1YxRlc3Z1BlY0JUOC9HSU5xUk0xVUpBZXJPbVZ2OXpmNkZWQ3Y1dElwRGpKak9DNFV2Q2RBZDk4dENVR1YvdGN4bW9aMXk0ZTdOMmpybDdZN2k4clRNUzlMaHlLQlRtMWxlVkthUjB1OUE9PSIsIlZpc2liaWxpdHlUaW1lb3V0IjoxfV0sIlF1ZXVlVXJsIjoiaHR0cHM6Ly9zcXMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vNDU2NzUyNjY1NTc2L1NOU1RvcGljUmF3TmFjay1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:04 GMT" ], "X-Amzn-Requestid": [ "578e1b2e-4861-5d7d-abaa-791850997f6c" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "d53a27baf35421f3", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "166" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd05hY2stc3ViLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:04 GMT" ], "X-Amzn-Requestid": [ "020239c4-8950-56bc-927f-5bf291a874ad" ] }, "Body": "e30=" } }, { "ID": "fd8015f40f7918a3", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "561" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ChangeMessageVisibilityBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQnYzUGJlK3FibVdhcUZiNFV4TVB2N1N3UEk5RVNnTE5zaGZqSmNWQ3NIT0dieGZjSWhPTDlNR21OeWxLOHVhZ1RISW5Bd1B6NXZuUElUYWEybEFzUVFOSkl2NWxXNnQ4NWxCa3lGRjFwbG82TmU1cTRWRTZIWWU1aEczK2FyVFBFZWYzWSsyR2dVU3JkcEhGNzRscTFWbVNmUWdXd1RLbEVaeTdlcTZmbm5aK3JibUw0KzZPZDdydVhMdW13RDhOU2lWbThvbUFFb0JYQVlVNGVqMDkvZm5aUEFLeUtzTjQwWGdKWVQ3eVdRSTJ4YTlmSEtFV01nZWN0cWNPdWtmdVM3T2I4SWdCbnkwYWl6THNlYXhqRmM3THFZUFRObnNzRVN5YzFRVndudFh6djdtZm94bllmV3o0VjFrRXlnMG43bXErbFZkeUFLVTVsYkRhZjJFeWhVQjBpWUc5NThrZGdUT3h0MWUvOGdJTGNxS0lIT2t5QVNHcWtncmp1c1MzSC9rN1MzQ3NRa0puK0lmR2s0ekZ4ZlE9PSIsIlZpc2liaWxpdHlUaW1lb3V0IjoxfV0sIlF1ZXVlVXJsIjoiaHR0cHM6Ly9zcXMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vNDU2NzUyNjY1NTc2L1NOU1RvcGljUmF3TmFjay1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:04 GMT" ], "X-Amzn-Requestid": [ "fe9ac95b-e9f5-5c80-94e8-ab6df10d2e91" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "b56190d5c3251be4", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "166" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd05hY2stc3ViLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:05 GMT" ], "X-Amzn-Requestid": [ "0e5dcb27-c6f7-5e5c-8ace-a911de0e9c4d" ] }, "Body": "e30=" } }, { "ID": "cc8fd095febfbfd8", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "166" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd05hY2stc3ViLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:05 GMT" ], "X-Amzn-Requestid": [ "17fba773-f9b2-5786-b7b7-c545e14ba597" ] }, "Body": "e30=" } }, { "ID": "d2700136e8e15928", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "166" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd05hY2stc3ViLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "859" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:05 GMT" ], "X-Amzn-Requestid": [ "815aab78-086a-58f2-90c7-c94e10932ae3" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjY0NTQwIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIyIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNjQ1MDIifSwiQm9keSI6IjEiLCJNRDVPZkJvZHkiOiJjNGNhNDIzOGEwYjkyMzgyMGRjYzUwOWE2Zjc1ODQ5YiIsIk1ENU9mTWVzc2FnZUF0dHJpYnV0ZXMiOiIzMTRjNzdiMjQ5ODkzYzZiM2M3NjVhNDJjYzA4YjI0NSIsIk1lc3NhZ2VBdHRyaWJ1dGVzIjp7ImEiOnsiRGF0YVR5cGUiOiJTdHJpbmciLCJTdHJpbmdWYWx1ZSI6IjEifX0sIk1lc3NhZ2VJZCI6ImFjNzdkOTMyLWE4ZWQtNDhjOS1iZWE4LWQ4NDdkZTdiOWYwOSIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCOTZtNXp2Qm9hUVVxb2IyWGtBOHd4QzF0c0tiUG5YM2pSZjlNN3h6dFNBZEdHcjJzYjJ5T2hoMnZlMG5ZQUJlczFCVE1UK21uZmt1ZXBJOG1Fam5ZRTNiOGNpTVQ3OWhDQy9Yd2N5c0Z5dDNaZDBwblJBY1o4UVBqREtHcThhQnIwcTZ6Y1p1a09hdi91SGtFUlltNngvSEVIQlZSdWErWHZKQ3hTK2ZTRlNHODJsSDdWRWs3aTI1dVpwdlZQL3M1QU5jMmNlVGtNRGlLbVJvZjR5cHlBNWN5U1hjdFo4cFpWZTY1SkdTeG1hN0lNdVhlWE5YOVg5OFVNVHlldEYrRlJuTFlZdmpiNlYxTVhjcVdiNDBmUVlTNzdOTUNYRGtqUFA0TFRQOEUxdEpQbmo3anprLzJPTHN0L2dCZlFEZVZ5eTB6L3gzUUlLL0RYUXpPcWxMaGRhaW80SGdhRFZ3UlBGSFp3eUc3QkQ5aDJnOFQvME9Ca2plVVNPU2lNeUxFemRPSkF0MmI3bldQY3FMQWxJWnAxZz09In1dfQ==" } }, { "ID": "3c115f1fc2e2e320", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "539" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQjk2bTV6dkJvYVFVcW9iMlhrQTh3eEMxdHNLYlBuWDNqUmY5TTd4enRTQWRHR3Iyc2IyeU9oaDJ2ZTBuWUFCZXMxQlRNVCttbmZrdWVwSThtRWpuWUUzYjhjaU1UNzloQ0MvWHdjeXNGeXQzWmQwcG5SQWNaOFFQakRLR3E4YUJyMHE2emNadWtPYXYvdUhrRVJZbTZ4L0hFSEJWUnVhK1h2SkN4UytmU0ZTRzgybEg3VkVrN2kyNXVacHZWUC9zNUFOYzJjZVRrTURpS21Sb2Y0eXB5QTVjeVNYY3RaOHBaVmU2NUpHU3htYTdJTXVYZVhOWDlYOThVTVR5ZXRGK0ZSbkxZWXZqYjZWMU1YY3FXYjQwZlFZUzc3Tk1DWERralBQNExUUDhFMXRKUG5qN2p6ay8yT0xzdC9nQmZRRGVWeXkwei94M1FJSy9EWFF6T3FsTGhkYWlvNEhnYURWd1JQRkhad3lHN0JEOWgyZzhULzBPQmtqZVVTT1NpTXlMRXpkT0pBdDJiN25XUGNxTEFsSVpwMWc9PSJ9XSwiUXVldWVVcmwiOiJodHRwczovL3Nxcy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS80NTY3NTI2NjU1NzYvU05TVG9waWNSYXdOYWNrLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:05 GMT" ], "X-Amzn-Requestid": [ "920d1af9-f397-5c82-8af2-78cfeb6ebe93" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "7ba4509ea30395d8", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "166" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd05hY2stc3ViLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "859" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:05 GMT" ], "X-Amzn-Requestid": [ "2c3d50cc-6ae9-57a2-b37c-32fa7210de11" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjY0NjE5IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIyIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNjQ0MjUifSwiQm9keSI6IjAiLCJNRDVPZkJvZHkiOiJjZmNkMjA4NDk1ZDU2NWVmNjZlN2RmZjlmOTg3NjRkYSIsIk1ENU9mTWVzc2FnZUF0dHJpYnV0ZXMiOiI5YWE0Njg3YzhiNzU2N2JhYTM4MGQ5ZjMwMGZlMjgzYSIsIk1lc3NhZ2VBdHRyaWJ1dGVzIjp7ImEiOnsiRGF0YVR5cGUiOiJTdHJpbmciLCJTdHJpbmdWYWx1ZSI6IjAifX0sIk1lc3NhZ2VJZCI6ImQ0M2E3NzhlLTY4YjAtNDEwZS05MGExLWVjYjM2ZDNiMzUzNiIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCd3ZOU3A2QkRHbXJmYlJDZlJrY1lNOEVLM1Z6S29jS21YY01FaFB2Z3czSzB0aGYzd09NcFB5SmJlM0hyNnhqSVZ0QkFOSTRGUndFZWFDME1jWDZoaUF1cnRJOWs3YzA4R1RwZnBzQzdPUmlCc3lQd0xhaUpnbG1PZy9TZ0xrOEhRSXZsOU9WWm44SHFaaG1uOWdjZUp5VmFlUEs5eFlMdEtLTDBwM09WWGVQa1hXVjROTThOdDBEL0Zma2N2bGJRQmJBN2ZaLzkvTWZ3bEpNUGtHTWFnY0ZSRTJhMFFxQk9MTDVQZHpmWWR0bWlYOFgzVm0wWmUrbTlPc05WQXdrelpJekVQaXBIYVF0ZnFTVTdFMU5BQkhOamtGVmZkM1BjSWNkR3NWNDRYVHNvZ0dTcnR6Y0ZmZ2UrQjFWUDJKS2RPRFY5N1AzcXVtc1VKSWxyZTFnaFNDSHpsY3NTSE5PTm96UjlmcnAvL2FEODFZdk1mVzlLempKSXo3YWd3RFRMaVBFTnp3TGxkMDAvWHVHc1o4VmlXdz09In1dfQ==" } }, { "ID": "ec0b2ffe5befc684", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "539" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQnd2TlNwNkJER21yZmJSQ2ZSa2NZTThFSzNWektvY0ttWGNNRWhQdmd3M0swdGhmM3dPTXBQeUpiZTNIcjZ4aklWdEJBTkk0RlJ3RWVhQzBNY1g2aGlBdXJ0STlrN2MwOEdUcGZwc0M3T1JpQnN5UHdMYWlKZ2xtT2cvU2dMazhIUUl2bDlPVlpuOEhxWmhtbjlnY2VKeVZhZVBLOXhZTHRLS0wwcDNPVlhlUGtYV1Y0Tk04TnQwRC9GZmtjdmxiUUJiQTdmWi85L01md2xKTVBrR01hZ2NGUkUyYTBRcUJPTEw1UGR6ZllkdG1pWDhYM1ZtMFplK205T3NOVkF3a3paSXpFUGlwSGFRdGZxU1U3RTFOQUJITmprRlZmZDNQY0ljZEdzVjQ0WFRzb2dHU3J0emNGZmdlK0IxVlAySktkT0RWOTdQM3F1bXNVSklscmUxZ2hTQ0h6bGNzU0hOT05velI5ZnJwLy9hRDgxWXZNZlc5S3pqSkl6N2Fnd0RUTGlQRU56d0xsZDAwL1h1R3NaOFZpV3c9PSJ9XSwiUXVldWVVcmwiOiJodHRwczovL3Nxcy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS80NTY3NTI2NjU1NzYvU05TVG9waWNSYXdOYWNrLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:06 GMT" ], "X-Amzn-Requestid": [ "90594687-da7f-54b7-82f6-24b1c2853d04" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "352ef178d8f50d77", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "159" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd05hY2stdG9wLTElM0FlZGRiOTE3Mi0wMzg1LTRhOWEtODBlNi05MTExZjE0MjQ4MmImVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:06 GMT" ], "X-Amzn-Requestid": [ "34aef294-7f32-5b22-b6a1-90a267c83c25" ] }, "Body": "PFVuc3Vic2NyaWJlUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD4zNGFlZjI5NC03ZjMyLTViMjItYjZhMS05MGEyNjdjODNjMjU8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvVW5zdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "40875ece20061d31", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "85" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd05hY2stc3ViLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:06 GMT" ], "X-Amzn-Requestid": [ "6a81f0fd-38f0-5f28-af8a-92cb200ab69b" ] }, "Body": "" } }, { "ID": "a51a8d8e2a03623e", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "113" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPURlbGV0ZVRvcGljJlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQVNOU1RvcGljUmF3TmFjay10b3AtMSZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:06 GMT" ], "X-Amzn-Requestid": [ "41e33262-75fe-5ba1-a201-50546d048ca6" ] }, "Body": "PERlbGV0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD40MWUzMzI2Mi03NWZlLTViYTEtYTIwMS01MDU0NmQwNDhjYTY8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvRGVsZXRlVG9waWNSZXNwb25zZT4K" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSNSTopicRaw/TestNonExistentSubscriptionSucceedsOnOpenButFailsOnReceive.replay ================================================ { "Initial": "AQAAAA7hTg2pJoojCAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "6554a034c8b7fc93", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "165" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vdXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vNDU2NzUyNjY1NTc2L25vbmV4aXN0ZW50LXN1YnNjcmlwdGlvbiJ9" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "96" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:49 GMT" ], "X-Amzn-Query-Error": [ "AWS.SimpleQueueService.NonExistentQueue;Sender" ], "X-Amzn-Requestid": [ "5555f2f7-0201-53ea-b8e7-90c11ae81666" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLnNxcyNRdWV1ZURvZXNOb3RFeGlzdCIsIm1lc3NhZ2UiOiJUaGUgc3BlY2lmaWVkIHF1ZXVlIGRvZXMgbm90IGV4aXN0LiJ9" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSNSTopicRaw/TestNonExistentTopicSucceedsOnOpenButFailsOnSend.replay ================================================ { "Initial": "AQAAAA7hTg2wHjJ6EAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "eb44b3c49ec32599", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "195" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9JlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQW5vbmV4aXN0ZW50dG9waWMmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "259" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:56 GMT" ], "X-Amzn-Requestid": [ "b3d7047e-0664-512b-b4c2-66481e94a064" ] }, "Body": "PEVycm9yUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxFcnJvcj4KICAgIDxUeXBlPlNlbmRlcjwvVHlwZT4KICAgIDxDb2RlPk5vdEZvdW5kPC9Db2RlPgogICAgPE1lc3NhZ2U+VG9waWMgZG9lcyBub3QgZXhpc3Q8L01lc3NhZ2U+CiAgPC9FcnJvcj4KICA8UmVxdWVzdElkPmIzZDcwNDdlLTA2NjQtNTEyYi1iNGMyLTY2NDgxZTk0YTA2NDwvUmVxdWVzdElkPgo8L0Vycm9yUmVzcG9uc2U+Cg==" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSNSTopicRaw/TestNonUTF8MessageBody.replay ================================================ { "Initial": "AQAAAA7hTg2yIuzJbQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "290de2aec45f472f", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "78" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPUNyZWF0ZVRvcGljJk5hbWU9U05TVG9waWNSYXdOb25VVEY4TWVzc2FnZUJvZHktdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "342" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:58 GMT" ], "X-Amzn-Requestid": [ "61ba95dc-9f08-5777-948e-f7ea87fac7dd" ] }, "Body": "PENyZWF0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxDcmVhdGVUb3BpY1Jlc3VsdD4KICAgIDxUb3BpY0Fybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3Tm9uVVRGOE1lc3NhZ2VCb2R5LXRvcC0xPC9Ub3BpY0Fybj4KICA8L0NyZWF0ZVRvcGljUmVzdWx0PgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD42MWJhOTVkYy05ZjA4LTU3NzctOTQ4ZS1mN2VhODdmYWM3ZGQ8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvQ3JlYXRlVG9waWNSZXNwb25zZT4K" } }, { "ID": "9f743b05391546c7", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "51" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTTlNUb3BpY1Jhd05vblVURjhNZXNzYWdlQm9keS1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:59 GMT" ], "X-Amzn-Requestid": [ "b2b199c5-ff61-58eb-b314-fbf3e7920944" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd05vblVURjhNZXNzYWdlQm9keS1zdWItMSJ9" } }, { "ID": "e8571512e930a849", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "129" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd05vblVURjhNZXNzYWdlQm9keS1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "100" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:59 GMT" ], "X-Amzn-Requestid": [ "809fc635-faa8-57d5-83da-a403e25b567a" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY1Jhd05vblVURjhNZXNzYWdlQm9keS1zdWItMSJ9fQ==" } }, { "ID": "edb30051a32e2c80", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "484" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3Tm9uVVRGOE1lc3NhZ2VCb2R5LXN1Yi0xXCJcblx0XHR9XG5cdFx0XVxuXHRcdH0ifSwiUXVldWVVcmwiOiJodHRwczovL3Nxcy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS80NTY3NTI2NjU1NzYvU05TVG9waWNSYXdOb25VVEY4TWVzc2FnZUJvZHktc3ViLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:59 GMT" ], "X-Amzn-Requestid": [ "f8ab541b-3ba4-50ad-aa95-362d2357a102" ] }, "Body": "" } }, { "ID": "cc46157671923918", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "300" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVN1YnNjcmliZSZBdHRyaWJ1dGVzLmVudHJ5LjEua2V5PVJhd01lc3NhZ2VEZWxpdmVyeSZBdHRyaWJ1dGVzLmVudHJ5LjEudmFsdWU9dHJ1ZSZFbmRwb2ludD1hcm4lM0Fhd3MlM0FzcXMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd05vblVURjhNZXNzYWdlQm9keS1zdWItMSZQcm90b2NvbD1zcXMmVG9waWNBcm49YXJuJTNBYXdzJTNBc25zJTNBdXMtZWFzdC0yJTNBNDU2NzUyNjY1NTc2JTNBU05TVG9waWNSYXdOb25VVEY4TWVzc2FnZUJvZHktdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "385" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:59 GMT" ], "X-Amzn-Requestid": [ "8cdb44de-6f27-559d-bc50-26e877d4d537" ] }, "Body": "PFN1YnNjcmliZVJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8U3Vic2NyaWJlUmVzdWx0PgogICAgPFN1YnNjcmlwdGlvbkFybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3Tm9uVVRGOE1lc3NhZ2VCb2R5LXRvcC0xOmNmNTg1NzFmLTg2MmUtNDg0OC05NTM5LWFmMGQyNGM0YjgxMzwvU3Vic2NyaXB0aW9uQXJuPgogIDwvU3Vic2NyaWJlUmVzdWx0PgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD44Y2RiNDRkZS02ZjI3LTU1OWQtYmM1MC0yNmU4NzdkNGQ1Mzc8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvU3Vic2NyaWJlUmVzcG9uc2U+Cg==" } }, { "ID": "210729a0c372e562", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "750" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9QUFFQ0F3UUZCZ2NJQ1FvTERBME9EeEFSRWhNVUZSWVhHQmthR3h3ZEhoOGdJU0lqSkNVbUp5Z3BLaXNzTFM0dk9qczhQVDQlMkZRRnRjWFY1ZllIdDhmWDUlMkZabTl2WEdKaGNseGlZWG91TGx4bWIyOWNMaTVjWW1GeVhDNHVYQzR1WEdKaGVpNHVYQzR1TDJadmJ5OHVMaTlpWVhJdkxpNHZMaTR2WW1GNkxpNHZabTl2TDJKaGNpOWlZWHBtYjI4aVltRnlJbUpoZWk0dVhHWnZiMXhjWW1GeVhGeGNZbUY2Wm05dkx5OWlZWEl2THk5aVlYcG1iMjhnWW1GeUlHSmhlakV5TXpRMTRwaTY0cGk2NHBpNnZiSSUzRCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5DTEVBUkVE" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:59 GMT" ], "X-Amzn-Requestid": [ "232b6a65-83f4-5c1f-9d9f-08539b072cb5" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPmZiM2ExY2IwLWQzMDUtNTdiMC1hNWRlLTdlODZjYmY2NzcxYTwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjIzMmI2YTY1LTgzZjQtNWMxZi05ZDlmLTA4NTM5YjA3MmNiNTwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "4de50cc0d2e750c8", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "180" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd05vblVURjhNZXNzYWdlQm9keS1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1173" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:59 GMT" ], "X-Amzn-Requestid": [ "837b64c5-a25c-5995-8874-06f3baaf983a" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjU5NzQ3IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNTk2ODYifSwiQm9keSI6IkFBRUNBd1FGQmdjSUNRb0xEQTBPRHhBUkVoTVVGUllYR0JrYUd4d2RIaDhnSVNJakpDVW1KeWdwS2lzc0xTNHZPanM4UFQ0L1FGdGNYVjVmWUh0OGZYNS9abTl2WEdKaGNseGlZWG91TGx4bWIyOWNMaTVjWW1GeVhDNHVYQzR1WEdKaGVpNHVYQzR1TDJadmJ5OHVMaTlpWVhJdkxpNHZMaTR2WW1GNkxpNHZabTl2TDJKaGNpOWlZWHBtYjI4aVltRnlJbUpoZWk0dVhHWnZiMXhjWW1GeVhGeGNZbUY2Wm05dkx5OWlZWEl2THk5aVlYcG1iMjhnWW1GeUlHSmhlakV5TXpRMTRwaTY0cGk2NHBpNnZiST0iLCJNRDVPZkJvZHkiOiIwMGFiODk5NmU4MDExYTdhMTRmYjZmYjlhZDgzYzgyMCIsIk1ENU9mTWVzc2FnZUF0dHJpYnV0ZXMiOiJkOTYyOTZhYzY3N2E5YWNhMDVkNDlhZTA5OWM2NTZjMCIsIk1lc3NhZ2VBdHRyaWJ1dGVzIjp7ImJhc2U2NGVuY29kZWQiOnsiRGF0YVR5cGUiOiJTdHJpbmciLCJTdHJpbmdWYWx1ZSI6InRydWUifX0sIk1lc3NhZ2VJZCI6ImY1NmNiY2I2LWI5MzEtNGVlZC05M2IyLWRhYjhmMmRmOGEyZCIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCVEpPTUprQTVlMENMSlBmY1hDQzd2UUJiVGRCRllsSEZlWEZZQ2xjdGNyL21qMjBwbnhWak1saGloVkhxV3NEM1BoQ0Q3UWpkV3Z2MHBWdE56ZlBTRFJHcWhCTmd6WnNjRWhpVDFKY0tCQWFtWlRiNDRXeWJDbUtlQzFmdnFWZ0l6R1ZKR1BtTzlXSGZSZjlPWUlWYWtuM01BdnJldE9xSngxRjVvUFg4NEl2dFkzMnRRcVpFdVBpTFF5cmdKZVVmZkprNzFWKzZDR1NrcmREOXZWMk9ubXZuQlJtcE1nNUdRWHkyamY4TTVvTmJycWU5NmdKZW5mVCtrTHQwb2J1UVBDVytNZXFHUmErTEw2Zm15bVRLalZpTEFlaDNtQU9LZ08wenJxUHg5V2x3S1JCRFpNL1VxMi9xYXNIOGtQN1lZTUdMeXovWkxzSGNJMjU2Rm5paVlTV3BoUFYwRDgvWlZmZUxYS3k0UXEyalRQV0M1bFVleHJYcXBZZjVma01XN0wwZkV0NWtjZEgzaFVneUptQXI0cnNHQm9HRS91aWtJeTIxWUplbTNOOD0ifV19" } }, { "ID": "506ae177f04f7b16", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "573" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQlRKT01Ka0E1ZTBDTEpQZmNYQ0M3dlFCYlRkQkZZbEhGZVhGWUNsY3Rjci9tajIwcG54VmpNbGhpaFZIcVdzRDNQaENEN1FqZFd2djBwVnROemZQU0RSR3FoQk5nelpzY0VoaVQxSmNLQkFhbVpUYjQ0V3liQ21LZUMxZnZxVmdJekdWSkdQbU85V0hmUmY5T1lJVmFrbjNNQXZyZXRPcUp4MUY1b1BYODRJdnRZMzJ0UXFaRXVQaUxReXJnSmVVZmZKazcxVis2Q0dTa3JkRDl2VjJPbm12bkJSbXBNZzVHUVh5MmpmOE01b05icnFlOTZnSmVuZlQra0x0MG9idVFQQ1crTWVxR1JhK0xMNmZteW1US2pWaUxBZWgzbUFPS2dPMHpycVB4OVdsd0tSQkRaTS9VcTIvcWFzSDhrUDdZWU1HTHl6L1pMc0hjSTI1NkZuaWlZU1dwaFBWMEQ4L1pWZmVMWEt5NFFxMmpUUFdDNWxVZXhyWHFwWWY1ZmtNVzdMMGZFdDVrY2RIM2hVZ3lKbUFyNHJzR0JvR0UvdWlrSXkyMVlKZW0zTjg9In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd05vblVURjhNZXNzYWdlQm9keS1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:59 GMT" ], "X-Amzn-Requestid": [ "de9c31df-e5c0-50f6-8aac-53e9fd33d159" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "9751f566ca4b6676", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "173" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd05vblVURjhNZXNzYWdlQm9keS10b3AtMSUzQWNmNTg1NzFmLTg2MmUtNDg0OC05NTM5LWFmMGQyNGM0YjgxMyZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:59 GMT" ], "X-Amzn-Requestid": [ "d91b9d9f-556b-516f-bfb0-ffa94d9831c5" ] }, "Body": "PFVuc3Vic2NyaWJlUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD5kOTFiOWQ5Zi01NTZiLTUxNmYtYmZiMC1mZmE5NGQ5ODMxYzU8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvVW5zdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "1b7dc0610ec983cf", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "99" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd05vblVURjhNZXNzYWdlQm9keS1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:00 GMT" ], "X-Amzn-Requestid": [ "bb837fd0-a327-5068-8f07-1de6bbd3e1c7" ] }, "Body": "" } }, { "ID": "510555930a6a0a39", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "127" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPURlbGV0ZVRvcGljJlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQVNOU1RvcGljUmF3Tm9uVVRGOE1lc3NhZ2VCb2R5LXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:00 GMT" ], "X-Amzn-Requestid": [ "c94804df-9bd4-5c56-b4a6-66e983208cfc" ] }, "Body": "PERlbGV0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD5jOTQ4MDRkZi05YmQ0LTVjNTYtYjRhNi02NmU5ODMyMDhjZmM8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvRGVsZXRlVG9waWNSZXNwb25zZT4K" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSNSTopicRaw/TestSendReceive.replay ================================================ { "Initial": "AQAAAA7hTg2pN2o0HgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "3270e78fd030a97e", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "71" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPUNyZWF0ZVRvcGljJk5hbWU9U05TVG9waWNSYXdTZW5kUmVjZWl2ZS10b3AtMSZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "335" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:50 GMT" ], "X-Amzn-Requestid": [ "d5d1e462-71f7-58be-9128-8654691d931d" ] }, "Body": "PENyZWF0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxDcmVhdGVUb3BpY1Jlc3VsdD4KICAgIDxUb3BpY0Fybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3U2VuZFJlY2VpdmUtdG9wLTE8L1RvcGljQXJuPgogIDwvQ3JlYXRlVG9waWNSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPmQ1ZDFlNDYyLTcxZjctNThiZS05MTI4LTg2NTQ2OTFkOTMxZDwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9DcmVhdGVUb3BpY1Jlc3BvbnNlPgo=" } }, { "ID": "6be73667120b20d6", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "44" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTTlNUb3BpY1Jhd1NlbmRSZWNlaXZlLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "92" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:50 GMT" ], "X-Amzn-Requestid": [ "508f90de-3e1a-554c-822a-f2e826f0b0c0" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlLXN1Yi0xIn0=" } }, { "ID": "4549a3248ee9c22e", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "122" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "93" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:50 GMT" ], "X-Amzn-Requestid": [ "abfd8e22-23c2-5405-8792-ec143b28b189" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY1Jhd1NlbmRSZWNlaXZlLXN1Yi0xIn19" } }, { "ID": "73f1ebbeffe0bee9", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "470" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3U2VuZFJlY2VpdmUtc3ViLTFcIlxuXHRcdH1cblx0XHRdXG5cdFx0fSJ9LCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:50 GMT" ], "X-Amzn-Requestid": [ "d3087fe0-b14e-5877-b731-1dd6a9a48dfb" ] }, "Body": "" } }, { "ID": "37a2c04b17a9b6b1", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "286" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVN1YnNjcmliZSZBdHRyaWJ1dGVzLmVudHJ5LjEua2V5PVJhd01lc3NhZ2VEZWxpdmVyeSZBdHRyaWJ1dGVzLmVudHJ5LjEudmFsdWU9dHJ1ZSZFbmRwb2ludD1hcm4lM0Fhd3MlM0FzcXMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd1NlbmRSZWNlaXZlLXN1Yi0xJlByb3RvY29sPXNxcyZUb3BpY0Fybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd1NlbmRSZWNlaXZlLXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "378" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:50 GMT" ], "X-Amzn-Requestid": [ "3dfa40da-151d-542b-9429-22ec0df7ef88" ] }, "Body": "PFN1YnNjcmliZVJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8U3Vic2NyaWJlUmVzdWx0PgogICAgPFN1YnNjcmlwdGlvbkFybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3U2VuZFJlY2VpdmUtdG9wLTE6ZjEzZjlmYTctMTJiZC00ZjJhLTg5MjUtNjVkMDAzZGMwM2UwPC9TdWJzY3JpcHRpb25Bcm4+CiAgPC9TdWJzY3JpYmVSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjNkZmE0MGRhLTE1MWQtNTQyYi05NDI5LTIyZWMwZGY3ZWY4ODwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9TdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "791f170f20347123", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "443" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9MCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5DTEVBUkVE" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:51 GMT" ], "X-Amzn-Requestid": [ "ae0b00fa-84e7-5089-aac9-62cc9c0d2b2a" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPmY3ZmI2ZmE4LTFiNTktNTk1Ny1hYmE4LTBkOWUwM2IyMDJmNDwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPmFlMGIwMGZhLTg0ZTctNTA4OS1hYWM5LTYyY2M5YzBkMmIyYTwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "f28ac817d6e5efdf", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "443" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9MSZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5DTEVBUkVE" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:51 GMT" ], "X-Amzn-Requestid": [ "402c481d-80fd-52ba-a682-2a2b98167919" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPjIwMmRlMDU5LTE5YTItNWExMy1iMGJlLTgyNmYwMTQ5NjFiMDwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjQwMmM0ODFkLTgwZmQtNTJiYS1hNjgyLTJhMmI5ODE2NzkxOTwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "e4d7b522b2304d1c", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "443" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9MiZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5DTEVBUkVE" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:51 GMT" ], "X-Amzn-Requestid": [ "01114b0a-5359-55c5-aabd-293c4bb29e66" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPjE1OWU4YTA2LWZiOTgtNWNmOS04NmYxLWU4MzBlMzczMjc1YTwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjAxMTE0YjBhLTUzNTktNTVjNS1hYWJkLTI5M2M0YmIyOWU2NjwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "1cac6cc56957fc04", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "173" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "879" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:51 GMT" ], "X-Amzn-Requestid": [ "8a784019-5521-5f57-b59a-222f4dca6adb" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjUxMjM4IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNTExOTAifSwiQm9keSI6IjIiLCJNRDVPZkJvZHkiOiJjODFlNzI4ZDlkNGMyZjYzNmYwNjdmODljYzE0ODYyYyIsIk1ENU9mTWVzc2FnZUF0dHJpYnV0ZXMiOiJiNzJlMTQwZTcyNjllYmNlOTEwN2JhZjFlZjI0MGJhZSIsIk1lc3NhZ2VBdHRyaWJ1dGVzIjp7ImEiOnsiRGF0YVR5cGUiOiJTdHJpbmciLCJTdHJpbmdWYWx1ZSI6IjIifX0sIk1lc3NhZ2VJZCI6IjlmOGNlMGY2LTI3ZTEtNDg2Ny1hMGFkLTQ5YWE5Mzc2Zjg1YyIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCbG42UTVxc3c4MEtubldqMCswUVZ4SGFWY0w1UExYRGFhMEMzcjFhTnh3NVlxaUtUNDZ0QVM4NWpWZVBmVDR3WlFJUXIvam95RmFmQVVwMklmY2hUdzNKNkRVRTdoOEg2NEZBc1cwQmFNdHFDWmd2b2JzM1Noa1hpbGp3QmpQbmo2TDcxVGJuYkZncElBVnJodFMwdmlpLzBtcE40MGNObXgwZmtmd2h5VU1LdDd5T0hWSTNVOE02RTFBRmtZcURNNVZMbjlMeDM3aWpybEoyVFJsMTRqUXNUTS9tSHFOQmFnSTlPM3dya05SYURaRWczdFpsdTVvUG1QS0wvNWkrN3gyQnpBZWllcEpZeTE2am5IWmxOaE9PWkVqeDhkZ1gvbTRoc09OZTVxeWNOWkxqYUQrT1RrM3Vjc2l1a01rQU5RRmZxY2d6OEtmTXRmdTRuMTVMR1pUand5Rkt4QU0vN25XN1ZJOUhGRzJycHVwSVZxQ3dwb0YwSmZMN1FFdUZTZVhycWxoR3E3T0FDTDJIS3JMdXU3OGxyMytGMmpLVmQ4V0tRbURaS0dLVT0ifV19" } }, { "ID": "d143c71a502e2965", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "173" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "879" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:51 GMT" ], "X-Amzn-Requestid": [ "bfafdd4b-b21a-5757-a51a-bf7daaf1c2db" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjUxMzA2IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNTExMTgifSwiQm9keSI6IjEiLCJNRDVPZkJvZHkiOiJjNGNhNDIzOGEwYjkyMzgyMGRjYzUwOWE2Zjc1ODQ5YiIsIk1ENU9mTWVzc2FnZUF0dHJpYnV0ZXMiOiIzMTRjNzdiMjQ5ODkzYzZiM2M3NjVhNDJjYzA4YjI0NSIsIk1lc3NhZ2VBdHRyaWJ1dGVzIjp7ImEiOnsiRGF0YVR5cGUiOiJTdHJpbmciLCJTdHJpbmdWYWx1ZSI6IjEifX0sIk1lc3NhZ2VJZCI6ImFlMjYwMzFjLTA3MzgtNGJlMy1hZTFkLWM3NWMzYzhjZGI3OSIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCVGdmNUViUzFITE1UVjBOZms0aUxlM0N2RmVSUmxFWkdlSHlLbUluS1ZMVHlKVitEeExjOGx5NittUStrcVFNSXEyYnhnTDNaY0dUYU9lc0ZNd08yaDlIS21mcGVjNlVvcStqUVE3OTA2aTFhNXJXZUgyZ0VweVg0d2NWMlVSMC9MVDR1ZUVXZmtoNFRIMTU1Wll1MkZHRHlPNkN5VFdNcmY5OFVnQUJDM080YWdXMDU1NGF3VUNwK3Q0R2ZhT0MwWjhFUHd3TFNhOHc4dGE0Q0VBWmpSdlQvYnpXWHpJTlRrVjRXNjNNdG9FL2swSU1JNXhJa1F3MDRvU1MzQVd3NXNNRkJoSUVxWmROTmRwS3JMTzA0Z0Q0RGViUzMySGpOS0gybDM5cFR6VkV0MStDVkVob2JrUDdzQmN1anZCK2tyejRmNTltNkdEQ3gzNmtkd1hodmJBQm8xRTdINUViQ2t0U3dJd2Niemk3d1oyL2owTEMyR1NKckRQMFhFaEl5NVpwdjlxL2VWRytjYnhzZzZnQUZPSjB3L2pxeU1aeFZtTVQ5Vzc5cWpKUT0ifV19" } }, { "ID": "64685fa9ee6cb9ca", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "566" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQmxuNlE1cXN3ODBLbm5XajArMFFWeEhhVmNMNVBMWERhYTBDM3IxYU54dzVZcWlLVDQ2dEFTODVqVmVQZlQ0d1pRSVFyL2pveUZhZkFVcDJJZmNoVHczSjZEVUU3aDhINjRGQXNXMEJhTXRxQ1pndm9iczNTaGtYaWxqd0JqUG5qNkw3MVRibmJGZ3BJQVZyaHRTMHZpaS8wbXBONDBjTm14MGZrZndoeVVNS3Q3eU9IVkkzVThNNkUxQUZrWXFETTVWTG45THgzN2lqcmxKMlRSbDE0alFzVE0vbUhxTkJhZ0k5TzN3cmtOUmFEWkVnM3RabHU1b1BtUEtMLzVpKzd4MkJ6QWVpZXBKWXkxNmpuSFpsTmhPT1pFang4ZGdYL200aHNPTmU1cXljTlpMamFEK09UazN1Y3NpdWtNa0FOUUZmcWNnejhLZk10ZnU0bjE1TEdaVGp3eUZLeEFNLzduVzdWSTlIRkcycnB1cElWcUN3cG9GMEpmTDdRRXVGU2VYcnFsaEdxN09BQ0wySEtyTHV1NzhscjMrRjJqS1ZkOFdLUW1EWktHS1U9In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:51 GMT" ], "X-Amzn-Requestid": [ "d84f0e17-1908-5d99-9fb9-6c2101e35815" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "7de041872e34216d", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "173" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "879" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:51 GMT" ], "X-Amzn-Requestid": [ "d5b31240-38fa-5515-9187-707620115099" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjUxNDM5IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNTEwMzgifSwiQm9keSI6IjAiLCJNRDVPZkJvZHkiOiJjZmNkMjA4NDk1ZDU2NWVmNjZlN2RmZjlmOTg3NjRkYSIsIk1ENU9mTWVzc2FnZUF0dHJpYnV0ZXMiOiI5YWE0Njg3YzhiNzU2N2JhYTM4MGQ5ZjMwMGZlMjgzYSIsIk1lc3NhZ2VBdHRyaWJ1dGVzIjp7ImEiOnsiRGF0YVR5cGUiOiJTdHJpbmciLCJTdHJpbmdWYWx1ZSI6IjAifX0sIk1lc3NhZ2VJZCI6IjU0MWI3OTRjLTUxNDUtNDM2MS05NWU1LTkxMmQ5NGFiNTc5ZSIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCajcxeDlqMVZlNEpNVTJ1YlRDRkR4ZFFxRzM5VnBpcUZyNG8xZEpjT3hPcHNaR0xyR2NRY2N4WW4zcjVPOTZxU1VDV0dXV25jUnMyMTVHbkh0MUtUN1NTQ2xtMG5nelN0ZVh5RVhlaklJMmVLNHNyaElTT3ByZHVlYnliT1o2Q0Z6VlpsdEhwbnVKVFJkWE5sem9HSFVNMTloL2ZBVWg1aEdhK1Q5QjJLR21KaDRIMktzMGVlTnNMZnNFSzJEL0RkeHV2aU1jQ25NNHdxMjdQVERxeUNhZGtuc3p5WVp1YW1PakZ0R1hXNmhRZE9veVIrR3RXaWFRWHZuSzVmcHhLeEpXcFVsWFB5RWI1dGNqa1dUYzB5Y281UUMyOEIyYzRpUm5LNzJ1eXV2L3QyQTVHZnJoeS8xN0dSd2JKVDFxS0dFeW91MjdnR0R6RVBETFViejJiVjBuNklnVVFUN0U2UTJWQ1gxYUIydTZncGxhUlBHOUhFV0lWZkJDYXdEWnRXakllcEhFRDdhQlBNK2lFaWFVYkoxeUhab2NWeW51c3luVi9icnA4UEwyTT0ifV19" } }, { "ID": "910818a7d2029e3b", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "566" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQlRnZjVFYlMxSExNVFYwTmZrNGlMZTNDdkZlUlJsRVpHZUh5S21JbktWTFR5SlYrRHhMYzhseTYrbVEra3FRTUlxMmJ4Z0wzWmNHVGFPZXNGTXdPMmg5SEttZnBlYzZVb3EralFRNzkwNmkxYTVyV2VIMmdFcHlYNHdjVjJVUjAvTFQ0dWVFV2ZraDRUSDE1NVpZdTJGR0R5TzZDeVRXTXJmOThVZ0FCQzNPNGFnVzA1NTRhd1VDcCt0NEdmYU9DMFo4RVB3d0xTYTh3OHRhNENFQVpqUnZUL2J6V1h6SU5Ua1Y0VzYzTXRvRS9rMElNSTV4SWtRdzA0b1NTM0FXdzVzTUZCaElFcVpkTk5kcEtyTE8wNGdENERlYlMzMkhqTktIMmwzOXBUelZFdDErQ1ZFaG9ia1A3c0JjdWp2Qitrcno0ZjU5bTZHREN4MzZrZHdYaHZiQUJvMUU3SDVFYkNrdFN3SXdjYnppN3daMi9qMExDMkdTSnJEUDBYRWhJeTVacHY5cS9lVkcrY2J4c2c2Z0FGT0owdy9qcXlNWnhWbU1UOVc3OXFqSlE9In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:51 GMT" ], "X-Amzn-Requestid": [ "755d831b-944e-5902-9d3d-e12d8ca5202c" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "c227450dfe331e11", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "566" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQmo3MXg5ajFWZTRKTVUydWJUQ0ZEeGRRcUczOVZwaXFGcjRvMWRKY094T3BzWkdMckdjUWNjeFluM3I1Tzk2cVNVQ1dHV1duY1JzMjE1R25IdDFLVDdTU0NsbTBuZ3pTdGVYeUVYZWpJSTJlSzRzcmhJU09wcmR1ZWJ5Yk9aNkNGelZabHRIcG51SlRSZFhObHpvR0hVTTE5aC9mQVVoNWhHYStUOUIyS0dtSmg0SDJLczBlZU5zTGZzRUsyRC9EZHh1dmlNY0NuTTR3cTI3UFREcXlDYWRrbnN6eVladWFtT2pGdEdYVzZoUWRPb3lSK0d0V2lhUVh2bks1ZnB4S3hKV3BVbFhQeUViNXRjamtXVGMweWNvNVFDMjhCMmM0aVJuSzcydXl1di90MkE1R2ZyaHkvMTdHUndiSlQxcUtHRXlvdTI3Z0dEekVQRExVYnoyYlYwbjZJZ1VRVDdFNlEyVkNYMWFCMnU2Z3BsYVJQRzlIRVdJVmZCQ2F3RFp0V2pJZXBIRUQ3YUJQTStpRWlhVWJKMXlIWm9jVnludXN5blYvYnJwOFBMMk09In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:51 GMT" ], "X-Amzn-Requestid": [ "595fe562-4726-5560-81c1-87545fcdaa6d" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "c3fc886bf0c9b58c", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "166" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd1NlbmRSZWNlaXZlLXRvcC0xJTNBZjEzZjlmYTctMTJiZC00ZjJhLTg5MjUtNjVkMDAzZGMwM2UwJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:51 GMT" ], "X-Amzn-Requestid": [ "3cee8335-6227-5484-9f71-e1037acc6f27" ] }, "Body": "PFVuc3Vic2NyaWJlUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD4zY2VlODMzNS02MjI3LTU0ODQtOWY3MS1lMTAzN2FjYzZmMjc8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvVW5zdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "e6a92dd4bfdd9b8c", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "92" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:51 GMT" ], "X-Amzn-Requestid": [ "596045ec-3bb8-5107-9890-27da23534ccb" ] }, "Body": "" } }, { "ID": "60e7dbc7774e426a", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "120" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPURlbGV0ZVRvcGljJlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQVNOU1RvcGljUmF3U2VuZFJlY2VpdmUtdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:52 GMT" ], "X-Amzn-Requestid": [ "ef277bdb-e793-5c66-bafa-19edff78b7c5" ] }, "Body": "PERlbGV0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD5lZjI3N2JkYi1lNzkzLTVjNjYtYmFmYS0xOWVkZmY3OGI3YzU8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvRGVsZXRlVG9waWNSZXNwb25zZT4K" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSNSTopicRaw/TestSendReceiveJSON.replay ================================================ { "Initial": "AQAAAA7hTg2sBhhUTgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "5c9c384a0394a069", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "75" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPUNyZWF0ZVRvcGljJk5hbWU9U05TVG9waWNSYXdTZW5kUmVjZWl2ZUpTT04tdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "339" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:52 GMT" ], "X-Amzn-Requestid": [ "4ca59a7d-5fcb-538e-a146-f84b47274420" ] }, "Body": "PENyZWF0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxDcmVhdGVUb3BpY1Jlc3VsdD4KICAgIDxUb3BpY0Fybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3U2VuZFJlY2VpdmVKU09OLXRvcC0xPC9Ub3BpY0Fybj4KICA8L0NyZWF0ZVRvcGljUmVzdWx0PgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD40Y2E1OWE3ZC01ZmNiLTUzOGUtYTE0Ni1mODRiNDcyNzQ0MjA8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvQ3JlYXRlVG9waWNSZXNwb25zZT4K" } }, { "ID": "a4be09afaad70d18", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "48" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTTlNUb3BpY1Jhd1NlbmRSZWNlaXZlSlNPTi1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "96" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:52 GMT" ], "X-Amzn-Requestid": [ "274308d3-4860-5f54-ad15-6ae5508c2678" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlSlNPTi1zdWItMSJ9" } }, { "ID": "327afd22f4376e20", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "126" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlSlNPTi1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "97" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:52 GMT" ], "X-Amzn-Requestid": [ "39cdc0e3-b016-5cc8-9199-a2d5a8fa65e4" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY1Jhd1NlbmRSZWNlaXZlSlNPTi1zdWItMSJ9fQ==" } }, { "ID": "70aae2697a25862b", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "478" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3U2VuZFJlY2VpdmVKU09OLXN1Yi0xXCJcblx0XHR9XG5cdFx0XVxuXHRcdH0ifSwiUXVldWVVcmwiOiJodHRwczovL3Nxcy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS80NTY3NTI2NjU1NzYvU05TVG9waWNSYXdTZW5kUmVjZWl2ZUpTT04tc3ViLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:52 GMT" ], "X-Amzn-Requestid": [ "bc6f1e70-9744-5458-b89a-7c468fa83d74" ] }, "Body": "" } }, { "ID": "e7cdc779d71d9e42", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "294" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVN1YnNjcmliZSZBdHRyaWJ1dGVzLmVudHJ5LjEua2V5PVJhd01lc3NhZ2VEZWxpdmVyeSZBdHRyaWJ1dGVzLmVudHJ5LjEudmFsdWU9dHJ1ZSZFbmRwb2ludD1hcm4lM0Fhd3MlM0FzcXMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd1NlbmRSZWNlaXZlSlNPTi1zdWItMSZQcm90b2NvbD1zcXMmVG9waWNBcm49YXJuJTNBYXdzJTNBc25zJTNBdXMtZWFzdC0yJTNBNDU2NzUyNjY1NTc2JTNBU05TVG9waWNSYXdTZW5kUmVjZWl2ZUpTT04tdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "382" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:53 GMT" ], "X-Amzn-Requestid": [ "b55acf38-ca73-509f-8fd0-ad0ed29ff731" ] }, "Body": "PFN1YnNjcmliZVJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8U3Vic2NyaWJlUmVzdWx0PgogICAgPFN1YnNjcmlwdGlvbkFybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3U2VuZFJlY2VpdmVKU09OLXRvcC0xOjgxOTg2ZDkxLWM0YjItNGU1MC04NDg0LTM3ODZlZmM3Y2U5NDwvU3Vic2NyaXB0aW9uQXJuPgogIDwvU3Vic2NyaWJlUmVzdWx0PgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD5iNTVhY2YzOC1jYTczLTUwOWYtOGZkMC1hZDBlZDI5ZmY3MzE8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvU3Vic2NyaWJlUmVzcG9uc2U+Cg==" } }, { "ID": "cbdc265f3ea0d82f", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "239" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9JTdCJTIyRm9vJTIyJTNBKyUyMkJhciUyMiU3RCZUb3BpY0Fybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd1NlbmRSZWNlaXZlSlNPTi10b3AtMSZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:53 GMT" ], "X-Amzn-Requestid": [ "495315a1-88a6-50a5-815c-7797904b570b" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPjFjMTUwZDZkLTUxNmUtNTA5Yi05YzMzLTZmNWI0OTgzNDczNTwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjQ5NTMxNWExLTg4YTYtNTBhNS04MTVjLTc3OTc5MDRiNTcwYjwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "fd830bf4500c8463", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "177" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlSlNPTi1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "770" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:53 GMT" ], "X-Amzn-Requestid": [ "743fd095-3588-5e1f-92d0-b2a32d650733" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjUzMjcwIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNTMyMjUifSwiQm9keSI6IntcIkZvb1wiOiBcIkJhclwifSIsIk1ENU9mQm9keSI6IjMzMzM5OWJhMmI3NmExOTY0MzI2MDdmMjNiM2VjYjk1IiwiTWVzc2FnZUlkIjoiZjNhZDllNzgtMzRiYi00MmUzLTk3ODUtZDQwYzQzZjBmZTBlIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJJY3BRZkZYU0llNzlZd2VHbFUzOGh1QUZhZmpqc0dGUzZ4cEpOMzR3cUkwM3Bxa0UwUXk3dTQ0MTBFTzhzZmpKNDFvc3d5NDZFNHlYS2U0WVBnSmRvb1d1SmdKSlUySWYrTXlVTlg4Tk9nUWdncTNmZVhjWnpIRk5GblhodXlYODZpb0g0L0ovMVZrNytuUFJrN3NTSFg1aFIwR2p5SjlzY1Z1UGtiWmQyRXA3UGZsY1dUOWtjZnBad2pDYWN6eE0zT1owcFNXQ2FOejhaYlNadnI3dHBpTnJFZlprbHl1ZiswQnNiMFBWWjY4ZWY4cis2cmJQRzIxWWtRZFpFdjNJUU9aTmUyL05oNmFTSnR1SFNEOU84TU5vanpkd29NZXhOSS9kcVBHUnVwSzJXd0xoejJPL3ltNXU3R1JhZDRQS1J0YXFBUHRBU2dWVVQwclJPcmRhVkpTRUhzeTExRG5GdFllNGQxNjBiMGJqc2NkM0lFcm9XOGI0R1FEY29wV09KaExmMnkyN2VzN21YNnYwaGhyVy9iaTcvekwvK2lkdmZqRitMZWp5UHdFPSJ9XX0=" } }, { "ID": "e4bc3ce9c163546a", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "570" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQkljcFFmRlhTSWU3OVl3ZUdsVTM4aHVBRmFmampzR0ZTNnhwSk4zNHdxSTAzcHFrRTBReTd1NDQxMEVPOHNmako0MW9zd3k0NkU0eVhLZTRZUGdKZG9vV3VKZ0pKVTJJZitNeVVOWDhOT2dRZ2dxM2ZlWGNaekhGTkZuWGh1eVg4NmlvSDQvSi8xVms3K25QUms3c1NIWDVoUjBHanlKOXNjVnVQa2JaZDJFcDdQZmxjV1Q5a2NmcFp3akNhY3p4TTNPWjBwU1dDYU56OFpiU1p2cjd0cGlOckVmWmtseXVmKzBCc2IwUFZaNjhlZjhyKzZyYlBHMjFZa1FkWkV2M0lRT1pOZTIvTmg2YVNKdHVIU0Q5TzhNTm9qemR3b01leE5JL2RxUEdSdXBLMld3TGh6Mk8veW01dTdHUmFkNFBLUnRhcUFQdEFTZ1ZVVDByUk9yZGFWSlNFSHN5MTFEbkZ0WWU0ZDE2MGIwYmpzY2QzSUVyb1c4YjRHUURjb3BXT0poTGYyeTI3ZXM3bVg2djBoaHJXL2JpNy96TC8raWR2ZmpGK0xlanlQd0U9In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlSlNPTi1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:53 GMT" ], "X-Amzn-Requestid": [ "9f59c217-0174-5347-8be1-a0211999ea6b" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "807116fb10c3ed09", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "170" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd1NlbmRSZWNlaXZlSlNPTi10b3AtMSUzQTgxOTg2ZDkxLWM0YjItNGU1MC04NDg0LTM3ODZlZmM3Y2U5NCZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:53 GMT" ], "X-Amzn-Requestid": [ "0e81ca1b-aa3a-533f-8926-a82db2d77491" ] }, "Body": "PFVuc3Vic2NyaWJlUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD4wZTgxY2ExYi1hYTNhLTUzM2YtODkyNi1hODJkYjJkNzc0OTE8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvVW5zdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "ee2618ad3c64f5a6", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "96" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlSlNPTi1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:30:53 GMT" ], "X-Amzn-Requestid": [ "4ac6e035-ecb3-548a-9abd-8203f45e9da6" ] }, "Body": "" } }, { "ID": "74c321fdf985ce00", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "124" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPURlbGV0ZVRvcGljJlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQVNOU1RvcGljUmF3U2VuZFJlY2VpdmVKU09OLXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:30:53 GMT" ], "X-Amzn-Requestid": [ "6db9d19b-9a48-5b18-82d0-b3ad82a57cb6" ] }, "Body": "PERlbGV0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD42ZGI5ZDE5Yi05YTQ4LTViMTgtODJkMC1iM2FkODJhNTdjYjY8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvRGVsZXRlVG9waWNSZXNwb25zZT4K" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSNSTopicRaw/TestSendReceiveTwo.replay ================================================ { "Initial": "AQAAAA7hTg20DTMhdwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "e428824d55161c31", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "74" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPUNyZWF0ZVRvcGljJk5hbWU9U05TVG9waWNSYXdTZW5kUmVjZWl2ZVR3by10b3AtMSZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "338" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:00 GMT" ], "X-Amzn-Requestid": [ "456e48d8-3d8c-5b7c-bcd0-2aee2578c9b5" ] }, "Body": "PENyZWF0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxDcmVhdGVUb3BpY1Jlc3VsdD4KICAgIDxUb3BpY0Fybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3U2VuZFJlY2VpdmVUd28tdG9wLTE8L1RvcGljQXJuPgogIDwvQ3JlYXRlVG9waWNSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjQ1NmU0OGQ4LTNkOGMtNWI3Yy1iY2QwLTJhZWUyNTc4YzliNTwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9DcmVhdGVUb3BpY1Jlc3BvbnNlPgo=" } }, { "ID": "fd8ede04c1276b26", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "47" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTTlNUb3BpY1Jhd1NlbmRSZWNlaXZlVHdvLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "95" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:00 GMT" ], "X-Amzn-Requestid": [ "13b7aafe-3719-5208-a189-c8c82fedefc7" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlVHdvLXN1Yi0xIn0=" } }, { "ID": "49b8c6e3e67be0de", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "125" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlVHdvLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "96" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:01 GMT" ], "X-Amzn-Requestid": [ "8113834f-4134-5e67-85f0-e17959c173a8" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY1Jhd1NlbmRSZWNlaXZlVHdvLXN1Yi0xIn19" } }, { "ID": "6ef8458f94997001", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "476" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3U2VuZFJlY2VpdmVUd28tc3ViLTFcIlxuXHRcdH1cblx0XHRdXG5cdFx0fSJ9LCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlVHdvLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:01 GMT" ], "X-Amzn-Requestid": [ "5d7cbb1d-4c3e-5eb4-827e-d92b54cb437b" ] }, "Body": "" } }, { "ID": "d4a9d733615a9581", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "292" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVN1YnNjcmliZSZBdHRyaWJ1dGVzLmVudHJ5LjEua2V5PVJhd01lc3NhZ2VEZWxpdmVyeSZBdHRyaWJ1dGVzLmVudHJ5LjEudmFsdWU9dHJ1ZSZFbmRwb2ludD1hcm4lM0Fhd3MlM0FzcXMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd1NlbmRSZWNlaXZlVHdvLXN1Yi0xJlByb3RvY29sPXNxcyZUb3BpY0Fybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd1NlbmRSZWNlaXZlVHdvLXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "381" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:01 GMT" ], "X-Amzn-Requestid": [ "fa654105-a204-5459-acd5-2333baf1a690" ] }, "Body": "PFN1YnNjcmliZVJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8U3Vic2NyaWJlUmVzdWx0PgogICAgPFN1YnNjcmlwdGlvbkFybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3U2VuZFJlY2VpdmVUd28tdG9wLTE6NmE4NTZlZjAtYmFjOS00OWJkLTg5YzEtNDI4Yjk4MGZmMjRiPC9TdWJzY3JpcHRpb25Bcm4+CiAgPC9TdWJzY3JpYmVSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPmZhNjU0MTA1LWEyMDQtNTQ1OS1hY2Q1LTIzMzNiYWYxYTY5MDwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9TdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "8663aed65594afb2", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "47" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTTlNUb3BpY1Jhd1NlbmRSZWNlaXZlVHdvLXN1Yi0yIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "95" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:01 GMT" ], "X-Amzn-Requestid": [ "787c94e2-90b5-546c-839e-f6d4884069a3" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlVHdvLXN1Yi0yIn0=" } }, { "ID": "76130db56355f5da", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "125" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlVHdvLXN1Yi0yIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "96" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:01 GMT" ], "X-Amzn-Requestid": [ "ffa4f133-acdd-573e-ad72-9305b4280af1" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTTlNUb3BpY1Jhd1NlbmRSZWNlaXZlVHdvLXN1Yi0yIn19" } }, { "ID": "1472df6ba227132d", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "476" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3U2VuZFJlY2VpdmVUd28tc3ViLTJcIlxuXHRcdH1cblx0XHRdXG5cdFx0fSJ9LCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlVHdvLXN1Yi0yIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:01 GMT" ], "X-Amzn-Requestid": [ "edf8bbc8-a72f-5d69-8ce6-d9febfda50a6" ] }, "Body": "" } }, { "ID": "0210d7d3079ed89e", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "292" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVN1YnNjcmliZSZBdHRyaWJ1dGVzLmVudHJ5LjEua2V5PVJhd01lc3NhZ2VEZWxpdmVyeSZBdHRyaWJ1dGVzLmVudHJ5LjEudmFsdWU9dHJ1ZSZFbmRwb2ludD1hcm4lM0Fhd3MlM0FzcXMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd1NlbmRSZWNlaXZlVHdvLXN1Yi0yJlByb3RvY29sPXNxcyZUb3BpY0Fybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd1NlbmRSZWNlaXZlVHdvLXRvcC0xJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "381" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:01 GMT" ], "X-Amzn-Requestid": [ "7382a81a-3199-5f64-bc1f-ca2c296ccdad" ] }, "Body": "PFN1YnNjcmliZVJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8U3Vic2NyaWJlUmVzdWx0PgogICAgPFN1YnNjcmlwdGlvbkFybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNOU1RvcGljUmF3U2VuZFJlY2VpdmVUd28tdG9wLTE6YzEwZmQ2YjgtM2ExMy00NzEzLWFiMDYtYzkzODczMjhiZTk0PC9TdWJzY3JpcHRpb25Bcm4+CiAgPC9TdWJzY3JpYmVSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjczODJhODFhLTMxOTktNWY2NC1iYzFmLWNhMmMyOTZjY2RhZDwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9TdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "5bb72c9507609de6", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "446" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9MCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5DTEVBUkVE" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:01 GMT" ], "X-Amzn-Requestid": [ "1710a5c8-8aac-5d14-a0d5-c7fe92594fdd" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPjBkMGJhNzc5LWUwOTQtNTdjNy05Y2I3LWM1NGZmODYxODUwZTwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjE3MTBhNWM4LThhYWMtNWQxNC1hMGQ1LWM3ZmU5MjU5NGZkZDwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "ff900a96c8d23eed", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "446" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9MSZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5DTEVBUkVE" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:01 GMT" ], "X-Amzn-Requestid": [ "d11ddc75-0282-5912-97fd-be431a77fbdb" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPmZkMTNlNjI1LTIzYzUtNTU2Yy04NGQ1LTg0MTMzYjMwMjdhNTwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPmQxMWRkYzc1LTAyODItNTkxMi05N2ZkLWJlNDMxYTc3ZmJkYjwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "bc3ee8beb6cf1b3b", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "446" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9MiZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5DTEVBUkVE" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:02 GMT" ], "X-Amzn-Requestid": [ "dc91e377-c0a3-5e33-985d-8141d8569cfa" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8TWVzc2FnZUlkPmZjNjY1YjYzLWY1ZTktNWZmMi04YWFlLTM5NTVlZDFjZWQzYjwvTWVzc2FnZUlkPgogICAgICAgIDxJZD4wPC9JZD4KICAgICAgPC9tZW1iZXI+CiAgICA8L1N1Y2Nlc3NmdWw+CiAgPC9QdWJsaXNoQmF0Y2hSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPmRjOTFlMzc3LWMwYTMtNWUzMy05ODVkLTgxNDFkODU2OWNmYTwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9QdWJsaXNoQmF0Y2hSZXNwb25zZT4K" } }, { "ID": "476a0125b5730e19", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "176" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlVHdvLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "879" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:02 GMT" ], "X-Amzn-Requestid": [ "b4c5d064-da21-5ba0-b87f-b252c2d7866f" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjYyMDcyIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNjE4ODQifSwiQm9keSI6IjAiLCJNRDVPZkJvZHkiOiJjZmNkMjA4NDk1ZDU2NWVmNjZlN2RmZjlmOTg3NjRkYSIsIk1ENU9mTWVzc2FnZUF0dHJpYnV0ZXMiOiI5YWE0Njg3YzhiNzU2N2JhYTM4MGQ5ZjMwMGZlMjgzYSIsIk1lc3NhZ2VBdHRyaWJ1dGVzIjp7ImEiOnsiRGF0YVR5cGUiOiJTdHJpbmciLCJTdHJpbmdWYWx1ZSI6IjAifX0sIk1lc3NhZ2VJZCI6IjQ3NjU2NzNjLWE0NTEtNDUzNC04NTQ2LWNkOTliOTgyMDZhZCIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCUHRGWXJhcmFuUWZCMFB6VGZXY3VZeVR0YThIU3ZwcHRoQ1pyTktvU1RVNjA2Tm81UXR3UUFsaUFlbkx4RmhEcjZEbS9NQW1rNncvVkFwWkIwZXMwVitaZUdxOGZUNkR2eVpZdnF2UExocmJWc01oemdIQlAvS2dWcGxicjI4U1I3dkg2T2F3aWY3dTVIRVU2WTRuVVFoRjZGaDUrd2xDRDVIWVNOUHVoSzEzTXVKRGhvSDVFa2tiNHdIMU91cU11TFcrWk0ybU55R3R4TTFVVDRLZXN0NHE0ZjdRbm93cGpCaFNGVFVieGVPZE1WOU1ueTRZUkdqcTJKTytHckp2ZGFBc3d5OXpQN0RTV0V5K0hzSVNmZFl2SVVEOUJoWkFKWHZ4eWpIakc1T1FZMDZ0Y0FFSGZaTzJwMStydkNXakpPU3NvczhxNzl5MW54dS84YU92ZzNTQjFMYmlPSXRtM2tUdUpaSUpIYnV4RjVvanVmQnlGZnQya01udnFTd3ZrZkRsMi9vSEp6emVyaDZiMThHWGRLR2VxSWhIanY2VnhISTQ3TDdrdnU0TT0ifV19" } }, { "ID": "a5ccd584a453078c", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "569" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQlB0RllyYXJhblFmQjBQelRmV2N1WXlUdGE4SFN2cHB0aENack5Lb1NUVTYwNk5vNVF0d1FBbGlBZW5MeEZoRHI2RG0vTUFtazZ3L1ZBcFpCMGVzMFYrWmVHcThmVDZEdnlaWXZxdlBMaHJiVnNNaHpnSEJQL0tnVnBsYnIyOFNSN3ZINk9hd2lmN3U1SEVVNlk0blVRaEY2Rmg1K3dsQ0Q1SFlTTlB1aEsxM011SkRob0g1RWtrYjR3SDFPdXFNdUxXK1pNMm1OeUd0eE0xVVQ0S2VzdDRxNGY3UW5vd3BqQmhTRlRVYnhlT2RNVjlNbnk0WVJHanEySk8rR3JKdmRhQXN3eTl6UDdEU1dFeStIc0lTZmRZdklVRDlCaFpBSlh2eHlqSGpHNU9RWTA2dGNBRUhmWk8ycDErcnZDV2pKT1Nzb3M4cTc5eTFueHUvOGFPdmczU0IxTGJpT0l0bTNrVHVKWklKSGJ1eEY1b2p1ZkJ5RmZ0MmtNbnZxU3d2a2ZEbDIvb0hKenplcmg2YjE4R1hkS0dlcUloSGp2NlZ4SEk0N0w3a3Z1NE09In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlVHdvLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:02 GMT" ], "X-Amzn-Requestid": [ "076bf135-7b14-5b83-85d1-930363e2c64c" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "41c7d12f86f35736", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "176" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlVHdvLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "879" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:02 GMT" ], "X-Amzn-Requestid": [ "a6da26b3-f8d4-5594-a988-4485e022b85b" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjYyMjA1IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNjIwMzAifSwiQm9keSI6IjIiLCJNRDVPZkJvZHkiOiJjODFlNzI4ZDlkNGMyZjYzNmYwNjdmODljYzE0ODYyYyIsIk1ENU9mTWVzc2FnZUF0dHJpYnV0ZXMiOiJiNzJlMTQwZTcyNjllYmNlOTEwN2JhZjFlZjI0MGJhZSIsIk1lc3NhZ2VBdHRyaWJ1dGVzIjp7ImEiOnsiRGF0YVR5cGUiOiJTdHJpbmciLCJTdHJpbmdWYWx1ZSI6IjIifX0sIk1lc3NhZ2VJZCI6IjMyNDY2MTQ3LWM3OWItNGIwYy1iOWY5LWFlMDIyYTlkM2RjZSIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCaC9nZE9FMVQ2WFdBMlpuUm1jQVZ0dWdLRlVPRXI1U09nL3dpQUJCUlFRcEJ0UFcxem1mT0FucmNxbml4azhHR2kvcHBjbU9iQVZGNjBJbGdjL1RMQ3dha05qU3hjdzF4M1crT2FYWVBCNWRmSDBELy9XUnF4aG5wNzd3cHpPVTlJMWE0M2JYK04yL2YzMTVVbHZPVUdaQlFaN1dmb3Q5Q3NwOTFKNW12ZzEyR1FuMVFtMi90Wm8weGp0alJnQVBmQi9XZHc4REdtS3A4NnBhSFc0NzVNU2YzWTJRWFJ0bHFpYjRMS1U5S2xBSG55LzdTWGc2eW9BSXhUZlExUnlobkY4RVpaYmRScmkzbEZYc0NOVzVrOU1lZ3N1UFIwSmtPb0Riamc1Q2ZieWN3MTRNanhiQU9IVU0vK3RDUVFYZzNXK3Y4bDBpN2IrVFYvbmVWbU5JWkdBdHdiVDZTQ1VxdFhFTndhRDNBN2p0ZWpHMm93VzVxanZXY2JKazlLNklTSVo2Ukx0M0pJeFhXYU4xdjluN1ZEMVo0OG5IRjVNSytROHB0NTdDM3BuWT0ifV19" } }, { "ID": "19e0b979bc01687d", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "569" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQmgvZ2RPRTFUNlhXQTJablJtY0FWdHVnS0ZVT0VyNVNPZy93aUFCQlJRUXBCdFBXMXptZk9BbnJjcW5peGs4R0dpL3BwY21PYkFWRjYwSWxnYy9UTEN3YWtOalN4Y3cxeDNXK09hWFlQQjVkZkgwRC8vV1JxeGhucDc3d3B6T1U5STFhNDNiWCtOMi9mMzE1VWx2T1VHWkJRWjdXZm90OUNzcDkxSjVtdmcxMkdRbjFRbTIvdFpvMHhqdGpSZ0FQZkIvV2R3OERHbUtwODZwYUhXNDc1TVNmM1kyUVhSdGxxaWI0TEtVOUtsQUhueS83U1hnNnlvQUl4VGZRMVJ5aG5GOEVaWmJkUnJpM2xGWHNDTlc1azlNZWdzdVBSMEprT29EYmpnNUNmYnljdzE0TWp4YkFPSFVNLyt0Q1FRWGczVyt2OGwwaTdiK1RWL25lVm1OSVpHQXR3YlQ2U0NVcXRYRU53YUQzQTdqdGVqRzJvd1c1cWp2V2NiSms5SzZJU0laNlJMdDNKSXhYV2FOMXY5bjdWRDFaNDhuSEY1TUsrUThwdDU3QzNwblk9In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlVHdvLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:02 GMT" ], "X-Amzn-Requestid": [ "61c79655-1f6c-583d-8206-f463079ae5f2" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "c20ab2ab791121f3", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "176" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlVHdvLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "879" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:02 GMT" ], "X-Amzn-Requestid": [ "d85276c8-cc13-5686-886a-14fed4e5f656" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjYyMzcwIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNjE5NTAifSwiQm9keSI6IjEiLCJNRDVPZkJvZHkiOiJjNGNhNDIzOGEwYjkyMzgyMGRjYzUwOWE2Zjc1ODQ5YiIsIk1ENU9mTWVzc2FnZUF0dHJpYnV0ZXMiOiIzMTRjNzdiMjQ5ODkzYzZiM2M3NjVhNDJjYzA4YjI0NSIsIk1lc3NhZ2VBdHRyaWJ1dGVzIjp7ImEiOnsiRGF0YVR5cGUiOiJTdHJpbmciLCJTdHJpbmdWYWx1ZSI6IjEifX0sIk1lc3NhZ2VJZCI6IjBjNjRjZmNhLTRhNmItNDIyYi1hY2RkLWE2YTNjMWRkN2M3MSIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCZFRWYmNyYUx1dkhFQ2U1d3k2cktXMWREZEFMbnBZc1JkdWpVTXdQMTJ5bVdTc0lqS2Q4Sm9YR0VXeXZpSm1PRDNESmcvU3ZUajdLVzdMYllLQU1tTTlVaCswbjQ0UG1CK05YRmpXUEk5STB3Y1BQaXBVKzM5Ujc4aXIvWW5meFpFY1k2cS9aQzAycG5INFBwVnhrblU3aFRwbjdWb2ZHR2F5S2VFL0xOcmo5TTc4Y3ROUTRHR1FvNGk3ZllBc01nV2hDRlVpZkw5cktFeGJ4SStWS1doRDdVUGovVnJHdDBRdXkzNHlVWEhyWUZMWW5xcGNBdXBuVVJvYjl0R3pqZHgvNS8vckhtV0JOUU81WG1vM1pwb1kzanUxWWx6RmJlZHJReFlVeHhmUVdDTjd3SlpNNVlvL2JJVGFOL1RwZm9vSThGY3dSeTFHa2Y5eExsQmxmLzB4VUFaRWIvUG92VWxkU2VqODc5SkxjOTM2eXQ5cjNsblB5cWlrSDJpdlV3TlFoeFc2OEQxM2Y0dm1aczEvY1NkbkJzaElOWURQWjVEbVBrYnRRcWVuOD0ifV19" } }, { "ID": "3a529e928d983621", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "569" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQmRUVmJjcmFMdXZIRUNlNXd5NnJLVzFkRGRBTG5wWXNSZHVqVU13UDEyeW1XU3NJaktkOEpvWEdFV3l2aUptT0QzREpnL1N2VGo3S1c3TGJZS0FNbU05VWgrMG40NFBtQitOWEZqV1BJOUkwd2NQUGlwVSszOVI3OGlyL1luZnhaRWNZNnEvWkMwMnBuSDRQcFZ4a25VN2hUcG43Vm9mR0dheUtlRS9MTnJqOU03OGN0TlE0R0dRbzRpN2ZZQXNNZ1doQ0ZVaWZMOXJLRXhieEkrVktXaEQ3VVBqL1ZyR3QwUXV5MzR5VVhIcllGTFlucXBjQXVwblVSb2I5dEd6amR4LzUvL3JIbVdCTlFPNVhtbzNacG9ZM2p1MVlsekZiZWRyUXhZVXh4ZlFXQ043d0paTTVZby9iSVRhTi9UcGZvb0k4RmN3UnkxR2tmOXhMbEJsZi8weFVBWkViL1BvdlVsZFNlajg3OUpMYzkzNnl0OXIzbG5QeXFpa0gyaXZVd05RaHhXNjhEMTNmNHZtWnMxL2NTZG5Cc2hJTllEUFo1RG1Qa2J0UXFlbjg9In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlVHdvLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:02 GMT" ], "X-Amzn-Requestid": [ "452d550b-6b47-58fa-acaf-373d73b1a82a" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "f05f00fd3e62f8bd", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "176" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlVHdvLXN1Yi0yIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "879" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:02 GMT" ], "X-Amzn-Requestid": [ "8bab5f73-8c42-5083-be12-3d4594b42d4c" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjYyNDQzIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNjE5NjIifSwiQm9keSI6IjEiLCJNRDVPZkJvZHkiOiJjNGNhNDIzOGEwYjkyMzgyMGRjYzUwOWE2Zjc1ODQ5YiIsIk1ENU9mTWVzc2FnZUF0dHJpYnV0ZXMiOiIzMTRjNzdiMjQ5ODkzYzZiM2M3NjVhNDJjYzA4YjI0NSIsIk1lc3NhZ2VBdHRyaWJ1dGVzIjp7ImEiOnsiRGF0YVR5cGUiOiJTdHJpbmciLCJTdHJpbmdWYWx1ZSI6IjEifX0sIk1lc3NhZ2VJZCI6IjMxODgxYjE1LTIwOWEtNGE3OS1iYjFiLTczMDk2NjRmMmIxNyIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCeXRHdkpNdmpvOUpNcWswVXIyeFArekFrbXNycEVBaTRrU3pEbURscE96NS9rL2ZFZjZmcnJxb1VWZ3dQbE1pbVFMZ1NrbWxzcXhRamhHKy9YWFhxTTFOSXgyaThISHVFVkZZQjVRUXJUSFRqRjhQOXkvTkJrTy9lRVdJaGx3YlRMUHJGbHRNRkcybmxuQ29YcXVkTmw4Z1l6VmtGMmhFSVUxZVhreW1NQ1JMamNISDJtUUR0K0FTRys0RWNmYmtNVGxLUUpMTUNmdy9TbEtKa01KSnRObjdVYkJOUWMxT1hlNGY4dndDT3FiT3RFS0pnMFNjVnB0Zk1ROUE3Y1QyVmUvMWpYd0Y1QXlaUW5CMUJ0YlFBUHZjZmpqcEtYbkgyK0hJSzZMYzgwN0JhN2J4azF6MFhNR1Z5Z3FoU0FGRWdLUUJ4bFpsL0doMGJ4cUNrbDdOcExVR2FNdWo4dmFyTWZiZEVxd2F5T0RIQkhjbUR5RGlxVGpHcERkeE11MGdndFZOZDAxKzBlNGxObDJzT1FsL3ovR3Vqd3dNT3laYVNQMitRaFNISDIyST0ifV19" } }, { "ID": "3cae31557eb725c8", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "176" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlVHdvLXN1Yi0yIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "879" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:02 GMT" ], "X-Amzn-Requestid": [ "70351428-f723-5790-a0f7-761eefd55740" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjYyNTEyIiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNjE4NzYifSwiQm9keSI6IjAiLCJNRDVPZkJvZHkiOiJjZmNkMjA4NDk1ZDU2NWVmNjZlN2RmZjlmOTg3NjRkYSIsIk1ENU9mTWVzc2FnZUF0dHJpYnV0ZXMiOiI5YWE0Njg3YzhiNzU2N2JhYTM4MGQ5ZjMwMGZlMjgzYSIsIk1lc3NhZ2VBdHRyaWJ1dGVzIjp7ImEiOnsiRGF0YVR5cGUiOiJTdHJpbmciLCJTdHJpbmdWYWx1ZSI6IjAifX0sIk1lc3NhZ2VJZCI6ImRmODkzNGU3LTE3NWUtNDcwNy04NDdmLWUwMGYzOTMxMGEzNyIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCTlUxUUova2k2RzRhMWVvZFlCYm96VUg1MnlTQXdiRzFDZFNoNjNBaWRTeVFNRDUrOC83NEVkUndITDIyUG04OVl5MTVpUldZdXd2cVZoR1hRVDE5NWY2SVlOajRWSXRDWFZVMktob3k4Vk9Dd0wrbnM4NGlSZWdIZ1pRNEdWNzc4U2I3bEhyajFtdVpyM0F0ak9IODlBaGwrSVY5RTN6eEZsYzJoV1h3Vmc2QnJ6QStmazFMcWcrM1pHMlAzS0JPTXg4cVJjdERseHlWbWFmZUcwMkJLQjh4NlNERUlub0NURnZucmQ3YTk5Z0pYeDJ1cEllRU05dmh6OCsyNXVwa0Q3NnhSN3R3dU85NjErVVZmRFI0Nk1iMXl2WUdpNmJ1TFo3Zzh2cVpZbG1rQXRzRG1QelFyVFRZRFF6TUVPVXN5MGt4bGxNL095aGF4SzdIcGVaRllwTDI4UlExMzFhUjMxYjJrSFpoYWdCREg3V3l5b2VFWGVsN3V5aGhlVGdBZGlXZUNubE9YYmsxMU5ES1JuWGxDSVQ4bloxbXBWcGNGdkRxc0Q5N0JKZz0ifV19" } }, { "ID": "fb24f3a56333ecfe", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "569" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQnl0R3ZKTXZqbzlKTXFrMFVyMnhQK3pBa21zcnBFQWk0a1N6RG1EbHBPejUvay9mRWY2ZnJycW9VVmd3UGxNaW1RTGdTa21sc3F4UWpoRysvWFhYcU0xTkl4Mmk4SEh1RVZGWUI1UVFyVEhUakY4UDl5L05Ca08vZUVXSWhsd2JUTFByRmx0TUZHMm5sbkNvWHF1ZE5sOGdZelZrRjJoRUlVMWVYa3ltTUNSTGpjSEgybVFEdCtBU0crNEVjZmJrTVRsS1FKTE1DZncvU2xLSmtNSkp0Tm43VWJCTlFjMU9YZTRmOHZ3Q09xYk90RUtKZzBTY1ZwdGZNUTlBN2NUMlZlLzFqWHdGNUF5WlFuQjFCdGJRQVB2Y2ZqanBLWG5IMitISUs2TGM4MDdCYTdieGsxejBYTUdWeWdxaFNBRkVnS1FCeGxabC9HaDBieHFDa2w3TnBMVUdhTXVqOHZhck1mYmRFcXdheU9ESEJIY21EeURpcVRqR3BEZHhNdTBnZ3RWTmQwMSswZTRsTmwyc09RbC96L0d1and3TU95WmFTUDIrUWhTSEgyMkk9In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlVHdvLXN1Yi0yIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:02 GMT" ], "X-Amzn-Requestid": [ "8081874b-ef78-5fb6-869a-e57df78e5f84" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "aa80f3ef3e145e86", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "176" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlVHdvLXN1Yi0yIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "879" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:02 GMT" ], "X-Amzn-Requestid": [ "6fdfaad9-e25f-52d0-b22e-c8effaa96200" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0EzVFlNTzNCR0RISkZCSFQ3NTpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0MjYyNTg2IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyNjIwMjcifSwiQm9keSI6IjIiLCJNRDVPZkJvZHkiOiJjODFlNzI4ZDlkNGMyZjYzNmYwNjdmODljYzE0ODYyYyIsIk1ENU9mTWVzc2FnZUF0dHJpYnV0ZXMiOiJiNzJlMTQwZTcyNjllYmNlOTEwN2JhZjFlZjI0MGJhZSIsIk1lc3NhZ2VBdHRyaWJ1dGVzIjp7ImEiOnsiRGF0YVR5cGUiOiJTdHJpbmciLCJTdHJpbmdWYWx1ZSI6IjIifX0sIk1lc3NhZ2VJZCI6IjE5NTQ5MzFlLTViYjctNDg5MC1iMTZhLWEyZGUyY2UzOTc5ZiIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCMnQzTFdxc2NMckRBc3ZMNDFSb0EvYTk3RVIweDJmUlFxb3pFYkoxTTJTamhlUmJaMTk4U2hBTmVHNWNpNzNrVjVNWkVkZVhNaWdBUVNrK0xEcXlNZjZwamhxbmNBVERyMnpyc2RjVWRQZlk5dnV1RzVQMlcrUUUyWS9iQm1XVFhmOTRRSjdZVldYanlZWFRUc2RVKy9LVlNHQlp0VUlPL3ZTeXZVc21HaUFIZm5OMU5zR3hNSjVIN01kckF2KzlzckJsY1B4dEw5aGNsU1ZldW1TNFNYR3B3ejRON0xJYjNZbFFZeGhtQ0oyTFRMMW9vSmVpU1lLR0RkQmpjZU5VZzJpTHl6Q1Azc2R1VmhBVUpiL2ZsdXc0MEVzYVVmV3RrWitLN1huRXR3T3lqZ3REUEU5Zzc1aksrdHFQOWkxNDQ1Z2Z5aVpRMnZyL3hISmxQWlBwVFBFdzRoZmVxZDFreUowaVd3NW5yLzc5S0RLYnBJNURlL0FnOFNxblZJRXdGYk5IdjlCRitzVGlFcytXeUJzdlZlU2FWZnpCMzJhYzdOZlZkUnlnNklIST0ifV19" } }, { "ID": "a59f703f86c5ebbc", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "569" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQk5VMVFKL2tpNkc0YTFlb2RZQmJvelVINTJ5U0F3YkcxQ2RTaDYzQWlkU3lRTUQ1KzgvNzRFZFJ3SEwyMlBtODlZeTE1aVJXWXV3dnFWaEdYUVQxOTVmNklZTmo0Vkl0Q1hWVTJLaG95OFZPQ3dMK25zODRpUmVnSGdaUTRHVjc3OFNiN2xIcmoxbXVacjNBdGpPSDg5QWhsK0lWOUUzenhGbGMyaFdYd1ZnNkJyekErZmsxTHFnKzNaRzJQM0tCT014OHFSY3REbHh5Vm1hZmVHMDJCS0I4eDZTREVJbm9DVEZ2bnJkN2E5OWdKWHgydXBJZUVNOXZoejgrMjV1cGtENzZ4Ujd0d3VPOTYxK1VWZkRSNDZNYjF5dllHaTZidUxaN2c4dnFaWWxta0F0c0RtUHpRclRUWURRek1FT1VzeTBreGxsTS9PeWhheEs3SHBlWkZZcEwyOFJRMTMxYVIzMWIya0haaGFnQkRIN1d5eW9lRVhlbDd1eWhoZVRnQWRpV2VDbmxPWGJrMTFOREtSblhsQ0lUOG5aMW1wVnBjRnZEcXNEOTdCSmc9In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlVHdvLXN1Yi0yIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:02 GMT" ], "X-Amzn-Requestid": [ "aa79047d-0047-53d4-82a4-664b18b1d3e6" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "ffe797e02856095c", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "569" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQjJ0M0xXcXNjTHJEQXN2TDQxUm9BL2E5N0VSMHgyZlJRcW96RWJKMU0yU2poZVJiWjE5OFNoQU5lRzVjaTcza1Y1TVpFZGVYTWlnQVFTaytMRHF5TWY2cGpocW5jQVREcjJ6cnNkY1VkUGZZOXZ1dUc1UDJXK1FFMlkvYkJtV1RYZjk0UUo3WVZXWGp5WVhUVHNkVSsvS1ZTR0JadFVJTy92U3l2VXNtR2lBSGZuTjFOc0d4TUo1SDdNZHJBdis5c3JCbGNQeHRMOWhjbFNWZXVtUzRTWEdwd3o0TjdMSWIzWWxRWXhobUNKMkxUTDFvb0plaVNZS0dEZEJqY2VOVWcyaUx5ekNQM3NkdVZoQVVKYi9mbHV3NDBFc2FVZld0a1orSzdYbkV0d095amd0RFBFOWc3NWpLK3RxUDlpMTQ0NWdmeWlaUTJ2ci94SEpsUFpQcFRQRXc0aGZlcWQxa3lKMGlXdzVuci83OUtES2JwSTVEZS9BZzhTcW5WSUV3RmJOSHY5QkYrc1RpRXMrV3lCc3ZWZVNhVmZ6QjMyYWM3TmZWZFJ5ZzZJSEk9In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlVHdvLXN1Yi0yIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:02 GMT" ], "X-Amzn-Requestid": [ "9edc9f92-3811-5614-9d82-fda420e71626" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "3119f7646223a4df", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "169" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd1NlbmRSZWNlaXZlVHdvLXRvcC0xJTNBYzEwZmQ2YjgtM2ExMy00NzEzLWFiMDYtYzkzODczMjhiZTk0JlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:02 GMT" ], "X-Amzn-Requestid": [ "0d3779bf-7e46-5af5-bae0-1b8966b0883c" ] }, "Body": "PFVuc3Vic2NyaWJlUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD4wZDM3NzliZi03ZTQ2LTVhZjUtYmFlMC0xYjg5NjZiMDg4M2M8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvVW5zdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "e2a0a09d07178372", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "95" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlVHdvLXN1Yi0yIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:02 GMT" ], "X-Amzn-Requestid": [ "e865ad88-7d3a-50a8-91f6-cfbe65ccd09a" ] }, "Body": "" } }, { "ID": "4b7cd6a1b800f785", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "169" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FTTlNUb3BpY1Jhd1NlbmRSZWNlaXZlVHdvLXRvcC0xJTNBNmE4NTZlZjAtYmFjOS00OWJkLTg5YzEtNDI4Yjk4MGZmMjRiJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:03 GMT" ], "X-Amzn-Requestid": [ "1399513d-002f-5a75-8209-330b18d928bc" ] }, "Body": "PFVuc3Vic2NyaWJlUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD4xMzk5NTEzZC0wMDJmLTVhNzUtODIwOS0zMzBiMThkOTI4YmM8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvVW5zdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "d10452bdaa5b5e8e", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "95" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TTlNUb3BpY1Jhd1NlbmRSZWNlaXZlVHdvLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:03 GMT" ], "X-Amzn-Requestid": [ "f8e81321-b3f7-5c38-8382-7117ab00bc0a" ] }, "Body": "" } }, { "ID": "cd858a17b04d1e55", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "123" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPURlbGV0ZVRvcGljJlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQVNOU1RvcGljUmF3U2VuZFJlY2VpdmVUd28tdG9wLTEmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:03 GMT" ], "X-Amzn-Requestid": [ "90afb681-dfe9-59b2-827c-d4b7c71e7b7b" ] }, "Body": "PERlbGV0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD45MGFmYjY4MS1kZmU5LTU5YjItODI3Yy1kNGI3YzcxZTdiN2I8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvRGVsZXRlVG9waWNSZXNwb25zZT4K" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSQSTopic/TestAs/aws_test.replay ================================================ { "Initial": "AQAAAA7hTg3KLe0plAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "b1b747964e27ac1e", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "41" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTUVNUb3BpY0FzX2F3c190ZXN0LXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "89" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:23 GMT" ], "X-Amzn-Requestid": [ "f2b9a3da-54f9-53db-9178-c1ec4df25ea8" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0FzX2F3c190ZXN0LXRvcC0xIn0=" } }, { "ID": "451ede785ff1f73b", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "119" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0FzX2F3c190ZXN0LXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "90" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:23 GMT" ], "X-Amzn-Requestid": [ "6ffc41d0-4aab-5732-b601-23e653a0aa41" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTUVNUb3BpY0FzX2F3c190ZXN0LXRvcC0xIn19" } }, { "ID": "0c7f82491bfe904e", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "464" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNRU1RvcGljQXNfYXdzX3Rlc3QtdG9wLTFcIlxuXHRcdH1cblx0XHRdXG5cdFx0fSJ9LCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0FzX2F3c190ZXN0LXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:23 GMT" ], "X-Amzn-Requestid": [ "654cfaaa-7d0a-5420-9128-989c6401a953" ] }, "Body": "" } }, { "ID": "16ae7be5e09fe4ff", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "130" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SendMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJNZXNzYWdlQm9keSI6IngifV0sIlF1ZXVlVXJsIjoiaHR0cHM6Ly9zcXMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vNDU2NzUyNjY1NTc2L1NRU1RvcGljQXNfYXdzX3Rlc3QtdG9wLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "132" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:23 GMT" ], "X-Amzn-Requestid": [ "d5046588-f02d-52f5-876c-07bee9263f86" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAiLCJNRDVPZk1lc3NhZ2VCb2R5IjoiOWRkNGU0NjEyNjhjODAzNGY1Yzg1NjRlMTU1YzY3YTYiLCJNZXNzYWdlSWQiOiIzYzc0MzQ0ZC1iYWMxLTQ1N2QtYTA4MS0xOWMyZTE2ZjE0ODYifV19" } }, { "ID": "a4106182a2ce67a9", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "170" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0FzX2F3c190ZXN0LXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "739" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:23 GMT" ], "X-Amzn-Requestid": [ "919b5889-37f3-5b5b-9373-3abf2ef84628" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFJREFXVVdFVVNQVUlHQkxPNEdKRCIsIkFwcHJveGltYXRlRmlyc3RSZWNlaXZlVGltZXN0YW1wIjoiMTc3MzkzNDI4MzMzNiIsIkFwcHJveGltYXRlUmVjZWl2ZUNvdW50IjoiMSIsIlNlbnRUaW1lc3RhbXAiOiIxNzczOTM0MjgzMjYxIn0sIkJvZHkiOiJ4IiwiTUQ1T2ZCb2R5IjoiOWRkNGU0NjEyNjhjODAzNGY1Yzg1NjRlMTU1YzY3YTYiLCJNZXNzYWdlSWQiOiIzYzc0MzQ0ZC1iYWMxLTQ1N2QtYTA4MS0xOWMyZTE2ZjE0ODYiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQkpYT2g4SXNNQUZ4eEJvVTVGZC84dUQ1VVY5VFMzV2lIRzY0cmtpZFA5WkVzYnM4Qjh3RFpHTHJVQ1BycU5tNnZLbGlLb0xHV09LM0VYV2lkR3hQTFpFVWVZVHdoNC9hZjBMRWRsVjkwdjN6U05HdU1kc3o1WmZURDJLdlpMcEtaYWhoZG1HYmwva1lVTHREcldTUVZCUHdyMDlYWjBQWEVjSklpSFJyS2JvV21oWUVVQTliYXRmWEdZYURtbnhoN1c1b1R0a21PY3k2c3I3VlRMSVIzWDd4dkhFNHBMMTA5VnkvWFpTNU5HTklIbUVUc0o0UGdVSVBTQkZpRU5lUEZpNGdLc3A5SzZ1dVdxU0VVSTRyNzBOSkRSeXFHYnZjVk92VHhnVFBzdGRDaTZTWDJHWkRzYjZFQUM0aURTQ3VNTjNPV0l1VitWc0xjYWFxSzlCaVgxVzJiZVRkMFJyaGY0eXhrekZhRWFHT1BrZVpaQVVlcnN3TjdObFVJZ3hKaE5CdVN4QWRhYmQvemdGZUxIWHEyNUszb2RhbFhDRlF3WEJmSlRWdDg0UDA9In1dfQ==" } }, { "ID": "0338e649f446f2c8", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "117" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SendMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJNZXNzYWdlQm9keSI6IiJ9XSwiUXVldWVVcmwiOiJodHRwczovL3VzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9ub25leGlzdGVudC1xdWV1ZSJ9" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "96" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:23 GMT" ], "X-Amzn-Query-Error": [ "AWS.SimpleQueueService.NonExistentQueue;Sender" ], "X-Amzn-Requestid": [ "0ea2d351-5014-56f2-8ce4-b167491f1b81" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLnNxcyNRdWV1ZURvZXNOb3RFeGlzdCIsIm1lc3NhZ2UiOiJUaGUgc3BlY2lmaWVkIHF1ZXVlIGRvZXMgbm90IGV4aXN0LiJ9" } }, { "ID": "7780b86a755e4c6d", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "563" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQkpYT2g4SXNNQUZ4eEJvVTVGZC84dUQ1VVY5VFMzV2lIRzY0cmtpZFA5WkVzYnM4Qjh3RFpHTHJVQ1BycU5tNnZLbGlLb0xHV09LM0VYV2lkR3hQTFpFVWVZVHdoNC9hZjBMRWRsVjkwdjN6U05HdU1kc3o1WmZURDJLdlpMcEtaYWhoZG1HYmwva1lVTHREcldTUVZCUHdyMDlYWjBQWEVjSklpSFJyS2JvV21oWUVVQTliYXRmWEdZYURtbnhoN1c1b1R0a21PY3k2c3I3VlRMSVIzWDd4dkhFNHBMMTA5VnkvWFpTNU5HTklIbUVUc0o0UGdVSVBTQkZpRU5lUEZpNGdLc3A5SzZ1dVdxU0VVSTRyNzBOSkRSeXFHYnZjVk92VHhnVFBzdGRDaTZTWDJHWkRzYjZFQUM0aURTQ3VNTjNPV0l1VitWc0xjYWFxSzlCaVgxVzJiZVRkMFJyaGY0eXhrekZhRWFHT1BrZVpaQVVlcnN3TjdObFVJZ3hKaE5CdVN4QWRhYmQvemdGZUxIWHEyNUszb2RhbFhDRlF3WEJmSlRWdDg0UDA9In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0FzX2F3c190ZXN0LXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:23 GMT" ], "X-Amzn-Requestid": [ "136d2745-94f3-5e2a-84d5-45738df88359" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "f5980548af358892", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "165" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vdXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vNDU2NzUyNjY1NTc2L25vbmV4aXN0ZW50LXN1YnNjcmlwdGlvbiJ9" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "96" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:23 GMT" ], "X-Amzn-Query-Error": [ "AWS.SimpleQueueService.NonExistentQueue;Sender" ], "X-Amzn-Requestid": [ "ae7477e4-7b6e-53a9-bbfa-15d26265eeda" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLnNxcyNRdWV1ZURvZXNOb3RFeGlzdCIsIm1lc3NhZ2UiOiJUaGUgc3BlY2lmaWVkIHF1ZXVlIGRvZXMgbm90IGV4aXN0LiJ9" } }, { "ID": "77fb7075df8b3f4d", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "89" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0FzX2F3c190ZXN0LXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:23 GMT" ], "X-Amzn-Requestid": [ "417be777-57ee-59e1-b500-85414ee5c492" ] }, "Body": "" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSQSTopic/TestAs/verify_As_returns_false_when_passed_nil.replay ================================================ { "Initial": "AQAAAA7hTg3LKQIUhwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "9b8d6f4709285af5", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "72" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTUVNUb3BpY0FzX3ZlcmlmeV9Bc19yZXR1cm5zX2ZhbHNlX3doZW5fcGFzc2VkX25pbC10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "120" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:23 GMT" ], "X-Amzn-Requestid": [ "ab809212-6eb1-5c05-8673-f02477ba3748" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0FzX3ZlcmlmeV9Bc19yZXR1cm5zX2ZhbHNlX3doZW5fcGFzc2VkX25pbC10b3AtMSJ9" } }, { "ID": "60aed6a624c901b8", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "150" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0FzX3ZlcmlmeV9Bc19yZXR1cm5zX2ZhbHNlX3doZW5fcGFzc2VkX25pbC10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "121" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:24 GMT" ], "X-Amzn-Requestid": [ "2cfe8572-4906-50a2-9877-e744500a6bef" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTUVNUb3BpY0FzX3ZlcmlmeV9Bc19yZXR1cm5zX2ZhbHNlX3doZW5fcGFzc2VkX25pbC10b3AtMSJ9fQ==" } }, { "ID": "3941897e93d8bcdd", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "526" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNRU1RvcGljQXNfdmVyaWZ5X0FzX3JldHVybnNfZmFsc2Vfd2hlbl9wYXNzZWRfbmlsLXRvcC0xXCJcblx0XHR9XG5cdFx0XVxuXHRcdH0ifSwiUXVldWVVcmwiOiJodHRwczovL3Nxcy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS80NTY3NTI2NjU1NzYvU1FTVG9waWNBc192ZXJpZnlfQXNfcmV0dXJuc19mYWxzZV93aGVuX3Bhc3NlZF9uaWwtdG9wLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:24 GMT" ], "X-Amzn-Requestid": [ "df8014f6-8bfe-5bf4-8a43-76c092f2b0b9" ] }, "Body": "" } }, { "ID": "7e4656b045e5a266", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "161" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SendMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJNZXNzYWdlQm9keSI6IngifV0sIlF1ZXVlVXJsIjoiaHR0cHM6Ly9zcXMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vNDU2NzUyNjY1NTc2L1NRU1RvcGljQXNfdmVyaWZ5X0FzX3JldHVybnNfZmFsc2Vfd2hlbl9wYXNzZWRfbmlsLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "132" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:24 GMT" ], "X-Amzn-Requestid": [ "d22195e3-f269-5a8a-93fe-f7d5eb65d1c7" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAiLCJNRDVPZk1lc3NhZ2VCb2R5IjoiOWRkNGU0NjEyNjhjODAzNGY1Yzg1NjRlMTU1YzY3YTYiLCJNZXNzYWdlSWQiOiJkNjg5MjRmMy05ZDA3LTQwODQtOWE2NC1jMDFjYWZmZTcxYjEifV19" } }, { "ID": "a7a42c38c2e4b5ce", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "201" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0FzX3ZlcmlmeV9Bc19yZXR1cm5zX2ZhbHNlX3doZW5fcGFzc2VkX25pbC10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "783" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:24 GMT" ], "X-Amzn-Requestid": [ "a69bf657-7b01-56ce-a131-9461620d9d83" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFJREFXVVdFVVNQVUlHQkxPNEdKRCIsIkFwcHJveGltYXRlRmlyc3RSZWNlaXZlVGltZXN0YW1wIjoiMTc3MzkzNDI4NDI4NyIsIkFwcHJveGltYXRlUmVjZWl2ZUNvdW50IjoiMSIsIlNlbnRUaW1lc3RhbXAiOiIxNzczOTM0Mjg0MjA3In0sIkJvZHkiOiJ4IiwiTUQ1T2ZCb2R5IjoiOWRkNGU0NjEyNjhjODAzNGY1Yzg1NjRlMTU1YzY3YTYiLCJNZXNzYWdlSWQiOiJkNjg5MjRmMy05ZDA3LTQwODQtOWE2NC1jMDFjYWZmZTcxYjEiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQmtLRy9PWWRPZHh6ZWVTOHM2dlAvN2VXOE00eWdIbitCcHNsemk5UGZtMkNyMCt2ZEdXNTdxemt0TCtKWXVoeGxidElGbzEyRElRVE5JczVVeGlWY2t0RlV2NXowT3NiU1ozRkVjVFNYM3ByaXJGU0VNRzB5elQya082Q0hMM25IWUhNNjhrR0VsUGk2eUxiaFlzU1FKb1dpekdreThYemQxNVo0UDVlZmJzUXl1ajluSWtlWFJjS2IwcG1nTnI0T3ZsbkVxR3ZoUDF6U0ZiZ20wQmVtaG1ISkVQR0t1RXVFbE5OZ0UrYTRYczNCZVNQRmVGQkRmSjNCcTZ5K1ZjTGQyaTFPVzdtUXFMTjQ1QWdSYVB2cnBMZXVCUGJjODdIZ2lPNkxURE92a2d3RTdHZ0lNWk0xRGV5Vk8zNG0wbWxZYUVrMFl3TFFEdlpsbVhJNnRHUVdNYVRKUUlQRnNmVzZ3LzZodHN3a2xJY2lobUpoejBZQ2JUa010ZGNYU1BudnZ1WXN2QzlwS0ZJNlk2WW9sMU1pSWF2YXRWRkhsZFZrSlg1WEpBUVl6WGZIbktiYnN6VlBleDlzTitYSDJ2b3pZRXAzVjd0ckc3WGN1cXJoSXpDTWJBPT0ifV19" } }, { "ID": "aa227d3fd29c8982", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "117" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SendMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJNZXNzYWdlQm9keSI6IiJ9XSwiUXVldWVVcmwiOiJodHRwczovL3VzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9ub25leGlzdGVudC1xdWV1ZSJ9" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "96" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:24 GMT" ], "X-Amzn-Query-Error": [ "AWS.SimpleQueueService.NonExistentQueue;Sender" ], "X-Amzn-Requestid": [ "0b51bd73-a829-596c-b4e8-df45b1254221" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLnNxcyNRdWV1ZURvZXNOb3RFeGlzdCIsIm1lc3NhZ2UiOiJUaGUgc3BlY2lmaWVkIHF1ZXVlIGRvZXMgbm90IGV4aXN0LiJ9" } }, { "ID": "e90470c701d69786", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "638" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQmtLRy9PWWRPZHh6ZWVTOHM2dlAvN2VXOE00eWdIbitCcHNsemk5UGZtMkNyMCt2ZEdXNTdxemt0TCtKWXVoeGxidElGbzEyRElRVE5JczVVeGlWY2t0RlV2NXowT3NiU1ozRkVjVFNYM3ByaXJGU0VNRzB5elQya082Q0hMM25IWUhNNjhrR0VsUGk2eUxiaFlzU1FKb1dpekdreThYemQxNVo0UDVlZmJzUXl1ajluSWtlWFJjS2IwcG1nTnI0T3ZsbkVxR3ZoUDF6U0ZiZ20wQmVtaG1ISkVQR0t1RXVFbE5OZ0UrYTRYczNCZVNQRmVGQkRmSjNCcTZ5K1ZjTGQyaTFPVzdtUXFMTjQ1QWdSYVB2cnBMZXVCUGJjODdIZ2lPNkxURE92a2d3RTdHZ0lNWk0xRGV5Vk8zNG0wbWxZYUVrMFl3TFFEdlpsbVhJNnRHUVdNYVRKUUlQRnNmVzZ3LzZodHN3a2xJY2lobUpoejBZQ2JUa010ZGNYU1BudnZ1WXN2QzlwS0ZJNlk2WW9sMU1pSWF2YXRWRkhsZFZrSlg1WEpBUVl6WGZIbktiYnN6VlBleDlzTitYSDJ2b3pZRXAzVjd0ckc3WGN1cXJoSXpDTWJBPT0ifV0sIlF1ZXVlVXJsIjoiaHR0cHM6Ly9zcXMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vNDU2NzUyNjY1NTc2L1NRU1RvcGljQXNfdmVyaWZ5X0FzX3JldHVybnNfZmFsc2Vfd2hlbl9wYXNzZWRfbmlsLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:24 GMT" ], "X-Amzn-Requestid": [ "e4c16f1b-1a5e-5475-8883-0d2d03526f38" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "7d8fcb521aa87cff", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "165" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vdXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vNDU2NzUyNjY1NTc2L25vbmV4aXN0ZW50LXN1YnNjcmlwdGlvbiJ9" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "96" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:24 GMT" ], "X-Amzn-Query-Error": [ "AWS.SimpleQueueService.NonExistentQueue;Sender" ], "X-Amzn-Requestid": [ "220bbf64-40bb-5997-8a9c-dd5259b702da" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLnNxcyNRdWV1ZURvZXNOb3RFeGlzdCIsIm1lc3NhZ2UiOiJUaGUgc3BlY2lmaWVkIHF1ZXVlIGRvZXMgbm90IGV4aXN0LiJ9" } }, { "ID": "e992b30987db6158", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "120" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0FzX3ZlcmlmeV9Bc19yZXR1cm5zX2ZhbHNlX3doZW5fcGFzc2VkX25pbC10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:24 GMT" ], "X-Amzn-Requestid": [ "80b7122f-02ac-5eef-a65f-70191ba05621" ] }, "Body": "" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSQSTopic/TestBatching.replay ================================================ { "Initial": "AQAAAA7hTg3IOqyezQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "1438c5bb022dac59", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "38" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTUVNUb3BpY0JhdGNoaW5nLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "86" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:21 GMT" ], "X-Amzn-Requestid": [ "09c0651b-164a-5300-a493-072d0f43a631" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0JhdGNoaW5nLXRvcC0xIn0=" } }, { "ID": "ac7aa75e9d1c1a23", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "116" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0JhdGNoaW5nLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "87" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:21 GMT" ], "X-Amzn-Requestid": [ "852a4805-35aa-5099-954c-2a332ca3f5a8" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTUVNUb3BpY0JhdGNoaW5nLXRvcC0xIn19" } }, { "ID": "d0908443dcebfe96", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "458" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNRU1RvcGljQmF0Y2hpbmctdG9wLTFcIlxuXHRcdH1cblx0XHRdXG5cdFx0fSJ9LCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0JhdGNoaW5nLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:21 GMT" ], "X-Amzn-Requestid": [ "69dda0ca-2558-599f-be8e-c2fc3c514cae" ] }, "Body": "" } }, { "ID": "790004e514973445", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "332" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SendMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJNZXNzYWdlQm9keSI6ImhlbGxvIHdvcmxkIn0seyJJZCI6IjEiLCJNZXNzYWdlQm9keSI6ImhlbGxvIHdvcmxkIn0seyJJZCI6IjIiLCJNZXNzYWdlQm9keSI6ImhlbGxvIHdvcmxkIn0seyJJZCI6IjMiLCJNZXNzYWdlQm9keSI6ImhlbGxvIHdvcmxkIn0seyJJZCI6IjQiLCJNZXNzYWdlQm9keSI6ImhlbGxvIHdvcmxkIn0seyJJZCI6IjUiLCJNZXNzYWdlQm9keSI6ImhlbGxvIHdvcmxkIn1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0JhdGNoaW5nLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "712" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:21 GMT" ], "X-Amzn-Requestid": [ "251a7f88-c0e1-568c-8e6c-1dbed9e8e3bd" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAiLCJNRDVPZk1lc3NhZ2VCb2R5IjoiNWViNjNiYmJlMDFlZWVkMDkzY2IyMmJiOGY1YWNkYzMiLCJNZXNzYWdlSWQiOiJiY2YyZjgwNi02NzU0LTRhNjctYTZiOS0zYzRkMGExYmMxODAifSx7IklkIjoiMSIsIk1ENU9mTWVzc2FnZUJvZHkiOiI1ZWI2M2JiYmUwMWVlZWQwOTNjYjIyYmI4ZjVhY2RjMyIsIk1lc3NhZ2VJZCI6IjM2MGUyYWZkLWE0OTUtNGIxMi04NDIzLWUyMWYxNGU0MjgzMSJ9LHsiSWQiOiIyIiwiTUQ1T2ZNZXNzYWdlQm9keSI6IjVlYjYzYmJiZTAxZWVlZDA5M2NiMjJiYjhmNWFjZGMzIiwiTWVzc2FnZUlkIjoiYzQ3NTJiZjYtN2MyNi00ZThiLTlhMzYtMWZkY2I2NzBhY2YxIn0seyJJZCI6IjMiLCJNRDVPZk1lc3NhZ2VCb2R5IjoiNWViNjNiYmJlMDFlZWVkMDkzY2IyMmJiOGY1YWNkYzMiLCJNZXNzYWdlSWQiOiJmMDZkMDdjMS0wZDM1LTQxNDQtYmIzYi01NmY1YTg4NmNjMzIifSx7IklkIjoiNCIsIk1ENU9mTWVzc2FnZUJvZHkiOiI1ZWI2M2JiYmUwMWVlZWQwOTNjYjIyYmI4ZjVhY2RjMyIsIk1lc3NhZ2VJZCI6IjA4MDEyMDlmLWE1NmQtNDIzOS04ZmM4LWM0YTBiOTdjZmQ4YSJ9LHsiSWQiOiI1IiwiTUQ1T2ZNZXNzYWdlQm9keSI6IjVlYjYzYmJiZTAxZWVlZDA5M2NiMjJiYjhmNWFjZGMzIiwiTWVzc2FnZUlkIjoiN2VmYjBiNjAtYWU0OC00MTUxLThkOTEtNjIyNTJmOTBhNWRlIn1dfQ==" } }, { "ID": "dff7e4cacbbff935", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "332" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SendMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJNZXNzYWdlQm9keSI6ImhlbGxvIHdvcmxkIn0seyJJZCI6IjEiLCJNZXNzYWdlQm9keSI6ImhlbGxvIHdvcmxkIn0seyJJZCI6IjIiLCJNZXNzYWdlQm9keSI6ImhlbGxvIHdvcmxkIn0seyJJZCI6IjMiLCJNZXNzYWdlQm9keSI6ImhlbGxvIHdvcmxkIn0seyJJZCI6IjQiLCJNZXNzYWdlQm9keSI6ImhlbGxvIHdvcmxkIn0seyJJZCI6IjUiLCJNZXNzYWdlQm9keSI6ImhlbGxvIHdvcmxkIn1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0JhdGNoaW5nLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "712" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:21 GMT" ], "X-Amzn-Requestid": [ "baa2fbd3-2888-5041-9d18-99e53181b570" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAiLCJNRDVPZk1lc3NhZ2VCb2R5IjoiNWViNjNiYmJlMDFlZWVkMDkzY2IyMmJiOGY1YWNkYzMiLCJNZXNzYWdlSWQiOiJjYTQ3NWRkMC05MjM5LTRiMmMtOWMzNy0yNGMwNmU0NzViODAifSx7IklkIjoiMSIsIk1ENU9mTWVzc2FnZUJvZHkiOiI1ZWI2M2JiYmUwMWVlZWQwOTNjYjIyYmI4ZjVhY2RjMyIsIk1lc3NhZ2VJZCI6IjJmZDAwNGFhLThlNjctNGNkZC04YmYzLTg1MjIyMmJlMWE5ZiJ9LHsiSWQiOiIyIiwiTUQ1T2ZNZXNzYWdlQm9keSI6IjVlYjYzYmJiZTAxZWVlZDA5M2NiMjJiYjhmNWFjZGMzIiwiTWVzc2FnZUlkIjoiYTE4M2VlMGYtNTM4Ny00OTFmLThlNDEtYzEwMDljNTkzYzkzIn0seyJJZCI6IjMiLCJNRDVPZk1lc3NhZ2VCb2R5IjoiNWViNjNiYmJlMDFlZWVkMDkzY2IyMmJiOGY1YWNkYzMiLCJNZXNzYWdlSWQiOiJkMDVkZjc3OS0yNDkwLTRlYTEtODc1OS1iYTMyOGE2YTFjNmMifSx7IklkIjoiNCIsIk1ENU9mTWVzc2FnZUJvZHkiOiI1ZWI2M2JiYmUwMWVlZWQwOTNjYjIyYmI4ZjVhY2RjMyIsIk1lc3NhZ2VJZCI6ImI0ZmYyMTVjLWI2NWUtNGRlNS05YzY4LTIyNmJlYTA0MjMxZiJ9LHsiSWQiOiI1IiwiTUQ1T2ZNZXNzYWdlQm9keSI6IjVlYjYzYmJiZTAxZWVlZDA5M2NiMjJiYjhmNWFjZGMzIiwiTWVzc2FnZUlkIjoiOGRiNDJjZjMtZDg4OC00Y2ZkLWJhNzMtNmQ1NjM0ODdmNmM5In1dfQ==" } }, { "ID": "de95a309e873288d", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "167" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0JhdGNoaW5nLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "729" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:21 GMT" ], "X-Amzn-Requestid": [ "81269448-b7dc-5574-97dc-f67eaed5a045" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFJREFXVVdFVVNQVUlHQkxPNEdKRCIsIkFwcHJveGltYXRlRmlyc3RSZWNlaXZlVGltZXN0YW1wIjoiMTc3MzkzNDI4MTYzNSIsIkFwcHJveGltYXRlUmVjZWl2ZUNvdW50IjoiMSIsIlNlbnRUaW1lc3RhbXAiOiIxNzczOTM0MjgxNDgyIn0sIkJvZHkiOiJoZWxsbyB3b3JsZCIsIk1ENU9mQm9keSI6IjVlYjYzYmJiZTAxZWVlZDA5M2NiMjJiYjhmNWFjZGMzIiwiTWVzc2FnZUlkIjoiYmNmMmY4MDYtNjc1NC00YTY3LWE2YjktM2M0ZDBhMWJjMTgwIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJ2ZTI3OXl6OGxIZFFiSENBM3FDcTR0cmZPdTU2VXA2TGErSzh5dUEvWHl2SHRsYTdrS0ZQc2w1MG5LRWFpaW00YnJ3T2ZLUFJ3czZOb3dod3BsY05LSDVHVnI3Q0dFNEYxQ09mTTNMVmd2RGpwTGZGQlJoMS9RVE0yaks4Y2hNQm1JWTU3RTFuN3RCQnNwUWdTY2ZjNlZLOHFNaVFGQW96VUFaWVFGclZmYzNwTjhlcVRNbXB0dnBGdjErdFlkZXRKa0tRUFNsa1FzeTJ4OTNlK1Nid25KemlXT1Z6enByN2Rydk4yNG5ZWU1FQjMwM1V2OEh4UFFsbGJyL3BSNlpOTExhUW5MT3Y3ZGZlOCtvTnZVeStVbllGK2VzdWt6RzRiYWlxSzQzalFrYXJyWVY1eDM2NkJYak45NzRpRE5jdlZ1OWQrL2kyQzk2WGZVUUpuRG0wOGVqWGk2WFVHRHZDazRPUUtsQzRWWUJ1dkZxUXZhaGhHdlBuRWx5TkZVVndSL3FpSCtESUhhT05TSDJpVWxlS3ZnPT0ifV19" } }, { "ID": "b0e10655b76f751c", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "167" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0JhdGNoaW5nLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "729" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:21 GMT" ], "X-Amzn-Requestid": [ "93540643-b944-560d-a8a5-6475a04d933c" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFJREFXVVdFVVNQVUlHQkxPNEdKRCIsIkFwcHJveGltYXRlRmlyc3RSZWNlaXZlVGltZXN0YW1wIjoiMTc3MzkzNDI4MTcwNiIsIkFwcHJveGltYXRlUmVjZWl2ZUNvdW50IjoiMSIsIlNlbnRUaW1lc3RhbXAiOiIxNzczOTM0MjgxNTU5In0sIkJvZHkiOiJoZWxsbyB3b3JsZCIsIk1ENU9mQm9keSI6IjVlYjYzYmJiZTAxZWVlZDA5M2NiMjJiYjhmNWFjZGMzIiwiTWVzc2FnZUlkIjoiYTE4M2VlMGYtNTM4Ny00OTFmLThlNDEtYzEwMDljNTkzYzkzIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJJaGlHa0R5YmpQZ0Jsb2pSbkVXYXZPa2xYWGVQdUoxN3dPMzY4OE93Y2lJYXQrZS9peEsrVHpPUnozT0VuV3BSYk04MGRaV2lJWTgyMFV0RkFqcmpJQjZ3ekIwWFNNUHZjWFBoZGkvNkd0ZkYzVHVrU1pHMU50bUs1VVdQNzdYT0twK0RNMTZCT3B1NUczc3dwOEZyWklORFZGYXBYdFV0ZDNZRTJOclVoTXJ2ZUxuQlBPQm0rQ29YN0VRWTVhQUhHSWxZRTYvd044eG84aWtydE9KeTdkVDROVmZReFhKdU1nbjYwYmNWQmJrdkhkUFFWSzZwZ2FYOHB5MFRPenNPU21Qd3RlUVd3bmx5Vm9WNlMwcGx0UlFIVXowWm1hNU5mU2h4bk80VDQ5L2lYRnJyYWZOaXNXUXdvMENkYmdoaVRjODVzZysvUitoeUUxU0lqSmVncUNnR1RFOENjdHNKUkt4cW82U1g2Rm02WFRzSVQ4Q0x6d3pTZmw4YTU2amlLcmNtOVk2RVEybWVKVWxjTitNcE5nPT0ifV19" } }, { "ID": "ea524a28c567baf4", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "167" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0JhdGNoaW5nLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "729" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:21 GMT" ], "X-Amzn-Requestid": [ "2c7d191d-24cb-591e-8349-7b2b3dc2cc2f" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFJREFXVVdFVVNQVUlHQkxPNEdKRCIsIkFwcHJveGltYXRlRmlyc3RSZWNlaXZlVGltZXN0YW1wIjoiMTc3MzkzNDI4MTc3NCIsIkFwcHJveGltYXRlUmVjZWl2ZUNvdW50IjoiMSIsIlNlbnRUaW1lc3RhbXAiOiIxNzczOTM0MjgxNDkwIn0sIkJvZHkiOiJoZWxsbyB3b3JsZCIsIk1ENU9mQm9keSI6IjVlYjYzYmJiZTAxZWVlZDA5M2NiMjJiYjhmNWFjZGMzIiwiTWVzc2FnZUlkIjoiMzYwZTJhZmQtYTQ5NS00YjEyLTg0MjMtZTIxZjE0ZTQyODMxIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJscDhYSmw0V0ViQ3pCM3JocDZzOHFEVHJTSDVETDlUSXRhbHFhc25TeDNCWEJMRXQ5aEk5RFZSSkJ3aUpVM3AxNXgyMjI1WFhPUDNCQUlXbGZLM200M0JWM2tnSW5NSkdCQnlzVm4xUlBDNEZBVG9IekVPci9lZUhhNlNvWWtxOXh4Wlg0M2lOOERuTzZ4V0h5dVUrSHpXUWxaVWVKMzlaRC9ZOUM3dC9kRmJTN0RxMVUyd2NxU1hOYWhxM2prVVZRNGJqb2ljMXcxUitLVno5MUljMnFiVjB0ckpzazdETHRoeVhQbEJtdGEyS1N0dUJYZW5XN29FUXVjU0h1NXlnYWZlK3RGVmhRUlVxMHc1cnlqZWlOMDlTeUQ3ZktydnhnMHBJNytacktJQ2JjcnE0dkRKZ1pHdVEvbDZwZnZQVG9sWDVyTEN3aHhJVTVWTk1mWitsd1hJV3p3RFd5OXJ4RVIxRnhEYXhyeGJtY09qQ0M4ZlUrN1hOM1VsRW8ycW1GQUduM2VDWDR1aUVTUlF0QXRGK1dBPT0ifV19" } }, { "ID": "a09bed4808122759", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "167" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0JhdGNoaW5nLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "729" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:21 GMT" ], "X-Amzn-Requestid": [ "8971cad5-f403-59ed-9f7b-a8e3ed0a8cdc" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFJREFXVVdFVVNQVUlHQkxPNEdKRCIsIkFwcHJveGltYXRlRmlyc3RSZWNlaXZlVGltZXN0YW1wIjoiMTc3MzkzNDI4MTg0MSIsIkFwcHJveGltYXRlUmVjZWl2ZUNvdW50IjoiMSIsIlNlbnRUaW1lc3RhbXAiOiIxNzczOTM0MjgxNDgyIn0sIkJvZHkiOiJoZWxsbyB3b3JsZCIsIk1ENU9mQm9keSI6IjVlYjYzYmJiZTAxZWVlZDA5M2NiMjJiYjhmNWFjZGMzIiwiTWVzc2FnZUlkIjoiMDgwMTIwOWYtYTU2ZC00MjM5LThmYzgtYzRhMGI5N2NmZDhhIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJmdlVRNDArTW1Rb0R5Tm1RUlJWK0tZQ2NvWmhYTGZhbjI1b0Y3OVZhU1dIRTQ2ZmFOQjJuRXFFN2FJVTdxU2pkb0Y4N1ZJS3BRalVZaTl5ZFFvbUNzZ0JlcnhnK1VKTlpONnNOUlZxL1FHd2xzTTVmd2tiQXdYb29ZUWZQT2d0N2FyWWwwOTlqRVFLVG9IT2NNS2lqMU10M0I5WnhLeUZNZGRjTTBzRHhGeUFqZWtPUks2VTFsMUFaU2h4U1NuUFZ1QjBBWHE3UUQrN2lKQ2hLMGFISjlUK1NEa28rV0RWYnVaZFB0eCtXSDNWRFdEYWoyTlhtc2NwY1RsYk5CckVydWt0MS8zTVNXa1I2QllRRXZNdW0wQWFuSkRxdGpEek41em4wdndWOHpFR25SZFp5ZnEzaWg1Q2dwZW9sZGxZbEpNL2JYV2tuODFFRXJSNzh4dmY1YzF5OXhFc0h2bG01eWE4SkdQUGRGYjc0aVl3Vk5rRjBGdk1veEh1b0liZzRsM2xoT3E2bE41dnhReFk1ZVVoU1lBPT0ifV19" } }, { "ID": "c9ec14ecc29ca094", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "167" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0JhdGNoaW5nLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "729" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:21 GMT" ], "X-Amzn-Requestid": [ "96f8d52d-e8e2-5152-b909-b71bf1eb7463" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFJREFXVVdFVVNQVUlHQkxPNEdKRCIsIkFwcHJveGltYXRlRmlyc3RSZWNlaXZlVGltZXN0YW1wIjoiMTc3MzkzNDI4MTkwOSIsIkFwcHJveGltYXRlUmVjZWl2ZUNvdW50IjoiMSIsIlNlbnRUaW1lc3RhbXAiOiIxNzczOTM0MjgxNDkwIn0sIkJvZHkiOiJoZWxsbyB3b3JsZCIsIk1ENU9mQm9keSI6IjVlYjYzYmJiZTAxZWVlZDA5M2NiMjJiYjhmNWFjZGMzIiwiTWVzc2FnZUlkIjoiN2VmYjBiNjAtYWU0OC00MTUxLThkOTEtNjIyNTJmOTBhNWRlIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJOc3k4RURVdWF3WVhpRncrUDhtdFJCZTg3TzNKdGQyZk1tdVZJL2I5NVg2WDYySGw4RmRTK1VQK0ZtbUFET0xxNGxKdG4zTWVCcEpVRzBHVW5XaUg5NHhTc0ZTa1Bmbnk3aFNER0V0WHJFYW53d0R3NW5kWVE3eHBzMUw4QTJmTk1CMlFsVXppUFVZVzZRNUVQMUwxME5WcDhYQjY2S0srcEtWNkFzQWdyMUN0ejBCaUh4a3UxaVViQisxNWZWOHZybThYZHlCeWdjQldlNWNISkRINmZjcytnT0N6R3dMaU40STVhSTNZbk52S3VYN09RbGVZa3YwejRNV21ZMlAzcEFYTTR1RmNTaEdnZDBGVUFyL2xTUTE2bXoybTIwa0sydzFBS3lOeTU5ci9JdHZCUE9UOVBVdHE1YXUyWVh2M2tvbEg5cjBtMytiK0JPc0N1dVIwZWxRMFlERTYyazBjV1BPaUd0TFlhNVdDdm14Rkp5Ui9LN1hJYVZUb2VUYXMwTjdpU2RPV3ZIQ0ZIeVNBYUNYMlJRPT0ifV19" } }, { "ID": "f0486f8af24bf2b0", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "167" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0JhdGNoaW5nLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "729" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:22 GMT" ], "X-Amzn-Requestid": [ "97c1cfd8-4ce8-56d3-ab51-adee55e2b3e2" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFJREFXVVdFVVNQVUlHQkxPNEdKRCIsIkFwcHJveGltYXRlRmlyc3RSZWNlaXZlVGltZXN0YW1wIjoiMTc3MzkzNDI4MjAyMSIsIkFwcHJveGltYXRlUmVjZWl2ZUNvdW50IjoiMSIsIlNlbnRUaW1lc3RhbXAiOiIxNzczOTM0MjgxNTYyIn0sIkJvZHkiOiJoZWxsbyB3b3JsZCIsIk1ENU9mQm9keSI6IjVlYjYzYmJiZTAxZWVlZDA5M2NiMjJiYjhmNWFjZGMzIiwiTWVzc2FnZUlkIjoiZDA1ZGY3NzktMjQ5MC00ZWExLTg3NTktYmEzMjhhNmExYzZjIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUI3KytIaHZPbWJQYTA5YUhLV3RqNjBzbGFoVDRmS2dDYS9RdEJzWjhiZXA0SkVETlVzMTFMMGkxUHdIc1VZMHVpZkpwVmdscmFEZy9PeCt0QXVINy9vU0dJVHZrYVRPUC9sY1lmRDJaSWkvaXg3NXYvZ3l3dHN1d0RTc2VDdmxOOVYvdGh2Z2o2TEIyTXQyeHdoK2VkeW0raWRVcVZyM1BiU21lUHBtN2dIcU1DLy9oMjErcEVtNDBBbE55aCtWWW1Oc2g5bGsvZVNlcXpSTVA5ZVNldTFvWURFUEloSlhUNDF0dW5DSGdIandwSWw4SEUvc1I0MUxiZklTVFdTcWxyUjN1SW1hYUdmelhUckNyeUozNVdKL0RobHJWNzlrQWFhQkVlZ2FxTXJiOEQ4TFV0aUlSTUtpMWRiK0VadnJTR01vN2E1Zk10c0hnSGJiSEI2bFpVb2V3OGhyK2duTEVqaEpHWTJob3QrQVFxZXppZDhleEI2SGV4bmp2Z0xXY3JqTWF2a1VLQVl6bWNUS1Z0dVI4Sll3PT0ifV19" } }, { "ID": "300df232bf1afff2", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "167" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0JhdGNoaW5nLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "729" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:22 GMT" ], "X-Amzn-Requestid": [ "c7169025-2fa1-5d4f-8bee-f21336ab087e" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFJREFXVVdFVVNQVUlHQkxPNEdKRCIsIkFwcHJveGltYXRlRmlyc3RSZWNlaXZlVGltZXN0YW1wIjoiMTc3MzkzNDI4MjA5MiIsIkFwcHJveGltYXRlUmVjZWl2ZUNvdW50IjoiMSIsIlNlbnRUaW1lc3RhbXAiOiIxNzczOTM0MjgxNTU5In0sIkJvZHkiOiJoZWxsbyB3b3JsZCIsIk1ENU9mQm9keSI6IjVlYjYzYmJiZTAxZWVlZDA5M2NiMjJiYjhmNWFjZGMzIiwiTWVzc2FnZUlkIjoiYjRmZjIxNWMtYjY1ZS00ZGU1LTljNjgtMjI2YmVhMDQyMzFmIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJZWFNkbjUvaHkxc0ZVMHpjSVJmckdpS2JycFZaTkdFTXNJN0wzRFZEWlRjYWZCdzd0RWkrdEVFTlNSL2lXanVqYWhKSy9DNnFXeUNOKzlPNFZvWTl1YlVOMjdVOGtqbFZFcUJrZXh5YjJidnhhdERSR3hmZXh1Y1pkYnZQcUlWS1FLcGdub096THNEL2JXSEtRbjRYZWtDNWcyYUpwcW1WbTRSUG01M3lSVlc1L2QwcjRzS0diZGJoSXZVSzN6cDNjVW1EaGNHL21Yd3ROcW9HeFJZK1lpQS81OS8zVVg0WnYzdnhWakxNS1d5S3FRVDg4WWVrM3d3K2RMc1E1elc0NHV3aEYrWWs5WlZDUGxsZE54U0IvQ3pjeUJUdHVkYjZ3TW1ZcVhpS2lTbXJWUFIvTkJlVUsrSDRqbzYwMWIxelhhcnAxZ213L2tzQThMMnQ0bVRVZkdCdlFMYy9Tb2RLRWNhZUVaWFRZNjNLQzhQWlJ3LzRLUG1Nc0gzRnFMUU5zd1VFM0F1VVczcTZ3TXExYlFXZkpBPT0ifV19" } }, { "ID": "5525e121f50111a4", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "2750" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQnZlMjc5eXo4bEhkUWJIQ0EzcUNxNHRyZk91NTZVcDZMYStLOHl1QS9YeXZIdGxhN2tLRlBzbDUwbktFYWlpbTRicndPZktQUndzNk5vd2h3cGxjTktINUdWcjdDR0U0RjFDT2ZNM0xWZ3ZEanBMZkZCUmgxL1FUTTJqSzhjaE1CbUlZNTdFMW43dEJCc3BRZ1NjZmM2Vks4cU1pUUZBb3pVQVpZUUZyVmZjM3BOOGVxVE1tcHR2cEZ2MSt0WWRldEprS1FQU2xrUXN5Mng5M2UrU2J3bkp6aVdPVnp6cHI3ZHJ2TjI0bllZTUVCMzAzVXY4SHhQUWxsYnIvcFI2Wk5MTGFRbkxPdjdkZmU4K29OdlV5K1VuWUYrZXN1a3pHNGJhaXFLNDNqUWthcnJZVjV4MzY2QlhqTjk3NGlETmN2VnU5ZCsvaTJDOTZYZlVRSm5EbTA4ZWpYaTZYVUdEdkNrNE9RS2xDNFZZQnV2RnFRdmFoaEd2UG5FbHlORlVWd1IvcWlIK0RJSGFPTlNIMmlVbGVLdmc9PSJ9LHsiSWQiOiIxIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJJaGlHa0R5YmpQZ0Jsb2pSbkVXYXZPa2xYWGVQdUoxN3dPMzY4OE93Y2lJYXQrZS9peEsrVHpPUnozT0VuV3BSYk04MGRaV2lJWTgyMFV0RkFqcmpJQjZ3ekIwWFNNUHZjWFBoZGkvNkd0ZkYzVHVrU1pHMU50bUs1VVdQNzdYT0twK0RNMTZCT3B1NUczc3dwOEZyWklORFZGYXBYdFV0ZDNZRTJOclVoTXJ2ZUxuQlBPQm0rQ29YN0VRWTVhQUhHSWxZRTYvd044eG84aWtydE9KeTdkVDROVmZReFhKdU1nbjYwYmNWQmJrdkhkUFFWSzZwZ2FYOHB5MFRPenNPU21Qd3RlUVd3bmx5Vm9WNlMwcGx0UlFIVXowWm1hNU5mU2h4bk80VDQ5L2lYRnJyYWZOaXNXUXdvMENkYmdoaVRjODVzZysvUitoeUUxU0lqSmVncUNnR1RFOENjdHNKUkt4cW82U1g2Rm02WFRzSVQ4Q0x6d3pTZmw4YTU2amlLcmNtOVk2RVEybWVKVWxjTitNcE5nPT0ifSx7IklkIjoiMiIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCbHA4WEpsNFdFYkN6QjNyaHA2czhxRFRyU0g1REw5VEl0YWxxYXNuU3gzQlhCTEV0OWhJOURWUkpCd2lKVTNwMTV4MjIyNVhYT1AzQkFJV2xmSzNtNDNCVjNrZ0luTUpHQkJ5c1ZuMVJQQzRGQVRvSHpFT3IvZWVIYTZTb1lrcTl4eFpYNDNpTjhEbk82eFdIeXVVK0h6V1FsWlVlSjM5WkQvWTlDN3QvZEZiUzdEcTFVMndjcVNYTmFocTNqa1VWUTRiam9pYzF3MVIrS1Z6OTFJYzJxYlYwdHJKc2s3REx0aHlYUGxCbXRhMktTdHVCWGVuVzdvRVF1Y1NIdTV5Z2FmZSt0RlZoUVJVcTB3NXJ5amVpTjA5U3lEN2ZLcnZ4ZzBwSTcrWnJLSUNiY3JxNHZESmdaR3VRL2w2cGZ2UFRvbFg1ckxDd2h4SVU1Vk5NZlorbHdYSVd6d0RXeTlyeEVSMUZ4RGF4cnhibWNPakNDOGZVKzdYTjNVbEVvMnFtRkFHbjNlQ1g0dWlFU1JRdEF0RitXQT09In0seyJJZCI6IjMiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQmZ2VVE0MCtNbVFvRHlObVFSUlYrS1lDY29aaFhMZmFuMjVvRjc5VmFTV0hFNDZmYU5CMm5FcUU3YUlVN3FTamRvRjg3VklLcFFqVVlpOXlkUW9tQ3NnQmVyeGcrVUpOWk42c05SVnEvUUd3bHNNNWZ3a2JBd1hvb1lRZlBPZ3Q3YXJZbDA5OWpFUUtUb0hPY01LaWoxTXQzQjlaeEt5Rk1kZGNNMHNEeEZ5QWpla09SSzZVMWwxQVpTaHhTU25QVnVCMEFYcTdRRCs3aUpDaEswYUhKOVQrU0RrbytXRFZidVpkUHR4K1dIM1ZEV0RhajJOWG1zY3BjVGxiTkJyRXJ1a3QxLzNNU1drUjZCWVFFdk11bTBBYW5KRHF0akR6TjV6bjB2d1Y4ekVHblJkWnlmcTNpaDVDZ3Blb2xkbFlsSk0vYlhXa244MUVFclI3OHh2ZjVjMXk5eEVzSHZsbTV5YThKR1BQZEZiNzRpWXdWTmtGMEZ2TW94SHVvSWJnNGwzbGhPcTZsTjV2eFF4WTVlVWhTWUE9PSJ9LHsiSWQiOiI0IiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJOc3k4RURVdWF3WVhpRncrUDhtdFJCZTg3TzNKdGQyZk1tdVZJL2I5NVg2WDYySGw4RmRTK1VQK0ZtbUFET0xxNGxKdG4zTWVCcEpVRzBHVW5XaUg5NHhTc0ZTa1Bmbnk3aFNER0V0WHJFYW53d0R3NW5kWVE3eHBzMUw4QTJmTk1CMlFsVXppUFVZVzZRNUVQMUwxME5WcDhYQjY2S0srcEtWNkFzQWdyMUN0ejBCaUh4a3UxaVViQisxNWZWOHZybThYZHlCeWdjQldlNWNISkRINmZjcytnT0N6R3dMaU40STVhSTNZbk52S3VYN09RbGVZa3YwejRNV21ZMlAzcEFYTTR1RmNTaEdnZDBGVUFyL2xTUTE2bXoybTIwa0sydzFBS3lOeTU5ci9JdHZCUE9UOVBVdHE1YXUyWVh2M2tvbEg5cjBtMytiK0JPc0N1dVIwZWxRMFlERTYyazBjV1BPaUd0TFlhNVdDdm14Rkp5Ui9LN1hJYVZUb2VUYXMwTjdpU2RPV3ZIQ0ZIeVNBYUNYMlJRPT0ifSx7IklkIjoiNSIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCNysrSGh2T21iUGEwOWFIS1d0ajYwc2xhaFQ0ZktnQ2EvUXRCc1o4YmVwNEpFRE5VczExTDBpMVB3SHNVWTB1aWZKcFZnbHJhRGcvT3grdEF1SDcvb1NHSVR2a2FUT1AvbGNZZkQyWklpL2l4NzV2L2d5d3RzdXdEU3NlQ3ZsTjlWL3RodmdqNkxCMk10Mnh3aCtlZHltK2lkVXFWcjNQYlNtZVBwbTdnSHFNQy8vaDIxK3BFbTQwQWxOeWgrVlltTnNoOWxrL2VTZXF6Uk1QOWVTZXUxb1lERVBJaEpYVDQxdHVuQ0hnSGp3cElsOEhFL3NSNDFMYmZJU1RXU3FsclIzdUltYWFHZnpYVHJDcnlKMzVXSi9EaGxyVjc5a0FhYUJFZWdhcU1yYjhEOExVdGlJUk1LaTFkYitFWnZyU0dNbzdhNWZNdHNIZ0hiYkhCNmxaVW9ldzhocitnbkxFamhKR1kyaG90K0FRcWV6aWQ4ZXhCNkhleG5qdmdMV2Nyak1hdmtVS0FZem1jVEtWdHVSOEpZdz09In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0JhdGNoaW5nLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "82" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:22 GMT" ], "X-Amzn-Requestid": [ "a4d5c2d8-d9d9-5c53-88b6-a0eec0d3e962" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjMifSx7IklkIjoiNCJ9LHsiSWQiOiIxIn0seyJJZCI6IjUifSx7IklkIjoiMCJ9LHsiSWQiOiIyIn1dfQ==" } }, { "ID": "62a41ea4bb9ccbee", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "167" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0JhdGNoaW5nLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "729" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:22 GMT" ], "X-Amzn-Requestid": [ "037ad729-418b-5c8c-a93a-b51f588199bd" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFJREFXVVdFVVNQVUlHQkxPNEdKRCIsIkFwcHJveGltYXRlRmlyc3RSZWNlaXZlVGltZXN0YW1wIjoiMTc3MzkzNDI4MjIzNCIsIkFwcHJveGltYXRlUmVjZWl2ZUNvdW50IjoiMSIsIlNlbnRUaW1lc3RhbXAiOiIxNzczOTM0MjgxNDgyIn0sIkJvZHkiOiJoZWxsbyB3b3JsZCIsIk1ENU9mQm9keSI6IjVlYjYzYmJiZTAxZWVlZDA5M2NiMjJiYjhmNWFjZGMzIiwiTWVzc2FnZUlkIjoiYzQ3NTJiZjYtN2MyNi00ZThiLTlhMzYtMWZkY2I2NzBhY2YxIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJoclVjK0FTbFozNFVhMjJTOTBVbS94UkZnOEUxMzlpK2N0V0luNTkwYVExMGFHcU5VTmpLTE8yTUNlOEtxZFdZSFlTQ0xrQTB6V0pRQ283ZEFvdGxUZjRZOVVpYllTbGI2cU5CWnZMb1JvSFY0QnJVaWo4d0ZpeDFSRUtjNUpvVmtMMGprL2pDaXd3R3VvQmtMSUUxbExyYTBlcTVud0VXOGNhV21KVEx3dmY1dUlheEVxcjRMdUw1OGNMLytDUWJOdTYrcUJJMVNDcnZVM25naTFQWDRmNGpMb3prS1hST2RFUTJicDV3bWZCTkZJb2FnaU8rbWNuYWh6MnNGR2JZbjI4Q2RPY1pJQ2YwVlIrMWJpSDFHVXYwUDNnZWdjQytxMy9ZaUR2eUZXbkdtMDVyUy9NNCtPN2ZMU29WSXQzZk0yY0dPN1JuVkttbTV2SExic0FmYmRwS2xXalYwZ3l1bVRuQzhTcm9QaHVUa3k3Q1krY0oyMlBVMUgvSjNobzM1UU5kU0tvVHIrVTBzb0VyTUdDa0lnPT0ifV19" } }, { "ID": "c217647f2269e197", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "167" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0JhdGNoaW5nLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "729" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:22 GMT" ], "X-Amzn-Requestid": [ "bd1e8f6a-65f1-55ef-a56e-ed5c7cfbc0de" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFJREFXVVdFVVNQVUlHQkxPNEdKRCIsIkFwcHJveGltYXRlRmlyc3RSZWNlaXZlVGltZXN0YW1wIjoiMTc3MzkzNDI4MjMwMiIsIkFwcHJveGltYXRlUmVjZWl2ZUNvdW50IjoiMSIsIlNlbnRUaW1lc3RhbXAiOiIxNzczOTM0MjgxNTYxIn0sIkJvZHkiOiJoZWxsbyB3b3JsZCIsIk1ENU9mQm9keSI6IjVlYjYzYmJiZTAxZWVlZDA5M2NiMjJiYjhmNWFjZGMzIiwiTWVzc2FnZUlkIjoiOGRiNDJjZjMtZDg4OC00Y2ZkLWJhNzMtNmQ1NjM0ODdmNmM5IiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJWK1dFWEZ3Snc2T1lMemhkVVJmZ1dNSVlhbjdQREhSK243S3c3NE03Q2g3c1FUSWluU3FHbE9jNlhIRkI5M3Jjc2UzMTRBOFBya1VxdHEvWERkZndhVitRQVIvVURFT0pwTk5FeXRMV29idGdmdVBUcTlrQXpRNk4vd2xXVFM1cThhNWx5Q0pHRU5GVXhPMzVSR0cwZmE5dCs2SXlXdUljUGxMcWhSZ0dkL3BEM0ZuYVR0bGp4OC9CN29UQkhHYmlpS0lVY3puK2FPNHV1VCt4YldSM0pSUkJxZlBZNFNqaDArQmFnK1kwRGpJVGEvT012dk84VG55VTdpb2hEYWV0cXBvZ3FXVXVoMW0rcnJ1U1JzVDdCdU9ZeG9sZ0dvRm1nOVhrTnltT1FGbGlkVXluTVNVNitmNzg5eCtvNVd4MURyOURaeVF0djJBN1dWMTg0cEtjdlFha2NXbWQ2NEM3OVJuN3p4OWsxL2xLV29XelM2VXoyRWs0N0xZS1hONGVhYUgxcVdQRXB2V0tpOEFkVTFsM3pnPT0ifV19" } }, { "ID": "a543eea74d304f3c", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "167" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0JhdGNoaW5nLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "729" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:22 GMT" ], "X-Amzn-Requestid": [ "cae8f7a6-a866-52e7-bd9e-9590b16ce7d6" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFJREFXVVdFVVNQVUlHQkxPNEdKRCIsIkFwcHJveGltYXRlRmlyc3RSZWNlaXZlVGltZXN0YW1wIjoiMTc3MzkzNDI4MjM3OCIsIkFwcHJveGltYXRlUmVjZWl2ZUNvdW50IjoiMSIsIlNlbnRUaW1lc3RhbXAiOiIxNzczOTM0MjgxNTU5In0sIkJvZHkiOiJoZWxsbyB3b3JsZCIsIk1ENU9mQm9keSI6IjVlYjYzYmJiZTAxZWVlZDA5M2NiMjJiYjhmNWFjZGMzIiwiTWVzc2FnZUlkIjoiY2E0NzVkZDAtOTIzOS00YjJjLTljMzctMjRjMDZlNDc1YjgwIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJocDRTZFpETEZnTUxHZHFaU1g2bHFxYTZiVytwanpTbkN3anlRSFI2VGhKVXB5N1RURlhvazJnZFZGMDJPU3pEODNTRFdaUEV0bEFtREVIUE5rL2E0L3V5MnYvTmtURHJpdlNjTGtRSzdiSVhRQjhpTk93YTRiK21vYnpKU0Z1R1JYTXdXZ1FIY1Nla3IzcnRZc3h4eWRUdzNNMGJjMWZSWHA4OFJkbVFTbEpRNURvMUE2RnJtSkRDYjVsQ3h6bFZ6eUl1TTNJTTViZG5BQm1uenI5c3htTy95cWZmRGVsUVIrMVdhb25sMnphYm5KcHJOOUhRcmZ2eHFiZ3RuUEVRTm1wVlRVU2JJT3BQYmUvMjRnZnMyZW5ZM05ScUxBZVA1QWsxbVhmTGFjejc1dWtPWmphalQ0a3F6QUlKWjFqN2w1YW5UanllSEk3SG1VNzdvK3VqOHBSYjFVcjVvUDNQb1ovRXptUFFjdHZpalJJTU9wdWVsdnMvZ28zRFIvTU5ZVVZYQWlDVythUTNpb2ZhMGJteG1BPT0ifV19" } }, { "ID": "87632449a645ce9d", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "167" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0JhdGNoaW5nLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "729" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:22 GMT" ], "X-Amzn-Requestid": [ "ffc5cce5-c8bc-5488-b046-aed3d1b6e338" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFJREFXVVdFVVNQVUlHQkxPNEdKRCIsIkFwcHJveGltYXRlRmlyc3RSZWNlaXZlVGltZXN0YW1wIjoiMTc3MzkzNDI4MjQ3NyIsIkFwcHJveGltYXRlUmVjZWl2ZUNvdW50IjoiMSIsIlNlbnRUaW1lc3RhbXAiOiIxNzczOTM0MjgxNDg5In0sIkJvZHkiOiJoZWxsbyB3b3JsZCIsIk1ENU9mQm9keSI6IjVlYjYzYmJiZTAxZWVlZDA5M2NiMjJiYjhmNWFjZGMzIiwiTWVzc2FnZUlkIjoiZjA2ZDA3YzEtMGQzNS00MTQ0LWJiM2ItNTZmNWE4ODZjYzMyIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJtVmRvOURweStsRGdib1Q3dnd4VzA4aWpJUUFCTjBvSGgzTkI1NWM2Z2hYaFIwd2w0WU1ONi95ZWVaR1FNVE5xTU80MWxLKzhBWVJ2V0tTVnlEcGFkaCtxYXhlL1ArdWlGL1E0UTRWYVdmem16TUh3aFduSnBCb2JGZHlaVnU2Ni9jdDUyQ3VtN1BSVjE1cjhrTGxNeHl5cDRvSTBSWkxybSttOVBwWkorR1RIYXNySEdKTlBKSWVMK2h1dklOVERXZVZ6NnZSZW5kMEZaMy9KTFYvZzdMTDBXRVNiSTVadnVRek5XeCtsV0FiSUZPREJGOWc0NElyek1zclpUY21vSmd6SHg1MTlLbTg4YzZTeHlDOUxYbFJtUUhtTTNqZVNmdUVXek1UNDJKeWRPYmJCNWFySDNZT3VVTjVWL05NenNwS2RYUEU5bi9sYW9PN09tbXVaVTJOK0RveXd4VG9oZVl4bStIV21PZDlyOXk4WitFbnJUWmpTbktDS0xjL1FuRTlYSWFDN2tsbGFLZE1XaVAvekFRPT0ifV19" } }, { "ID": "83b8633ef0c2e1b2", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "167" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0JhdGNoaW5nLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "729" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:22 GMT" ], "X-Amzn-Requestid": [ "8db29bfb-0ceb-5a24-91a7-f9cd15e15d94" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFJREFXVVdFVVNQVUlHQkxPNEdKRCIsIkFwcHJveGltYXRlRmlyc3RSZWNlaXZlVGltZXN0YW1wIjoiMTc3MzkzNDI4MjU1MCIsIkFwcHJveGltYXRlUmVjZWl2ZUNvdW50IjoiMSIsIlNlbnRUaW1lc3RhbXAiOiIxNzczOTM0MjgxNTYzIn0sIkJvZHkiOiJoZWxsbyB3b3JsZCIsIk1ENU9mQm9keSI6IjVlYjYzYmJiZTAxZWVlZDA5M2NiMjJiYjhmNWFjZGMzIiwiTWVzc2FnZUlkIjoiMmZkMDA0YWEtOGU2Ny00Y2RkLThiZjMtODUyMjIyYmUxYTlmIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJxZElaL2ZJa2JjalVlb1laZlRGNXZnVmJrdGdTRFMwdDZWa1hxWGtSTDgrblBWKzcwOUZLWlhsT2dFNVJuYk0wSFlKbTkrNm44R1I3OGxjV3J0K05hZHBpWGFEbm1sSDJPTFRJRmJLdGM4b1RjRkN1ZmJwWVlwYnIzell4RFNaM1VqTEFzRUFBZ2NIaUF6V3dVbC9rMTRrWnp3VmFFbjJ0c2NvM1FhYitraURQcmovbkI4MXNvT0ZpYnhURHJ6dndEU2IzbmR2ODM3UDdEUUZjRHZlNHR2YXBUZzBFeUtTWHA4QjRRRFBYRVBlMnVoS3F4SGpxaTZDQitVK0JWRXc0dEhoK0RMQ01jNjg4dzl6Y2ZHNVVUZTVXaG54YWJ2eGYwR0RFYlZMQ2VJeXdyTElyK1ZMS0hWODZuQXRjODN3Q2U2TUNUWHZHVE1Zb0Znb0ZtNEt4bkVXVzJ1SHBqTHR4b1RnYkNRN1ZIa054RC9sRkZ3TlVQaHZ1NE5mK0RWNnpCRnI4bFdyNi96RE1jVzRLVVhEQU1BPT0ifV19" } }, { "ID": "cde49f5b64ce788d", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "2750" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQllYU2RuNS9oeTFzRlUwemNJUmZyR2lLYnJwVlpOR0VNc0k3TDNEVkRaVGNhZkJ3N3RFaSt0RUVOU1IvaVdqdWphaEpLL0M2cVd5Q04rOU80Vm9ZOXViVU4yN1U4a2psVkVxQmtleHliMmJ2eGF0RFJHeGZleHVjWmRidlBxSVZLUUtwZ25vT3pMc0QvYldIS1FuNFhla0M1ZzJhSnBxbVZtNFJQbTUzeVJWVzUvZDByNHNLR2JkYmhJdlVLM3pwM2NVbURoY0cvbVh3dE5xb0d4UlkrWWlBLzU5LzNVWDRadjN2eFZqTE1LV3lLcVFUODhZZWszd3crZExzUTV6VzQ0dXdoRitZazlaVkNQbGxkTnhTQi9DemN5QlR0dWRiNndNbVlxWGlLaVNtclZQUi9OQmVVSytINGpvNjAxYjF6WGFycDFnbXcva3NBOEwydDRtVFVmR0J2UUxjL1NvZEtFY2FlRVpYVFk2M0tDOFBaUncvNEtQbU1zSDNGcUxRTnN3VUUzQXVVVzNxNndNcTFiUVdmSkE9PSJ9LHsiSWQiOiIxIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJoclVjK0FTbFozNFVhMjJTOTBVbS94UkZnOEUxMzlpK2N0V0luNTkwYVExMGFHcU5VTmpLTE8yTUNlOEtxZFdZSFlTQ0xrQTB6V0pRQ283ZEFvdGxUZjRZOVVpYllTbGI2cU5CWnZMb1JvSFY0QnJVaWo4d0ZpeDFSRUtjNUpvVmtMMGprL2pDaXd3R3VvQmtMSUUxbExyYTBlcTVud0VXOGNhV21KVEx3dmY1dUlheEVxcjRMdUw1OGNMLytDUWJOdTYrcUJJMVNDcnZVM25naTFQWDRmNGpMb3prS1hST2RFUTJicDV3bWZCTkZJb2FnaU8rbWNuYWh6MnNGR2JZbjI4Q2RPY1pJQ2YwVlIrMWJpSDFHVXYwUDNnZWdjQytxMy9ZaUR2eUZXbkdtMDVyUy9NNCtPN2ZMU29WSXQzZk0yY0dPN1JuVkttbTV2SExic0FmYmRwS2xXalYwZ3l1bVRuQzhTcm9QaHVUa3k3Q1krY0oyMlBVMUgvSjNobzM1UU5kU0tvVHIrVTBzb0VyTUdDa0lnPT0ifSx7IklkIjoiMiIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCVitXRVhGd0p3Nk9ZTHpoZFVSZmdXTUlZYW43UERIUituN0t3NzRNN0NoN3NRVElpblNxR2xPYzZYSEZCOTNyY3NlMzE0QThQcmtVcXRxL1hEZGZ3YVYrUUFSL1VERU9KcE5ORXl0TFdvYnRnZnVQVHE5a0F6UTZOL3dsV1RTNXE4YTVseUNKR0VORlV4TzM1UkdHMGZhOXQrNkl5V3VJY1BsTHFoUmdHZC9wRDNGbmFUdGxqeDgvQjdvVEJIR2JpaUtJVWN6bithTzR1dVQreGJXUjNKUlJCcWZQWTRTamgwK0JhZytZMERqSVRhL09NdnZPOFRueVU3aW9oRGFldHFwb2dxV1V1aDFtK3JydVNSc1Q3QnVPWXhvbGdHb0ZtZzlYa055bU9RRmxpZFV5bk1TVTYrZjc4OXgrbzVXeDFEcjlEWnlRdHYyQTdXVjE4NHBLY3ZRYWtjV21kNjRDNzlSbjd6eDlrMS9sS1dvV3pTNlV6MkVrNDdMWUtYTjRlYWFIMXFXUEVwdldLaThBZFUxbDN6Zz09In0seyJJZCI6IjMiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQmhwNFNkWkRMRmdNTEdkcVpTWDZscXFhNmJXK3BqelNuQ3dqeVFIUjZUaEpVcHk3VFRGWG9rMmdkVkYwMk9TekQ4M1NEV1pQRXRsQW1ERUhQTmsvYTQvdXkydi9Oa1REcml2U2NMa1FLN2JJWFFCOGlOT3dhNGIrbW9iekpTRnVHUlhNd1dnUUhjU2VrcjNydFlzeHh5ZFR3M00wYmMxZlJYcDg4UmRtUVNsSlE1RG8xQTZGcm1KRENiNWxDeHpsVnp5SXVNM0lNNWJkbkFCbW56cjlzeG1PL3lxZmZEZWxRUisxV2FvbmwyemFibkpwck45SFFyZnZ4cWJndG5QRVFObXBWVFVTYklPcFBiZS8yNGdmczJlblkzTlJxTEFlUDVBazFtWGZMYWN6NzV1a09aamFqVDRrcXpBSUpaMWo3bDVhblRqeWVISTdIbVU3N28rdWo4cFJiMVVyNW9QM1BvWi9Fem1QUWN0dmlqUklNT3B1ZWx2cy9nbzNEUi9NTllVVlhBaUNXK2FRM2lvZmEwYm14bUE9PSJ9LHsiSWQiOiI0IiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJtVmRvOURweStsRGdib1Q3dnd4VzA4aWpJUUFCTjBvSGgzTkI1NWM2Z2hYaFIwd2w0WU1ONi95ZWVaR1FNVE5xTU80MWxLKzhBWVJ2V0tTVnlEcGFkaCtxYXhlL1ArdWlGL1E0UTRWYVdmem16TUh3aFduSnBCb2JGZHlaVnU2Ni9jdDUyQ3VtN1BSVjE1cjhrTGxNeHl5cDRvSTBSWkxybSttOVBwWkorR1RIYXNySEdKTlBKSWVMK2h1dklOVERXZVZ6NnZSZW5kMEZaMy9KTFYvZzdMTDBXRVNiSTVadnVRek5XeCtsV0FiSUZPREJGOWc0NElyek1zclpUY21vSmd6SHg1MTlLbTg4YzZTeHlDOUxYbFJtUUhtTTNqZVNmdUVXek1UNDJKeWRPYmJCNWFySDNZT3VVTjVWL05NenNwS2RYUEU5bi9sYW9PN09tbXVaVTJOK0RveXd4VG9oZVl4bStIV21PZDlyOXk4WitFbnJUWmpTbktDS0xjL1FuRTlYSWFDN2tsbGFLZE1XaVAvekFRPT0ifSx7IklkIjoiNSIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCcWRJWi9mSWtiY2pVZW9ZWmZURjV2Z1Zia3RnU0RTMHQ2VmtYcVhrUkw4K25QVis3MDlGS1pYbE9nRTVSbmJNMEhZSm05KzZuOEdSNzhsY1dydCtOYWRwaVhhRG5tbEgyT0xUSUZiS3RjOG9UY0ZDdWZicFlZcGJyM3pZeERTWjNVakxBc0VBQWdjSGlBeld3VWwvazE0a1p6d1ZhRW4ydHNjbzNRYWIra2lEUHJqL25CODFzb09GaWJ4VERyenZ3RFNiM25kdjgzN1A3RFFGY0R2ZTR0dmFwVGcwRXlLU1hwOEI0UURQWEVQZTJ1aEtxeEhqcWk2Q0IrVStCVkV3NHRIaCtETENNYzY4OHc5emNmRzVVVGU1V2hueGFidnhmMEdERWJWTENlSXl3ckxJcitWTEtIVjg2bkF0Yzgzd0NlNk1DVFh2R1RNWW9GZ29GbTRLeG5FV1cydUhwakx0eG9UZ2JDUTdWSGtOeEQvbEZGd05VUGh2dTROZitEVjZ6QkZyOGxXcjYvekRNY1c0S1VYREFNQT09In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0JhdGNoaW5nLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "82" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:22 GMT" ], "X-Amzn-Requestid": [ "ea29c004-113a-573e-9df1-a2320830a08e" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifSx7IklkIjoiMiJ9LHsiSWQiOiIzIn0seyJJZCI6IjUifSx7IklkIjoiMSJ9LHsiSWQiOiI0In1dfQ==" } }, { "ID": "9c4c543b355dad72", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "86" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0JhdGNoaW5nLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:22 GMT" ], "X-Amzn-Requestid": [ "f6b88aa9-bb1f-543b-b9c9-e89fa215538b" ] }, "Body": "" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSQSTopic/TestCancelSendReceive.replay ================================================ { "Initial": "AQAAAA7hTg2/CjT/YAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "07b455aeb804f67d", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "47" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTUVNUb3BpY0NhbmNlbFNlbmRSZWNlaXZlLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "95" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:11 GMT" ], "X-Amzn-Requestid": [ "e278d62c-cd14-52da-bd17-b41ad5ebb210" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0NhbmNlbFNlbmRSZWNlaXZlLXRvcC0xIn0=" } }, { "ID": "306eb62d3d1c02c5", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "125" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0NhbmNlbFNlbmRSZWNlaXZlLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "96" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:11 GMT" ], "X-Amzn-Requestid": [ "51a4dca1-dee9-5b6d-9513-be97c6168ba7" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTUVNUb3BpY0NhbmNlbFNlbmRSZWNlaXZlLXRvcC0xIn19" } }, { "ID": "400dd39d72ba4bf7", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "476" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNRU1RvcGljQ2FuY2VsU2VuZFJlY2VpdmUtdG9wLTFcIlxuXHRcdH1cblx0XHRdXG5cdFx0fSJ9LCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0NhbmNlbFNlbmRSZWNlaXZlLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:11 GMT" ], "X-Amzn-Requestid": [ "8bb201ab-821a-50fc-960a-639d9ae59036" ] }, "Body": "" } }, { "ID": "7bb560886cc0cf97", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "95" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0NhbmNlbFNlbmRSZWNlaXZlLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:11 GMT" ], "X-Amzn-Requestid": [ "3a32002f-442c-5f6f-9c42-62195cd3ffa5" ] }, "Body": "" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSQSTopic/TestDoubleAck.replay ================================================ { "Initial": "AQAAAA7hTg3EAPpD7QAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "8bcab989f3349af6", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "39" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTUVNUb3BpY0RvdWJsZUFjay10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "87" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:16 GMT" ], "X-Amzn-Requestid": [ "742ecf0c-b71e-5e03-a774-ad3aae1a3d8d" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0RvdWJsZUFjay10b3AtMSJ9" } }, { "ID": "d821be3ad4362c8a", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "117" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0RvdWJsZUFjay10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "88" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:16 GMT" ], "X-Amzn-Requestid": [ "73c6d5eb-8164-5c7b-8f14-b7dd9860eff5" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTUVNUb3BpY0RvdWJsZUFjay10b3AtMSJ9fQ==" } }, { "ID": "79b6967263b08722", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "460" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNRU1RvcGljRG91YmxlQWNrLXRvcC0xXCJcblx0XHR9XG5cdFx0XVxuXHRcdH0ifSwiUXVldWVVcmwiOiJodHRwczovL3Nxcy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS80NTY3NTI2NjU1NzYvU1FTVG9waWNEb3VibGVBY2stdG9wLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:16 GMT" ], "X-Amzn-Requestid": [ "66694f97-8c39-522e-8acf-2da1953d11a0" ] }, "Body": "" } }, { "ID": "18ba52381edc1de5", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "128" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SendMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJNZXNzYWdlQm9keSI6IjAifV0sIlF1ZXVlVXJsIjoiaHR0cHM6Ly9zcXMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vNDU2NzUyNjY1NTc2L1NRU1RvcGljRG91YmxlQWNrLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "132" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:16 GMT" ], "X-Amzn-Requestid": [ "d40ccdf4-a23d-53e9-bd5c-afc2bb392067" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAiLCJNRDVPZk1lc3NhZ2VCb2R5IjoiY2ZjZDIwODQ5NWQ1NjVlZjY2ZTdkZmY5Zjk4NzY0ZGEiLCJNZXNzYWdlSWQiOiJhZmExMmIxNy1lZTVlLTQ0YWMtOTJiNy05NzFiYjZkODIxY2UifV19" } }, { "ID": "25f39d432643c5e9", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "128" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SendMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJNZXNzYWdlQm9keSI6IjEifV0sIlF1ZXVlVXJsIjoiaHR0cHM6Ly9zcXMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vNDU2NzUyNjY1NTc2L1NRU1RvcGljRG91YmxlQWNrLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "132" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:16 GMT" ], "X-Amzn-Requestid": [ "e08b286f-1520-5e29-9ac0-4a590c24bda7" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAiLCJNRDVPZk1lc3NhZ2VCb2R5IjoiYzRjYTQyMzhhMGI5MjM4MjBkY2M1MDlhNmY3NTg0OWIiLCJNZXNzYWdlSWQiOiJjNjhlMTQxZC05MGZjLTQ3YzEtOTY2Ni03ZTBjZTUyZWMzZjYifV19" } }, { "ID": "7440a2fd83a76fc5", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "128" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SendMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJNZXNzYWdlQm9keSI6IjIifV0sIlF1ZXVlVXJsIjoiaHR0cHM6Ly9zcXMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vNDU2NzUyNjY1NTc2L1NRU1RvcGljRG91YmxlQWNrLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "132" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:16 GMT" ], "X-Amzn-Requestid": [ "2e9ea19e-4b85-5b02-bde2-c3a85281488c" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAiLCJNRDVPZk1lc3NhZ2VCb2R5IjoiYzgxZTcyOGQ5ZDRjMmY2MzZmMDY3Zjg5Y2MxNDg2MmMiLCJNZXNzYWdlSWQiOiIxODdkNjEwNy04YmUwLTQ2ZWMtYjM1YS1hMmVjNTJjZjc1NWMifV19" } }, { "ID": "e8ce498efa8cb48f", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "168" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MywiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0RvdWJsZUFjay10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1424" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:16 GMT" ], "X-Amzn-Requestid": [ "9d43ae18-251b-5a54-b8c7-cc2e3c1fb9da" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFJREFXVVdFVVNQVUlHQkxPNEdKRCIsIkFwcHJveGltYXRlRmlyc3RSZWNlaXZlVGltZXN0YW1wIjoiMTc3MzkzNDI3NjkwNyIsIkFwcHJveGltYXRlUmVjZWl2ZUNvdW50IjoiMSIsIlNlbnRUaW1lc3RhbXAiOiIxNzczOTM0Mjc2Njg4In0sIkJvZHkiOiIwIiwiTUQ1T2ZCb2R5IjoiY2ZjZDIwODQ5NWQ1NjVlZjY2ZTdkZmY5Zjk4NzY0ZGEiLCJNZXNzYWdlSWQiOiJhZmExMmIxNy1lZTVlLTQ0YWMtOTJiNy05NzFiYjZkODIxY2UiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQmhQbzNCajB5bUVBaUFUdzVPOThoNDBtVWh5TmNZMFBiS2sxN2ZnS215eG9BRCtCYkY0ZmlQOU84K2JuUStqVWVzSWxTeFJaajlhVVJ5QWJDM2FJbktNWkMrUnhib2Z0cFlHeEZOM05TTERlaU1zMW5MS1hHVmlXRW5yK2FxSjU5NGRmeW05cE1KV1l6cE9vY3hyZ2tiZ2lGUmFqM01lWmVVckJXc0RITGdOTVVLUWJoYmprUVdPbUY0NmovNFNJRTA1TjU4QmJpMDYvb1FUbkI5a0hIY2VpZ3NpMFlWVkFrUFNqai9ld1ZlOFQyczUxTEhhZkNEZnVjVGc1My9PS2pDa2hBRzJMVXNQQzZKbjhubHlqQllqN3E4QWVmSTFEaHBGNW5VUzhRNE5rcUJhVnV1anVubGJKTjNFcU9YY25mTnRtSzJwc0F0NTB4L05qTmxzTURuMklFQUVORUJiQm5nTldZN0RnZlNYWTIrK0tBRXJCNnF1TUVNYWZTNzdTdG5Cb0J2ZlQ5ZDI4ZnpiNHptZjJ3MUE9PSJ9LHsiQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFJREFXVVdFVVNQVUlHQkxPNEdKRCIsIkFwcHJveGltYXRlRmlyc3RSZWNlaXZlVGltZXN0YW1wIjoiMTc3MzkzNDI3NjkwNyIsIkFwcHJveGltYXRlUmVjZWl2ZUNvdW50IjoiMSIsIlNlbnRUaW1lc3RhbXAiOiIxNzczOTM0Mjc2ODM4In0sIkJvZHkiOiIyIiwiTUQ1T2ZCb2R5IjoiYzgxZTcyOGQ5ZDRjMmY2MzZmMDY3Zjg5Y2MxNDg2MmMiLCJNZXNzYWdlSWQiOiIxODdkNjEwNy04YmUwLTQ2ZWMtYjM1YS1hMmVjNTJjZjc1NWMiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQjRwdExlVE1XNkc1a3FDM0xmMmFlbUJjTlRWQVBXcWVSQ0Q3c3RFWFcxSU1VSkhwYlY3QVdmWHBXOWVqQUI2a21pWmZiSHIyRkZsbHRhL3ptRldzQ0NsMWJraGE4UWsxNmE5SWdQbGF1NmZnZEZ3TldodnRSdGs2SGxhZ2RLcWNVWjRuSWkyVHoyUk9MdHFjN01kTGhqdUgzaEY4c2oxNDQrVkFGeTVzSVpTNzZzZjE0L1VuYWRVTklqQ3V0TG9oNUVaVTV6a2xkVEN6SFVvcytueE1ZZjVrbkVlNVRYOFcrZVl4ZmMrRjUyUU9VdFJOZE9PUXBBT25SNE5NL0dFSk1JYXY1aHUzbjl6cCsrVVc1NjkvVDdIUTJ5S2hDQlVoazdWMG9kOElzSlVnVUVDclFGRDhWdmJBMVN5OUNEaEtjUC9uZkVpZFl1d3A4ZTNLQS9Hc1pJTXlUZm5RZXZ5R0hnSERpRXdkSmlmajBSdzZvemQxVFZkbkprSzBjQUtPNFg0N1JnQjJTdm5aVWg5UkVLZFgxblE9PSJ9XX0=" } }, { "ID": "37fafd6845fea120", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "168" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MywiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0RvdWJsZUFjay10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "719" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:16 GMT" ], "X-Amzn-Requestid": [ "e97870a3-afc4-532b-bd64-1295b6c0e0a5" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFJREFXVVdFVVNQVUlHQkxPNEdKRCIsIkFwcHJveGltYXRlRmlyc3RSZWNlaXZlVGltZXN0YW1wIjoiMTc3MzkzNDI3Njk3MyIsIkFwcHJveGltYXRlUmVjZWl2ZUNvdW50IjoiMSIsIlNlbnRUaW1lc3RhbXAiOiIxNzczOTM0Mjc2NzY3In0sIkJvZHkiOiIxIiwiTUQ1T2ZCb2R5IjoiYzRjYTQyMzhhMGI5MjM4MjBkY2M1MDlhNmY3NTg0OWIiLCJNZXNzYWdlSWQiOiJjNjhlMTQxZC05MGZjLTQ3YzEtOTY2Ni03ZTBjZTUyZWMzZjYiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQlpyaHU1NzJkdDRCWmpKcnVvTE44ckV5dk9BZnlLNCtMZ3d5MnpXNTV2dElta21SRWhFN0Rjb3NxaDJmVGtsemNOOHphSkJUWHVkMXZIdGlMWGVvb2cxTHd4S2JZRVgzVWNERXdrTldUWjIxVlRibGpZWDhxWHVnWmxNVjJ3V3lZR0R3eTdmYjhSN3B5VWFkayt0blFpU0xVVVNWQjhtUlNoa3RvT0V3QzFKRnJxNHpCU2NHeDFmWC9KYXlnRzVNYnIxOGU5aStLaEo2cDdWQ0V2ZndBbmhFQkpnWnpTWHhBbHF3NmVjcGdNUFJjbkx4VUhQU3ZYQTlvaXF5WEgweVhLampVcVRmRzIxM2NxbkNXMjBEajRXM3ptUEp6ZVVtaEM5cTF4MjluNnd3a3JFMXVaYVlzaDJYM0lWV09waDY3SGp0YmZWdGN2dldDNkdkNzlsRE1iSExMeG5hZHAwN1JPY09TWDBZLzE4eCs3V1pvSEtIU0RjQnVNa282ZGw5NVlhK3p2Y1Qyc3lKZHNnNCtuWkpiNkE9PSJ9XX0=" } }, { "ID": "7949bb19367564d3", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "983" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQmhQbzNCajB5bUVBaUFUdzVPOThoNDBtVWh5TmNZMFBiS2sxN2ZnS215eG9BRCtCYkY0ZmlQOU84K2JuUStqVWVzSWxTeFJaajlhVVJ5QWJDM2FJbktNWkMrUnhib2Z0cFlHeEZOM05TTERlaU1zMW5MS1hHVmlXRW5yK2FxSjU5NGRmeW05cE1KV1l6cE9vY3hyZ2tiZ2lGUmFqM01lWmVVckJXc0RITGdOTVVLUWJoYmprUVdPbUY0NmovNFNJRTA1TjU4QmJpMDYvb1FUbkI5a0hIY2VpZ3NpMFlWVkFrUFNqai9ld1ZlOFQyczUxTEhhZkNEZnVjVGc1My9PS2pDa2hBRzJMVXNQQzZKbjhubHlqQllqN3E4QWVmSTFEaHBGNW5VUzhRNE5rcUJhVnV1anVubGJKTjNFcU9YY25mTnRtSzJwc0F0NTB4L05qTmxzTURuMklFQUVORUJiQm5nTldZN0RnZlNYWTIrK0tBRXJCNnF1TUVNYWZTNzdTdG5Cb0J2ZlQ5ZDI4ZnpiNHptZjJ3MUE9PSJ9LHsiSWQiOiIxIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUI0cHRMZVRNVzZHNWtxQzNMZjJhZW1CY05UVkFQV3FlUkNEN3N0RVhXMUlNVUpIcGJWN0FXZlhwVzllakFCNmttaVpmYkhyMkZGbGx0YS96bUZXc0NDbDFia2hhOFFrMTZhOUlnUGxhdTZmZ2RGd05XaHZ0UnRrNkhsYWdkS3FjVVo0bklpMlR6MlJPTHRxYzdNZExoanVIM2hGOHNqMTQ0K1ZBRnk1c0laUzc2c2YxNC9VbmFkVU5JakN1dExvaDVFWlU1emtsZFRDekhVb3MrbnhNWWY1a25FZTVUWDhXK2VZeGZjK0Y1MlFPVXRSTmRPT1FwQU9uUjROTS9HRUpNSWF2NWh1M245enArK1VXNTY5L1Q3SFEyeUtoQ0JVaGs3VjBvZDhJc0pVZ1VFQ3JRRkQ4VnZiQTFTeTlDRGhLY1AvbmZFaWRZdXdwOGUzS0EvR3NaSU15VGZuUWV2eUdIZ0hEaUV3ZEppZmowUnc2b3pkMVRWZG5Ka0swY0FLTzRYNDdSZ0IyU3ZuWlVoOVJFS2RYMW5RPT0ifV0sIlF1ZXVlVXJsIjoiaHR0cHM6Ly9zcXMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vNDU2NzUyNjY1NTc2L1NRU1RvcGljRG91YmxlQWNrLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "38" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:17 GMT" ], "X-Amzn-Requestid": [ "574c31ae-f63a-5c6b-a2bf-5398ef3f2fe5" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifSx7IklkIjoiMSJ9XX0=" } }, { "ID": "e43771457acaaf88", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "983" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQmhQbzNCajB5bUVBaUFUdzVPOThoNDBtVWh5TmNZMFBiS2sxN2ZnS215eG9BRCtCYkY0ZmlQOU84K2JuUStqVWVzSWxTeFJaajlhVVJ5QWJDM2FJbktNWkMrUnhib2Z0cFlHeEZOM05TTERlaU1zMW5MS1hHVmlXRW5yK2FxSjU5NGRmeW05cE1KV1l6cE9vY3hyZ2tiZ2lGUmFqM01lWmVVckJXc0RITGdOTVVLUWJoYmprUVdPbUY0NmovNFNJRTA1TjU4QmJpMDYvb1FUbkI5a0hIY2VpZ3NpMFlWVkFrUFNqai9ld1ZlOFQyczUxTEhhZkNEZnVjVGc1My9PS2pDa2hBRzJMVXNQQzZKbjhubHlqQllqN3E4QWVmSTFEaHBGNW5VUzhRNE5rcUJhVnV1anVubGJKTjNFcU9YY25mTnRtSzJwc0F0NTB4L05qTmxzTURuMklFQUVORUJiQm5nTldZN0RnZlNYWTIrK0tBRXJCNnF1TUVNYWZTNzdTdG5Cb0J2ZlQ5ZDI4ZnpiNHptZjJ3MUE9PSJ9LHsiSWQiOiIxIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUI0cHRMZVRNVzZHNWtxQzNMZjJhZW1CY05UVkFQV3FlUkNEN3N0RVhXMUlNVUpIcGJWN0FXZlhwVzllakFCNmttaVpmYkhyMkZGbGx0YS96bUZXc0NDbDFia2hhOFFrMTZhOUlnUGxhdTZmZ2RGd05XaHZ0UnRrNkhsYWdkS3FjVVo0bklpMlR6MlJPTHRxYzdNZExoanVIM2hGOHNqMTQ0K1ZBRnk1c0laUzc2c2YxNC9VbmFkVU5JakN1dExvaDVFWlU1emtsZFRDekhVb3MrbnhNWWY1a25FZTVUWDhXK2VZeGZjK0Y1MlFPVXRSTmRPT1FwQU9uUjROTS9HRUpNSWF2NWh1M245enArK1VXNTY5L1Q3SFEyeUtoQ0JVaGs3VjBvZDhJc0pVZ1VFQ3JRRkQ4VnZiQTFTeTlDRGhLY1AvbmZFaWRZdXdwOGUzS0EvR3NaSU15VGZuUWV2eUdIZ0hEaUV3ZEppZmowUnc2b3pkMVRWZG5Ka0swY0FLTzRYNDdSZ0IyU3ZuWlVoOVJFS2RYMW5RPT0ifV0sIlF1ZXVlVXJsIjoiaHR0cHM6Ly9zcXMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vNDU2NzUyNjY1NTc2L1NRU1RvcGljRG91YmxlQWNrLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "38" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:17 GMT" ], "X-Amzn-Requestid": [ "df130f61-4f1a-50c5-82ee-6d57561f834b" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifSx7IklkIjoiMSJ9XX0=" } }, { "ID": "d972dff0d01b89f8", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "1491" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ChangeMessageVisibilityBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQmhQbzNCajB5bUVBaUFUdzVPOThoNDBtVWh5TmNZMFBiS2sxN2ZnS215eG9BRCtCYkY0ZmlQOU84K2JuUStqVWVzSWxTeFJaajlhVVJ5QWJDM2FJbktNWkMrUnhib2Z0cFlHeEZOM05TTERlaU1zMW5MS1hHVmlXRW5yK2FxSjU5NGRmeW05cE1KV1l6cE9vY3hyZ2tiZ2lGUmFqM01lWmVVckJXc0RITGdOTVVLUWJoYmprUVdPbUY0NmovNFNJRTA1TjU4QmJpMDYvb1FUbkI5a0hIY2VpZ3NpMFlWVkFrUFNqai9ld1ZlOFQyczUxTEhhZkNEZnVjVGc1My9PS2pDa2hBRzJMVXNQQzZKbjhubHlqQllqN3E4QWVmSTFEaHBGNW5VUzhRNE5rcUJhVnV1anVubGJKTjNFcU9YY25mTnRtSzJwc0F0NTB4L05qTmxzTURuMklFQUVORUJiQm5nTldZN0RnZlNYWTIrK0tBRXJCNnF1TUVNYWZTNzdTdG5Cb0J2ZlQ5ZDI4ZnpiNHptZjJ3MUE9PSIsIlZpc2liaWxpdHlUaW1lb3V0IjoxfSx7IklkIjoiMSIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCNHB0TGVUTVc2RzVrcUMzTGYyYWVtQmNOVFZBUFdxZVJDRDdzdEVYVzFJTVVKSHBiVjdBV2ZYcFc5ZWpBQjZrbWlaZmJIcjJGRmxsdGEvem1GV3NDQ2wxYmtoYThRazE2YTlJZ1BsYXU2ZmdkRndOV2h2dFJ0azZIbGFnZEtxY1VaNG5JaTJUejJST0x0cWM3TWRMaGp1SDNoRjhzajE0NCtWQUZ5NXNJWlM3NnNmMTQvVW5hZFVOSWpDdXRMb2g1RVpVNXprbGRUQ3pIVW9zK254TVlmNWtuRWU1VFg4VytlWXhmYytGNTJRT1V0Uk5kT09RcEFPblI0Tk0vR0VKTUlhdjVodTNuOXpwKytVVzU2OS9UN0hRMnlLaENCVWhrN1Ywb2Q4SXNKVWdVRUNyUUZEOFZ2YkExU3k5Q0RoS2NQL25mRWlkWXV3cDhlM0tBL0dzWklNeVRmblFldnlHSGdIRGlFd2RKaWZqMFJ3Nm96ZDFUVmRuSmtLMGNBS080WDQ3UmdCMlN2blpVaDlSRUtkWDFuUT09IiwiVmlzaWJpbGl0eVRpbWVvdXQiOjF9LHsiSWQiOiIyIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJacmh1NTcyZHQ0QlpqSnJ1b0xOOHJFeXZPQWZ5SzQrTGd3eTJ6VzU1dnRJbWttUkVoRTdEY29zcWgyZlRrbHpjTjh6YUpCVFh1ZDF2SHRpTFhlb29nMUx3eEtiWUVYM1VjREV3a05XVFoyMVZUYmxqWVg4cVh1Z1psTVYyd1d5WUdEd3k3ZmI4UjdweVVhZGsrdG5RaVNMVVVTVkI4bVJTaGt0b09Fd0MxSkZycTR6QlNjR3gxZlgvSmF5Z0c1TWJyMThlOWkrS2hKNnA3VkNFdmZ3QW5oRUJKZ1p6U1h4QWxxdzZlY3BnTVBSY25MeFVIUFN2WEE5b2lxeVhIMHlYS2pqVXFUZkcyMTNjcW5DVzIwRGo0VzN6bVBKemVVbWhDOXExeDI5bjZ3d2tyRTF1WmFZc2gyWDNJVldPcGg2N0hqdGJmVnRjdnZXQzZHZDc5bERNYkhMTHhuYWRwMDdST2NPU1gwWS8xOHgrN1dab0hLSFNEY0J1TWtvNmRsOTVZYSt6dmNUMnN5SmRzZzQrblpKYjZBPT0iLCJWaXNpYmlsaXR5VGltZW91dCI6MX1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0RvdWJsZUFjay10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "332" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:17 GMT" ], "X-Amzn-Requestid": [ "ff1ebf64-161f-5369-9e5d-dd520f1ae0e7" ] }, "Body": "eyJGYWlsZWQiOlt7IkNvZGUiOiJSZWNlaXB0SGFuZGxlSXNJbnZhbGlkIiwiSWQiOiIwIiwiTWVzc2FnZSI6Ik1lc3NhZ2UgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGF2YWlsYWJsZSBmb3IgdmlzaWJpbGl0eSB0aW1lb3V0IGNoYW5nZSIsIlNlbmRlckZhdWx0Ijp0cnVlfSx7IkNvZGUiOiJSZWNlaXB0SGFuZGxlSXNJbnZhbGlkIiwiSWQiOiIxIiwiTWVzc2FnZSI6Ik1lc3NhZ2UgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGF2YWlsYWJsZSBmb3IgdmlzaWJpbGl0eSB0aW1lb3V0IGNoYW5nZSIsIlNlbmRlckZhdWx0Ijp0cnVlfV0sIlN1Y2Nlc3NmdWwiOlt7IklkIjoiMiJ9XX0=" } }, { "ID": "719b194f72da47c2", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "168" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0RvdWJsZUFjay10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:17 GMT" ], "X-Amzn-Requestid": [ "d67dd75b-ad42-5cec-a6ac-b56db447bf62" ] }, "Body": "e30=" } }, { "ID": "f9f70ecfd7c622e0", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "168" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0RvdWJsZUFjay10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:17 GMT" ], "X-Amzn-Requestid": [ "9bed7c2f-2bab-5a44-9247-1e1932aef9ca" ] }, "Body": "e30=" } }, { "ID": "bbcd3fc6e48d3df6", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "168" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0RvdWJsZUFjay10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:18 GMT" ], "X-Amzn-Requestid": [ "b5767ae9-4651-51df-9e89-18df5f54e251" ] }, "Body": "e30=" } }, { "ID": "0552fe2535455d6c", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "168" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0RvdWJsZUFjay10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "719" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:18 GMT" ], "X-Amzn-Requestid": [ "1634f421-0194-52c7-8686-96171892e149" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFJREFXVVdFVVNQVUlHQkxPNEdKRCIsIkFwcHJveGltYXRlRmlyc3RSZWNlaXZlVGltZXN0YW1wIjoiMTc3MzkzNDI3Njk3MyIsIkFwcHJveGltYXRlUmVjZWl2ZUNvdW50IjoiMiIsIlNlbnRUaW1lc3RhbXAiOiIxNzczOTM0Mjc2NzY3In0sIkJvZHkiOiIxIiwiTUQ1T2ZCb2R5IjoiYzRjYTQyMzhhMGI5MjM4MjBkY2M1MDlhNmY3NTg0OWIiLCJNZXNzYWdlSWQiOiJjNjhlMTQxZC05MGZjLTQ3YzEtOTY2Ni03ZTBjZTUyZWMzZjYiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQk1GblVaYStzRUxuYmlqUThzYVFlZW5jY1dpMk5yb0szdEhwQkQ3MS9scWlsYlBDNCtCb0pReXZXd3VweVh1UHIyZTFQOTUrMElXOXVZVHBMb241TkpVVGYxVUduUGNtdThrZ3ZoVmJvNEQvays4V1VNdllZeHYzMTZQN2J6MEw3QytxeVVQTXUwenV3RlpZalpoaUlSME5pZlphTnJERHIzUU9xWWxCNENDVWh6ZHRuRVdpcWFCemJXREpEeHRZWi9oTEZVNlV3eERIMUQxTjdoMEN0WGZBSG9yUEUyMzJwc0RaYkQrVXl3aldGdVBGNXJad0NMZTRIUjVIYURMOWNjdGxBZUJGR21zV2w4akNkSk9MbzAxZGV2MUZVMlZ6UDlLNmJDUnlrWVdDT1NHSkNpYWJVV0ljNWdzV3dPRnNKOUl3M2RGcmFvWDNHMEp4bTJzcU5tOXQ5K0pNNTZ4d01aT2NwbFNqUDZRWmZkeDdxWHlXUVJhWFNmSlNFUlp3K09GbGg4eW5IMlgzeVd1WHFMVXk1SUE9PSJ9XX0=" } }, { "ID": "0a3bd8175317d1c0", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "87" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0RvdWJsZUFjay10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:18 GMT" ], "X-Amzn-Requestid": [ "bd76f27c-3300-5fe3-96fd-904a2a061c6d" ] }, "Body": "" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSQSTopic/TestErrorOnReceiveFromClosedSubscription.replay ================================================ { "Initial": "AQAAAA7hTg2+JCAd6wAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "19a58cb5326ec0e5", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "66" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTUVNUb3BpY0Vycm9yT25SZWNlaXZlRnJvbUNsb3NlZFN1YnNjcmlwdGlvbi10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "114" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:10 GMT" ], "X-Amzn-Requestid": [ "36701d20-5570-5e02-94f2-7f164d8ea1e5" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0Vycm9yT25SZWNlaXZlRnJvbUNsb3NlZFN1YnNjcmlwdGlvbi10b3AtMSJ9" } }, { "ID": "db543a68d6cef056", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "144" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0Vycm9yT25SZWNlaXZlRnJvbUNsb3NlZFN1YnNjcmlwdGlvbi10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "115" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:10 GMT" ], "X-Amzn-Requestid": [ "67b899c2-beef-536f-bcbc-fbf4a6111c88" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTUVNUb3BpY0Vycm9yT25SZWNlaXZlRnJvbUNsb3NlZFN1YnNjcmlwdGlvbi10b3AtMSJ9fQ==" } }, { "ID": "108127e82cfc88f7", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "514" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNRU1RvcGljRXJyb3JPblJlY2VpdmVGcm9tQ2xvc2VkU3Vic2NyaXB0aW9uLXRvcC0xXCJcblx0XHR9XG5cdFx0XVxuXHRcdH0ifSwiUXVldWVVcmwiOiJodHRwczovL3Nxcy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS80NTY3NTI2NjU1NzYvU1FTVG9waWNFcnJvck9uUmVjZWl2ZUZyb21DbG9zZWRTdWJzY3JpcHRpb24tdG9wLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:11 GMT" ], "X-Amzn-Requestid": [ "be2107d3-17bc-593b-a816-65e50f4316dc" ] }, "Body": "" } }, { "ID": "4d0b4a31b97bdb0d", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "114" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0Vycm9yT25SZWNlaXZlRnJvbUNsb3NlZFN1YnNjcmlwdGlvbi10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:11 GMT" ], "X-Amzn-Requestid": [ "0b4114f8-8c11-5c47-9d90-76ce94ee83a0" ] }, "Body": "" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSQSTopic/TestErrorOnSendToClosedTopic.replay ================================================ { "Initial": "AQAAAA7hTg2+ARdROQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "3797812a31b45218", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "54" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTUVNUb3BpY0Vycm9yT25TZW5kVG9DbG9zZWRUb3BpYy10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "102" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:10 GMT" ], "X-Amzn-Requestid": [ "89302469-4450-572f-9929-465f5caef537" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0Vycm9yT25TZW5kVG9DbG9zZWRUb3BpYy10b3AtMSJ9" } }, { "ID": "d196e9e4c422c3c9", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "132" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0Vycm9yT25TZW5kVG9DbG9zZWRUb3BpYy10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "103" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:10 GMT" ], "X-Amzn-Requestid": [ "2146c1e4-3ee0-5f9c-81ac-a3d2261e1d84" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTUVNUb3BpY0Vycm9yT25TZW5kVG9DbG9zZWRUb3BpYy10b3AtMSJ9fQ==" } }, { "ID": "526a8f9477b3d7d0", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "490" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNRU1RvcGljRXJyb3JPblNlbmRUb0Nsb3NlZFRvcGljLXRvcC0xXCJcblx0XHR9XG5cdFx0XVxuXHRcdH0ifSwiUXVldWVVcmwiOiJodHRwczovL3Nxcy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS80NTY3NTI2NjU1NzYvU1FTVG9waWNFcnJvck9uU2VuZFRvQ2xvc2VkVG9waWMtdG9wLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:10 GMT" ], "X-Amzn-Requestid": [ "5539d012-9ea6-5a3f-9ab2-b22486588827" ] }, "Body": "" } }, { "ID": "ca72e3223eba1bb1", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "102" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY0Vycm9yT25TZW5kVG9DbG9zZWRUb3BpYy10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:10 GMT" ], "X-Amzn-Requestid": [ "24b49298-4179-5153-bb81-f0ae5987c34b" ] }, "Body": "" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSQSTopic/TestMetadata.replay ================================================ { "Initial": "AQAAAA7hTg3GLNwKDwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "f03b635edaee429f", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "38" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTUVNUb3BpY01ldGFkYXRhLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "86" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:19 GMT" ], "X-Amzn-Requestid": [ "61a3f915-0a91-5f2e-87eb-9b231397377d" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY01ldGFkYXRhLXRvcC0xIn0=" } }, { "ID": "4b8e6801ea29e01e", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "116" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY01ldGFkYXRhLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "87" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:19 GMT" ], "X-Amzn-Requestid": [ "e1ffdbfd-3563-5cb5-b828-b9cb2c64f4e6" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTUVNUb3BpY01ldGFkYXRhLXRvcC0xIn19" } }, { "ID": "38274522b8cce29b", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "458" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNRU1RvcGljTWV0YWRhdGEtdG9wLTFcIlxuXHRcdH1cblx0XHRdXG5cdFx0fSJ9LCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY01ldGFkYXRhLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:19 GMT" ], "X-Amzn-Requestid": [ "fb8e4032-6e16-5388-9f19-220477110bdb" ] }, "Body": "" } }, { "ID": "e05b024d6952a6e7", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "1610" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SendMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJDTEVBUkVE" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "192" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:19 GMT" ], "X-Amzn-Requestid": [ "25a0fa4e-fa30-5fcd-99fa-9878e337e79e" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAiLCJNRDVPZk1lc3NhZ2VBdHRyaWJ1dGVzIjoiZjNmYmZkZTFlODI1MjRkZWMwOGU0YjVmNjYwYTEwNmMiLCJNRDVPZk1lc3NhZ2VCb2R5IjoiNWViNjNiYmJlMDFlZWVkMDkzY2IyMmJiOGY1YWNkYzMiLCJNZXNzYWdlSWQiOiI0MjMwMjYwMC04ZGY4LTQ5ZDktOTU1My05ZTkyNGNiYzQ5ZmYifV19" } }, { "ID": "7a6adbcf2ff2d232", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "167" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY01ldGFkYXRhLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2262" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:19 GMT" ], "X-Amzn-Requestid": [ "a42d394d-0443-53b4-9234-5b7b1d440be7" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFJREFXVVdFVVNQVUlHQkxPNEdKRCIsIkFwcHJveGltYXRlRmlyc3RSZWNlaXZlVGltZXN0YW1wIjoiMTc3MzkzNDI3OTMyMiIsIkFwcHJveGltYXRlUmVjZWl2ZUNvdW50IjoiMSIsIlNlbnRUaW1lc3RhbXAiOiIxNzczOTM0Mjc5MjQ3In0sIkJvZHkiOiJoZWxsbyB3b3JsZCIsIk1ENU9mQm9keSI6IjVlYjYzYmJiZTAxZWVlZDA5M2NiMjJiYjhmNWFjZGMzIiwiTUQ1T2ZNZXNzYWdlQXR0cmlidXRlcyI6ImYzZmJmZGUxZTgyNTI0ZGVjMDhlNGI1ZjY2MGExMDZjIiwiTWVzc2FnZUF0dHJpYnV0ZXMiOnsiMTIzNDUiOnsiRGF0YVR5cGUiOiJTdHJpbmciLCJTdHJpbmdWYWx1ZSI6IjEyMzQ1In0sIl9fMHgwX19fXzB4MV9fX18weDJfX19fMHgzX19fXzB4NF9fX18weDVfX19fMHg2X19fXzB4N19fX18weDhfX19fMHg5X19fXzB4YV9fX18weGJfX19fMHhjX19fXzB4ZF9fX18weGVfX19fMHhmX18iOnsiRGF0YVR5cGUiOiJTdHJpbmciLCJTdHJpbmdWYWx1ZSI6IiUwMCUwMSUwMiUwMyUwNCUwNSUwNiUwNyUwOCUwOSUwQSUwQiUwQyUwRCUwRSUwRiJ9LCJfXzB4MTBfX19fMHgxMV9fX18weDEyX19fXzB4MTNfX19fMHgxNF9fX18weDE1X19fXzB4MTZfX19fMHgxN19fX18weDE4X19fXzB4MTlfX19fMHgxYV9fX18weDFiX19fXzB4MWNfX19fMHgxZF9fX18weDFlX19fXzB4MWZfXyI6eyJEYXRhVHlwZSI6IlN0cmluZyIsIlN0cmluZ1ZhbHVlIjoiJTEwJTExJTEyJTEzJTE0JTE1JTE2JTE3JTE4JTE5JTFBJTFCJTFDJTFEJTFFJTFGIn0sIl9fMHgyMF9fX18weDIxX19fXzB4MjJfX19fMHgyM19fX18weDI0X19fXzB4MjVfX19fMHgyNl9fX18weDI3X19fXzB4MjhfX19fMHgyOV9fX18weDJhX19fXzB4MmJfX19fMHgyY19fLS5fXzB4MmZfXyI6eyJEYXRhVHlwZSI6IlN0cmluZyIsIlN0cmluZ1ZhbHVlIjoiJTIwJTIxJTIyJTIzJCUyNSYlMjclMjglMjklMkErJTJDLS4lMkYifSwiX18weDJlX19fXzB4MmVfX19fMHgyZl9fZm9vX18weDJmX18uX18weDJlX19fXzB4MmZfX2Jhcl9fMHgyZl9fLl9fMHgyZV9fX18weDJmX18uX18weDJlX19fXzB4MmZfX2Jhei5fXzB4MmVfX19fMHgyZl9fIjp7IkRhdGFUeXBlIjoiU3RyaW5nIiwiU3RyaW5nVmFsdWUiOiIuLiUyRmZvbyUyRi4uJTJGYmFyJTJGLi4lMkYuLiUyRmJhei4uJTJGIn0sIl9fMHgyZV9fX18weDJlX19fXzB4NWNfX2Zvb19fMHg1Y19fLl9fMHgyZV9fX18weDVjX19iYXJfXzB4NWNfXy5fXzB4MmVfX19fMHg1Y19fLl9fMHgyZV9fX18weDVjX19iYXouX18weDJlX19fXzB4NWNfXyI6eyJEYXRhVHlwZSI6IlN0cmluZyIsIlN0cmluZ1ZhbHVlIjoiLi4lNUNmb28lNUMuLiU1Q2JhciU1Qy4uJTVDLi4lNUNiYXouLiU1QyJ9LCJfXzB4MmVfX19fMHgyZV9fX18weDVjX19mb29fXzB4NWNfX19fMHg1Y19fYmFyX18weDVjX19fXzB4NWNfX19fMHg1Y19fYmF6Ijp7IkRhdGFUeXBlIjoiU3RyaW5nIiwiU3RyaW5nVmFsdWUiOiIuLiU1Q2ZvbyU1QyU1Q2JhciU1QyU1QyU1Q2JheiJ9LCJfXzB4M2FfX19fMHgzYl9fX18weDNjX19fXzB4M2RfX19fMHgzZV9fX18weDNmX18iOnsiRGF0YVR5cGUiOiJTdHJpbmciLCJTdHJpbmdWYWx1ZSI6IjolM0IlM0M9JTNFJTNGIn0sIl9fMHg0MF9fIjp7IkRhdGFUeXBlIjoiU3RyaW5nIiwiU3RyaW5nVmFsdWUiOiJAIn0sIl9fMHg1Yl9fX18weDVjX19fXzB4NWRfX19fMHg1ZV9fXyI6eyJEYXRhVHlwZSI6IlN0cmluZyIsIlN0cmluZ1ZhbHVlIjoiJTVCJTVDJTVEJTVFXyJ9fSwiTWVzc2FnZUlkIjoiNDIzMDI2MDAtOGRmOC00OWQ5LTk1NTMtOWU5MjRjYmM0OWZmIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJzOEw1UG51UWZyUGErNkVoZ2l1d0JscDdFQTIwUFRud0w2Skwyc0dJQ3lZVVJZRW1EdUZ1RUVMOTZ6am9RSm13SkRZdEI5WUorZTA2Zm9wSVMzNVF4MnR6RWE5OWhUOHBBUGZCaDg5VHRwVFRiNzQveXh0d3J0aHVObDdYRENremdQREhhcklPY1RRcndaVXZsME9JRDJWYndpWlMxVDR3R0xRcnhaMnBqdGpkWFNrbnpLLy9DSDZjRkRPdy9HZDExWmFOdjcwaTNRc1J4M2VGK2R2cHgvRWYzc0tVSEI5SjhFditCQ2JNY29VaFNiR2VqWFB3b2lycm52cDhLL0lvTjVtK3RwZG9RcUtlaDZ4b20yME43WGkxZ3NDOEVOcEEweDE3Rm9xSERjUFduYlhzWnM1UUQwRkRROEMvNHFuNWprMlAvZnZrbnR2WUZacE1tZDFXeDlNV3piOVBwcTZqNFEwazdqaFZKclRWdVRzQktZWXhxMnk1TDJWam9uaUYwd2xEZ1hTSk1IZFJuZURmbXJUNHZ3PT0ifV19" } }, { "ID": "a8418e3f676ec05a", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "849" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SendMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJDTEVBUkVE" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "192" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:19 GMT" ], "X-Amzn-Requestid": [ "aedfdafe-02f4-5441-9b17-b8c81bf3ec12" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAiLCJNRDVPZk1lc3NhZ2VBdHRyaWJ1dGVzIjoiZGU4YmE3MGUyOTA3NjljYTE4NTQzZGE5MjQwZGUwMjUiLCJNRDVPZk1lc3NhZ2VCb2R5IjoiNWViNjNiYmJlMDFlZWVkMDkzY2IyMmJiOGY1YWNkYzMiLCJNZXNzYWdlSWQiOiJmMTRmNzg1YS0wNzJlLTQ5OTYtODI1OC1mMDg1OWNkMTAwODgifV19" } }, { "ID": "11e1451fceb755c2", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "540" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQnM4TDVQbnVRZnJQYSs2RWhnaXV3QmxwN0VBMjBQVG53TDZKTDJzR0lDeVlVUllFbUR1RnVFRUw5Nnpqb1FKbXdKRFl0QjlZSitlMDZmb3BJUzM1UXgydHpFYTk5aFQ4cEFQZkJoODlUdHBUVGI3NC95eHR3cnRodU5sN1hEQ2t6Z1BESGFySU9jVFFyd1pVdmwwT0lEMlZid2laUzFUNHdHTFFyeFoycGp0amRYU2tueksvL0NINmNGRE93L0dkMTFaYU52NzBpM1FzUngzZUYrZHZweC9FZjNzS1VIQjlKOEV2K0JDYk1jb1VoU2JHZWpYUHdvaXJybnZwOEsvSW9ONW0rdHBkb1FxS2VoNnhvbTIwTjdYaTFnc0M4RU5wQTB4MTdGb3FIRGNQV25iWHNaczVRRDBGRFE4Qy80cW41amsyUC9mdmtudHZZRlpwTW1kMVd4OU1XemI5UHBxNmo0UTBrN2poVkpyVFZ1VHNCS1lZeHEyeTVMMlZqb25pRjB3bERnWFNKTUhkUm5lRGZtclQ0dnc9PSJ9XSwiUXVldWVVcmwiOiJodHRwczovL3Nxcy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS80NTY3NTI2NjU1NzYvU1FTVG9waWNNZXRhZGF0YS10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:19 GMT" ], "X-Amzn-Requestid": [ "fc95c6fa-aea1-5aba-8105-a4ccb7a672e9" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "29a274eb219353bd", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "167" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY01ldGFkYXRhLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1501" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:19 GMT" ], "X-Amzn-Requestid": [ "f10f4a40-a451-5554-8b6e-2876bd568d07" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFJREFXVVdFVVNQVUlHQkxPNEdKRCIsIkFwcHJveGltYXRlRmlyc3RSZWNlaXZlVGltZXN0YW1wIjoiMTc3MzkzNDI3OTUzNyIsIkFwcHJveGltYXRlUmVjZWl2ZUNvdW50IjoiMSIsIlNlbnRUaW1lc3RhbXAiOiIxNzczOTM0Mjc5MzkxIn0sIkJvZHkiOiJoZWxsbyB3b3JsZCIsIk1ENU9mQm9keSI6IjVlYjYzYmJiZTAxZWVlZDA5M2NiMjJiYjhmNWFjZGMzIiwiTUQ1T2ZNZXNzYWdlQXR0cmlidXRlcyI6ImRlOGJhNzBlMjkwNzY5Y2ExODU0M2RhOTI0MGRlMDI1IiwiTWVzc2FnZUF0dHJpYnV0ZXMiOnsiX18weDI2M2FfX19fMHgyNjNhX19fXzB4MjYzYV9fIjp7IkRhdGFUeXBlIjoiU3RyaW5nIiwiU3RyaW5nVmFsdWUiOiIlRTIlOTglQkElRTIlOTglQkElRTIlOTglQkEifSwiX18weDYwX18iOnsiRGF0YVR5cGUiOiJTdHJpbmciLCJTdHJpbmdWYWx1ZSI6IiU2MCJ9LCJfXzB4N2JfX19fMHg3Y19fX18weDdkX19fXzB4N2VfX19fMHg3Zl9fIjp7IkRhdGFUeXBlIjoiU3RyaW5nIiwiU3RyaW5nVmFsdWUiOiIlN0IlN0MlN0R+JTdGIn0sImZvb19fMHgyMF9fYmFyX18weDIwX19iYXoiOnsiRGF0YVR5cGUiOiJTdHJpbmciLCJTdHJpbmdWYWx1ZSI6ImZvbyUyMGJhciUyMGJheiJ9LCJmb29fXzB4MjJfX2Jhcl9fMHgyMl9fYmF6Ijp7IkRhdGFUeXBlIjoiU3RyaW5nIiwiU3RyaW5nVmFsdWUiOiJmb28lMjJiYXIlMjJiYXoifSwiZm9vX18weDJmX19fXzB4MmZfX2Jhcl9fMHgyZl9fX18weDJmX19fXzB4MmZfX2JheiI6eyJEYXRhVHlwZSI6IlN0cmluZyIsIlN0cmluZ1ZhbHVlIjoiZm9vJTJGJTJGYmFyJTJGJTJGJTJGYmF6In0sImZvb19fMHgyZl9fYmFyX18weDJmX19iYXoiOnsiRGF0YVR5cGUiOiJTdHJpbmciLCJTdHJpbmdWYWx1ZSI6ImZvbyUyRmJhciUyRmJheiJ9LCJmb29fXzB4NWNfX2Jhcl9fMHg1Y19fYmF6Ijp7IkRhdGFUeXBlIjoiU3RyaW5nIiwiU3RyaW5nVmFsdWUiOiJmb28lNUNiYXIlNUNiYXoifX0sIk1lc3NhZ2VJZCI6ImYxNGY3ODVhLTA3MmUtNDk5Ni04MjU4LWYwODU5Y2QxMDA4OCIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCamp0Tzc4ckVZK0JjaCtwUFovZHdTdHo5TzJvbmE0TkgzYkM3Nm5IbGFvRC85UlFiYldaV3pRaXdvNncyUGpPUDZMMVFCYnA3K1V0UHNRZXdBSUc2WWRYS0I2VWhaT3dkRktqOTBlUE4xNWxXQ1RTYnVyRDRydVVJTSs5WWdhM2dRM0ZiZmxUeDdWd2lkV1RtR1g0bVRLdnZiODVwZjlZRUMrM24zb0pkVXpKRUwzQkJuMFZ3UjRLaExhZ2gwcHFmSXB3dnNzdWhhOEw1VWc1ZlJRVmJNbFg0Q0EvaTRGejFsa3JncFBzMFZKYW1YSm9zU0JKRjdXVUoxTjZzaGlRTkdaSnBWVUNoeXdQSW5ReXZLVTljWW9tdm1wRXFEVFNURzFhZzZmYk1tNW9yT3dXeGxrWVpkeEpyYU5HaGNWa09ZZ25nNVJHaC92dXp5VzVMcUVycGZ6N0dON0M2NE0wYXFEQ0FMT3lFRW8rMjFNaDhNYzlZaGp6WHU1cmI2UjRadnJibUZteVlYUTRCTXJCbURGQXc2UT09In1dfQ==" } }, { "ID": "f627fcc02f09156d", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "540" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQmpqdE83OHJFWStCY2grcFBaL2R3U3R6OU8yb25hNE5IM2JDNzZuSGxhb0QvOVJRYmJXWld6UWl3bzZ3MlBqT1A2TDFRQmJwNytVdFBzUWV3QUlHNllkWEtCNlVoWk93ZEZLajkwZVBOMTVsV0NUU2J1ckQ0cnVVSU0rOVlnYTNnUTNGYmZsVHg3VndpZFdUbUdYNG1US3Z2Yjg1cGY5WUVDKzNuM29KZFV6SkVMM0JCbjBWd1I0S2hMYWdoMHBxZklwd3Zzc3VoYThMNVVnNWZSUVZiTWxYNENBL2k0RnoxbGtyZ3BQczBWSmFtWEpvc1NCSkY3V1VKMU42c2hpUU5HWkpwVlVDaHl3UEluUXl2S1U5Y1lvbXZtcEVxRFRTVEcxYWc2ZmJNbTVvck93V3hsa1laZHhKcmFOR2hjVmtPWWduZzVSR2gvdnV6eVc1THFFcnBmejdHTjdDNjRNMGFxRENBTE95RUVvKzIxTWg4TWM5WWhqelh1NXJiNlI0WnZyYm1GbXlZWFE0Qk1yQm1ERkF3NlE9PSJ9XSwiUXVldWVVcmwiOiJodHRwczovL3Nxcy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS80NTY3NTI2NjU1NzYvU1FTVG9waWNNZXRhZGF0YS10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:19 GMT" ], "X-Amzn-Requestid": [ "a413f943-ae86-599b-b6a2-9b75b78181c8" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "8dc4e9b978f006c4", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "86" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY01ldGFkYXRhLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:19 GMT" ], "X-Amzn-Requestid": [ "0b4d7951-c187-5c4c-a94e-1b67d8805963" ] }, "Body": "" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSQSTopic/TestNack.replay ================================================ { "Initial": "AQAAAA7hTg3BLMIycgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "4e4be699c479085f", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "34" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTUVNUb3BpY05hY2stdG9wLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "82" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:14 GMT" ], "X-Amzn-Requestid": [ "a34e5f75-414c-5d0f-ad90-3d43584da7e4" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY05hY2stdG9wLTEifQ==" } }, { "ID": "a4a966577a5d28a1", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "112" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY05hY2stdG9wLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "83" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:14 GMT" ], "X-Amzn-Requestid": [ "bb7e9cf6-7ad7-5f14-8baa-fec063d5b5ff" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTUVNUb3BpY05hY2stdG9wLTEifX0=" } }, { "ID": "cf8d6b62d0ab4908", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "450" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNRU1RvcGljTmFjay10b3AtMVwiXG5cdFx0fVxuXHRcdF1cblx0XHR9In0sIlF1ZXVlVXJsIjoiaHR0cHM6Ly9zcXMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vNDU2NzUyNjY1NTc2L1NRU1RvcGljTmFjay10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:14 GMT" ], "X-Amzn-Requestid": [ "d6f8a141-fcbd-5e73-bf44-c377e5bf4498" ] }, "Body": "" } }, { "ID": "ddcdf71b029d93d8", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "189" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SendMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJDTEVBUkVE" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "192" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:14 GMT" ], "X-Amzn-Requestid": [ "f85a960a-c9b6-5ea2-91fa-f43cd0b40449" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAiLCJNRDVPZk1lc3NhZ2VBdHRyaWJ1dGVzIjoiOWFhNDY4N2M4Yjc1NjdiYWEzODBkOWYzMDBmZTI4M2EiLCJNRDVPZk1lc3NhZ2VCb2R5IjoiY2ZjZDIwODQ5NWQ1NjVlZjY2ZTdkZmY5Zjk4NzY0ZGEiLCJNZXNzYWdlSWQiOiIyM2UzNjRiNy03ZTRkLTQ2ZWMtYTVmNy03NjIzMjM3NjViOGYifV19" } }, { "ID": "f2c3a7cdaf8cbd17", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "189" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SendMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJDTEVBUkVE" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "192" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:14 GMT" ], "X-Amzn-Requestid": [ "58dea096-1423-5b80-9c89-c2a00d21116b" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAiLCJNRDVPZk1lc3NhZ2VBdHRyaWJ1dGVzIjoiMzE0Yzc3YjI0OTg5M2M2YjNjNzY1YTQyY2MwOGIyNDUiLCJNRDVPZk1lc3NhZ2VCb2R5IjoiYzRjYTQyMzhhMGI5MjM4MjBkY2M1MDlhNmY3NTg0OWIiLCJNZXNzYWdlSWQiOiI1YzY5NWE4OC02MDZiLTRlYzgtODNmNy1iZDhkMDMxYzgyMDUifV19" } }, { "ID": "420b99a683e8c47b", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "163" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY05hY2stdG9wLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "845" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:14 GMT" ], "X-Amzn-Requestid": [ "d86f2de7-bbb6-52d3-9c55-4fd1a2b4d838" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFJREFXVVdFVVNQVUlHQkxPNEdKRCIsIkFwcHJveGltYXRlRmlyc3RSZWNlaXZlVGltZXN0YW1wIjoiMTc3MzkzNDI3NDM5OCIsIkFwcHJveGltYXRlUmVjZWl2ZUNvdW50IjoiMSIsIlNlbnRUaW1lc3RhbXAiOiIxNzczOTM0Mjc0MzI0In0sIkJvZHkiOiIxIiwiTUQ1T2ZCb2R5IjoiYzRjYTQyMzhhMGI5MjM4MjBkY2M1MDlhNmY3NTg0OWIiLCJNRDVPZk1lc3NhZ2VBdHRyaWJ1dGVzIjoiMzE0Yzc3YjI0OTg5M2M2YjNjNzY1YTQyY2MwOGIyNDUiLCJNZXNzYWdlQXR0cmlidXRlcyI6eyJhIjp7IkRhdGFUeXBlIjoiU3RyaW5nIiwiU3RyaW5nVmFsdWUiOiIxIn19LCJNZXNzYWdlSWQiOiI1YzY5NWE4OC02MDZiLTRlYzgtODNmNy1iZDhkMDMxYzgyMDUiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQjdZOER5L3RhNEdVdm5Zb2RoTVA5WW8zWk5lWk1RRXJVZVMySU5vT2NGN1d0Q0NsN3FWMTlhWjhVTVE0Y0NBTnkrbUFnV1VtN0dZaUIvT3dVVC9pS2pOWVhtS1RkM1JBWURyR2dWRTVtRXhYVGpQZ0YrRTQyMVQrejF5YU1oMG1qQzhJczIrRDZ3TDJWWXFNS0FDSWQrZi9GZmJ0RXJsKzNZU0FqTjVDVUlSd2h6bVRYVE9MeWdPUjNmKyt6dVl2a2g1YjFMY09RSDRNVFZLNzZTb2FTWjVuTVhvRjk2anAvMkUzMlZDQW9kdWg1a3hubzRZdDBzaVNHOERuT2J2SFozd0ozWGlCYnVpRU95WjdjMjZyTW5MejFDUHVaVEVpL1FyVWhaY3JzM0UzSU5uM2tmUkdyWlNFNks0V2pQL1pXVEsyNDV3L2svcVhDS1pFMC95UHQwTDNkWk1wUjl6aUJqM3dQT29aS2V6a1AycFEwNXhJZUdFYy9oRkVEaDZQVlRQamlKRzFZeFlGNFZpOUVJVG1iTWc9PSJ9XX0=" } }, { "ID": "28a8e74424af4972", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "163" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY05hY2stdG9wLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "845" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:14 GMT" ], "X-Amzn-Requestid": [ "cbacd26c-9b08-5c58-b582-b05a820af6b3" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFJREFXVVdFVVNQVUlHQkxPNEdKRCIsIkFwcHJveGltYXRlRmlyc3RSZWNlaXZlVGltZXN0YW1wIjoiMTc3MzkzNDI3NDQ3MSIsIkFwcHJveGltYXRlUmVjZWl2ZUNvdW50IjoiMSIsIlNlbnRUaW1lc3RhbXAiOiIxNzczOTM0Mjc0MjQ5In0sIkJvZHkiOiIwIiwiTUQ1T2ZCb2R5IjoiY2ZjZDIwODQ5NWQ1NjVlZjY2ZTdkZmY5Zjk4NzY0ZGEiLCJNRDVPZk1lc3NhZ2VBdHRyaWJ1dGVzIjoiOWFhNDY4N2M4Yjc1NjdiYWEzODBkOWYzMDBmZTI4M2EiLCJNZXNzYWdlQXR0cmlidXRlcyI6eyJhIjp7IkRhdGFUeXBlIjoiU3RyaW5nIiwiU3RyaW5nVmFsdWUiOiIwIn19LCJNZXNzYWdlSWQiOiIyM2UzNjRiNy03ZTRkLTQ2ZWMtYTVmNy03NjIzMjM3NjViOGYiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQkNFMUQzQmJTM1BScnpyVXBIQTlOSVhqdFB3dFMxZ0xZdEVwY2RqMENlSU5HY25hQUlESzZuWHh0LzVsQnRSYXF6UEI4bUxhc2hVeTVDMkIyY243WHVLSXFUZXBpQWJTOHZQQWkxUHZqcVdTTGdTTDNzUmVJQWdscGFMcG5hVk5EQnNQUXJHYWdqcThiT0gvRkQycUQzV3lkUGNoazBvTTdUUUozU1p4QUZiSjBTbU9MYkh5ZzBNRjBJKzBoMmQ2cnlsT3EvSDlqeUdkSVJRV0RKSHJuNnZsd2FselZqUVI0eFJEMmhwczJYMk5ySzRCbll2Y3dIbXA0NU92THVWRzJycmJ1RWc1RmE0VVpZOElOTEc5YXBDZklPZ0VremN1eUxUY3NFOE5PTGtRQjJxSFhzZ1J2cm5mRjZzaXd4MlFwODl5Z1J3VDl5ZWwzNjVZbzFiaHhFaE02OURRNjU1aWlUY3NzVEgrQThlMUkxQ29EWk1vNllaNmVHTHQ2bHdmOU12ckFBV3dVQW80ZlVqaFlETkdmUEE9PSJ9XX0=" } }, { "ID": "49c3490582e061fd", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "558" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ChangeMessageVisibilityBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQjdZOER5L3RhNEdVdm5Zb2RoTVA5WW8zWk5lWk1RRXJVZVMySU5vT2NGN1d0Q0NsN3FWMTlhWjhVTVE0Y0NBTnkrbUFnV1VtN0dZaUIvT3dVVC9pS2pOWVhtS1RkM1JBWURyR2dWRTVtRXhYVGpQZ0YrRTQyMVQrejF5YU1oMG1qQzhJczIrRDZ3TDJWWXFNS0FDSWQrZi9GZmJ0RXJsKzNZU0FqTjVDVUlSd2h6bVRYVE9MeWdPUjNmKyt6dVl2a2g1YjFMY09RSDRNVFZLNzZTb2FTWjVuTVhvRjk2anAvMkUzMlZDQW9kdWg1a3hubzRZdDBzaVNHOERuT2J2SFozd0ozWGlCYnVpRU95WjdjMjZyTW5MejFDUHVaVEVpL1FyVWhaY3JzM0UzSU5uM2tmUkdyWlNFNks0V2pQL1pXVEsyNDV3L2svcVhDS1pFMC95UHQwTDNkWk1wUjl6aUJqM3dQT29aS2V6a1AycFEwNXhJZUdFYy9oRkVEaDZQVlRQamlKRzFZeFlGNFZpOUVJVG1iTWc9PSIsIlZpc2liaWxpdHlUaW1lb3V0IjoxfV0sIlF1ZXVlVXJsIjoiaHR0cHM6Ly9zcXMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vNDU2NzUyNjY1NTc2L1NRU1RvcGljTmFjay10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:14 GMT" ], "X-Amzn-Requestid": [ "6a389d6c-c625-541f-9555-ff5adf272ef4" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "8fca9479fa510ce6", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "163" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY05hY2stdG9wLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:14 GMT" ], "X-Amzn-Requestid": [ "83bd2da2-2a70-5e1d-95bd-4f94337274f6" ] }, "Body": "e30=" } }, { "ID": "6c0be236e3b84782", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "558" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ChangeMessageVisibilityBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQkNFMUQzQmJTM1BScnpyVXBIQTlOSVhqdFB3dFMxZ0xZdEVwY2RqMENlSU5HY25hQUlESzZuWHh0LzVsQnRSYXF6UEI4bUxhc2hVeTVDMkIyY243WHVLSXFUZXBpQWJTOHZQQWkxUHZqcVdTTGdTTDNzUmVJQWdscGFMcG5hVk5EQnNQUXJHYWdqcThiT0gvRkQycUQzV3lkUGNoazBvTTdUUUozU1p4QUZiSjBTbU9MYkh5ZzBNRjBJKzBoMmQ2cnlsT3EvSDlqeUdkSVJRV0RKSHJuNnZsd2FselZqUVI0eFJEMmhwczJYMk5ySzRCbll2Y3dIbXA0NU92THVWRzJycmJ1RWc1RmE0VVpZOElOTEc5YXBDZklPZ0VremN1eUxUY3NFOE5PTGtRQjJxSFhzZ1J2cm5mRjZzaXd4MlFwODl5Z1J3VDl5ZWwzNjVZbzFiaHhFaE02OURRNjU1aWlUY3NzVEgrQThlMUkxQ29EWk1vNllaNmVHTHQ2bHdmOU12ckFBV3dVQW80ZlVqaFlETkdmUEE9PSIsIlZpc2liaWxpdHlUaW1lb3V0IjoxfV0sIlF1ZXVlVXJsIjoiaHR0cHM6Ly9zcXMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vNDU2NzUyNjY1NTc2L1NRU1RvcGljTmFjay10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:14 GMT" ], "X-Amzn-Requestid": [ "2ca1be50-0bea-5e44-8a5d-dc6612e824af" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "1743e54b576ff202", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "163" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY05hY2stdG9wLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:15 GMT" ], "X-Amzn-Requestid": [ "ccad27dc-aca3-5db1-81d4-45eab5a1d3dc" ] }, "Body": "e30=" } }, { "ID": "7699fd724353d796", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "163" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY05hY2stdG9wLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:15 GMT" ], "X-Amzn-Requestid": [ "9f595b1b-424e-51ed-b7d3-392d5b4d0f80" ] }, "Body": "e30=" } }, { "ID": "a7627a2394cbb779", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "163" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY05hY2stdG9wLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "845" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:15 GMT" ], "X-Amzn-Requestid": [ "99f01bfc-2ae5-54a0-b725-79ca33e65acd" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFJREFXVVdFVVNQVUlHQkxPNEdKRCIsIkFwcHJveGltYXRlRmlyc3RSZWNlaXZlVGltZXN0YW1wIjoiMTc3MzkzNDI3NDM5OCIsIkFwcHJveGltYXRlUmVjZWl2ZUNvdW50IjoiMiIsIlNlbnRUaW1lc3RhbXAiOiIxNzczOTM0Mjc0MzI0In0sIkJvZHkiOiIxIiwiTUQ1T2ZCb2R5IjoiYzRjYTQyMzhhMGI5MjM4MjBkY2M1MDlhNmY3NTg0OWIiLCJNRDVPZk1lc3NhZ2VBdHRyaWJ1dGVzIjoiMzE0Yzc3YjI0OTg5M2M2YjNjNzY1YTQyY2MwOGIyNDUiLCJNZXNzYWdlQXR0cmlidXRlcyI6eyJhIjp7IkRhdGFUeXBlIjoiU3RyaW5nIiwiU3RyaW5nVmFsdWUiOiIxIn19LCJNZXNzYWdlSWQiOiI1YzY5NWE4OC02MDZiLTRlYzgtODNmNy1iZDhkMDMxYzgyMDUiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQnNUTGhaRFo1a1FtcHFsWEhNS2dYaDQ2b0syeE12WVFkZ2dKL1VWKzFja2Z2OWZKREF6ZW1zVEpQSXZBejVRSjFFQ1hXUWFRb095eGRFS2RFUWFNaUVvTHFSVUFRd2c3QytqcUdud1hnSit4Qk1GZ1VIN1BGVGkzVmdvdnYrRzFvMk15eTRiTkNSeXBXQXRwWndpUW1FRlFwM2VvYml5R3M3UERhamk0S3I2bk12YUNzZ1ZvaFlSOHdLb2Q0b2NjaDB2QWtTeS96b3Y0KytEQTVJVGViak5QczJUT1cwK2oyUncvc2l2VmgwRlJPUmE0U2dqSXRRODM1UUxyYkhHODY1dFNqdzdFdVhpMFdUQmYwcjJGU3JRRGxnWE53cWIwWE1Oa0JVWEZMakNMdHkrV1dxQmZkUkhlQ3l2WVVIY1ZtSG1aWDl4d0syNUJKODZuTU1nV0RMT2dmMVBzMzBCaWQ4RU04Y2M2Q2o4TjEwMGtEMFZwVFhPZlJ4eEhwWmJQU0JNZ1JzeGxFVmxaQ2R0bklsbVZmUkE9PSJ9XX0=" } }, { "ID": "9a9d9b9bcaa116a1", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "163" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY05hY2stdG9wLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "845" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:15 GMT" ], "X-Amzn-Requestid": [ "492dc8dd-b9a9-5e2f-8d73-aaeba0aab042" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFJREFXVVdFVVNQVUlHQkxPNEdKRCIsIkFwcHJveGltYXRlRmlyc3RSZWNlaXZlVGltZXN0YW1wIjoiMTc3MzkzNDI3NDQ3MSIsIkFwcHJveGltYXRlUmVjZWl2ZUNvdW50IjoiMiIsIlNlbnRUaW1lc3RhbXAiOiIxNzczOTM0Mjc0MjQ5In0sIkJvZHkiOiIwIiwiTUQ1T2ZCb2R5IjoiY2ZjZDIwODQ5NWQ1NjVlZjY2ZTdkZmY5Zjk4NzY0ZGEiLCJNRDVPZk1lc3NhZ2VBdHRyaWJ1dGVzIjoiOWFhNDY4N2M4Yjc1NjdiYWEzODBkOWYzMDBmZTI4M2EiLCJNZXNzYWdlQXR0cmlidXRlcyI6eyJhIjp7IkRhdGFUeXBlIjoiU3RyaW5nIiwiU3RyaW5nVmFsdWUiOiIwIn19LCJNZXNzYWdlSWQiOiIyM2UzNjRiNy03ZTRkLTQ2ZWMtYTVmNy03NjIzMjM3NjViOGYiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQjRTTWlqNE80NjVDcm9HZXVFdDVqdVpNVmFIUE9FRURCeURhS3F0RXJ2eW53Y3BnQk5kOGV5OU1hY29tSmo4Szljalh1NnVqcVBrRldGcEhKa0d6SG54eXV6N2s1czBYQll1Smo0OXhaZXZkK3NhRHEweG5uVDYxUTJ0d3pZZlU5VGFsZ0hqcTdmMnlQSGRYQVhuUUdvYU9DU3htQTN4WTBUMmtVeUhWTXNJVG1FNDNHVGI3dkRpRWk3aWt5TEVvRkU4ZHVVbStvVUJBK0JxaHJTUW42cGU1V08vekJlM3dUZkkweGdXekROUCtTNXROS2Ivb1hGZ3dhSURvTFgvOVlqUU95N21DNWtKcEt2RjdrZHNZVWFrSHEwc29ZbFgvRlBjN0RkMnNxZEwxWUFFRk5RUWlTQ04zaFNrVEhvRThXMEVLTkpnNVd4NjRrcEdtMWp4TWJyK2w1RFRrUCtXL0xyaFloc2lGbk5IWGpERjYvRHBhOE9GSHFhSUZXYkVKWGFyeklDY21XNXZiKzRISTFib1lWdXc9PSJ9XX0=" } }, { "ID": "27677d85c495b6a7", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "536" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQnNUTGhaRFo1a1FtcHFsWEhNS2dYaDQ2b0syeE12WVFkZ2dKL1VWKzFja2Z2OWZKREF6ZW1zVEpQSXZBejVRSjFFQ1hXUWFRb095eGRFS2RFUWFNaUVvTHFSVUFRd2c3QytqcUdud1hnSit4Qk1GZ1VIN1BGVGkzVmdvdnYrRzFvMk15eTRiTkNSeXBXQXRwWndpUW1FRlFwM2VvYml5R3M3UERhamk0S3I2bk12YUNzZ1ZvaFlSOHdLb2Q0b2NjaDB2QWtTeS96b3Y0KytEQTVJVGViak5QczJUT1cwK2oyUncvc2l2VmgwRlJPUmE0U2dqSXRRODM1UUxyYkhHODY1dFNqdzdFdVhpMFdUQmYwcjJGU3JRRGxnWE53cWIwWE1Oa0JVWEZMakNMdHkrV1dxQmZkUkhlQ3l2WVVIY1ZtSG1aWDl4d0syNUJKODZuTU1nV0RMT2dmMVBzMzBCaWQ4RU04Y2M2Q2o4TjEwMGtEMFZwVFhPZlJ4eEhwWmJQU0JNZ1JzeGxFVmxaQ2R0bklsbVZmUkE9PSJ9XSwiUXVldWVVcmwiOiJodHRwczovL3Nxcy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS80NTY3NTI2NjU1NzYvU1FTVG9waWNOYWNrLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:15 GMT" ], "X-Amzn-Requestid": [ "3d501264-b0f3-5916-9d10-7052a9f0179b" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "455ef11f8b1106c4", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "536" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQjRTTWlqNE80NjVDcm9HZXVFdDVqdVpNVmFIUE9FRURCeURhS3F0RXJ2eW53Y3BnQk5kOGV5OU1hY29tSmo4Szljalh1NnVqcVBrRldGcEhKa0d6SG54eXV6N2s1czBYQll1Smo0OXhaZXZkK3NhRHEweG5uVDYxUTJ0d3pZZlU5VGFsZ0hqcTdmMnlQSGRYQVhuUUdvYU9DU3htQTN4WTBUMmtVeUhWTXNJVG1FNDNHVGI3dkRpRWk3aWt5TEVvRkU4ZHVVbStvVUJBK0JxaHJTUW42cGU1V08vekJlM3dUZkkweGdXekROUCtTNXROS2Ivb1hGZ3dhSURvTFgvOVlqUU95N21DNWtKcEt2RjdrZHNZVWFrSHEwc29ZbFgvRlBjN0RkMnNxZEwxWUFFRk5RUWlTQ04zaFNrVEhvRThXMEVLTkpnNVd4NjRrcEdtMWp4TWJyK2w1RFRrUCtXL0xyaFloc2lGbk5IWGpERjYvRHBhOE9GSHFhSUZXYkVKWGFyeklDY21XNXZiKzRISTFib1lWdXc9PSJ9XSwiUXVldWVVcmwiOiJodHRwczovL3Nxcy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS80NTY3NTI2NjU1NzYvU1FTVG9waWNOYWNrLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:15 GMT" ], "X-Amzn-Requestid": [ "24ab650a-ac2a-58bb-b3b5-073cb5292636" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "cb6a1b5aaa136ac1", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "82" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY05hY2stdG9wLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:15 GMT" ], "X-Amzn-Requestid": [ "02c2d06e-5658-5f4f-be30-b2584f5b61c2" ] }, "Body": "" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSQSTopic/TestNonExistentSubscriptionSucceedsOnOpenButFailsOnReceive.replay ================================================ { "Initial": "AQAAAA7hTg2/M7W25gAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "7a266869a7878726", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "165" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vdXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vNDU2NzUyNjY1NTc2L25vbmV4aXN0ZW50LXN1YnNjcmlwdGlvbiJ9" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "96" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:12 GMT" ], "X-Amzn-Query-Error": [ "AWS.SimpleQueueService.NonExistentQueue;Sender" ], "X-Amzn-Requestid": [ "f1b69d67-48ab-5ebd-a47f-ff5151abd4b0" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLnNxcyNRdWV1ZURvZXNOb3RFeGlzdCIsIm1lc3NhZ2UiOiJUaGUgc3BlY2lmaWVkIHF1ZXVlIGRvZXMgbm90IGV4aXN0LiJ9" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSQSTopic/TestNonExistentTopicSucceedsOnOpenButFailsOnSend.replay ================================================ { "Initial": "AQAAAA7hTg3GHDYPNgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "8d136fd05dde4141", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "117" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SendMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJNZXNzYWdlQm9keSI6IiJ9XSwiUXVldWVVcmwiOiJodHRwczovL3VzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9ub25leGlzdGVudC1xdWV1ZSJ9" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "96" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:18 GMT" ], "X-Amzn-Query-Error": [ "AWS.SimpleQueueService.NonExistentQueue;Sender" ], "X-Amzn-Requestid": [ "892a955b-89f2-506e-a9a1-f76d90f439a5" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uYXdzLnNxcyNRdWV1ZURvZXNOb3RFeGlzdCIsIm1lc3NhZ2UiOiJUaGUgc3BlY2lmaWVkIHF1ZXVlIGRvZXMgbm90IGV4aXN0LiJ9" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSQSTopic/TestNonUTF8MessageBody.replay ================================================ { "Initial": "AQAAAA7hTg3ACNEirQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "17a36399132addfc", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "48" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTUVNUb3BpY05vblVURjhNZXNzYWdlQm9keS10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "96" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:12 GMT" ], "X-Amzn-Requestid": [ "7cffc640-67e6-52d9-b89d-a4767ee6b6d5" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY05vblVURjhNZXNzYWdlQm9keS10b3AtMSJ9" } }, { "ID": "d78eee0b791c1deb", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "126" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY05vblVURjhNZXNzYWdlQm9keS10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "97" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:12 GMT" ], "X-Amzn-Requestid": [ "44178069-ff22-59ff-9818-e25fe6227df3" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTUVNUb3BpY05vblVURjhNZXNzYWdlQm9keS10b3AtMSJ9fQ==" } }, { "ID": "bde40e839a476a70", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "478" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNRU1RvcGljTm9uVVRGOE1lc3NhZ2VCb2R5LXRvcC0xXCJcblx0XHR9XG5cdFx0XVxuXHRcdH0ifSwiUXVldWVVcmwiOiJodHRwczovL3Nxcy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS80NTY3NTI2NjU1NzYvU1FTVG9waWNOb25VVEY4TWVzc2FnZUJvZHktdG9wLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:12 GMT" ], "X-Amzn-Requestid": [ "fe48fe3d-329c-5dc6-a79b-9c0b2b9cf9ca" ] }, "Body": "" } }, { "ID": "07159f8ffdb814e5", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "497" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SendMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJDTEVBUkVE" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "192" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:12 GMT" ], "X-Amzn-Requestid": [ "365423a0-370b-57cb-9074-41962e0b33c7" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAiLCJNRDVPZk1lc3NhZ2VBdHRyaWJ1dGVzIjoiZDk2Mjk2YWM2NzdhOWFjYTA1ZDQ5YWUwOTljNjU2YzAiLCJNRDVPZk1lc3NhZ2VCb2R5IjoiMDBhYjg5OTZlODAxMWE3YTE0ZmI2ZmI5YWQ4M2M4MjAiLCJNZXNzYWdlSWQiOiJkZjBjMWJlNS00ZWE2LTQ5MjAtYTJhOS0xZTU3YzQ0YWUxN2MifV19" } }, { "ID": "04c3936af6bda3dd", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "177" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY05vblVURjhNZXNzYWdlQm9keS10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1159" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:12 GMT" ], "X-Amzn-Requestid": [ "0df4a0b5-96c1-5578-93c9-c2838fc15174" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFJREFXVVdFVVNQVUlHQkxPNEdKRCIsIkFwcHJveGltYXRlRmlyc3RSZWNlaXZlVGltZXN0YW1wIjoiMTc3MzkzNDI3Mjc3MyIsIkFwcHJveGltYXRlUmVjZWl2ZUNvdW50IjoiMSIsIlNlbnRUaW1lc3RhbXAiOiIxNzczOTM0MjcyNjQxIn0sIkJvZHkiOiJBQUVDQXdRRkJnY0lDUW9MREEwT0R4QVJFaE1VRlJZWEdCa2FHeHdkSGg4Z0lTSWpKQ1VtSnlncEtpc3NMUzR2T2pzOFBUNC9RRnRjWFY1ZllIdDhmWDUvWm05dlhHSmhjbHhpWVhvdUxseG1iMjljTGk1Y1ltRnlYQzR1WEM0dVhHSmhlaTR1WEM0dUwyWnZieTh1TGk5aVlYSXZMaTR2TGk0dlltRjZMaTR2Wm05dkwySmhjaTlpWVhwbWIyOGlZbUZ5SW1KaGVpNHVYR1p2YjF4Y1ltRnlYRnhjWW1GNlptOXZMeTlpWVhJdkx5OWlZWHBtYjI4Z1ltRnlJR0poZWpFeU16UTE0cGk2NHBpNjRwaTZ2Ykk9IiwiTUQ1T2ZCb2R5IjoiMDBhYjg5OTZlODAxMWE3YTE0ZmI2ZmI5YWQ4M2M4MjAiLCJNRDVPZk1lc3NhZ2VBdHRyaWJ1dGVzIjoiZDk2Mjk2YWM2NzdhOWFjYTA1ZDQ5YWUwOTljNjU2YzAiLCJNZXNzYWdlQXR0cmlidXRlcyI6eyJiYXNlNjRlbmNvZGVkIjp7IkRhdGFUeXBlIjoiU3RyaW5nIiwiU3RyaW5nVmFsdWUiOiJ0cnVlIn19LCJNZXNzYWdlSWQiOiJkZjBjMWJlNS00ZWE2LTQ5MjAtYTJhOS0xZTU3YzQ0YWUxN2MiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQmtrSEJrUDB3aUs3d0huT3o0N0VUS0IvWjFhcE9LYlRqVVVKZ1pRaGRsTDNaUlNCYjg1bTF3NTRYWERZd1BEeWRDVXRYSXBuUHJyZHVOYmlZaEtQQXVtTyt2MVFsL3ZQcFliUFZERUhqV0szcXdPL2o5bTJ1aFNGN3E1ODlLenN4Vk5QeUpxQVlzK0ZpRGF1a1F6blUxN3Q1MmVUNVVUYWl6TXFNUlYyVW8rbTBoTjl6YTZ5NTNIT0FQUWQ0Vm51YWw2MXRqK3BmTGlSNGo3VnVYaFJFWHFUeHRlQU9vTW43YmJjTmUxUy9ZRG5GdnNUeEgxZFkzRktoamJTR3hvYngzZUFtYnBTVVQ5SnprQURmTEhCdkVqQ1dqSDZpU3dSb3liVnJwQlpjejFYRW1va01LNzhCeG4yWjNGY2JPczgzWnZ4aVpvVHg4cWxBWVpQc2xuVGUyRkpMQlVZVUc2eVBwWXF6V01NNWg5eC9Vb3I0dmZMeFFFZXYwUzVtVFNKLzZicHg4TFBsR0ZCRWZrYzdvMHJkYVQyYW9MNVVIamF5R0h1VHljT2dPQjg9In1dfQ==" } }, { "ID": "4c820f1caf05fc5a", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "570" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQmtrSEJrUDB3aUs3d0huT3o0N0VUS0IvWjFhcE9LYlRqVVVKZ1pRaGRsTDNaUlNCYjg1bTF3NTRYWERZd1BEeWRDVXRYSXBuUHJyZHVOYmlZaEtQQXVtTyt2MVFsL3ZQcFliUFZERUhqV0szcXdPL2o5bTJ1aFNGN3E1ODlLenN4Vk5QeUpxQVlzK0ZpRGF1a1F6blUxN3Q1MmVUNVVUYWl6TXFNUlYyVW8rbTBoTjl6YTZ5NTNIT0FQUWQ0Vm51YWw2MXRqK3BmTGlSNGo3VnVYaFJFWHFUeHRlQU9vTW43YmJjTmUxUy9ZRG5GdnNUeEgxZFkzRktoamJTR3hvYngzZUFtYnBTVVQ5SnprQURmTEhCdkVqQ1dqSDZpU3dSb3liVnJwQlpjejFYRW1va01LNzhCeG4yWjNGY2JPczgzWnZ4aVpvVHg4cWxBWVpQc2xuVGUyRkpMQlVZVUc2eVBwWXF6V01NNWg5eC9Vb3I0dmZMeFFFZXYwUzVtVFNKLzZicHg4TFBsR0ZCRWZrYzdvMHJkYVQyYW9MNVVIamF5R0h1VHljT2dPQjg9In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY05vblVURjhNZXNzYWdlQm9keS10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:12 GMT" ], "X-Amzn-Requestid": [ "4aa043c2-acc2-5a23-ab38-21f4b5c2ee2f" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "f8ca6465114b9e8b", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "96" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY05vblVURjhNZXNzYWdlQm9keS10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:12 GMT" ], "X-Amzn-Requestid": [ "31599af9-2c62-5d83-be74-f8cf3562598f" ] }, "Body": "" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSQSTopic/TestSendReceive.replay ================================================ { "Initial": "AQAAAA7hTg3HLZszuQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "f4065286be68aca0", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "41" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTUVNUb3BpY1NlbmRSZWNlaXZlLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "89" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:20 GMT" ], "X-Amzn-Requestid": [ "ea6ea9d0-85d3-585f-9483-cbe69cd4e910" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY1NlbmRSZWNlaXZlLXRvcC0xIn0=" } }, { "ID": "a6d9dbcd664c410e", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "119" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY1NlbmRSZWNlaXZlLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "90" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:20 GMT" ], "X-Amzn-Requestid": [ "9b7455d6-7136-5c30-8c8a-37e0683eed7f" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTUVNUb3BpY1NlbmRSZWNlaXZlLXRvcC0xIn19" } }, { "ID": "aae8d89e361562c6", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "464" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNRU1RvcGljU2VuZFJlY2VpdmUtdG9wLTFcIlxuXHRcdH1cblx0XHRdXG5cdFx0fSJ9LCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY1NlbmRSZWNlaXZlLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:20 GMT" ], "X-Amzn-Requestid": [ "4635f06a-fc91-5f18-a809-925ce599be57" ] }, "Body": "" } }, { "ID": "faac55fe768d189f", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "196" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SendMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJDTEVBUkVE" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "192" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:20 GMT" ], "X-Amzn-Requestid": [ "66af09c5-7c9d-5073-a51d-6bf36595213c" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAiLCJNRDVPZk1lc3NhZ2VBdHRyaWJ1dGVzIjoiOWFhNDY4N2M4Yjc1NjdiYWEzODBkOWYzMDBmZTI4M2EiLCJNRDVPZk1lc3NhZ2VCb2R5IjoiY2ZjZDIwODQ5NWQ1NjVlZjY2ZTdkZmY5Zjk4NzY0ZGEiLCJNZXNzYWdlSWQiOiI1ZDhhNDQ4MC03NGFmLTQ3NmQtOWExZi0zMDhiZjFiYTkyYmUifV19" } }, { "ID": "ca4cfe9bf1bbce73", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "196" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SendMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJDTEVBUkVE" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "192" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:20 GMT" ], "X-Amzn-Requestid": [ "576b12ef-4726-53c3-a51a-70d95e2e428c" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAiLCJNRDVPZk1lc3NhZ2VBdHRyaWJ1dGVzIjoiMzE0Yzc3YjI0OTg5M2M2YjNjNzY1YTQyY2MwOGIyNDUiLCJNRDVPZk1lc3NhZ2VCb2R5IjoiYzRjYTQyMzhhMGI5MjM4MjBkY2M1MDlhNmY3NTg0OWIiLCJNZXNzYWdlSWQiOiJhMWFhNzBlNy1mZjI3LTRmNzAtYTlkNC1iN2U2MmJjZGJjNTkifV19" } }, { "ID": "4329a0c165485f35", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "196" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SendMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJDTEVBUkVE" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "192" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:20 GMT" ], "X-Amzn-Requestid": [ "a0104016-a5b8-5c8f-9d7a-2220bcb01dc0" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAiLCJNRDVPZk1lc3NhZ2VBdHRyaWJ1dGVzIjoiYjcyZTE0MGU3MjY5ZWJjZTkxMDdiYWYxZWYyNDBiYWUiLCJNRDVPZk1lc3NhZ2VCb2R5IjoiYzgxZTcyOGQ5ZDRjMmY2MzZmMDY3Zjg5Y2MxNDg2MmMiLCJNZXNzYWdlSWQiOiJjZGJlOWM5NS02NzZkLTQzMGYtOTVjMC1lYTI4MTMxNWEyYzEifV19" } }, { "ID": "0f05c412cb42d1df", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "170" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY1NlbmRSZWNlaXZlLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "865" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:20 GMT" ], "X-Amzn-Requestid": [ "49d1696c-d173-5720-8fa6-0b5ac87be66f" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFJREFXVVdFVVNQVUlHQkxPNEdKRCIsIkFwcHJveGltYXRlRmlyc3RSZWNlaXZlVGltZXN0YW1wIjoiMTc3MzkzNDI4MDQ3NiIsIkFwcHJveGltYXRlUmVjZWl2ZUNvdW50IjoiMSIsIlNlbnRUaW1lc3RhbXAiOiIxNzczOTM0MjgwNDAzIn0sIkJvZHkiOiIyIiwiTUQ1T2ZCb2R5IjoiYzgxZTcyOGQ5ZDRjMmY2MzZmMDY3Zjg5Y2MxNDg2MmMiLCJNRDVPZk1lc3NhZ2VBdHRyaWJ1dGVzIjoiYjcyZTE0MGU3MjY5ZWJjZTkxMDdiYWYxZWYyNDBiYWUiLCJNZXNzYWdlQXR0cmlidXRlcyI6eyJhIjp7IkRhdGFUeXBlIjoiU3RyaW5nIiwiU3RyaW5nVmFsdWUiOiIyIn19LCJNZXNzYWdlSWQiOiJjZGJlOWM5NS02NzZkLTQzMGYtOTVjMC1lYTI4MTMxNWEyYzEiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQkdCZmhsR2VXNXlqcTc2YjRXUnJTd1lVZlQxZjJmbHhGZVIvMlpGWFdMclRsK0N5UzdZL1hlOXlnc3dubVdGRk8vaUp3MWRHUHFlRFBDc0JKVUh6Rmg0ZHNmanZqb01QeEh2bmdpMFZtL2F4VzZrY252U1E2ZnlCc2FsZVMxUWJPaG9rMVBZNEt6SFd5WjRxd0R4WVZMS3ovR3h0cGp0Sk5iVVc5UktLZEN0UTFiQkw1bCt1NGtRaHhBR3BDMTQ1MTRCZ210bEZmekFERkd1K25YWGlTUmtPVGNVNDBMcEFRd1lWMmZhR1JkUmF1YWtrSzNCS3BuaHVWY1hBdVNHVGVReHRBL01HQmFiRzQ5bmlSSExwdHZlM1k5OXJVU0lTSTBvT014RzRaS1BDa2JYVzZxTTh3MG1vTVliMzdORmUvV1JLYVZxSGNpM0tzdVpEVjYzbzdmVUNwbjEvcGFxdkZhYlcydHFUNVdzUjJzRnhNYUsydXJkYTdmSE8rU2hocytKNTVnVUlLZnpMR0haaHJ1aEtWOXA4T21OMWtxZGRyREhlWW9XckRNTXc9In1dfQ==" } }, { "ID": "9edba1aa220d5c6d", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "170" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY1NlbmRSZWNlaXZlLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "865" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:20 GMT" ], "X-Amzn-Requestid": [ "0667b1eb-f846-5eab-95d5-d3dde14edfe4" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFJREFXVVdFVVNQVUlHQkxPNEdKRCIsIkFwcHJveGltYXRlRmlyc3RSZWNlaXZlVGltZXN0YW1wIjoiMTc3MzkzNDI4MDU0NCIsIkFwcHJveGltYXRlUmVjZWl2ZUNvdW50IjoiMSIsIlNlbnRUaW1lc3RhbXAiOiIxNzczOTM0MjgwMjYxIn0sIkJvZHkiOiIwIiwiTUQ1T2ZCb2R5IjoiY2ZjZDIwODQ5NWQ1NjVlZjY2ZTdkZmY5Zjk4NzY0ZGEiLCJNRDVPZk1lc3NhZ2VBdHRyaWJ1dGVzIjoiOWFhNDY4N2M4Yjc1NjdiYWEzODBkOWYzMDBmZTI4M2EiLCJNZXNzYWdlQXR0cmlidXRlcyI6eyJhIjp7IkRhdGFUeXBlIjoiU3RyaW5nIiwiU3RyaW5nVmFsdWUiOiIwIn19LCJNZXNzYWdlSWQiOiI1ZDhhNDQ4MC03NGFmLTQ3NmQtOWExZi0zMDhiZjFiYTkyYmUiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQm15ckpBMUxvL2RFeTZGdE9nRUYwbjF0cDRVcTlHd3NzMGI1TmhuMkx0eUs2cDNJbzE1M3BLQTdXb0taSENjTVFLUjdDa3VMNmYveGVFbWZhTEdYVWNoRE1YL0pKaW5VSFZOdmNoLzh5SGVvRi9xT2FvaEJWLzQxdmJTbjdNSVZRWmxTdFlvcjlSRFkzcHJJQnhoZ2E2ZDRxZVRXalYzd2F0a2lkZWRyQmdFcEprWDZxcXZmd3d4c3pQeU1DTmZ1Z2lLZjdYcG1yb1NqQXl3UEVUTDcwWWRjUUVBZUJhZmNlNS83TG9SVGNCVlliNXNGemRQc2NZVWxEQy9IZEZwSllUUk9BWWlsY2lvUjM4eVVLYkN4aStLdDFkYVZKTk1PMUxoUEE3NGd6TGI2bXB6dElzVlAxZjBxYVVhemhzOTQ5NGVFWTlPN0dnSko4NnZjODFkNGRTZ1doVkVNbnZOT2lhOThxb0U4OXJCeElYaUNtWWk4cGdCdC9KU3NtKy9kdlRkNGFkT0ZrOHRSaUlFNXc0cDJmM2YwdmVrWWpwb0czdE5rc2RINkFxWGc9In1dfQ==" } }, { "ID": "d84e3aa95b17d1b1", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "563" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQkdCZmhsR2VXNXlqcTc2YjRXUnJTd1lVZlQxZjJmbHhGZVIvMlpGWFdMclRsK0N5UzdZL1hlOXlnc3dubVdGRk8vaUp3MWRHUHFlRFBDc0JKVUh6Rmg0ZHNmanZqb01QeEh2bmdpMFZtL2F4VzZrY252U1E2ZnlCc2FsZVMxUWJPaG9rMVBZNEt6SFd5WjRxd0R4WVZMS3ovR3h0cGp0Sk5iVVc5UktLZEN0UTFiQkw1bCt1NGtRaHhBR3BDMTQ1MTRCZ210bEZmekFERkd1K25YWGlTUmtPVGNVNDBMcEFRd1lWMmZhR1JkUmF1YWtrSzNCS3BuaHVWY1hBdVNHVGVReHRBL01HQmFiRzQ5bmlSSExwdHZlM1k5OXJVU0lTSTBvT014RzRaS1BDa2JYVzZxTTh3MG1vTVliMzdORmUvV1JLYVZxSGNpM0tzdVpEVjYzbzdmVUNwbjEvcGFxdkZhYlcydHFUNVdzUjJzRnhNYUsydXJkYTdmSE8rU2hocytKNTVnVUlLZnpMR0haaHJ1aEtWOXA4T21OMWtxZGRyREhlWW9XckRNTXc9In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY1NlbmRSZWNlaXZlLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:20 GMT" ], "X-Amzn-Requestid": [ "ce5a6421-53bb-5bc1-9ddd-06174ab3da8e" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "d5504c90a3e7900d", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "170" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY1NlbmRSZWNlaXZlLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "865" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:20 GMT" ], "X-Amzn-Requestid": [ "3cd6f17b-b04a-58d4-a0e8-934da942099b" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFJREFXVVdFVVNQVUlHQkxPNEdKRCIsIkFwcHJveGltYXRlRmlyc3RSZWNlaXZlVGltZXN0YW1wIjoiMTc3MzkzNDI4MDY3OSIsIkFwcHJveGltYXRlUmVjZWl2ZUNvdW50IjoiMSIsIlNlbnRUaW1lc3RhbXAiOiIxNzczOTM0MjgwMzM1In0sIkJvZHkiOiIxIiwiTUQ1T2ZCb2R5IjoiYzRjYTQyMzhhMGI5MjM4MjBkY2M1MDlhNmY3NTg0OWIiLCJNRDVPZk1lc3NhZ2VBdHRyaWJ1dGVzIjoiMzE0Yzc3YjI0OTg5M2M2YjNjNzY1YTQyY2MwOGIyNDUiLCJNZXNzYWdlQXR0cmlidXRlcyI6eyJhIjp7IkRhdGFUeXBlIjoiU3RyaW5nIiwiU3RyaW5nVmFsdWUiOiIxIn19LCJNZXNzYWdlSWQiOiJhMWFhNzBlNy1mZjI3LTRmNzAtYTlkNC1iN2U2MmJjZGJjNTkiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQlh6UDh3ck9LZi80b29QbTBsVGRYV0pPQlV1Rjd4Z1dJMU5vbFBsSzdLaGs1TmhEdzVsc3lFY3ZvbG5wWWw5d3VkQlNPbWZ2NnduUXpmZEorc3JSdzhjRUE2V0k5cVlsY3duTlIzQjV2TmU5WTRZdllMYUJFcHVGYnM5eVZKeHphWXJoaUhXR1RmblJENFhPaURwZGtXQk00Mkg4SFlaMEJ6cktERnRVejVvN1I3dXFMcWpEdi9pQW5PTDMrVjc5TjRuQzd1akUvMlZBS3M2am85ZVB5RkpWaW56aFo2S2ZQZnN4eXgrR2c5QXZxTnFTVTk3R2Mvd3VkNzdoVnJ0WGdJSlZyWFhacGdxMTE5WDZLbXBYWWtPcWt2YlFnOTZ0eW14V1hPaXdJWG1uTzJYcGhRR3lFWlREZWhLbnQ3VG9rN1FUVE8vMURRajlTRXQwMkdWNzgxMkh2MXFpSytKT1NzRTlEMEptK05hRVozR1F2UVVybDZWQnNUZnpXZzRnZksrdWR0RGEvMkVJK0FrZ214elk1dk5XMDdGclJVbzhTNVlIeVdkQW03Z0E9In1dfQ==" } }, { "ID": "c3e1cb65abc8a36d", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "563" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQm15ckpBMUxvL2RFeTZGdE9nRUYwbjF0cDRVcTlHd3NzMGI1TmhuMkx0eUs2cDNJbzE1M3BLQTdXb0taSENjTVFLUjdDa3VMNmYveGVFbWZhTEdYVWNoRE1YL0pKaW5VSFZOdmNoLzh5SGVvRi9xT2FvaEJWLzQxdmJTbjdNSVZRWmxTdFlvcjlSRFkzcHJJQnhoZ2E2ZDRxZVRXalYzd2F0a2lkZWRyQmdFcEprWDZxcXZmd3d4c3pQeU1DTmZ1Z2lLZjdYcG1yb1NqQXl3UEVUTDcwWWRjUUVBZUJhZmNlNS83TG9SVGNCVlliNXNGemRQc2NZVWxEQy9IZEZwSllUUk9BWWlsY2lvUjM4eVVLYkN4aStLdDFkYVZKTk1PMUxoUEE3NGd6TGI2bXB6dElzVlAxZjBxYVVhemhzOTQ5NGVFWTlPN0dnSko4NnZjODFkNGRTZ1doVkVNbnZOT2lhOThxb0U4OXJCeElYaUNtWWk4cGdCdC9KU3NtKy9kdlRkNGFkT0ZrOHRSaUlFNXc0cDJmM2YwdmVrWWpwb0czdE5rc2RINkFxWGc9In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY1NlbmRSZWNlaXZlLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:20 GMT" ], "X-Amzn-Requestid": [ "d1fc1505-afac-5f2f-a2bf-7733b6a4cdff" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "df4455d6d742fcd3", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "563" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQlh6UDh3ck9LZi80b29QbTBsVGRYV0pPQlV1Rjd4Z1dJMU5vbFBsSzdLaGs1TmhEdzVsc3lFY3ZvbG5wWWw5d3VkQlNPbWZ2NnduUXpmZEorc3JSdzhjRUE2V0k5cVlsY3duTlIzQjV2TmU5WTRZdllMYUJFcHVGYnM5eVZKeHphWXJoaUhXR1RmblJENFhPaURwZGtXQk00Mkg4SFlaMEJ6cktERnRVejVvN1I3dXFMcWpEdi9pQW5PTDMrVjc5TjRuQzd1akUvMlZBS3M2am85ZVB5RkpWaW56aFo2S2ZQZnN4eXgrR2c5QXZxTnFTVTk3R2Mvd3VkNzdoVnJ0WGdJSlZyWFhacGdxMTE5WDZLbXBYWWtPcWt2YlFnOTZ0eW14V1hPaXdJWG1uTzJYcGhRR3lFWlREZWhLbnQ3VG9rN1FUVE8vMURRajlTRXQwMkdWNzgxMkh2MXFpSytKT1NzRTlEMEptK05hRVozR1F2UVVybDZWQnNUZnpXZzRnZksrdWR0RGEvMkVJK0FrZ214elk1dk5XMDdGclJVbzhTNVlIeVdkQW03Z0E9In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY1NlbmRSZWNlaXZlLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:20 GMT" ], "X-Amzn-Requestid": [ "393aa75e-7160-58d7-84c6-c56868683a9a" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "ea5dffc73fc5b6c3", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "89" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY1NlbmRSZWNlaXZlLXRvcC0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:20 GMT" ], "X-Amzn-Requestid": [ "5f65f14d-35bb-53cf-8060-937b2cb394f6" ] }, "Body": "" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSQSTopic/TestSendReceiveJSON.replay ================================================ { "Initial": "AQAAAA7hTg3AOfzzUAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "4ecd9970fa766a8a", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "45" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJTUVNUb3BpY1NlbmRSZWNlaXZlSlNPTi10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "93" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:13 GMT" ], "X-Amzn-Requestid": [ "a9a1088c-3d90-5f9c-84a3-6aba24916897" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY1NlbmRSZWNlaXZlSlNPTi10b3AtMSJ9" } }, { "ID": "691529342c58d3e8", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "123" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY1NlbmRSZWNlaXZlSlNPTi10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "94" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:13 GMT" ], "X-Amzn-Requestid": [ "921fc8eb-93c8-5943-9494-aadd8ac99e48" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpTUVNUb3BpY1NlbmRSZWNlaXZlSlNPTi10b3AtMSJ9fQ==" } }, { "ID": "d4c956504ffafab9", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "472" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlNRU1RvcGljU2VuZFJlY2VpdmVKU09OLXRvcC0xXCJcblx0XHR9XG5cdFx0XVxuXHRcdH0ifSwiUXVldWVVcmwiOiJodHRwczovL3Nxcy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS80NTY3NTI2NjU1NzYvU1FTVG9waWNTZW5kUmVjZWl2ZUpTT04tdG9wLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:13 GMT" ], "X-Amzn-Requestid": [ "aa135d88-1881-58b2-bb67-3fbe01809fb9" ] }, "Body": "" } }, { "ID": "376fdaf7a3d9c1ee", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "151" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SendMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJNZXNzYWdlQm9keSI6IntcIkZvb1wiOiBcIkJhclwifSJ9XSwiUXVldWVVcmwiOiJodHRwczovL3Nxcy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS80NTY3NTI2NjU1NzYvU1FTVG9waWNTZW5kUmVjZWl2ZUpTT04tdG9wLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "132" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:13 GMT" ], "X-Amzn-Requestid": [ "51552e2f-44d1-5fc9-89fd-4c195dd0a8c2" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAiLCJNRDVPZk1lc3NhZ2VCb2R5IjoiMzMzMzk5YmEyYjc2YTE5NjQzMjYwN2YyM2IzZWNiOTUiLCJNZXNzYWdlSWQiOiI3MzliNDc0Yi1lM2JkLTQ4ODgtODE3Ny1lNTA1NmEzNDY2ZGEifV19" } }, { "ID": "e1565b8f7072d13f", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "174" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY1NlbmRSZWNlaXZlSlNPTi10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "756" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:13 GMT" ], "X-Amzn-Requestid": [ "1df2ea43-b2c8-5d95-9edc-8875abc9da9e" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFJREFXVVdFVVNQVUlHQkxPNEdKRCIsIkFwcHJveGltYXRlRmlyc3RSZWNlaXZlVGltZXN0YW1wIjoiMTc3MzkzNDI3MzU0OSIsIkFwcHJveGltYXRlUmVjZWl2ZUNvdW50IjoiMSIsIlNlbnRUaW1lc3RhbXAiOiIxNzczOTM0MjczNDcxIn0sIkJvZHkiOiJ7XCJGb29cIjogXCJCYXJcIn0iLCJNRDVPZkJvZHkiOiIzMzMzOTliYTJiNzZhMTk2NDMyNjA3ZjIzYjNlY2I5NSIsIk1lc3NhZ2VJZCI6IjczOWI0NzRiLWUzYmQtNDg4OC04MTc3LWU1MDU2YTM0NjZkYSIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCNVZac0w3OERoSTNYMkhSYzJJT2hUa0t0anNNY1BmUEhLUUNvREJUMUZGWE1QaWJOYUhGVGZ4L1lnVjZTTVdFT0s1VW9zSFVXOG52Y3RvSy8rZ3BIWlhPNEtKUDF2a3dxZCtjaGJEcG1wYzhoQVJqSnpUaHJtbVVGQldQaUpaQldHTlN4dUFYcmx6N0oyZU9jYzJPdE1lQ0JQQ2JwMFdzSzZxYk1CKzh3Q0YzSVgvUFRnMDVKc3Y2bVFGR2FLTEtzK0Y3MHlTOThpSGVjb1M0OUEwZDk4eGJPMmNzbXVNTjZ6QUs0U0xlN0lUd0lBVWx1aGFESU1lb1BUR3NlSGJxVzBZRlFMcFVnZkE2Q0dKZW5Lc3JMMmYzbERrckRXRU5laDhML2tDK3labUhHbkg2emZ6RDVCNFNYbU9OTzRLWUVxdVJOdUh1aWgwQTA3cjFoSm5VcFRtZk5nVU0xcUc2b0FURm1qRUk4ZjlXNEJocCtjRFFRYUlmem15bTZENHFBYitrQzFmV1pIaXFPQ1hXcXNzbmNEU3doYzVURWVPK0ZVeE9ETmc4RTlTaz0ifV19" } }, { "ID": "53f077122f7f99fe", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "567" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQjVWWnNMNzhEaEkzWDJIUmMySU9oVGtLdGpzTWNQZlBIS1FDb0RCVDFGRlhNUGliTmFIRlRmeC9ZZ1Y2U01XRU9LNVVvc0hVVzhudmN0b0svK2dwSFpYTzRLSlAxdmt3cWQrY2hiRHBtcGM4aEFSakp6VGhybW1VRkJXUGlKWkJXR05TeHVBWHJsejdKMmVPY2MyT3RNZUNCUENicDBXc0s2cWJNQis4d0NGM0lYL1BUZzA1SnN2Nm1RRkdhS0xLcytGNzB5Uzk4aUhlY29TNDlBMGQ5OHhiTzJjc211TU42ekFLNFNMZTdJVHdJQVVsdWhhRElNZW9QVEdzZUhicVcwWUZRTHBVZ2ZBNkNHSmVuS3NyTDJmM2xEa3JEV0VOZWg4TC9rQyt5Wm1IR25INnpmekQ1QjRTWG1PTk80S1lFcXVSTnVIdWloMEEwN3IxaEpuVXBUbWZOZ1VNMXFHNm9BVEZtakVJOGY5VzRCaHArY0RRUWFJZnpteW02RDRxQWIra0MxZldaSGlxT0NYV3Fzc25jRFN3aGM1VEVlTytGVXhPRE5nOEU5U2s9In1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY1NlbmRSZWNlaXZlSlNPTi10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:13 GMT" ], "X-Amzn-Requestid": [ "d0d481e9-4732-51c2-8012-e3df5e3396c9" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "98d5d17309d15f7d", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "93" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9TUVNUb3BpY1NlbmRSZWNlaXZlSlNPTi10b3AtMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:13 GMT" ], "X-Amzn-Requestid": [ "40b04a59-aa8f-5902-a17d-286fb38eae09" ] }, "Body": "" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestConformanceSQSTopic/TestSendReceiveTwo.replay ================================================ { "Initial": "AQAAAA7hTg3IOp6lVwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": null } ================================================ FILE: pubsub/awssnssqs/testdata/TestFIFO/TestSNSTopic/TestSendReceiveInvalidNoDeduplicationID.replay ================================================ { "Initial": "AQAAAA7hTg3QNc1tXAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "bb2f87fc98498210", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "173" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPUNyZWF0ZVRvcGljJkF0dHJpYnV0ZXMuZW50cnkuMS5rZXk9Rmlmb1RvcGljJkF0dHJpYnV0ZXMuZW50cnkuMS52YWx1ZT10cnVlJk5hbWU9VGVzdEZJRk9TTlNUb3BpY19UZXN0U2VuZFJlY2VpdmVJbnZhbGlkTm9EZWR1cGxpY2F0aW9uSUQtdG9wLTEuZmlmbyZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "374" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:29 GMT" ], "X-Amzn-Requestid": [ "6a304da2-4b26-5ba1-a790-2f945237936d" ] }, "Body": "PENyZWF0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxDcmVhdGVUb3BpY1Jlc3VsdD4KICAgIDxUb3BpY0Fybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlRlc3RGSUZPU05TVG9waWNfVGVzdFNlbmRSZWNlaXZlSW52YWxpZE5vRGVkdXBsaWNhdGlvbklELXRvcC0xLmZpZm88L1RvcGljQXJuPgogIDwvQ3JlYXRlVG9waWNSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPjZhMzA0ZGEyLTRiMjYtNWJhMS1hNzkwLTJmOTQ1MjM3OTM2ZDwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9DcmVhdGVUb3BpY1Jlc3BvbnNlPgo=" } }, { "ID": "2bc777278117b304", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "78" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJUZXN0RklGT1NOU1RvcGljX1Rlc3RTZW5kUmVjZWl2ZUludmFsaWROb0RlZHVwbGljYXRpb25JRC1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "126" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:29 GMT" ], "X-Amzn-Requestid": [ "cefe4576-648a-5cb5-aae9-27407d9b79a6" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9UZXN0RklGT1NOU1RvcGljX1Rlc3RTZW5kUmVjZWl2ZUludmFsaWROb0RlZHVwbGljYXRpb25JRC1zdWItMSJ9" } }, { "ID": "935865f5ac06a7de", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "156" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9UZXN0RklGT1NOU1RvcGljX1Rlc3RTZW5kUmVjZWl2ZUludmFsaWROb0RlZHVwbGljYXRpb25JRC1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "127" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:29 GMT" ], "X-Amzn-Requestid": [ "debb9070-33c2-5f41-b917-f2462ad34a52" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpUZXN0RklGT1NOU1RvcGljX1Rlc3RTZW5kUmVjZWl2ZUludmFsaWROb0RlZHVwbGljYXRpb25JRC1zdWItMSJ9fQ==" } }, { "ID": "90bbfca81abe4275", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "538" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlRlc3RGSUZPU05TVG9waWNfVGVzdFNlbmRSZWNlaXZlSW52YWxpZE5vRGVkdXBsaWNhdGlvbklELXN1Yi0xXCJcblx0XHR9XG5cdFx0XVxuXHRcdH0ifSwiUXVldWVVcmwiOiJodHRwczovL3Nxcy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS80NTY3NTI2NjU1NzYvVGVzdEZJRk9TTlNUb3BpY19UZXN0U2VuZFJlY2VpdmVJbnZhbGlkTm9EZWR1cGxpY2F0aW9uSUQtc3ViLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:29 GMT" ], "X-Amzn-Requestid": [ "71530136-846f-5376-acd4-63009d7e3665" ] }, "Body": "" } }, { "ID": "93f84e4ebd9e9478", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "287" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVN1YnNjcmliZSZFbmRwb2ludD1hcm4lM0Fhd3MlM0FzcXMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FUZXN0RklGT1NOU1RvcGljX1Rlc3RTZW5kUmVjZWl2ZUludmFsaWROb0RlZHVwbGljYXRpb25JRC1zdWItMSZQcm90b2NvbD1zcXMmVG9waWNBcm49YXJuJTNBYXdzJTNBc25zJTNBdXMtZWFzdC0yJTNBNDU2NzUyNjY1NTc2JTNBVGVzdEZJRk9TTlNUb3BpY19UZXN0U2VuZFJlY2VpdmVJbnZhbGlkTm9EZWR1cGxpY2F0aW9uSUQtdG9wLTEuZmlmbyZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "417" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:29 GMT" ], "X-Amzn-Requestid": [ "a98a1f94-c43b-57df-8e3c-7da2dd2a3f13" ] }, "Body": "PFN1YnNjcmliZVJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8U3Vic2NyaWJlUmVzdWx0PgogICAgPFN1YnNjcmlwdGlvbkFybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlRlc3RGSUZPU05TVG9waWNfVGVzdFNlbmRSZWNlaXZlSW52YWxpZE5vRGVkdXBsaWNhdGlvbklELXRvcC0xLmZpZm86M2JmODZjNjUtMThlMC00MTZlLTg4MWEtYjIzZDRiYzlmNDdiPC9TdWJzY3JpcHRpb25Bcm4+CiAgPC9TdWJzY3JpYmVSZXN1bHQ+CiAgPFJlc3BvbnNlTWV0YWRhdGE+CiAgICA8UmVxdWVzdElkPmE5OGExZjk0LWM0M2ItNTdkZi04ZTNjLTdkYTJkZDJhM2YxMzwvUmVxdWVzdElkPgogIDwvUmVzcG9uc2VNZXRhZGF0YT4KPC9TdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "0164030702e4cad1", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "257" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9aGVsbG8rd29ybGQmVG9waWNBcm49YXJuJTNBYXdzJTNBc25zJTNBdXMtZWFzdC0yJTNBNDU2NzUyNjY1NTc2JTNBVGVzdEZJRk9TTlNUb3BpY19UZXN0U2VuZFJlY2VpdmVJbnZhbGlkTm9EZWR1cGxpY2F0aW9uSUQtdG9wLTEuZmlmbyZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "322" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:30 GMT" ], "X-Amzn-Requestid": [ "054be4ad-f7d3-5bdc-8489-869beec17310" ] }, "Body": "PEVycm9yUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxFcnJvcj4KICAgIDxUeXBlPlNlbmRlcjwvVHlwZT4KICAgIDxDb2RlPkludmFsaWRQYXJhbWV0ZXI8L0NvZGU+CiAgICA8TWVzc2FnZT5JbnZhbGlkIHBhcmFtZXRlcjogVGhlIE1lc3NhZ2VHcm91cElkIHBhcmFtZXRlciBpcyByZXF1aXJlZCBmb3IgRklGTyB0b3BpY3M8L01lc3NhZ2U+CiAgPC9FcnJvcj4KICA8UmVxdWVzdElkPjA1NGJlNGFkLWY3ZDMtNWJkYy04NDg5LTg2OWJlZWMxNzMxMDwvUmVxdWVzdElkPgo8L0Vycm9yUmVzcG9uc2U+Cg==" } }, { "ID": "273e865b7b75d985", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "205" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FUZXN0RklGT1NOU1RvcGljX1Rlc3RTZW5kUmVjZWl2ZUludmFsaWROb0RlZHVwbGljYXRpb25JRC10b3AtMS5maWZvJTNBM2JmODZjNjUtMThlMC00MTZlLTg4MWEtYjIzZDRiYzlmNDdiJlZlcnNpb249MjAxMC0wMy0zMQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:30 GMT" ], "X-Amzn-Requestid": [ "060b7a64-2f68-5334-9d28-1852367aabf8" ] }, "Body": "PFVuc3Vic2NyaWJlUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD4wNjBiN2E2NC0yZjY4LTUzMzQtOWQyOC0xODUyMzY3YWFiZjg8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvVW5zdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "ef5e26087e34e130", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "126" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9UZXN0RklGT1NOU1RvcGljX1Rlc3RTZW5kUmVjZWl2ZUludmFsaWROb0RlZHVwbGljYXRpb25JRC1zdWItMSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:30 GMT" ], "X-Amzn-Requestid": [ "90c00d95-a3fb-5703-be6b-6fa3bae9c210" ] }, "Body": "" } }, { "ID": "7b43d10f4212b4dc", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "159" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPURlbGV0ZVRvcGljJlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQVRlc3RGSUZPU05TVG9waWNfVGVzdFNlbmRSZWNlaXZlSW52YWxpZE5vRGVkdXBsaWNhdGlvbklELXRvcC0xLmZpZm8mVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:30 GMT" ], "X-Amzn-Requestid": [ "32c64fb0-267c-5e93-af05-2d863f6e065f" ] }, "Body": "PERlbGV0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD4zMmM2NGZiMC0yNjdjLTVlOTMtYWYwNS0yZDg2M2Y2ZTA2NWY8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvRGVsZXRlVG9waWNSZXNwb25zZT4K" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestFIFO/TestSNSTopic/TestSendReceiveInvalidNoMessageGroupID.replay ================================================ { "Initial": "AQAAAA7hTg3PErSJogAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "62ab47496a25189f", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "251" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPUNyZWF0ZVRvcGljJkF0dHJpYnV0ZXMuZW50cnkuMS5rZXk9Q29udGVudEJhc2VkRGVkdXBsaWNhdGlvbiZBdHRyaWJ1dGVzLmVudHJ5LjEudmFsdWU9dHJ1ZSZBdHRyaWJ1dGVzLmVudHJ5LjIua2V5PUZpZm9Ub3BpYyZBdHRyaWJ1dGVzLmVudHJ5LjIudmFsdWU9dHJ1ZSZOYW1lPVRlc3RGSUZPU05TVG9waWNfVGVzdFNlbmRSZWNlaXZlSW52YWxpZE5vTWVzc2FnZUdyb3VwSUQtdG9wLTEuZmlmbyZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "373" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:27 GMT" ], "X-Amzn-Requestid": [ "a87ec388-4ebc-543a-9d2d-a1be57b3e308" ] }, "Body": "PENyZWF0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxDcmVhdGVUb3BpY1Jlc3VsdD4KICAgIDxUb3BpY0Fybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlRlc3RGSUZPU05TVG9waWNfVGVzdFNlbmRSZWNlaXZlSW52YWxpZE5vTWVzc2FnZUdyb3VwSUQtdG9wLTEuZmlmbzwvVG9waWNBcm4+CiAgPC9DcmVhdGVUb3BpY1Jlc3VsdD4KICA8UmVzcG9uc2VNZXRhZGF0YT4KICAgIDxSZXF1ZXN0SWQ+YTg3ZWMzODgtNGViYy01NDNhLTlkMmQtYTFiZTU3YjNlMzA4PC9SZXF1ZXN0SWQ+CiAgPC9SZXNwb25zZU1ldGFkYXRhPgo8L0NyZWF0ZVRvcGljUmVzcG9uc2U+Cg==" } }, { "ID": "4d8a8b65b4bf051a", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "77" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJUZXN0RklGT1NOU1RvcGljX1Rlc3RTZW5kUmVjZWl2ZUludmFsaWROb01lc3NhZ2VHcm91cElELXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "125" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:28 GMT" ], "X-Amzn-Requestid": [ "ef661620-bee1-5f23-a13e-7416a7f1bd3b" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9UZXN0RklGT1NOU1RvcGljX1Rlc3RTZW5kUmVjZWl2ZUludmFsaWROb01lc3NhZ2VHcm91cElELXN1Yi0xIn0=" } }, { "ID": "968ea14c8377c420", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "155" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9UZXN0RklGT1NOU1RvcGljX1Rlc3RTZW5kUmVjZWl2ZUludmFsaWROb01lc3NhZ2VHcm91cElELXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "126" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:28 GMT" ], "X-Amzn-Requestid": [ "92da4b70-4c85-59a2-aef2-294655957bba" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpUZXN0RklGT1NOU1RvcGljX1Rlc3RTZW5kUmVjZWl2ZUludmFsaWROb01lc3NhZ2VHcm91cElELXN1Yi0xIn19" } }, { "ID": "b6d76b8aa38df819", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "536" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlRlc3RGSUZPU05TVG9waWNfVGVzdFNlbmRSZWNlaXZlSW52YWxpZE5vTWVzc2FnZUdyb3VwSUQtc3ViLTFcIlxuXHRcdH1cblx0XHRdXG5cdFx0fSJ9LCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9UZXN0RklGT1NOU1RvcGljX1Rlc3RTZW5kUmVjZWl2ZUludmFsaWROb01lc3NhZ2VHcm91cElELXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:28 GMT" ], "X-Amzn-Requestid": [ "f33ae414-79da-569e-84f2-862260cad486" ] }, "Body": "" } }, { "ID": "aa29d7a21e806aa7", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "285" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVN1YnNjcmliZSZFbmRwb2ludD1hcm4lM0Fhd3MlM0FzcXMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FUZXN0RklGT1NOU1RvcGljX1Rlc3RTZW5kUmVjZWl2ZUludmFsaWROb01lc3NhZ2VHcm91cElELXN1Yi0xJlByb3RvY29sPXNxcyZUb3BpY0Fybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FUZXN0RklGT1NOU1RvcGljX1Rlc3RTZW5kUmVjZWl2ZUludmFsaWROb01lc3NhZ2VHcm91cElELXRvcC0xLmZpZm8mVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "416" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:28 GMT" ], "X-Amzn-Requestid": [ "9cc1fc62-2eee-5f22-888f-9e5437fed810" ] }, "Body": "PFN1YnNjcmliZVJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8U3Vic2NyaWJlUmVzdWx0PgogICAgPFN1YnNjcmlwdGlvbkFybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlRlc3RGSUZPU05TVG9waWNfVGVzdFNlbmRSZWNlaXZlSW52YWxpZE5vTWVzc2FnZUdyb3VwSUQtdG9wLTEuZmlmbzpjZjcwYjBkMi02YTNiLTQ2NzQtOGYzZS1kYThjYmU3YzlmZTk8L1N1YnNjcmlwdGlvbkFybj4KICA8L1N1YnNjcmliZVJlc3VsdD4KICA8UmVzcG9uc2VNZXRhZGF0YT4KICAgIDxSZXF1ZXN0SWQ+OWNjMWZjNjItMmVlZS01ZjIyLTg4OGYtOWU1NDM3ZmVkODEwPC9SZXF1ZXN0SWQ+CiAgPC9SZXNwb25zZU1ldGFkYXRhPgo8L1N1YnNjcmliZVJlc3BvbnNlPgo=" } }, { "ID": "fd4ff4b5dd0780d9", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "566" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9aGVsbG8rd29ybGQmUHVibGlzaEJhdGNoUmVxdWVzdEVudHJpZXMubWVtYmVyLjEuQ0xFQVJFRA==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "322" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:28 GMT" ], "X-Amzn-Requestid": [ "380c737e-5c0b-5437-b3d4-1148451b8305" ] }, "Body": "PEVycm9yUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxFcnJvcj4KICAgIDxUeXBlPlNlbmRlcjwvVHlwZT4KICAgIDxDb2RlPkludmFsaWRQYXJhbWV0ZXI8L0NvZGU+CiAgICA8TWVzc2FnZT5JbnZhbGlkIHBhcmFtZXRlcjogVGhlIE1lc3NhZ2VHcm91cElkIHBhcmFtZXRlciBpcyByZXF1aXJlZCBmb3IgRklGTyB0b3BpY3M8L01lc3NhZ2U+CiAgPC9FcnJvcj4KICA8UmVxdWVzdElkPjM4MGM3MzdlLTVjMGItNTQzNy1iM2Q0LTExNDg0NTFiODMwNTwvUmVxdWVzdElkPgo8L0Vycm9yUmVzcG9uc2U+Cg==" } }, { "ID": "99e11dad00b60804", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "204" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FUZXN0RklGT1NOU1RvcGljX1Rlc3RTZW5kUmVjZWl2ZUludmFsaWROb01lc3NhZ2VHcm91cElELXRvcC0xLmZpZm8lM0FjZjcwYjBkMi02YTNiLTQ2NzQtOGYzZS1kYThjYmU3YzlmZTkmVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:28 GMT" ], "X-Amzn-Requestid": [ "b9909bc1-3244-5617-b8d9-f9f72b54f125" ] }, "Body": "PFVuc3Vic2NyaWJlUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD5iOTkwOWJjMS0zMjQ0LTU2MTctYjhkOS1mOWY3MmI1NGYxMjU8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvVW5zdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "cf06f696b54e3ba3", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "125" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9UZXN0RklGT1NOU1RvcGljX1Rlc3RTZW5kUmVjZWl2ZUludmFsaWROb01lc3NhZ2VHcm91cElELXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:28 GMT" ], "X-Amzn-Requestid": [ "37a08097-3fdd-5034-99f3-e2a126cdd22c" ] }, "Body": "" } }, { "ID": "ced84df75c3547ae", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "158" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPURlbGV0ZVRvcGljJlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQVRlc3RGSUZPU05TVG9waWNfVGVzdFNlbmRSZWNlaXZlSW52YWxpZE5vTWVzc2FnZUdyb3VwSUQtdG9wLTEuZmlmbyZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:28 GMT" ], "X-Amzn-Requestid": [ "3151992d-c6ef-5886-b657-fb1bdfff1fb4" ] }, "Body": "PERlbGV0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD4zMTUxOTkyZC1jNmVmLTU4ODYtYjY1Ny1mYjFiZGZmZjFmYjQ8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvRGVsZXRlVG9waWNSZXNwb25zZT4K" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestFIFO/TestSNSTopic/TestSendReceiveValid.replay ================================================ { "Initial": "AQAAAA7hTg3MJu2g9AAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "c29c5a489f6e5584", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "233" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPUNyZWF0ZVRvcGljJkF0dHJpYnV0ZXMuZW50cnkuMS5rZXk9Q29udGVudEJhc2VkRGVkdXBsaWNhdGlvbiZBdHRyaWJ1dGVzLmVudHJ5LjEudmFsdWU9dHJ1ZSZBdHRyaWJ1dGVzLmVudHJ5LjIua2V5PUZpZm9Ub3BpYyZBdHRyaWJ1dGVzLmVudHJ5LjIudmFsdWU9dHJ1ZSZOYW1lPVRlc3RGSUZPU05TVG9waWNfVGVzdFNlbmRSZWNlaXZlVmFsaWQtdG9wLTEuZmlmbyZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "355" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:25 GMT" ], "X-Amzn-Requestid": [ "a6ebc907-c772-5ef2-8db6-ab31de7faf3d" ] }, "Body": "PENyZWF0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxDcmVhdGVUb3BpY1Jlc3VsdD4KICAgIDxUb3BpY0Fybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlRlc3RGSUZPU05TVG9waWNfVGVzdFNlbmRSZWNlaXZlVmFsaWQtdG9wLTEuZmlmbzwvVG9waWNBcm4+CiAgPC9DcmVhdGVUb3BpY1Jlc3VsdD4KICA8UmVzcG9uc2VNZXRhZGF0YT4KICAgIDxSZXF1ZXN0SWQ+YTZlYmM5MDctYzc3Mi01ZWYyLThkYjYtYWIzMWRlN2ZhZjNkPC9SZXF1ZXN0SWQ+CiAgPC9SZXNwb25zZU1ldGFkYXRhPgo8L0NyZWF0ZVRvcGljUmVzcG9uc2U+Cg==" } }, { "ID": "01a1c1df7343626d", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "59" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZU5hbWUiOiJUZXN0RklGT1NOU1RvcGljX1Rlc3RTZW5kUmVjZWl2ZVZhbGlkLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "107" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:25 GMT" ], "X-Amzn-Requestid": [ "b2def630-f969-5837-8e1a-9406e064c743" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9UZXN0RklGT1NOU1RvcGljX1Rlc3RTZW5kUmVjZWl2ZVZhbGlkLXN1Yi0xIn0=" } }, { "ID": "84c7d14aaab4ca77", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "137" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9UZXN0RklGT1NOU1RvcGljX1Rlc3RTZW5kUmVjZWl2ZVZhbGlkLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "108" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:25 GMT" ], "X-Amzn-Requestid": [ "232b1650-48b1-58b4-873e-746651bc17c0" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjpUZXN0RklGT1NOU1RvcGljX1Rlc3RTZW5kUmVjZWl2ZVZhbGlkLXN1Yi0xIn19" } }, { "ID": "cfc07d69798867f1", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "500" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlRlc3RGSUZPU05TVG9waWNfVGVzdFNlbmRSZWNlaXZlVmFsaWQtc3ViLTFcIlxuXHRcdH1cblx0XHRdXG5cdFx0fSJ9LCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9UZXN0RklGT1NOU1RvcGljX1Rlc3RTZW5kUmVjZWl2ZVZhbGlkLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:25 GMT" ], "X-Amzn-Requestid": [ "13b215fc-0fde-5155-9816-77ca16d3ae21" ] }, "Body": "" } }, { "ID": "afc45d9fd8261d06", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "249" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVN1YnNjcmliZSZFbmRwb2ludD1hcm4lM0Fhd3MlM0FzcXMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FUZXN0RklGT1NOU1RvcGljX1Rlc3RTZW5kUmVjZWl2ZVZhbGlkLXN1Yi0xJlByb3RvY29sPXNxcyZUb3BpY0Fybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FUZXN0RklGT1NOU1RvcGljX1Rlc3RTZW5kUmVjZWl2ZVZhbGlkLXRvcC0xLmZpZm8mVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "398" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:25 GMT" ], "X-Amzn-Requestid": [ "b9b64a97-c278-5b25-a03b-28a1db758aea" ] }, "Body": "PFN1YnNjcmliZVJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8U3Vic2NyaWJlUmVzdWx0PgogICAgPFN1YnNjcmlwdGlvbkFybj5hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlRlc3RGSUZPU05TVG9waWNfVGVzdFNlbmRSZWNlaXZlVmFsaWQtdG9wLTEuZmlmbzo4MzkyYmU2Yy0xOTAwLTQ4M2QtOThlNy0yMTc3MWQzYjAzMDI8L1N1YnNjcmlwdGlvbkFybj4KICA8L1N1YnNjcmliZVJlc3VsdD4KICA8UmVzcG9uc2VNZXRhZGF0YT4KICAgIDxSZXF1ZXN0SWQ+YjliNjRhOTctYzI3OC01YjI1LWEwM2ItMjhhMWRiNzU4YWVhPC9SZXF1ZXN0SWQ+CiAgPC9SZXNwb25zZU1ldGFkYXRhPgo8L1N1YnNjcmliZVJlc3BvbnNlPgo=" } }, { "ID": "9645dc43eff2d0a1", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "539" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVB1Ymxpc2hCYXRjaCZQdWJsaXNoQmF0Y2hSZXF1ZXN0RW50cmllcy5tZW1iZXIuMS5JZD0wJlB1Ymxpc2hCYXRjaFJlcXVlc3RFbnRyaWVzLm1lbWJlci4xLk1lc3NhZ2U9aGVsbG8rd29ybGQmUHVibGlzaEJhdGNoUmVxdWVzdEVudHJpZXMubWVtYmVyLjEuQ0xFQVJFRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "479" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:25 GMT" ], "X-Amzn-Requestid": [ "5190d403-dc7d-561a-93aa-b635c57077d5" ] }, "Body": "PFB1Ymxpc2hCYXRjaFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vc25zLmFtYXpvbmF3cy5jb20vZG9jLzIwMTAtMDMtMzEvIj4KICA8UHVibGlzaEJhdGNoUmVzdWx0PgogICAgPEZhaWxlZC8+CiAgICA8U3VjY2Vzc2Z1bD4KICAgICAgPG1lbWJlcj4KICAgICAgICA8U2VxdWVuY2VOdW1iZXI+MTAwMDAwMDAwMDAwMDAwMDMwMDA8L1NlcXVlbmNlTnVtYmVyPgogICAgICAgIDxNZXNzYWdlSWQ+MThhNjM3Y2YtZTkxYy01MDhjLWJkOGYtNTVmOWYwMTE5MTQzPC9NZXNzYWdlSWQ+CiAgICAgICAgPElkPjA8L0lkPgogICAgICA8L21lbWJlcj4KICAgIDwvU3VjY2Vzc2Z1bD4KICA8L1B1Ymxpc2hCYXRjaFJlc3VsdD4KICA8UmVzcG9uc2VNZXRhZGF0YT4KICAgIDxSZXF1ZXN0SWQ+NTE5MGQ0MDMtZGM3ZC01NjFhLTkzYWEtYjYzNWM1NzA3N2Q1PC9SZXF1ZXN0SWQ+CiAgPC9SZXNwb25zZU1ldGFkYXRhPgo8L1B1Ymxpc2hCYXRjaFJlc3BvbnNlPgo=" } }, { "ID": "979a2e3e91f057af", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "188" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9UZXN0RklGT1NOU1RvcGljX1Rlc3RTZW5kUmVjZWl2ZVZhbGlkLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:26 GMT" ], "X-Amzn-Requestid": [ "41527d3f-a271-58e1-b891-1f09bb7f3795" ] }, "Body": "e30=" } }, { "ID": "cefffd5783b8c7df", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "188" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9UZXN0RklGT1NOU1RvcGljX1Rlc3RTZW5kUmVjZWl2ZVZhbGlkLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "2" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:26 GMT" ], "X-Amzn-Requestid": [ "1ecbee4d-2125-58b7-b30e-8c7b382b87c3" ] }, "Body": "e30=" } }, { "ID": "0fff6ee329ded978", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "188" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9UZXN0RklGT1NOU1RvcGljX1Rlc3RTZW5kUmVjZWl2ZVZhbGlkLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "1429" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:26 GMT" ], "X-Amzn-Requestid": [ "c63027d1-8116-5713-ba98-45e79818c867" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFST0FSSU1WQ1dWRVI3N0ozSFFMMzpBV1MtQ0xPVURDQVNUIiwiQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXAiOiIxNzczOTM0Mjg2ODA1IiwiQXBwcm94aW1hdGVSZWNlaXZlQ291bnQiOiIxIiwiU2VudFRpbWVzdGFtcCI6IjE3NzM5MzQyODY1MDIifSwiQm9keSI6IntcbiAgXCJUeXBlXCIgOiBcIk5vdGlmaWNhdGlvblwiLFxuICBcIk1lc3NhZ2VJZFwiIDogXCIxOGE2MzdjZi1lOTFjLTUwOGMtYmQ4Zi01NWY5ZjAxMTkxNDNcIixcbiAgXCJTZXF1ZW5jZU51bWJlclwiIDogXCIxMDAwMDAwMDAwMDAwMDAwMzAwMFwiLFxuICBcIlRvcGljQXJuXCIgOiBcImFybjphd3M6c25zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6VGVzdEZJRk9TTlNUb3BpY19UZXN0U2VuZFJlY2VpdmVWYWxpZC10b3AtMS5maWZvXCIsXG4gIFwiTWVzc2FnZVwiIDogXCJoZWxsbyB3b3JsZFwiLFxuICBcIlRpbWVzdGFtcFwiIDogXCIyMDI2LTAzLTE5VDE1OjMxOjI1LjkyM1pcIixcbiAgXCJVbnN1YnNjcmliZVVSTFwiIDogXCJodHRwczovL3Nucy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS8/QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm46YXdzOnNuczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OlRlc3RGSUZPU05TVG9waWNfVGVzdFNlbmRSZWNlaXZlVmFsaWQtdG9wLTEuZmlmbzo4MzkyYmU2Yy0xOTAwLTQ4M2QtOThlNy0yMTc3MWQzYjAzMDJcIixcbiAgXCJNZXNzYWdlQXR0cmlidXRlc1wiIDoge1xuICAgIFwiTWVzc2FnZUdyb3VwSWRcIiA6IHtcIlR5cGVcIjpcIlN0cmluZ1wiLFwiVmFsdWVcIjpcIjFcIn1cbiAgfVxufSIsIk1ENU9mQm9keSI6ImEyMzNkZGUzNTZlN2IyMzdmOWZiNGRiZjk0MzQ2MWNmIiwiTWVzc2FnZUlkIjoiMmQ3ODdkNzktZGJjYS00ZjY5LThlODAtMWMwZjMyYjkxMTZhIiwiUmVjZWlwdEhhbmRsZSI6IkFRRUJHWXBoWUljak5WVnNSRS9QTmhJMXlZL0I1Nmh6aFdvUTNqMThmOE9jcjJrWENyanZXamlOWFFDemIvV2FhanRMSndNa3RiOVpSWjdPdTF0TDZhZi9WV3pFbDd1L09TMlkrV3ZxQ0ZHdndPV1FPaFVqYW9Wc3VKc2VnMmwrZVI1QWtoOUc2aTAwQy9kYzIxZGI1ZU94OHJ1UWFqcy9WeDUxNjF6ZjI3bXpLZUttZTB5ZU9ZNU1tN0JVTW9vSTI5cjlEY25zQkFKL2pJc0t5V3p6ZXVwRmhsMVlpZ04xd3JWUlJ1OXpkazY1dzc1amJnT05GMUlvRExxSjB0cjVQWWVJOHdlcXN6MElGcXpCT1N5S3lPYUhFTjg1WTdNRUN3V2JyZ3NDNTZZUi9pQ0NCTjVDUWgwUHVDZ0U3cWxaazk4RFRPQVYxamIwSHAwaDhYWmhOYk1jOUJyK1BySjg3NytFQmk5OVI0cUZpY3dpMlh0bUUwb24wZ3RLdmdZN2MyYURnQXBYZjJNQUg3cExJNFhkZmNhSzQycXlFTldIWitwSTdnRTB4SFJYZDdwUlFQWGUwRUNpWlFIcHc4WC9YNDl5In1dfQ==" } }, { "ID": "5f0a3a7d7e93eb64", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "601" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQkdZcGhZSWNqTlZWc1JFL1BOaEkxeVkvQjU2aHpoV29RM2oxOGY4T2NyMmtYQ3JqdldqaU5YUUN6Yi9XYWFqdExKd01rdGI5WlJaN091MXRMNmFmL1ZXekVsN3UvT1MyWStXdnFDRkd2d09XUU9oVWphb1ZzdUpzZWcybCtlUjVBa2g5RzZpMDBDL2RjMjFkYjVlT3g4cnVRYWpzL1Z4NTE2MXpmMjdtektlS21lMHllT1k1TW03QlVNb29JMjlyOURjbnNCQUovaklzS3lXenpldXBGaGwxWWlnTjF3clZSUnU5emRrNjV3NzVqYmdPTkYxSW9ETHFKMHRyNVBZZUk4d2Vxc3owSUZxekJPU3lLeU9hSEVOODVZN01FQ3dXYnJnc0M1NllSL2lDQ0JONUNRaDBQdUNnRTdxbFprOThEVE9BVjFqYjBIcDBoOFhaaE5iTWM5QnIrUHJKODc3K0VCaTk5UjRxRmljd2kyWHRtRTBvbjBndEt2Z1k3YzJhRGdBcFhmMk1BSDdwTEk0WGRmY2FLNDJxeUVOV0haK3BJN2dFMHhIUlhkN3BSUVBYZTBFQ2laUUhwdzhYL1g0OXkifV0sIlF1ZXVlVXJsIjoiaHR0cHM6Ly9zcXMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vNDU2NzUyNjY1NTc2L1Rlc3RGSUZPU05TVG9waWNfVGVzdFNlbmRSZWNlaXZlVmFsaWQtc3ViLTEifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:26 GMT" ], "X-Amzn-Requestid": [ "1cf06939-fe3c-57e6-88a4-0b0fe7320892" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "b6ac1bc135bdabfd", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "186" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPVVuc3Vic2NyaWJlJlN1YnNjcmlwdGlvbkFybj1hcm4lM0Fhd3MlM0FzbnMlM0F1cy1lYXN0LTIlM0E0NTY3NTI2NjU1NzYlM0FUZXN0RklGT1NOU1RvcGljX1Rlc3RTZW5kUmVjZWl2ZVZhbGlkLXRvcC0xLmZpZm8lM0E4MzkyYmU2Yy0xOTAwLTQ4M2QtOThlNy0yMTc3MWQzYjAzMDImVmVyc2lvbj0yMDEwLTAzLTMx" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:27 GMT" ], "X-Amzn-Requestid": [ "f5d9e7bd-c936-52b9-972b-858bd0389376" ] }, "Body": "PFVuc3Vic2NyaWJlUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD5mNWQ5ZTdiZC1jOTM2LTUyYjktOTcyYi04NThiZDAzODkzNzY8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvVW5zdWJzY3JpYmVSZXNwb25zZT4K" } }, { "ID": "75c40231ee783038", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "107" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ], "X-Amzn-Query-Mode": [ "true" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ1Njc1MjY2NTU3Ni9UZXN0RklGT1NOU1RvcGljX1Rlc3RTZW5kUmVjZWl2ZVZhbGlkLXN1Yi0xIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Thu, 19 Mar 2026 15:31:27 GMT" ], "X-Amzn-Requestid": [ "0c054f73-d014-5e0a-94a6-2d45c91b017e" ] }, "Body": "" } }, { "ID": "44ac4cccd2fa637d", "Request": { "Method": "POST", "URL": "https://sns.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "140" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ] }, "MediaType": "application/x-www-form-urlencoded", "BodyParts": [ "QWN0aW9uPURlbGV0ZVRvcGljJlRvcGljQXJuPWFybiUzQWF3cyUzQXNucyUzQXVzLWVhc3QtMiUzQTQ1Njc1MjY2NTU3NiUzQVRlc3RGSUZPU05TVG9waWNfVGVzdFNlbmRSZWNlaXZlVmFsaWQtdG9wLTEuZmlmbyZWZXJzaW9uPTIwMTAtMDMtMzE=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "201" ], "Content-Type": [ "text/xml" ], "Date": [ "Thu, 19 Mar 2026 15:31:27 GMT" ], "X-Amzn-Requestid": [ "70782cfc-a9f9-5c9b-8d44-4ecab0f61d54" ] }, "Body": "PERlbGV0ZVRvcGljUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9zbnMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0wMy0zMS8iPgogIDxSZXNwb25zZU1ldGFkYXRhPgogICAgPFJlcXVlc3RJZD43MDc4MmNmYy1hOWY5LTVjOWItOGQ0NC00ZWNhYjBmNjFkNTQ8L1JlcXVlc3RJZD4KICA8L1Jlc3BvbnNlTWV0YWRhdGE+CjwvRGVsZXRlVG9waWNSZXNwb25zZT4K" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestFIFO/TestSQSTopic/TestSendReceiveInvalidNoDeduplicationID.replay ================================================ { "Initial": "AQAAAA7d7DkaEPsp2wAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "488c1b7baccec043", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "119" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IkZpZm9RdWV1ZSI6InRydWUifSwiUXVldWVOYW1lIjoiVGVzdEZJRk9TUVNUb3BpY1YyX1Rlc3RTZW5kUmVjZWl2ZUludmFsaWROb0RlZHVwbGljYXRpb25JRC10b3AtMS5maWZvIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "133" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Fri, 31 May 2024 21:33:14 GMT" ], "X-Amzn-Requestid": [ "c8fe192d-a596-55ff-a284-47f9e1cce82b" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ2MjM4MDIyNTcyMi9UZXN0RklGT1NRU1RvcGljVjJfVGVzdFNlbmRSZWNlaXZlSW52YWxpZE5vRGVkdXBsaWNhdGlvbklELXRvcC0xLmZpZm8ifQ==" } }, { "ID": "ef216f838ffba6a3", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "163" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ2MjM4MDIyNTcyMi9UZXN0RklGT1NRU1RvcGljVjJfVGVzdFNlbmRSZWNlaXZlSW52YWxpZE5vRGVkdXBsaWNhdGlvbklELXRvcC0xLmZpZm8ifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "134" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Fri, 31 May 2024 21:33:14 GMT" ], "X-Amzn-Requestid": [ "f55f2002-99bb-539e-b832-7ed6dde1fe4a" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ2MjM4MDIyNTcyMjpUZXN0RklGT1NRU1RvcGljVjJfVGVzdFNlbmRSZWNlaXZlSW52YWxpZE5vRGVkdXBsaWNhdGlvbklELXRvcC0xLmZpZm8ifX0=" } }, { "ID": "3ca56206193d9a4f", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "552" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDYyMzgwMjI1NzIyOlRlc3RGSUZPU1FTVG9waWNWMl9UZXN0U2VuZFJlY2VpdmVJbnZhbGlkTm9EZWR1cGxpY2F0aW9uSUQtdG9wLTEuZmlmb1wiXG5cdFx0fVxuXHRcdF1cblx0XHR9In0sIlF1ZXVlVXJsIjoiaHR0cHM6Ly9zcXMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vNDYyMzgwMjI1NzIyL1Rlc3RGSUZPU1FTVG9waWNWMl9UZXN0U2VuZFJlY2VpdmVJbnZhbGlkTm9EZWR1cGxpY2F0aW9uSUQtdG9wLTEuZmlmbyJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Fri, 31 May 2024 21:33:14 GMT" ], "X-Amzn-Requestid": [ "70c6bccc-fcf9-5394-890f-e218b8a3ee40" ] }, "Body": "" } }, { "ID": "295ccc1c86c5adf5", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "184" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SendMessageBatch" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJNZXNzYWdlQm9keSI6ImhlbGxvIHdvcmxkIn1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ2MjM4MDIyNTcyMi9UZXN0RklGT1NRU1RvcGljVjJfVGVzdFNlbmRSZWNlaXZlSW52YWxpZE5vRGVkdXBsaWNhdGlvbklELXRvcC0xLmZpZm8ifQ==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "135" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Fri, 31 May 2024 21:33:14 GMT" ], "X-Amzn-Query-Error": [ "InvalidParameterValue;Sender" ], "X-Amzn-Requestid": [ "8f9fa8f3-579c-5344-9a93-f62713c6fe90" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uLmNvcmFsLnNlcnZpY2UjSW52YWxpZFBhcmFtZXRlclZhbHVlRXhjZXB0aW9uIiwibWVzc2FnZSI6IlRoZSByZXF1ZXN0IG11c3QgY29udGFpbiB0aGUgcGFyYW1ldGVyIE1lc3NhZ2VHcm91cElkLiJ9" } }, { "ID": "2bb6505bef40e020", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "133" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ2MjM4MDIyNTcyMi9UZXN0RklGT1NRU1RvcGljVjJfVGVzdFNlbmRSZWNlaXZlSW52YWxpZE5vRGVkdXBsaWNhdGlvbklELXRvcC0xLmZpZm8ifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Fri, 31 May 2024 21:33:14 GMT" ], "X-Amzn-Requestid": [ "a92d077d-a742-594c-9f12-59a9e3184498" ] }, "Body": "" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestFIFO/TestSQSTopic/TestSendReceiveInvalidNoMessageGroupID.replay ================================================ { "Initial": "AQAAAA7d7DkZK1G+aQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "6366424e88b30d8f", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "153" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IkNvbnRlbnRCYXNlZERlZHVwbGljYXRpb24iOiJ0cnVlIiwiRmlmb1F1ZXVlIjoidHJ1ZSJ9LCJRdWV1ZU5hbWUiOiJUZXN0RklGT1NRU1RvcGljVjJfVGVzdFNlbmRSZWNlaXZlSW52YWxpZE5vTWVzc2FnZUdyb3VwSUQtdG9wLTEuZmlmbyJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "132" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Fri, 31 May 2024 21:33:13 GMT" ], "X-Amzn-Requestid": [ "26c22a4d-366e-57ae-8ecc-74997237919c" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ2MjM4MDIyNTcyMi9UZXN0RklGT1NRU1RvcGljVjJfVGVzdFNlbmRSZWNlaXZlSW52YWxpZE5vTWVzc2FnZUdyb3VwSUQtdG9wLTEuZmlmbyJ9" } }, { "ID": "3a2c883514b69b62", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "162" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ2MjM4MDIyNTcyMi9UZXN0RklGT1NRU1RvcGljVjJfVGVzdFNlbmRSZWNlaXZlSW52YWxpZE5vTWVzc2FnZUdyb3VwSUQtdG9wLTEuZmlmbyJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "133" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Fri, 31 May 2024 21:33:14 GMT" ], "X-Amzn-Requestid": [ "b0785a50-4d25-5f0b-9f70-0484097f2939" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ2MjM4MDIyNTcyMjpUZXN0RklGT1NRU1RvcGljVjJfVGVzdFNlbmRSZWNlaXZlSW52YWxpZE5vTWVzc2FnZUdyb3VwSUQtdG9wLTEuZmlmbyJ9fQ==" } }, { "ID": "ab18dd9635cce259", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "550" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDYyMzgwMjI1NzIyOlRlc3RGSUZPU1FTVG9waWNWMl9UZXN0U2VuZFJlY2VpdmVJbnZhbGlkTm9NZXNzYWdlR3JvdXBJRC10b3AtMS5maWZvXCJcblx0XHR9XG5cdFx0XVxuXHRcdH0ifSwiUXVldWVVcmwiOiJodHRwczovL3Nxcy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS80NjIzODAyMjU3MjIvVGVzdEZJRk9TUVNUb3BpY1YyX1Rlc3RTZW5kUmVjZWl2ZUludmFsaWROb01lc3NhZ2VHcm91cElELXRvcC0xLmZpZm8ifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Fri, 31 May 2024 21:33:14 GMT" ], "X-Amzn-Requestid": [ "a38c8ae8-cee8-510a-b76d-d43c8ab20738" ] }, "Body": "" } }, { "ID": "11a7cff7dccb146c", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "292" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SendMessageBatch" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJDTEVBUkVE" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "135" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Fri, 31 May 2024 21:33:14 GMT" ], "X-Amzn-Query-Error": [ "InvalidParameterValue;Sender" ], "X-Amzn-Requestid": [ "cd8c196e-fb59-50fa-8b61-47babf03a6c8" ] }, "Body": "eyJfX3R5cGUiOiJjb20uYW1hem9uLmNvcmFsLnNlcnZpY2UjSW52YWxpZFBhcmFtZXRlclZhbHVlRXhjZXB0aW9uIiwibWVzc2FnZSI6IlRoZSByZXF1ZXN0IG11c3QgY29udGFpbiB0aGUgcGFyYW1ldGVyIE1lc3NhZ2VHcm91cElkLiJ9" } }, { "ID": "2b0f583db6179994", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "132" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ2MjM4MDIyNTcyMi9UZXN0RklGT1NRU1RvcGljVjJfVGVzdFNlbmRSZWNlaXZlSW52YWxpZE5vTWVzc2FnZUdyb3VwSUQtdG9wLTEuZmlmbyJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Fri, 31 May 2024 21:33:14 GMT" ], "X-Amzn-Requestid": [ "6947b160-652e-58bd-923a-efb42174ce8f" ] }, "Body": "" } } ] } ================================================ FILE: pubsub/awssnssqs/testdata/TestFIFO/TestSQSTopic/TestSendReceiveValid.replay ================================================ { "Initial": "AQAAAA7d7DkZArpthgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "0b80062d7e7d1cf4", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "135" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.CreateQueue" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IkNvbnRlbnRCYXNlZERlZHVwbGljYXRpb24iOiJ0cnVlIiwiRmlmb1F1ZXVlIjoidHJ1ZSJ9LCJRdWV1ZU5hbWUiOiJUZXN0RklGT1NRU1RvcGljVjJfVGVzdFNlbmRSZWNlaXZlVmFsaWQtdG9wLTEuZmlmbyJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "114" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Fri, 31 May 2024 21:33:13 GMT" ], "X-Amzn-Requestid": [ "a3942545-7353-58bb-8c80-7b91370ab888" ] }, "Body": "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ2MjM4MDIyNTcyMi9UZXN0RklGT1NRU1RvcGljVjJfVGVzdFNlbmRSZWNlaXZlVmFsaWQtdG9wLTEuZmlmbyJ9" } }, { "ID": "37296bc76bc72205", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "144" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.GetQueueAttributes" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJRdWV1ZUFybiJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ2MjM4MDIyNTcyMi9UZXN0RklGT1NRU1RvcGljVjJfVGVzdFNlbmRSZWNlaXZlVmFsaWQtdG9wLTEuZmlmbyJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "115" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Fri, 31 May 2024 21:33:13 GMT" ], "X-Amzn-Requestid": [ "f6b9c333-cc21-5112-9137-9de788786121" ] }, "Body": "eyJBdHRyaWJ1dGVzIjp7IlF1ZXVlQXJuIjoiYXJuOmF3czpzcXM6dXMtZWFzdC0yOjQ2MjM4MDIyNTcyMjpUZXN0RklGT1NRU1RvcGljVjJfVGVzdFNlbmRSZWNlaXZlVmFsaWQtdG9wLTEuZmlmbyJ9fQ==" } }, { "ID": "b872a000f87315c7", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "514" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SetQueueAttributes" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVzIjp7IlBvbGljeSI6Intcblx0XHRcIlZlcnNpb25cIjogXCIyMDEyLTEwLTE3XCIsXG5cdFx0XCJJZFwiOiBcIkFsbG93UXVldWVcIixcblx0XHRcIlN0YXRlbWVudFwiOiBbXG5cdFx0e1xuXHRcdFwiU2lkXCI6IFwiTXlTUVNQb2xpY3kwMDFcIixcblx0XHRcIkVmZmVjdFwiOiBcIkFsbG93XCIsXG5cdFx0XCJQcmluY2lwYWxcIjoge1xuXHRcdFwiQVdTXCI6IFwiKlwiXG5cdFx0fSxcblx0XHRcIkFjdGlvblwiOiBcInNxczpTZW5kTWVzc2FnZVwiLFxuXHRcdFwiUmVzb3VyY2VcIjogXCJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDYyMzgwMjI1NzIyOlRlc3RGSUZPU1FTVG9waWNWMl9UZXN0U2VuZFJlY2VpdmVWYWxpZC10b3AtMS5maWZvXCJcblx0XHR9XG5cdFx0XVxuXHRcdH0ifSwiUXVldWVVcmwiOiJodHRwczovL3Nxcy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS80NjIzODAyMjU3MjIvVGVzdEZJRk9TUVNUb3BpY1YyX1Rlc3RTZW5kUmVjZWl2ZVZhbGlkLXRvcC0xLmZpZm8ifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Fri, 31 May 2024 21:33:13 GMT" ], "X-Amzn-Requestid": [ "eb761631-365a-5f1d-8717-48e572038f2e" ] }, "Body": "" } }, { "ID": "fb0f07a8000497b0", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "265" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.SendMessageBatch" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJDTEVBUkVE" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "232" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Fri, 31 May 2024 21:33:13 GMT" ], "X-Amzn-Requestid": [ "9662cf02-26b8-5134-8575-91d662e1a107" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAiLCJNRDVPZk1lc3NhZ2VBdHRyaWJ1dGVzIjoiNzZmODkzMTU1Y2NjNmY1ZTAxNzQ3MTU3NWRmZDUwYjUiLCJNRDVPZk1lc3NhZ2VCb2R5IjoiNWViNjNiYmJlMDFlZWVkMDkzY2IyMmJiOGY1YWNkYzMiLCJNZXNzYWdlSWQiOiI5NjIzMWY1OC05ZTdhLTQ1NjYtOWZlMi03NjFmZWVhOWMzMzYiLCJTZXF1ZW5jZU51bWJlciI6IjE4ODg2MzQ1MDE5MjM4MTI3ODcyIn1dfQ==" } }, { "ID": "ba83c145a0d21888", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "195" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.ReceiveMessage" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJBdHRyaWJ1dGVOYW1lcyI6WyJBbGwiXSwiTWF4TnVtYmVyT2ZNZXNzYWdlcyI6MSwiTWVzc2FnZUF0dHJpYnV0ZU5hbWVzIjpbIkFsbCJdLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ2MjM4MDIyNTcyMi9UZXN0RklGT1NRU1RvcGljVjJfVGVzdFNlbmRSZWNlaXZlVmFsaWQtdG9wLTEuZmlmbyJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "933" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Fri, 31 May 2024 21:33:13 GMT" ], "X-Amzn-Requestid": [ "c2c8c961-7b9b-5368-b941-97b53fc2435b" ] }, "Body": "eyJNZXNzYWdlcyI6W3siQXR0cmlidXRlcyI6eyJTZW5kZXJJZCI6IkFJREFJNEJTWVE0TzZLNVZJTDIzQyIsIkFwcHJveGltYXRlRmlyc3RSZWNlaXZlVGltZXN0YW1wIjoiMTcxNzE5MTE5MzUzMSIsIkFwcHJveGltYXRlUmVjZWl2ZUNvdW50IjoiMSIsIlNlbnRUaW1lc3RhbXAiOiIxNzE3MTkxMTkzNDcxIiwiU2VxdWVuY2VOdW1iZXIiOiIxODg4NjM0NTAxOTIzODEyNzg3MiIsIk1lc3NhZ2VEZWR1cGxpY2F0aW9uSWQiOiJiOTRkMjdiOTkzNGQzZTA4YTUyZTUyZDdkYTdkYWJmYWM0ODRlZmUzN2E1MzgwZWU5MDg4ZjdhY2UyZWZjZGU5IiwiTWVzc2FnZUdyb3VwSWQiOiIxIn0sIkJvZHkiOiJoZWxsbyB3b3JsZCIsIk1ENU9mQm9keSI6IjVlYjYzYmJiZTAxZWVlZDA5M2NiMjJiYjhmNWFjZGMzIiwiTUQ1T2ZNZXNzYWdlQXR0cmlidXRlcyI6Ijc2Zjg5MzE1NWNjYzZmNWUwMTc0NzE1NzVkZmQ1MGI1IiwiTWVzc2FnZUF0dHJpYnV0ZXMiOnsiTWVzc2FnZUdyb3VwSWQiOnsiRGF0YVR5cGUiOiJTdHJpbmciLCJTdHJpbmdWYWx1ZSI6IjEifX0sIk1lc3NhZ2VJZCI6Ijk2MjMxZjU4LTllN2EtNDU2Ni05ZmUyLTc2MWZlZWE5YzMzNiIsIlJlY2VpcHRIYW5kbGUiOiJBUUVCRXY5d08yNnlJMFI5TnJxR0hwVm9HWnhTejA4djJOb0ZRa3FLYnlNaE5tZWpndEw3b1dGamZhMnNYVGEzM1hDbWlRdzhtRmo1azEwdGJDSnF2WUtBUXZOODA3NVRkdDBXUFpIcy9jZUpFbENCWmdyNHhVVW1VQVZrYkxmQ1JYS0hzMGVNVGEwRUlaSjgxWEt2QW9ONDVpaGora0ZpZk1xSll4SDBvV0RJZEl1MXpoa3ErblV6bUt0NGVzeWlTemRwMlNMQzJKWUlTcW1ZQkQ4L3IvNjZsd1RWbXQ3SldDZkRkVms5TWw1ZGJUZzI5WU12OUpvdEZGRXZhYTY3aFBYcHI5NzZ1TjhRblhEbWViMW1adHZVdmNScmIvUlVidkN5aUNNZ2lUTU0vMEszbFJ0M05iMDhnUW1WUWQ3STZZUU8ifV19" } }, { "ID": "12af619e194dd77d", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "480" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteMessageBatch" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJFbnRyaWVzIjpbeyJJZCI6IjAiLCJSZWNlaXB0SGFuZGxlIjoiQVFFQkV2OXdPMjZ5STBSOU5ycUdIcFZvR1p4U3owOHYyTm9GUWtxS2J5TWhObWVqZ3RMN29XRmpmYTJzWFRhMzNYQ21pUXc4bUZqNWsxMHRiQ0pxdllLQVF2TjgwNzVUZHQwV1BaSHMvY2VKRWxDQlpncjR4VVVtVUFWa2JMZkNSWEtIczBlTVRhMEVJWko4MVhLdkFvTjQ1aWhqK2tGaWZNcUpZeEgwb1dESWRJdTF6aGtxK25Vem1LdDRlc3lpU3pkcDJTTEMySllJU3FtWUJEOC9yLzY2bHdUVm10N0pXQ2ZEZFZrOU1sNWRiVGcyOVlNdjlKb3RGRkV2YWE2N2hQWHByOTc2dU44UW5YRG1lYjFtWnR2VXZjUnJiL1JVYnZDeWlDTWdpVE1NLzBLM2xSdDNOYjA4Z1FtVlFkN0k2WVFPIn1dLCJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ2MjM4MDIyNTcyMi9UZXN0RklGT1NRU1RvcGljVjJfVGVzdFNlbmRSZWNlaXZlVmFsaWQtdG9wLTEuZmlmbyJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "27" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Fri, 31 May 2024 21:33:13 GMT" ], "X-Amzn-Requestid": [ "a260c8a0-396f-5536-b34f-96747d362505" ] }, "Body": "eyJTdWNjZXNzZnVsIjpbeyJJZCI6IjAifV19" } }, { "ID": "f71c8f2024a0c6cf", "Request": { "Method": "POST", "URL": "https://sqs.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "114" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSQS.DeleteQueue" ] }, "MediaType": "application/x-amz-json-1.0", "BodyParts": [ "eyJRdWV1ZVVybCI6Imh0dHBzOi8vc3FzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tLzQ2MjM4MDIyNTcyMi9UZXN0RklGT1NRU1RvcGljVjJfVGVzdFNlbmRSZWNlaXZlVmFsaWQtdG9wLTEuZmlmbyJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "0" ], "Content-Type": [ "application/x-amz-json-1.0" ], "Date": [ "Fri, 31 May 2024 21:33:13 GMT" ], "X-Amzn-Requestid": [ "96248dd5-5ed5-5984-b591-d3011a8c89b7" ] }, "Body": "" } } ] } ================================================ FILE: pubsub/azuresb/azuresb.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package azuresb provides an implementation of pubsub using Azure Service // Bus Topic and Subscription. // See https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-messaging-overview for an overview. // // # URLs // // For pubsub.OpenTopic and pubsub.OpenSubscription, azuresb registers // for the scheme "azuresb". // The default URL opener will use a Service Bus Connection String based on // AZURE_SERVICEBUS_HOSTNAME or SERVICEBUS_CONNECTION_STRING environment variables. // SERVICEBUS_CONNECTION_STRING takes precedence. // To customize the URL opener, or for more details on the URL format, // see URLOpener. // See https://gocloud.dev/concepts/urls/ for background information. // // # Message Delivery Semantics // // Azure ServiceBus supports at-least-once semantics in the default Peek-Lock // mode; messages will be redelivered if they are not Acked, or if they are // explicitly Nacked. // // ServiceBus also supports a Receive-Delete mode, which essentially auto-acks a // message when it is delivered, resulting in at-most-once semantics. Set // SubscriberOptions.ReceiveAndDelete to true to tell azuresb.Subscription that // you've enabled Receive-Delete mode. When enabled, pubsub.Message.Ack is a // no-op, pubsub.Message.Nackable will return false, and pubsub.Message.Nack // will panic. // // See https://godoc.org/gocloud.dev/pubsub#hdr-At_most_once_and_At_least_once_Delivery // for more background. // // # As // // azuresb exposes the following types for As: // - Topic: *servicebus.Topic // - Subscription: *servicebus.Subscription // - Message.BeforeSend: *servicebus.Message // - Message.AfterSend: None // - Message: *servicebus.Message // - Error: common.Retryable, *amqp.Error, *amqp.LinkError package azuresb // import "gocloud.dev/pubsub/azuresb" import ( "context" "errors" "fmt" "net/url" "os" "path" "strconv" "strings" "sync" "time" common "github.com/Azure/azure-amqp-common-go/v3" "github.com/Azure/azure-sdk-for-go/sdk/azidentity" servicebus "github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus" "github.com/Azure/go-amqp" "gocloud.dev/gcerrors" "gocloud.dev/pubsub" "gocloud.dev/pubsub/batcher" "gocloud.dev/pubsub/driver" ) const ( defaultListenerTimeout = 2 * time.Second ) var sendBatcherOpts = &batcher.Options{ MaxBatchSize: 1, // SendBatch only supports one message at a time MaxHandlers: 100, // max concurrency for sends } var recvBatcherOpts = &batcher.Options{ MaxBatchSize: 50, MaxHandlers: 100, // max concurrency for reads } var ackBatcherOpts = &batcher.Options{ MaxBatchSize: 1, MaxHandlers: 100, // max concurrency for acks } func init() { o := new(defaultOpener) pubsub.DefaultURLMux().RegisterTopic(Scheme, o) pubsub.DefaultURLMux().RegisterSubscription(Scheme, o) } // defaultURLOpener creates an URLOpener with ConnectionString initialized from // AZURE_SERVICEBUS_HOSTNAME or SERVICEBUS_CONNECTION_STRING environment variables. // SERVICEBUS_CONNECTION_STRING takes precedence. type defaultOpener struct { init sync.Once opener *URLOpener err error } func (o *defaultOpener) defaultOpener() (*URLOpener, error) { o.init.Do(func() { cs := os.Getenv("SERVICEBUS_CONNECTION_STRING") sbHostname := os.Getenv("AZURE_SERVICEBUS_HOSTNAME") if cs == "" && sbHostname == "" { o.err = errors.New("Neither SERVICEBUS_CONNECTION_STRING nor AZURE_SERVICEBUS_HOSTNAME environment variables are set") return } o.opener = &URLOpener{ConnectionString: cs, ServiceBusHostname: sbHostname} }) return o.opener, o.err } func (o *defaultOpener) OpenTopicURL(ctx context.Context, u *url.URL) (*pubsub.Topic, error) { opener, err := o.defaultOpener() if err != nil { return nil, fmt.Errorf("open topic %v: %v", u, err) } return opener.OpenTopicURL(ctx, u) } func (o *defaultOpener) OpenSubscriptionURL(ctx context.Context, u *url.URL) (*pubsub.Subscription, error) { opener, err := o.defaultOpener() if err != nil { return nil, fmt.Errorf("open subscription %v: %v", u, err) } return opener.OpenSubscriptionURL(ctx, u) } // Scheme is the URL scheme azuresb registers its URLOpeners under on pubsub.DefaultMux. const Scheme = "azuresb" // URLOpener opens Azure Service Bus URLs like "azuresb://mytopic" for // topics or "azuresb://mytopic?subscription=mysubscription" for subscriptions. // // - The URL's host+path is used as the topic name. // - For subscriptions, the subscription name must be provided in the // "subscription" query parameter. // - For subscriptions, the ListenerTimeout can be overridden with time.Duration parseable values in "listener_timeout". // // No other query parameters are supported. type URLOpener struct { // ConnectionString is the Service Bus connection string (required if ServiceBusHostname is not defined). // https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-dotnet-get-started-with-queues ConnectionString string // Azure ServiceBus hostname. // https://learn.microsoft.com/en-us/azure/service-bus-messaging/service-bus-go-how-to-use-queues?tabs=bash ServiceBusHostname string // ClientOptions are options when creating the Client. ServiceBusClientOptions *servicebus.ClientOptions // Options passed when creating the ServiceBus Topic/Subscription. ServiceBusSenderOptions *servicebus.NewSenderOptions ServiceBusReceiverOptions *servicebus.ReceiverOptions // TopicOptions specifies the options to pass to OpenTopic. TopicOptions TopicOptions // SubscriptionOptions specifies the options to pass to OpenSubscription. SubscriptionOptions SubscriptionOptions } func (o *URLOpener) sbClient(kind string, u *url.URL) (*servicebus.Client, error) { if o.ConnectionString == "" && o.ServiceBusHostname == "" { return nil, fmt.Errorf("open %s %v: one of ConnectionString or ServiceBusHostname is required", kind, u) } // Auth using shared key. if o.ConnectionString != "" { client, err := NewClientFromConnectionString(o.ConnectionString, o.ServiceBusClientOptions) if err != nil { return nil, fmt.Errorf("open %s %v: invalid connection string %q: %v", kind, u, o.ConnectionString, err) } return client, nil } // Auth using Azure AAD Workload Identity/AAD Pod Identities/AKS Kubelet Identity/Service Principal. client, err := NewClientFromServiceBusHostname(o.ServiceBusHostname, o.ServiceBusClientOptions) if err != nil { return nil, fmt.Errorf("open %s %v: invalid service bus hostname %q: %v", kind, u, o.ServiceBusHostname, err) } return client, nil } // OpenTopicURL opens a pubsub.Topic based on u. func (o *URLOpener) OpenTopicURL(ctx context.Context, u *url.URL) (*pubsub.Topic, error) { sbClient, err := o.sbClient("topic", u) if err != nil { return nil, err } for param := range u.Query() { return nil, fmt.Errorf("open topic %v: invalid query parameter %q", u, param) } topicName := path.Join(u.Host, u.Path) sbSender, err := NewSender(sbClient, topicName, o.ServiceBusSenderOptions) if err != nil { return nil, fmt.Errorf("open topic %v: couldn't open topic %q: %v", u, topicName, err) } return OpenTopic(ctx, sbSender, &o.TopicOptions) } // OpenSubscriptionURL opens a pubsub.Subscription based on u. func (o *URLOpener) OpenSubscriptionURL(ctx context.Context, u *url.URL) (*pubsub.Subscription, error) { sbClient, err := o.sbClient("subscription", u) if err != nil { return nil, err } topicName := path.Join(u.Host, u.Path) q := u.Query() subName := q.Get("subscription") q.Del("subscription") if subName == "" { return nil, fmt.Errorf("open subscription %v: missing required query parameter subscription", u) } opts := o.SubscriptionOptions if lts := q.Get("listener_timeout"); lts != "" { q.Del("listener_timeout") d, err := time.ParseDuration(lts) if err != nil { return nil, fmt.Errorf("open subscription %v: invalid listener_timeout %q: %v", u, lts, err) } opts.ListenerTimeout = d } if mrbss := q.Get("max_recv_batch_size"); mrbss != "" { q.Del("max_recv_batch_size") mrbs, err := strconv.Atoi(mrbss) if err != nil { return nil, fmt.Errorf("open subscription %v: invalid max_recv_batch_size %q: %v", u, mrbss, err) } opts.ReceiveBatcherOptions.MaxBatchSize = mrbs } for param := range q { return nil, fmt.Errorf("open subscription %v: invalid query parameter %q", u, param) } sbReceiver, err := NewReceiver(sbClient, topicName, subName, o.ServiceBusReceiverOptions) if err != nil { return nil, fmt.Errorf("open subscription %v: couldn't open subscription %q: %v", u, subName, err) } return OpenSubscription(ctx, sbClient, sbReceiver, &opts) } type topic struct { sbSender *servicebus.Sender } // TopicOptions provides configuration options for an Azure SB Topic. type TopicOptions struct { // BatcherOptions adds constraints to the default batching done for sends. BatcherOptions batcher.Options } // NewClientFromConnectionString returns a *servicebus.Client from a Service Bus connection string, using shared key for auth. // https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-dotnet-get-started-with-queues func NewClientFromConnectionString(connectionString string, opts *servicebus.ClientOptions) (*servicebus.Client, error) { return servicebus.NewClientFromConnectionString(connectionString, opts) } // NewClientFromConnectionString returns a *servicebus.Client from a Service Bus connection string, using shared key for auth. // for example you can use workload identity autorization. // https://learn.microsoft.com/en-us/azure/service-bus-messaging/service-bus-go-how-to-use-queues?tabs=bash func NewClientFromServiceBusHostname(serviceBusHostname string, opts *servicebus.ClientOptions) (*servicebus.Client, error) { cred, err := azidentity.NewDefaultAzureCredential(nil) if err != nil { return nil, err } client, err := servicebus.NewClient(serviceBusHostname, cred, opts) if err != nil { return nil, err } return client, nil } // NewSender returns a *servicebus.Sender associated with a Service Bus Client. func NewSender(sbClient *servicebus.Client, topicName string, opts *servicebus.NewSenderOptions) (*servicebus.Sender, error) { return sbClient.NewSender(topicName, opts) } // NewReceiver returns a *servicebus.Receiver associated with a Service Bus Topic. func NewReceiver(sbClient *servicebus.Client, topicName, subscriptionName string, opts *servicebus.ReceiverOptions) (*servicebus.Receiver, error) { return sbClient.NewReceiverForSubscription(topicName, subscriptionName, opts) } // OpenTopic initializes a pubsub Topic on a given Service Bus Sender. func OpenTopic(ctx context.Context, sbSender *servicebus.Sender, opts *TopicOptions) (*pubsub.Topic, error) { t, err := openTopic(ctx, sbSender, opts) if err != nil { return nil, err } if opts == nil { opts = &TopicOptions{} } bo := sendBatcherOpts.NewMergedOptions(&opts.BatcherOptions) return pubsub.NewTopic(t, bo), nil } // openTopic returns the driver for OpenTopic. This function exists so the test // harness can get the driver interface implementation if it needs to. func openTopic(ctx context.Context, sbSender *servicebus.Sender, _ *TopicOptions) (driver.Topic, error) { if sbSender == nil { return nil, errors.New("azuresb: OpenTopic requires a Service Bus Sender") } return &topic{sbSender: sbSender}, nil } // SendBatch implements driver.Topic.SendBatch. func (t *topic) SendBatch(ctx context.Context, dms []*driver.Message) error { if len(dms) != 1 { panic("azuresb.SendBatch should only get one message at a time") } dm := dms[0] sbms := &servicebus.Message{Body: dm.Body} if len(dm.Metadata) > 0 { sbms.ApplicationProperties = map[string]any{} for k, v := range dm.Metadata { sbms.ApplicationProperties[k] = v } } if dm.BeforeSend != nil { asFunc := func(i any) bool { if p, ok := i.(**servicebus.Message); ok { *p = sbms return true } return false } if err := dm.BeforeSend(asFunc); err != nil { return err } } err := t.sbSender.SendMessage(ctx, sbms, nil) if err != nil { return err } if dm.AfterSend != nil { asFunc := func(i any) bool { return false } if err := dm.AfterSend(asFunc); err != nil { return err } } return nil } func (t *topic) IsRetryable(err error) bool { _, retryable := errorCode(err) return retryable } func (t *topic) As(i any) bool { p, ok := i.(**servicebus.Sender) if !ok { return false } *p = t.sbSender return true } // ErrorAs implements driver.Topic.ErrorAs func (*topic) ErrorAs(err error, i any) bool { return errorAs(err, i) } func errorAs(err error, i any) bool { switch v := err.(type) { case *amqp.LinkError: if p, ok := i.(**amqp.LinkError); ok { *p = v return true } case *amqp.Error: if p, ok := i.(**amqp.Error); ok { *p = v return true } case common.Retryable: if p, ok := i.(*common.Retryable); ok { *p = v return true } } return false } func (*topic) ErrorCode(err error) gcerrors.ErrorCode { code, _ := errorCode(err) return code } // Close implements driver.Topic.Close. func (*topic) Close() error { return nil } type subscription struct { sbReceiver *servicebus.Receiver opts *SubscriptionOptions } // SubscriptionOptions will contain configuration for subscriptions. type SubscriptionOptions struct { // If false, the serviceBus.Subscription MUST be in the default Peek-Lock mode. // If true, the serviceBus.Subscription MUST be in Receive-and-Delete mode. // When true: pubsub.Message.Ack will be a no-op, pubsub.Message.Nackable // will return true, and pubsub.Message.Nack will panic. ReceiveAndDelete bool // ReceiveBatcherOptions adds constraints to the default batching done for receives. ReceiveBatcherOptions batcher.Options // AckBatcherOptions adds constraints to the default batching done for acks. // Only used when ReceiveAndDelete is false. AckBatcherOptions batcher.Options // ListenerTimeout is the amount of time to wait before timing out the // ReceiveMessages RPC call. This is used to ensure the receive operation is // non-blocking as the RPC blocks if there are no messages. // Defaults to 2 seconds. ListenerTimeout time.Duration } // OpenSubscription initializes a pubsub Subscription on a given Service Bus Subscription and its parent Service Bus Topic. func OpenSubscription(ctx context.Context, sbClient *servicebus.Client, sbReceiver *servicebus.Receiver, opts *SubscriptionOptions) (*pubsub.Subscription, error) { ds, err := openSubscription(ctx, sbClient, sbReceiver, opts) if err != nil { return nil, err } if opts == nil { opts = &SubscriptionOptions{} } rbo := recvBatcherOpts.NewMergedOptions(&opts.ReceiveBatcherOptions) abo := ackBatcherOpts.NewMergedOptions(&opts.AckBatcherOptions) return pubsub.NewSubscription(ds, rbo, abo), nil } // openSubscription returns a driver.Subscription. func openSubscription(ctx context.Context, sbClient *servicebus.Client, sbReceiver *servicebus.Receiver, opts *SubscriptionOptions) (driver.Subscription, error) { if sbClient == nil { return nil, errors.New("azuresb: OpenSubscription requires a Service Bus Client") } if sbReceiver == nil { return nil, errors.New("azuresb: OpenSubscription requires a Service Bus Receiver") } if opts == nil { opts = &SubscriptionOptions{} } if opts.ListenerTimeout == 0 { opts.ListenerTimeout = defaultListenerTimeout } return &subscription{sbReceiver: sbReceiver, opts: opts}, nil } // IsRetryable implements driver.Subscription.IsRetryable. func (s *subscription) IsRetryable(err error) bool { _, retryable := errorCode(err) return retryable } // As implements driver.Subscription.As. func (s *subscription) As(i any) bool { p, ok := i.(**servicebus.Receiver) if !ok { return false } *p = s.sbReceiver return true } // ErrorAs implements driver.Subscription.ErrorAs func (s *subscription) ErrorAs(err error, i any) bool { return errorAs(err, i) } func (s *subscription) ErrorCode(err error) gcerrors.ErrorCode { code, _ := errorCode(err) return code } // ReceiveBatch implements driver.Subscription.ReceiveBatch. func (s *subscription) ReceiveBatch(ctx context.Context, maxMessages int) ([]*driver.Message, error) { // ReceiveMessages will block until rctx is Done; we want to return after // a reasonably short delay even if there are no messages. So, create a // sub context for the RPC. rctx, cancel := context.WithTimeout(ctx, s.opts.ListenerTimeout) defer cancel() var messages []*driver.Message sbmsgs, err := s.sbReceiver.ReceiveMessages(rctx, maxMessages, nil) for _, sbmsg := range sbmsgs { metadata := map[string]string{} for key, value := range sbmsg.ApplicationProperties { if strVal, ok := value.(string); ok { metadata[key] = strVal } } messages = append(messages, &driver.Message{ LoggableID: sbmsg.MessageID, Body: sbmsg.Body, Metadata: metadata, AckID: sbmsg, AsFunc: messageAsFunc(sbmsg), }) } // Mask rctx timeouts, they are expected if no messages are available. if err == rctx.Err() { err = nil } return messages, err } func messageAsFunc(sbmsg *servicebus.ReceivedMessage) func(any) bool { return func(i any) bool { p, ok := i.(**servicebus.ReceivedMessage) if !ok { return false } *p = sbmsg return true } } // SendAcks implements driver.Subscription.SendAcks. func (s *subscription) SendAcks(ctx context.Context, ids []driver.AckID) error { if s.opts.ReceiveAndDelete { // Ack is a no-op in Receive-and-Delete mode. return nil } var err error for _, id := range ids { oneErr := s.sbReceiver.CompleteMessage(ctx, id.(*servicebus.ReceivedMessage), nil) if oneErr != nil { err = oneErr } } return err } // CanNack implements driver.CanNack. func (s *subscription) CanNack() bool { if s == nil { return false } return !s.opts.ReceiveAndDelete } // SendNacks implements driver.Subscription.SendNacks. func (s *subscription) SendNacks(ctx context.Context, ids []driver.AckID) error { if !s.CanNack() { panic("unreachable") } var err error for _, id := range ids { oneErr := s.sbReceiver.AbandonMessage(ctx, id.(*servicebus.ReceivedMessage), nil) if oneErr != nil { err = oneErr } } return err } // errorCode returns an error code and whether err is retryable. func errorCode(err error) (gcerrors.ErrorCode, bool) { // Unfortunately Azure sometimes returns common.Retryable or even // errors.errorString, which don't expose anything other than the error // string :-(. if strings.Contains(err.Error(), "status code 404") { return gcerrors.NotFound, false } if strings.Contains(err.Error(), "status code 401") { return gcerrors.PermissionDenied, false } var cond amqp.ErrCond var aderr *amqp.LinkError var aerr *amqp.Error if errors.As(err, &aderr) { if aderr.RemoteErr == nil { return gcerrors.NotFound, false } cond = aderr.RemoteErr.Condition } else if errors.As(err, &aerr) { cond = aerr.Condition } switch cond { case amqp.ErrCondNotFound: return gcerrors.NotFound, false case amqp.ErrCondPreconditionFailed: return gcerrors.FailedPrecondition, false case amqp.ErrCondInternalError: return gcerrors.Internal, true case amqp.ErrCondNotImplemented: return gcerrors.Unimplemented, false case amqp.ErrCondUnauthorizedAccess, amqp.ErrCondNotAllowed: return gcerrors.PermissionDenied, false case amqp.ErrCondResourceLimitExceeded: return gcerrors.ResourceExhausted, true case amqp.ErrCondInvalidField: return gcerrors.InvalidArgument, false } return gcerrors.Unknown, true } // Close implements driver.Subscription.Close. func (*subscription) Close() error { return nil } ================================================ FILE: pubsub/azuresb/azuresb_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package azuresb import ( "context" "fmt" "os" "strings" "sync/atomic" "testing" "gocloud.dev/internal/testing/setup" "gocloud.dev/pubsub" "gocloud.dev/pubsub/driver" "gocloud.dev/pubsub/drivertest" "github.com/Azure/azure-sdk-for-go/sdk/azidentity" servicebus "github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus" "github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus/admin" ) var ( // See docs below on how to provision an Azure Service Bus Namespace and obtaining the connection string. // https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-dotnet-get-started-with-queues connString = os.Getenv("SERVICEBUS_CONNECTION_STRING") sbHostname = os.Getenv("AZURE_SERVICEBUS_HOSTNAME") ) const ( nonexistentTopicName = "nonexistent-topic" // Try to keep the entity name under Azure limits. // https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-quotas // says 50, but there appears to be some additional overhead. 40 works. maxNameLen = 40 ) type harness struct { adminClient *admin.Client sbClient *servicebus.Client numTopics uint32 // atomic numSubs uint32 // atomic closer func() autodelete bool topics map[driver.Topic]string } func newHarness(ctx context.Context, t *testing.T) (drivertest.Harness, error) { t.Helper() if connString == "" && sbHostname == "" { return nil, fmt.Errorf("azuresb: test harness requires environment variable SERVICEBUS_CONNECTION_STRING or AZURE_SERVICEBUS_HOSTNAME to run") } adminClient, err := admin.NewClientFromConnectionString(connString, nil) if err != nil { return nil, err } sbClient, err := NewClientFromConnectionString(connString, nil) if err != nil { return nil, err } noop := func() {} return &harness{ adminClient: adminClient, sbClient: sbClient, closer: noop, topics: map[driver.Topic]string{}, }, nil } func newHarnessUsingAutodelete(ctx context.Context, t *testing.T) (drivertest.Harness, error) { t.Helper() h, err := newHarness(ctx, t) if err == nil { h.(*harness).autodelete = true } return h, err } func (h *harness) CreateTopic(ctx context.Context, testName string) (dt driver.Topic, cleanup func(), err error) { topicName := sanitize(fmt.Sprintf("%s-top-%d", testName, atomic.AddUint32(&h.numTopics, 1))) if err := createTopic(ctx, topicName, h.adminClient, nil); err != nil { return nil, nil, err } sbSender, err := NewSender(h.sbClient, topicName, nil) dt, err = openTopic(ctx, sbSender, nil) if err != nil { return nil, nil, err } h.topics[dt] = topicName cleanup = func() { sbSender.Close(ctx) deleteTopic(ctx, topicName, h.adminClient) } return dt, cleanup, nil } func (h *harness) MakeNonexistentTopic(ctx context.Context) (driver.Topic, error) { sbSender, err := NewSender(h.sbClient, nonexistentTopicName, nil) if err != nil { return nil, err } dt, err := openTopic(ctx, sbSender, nil) if err != nil { return nil, err } h.topics[dt] = nonexistentTopicName return dt, nil } func (h *harness) CreateSubscription(ctx context.Context, dt driver.Topic, testName string) (ds driver.Subscription, cleanup func(), err error) { subName := sanitize(fmt.Sprintf("%s-sub-%d", testName, atomic.AddUint32(&h.numSubs, 1))) topicName := h.topics[dt] err = createSubscription(ctx, topicName, subName, h.adminClient, nil) if err != nil { return nil, nil, err } var opts servicebus.ReceiverOptions if h.autodelete { opts.ReceiveMode = servicebus.ReceiveModeReceiveAndDelete } sbReceiver, err := NewReceiver(h.sbClient, topicName, subName, &opts) if err != nil { return nil, nil, err } sopts := SubscriptionOptions{} if h.autodelete { sopts.ReceiveAndDelete = true } ds, err = openSubscription(ctx, h.sbClient, sbReceiver, &sopts) if err != nil { return nil, nil, err } cleanup = func() { sbReceiver.Close(ctx) deleteSubscription(ctx, topicName, subName, h.adminClient) } return ds, cleanup, nil } func (h *harness) MakeNonexistentSubscription(ctx context.Context) (driver.Subscription, func(), error) { const topicName = "topic-for-nonexistent-sub" _, cleanup, err := h.CreateTopic(ctx, topicName) if err != nil { return nil, nil, err } sbReceiver, err := NewReceiver(h.sbClient, topicName, "nonexistent-subscription", nil) if err != nil { return nil, cleanup, err } sub, err := openSubscription(ctx, h.sbClient, sbReceiver, nil) return sub, cleanup, err } func (h *harness) Close() { h.closer() } func (h *harness) MaxBatchSizes() (int, int) { return sendBatcherOpts.MaxBatchSize, 0 } func (h *harness) SupportsMultipleSubscriptions() bool { return true } // Please run the TestConformance with an extended timeout since each test needs to perform CRUD for ServiceBus Topics and Subscriptions. // Example: C:\Go\bin\go.exe test -timeout 60s gocloud.dev/pubsub/azuresb -run ^TestConformance$ func TestConformance(t *testing.T) { if !*setup.Record { t.Skip("replaying is not yet supported for Azure pubsub") } asTests := []drivertest.AsTest{sbAsTest{}} drivertest.RunConformanceTests(t, newHarness, asTests) } func TestConformanceWithAutodelete(t *testing.T) { if !*setup.Record { t.Skip("replaying is not yet supported for Azure pubsub") } asTests := []drivertest.AsTest{sbAsTest{}} drivertest.RunConformanceTests(t, newHarnessUsingAutodelete, asTests) } type sbAsTest struct{} func (sbAsTest) Name() string { return "azure" } func (sbAsTest) TopicCheck(topic *pubsub.Topic) error { var t2 servicebus.Sender if topic.As(&t2) { return fmt.Errorf("cast succeeded for %T, want failure", &t2) } var t3 *servicebus.Sender if !topic.As(&t3) { return fmt.Errorf("cast failed for %T", &t3) } return nil } func (sbAsTest) SubscriptionCheck(sub *pubsub.Subscription) error { var s2 servicebus.Receiver if sub.As(&s2) { return fmt.Errorf("cast succeeded for %T, want failure", &s2) } var s3 *servicebus.Receiver if !sub.As(&s3) { return fmt.Errorf("cast failed for %T", &s3) } return nil } func (sbAsTest) TopicErrorCheck(t *pubsub.Topic, err error) error { return nil } func (sbAsTest) SubscriptionErrorCheck(s *pubsub.Subscription, err error) error { return nil } func (sbAsTest) MessageCheck(m *pubsub.Message) error { var m2 servicebus.ReceivedMessage if m.As(&m2) { return fmt.Errorf("cast succeeded for %T, want failure", &m2) } var m3 *servicebus.ReceivedMessage if !m.As(&m3) { return fmt.Errorf("cast failed for %T", &m3) } return nil } func (sbAsTest) BeforeSend(as func(any) bool) error { var m *servicebus.Message if !as(&m) { return fmt.Errorf("cast failed for %T", &m) } return nil } func (sbAsTest) AfterSend(as func(any) bool) error { return nil } func sanitize(s string) string { // First trim some not-so-useful strings that are part of all test names. s = strings.Replace(s, "TestConformance/Test", "", 1) s = strings.Replace(s, "TestConformanceWithAutodelete/Test", "", 1) s = strings.Replace(s, "/", "_", -1) if len(s) > maxNameLen { // Drop prefix, not suffix, because suffix includes something to make // entities unique within a test. s = s[len(s)-maxNameLen:] } return s } // createTopic ensures the existence of a Service Bus Topic on a given Namespace. func createTopic(ctx context.Context, topicName string, adminClient *admin.Client, properties *admin.TopicProperties) error { t, _ := adminClient.GetTopic(ctx, topicName, nil) if t != nil { _, _ = adminClient.DeleteTopic(ctx, topicName, nil) } opts := admin.CreateTopicOptions{ Properties: properties, } _, err := adminClient.CreateTopic(ctx, topicName, &opts) return err } // deleteTopic removes a Service Bus Topic on a given Namespace. func deleteTopic(ctx context.Context, topicName string, adminClient *admin.Client) error { t, _ := adminClient.GetTopic(ctx, topicName, nil) if t != nil { _, err := adminClient.DeleteTopic(ctx, topicName, nil) return err } return nil } // createSubscription ensures the existence of a Service Bus Subscription on a given Namespace and Topic. func createSubscription(ctx context.Context, topicName, subscriptionName string, adminClient *admin.Client, properties *admin.SubscriptionProperties) error { s, _ := adminClient.GetSubscription(ctx, topicName, subscriptionName, nil) if s != nil { _, _ = adminClient.DeleteSubscription(ctx, topicName, subscriptionName, nil) } opts := admin.CreateSubscriptionOptions{ Properties: properties, } _, err := adminClient.CreateSubscription(ctx, topicName, subscriptionName, &opts) return err } // deleteSubscription removes a Service Bus Subscription on a given Namespace and Topic. func deleteSubscription(ctx context.Context, topicName, subscriptionName string, adminClient *admin.Client) error { se, _ := adminClient.GetSubscription(ctx, topicName, subscriptionName, nil) if se != nil { _, err := adminClient.DeleteSubscription(ctx, topicName, subscriptionName, nil) return err } return nil } // to run test using Azure Entra credentials: // 1. grant access to ${AZURE_CLIENT_ID} to Service Bus namespace // 2. run test: // AZURE_CLIENT_SECRET='secret' \ // AZURE_CLIENT_ID=client_id_uud \ // AZURE_TENANT_ID=tenant_id_uuid \ // AZURE_SERVICEBUS_HOSTNAME=hostname go test -benchmem -run=^$ -bench ^BenchmarkAzureServiceBusPubSub$ gocloud.dev/pubsub/azuresb func BenchmarkAzureServiceBusPubSub(b *testing.B) { const ( benchmarkTopicName = "benchmark-topic" benchmarkSubscriptionName = "benchmark-subscription" ) ctx := context.Background() var adminClient *admin.Client var sbClient *servicebus.Client var err error if connString == "" && sbHostname == "" { b.Fatal("azuresb: benchmark requires environment variable SERVICEBUS_CONNECTION_STRING or AZURE_SERVICEBUS_HOSTNAME to run") } if connString != "" { adminClient, err = admin.NewClientFromConnectionString(connString, nil) if err != nil { b.Fatal(err) } sbClient, err = NewClientFromConnectionString(connString, nil) if err != nil { b.Fatal(err) } } else if sbHostname != "" { cred, err := azidentity.NewDefaultAzureCredential(nil) if err != nil { b.Fatal(err) } adminClient, err = admin.NewClient(sbHostname, cred, nil) if err != nil { b.Fatal(err) } sbClient, err = NewClientFromServiceBusHostname(sbHostname, nil) if err != nil { b.Fatal(err) } } // Make topic. if err := createTopic(ctx, benchmarkTopicName, adminClient, nil); err != nil { b.Fatal(err) } defer deleteTopic(ctx, benchmarkTopicName, adminClient) sbSender, err := NewSender(sbClient, benchmarkTopicName, nil) if err != nil { b.Fatal(err) } defer sbSender.Close(ctx) topic, err := OpenTopic(ctx, sbSender, nil) if err != nil { b.Fatal(err) } defer topic.Shutdown(ctx) // Make subscription. if err := createSubscription(ctx, benchmarkTopicName, benchmarkSubscriptionName, adminClient, nil); err != nil { b.Fatal(err) } sbReceiver, err := NewReceiver(sbClient, benchmarkTopicName, benchmarkSubscriptionName, nil) if err != nil { b.Fatal(err) } sub, err := OpenSubscription(ctx, sbClient, sbReceiver, nil) if err != nil { b.Fatal(err) } defer sub.Shutdown(ctx) drivertest.RunBenchmarks(b, topic, sub) } func fakeConnectionStringInEnv() func() { oldEnvVal := os.Getenv("SERVICEBUS_CONNECTION_STRING") os.Setenv("SERVICEBUS_CONNECTION_STRING", "Endpoint=sb://foo.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=mykey") return func() { os.Setenv("SERVICEBUS_CONNECTION_STRING", oldEnvVal) } } func TestOpenTopicFromURL(t *testing.T) { cleanup := fakeConnectionStringInEnv() defer cleanup() tests := []struct { URL string WantErr bool }{ // OK. {"azuresb://mytopic", false}, // Invalid parameter. {"azuresb://mytopic?param=value", true}, } ctx := context.Background() for _, test := range tests { topic, err := pubsub.OpenTopic(ctx, test.URL) if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } if topic != nil { topic.Shutdown(ctx) } } } func TestOpenSubscriptionFromURL(t *testing.T) { cleanup := fakeConnectionStringInEnv() defer cleanup() tests := []struct { URL string WantErr bool }{ // OK. {"azuresb://mytopic?subscription=mysub", false}, // Missing subscription. {"azuresb://mytopic", true}, // Setting listener_timeout. {"azuresb://mytopic?subscription=mysub&listener_timeout=10s", false}, // Invalid listener_timeout. {"azuresb://mytopic?subscription=mysub&listener_timeout=xxx", true}, // Invalid parameter. {"azuresb://mytopic?subscription=mysub¶m=value", true}, } ctx := context.Background() for _, test := range tests { sub, err := pubsub.OpenSubscription(ctx, test.URL) if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } if sub != nil { sub.Shutdown(ctx) } } } ================================================ FILE: pubsub/azuresb/example_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package azuresb_test import ( "context" "log" "os" servicebus "github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus" "gocloud.dev/pubsub" "gocloud.dev/pubsub/azuresb" ) func ExampleOpenTopic() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // Change these as needed for your application. connString := os.Getenv("SERVICEBUS_CONNECTION_STRING") topicName := "test-topic" if connString == "" { log.Fatal("Service Bus ConnectionString is not set") } // Connect to Azure Service Bus for the given topic. sbClient, err := azuresb.NewClientFromConnectionString(connString, nil) if err != nil { log.Fatal(err) } sbSender, err := azuresb.NewSender(sbClient, topicName, nil) if err != nil { log.Fatal(err) } defer sbSender.Close(ctx) // Construct a *pubsub.Topic. topic, err := azuresb.OpenTopic(ctx, sbSender, nil) if err != nil { log.Fatal(err) } defer topic.Shutdown(ctx) } func Example_openTopicFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/pubsub/azuresb" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // pubsub.OpenTopic creates a *pubsub.Topic from a URL. // This URL will open the topic "mytopic" using a connection string // from the environment variable SERVICEBUS_CONNECTION_STRING. topic, err := pubsub.OpenTopic(ctx, "azuresb://mytopic") if err != nil { log.Fatal(err) } defer topic.Shutdown(ctx) } func ExampleOpenSubscription() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // Change these as needed for your application. serviceBusConnString := os.Getenv("SERVICEBUS_CONNECTION_STRING") const topicName = "test-topic" const subscriptionName = "test-subscription" // Connect to Azure Service Bus for the given subscription. sbClient, err := azuresb.NewClientFromConnectionString(serviceBusConnString, nil) if err != nil { log.Fatal(err) } sbReceiver, err := azuresb.NewReceiver(sbClient, topicName, subscriptionName, nil) if err != nil { log.Fatal(err) } defer sbReceiver.Close(ctx) // Construct a *pubsub.Subscription. subscription, err := azuresb.OpenSubscription(ctx, sbClient, sbReceiver, nil) if err != nil { log.Fatal(err) } defer subscription.Shutdown(ctx) } func Example_openSubscriptionFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/pubsub/azuresb" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // pubsub.OpenSubscription creates a *pubsub.Subscription from a URL. // This URL will open the subscription "mysubscription" for the topic // "mytopic" using a connection string from the environment variable // SERVICEBUS_CONNECTION_STRING. subscription, err := pubsub.OpenSubscription(ctx, "azuresb://mytopic?subscription=mysubscription") if err != nil { log.Fatal(err) } defer subscription.Shutdown(ctx) } func ExampleOpenSubscription_inReceiveAndDeleteMode() { ctx := context.Background() // Change these as needed for your application. serviceBusConnString := os.Getenv("SERVICEBUS_CONNECTION_STRING") const topicName = "test-topic" const subscriptionName = "test-subscription" // Connect to Azure Service Bus for the given subscription. sbClient, err := azuresb.NewClientFromConnectionString(serviceBusConnString, nil) if err != nil { log.Fatal(err) } // Create the azuresb.Subscription, configuring it with the // ReceiveAndDelete option. // See https://godoc.org/github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus#SubscriptionWithReceiveAndDelete. sbReceiverOptions := &servicebus.ReceiverOptions{ ReceiveMode: servicebus.ReceiveModeReceiveAndDelete, } sbReceiver, err := azuresb.NewReceiver(sbClient, topicName, subscriptionName, sbReceiverOptions) if err != nil { log.Fatal(err) } defer sbReceiver.Close(ctx) // Construct a *pubsub.Subscription. Since we configured // the azuresb.Subscription with ReceiveAndDelete mode, we need // to set SubscriptionOptions.ReceiveAndDelete = true. subscription, err := azuresb.OpenSubscription(ctx, sbClient, sbReceiver, &azuresb.SubscriptionOptions{ReceiveAndDelete: true}) if err != nil { log.Fatal(err) } defer subscription.Shutdown(ctx) } ================================================ FILE: pubsub/azuresb/testdata/README ================================================ This directory is here just so that the prerelease script (internal/testing/prerelease.sh) will run this package's tests with -record. ================================================ FILE: pubsub/batcher/batcher.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package batcher supports batching of items. Create a Batcher with a handler and // add items to it. Items are accumulated while handler calls are in progress; when // the handler returns, it will be called again with items accumulated since the last // call. Multiple concurrent calls to the handler are supported. package batcher // import "gocloud.dev/pubsub/batcher" import ( "context" "errors" "reflect" "sync" ) // Split determines how to split n (representing n items) into batches based on // opts. It returns a slice of batch sizes. // // For example, Split(10) might return [10], [5, 5], or [2, 2, 2, 2, 2] // depending on opts. opts may be nil to accept defaults. // // Split will return nil if n is less than o.MinBatchSize. // // The sum of returned batches may be less than n (e.g., if n is 10x larger // than o.MaxBatchSize, but o.MaxHandlers is less than 10). func Split(n int, opts *Options) []int { o := newOptionsWithDefaults(opts) if n < o.MinBatchSize { // No batch yet. return nil } if o.MaxBatchSize == 0 { // One batch is fine. return []int{n} } // TODO(rvangent): Consider trying to even out the batch sizes. // For example, n=10 with MaxBatchSize 9 and MaxHandlers 2 will Split // to [9, 1]; it could be [5, 5]. var batches []int for n >= o.MinBatchSize && len(batches) < o.MaxHandlers { b := min(o.MaxBatchSize, n) batches = append(batches, b) n -= b } return batches } // A Batcher batches items. type Batcher struct { opts Options handler func(any) error itemSliceZero reflect.Value // nil (zero value) for slice of items wg sync.WaitGroup // tracks active Add calls mu sync.Mutex pending []waiter // items waiting to be handled nHandlers int // number of currently running handler goroutines shutdown bool } // Message is larger than the maximum batch byte size var ErrMessageTooLarge = errors.New("batcher: message too large") type sizableItem interface { ByteSize() int } type waiter struct { item any errc chan error } // Options sets options for Batcher. type Options struct { // Maximum number of concurrent handlers. Defaults to 1. MaxHandlers int // Minimum size of a batch. Defaults to 1. // May be ignored during shutdown. MinBatchSize int // Maximum size of a batch. 0 means no limit. MaxBatchSize int // Maximum bytesize of a batch. 0 means no limit. MaxBatchByteSize int } // newOptionsWithDefaults returns Options with defaults applied to opts. // opts may be nil to accept all defaults. func newOptionsWithDefaults(opts *Options) Options { var o Options if opts != nil { o = *opts } if o.MaxHandlers == 0 { o.MaxHandlers = 1 } if o.MinBatchSize == 0 { o.MinBatchSize = 1 } return o } // newMergedOptions returns o merged with opts. func (o *Options) NewMergedOptions(opts *Options) *Options { maxH := o.MaxHandlers if opts.MaxHandlers != 0 && (maxH == 0 || opts.MaxHandlers < maxH) { maxH = opts.MaxHandlers } minB := o.MinBatchSize if opts.MinBatchSize != 0 && (minB == 0 || opts.MinBatchSize > minB) { minB = opts.MinBatchSize } maxB := o.MaxBatchSize if opts.MaxBatchSize != 0 && (maxB == 0 || opts.MaxBatchSize < maxB) { maxB = opts.MaxBatchSize } maxBB := o.MaxBatchByteSize if opts.MaxBatchByteSize != 0 && (maxBB == 0 || opts.MaxBatchByteSize < maxBB) { maxBB = opts.MaxBatchByteSize } c := &Options{ MaxHandlers: maxH, MinBatchSize: minB, MaxBatchSize: maxB, MaxBatchByteSize: maxBB, } return c } // New creates a new Batcher. // // itemType is type that will be batched. For example, if you // want to create batches of *Entry, pass reflect.TypeOf(&Entry{}) for itemType. // // opts can be nil to accept defaults. // // handler is a function that will be called on each bundle. If itemExample is // of type T, the argument to handler is of type []T. func New(itemType reflect.Type, opts *Options, handler func(any) error) *Batcher { return &Batcher{ opts: newOptionsWithDefaults(opts), handler: handler, itemSliceZero: reflect.Zero(reflect.SliceOf(itemType)), } } // Add adds an item to the batcher. It blocks until the handler has // processed the item and reports the error that the handler returned. // If Shutdown has been called, Add immediately returns an error. func (b *Batcher) Add(ctx context.Context, item any) error { c := b.AddNoWait(item) // Wait until either our result is ready or the context is done. select { case err := <-c: return err case <-ctx.Done(): return ctx.Err() } } // AddNoWait adds an item to the batcher and returns immediately. When the handler is // called on the item, the handler's error return value will be sent to the channel // returned from AddNoWait. func (b *Batcher) AddNoWait(item any) <-chan error { b.mu.Lock() defer b.mu.Unlock() // Create a channel to receive the error from the handler. c := make(chan error, 1) if b.shutdown { c <- errors.New("batcher: shut down") return c } if b.opts.MaxBatchByteSize > 0 { if sizable, ok := item.(sizableItem); ok { if sizable.ByteSize() > b.opts.MaxBatchByteSize { c <- ErrMessageTooLarge return c } } } // Add the item to the pending list. b.pending = append(b.pending, waiter{item, c}) if b.nHandlers < b.opts.MaxHandlers { // If we can start a handler, do so with the item just added and any others that are pending. b.handleBatch(b.nextBatch()) } // If we can't start a handler, then one of the currently running handlers will // take our item. return c } // Requires b.mu be held. func (b *Batcher) handleBatch(batch []waiter) { if len(batch) == 0 { return } b.wg.Add(1) go func() { b.callHandler(batch) b.wg.Done() }() b.nHandlers++ } // nextBatch returns the batch to process, and updates b.pending. // It returns nil if there's no batch ready for processing. // b.mu must be held. func (b *Batcher) nextBatch() []waiter { // If we're not shutting down, respect minimums. If we're shutting down // though, we ignore minimums to make sure everything is flushed. if !b.shutdown && len(b.pending) < b.opts.MinBatchSize { return nil } if b.opts.MaxBatchByteSize == 0 && (b.opts.MaxBatchSize == 0 || len(b.pending) <= b.opts.MaxBatchSize) { // Send it all! batch := b.pending b.pending = nil return batch } batch := make([]waiter, 0, len(b.pending)) batchByteSize := 0 for _, msg := range b.pending { itemByteSize := 0 if sizable, ok := msg.item.(sizableItem); ok { itemByteSize = sizable.ByteSize() } reachedMaxSize := b.opts.MaxBatchSize > 0 && len(batch)+1 > b.opts.MaxBatchSize reachedMaxByteSize := b.opts.MaxBatchByteSize > 0 && batchByteSize+itemByteSize > b.opts.MaxBatchByteSize if reachedMaxSize || reachedMaxByteSize { break } batch = append(batch, msg) batchByteSize = batchByteSize + itemByteSize } b.pending = b.pending[len(batch):] return batch } func (b *Batcher) callHandler(batch []waiter) { for batch != nil { // Collect the items into a slice of the example type. items := b.itemSliceZero for _, m := range batch { items = reflect.Append(items, reflect.ValueOf(m.item)) } // Call the handler and report the result to all waiting // callers of Add. err := b.handler(items.Interface()) for _, m := range batch { m.errc <- err } b.mu.Lock() // If there is more work, keep running; otherwise exit. Take the new batch // and decrement the handler count atomically, so that newly added items will // always get to run. batch = b.nextBatch() if batch == nil { b.nHandlers-- } b.mu.Unlock() } } // Shutdown waits for all active calls to Add to finish, then // returns. After Shutdown is called, all subsequent calls to Add fail. // Shutdown should be called only once. func (b *Batcher) Shutdown() { b.mu.Lock() b.shutdown = true // If there aren't any handlers running, there might be a partial // batch. Make sure it gets flushed even if it hasn't reached the // minimums. if b.nHandlers == 0 { b.handleBatch(b.nextBatch()) } b.mu.Unlock() b.wg.Wait() } ================================================ FILE: pubsub/batcher/batcher_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package batcher_test import ( "bytes" "context" "errors" "io" "reflect" "sync" "sync/atomic" "testing" "time" "github.com/google/go-cmp/cmp" "gocloud.dev/pubsub/batcher" ) func TestSplit(t *testing.T) { tests := []struct { n int opts *batcher.Options want []int }{ // Defaults. {0, nil, nil}, {1, nil, []int{1}}, {10, nil, []int{10}}, // MinBatchSize. {4, &batcher.Options{MinBatchSize: 5}, nil}, {8, &batcher.Options{MinBatchSize: 5, MaxBatchSize: 7}, []int{7}}, // <= MaxBatchSize. {5, &batcher.Options{MaxBatchSize: 5}, []int{5}}, {9, &batcher.Options{MaxBatchSize: 10}, []int{9}}, // > MaxBatchSize with MaxHandlers = 1. {5, &batcher.Options{MaxBatchSize: 4}, []int{4}}, {999, &batcher.Options{MaxBatchSize: 10}, []int{10}}, // MaxBatchSize with MaxHandlers > 1. {10, &batcher.Options{MaxBatchSize: 4, MaxHandlers: 2}, []int{4, 4}}, {10, &batcher.Options{MaxBatchSize: 5, MaxHandlers: 2}, []int{5, 5}}, {10, &batcher.Options{MaxBatchSize: 9, MaxHandlers: 2}, []int{9, 1}}, {9, &batcher.Options{MaxBatchSize: 4, MaxHandlers: 3}, []int{4, 4, 1}}, {10, &batcher.Options{MaxBatchSize: 4, MaxHandlers: 3}, []int{4, 4, 2}}, // All 3 options together. {8, &batcher.Options{MinBatchSize: 5, MaxBatchSize: 7, MaxHandlers: 2}, []int{7}}, } for _, test := range tests { got := batcher.Split(test.n, test.opts) if diff := cmp.Diff(got, test.want); diff != "" { t.Errorf("%d/%#v: got %v want %v diff %s", test.n, test.opts, got, test.want, diff) } } } func TestSequential(t *testing.T) { // Verify that sequential non-concurrent Adds to a batcher produce single-item batches. // Since there is no concurrent work, the Batcher will always produce the items one at a time. ctx := context.Background() var got []int e := errors.New("e") b := batcher.New(reflect.TypeFor[int](), nil, func(items any) error { got = items.([]int) return e }) for i := range 10 { err := b.Add(ctx, i) if err != e { t.Errorf("got %v, want %v", err, e) } want := []int{i} if !cmp.Equal(got, want) { t.Errorf("got %+v, want %+v", got, want) } } } type sizableItem struct { byteSize int } func (i *sizableItem) ByteSize() int { return i.byteSize } func TestPreventsAddingItemsLargerThanBatchMaxByteSize(t *testing.T) { ctx := context.Background() itemType := reflect.TypeFor[*sizableItem]() b := batcher.New(itemType, &batcher.Options{MaxBatchByteSize: 1}, func(items any) error { return nil }) err := b.Add(ctx, &sizableItem{2}) e := batcher.ErrMessageTooLarge if err != e { t.Errorf("got %v, want %v", err, e) } err = b.Add(ctx, &sizableItem{1}) if err != nil { t.Errorf("got error %v, want nil", err) } } func TestBatchingConsidersMaxSizeAndMaxByteSize(t *testing.T) { ctx := context.Background() itemType := reflect.TypeFor[*sizableItem]() tests := []struct { itemCount int itemSize int opts *batcher.Options wantBatchCount int }{ {10, 0, &batcher.Options{MaxBatchSize: 2, MinBatchSize: 2}, 5}, {10, 10, &batcher.Options{MaxBatchByteSize: 10, MinBatchSize: 1}, 10}, {10, 5, &batcher.Options{MaxBatchByteSize: 10, MinBatchSize: 2}, 5}, } for _, test := range tests { var got [][]*sizableItem b := batcher.New(itemType, test.opts, func(items any) error { got = append(got, items.([]*sizableItem)) return nil }) var wg sync.WaitGroup item := &sizableItem{test.itemSize} for i := 0; i < test.itemCount; i++ { wg.Add(1) go func() { defer wg.Done() if err := b.Add(ctx, item); err != nil { t.Errorf("b.Add(ctx, item) error: %v", err) } }() } wg.Wait() if len(got) != test.wantBatchCount { t.Errorf("got %d batches, want %d", len(got), test.wantBatchCount) } } } func TestMinBatchSize(t *testing.T) { // Verify the MinBatchSize option works. var got [][]int b := batcher.New(reflect.TypeFor[int](), &batcher.Options{MinBatchSize: 3}, func(items any) error { got = append(got, items.([]int)) return nil }) for i := range 6 { b.AddNoWait(i) } b.Shutdown() want := [][]int{{0, 1, 2}, {3, 4, 5}} if !cmp.Equal(got, want) { t.Errorf("got %+v, want %+v", got, want) } } func TestSaturation(t *testing.T) { // Verify that under high load the maximum number of handlers are running. ctx := context.Background() const ( maxHandlers = 10 maxBatchSize = 50 ) var ( mu sync.Mutex outstanding, max int // number of handlers maxBatch int // size of largest batch count = map[int]int{} // how many of each item the handlers observe ) b := batcher.New(reflect.TypeFor[int](), &batcher.Options{MaxHandlers: maxHandlers, MaxBatchSize: maxBatchSize}, func(x any) error { items := x.([]int) mu.Lock() outstanding++ if outstanding > max { max = outstanding } for _, x := range items { count[x]++ } if len(items) > maxBatch { maxBatch = len(items) } mu.Unlock() defer func() { mu.Lock(); outstanding--; mu.Unlock() }() // Sleep a little to increase the likelihood of saturation. time.Sleep(10 * time.Millisecond) return nil }) var wg sync.WaitGroup const nItems = 1000 for i := range nItems { wg.Add(1) go func() { defer wg.Done() // Sleep a little to increase the likelihood of saturation. time.Sleep(time.Millisecond) if err := b.Add(ctx, i); err != nil { t.Errorf("b.Add(ctx, %d) error: %v", i, err) } }() } wg.Wait() // Check that we saturated the batcher. if max != maxHandlers { t.Errorf("max concurrent handlers = %d, want %d", max, maxHandlers) } // Check that at least one batch had more than one item. if maxBatch <= 1 || maxBatch > maxBatchSize { t.Errorf("got max batch size of %d, expected > 1 and <= %d", maxBatch, maxBatchSize) } // Check that handlers saw every item exactly once. want := map[int]int{} for i := range nItems { want[i] = 1 } if diff := cmp.Diff(count, want); diff != "" { t.Errorf("items: %s", diff) } } func TestShutdown(t *testing.T) { ctx := context.Background() var nHandlers int64 // atomic c := make(chan int, 10) b := batcher.New(reflect.TypeFor[int](), &batcher.Options{MaxHandlers: cap(c)}, func(x any) error { for range x.([]int) { c <- 0 } atomic.AddInt64(&nHandlers, 1) defer atomic.AddInt64(&nHandlers, -1) time.Sleep(time.Second) // we want handlers to be active on Shutdown return nil }) for i := 0; i < cap(c); i++ { go func() { err := b.Add(ctx, 0) if err != nil { t.Errorf("b.Add error: %v", err) } }() } // Make sure all goroutines have started. for i := 0; i < cap(c); i++ { <-c } b.Shutdown() if got := atomic.LoadInt64(&nHandlers); got != 0 { t.Fatalf("%d Handlers still active after Shutdown returns", got) } if err := b.Add(ctx, 1); err == nil { t.Error("got nil, want error from Add after Shutdown") } } // TestMinBatchSizeFlushesOnShutdown ensures that Shutdown() flushes batches, even if // the pending count is less than the minimum batch size. func TestMinBatchSizeFlushesOnShutdown(t *testing.T) { var got [][]int batchSize := 3 b := batcher.New(reflect.TypeFor[int](), &batcher.Options{MinBatchSize: batchSize}, func(items any) error { got = append(got, items.([]int)) return nil }) for i := 0; i < (batchSize - 1); i++ { b.AddNoWait(i) } // Ensure that we've received nothing if len(got) > 0 { t.Errorf("got batch unexpectedly: %+v", got) } b.Shutdown() want := [][]int{{0, 1}} if !cmp.Equal(got, want) { t.Errorf("got %+v, want %+v on shutdown", got, want) } } func TestItemCanBeInterface(t *testing.T) { readerType := reflect.TypeFor[[]io.Reader]().Elem() called := false b := batcher.New(readerType, nil, func(items any) error { called = true _, ok := items.([]io.Reader) if !ok { t.Fatal("items is not a []io.Reader") } return nil }) b.Add(context.Background(), &bytes.Buffer{}) if !called { t.Fatal("handler not called") } } ================================================ FILE: pubsub/benchmark_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package pubsub import ( "context" "errors" "fmt" "math/rand" "sync" "testing" "time" "gocloud.dev/pubsub/driver" "golang.org/x/sync/errgroup" ) const ( // How long to run the test. runFor = 25 * time.Second // How long the "warmup period" is, during which we report more frequently. reportWarmup = 500 * time.Millisecond // Minimum frequency for reporting throughput, during warmup and after that. reportPeriodWarmup = 50 * time.Millisecond reportPeriod = 1 * time.Second // Number of output lines per test. We set this to a constant so that it's // easy to copy/paste the output into a Google Sheet with pre-created graphs. // Should be above runFor / reportPeriod + reportWarmup / reportPeriodWarmup. numLinesPerTest = 50 // Number of data points to smooth msgs/sec and RPCs/sec over. smoothing = 5 ) type fakeSub struct { driver.Subscription start time.Time profile func(bool, int) (int, time.Duration) msgs []*driver.Message } func (*fakeSub) SendAcks(ctx context.Context, ackIDs []driver.AckID) error { return nil } func (*fakeSub) CanNack() bool { return false } func (*fakeSub) Close() error { return nil } func (s *fakeSub) ReceiveBatch(ctx context.Context, maxMessages int) ([]*driver.Message, error) { n, delay := s.profile(s.inMiddleThird(), maxMessages) if delay > 0 { time.Sleep(delay) } return s.msgs[:n], nil } // inMiddleThird returns true if this test is in the middle third of the running // time; used for burstiness tests. func (s *fakeSub) inMiddleThird() bool { elapsed := time.Since(s.start) return elapsed > runFor/3 && elapsed < runFor*2/3 } // TestReceivePerformance enables characterization of Receive under various // situations, characterized in "tests" below. func TestReceivePerformance(t *testing.T) { t.Skip("Skipped by default") const defaultNumGoRoutines = 100 defaultReceiveProfile := func(_ bool, maxMessages int) (int, time.Duration) { return maxMessages, 0 } defaultProcessProfile := func(bool) time.Duration { return 0 } tests := []struct { description string // See the defaults above. numGoRoutines int receiveProfile func(bool, int) (int, time.Duration) processProfile func(bool) time.Duration }{ { description: "baseline", }, { description: "1 goroutine", numGoRoutines: 1, }, { description: "receive 100ms", receiveProfile: func(_ bool, maxMessages int) (int, time.Duration) { return maxMessages, 100 * time.Millisecond }, }, { description: "receive 1s", receiveProfile: func(_ bool, maxMessages int) (int, time.Duration) { return maxMessages, 1 * time.Second }, }, { description: "process 100ms", processProfile: func(bool) time.Duration { return 100 * time.Millisecond }, }, { description: "process 1s", processProfile: func(bool) time.Duration { return 1 * time.Second }, }, { description: "receive 1s process 70ms", receiveProfile: func(_ bool, maxMessages int) (int, time.Duration) { return maxMessages, 1 * time.Second }, processProfile: func(bool) time.Duration { return 70 * time.Millisecond }, }, { description: "receive 250ms+stddev 150ms, process 10ms + stddev 5ms", receiveProfile: func(_ bool, maxMessages int) (int, time.Duration) { return maxMessages, time.Duration(rand.NormFloat64()*150+250) * time.Millisecond }, processProfile: func(bool) time.Duration { return time.Duration(rand.NormFloat64()*5+10) * time.Millisecond }, }, { description: "bursty message arrival", receiveProfile: func(inMiddleThird bool, maxMessages int) (int, time.Duration) { // When in the middle third of the running time, return 0 messages. n := maxMessages if inMiddleThird { n = 0 } return n, time.Duration(rand.NormFloat64()*25+100) * time.Millisecond }, processProfile: func(bool) time.Duration { return time.Duration(rand.NormFloat64()*5+10) * time.Millisecond }, }, { description: "bursty receive time", receiveProfile: func(inMiddleThird bool, maxMessages int) (int, time.Duration) { // When in the middle third of the running time, 10x the RPC time. d := time.Duration(rand.NormFloat64()*25+100) * time.Millisecond if inMiddleThird { d *= 10 } return maxMessages, d }, processProfile: func(bool) time.Duration { return time.Duration(rand.NormFloat64()*5+10) * time.Millisecond }, }, { description: "bursty process time", receiveProfile: func(_ bool, maxMessages int) (int, time.Duration) { return maxMessages, time.Duration(rand.NormFloat64()*25+100) * time.Millisecond }, processProfile: func(inMiddleThird bool) time.Duration { d := time.Duration(rand.NormFloat64()*5+10) * time.Millisecond if inMiddleThird { d *= 100 } return d }, }, { description: "intermittent", receiveProfile: func(_ bool, maxMessages int) (int, time.Duration) { n := rand.Int() % 2 return n, 250 * time.Millisecond }, }, } for _, test := range tests { if test.numGoRoutines == 0 { test.numGoRoutines = defaultNumGoRoutines } if test.receiveProfile == nil { test.receiveProfile = defaultReceiveProfile } if test.processProfile == nil { test.processProfile = defaultProcessProfile } t.Run(test.description, func(t *testing.T) { runBenchmark(t, test.description, test.numGoRoutines, test.receiveProfile, test.processProfile) }) } } func runBenchmark(t *testing.T, description string, numGoRoutines int, receiveProfile func(bool, int) (int, time.Duration), processProfile func(bool) time.Duration) { t.Helper() msgs := make([]*driver.Message, maxBatchSize) for i := range msgs { msgs[i] = &driver.Message{} } fake := &fakeSub{msgs: msgs, profile: receiveProfile, start: time.Now()} sub := newSubscription(fake, nil, nil) defer sub.Shutdown(context.Background()) // Header row. fmt.Printf("%s\tmsgs/sec\tRPCs/sec\tbatchsize\n", description) var mu sync.Mutex start := time.Now() var lastReport time.Time numMsgs := 0 var prevMsgsPerSec, prevRPCsPerSec []float64 // last datapoints var runningMsgsPerSec, runningRPCsPerSec float64 // sum of values in above slices numRPCs := 0 lastMaxMessages := 0 nLines := 1 // header // mu must be locked when called. reportLine := func(now time.Time) { elapsed := now.Sub(start) elapsedSinceReport := now.Sub(lastReport) // Smooth msgsPerSec over the last datapoints. msgsPerSec := float64(numMsgs) / elapsedSinceReport.Seconds() prevMsgsPerSec = append(prevMsgsPerSec, msgsPerSec) runningMsgsPerSec += msgsPerSec if len(prevMsgsPerSec) > smoothing { runningMsgsPerSec -= prevMsgsPerSec[0] if runningMsgsPerSec < 0 { runningMsgsPerSec = 0 } prevMsgsPerSec = prevMsgsPerSec[1:] } // Smooth rpcsPerSec over the last datapoints. rpcsPerSec := float64(numRPCs) / elapsedSinceReport.Seconds() prevRPCsPerSec = append(prevRPCsPerSec, rpcsPerSec) runningRPCsPerSec += rpcsPerSec if len(prevRPCsPerSec) > smoothing { runningRPCsPerSec -= prevRPCsPerSec[0] if runningRPCsPerSec < 0 { runningRPCsPerSec = 0 } prevRPCsPerSec = prevRPCsPerSec[1:] } fmt.Printf("%f\t%f\t%f\t%d\n", elapsed.Seconds(), runningMsgsPerSec/float64(len(prevMsgsPerSec)), runningRPCsPerSec/float64(len(prevRPCsPerSec)), lastMaxMessages) nLines++ lastReport = now numMsgs = 0 numRPCs = 0 } sub.preReceiveBatchHook = func(maxMessages int) { mu.Lock() defer mu.Unlock() lastMaxMessages = maxMessages numRPCs++ if lastReport.IsZero() { reportLine(time.Now()) } } ctx, cancel := context.WithTimeout(context.Background(), runFor) defer cancel() done := make(chan struct{}) go func() { period := reportPeriodWarmup for { select { case now := <-time.After(period): mu.Lock() reportLine(now) mu.Unlock() if now.Sub(start) > reportWarmup { period = reportPeriod } case <-ctx.Done(): close(done) return } } }() var grp errgroup.Group for range numGoRoutines { grp.Go(func() error { // Each goroutine loops until ctx is canceled. for { m, err := sub.Receive(ctx) if errors.Is(err, context.DeadlineExceeded) { return nil } if err != nil { return err } mu.Lock() numMsgs++ mu.Unlock() delay := processProfile(fake.inMiddleThird()) if delay > 0 { time.Sleep(delay) } m.Ack() } }) } if err := grp.Wait(); err != nil { t.Errorf("%s: %v", description, err) } <-done if nLines > numLinesPerTest { t.Errorf("produced too many lines (%d)", nLines) } for n := nLines; n < numLinesPerTest; n++ { fmt.Println() } } ================================================ FILE: pubsub/driver/driver.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package driver defines interfaces to be implemented by pubsub drivers, which // will be used by the pubsub package to interact with the underlying services. // Application code should use package pubsub. package driver // import "gocloud.dev/pubsub/driver" import ( "context" "gocloud.dev/gcerrors" ) // AckID is the identifier of a message for purposes of acknowledgement. type AckID any // AckInfo represents an action on an AckID. type AckInfo struct { // AckID is the AckID the action is for. AckID AckID // IsAck is true if the AckID should be acked, false if it should be nacked. IsAck bool } // Message is data to be published (sent) to a topic and later received from // subscriptions on that topic. type Message struct { // LoggableID should be set to an opaque message identifer for // received messages. LoggableID string // Body contains the content of the message. Body []byte // Metadata has key/value pairs describing the message. Metadata map[string]string // AckID should be set to something identifying the message on the // server. It may be passed to Subscription.SendAcks to acknowledge // the message, or to Subscription.SendNacks. This field should only // be set by methods implementing Subscription.ReceiveBatch. AckID AckID // AsFunc allows drivers to expose driver-specific types; // see Topic.As for more details. // AsFunc must be populated on messages returned from ReceiveBatch. AsFunc func(any) bool // BeforeSend is a callback used when sending a message. It should remain // nil on messages returned from ReceiveBatch. // // The callback must be called exactly once, before the message is sent. // // asFunc converts its argument to driver-specific types. // See https://gocloud.dev/concepts/as/ for background information. BeforeSend func(asFunc func(any) bool) error // AfterSend is a callback used when sending a message. It should remain // nil on messages returned from ReceiveBatch. // // The callback must be called at most once, after the message is sent. // If Send returns an error, AfterSend will not be called. // // asFunc converts its argument to driver-specific types. // See https://gocloud.dev/concepts/as/ for background information. AfterSend func(asFunc func(any) bool) error } // ByteSize estimates the size in bytes of the message for the purpose of restricting batch sizes. func (m *Message) ByteSize() int { return len(m.Body) } // Topic publishes messages. // Drivers may optionally also implement io.Closer; Close will be called // when the pubsub.Topic is Shutdown. type Topic interface { // SendBatch should publish all the messages in ms. It should // return only after all the messages are sent, an error occurs, or the // context is done. // // Only the Body and (optionally) Metadata fields of the Messages in ms // will be set by the caller of SendBatch. // // If any message in the batch fails to send, SendBatch should return an // error. // // If there is a transient failure, this method should not retry but // should return an error for which IsRetryable returns true. The // concrete API takes care of retry logic. // // The slice ms should not be retained past the end of the call to // SendBatch. // // SendBatch may be called concurrently from multiple goroutines. // // Drivers can control the number of messages sent in a single batch // and the concurrency of calls to SendBatch via a batcher.Options // passed to pubsub.NewTopic. SendBatch(ctx context.Context, ms []*Message) error // IsRetryable should report whether err can be retried. // err will always be a non-nil error returned from SendBatch. IsRetryable(err error) bool // As allows drivers to expose driver-specific types. // See https://gocloud.dev/concepts/as/ for background information. As(i any) bool // ErrorAs allows drivers to expose driver-specific types for errors. // See https://gocloud.dev/concepts/as/ for background information. ErrorAs(error, any) bool // ErrorCode should return a code that describes the error, which was returned by // one of the other methods in this interface. ErrorCode(error) gcerrors.ErrorCode // Close cleans up any resources used by the Topic. Once Close is called, // there will be no method calls to the Topic other than As, ErrorAs, and // ErrorCode. Close() error } // Subscription receives published messages. // Drivers may optionally also implement io.Closer; Close will be called // when the pubsub.Subscription is Shutdown. type Subscription interface { // ReceiveBatch should return a batch of messages that have queued up // for the subscription on the server, up to maxMessages. // // If there is a transient failure, this method should not retry but // should return a nil slice and an error. The concrete API will take // care of retry logic. // // If no messages are currently available, this method should block for // no more than about 1 second. It can return an empty // slice of messages and no error. ReceiveBatch will be called again // immediately, so implementations should try to wait for messages for some // non-zero amount of time before returning zero messages. If the underlying // service doesn't support waiting, then a time.Sleep can be used. // // ReceiveBatch may be called concurrently from multiple goroutines. // // Drivers can control the maximum value of maxMessages and the concurrency // of calls to ReceiveBatch via a batcher.Options passed to // pubsub.NewSubscription. ReceiveBatch(ctx context.Context, maxMessages int) ([]*Message, error) // SendAcks should acknowledge the messages with the given ackIDs on // the server so that they will not be received again for this // subscription if the server gets the acks before their deadlines. // This method should return only after all the ackIDs are sent, an // error occurs, or the context is done. // // It is acceptable for SendAcks to be a no-op for drivers that don't // support message acknowledgement. // // Drivers should suppress errors caused by double-acking a message. // // SendAcks may be called concurrently from multiple goroutines. // // Drivers can control the maximum size of ackIDs and the concurrency // of calls to SendAcks/SendNacks via a batcher.Options passed to // pubsub.NewSubscription. SendAcks(ctx context.Context, ackIDs []AckID) error // CanNack must return true iff the driver supports Nacking messages. // // If CanNack returns false, SendNacks will never be called, and Nack will // panic if called. CanNack() bool // SendNacks should notify the server that the messages with the given ackIDs // are not being processed by this client, so that they will be received // again later, potentially by another subscription. // This method should return only after all the ackIDs are sent, an // error occurs, or the context is done. // // If the service does not suppport nacking of messages, return false from // CanNack, and SendNacks will never be called. // // SendNacks may be called concurrently from multiple goroutines. // // Drivers can control the maximum size of ackIDs and the concurrency // of calls to SendAcks/Nacks via a batcher.Options passed to // pubsub.NewSubscription. SendNacks(ctx context.Context, ackIDs []AckID) error // IsRetryable should report whether err can be retried. // err will always be a non-nil error returned from ReceiveBatch or SendAcks. IsRetryable(err error) bool // As converts i to driver-specific types. // See https://gocloud.dev/concepts/as/ for background information. As(i any) bool // ErrorAs allows drivers to expose driver-specific types for errors. // See https://gocloud.dev/concepts/as/ for background information. ErrorAs(error, any) bool // ErrorCode should return a code that describes the error, which was returned by // one of the other methods in this interface. ErrorCode(error) gcerrors.ErrorCode // Close cleans up any resources used by the Topic. Once Close is called, // there will be no method calls to the Topic other than As, ErrorAs, and // ErrorCode. Close() error } ================================================ FILE: pubsub/drivertest/drivertest.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package drivertest provides a conformance test for implementations of // driver. package drivertest // import "gocloud.dev/pubsub/drivertest" import ( "bytes" "context" "errors" "slices" "sort" "strconv" "testing" "time" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "gocloud.dev/gcerrors" "gocloud.dev/internal/escape" "gocloud.dev/internal/retry" "gocloud.dev/pubsub" "gocloud.dev/pubsub/batcher" "gocloud.dev/pubsub/driver" "golang.org/x/sync/errgroup" ) // Harness descibes the functionality test harnesses must provide to run // conformance tests. type Harness interface { // CreateTopic creates a new topic and returns a driver.Topic // for testing. The topic may have to be removed manually if the test is // abruptly terminated or the network connection fails. CreateTopic(ctx context.Context, testName string) (dt driver.Topic, cleanup func(), err error) // MakeNonexistentTopic makes a driver.Topic referencing a topic that // does not exist. MakeNonexistentTopic(ctx context.Context) (driver.Topic, error) // CreateSubscription creates a new subscription, subscribed // to the given topic, and returns a driver.Subscription for testing. The // subscription may have to be cleaned up manually if the test is abruptly // terminated or the network connection fails. CreateSubscription(ctx context.Context, t driver.Topic, testName string) (ds driver.Subscription, cleanup func(), err error) // MakeNonexistentSubscription makes a driver.Subscription referencing a // subscription that does not exist. MakeNonexistentSubscription(ctx context.Context) (ds driver.Subscription, cleanup func(), err error) // Close closes resources used by the harness, but does not call Close // on the Topics and Subscriptions generated by the Harness. Close() // MaxBatchSizes returns the maximum size of SendBatch/Send(Na|A)cks, or 0 // if there's no max. MaxBatchSizes() (int, int) // SupportsMultipleSubscriptions reports whether the driver supports // multiple subscriptions for the same topic. SupportsMultipleSubscriptions() bool } // HarnessMaker describes functions that construct a harness for running tests. // It is called exactly once per test; Harness.Close() will be called when the test is complete. type HarnessMaker func(ctx context.Context, t *testing.T) (Harness, error) // AsTest represents a test of As functionality. // The conformance test: // 1. Calls TopicCheck. // 2. Calls SubscriptionCheck. // 3. Sends a message, setting Message.BeforeSend to BeforeSend // // and Message.AfterSend to AfterSend. // // 4. Receives the message and calls MessageCheck. // 5. Calls TopicErrorCheck. // 6. Calls SubscriptionErrorCheck. type AsTest interface { // Name should return a descriptive name for the test. Name() string // TopicCheck will be called to allow verifcation of Topic.As. TopicCheck(t *pubsub.Topic) error // SubscriptionCheck will be called to allow verification of Subscription.As. SubscriptionCheck(s *pubsub.Subscription) error // TopicErrorCheck will be called to allow verification of Topic.ErrorAs. // The error will be the one returned from SendBatch when called with // a non-existent topic. TopicErrorCheck(t *pubsub.Topic, err error) error // SubscriptionErrorCheck will be called to allow verification of // Subscription.ErrorAs. // The error will be the one returned from ReceiveBatch when called with // a non-existent subscription. SubscriptionErrorCheck(s *pubsub.Subscription, err error) error // MessageCheck will be called to allow verification of Message.As. MessageCheck(m *pubsub.Message) error // BeforeSend will be used as Message.BeforeSend as part of sending a test // message. BeforeSend(as func(any) bool) error // AfterSend will be used as Message.AfterSend as part of sending a test // message. AfterSend(as func(any) bool) error } // Many tests set the maximum batch size to 1 to make record/replay stable. var batchSizeOne = &batcher.Options{MaxBatchSize: 1, MaxHandlers: 1} type verifyAsFailsOnNil struct{} func (verifyAsFailsOnNil) Name() string { return "verify As returns false when passed nil" } func (verifyAsFailsOnNil) TopicCheck(t *pubsub.Topic) error { if t.As(nil) { return errors.New("want Topic.As to return false when passed nil") } return nil } func (verifyAsFailsOnNil) SubscriptionCheck(s *pubsub.Subscription) error { if s.As(nil) { return errors.New("want Subscription.As to return false when passed nil") } return nil } func (verifyAsFailsOnNil) TopicErrorCheck(t *pubsub.Topic, err error) (ret error) { defer func() { if recover() == nil { ret = errors.New("want Topic.ErrorAs to panic when passed nil") } }() t.ErrorAs(err, nil) return nil } func (verifyAsFailsOnNil) SubscriptionErrorCheck(s *pubsub.Subscription, err error) (ret error) { defer func() { if recover() == nil { ret = errors.New("want Subscription.ErrorAs to panic when passed nil") } }() s.ErrorAs(err, nil) return nil } func (verifyAsFailsOnNil) MessageCheck(m *pubsub.Message) error { if m.As(nil) { return errors.New("want Message.As to return false when passed nil") } return nil } func (verifyAsFailsOnNil) BeforeSend(as func(any) bool) error { if as(nil) { return errors.New("want Message.BeforeSend's As function to return false when passed nil") } return nil } func (verifyAsFailsOnNil) AfterSend(as func(any) bool) error { if as(nil) { return errors.New("want Message.AfterSend's As function to return false when passed nil") } return nil } // RunConformanceTests runs conformance tests for driver implementations of pubsub. func RunConformanceTests(t *testing.T, newHarness HarnessMaker, asTests []AsTest) { t.Helper() tests := map[string]func(t *testing.T, newHarness HarnessMaker){ "TestSendReceive": testSendReceive, "TestSendReceiveTwo": testSendReceiveTwo, "TestSendReceiveJSON": testSendReceiveJSON, "TestNack": testNack, "TestBatching": testBatching, "TestDoubleAck": testDoubleAck, "TestErrorOnSendToClosedTopic": testErrorOnSendToClosedTopic, "TestErrorOnReceiveFromClosedSubscription": testErrorOnReceiveFromClosedSubscription, "TestCancelSendReceive": testCancelSendReceive, "TestNonExistentTopicSucceedsOnOpenButFailsOnSend": testNonExistentTopicSucceedsOnOpenButFailsOnSend, "TestNonExistentSubscriptionSucceedsOnOpenButFailsOnReceive": testNonExistentSubscriptionSucceedsOnOpenButFailsOnReceive, "TestMetadata": testMetadata, "TestNonUTF8MessageBody": testNonUTF8MessageBody, } for name, test := range tests { t.Run(name, func(t *testing.T) { test(t, newHarness) }) } asTests = append(asTests, verifyAsFailsOnNil{}) t.Run("TestAs", func(t *testing.T) { for _, st := range asTests { if st.Name() == "" { t.Fatalf("AsTest.Name is required") } t.Run(st.Name(), func(t *testing.T) { testAs(t, newHarness, st) }) } }) } // RunBenchmarks runs benchmarks for driver implementations of pubsub. func RunBenchmarks(b *testing.B, topic *pubsub.Topic, sub *pubsub.Subscription) { b.Helper() b.Run("BenchmarkReceive", func(b *testing.B) { benchmark(b, topic, sub, false) }) b.Run("BenchmarkSend", func(b *testing.B) { benchmark(b, topic, sub, true) }) } func testNonExistentTopicSucceedsOnOpenButFailsOnSend(t *testing.T, newHarness HarnessMaker) { t.Helper() // Set up. ctx := context.Background() h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() dt, err := h.MakeNonexistentTopic(ctx) if err != nil { // Failure shouldn't happen for non-existent topics until messages are sent // to them. t.Fatalf("creating a local topic that doesn't exist on the server: %v", err) } topic := pubsub.NewTopic(dt, nil) defer func() { if err := topic.Shutdown(ctx); err != nil { t.Error(err) } }() m := &pubsub.Message{} err = topic.Send(ctx, m) if err == nil || gcerrors.Code(err) != gcerrors.NotFound { t.Errorf("got error %v for send to non-existent topic, want code=NotFound", err) } } func testNonExistentSubscriptionSucceedsOnOpenButFailsOnReceive(t *testing.T, newHarness HarnessMaker) { t.Helper() // Set up. ctx := context.Background() h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() ds, cleanup, err := h.MakeNonexistentSubscription(ctx) if err != nil { t.Fatalf("failed to make non-existent subscription: %v", err) } defer cleanup() sub := pubsub.NewSubscription(ds, batchSizeOne, batchSizeOne) defer func() { if err := sub.Shutdown(ctx); err != nil { t.Error(err) } }() // The test will hang here if the message isn't available, so use a shorter timeout. ctx2, cancel := context.WithTimeout(ctx, 30*time.Second) defer cancel() _, err = sub.Receive(ctx2) if err == nil || ctx2.Err() != nil || gcerrors.Code(err) != gcerrors.NotFound { t.Errorf("got error %v for receive from non-existent subscription, want code=NotFound", err) } } func testSendReceive(t *testing.T, newHarness HarnessMaker) { t.Helper() // Set up. ctx := context.Background() h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() topic, sub, cleanup, err := makePair(ctx, t, h) if err != nil { t.Fatal(err) } defer cleanup() want := publishN(ctx, t, topic, 3) got := receiveN(ctx, t, sub, len(want)) // Verify LoggableID is set. for _, msg := range got { if msg.LoggableID == "" { t.Errorf("msg.LoggableID was empty, should be set") } } // Check that the received messages match the sent ones. if diff := diffMessageSets(got, want); diff != "" { t.Error(diff) } } // Receive from two subscriptions to the same topic. // Verify both get all the messages. func testSendReceiveTwo(t *testing.T, newHarness HarnessMaker) { t.Helper() // Set up. ctx := context.Background() h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() if !h.SupportsMultipleSubscriptions() { t.Skip("multiple subscriptions to a topic not supported") } dt, cleanup, err := h.CreateTopic(ctx, t.Name()) if err != nil { t.Fatal(err) } defer cleanup() topic := pubsub.NewTopic(dt, batchSizeOne) defer func() { if err := topic.Shutdown(ctx); err != nil { t.Error(err) } }() var ss []*pubsub.Subscription for range 2 { ds, cleanup, err := h.CreateSubscription(ctx, dt, t.Name()) if err != nil { t.Fatal(err) } defer cleanup() s := pubsub.NewSubscription(ds, batchSizeOne, batchSizeOne) defer func() { if err := s.Shutdown(ctx); err != nil { t.Error(err) } }() ss = append(ss, s) } want := publishN(ctx, t, topic, 3) for i, s := range ss { got := receiveN(ctx, t, s, len(want)) if diff := diffMessageSets(got, want); diff != "" { t.Errorf("sub #%d: %s", i, diff) } } } func testSendReceiveJSON(t *testing.T, newHarness HarnessMaker) { t.Helper() const json = `{"Foo": "Bar"}` // Set up. ctx := context.Background() h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() topic, sub, cleanup, err := makePair(ctx, t, h) if err != nil { t.Fatal(err) } defer cleanup() sendM := &pubsub.Message{Body: []byte(json)} if err := topic.Send(ctx, sendM); err != nil { t.Fatal(err) } ctx2, cancel := context.WithTimeout(ctx, 30*time.Second) defer cancel() receiveM, err := sub.Receive(ctx2) if err != nil { t.Fatal(err) } receiveM.Ack() if diff := diffMessageSets([]*pubsub.Message{receiveM}, []*pubsub.Message{sendM}); diff != "" { t.Error(diff) } } func testNack(t *testing.T, newHarness HarnessMaker) { t.Helper() const nMessages = 2 // Set up. ctx := context.Background() h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() dt, topicCleanup, err := h.CreateTopic(ctx, t.Name()) if err != nil { t.Fatal(err) } defer topicCleanup() ds, subCleanup, err := h.CreateSubscription(ctx, dt, t.Name()) if err != nil { t.Fatal(err) } defer subCleanup() if !ds.CanNack() { t.Skip("Nack not supported") } topic := pubsub.NewTopic(dt, batchSizeOne) defer func() { if err := topic.Shutdown(ctx); err != nil { t.Error(err) } }() sub := pubsub.NewSubscription(ds, batchSizeOne, batchSizeOne) defer func() { if err := sub.Shutdown(ctx); err != nil { t.Error(err) } }() want := publishN(ctx, t, topic, nMessages) // Get the messages, but nack them. // Make sure to nack after receiving all of them; otherwise, we could // receive one of the messages twice instead of receiving all nMessages. // The test will hang here if the messages aren't redelivered, so use a shorter timeout. ctx2, cancel := context.WithTimeout(ctx, 30*time.Second) defer cancel() var got []*pubsub.Message for range nMessages { m, err := sub.Receive(ctx2) if err != nil { t.Fatal(err) } got = append(got, m) } for _, m := range got { m.Nack() } // Check that the received messages match the sent ones. if diff := diffMessageSets(got, want); diff != "" { t.Error(diff) } // The test will hang here if the messages aren't redelivered, so use a shorter timeout. ctx2, cancel = context.WithTimeout(ctx, 30*time.Second) defer cancel() got = nil for range nMessages { m, err := sub.Receive(ctx2) if err != nil { t.Fatal(err) } got = append(got, m) m.Ack() } if diff := diffMessageSets(got, want); diff != "" { t.Error(diff) } } func testBatching(t *testing.T, newHarness HarnessMaker) { t.Helper() const nMessages = 12 // must be divisible by 2 const batchSize = nMessages / 2 // Set up. ctx := context.Background() h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() maxSendBatch, maxAckBatch := h.MaxBatchSizes() dt, topicCleanup, err := h.CreateTopic(ctx, t.Name()) if err != nil { t.Fatal(err) } defer topicCleanup() ds, subCleanup, err := h.CreateSubscription(ctx, dt, t.Name()) if err != nil { t.Fatal(err) } defer subCleanup() sendBatchOpts := &batcher.Options{MinBatchSize: batchSize, MaxBatchSize: batchSize} // If the driver doesn't support batchSize batches, fall back to size 1. if maxSendBatch != 0 && batchSize > maxSendBatch { sendBatchOpts = batchSizeOne } topic := pubsub.NewTopic(dt, sendBatchOpts) defer func() { if err := topic.Shutdown(ctx); err != nil { t.Error(err) } }() ackBatchOpts := &batcher.Options{MinBatchSize: batchSize, MaxBatchSize: batchSize} // If the driver doesn't support batchSize batches, fall back to size 1. if maxAckBatch != 0 && batchSize > maxAckBatch { ackBatchOpts = batchSizeOne } sub := pubsub.NewSubscription(ds, batchSizeOne, ackBatchOpts) defer func() { if err := sub.Shutdown(ctx); err != nil { t.Error(err) } }() // Publish nMessages. We have to do them asynchronously because topic.Send // blocks until the message is sent, and these messages won't be sent until // all batchSize are queued. // Note: this test uses the same Body for each message, because the order // that they appear in the SendBatch is not stable. gr, grctx := errgroup.WithContext(ctx) var want []*pubsub.Message for range nMessages { m := &pubsub.Message{Body: []byte("hello world")} want = append(want, m) gr.Go(func() error { return topic.Send(grctx, m) }) } if err := gr.Wait(); err != nil { t.Fatal(err) } // Get the messages. // The test will hang here if the messages aren't delivered, so use a shorter timeout. ctx2, cancel := context.WithTimeout(ctx, 30*time.Second) defer cancel() var got []*pubsub.Message for range nMessages { m, err := sub.Receive(ctx2) if err != nil { t.Fatal(err) } got = append(got, m) m.Ack() } if diff := diffMessageSets(got, want); diff != "" { t.Error(diff) } } func testDoubleAck(t *testing.T, newHarness HarnessMaker) { t.Helper() // Set up. ctx := context.Background() h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() dt, topicCleanup, err := h.CreateTopic(ctx, t.Name()) if err != nil { t.Fatal(err) } defer topicCleanup() ds, subCleanup, err := h.CreateSubscription(ctx, dt, t.Name()) if err != nil { t.Fatal(err) } defer subCleanup() // Publish 3 messages. for i := range 3 { err := dt.SendBatch(ctx, []*driver.Message{{Body: []byte(strconv.Itoa(i))}}) if err != nil { t.Fatal(err) } } // Retrieve the messages. // The test will hang here if the messages aren't delivered, so use a shorter timeout. ctx2, cancel := context.WithTimeout(ctx, 30*time.Second) defer cancel() var dms []*driver.Message for len(dms) != 3 { curdms, err := ds.ReceiveBatch(ctx2, 3) if err != nil { t.Fatal(err) } if err := ctx2.Err(); err != nil { t.Fatalf("never received expected messages: %v", err) } dms = append(dms, curdms...) } // Ack the first two messages. err = ds.SendAcks(ctx, []driver.AckID{dms[0].AckID, dms[1].AckID}) if err != nil { t.Fatal(err) } // Ack them again; this should succeed even though we've acked them before. // If services return an error for this, drivers should drop them. err = ds.SendAcks(ctx, []driver.AckID{dms[0].AckID, dms[1].AckID}) if err != nil { t.Fatal(err) } if !ds.CanNack() { return } // Nack all 3 messages. This should also succeed, and the nack of the third // message should take effect, so we should be able to fetch it again. // Note that the other messages *may* also be re-sent, because we're nacking // them here (even though we acked them earlier); it depends on service // semantics and time-sensitivity. err = ds.SendNacks(ctx, []driver.AckID{dms[0].AckID, dms[1].AckID, dms[2].AckID}) if err != nil { t.Fatal(err) } // The test will hang here if the message isn't redelivered, so use a shorter timeout. ctx2, cancel = context.WithTimeout(ctx, 30*time.Second) defer cancel() // We're looking to re-receive dms[2]. Loop: for { curdms, err := ds.ReceiveBatch(ctx2, 1) if err != nil { t.Fatal(err) } for _, curdm := range curdms { if bytes.Equal(curdm.Body, dms[2].Body) { // Found it! break Loop } } } } // Publish n different messages to the topic. Return the messages. func publishN(ctx context.Context, t *testing.T, topic *pubsub.Topic, n int) []*pubsub.Message { t.Helper() var ms []*pubsub.Message for i := range n { m := &pubsub.Message{ Body: []byte(strconv.Itoa(i)), Metadata: map[string]string{"a": strconv.Itoa(i)}, } if err := topic.Send(ctx, m); err != nil { t.Fatal(err) } ms = append(ms, m) } return ms } // Receive and ack n messages from sub. func receiveN(ctx context.Context, t *testing.T, sub *pubsub.Subscription, n int) []*pubsub.Message { t.Helper() // The test will hang here if the message(s) aren't available, so use a shorter timeout. ctx2, cancel := context.WithTimeout(ctx, 30*time.Second) defer cancel() var ms []*pubsub.Message for range n { m, err := sub.Receive(ctx2) if err != nil { t.Fatal(err) } ms = append(ms, m) m.Ack() } return ms } // Find the differences between two sets of messages. func diffMessageSets(got, want []*pubsub.Message) string { for _, m := range got { m.LoggableID = "" } less := func(x, y *pubsub.Message) bool { return bytes.Compare(x.Body, y.Body) < 0 } return cmp.Diff(got, want, cmpopts.SortSlices(less), cmpopts.IgnoreUnexported(pubsub.Message{})) } func testErrorOnSendToClosedTopic(t *testing.T, newHarness HarnessMaker) { t.Helper() // Set up. ctx := context.Background() h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() dt, cleanup, err := h.CreateTopic(ctx, t.Name()) if err != nil { t.Fatal(err) } defer cleanup() topic := pubsub.NewTopic(dt, batchSizeOne) if err := topic.Shutdown(ctx); err != nil { t.Error(err) } // Check that sending to the closed topic fails. m := &pubsub.Message{} if err := topic.Send(ctx, m); err == nil { t.Error("topic.Send returned nil, want error") } if err := topic.Shutdown(ctx); err == nil { t.Error("wanted error on double Shutdown") } } func testErrorOnReceiveFromClosedSubscription(t *testing.T, newHarness HarnessMaker) { t.Helper() ctx := context.Background() h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() dt, cleanup, err := h.CreateTopic(ctx, t.Name()) if err != nil { t.Fatal(err) } defer cleanup() ds, cleanup, err := h.CreateSubscription(ctx, dt, t.Name()) if err != nil { t.Fatal(err) } defer cleanup() sub := pubsub.NewSubscription(ds, batchSizeOne, batchSizeOne) if err := sub.Shutdown(ctx); err != nil { t.Error(err) } if _, err = sub.Receive(ctx); err == nil { t.Error("sub.Receive returned nil, want error") } if err := sub.Shutdown(ctx); err == nil { t.Error("wanted error on double Shutdown") } } func testCancelSendReceive(t *testing.T, newHarness HarnessMaker) { t.Helper() ctx := context.Background() h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() topic, sub, cleanup, err := makePair(ctx, t, h) if err != nil { t.Fatal(err) } defer cleanup() ctx, cancel := context.WithCancel(ctx) cancel() m := &pubsub.Message{} if err := topic.Send(ctx, m); !isCanceled(err) { t.Errorf("topic.Send returned %v (%T), want context.Canceled", err, err) } if _, err := sub.Receive(ctx); !isCanceled(err) { t.Errorf("sub.Receive returned %v (%T), want context.Canceled", err, err) } // It would be nice to add a test that cancels an in-flight blocking Receive. // However, because pubsub.Subscription.Receive repeatedly calls // driver.ReceiveBatch if it returns 0 messages, it's difficult to write // such a test without it being flaky for drivers with record/replay // (the number of times driver.ReceiveBatch is called is timing-dependent). } func testMetadata(t *testing.T, newHarness HarnessMaker) { t.Helper() // Set up. ctx := context.Background() h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() // Some services limit the number of metadata per message. // Sort the escape.WeirdStrings values for record/replay consistency, // then break the weird strings up into groups of at most maxMetadataKeys. const maxMetadataKeys = 10 var weirdStrings []string for _, v := range escape.WeirdStrings { weirdStrings = append(weirdStrings, v) } slices.Sort(weirdStrings) weirdMetaDataGroups := []map[string]string{{}} i := 0 for _, k := range weirdStrings { weirdMetaDataGroups[i][k] = k if len(weirdMetaDataGroups[i]) == maxMetadataKeys { weirdMetaDataGroups = append(weirdMetaDataGroups, map[string]string{}) i++ } } topic, sub, cleanup, err := makePair(ctx, t, h) if err != nil { t.Fatal(err) } defer cleanup() for _, wm := range weirdMetaDataGroups { m := &pubsub.Message{ Body: []byte("hello world"), Metadata: wm, } if err := topic.Send(ctx, m); err != nil { t.Fatal(err) } // The test will hang here if the messages aren't delivered, so use a shorter timeout. ctx2, cancel := context.WithTimeout(ctx, 30*time.Second) defer cancel() m, err = sub.Receive(ctx2) if err != nil { t.Fatal(err) } m.Ack() if diff := cmp.Diff(m.Metadata, wm); diff != "" { t.Fatalf("got\n%v\nwant\n%v\ndiff\n%s", m.Metadata, wm, diff) } } // Verify that non-UTF8 strings in metadata key or value fail. m := &pubsub.Message{ Body: []byte("hello world"), Metadata: map[string]string{escape.NonUTF8String: "bar"}, } if err := topic.Send(ctx, m); err == nil { t.Error("got nil error, expected error for using non-UTF8 string as metadata key") } m.Metadata = map[string]string{"foo": escape.NonUTF8String} if err := topic.Send(ctx, m); err == nil { t.Error("got nil error, expected error for using non-UTF8 string as metadata value") } } func testNonUTF8MessageBody(t *testing.T, newHarness HarnessMaker) { t.Helper() // Set up. ctx := context.Background() h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() topic, sub, cleanup, err := makePair(ctx, t, h) if err != nil { t.Fatal(err) } defer cleanup() // Sort the WeirdStrings map for record/replay consistency. var weirdStrings [][]string // [0] = key, [1] = value for k, v := range escape.WeirdStrings { weirdStrings = append(weirdStrings, []string{k, v}) } sort.Slice(weirdStrings, func(i, j int) bool { return weirdStrings[i][0] < weirdStrings[j][0] }) // Construct a message body with the weird strings and some non-UTF-8 bytes. var body []byte for _, v := range weirdStrings { body = append(body, []byte(v[1])...) } body = append(body, []byte(escape.NonUTF8String)...) m := &pubsub.Message{Body: body} if err := topic.Send(ctx, m); err != nil { t.Fatal(err) } // The test will hang here if the messages aren't delivered, so use a shorter timeout. ctx2, cancel := context.WithTimeout(ctx, 30*time.Second) defer cancel() m, err = sub.Receive(ctx2) if err != nil { t.Fatal(err) } m.Ack() if diff := cmp.Diff(m.Body, body); diff != "" { t.Fatalf("got\n%v\nwant\n%v\ndiff\n%s", m.Body, body, diff) } } func isCanceled(err error) bool { if err == context.Canceled { return true } if cerr, ok := err.(*retry.ContextError); ok { return cerr.CtxErr == context.Canceled } return gcerrors.Code(err) == gcerrors.Canceled } func makePair(ctx context.Context, t *testing.T, h Harness) (*pubsub.Topic, *pubsub.Subscription, func(), error) { t.Helper() dt, topicCleanup, err := h.CreateTopic(ctx, t.Name()) if err != nil { return nil, nil, nil, err } ds, subCleanup, err := h.CreateSubscription(ctx, dt, t.Name()) if err != nil { topicCleanup() return nil, nil, nil, err } topic := pubsub.NewTopic(dt, batchSizeOne) sub := pubsub.NewSubscription(ds, batchSizeOne, batchSizeOne) cleanup := func() { if err := topic.Shutdown(ctx); err != nil { t.Error(err) } if err := sub.Shutdown(ctx); err != nil { t.Error(err) } subCleanup() topicCleanup() } return topic, sub, cleanup, nil } // testAs tests the various As functions, using AsTest. func testAs(t *testing.T, newHarness HarnessMaker, st AsTest) { t.Helper() ctx := context.Background() h, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer h.Close() topic, sub, cleanup, err := makePair(ctx, t, h) if err != nil { t.Fatal(err) } defer cleanup() if err := st.TopicCheck(topic); err != nil { t.Error(err) } if err := st.SubscriptionCheck(sub); err != nil { t.Error(err) } msg := &pubsub.Message{ Body: []byte("x"), BeforeSend: st.BeforeSend, AfterSend: st.AfterSend, } if err := topic.Send(ctx, msg); err != nil { t.Fatal(err) } // The test will hang here if the messages aren't delivered, so use a shorter timeout. ctx2, cancel := context.WithTimeout(ctx, 30*time.Second) defer cancel() m, err := sub.Receive(ctx2) if err != nil { t.Fatal(err) } if err := st.MessageCheck(m); err != nil { t.Error(err) } m.Ack() // Make a nonexistent topic and try to to send on it, to get an error we can // use to call TopicErrorCheck. dt, err := h.MakeNonexistentTopic(ctx) if err != nil { t.Fatal(err) } nonexistentTopic := pubsub.NewTopic(dt, batchSizeOne) defer func() { if err := nonexistentTopic.Shutdown(ctx); err != nil { t.Error(err) } }() // The test will hang here if Send doesn't fail quickly, so set a shorter timeout. ctx2, cancel = context.WithTimeout(ctx, 30*time.Second) defer cancel() topicErr := nonexistentTopic.Send(ctx2, &pubsub.Message{}) if topicErr == nil || gcerrors.Code(topicErr) != gcerrors.NotFound { t.Errorf("got error %v sending to nonexistent topic, want Code=NotFound", topicErr) } else if err := st.TopicErrorCheck(topic, topicErr); err != nil { t.Error(err) } // Make a nonexistent subscription and try to receive from it, to get an error // we can use to call SubscriptionErrorCheck. ds, cleanup, err := h.MakeNonexistentSubscription(ctx) if err != nil { t.Fatal(err) } defer cleanup() nonExistentSub := pubsub.NewSubscription(ds, batchSizeOne, batchSizeOne) defer func() { if err := nonExistentSub.Shutdown(ctx); err != nil { t.Error(err) } }() // The test will hang here if Receive doesn't fail quickly, so set a shorter timeout. ctx2, cancel = context.WithTimeout(ctx, 30*time.Second) defer cancel() _, subErr := nonExistentSub.Receive(ctx2) if subErr == nil || ctx2.Err() != nil || gcerrors.Code(subErr) != gcerrors.NotFound { t.Errorf("got error %v receiving from nonexistent subscription, want Code=NotFound", subErr) } else if err := st.SubscriptionErrorCheck(nonExistentSub, subErr); err != nil { t.Error(err) } } // Publishes a large number of messages to topic concurrently, and then times // how long it takes to send (if timeSend is true) or receive (if timeSend // is false) them all. func benchmark(b *testing.B, topic *pubsub.Topic, sub *pubsub.Subscription, timeSend bool) { b.Helper() attrs := map[string]string{"label": "value"} body := []byte("hello, world") const ( nMessages = 10000 concurrencySend = 100 concurrencyReceive = 100 ) if nMessages%concurrencySend != 0 || nMessages%concurrencyReceive != 0 { b.Fatal("nMessages must be divisible by # of sending/receiving goroutines") } b.ResetTimer() for i := 0; i < b.N; i++ { if !timeSend { b.StopTimer() } if err := publishNConcurrently(topic, nMessages, concurrencySend, attrs, body); err != nil { b.Fatalf("publishing: %v", err) } b.Logf("published %d messages", nMessages) if timeSend { b.StopTimer() } else { b.StartTimer() } if err := receiveNConcurrently(sub, nMessages, concurrencyReceive); err != nil { b.Fatalf("receiving: %v", err) } b.SetBytes(nMessages * 1e6) if timeSend { b.Log("MB/s is actually number of messages sent per second") } else { b.Log("MB/s is actually number of messages received per second") } if timeSend { b.StartTimer() } } } func publishNConcurrently(topic *pubsub.Topic, nMessages, nGoroutines int, attrs map[string]string, body []byte) error { return runConcurrently(nMessages, nGoroutines, func(ctx context.Context) error { return topic.Send(ctx, &pubsub.Message{Metadata: attrs, Body: body}) }) } func receiveNConcurrently(sub *pubsub.Subscription, nMessages, nGoroutines int) error { return runConcurrently(nMessages, nGoroutines, func(ctx context.Context) error { m, err := sub.Receive(ctx) if err != nil { return err } m.Ack() return nil }) } // Call function f n times concurrently, using g goroutines. g must divide n. // Wait until all calls complete. If any fail, cancel the remaining ones. func runConcurrently(n, g int, f func(context.Context) error) error { gr, ctx := errgroup.WithContext(context.Background()) ng := n / g for range g { gr.Go(func() error { for range ng { if err := f(ctx); err != nil { return err } } return nil }) } return gr.Wait() } ================================================ FILE: pubsub/example_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package pubsub_test import ( "context" "fmt" "log" "gocloud.dev/pubsub" pbraw "cloud.google.com/go/pubsub/apiv1" pbapi "cloud.google.com/go/pubsub/apiv1/pubsubpb" "google.golang.org/grpc/status" ) func ExampleTopic_Send() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() var topic *pubsub.Topic err := topic.Send(ctx, &pubsub.Message{ Body: []byte("Hello, World!\n"), // Metadata is optional and can be nil. Metadata: map[string]string{ // These are examples of metadata. // There is nothing special about the key names. "language": "en", "importance": "high", }, }) if err != nil { log.Fatal(err) } } func ExampleSubscription_Receive() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() var subscription *pubsub.Subscription // Loop on received messages. for { msg, err := subscription.Receive(ctx) if err != nil { // Errors from Receive indicate that Receive will no longer succeed. log.Printf("Receiving message: %v", err) break } // Do work based on the message, for example: fmt.Printf("Got message: %q\n", msg.Body) // Messages must always be acknowledged with Ack. msg.Ack() } } func ExampleSubscription_Receive_concurrent() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() var subscription *pubsub.Subscription // Loop on received messages. We can use a channel as a semaphore to limit how // many goroutines we have active at a time as well as wait on the goroutines // to finish before exiting. const maxHandlers = 10 sem := make(chan struct{}, maxHandlers) recvLoop: for { msg, err := subscription.Receive(ctx) if err != nil { // Errors from Receive indicate that Receive will no longer succeed. log.Printf("Receiving message: %v", err) break } // Wait if there are too many active handle goroutines and acquire the // semaphore. If the context is canceled, stop waiting and start shutting // down. select { case sem <- struct{}{}: case <-ctx.Done(): break recvLoop } // Handle the message in a new goroutine. go func() { defer func() { <-sem }() // Release the semaphore. defer msg.Ack() // Messages must always be acknowledged with Ack. // Do work based on the message, for example: fmt.Printf("Got message: %q\n", msg.Body) }() } // We're no longer receiving messages. Wait to finish handling any // unacknowledged messages by totally acquiring the semaphore. for range maxHandlers { sem <- struct{}{} } } func ExampleMessage_As() { // This example is specific to the gcppubsub implementation; it demonstrates // access to the underlying PubsubMessage type. // The types exposed for As by gcppubsub are documented in // https://godoc.org/gocloud.dev/pubsub/gcppubsub#hdr-As ctx := context.Background() sub, err := pubsub.OpenSubscription(ctx, "gcppubsub://project/topic") if err != nil { log.Fatal(err) } defer sub.Shutdown(ctx) msg, err := sub.Receive(ctx) if err != nil { log.Fatal(err) } var pm *pbapi.PubsubMessage if msg.As(&pm) { _ = pm.GetAttributes() } msg.Ack() } func ExampleSubscription_As() { // This example is specific to the gcppubsub implementation; it demonstrates // access to the underlying SubscriberClient type. // The types exposed for As by gcppubsub are documented in // https://godoc.org/gocloud.dev/pubsub/gcppubsub#hdr-As ctx := context.Background() sub, err := pubsub.OpenSubscription(ctx, "gcppubsub://project/topic") if err != nil { log.Fatal(err) } defer sub.Shutdown(ctx) var sc *pbraw.SubscriberClient if sub.As(&sc) { _ = sc.CallOptions } } func ExampleSubscription_ErrorAs() { // This example is specific to the gcppubsub implementation; it demonstrates // access to the underlying Status type. // The types exposed for As by gcppubsub are documented in // https://godoc.org/gocloud.dev/pubsub/gcppubsub#hdr-As ctx := context.Background() sub, err := pubsub.OpenSubscription(ctx, "gcppubsub://project/badtopic") if err != nil { log.Fatal(err) } defer sub.Shutdown(ctx) msg, err := sub.Receive(ctx) if err != nil { var s *status.Status if sub.ErrorAs(err, &s) { _ = s.Code() } log.Fatal(err) } msg.Ack() } func ExampleTopic_As() { // This example is specific to the gcppubsub implementation; it demonstrates // access to the underlying PublisherClient type. // The types exposed for As by gcppubsub are documented in // https://godoc.org/gocloud.dev/pubsub/gcppubsub#hdr-As ctx := context.Background() topic, err := pubsub.OpenTopic(ctx, "gcppubsub://project/topic") if err != nil { log.Fatal(err) } defer topic.Shutdown(ctx) var pc *pbraw.PublisherClient if topic.As(&pc) { _ = pc } } func ExampleTopic_ErrorAs() { // This example is specific to the gcppubsub implementation; it demonstrates // access to the underlying Status type. // The types exposed for As by gcppubsub are documented in // https://godoc.org/gocloud.dev/pubsub/gcppubsub#hdr-As ctx := context.Background() topic, err := pubsub.OpenTopic(ctx, "gcppubsub://project/topic") if err != nil { log.Fatal(err) } defer topic.Shutdown(ctx) err = topic.Send(ctx, &pubsub.Message{Body: []byte("hello")}) if err != nil { var s *status.Status if topic.ErrorAs(err, &s) { _ = s.Code() } log.Fatal(err) } } ================================================ FILE: pubsub/gcppubsub/example_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcppubsub_test import ( "context" "log" "gocloud.dev/gcp" "gocloud.dev/pubsub" "gocloud.dev/pubsub/gcppubsub" raw "cloud.google.com/go/pubsub/apiv1" pb "cloud.google.com/go/pubsub/apiv1/pubsubpb" ) func ExampleOpenTopic() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // Your GCP credentials. // See https://cloud.google.com/docs/authentication/production // for more info on alternatives. creds, err := gcp.DefaultCredentials(ctx) if err != nil { log.Fatal(err) } // Open a gRPC connection to the GCP Pub/Sub API. conn, cleanup, err := gcppubsub.Dial(ctx, creds.TokenSource) if err != nil { log.Fatal(err) } defer cleanup() // Construct a PublisherClient using the connection. pubClient, err := gcppubsub.PublisherClient(ctx, conn) if err != nil { log.Fatal(err) } defer pubClient.Close() // Construct a *pubsub.Topic. topic, err := gcppubsub.OpenTopicByPath(pubClient, "projects/myprojectID/topics/example-topic", nil) if err != nil { log.Fatal(err) } defer topic.Shutdown(ctx) } func Example_openTopicFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/pubsub/gcppubsub" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() topic, err := pubsub.OpenTopic(ctx, "gcppubsub://projects/myproject/topics/mytopic") if err != nil { log.Fatal(err) } defer topic.Shutdown(ctx) } func ExampleOpenSubscription() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // Your GCP credentials. // See https://cloud.google.com/docs/authentication/production // for more info on alternatives. creds, err := gcp.DefaultCredentials(ctx) if err != nil { log.Fatal(err) } // Open a gRPC connection to the GCP Pub/Sub API. conn, cleanup, err := gcppubsub.Dial(ctx, creds.TokenSource) if err != nil { log.Fatal(err) } defer cleanup() // Construct a SubscriberClient using the connection. subClient, err := gcppubsub.SubscriberClient(ctx, conn) if err != nil { log.Fatal(err) } defer subClient.Close() // Construct a *pubsub.Subscription. subscription, err := gcppubsub.OpenSubscriptionByPath( subClient, "projects/myprojectID/subscriptions/example-subscription", nil) if err != nil { log.Fatal(err) } defer subscription.Shutdown(ctx) } func Example_extendingAckDeadline() { ctx := context.Background() // Construct a *pubsub.Subscription, in this example using a URL. const subName = "projects/myprojectID/subscriptions/example-subscription" subscription, err := pubsub.OpenSubscription(ctx, "gcppubsub://"+subName) if err != nil { log.Fatal(err) } defer subscription.Shutdown(ctx) // Get the underlying SubscriberClient. If you used the constructor to create // the subscription (e.g., gcppubsub.OpenSubscriptionByPath), you may already // have the client. var client *raw.SubscriberClient if !subscription.As(&client) { log.Fatal("Couldn't get SubscriberClient using As") } // Now assume you've got a message, and processing is going to take a long time; // you want to extend the default Ack deadline. msg, err := subscription.Receive(ctx) if err != nil { log.Fatalf("Failed to receive message: %v", err) } // Get the underlying ReceivedMessage. var rm *pb.ReceivedMessage if !msg.As(&rm) { log.Fatal("Couldn't get ReceivedMessage using As") } // Call ModifyAckDeadline. if err := client.ModifyAckDeadline(ctx, &pb.ModifyAckDeadlineRequest{ Subscription: subName, AckIds: []string{rm.AckId}, AckDeadlineSeconds: 30 * 60, // 30m, or whatever you need }); err != nil { log.Fatalf("Failed to ModifyAckDeadline: %v", err) } // ... eventually Ack the message. msg.Ack() } func Example_openSubscriptionFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/pubsub/gcppubsub" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() subscription, err := pubsub.OpenSubscription(ctx, "gcppubsub://projects/my-project/subscriptions/my-subscription") if err != nil { log.Fatal(err) } defer subscription.Shutdown(ctx) } ================================================ FILE: pubsub/gcppubsub/gcppubsub.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package gcppubsub provides a pubsub implementation that uses GCP // PubSub. Use OpenTopic to construct a *pubsub.Topic, and/or OpenSubscription // to construct a *pubsub.Subscription. // // # URLs // // For pubsub.OpenTopic and pubsub.OpenSubscription, gcppubsub registers // for the scheme "gcppubsub". // The default URL opener will creating a connection using use default // credentials from the environment, as described in // https://cloud.google.com/docs/authentication/production. // To customize the URL opener, or for more details on the URL format, // see URLOpener. // See https://gocloud.dev/concepts/urls/ for background information. // // GCP Pub/Sub emulator is supported as per https://cloud.google.com/pubsub/docs/emulator // So, when environment variable 'PUBSUB_EMULATOR_HOST' is set // driver connects to the specified emulator host by default. // // # Message Delivery Semantics // // GCP Pub/Sub supports at-least-once semantics; applications must // call Message.Ack after processing a message, or it will be redelivered. // See https://godoc.org/gocloud.dev/pubsub#hdr-At_most_once_and_At_least_once_Delivery // for more background. // // # As // // gcppubsub exposes the following types for As: // - Topic: *raw.PublisherClient // - Subscription: *raw.SubscriberClient // - Message.BeforeSend: *pb.PubsubMessage // - Message.AfterSend: *string for the pb.PublishResponse.MessageIds entry corresponding to the message. // - Message: *pb.PubsubMessage, *pb.ReceivedMessage // - Error: *google.golang.org/grpc/status.Status package gcppubsub // import "gocloud.dev/pubsub/gcppubsub" import ( "context" "fmt" "net/url" "os" "path" "regexp" "strconv" "strings" "sync" "time" raw "cloud.google.com/go/pubsub/apiv1" pb "cloud.google.com/go/pubsub/apiv1/pubsubpb" "github.com/google/wire" "gocloud.dev/gcerrors" "gocloud.dev/gcp" "gocloud.dev/internal/gcerr" "gocloud.dev/internal/useragent" "gocloud.dev/pubsub" "gocloud.dev/pubsub/batcher" "gocloud.dev/pubsub/driver" "google.golang.org/api/option" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/credentials/oauth" "google.golang.org/grpc/status" ) var endPoint = "pubsub.googleapis.com:443" var sendBatcherOpts = &batcher.Options{ MaxBatchSize: 1000, // The PubSub service limits the number of messages in a single Publish RPC MaxHandlers: 2, // The PubSub service limits the size of the request body in a single Publish RPC. // The limit is currently documented as "10MB (total size)" and "10MB (data field)" per message. // We are enforcing 9MiB to give ourselves some headroom for message attributes since those // are currently not considered when computing the byte size of a message. MaxBatchByteSize: 9 * 1024 * 1024, } var defaultRecvBatcherOpts = &batcher.Options{ // GCP Pub/Sub returns at most 1000 messages per RPC. MaxBatchSize: 1000, MaxHandlers: 10, } var ackBatcherOpts = &batcher.Options{ // The PubSub service limits the size of Acknowledge/ModifyAckDeadline RPCs. // (E.g., "Request payload size exceeds the limit: 524288 bytes."). MaxBatchSize: 1000, MaxHandlers: 2, } func init() { o := new(lazyCredsOpener) pubsub.DefaultURLMux().RegisterTopic(Scheme, o) pubsub.DefaultURLMux().RegisterSubscription(Scheme, o) } // Set holds Wire providers for this package. var Set = wire.NewSet( Dial, PublisherClient, SubscriberClient, wire.Struct(new(SubscriptionOptions)), wire.Struct(new(TopicOptions)), wire.Struct(new(URLOpener), "Conn", "TopicOptions", "SubscriptionOptions"), ) // lazyCredsOpener obtains Application Default Credentials on the first call // to OpenTopicURL/OpenSubscriptionURL. type lazyCredsOpener struct { init sync.Once opener *URLOpener err error } func (o *lazyCredsOpener) defaultConn(ctx context.Context) (*URLOpener, error) { o.init.Do(func() { var conn *grpc.ClientConn var err error if e := os.Getenv("PUBSUB_EMULATOR_HOST"); e != "" { // Connect to the GCP pubsub emulator by overriding the default endpoint // if the 'PUBSUB_EMULATOR_HOST' environment variable is set. // Check https://cloud.google.com/pubsub/docs/emulator for more info. endPoint = e conn, err = dialEmulator(ctx, e) if err != nil { o.err = err return } } else { creds, err := gcp.DefaultCredentials(ctx) if err != nil { o.err = err return } conn, _, err = Dial(ctx, creds.TokenSource) if err != nil { o.err = err return } } o.opener = &URLOpener{Conn: conn} }) return o.opener, o.err } func (o *lazyCredsOpener) OpenTopicURL(ctx context.Context, u *url.URL) (*pubsub.Topic, error) { opener, err := o.defaultConn(ctx) if err != nil { return nil, fmt.Errorf("open topic %v: failed to open default connection: %v", u, err) } return opener.OpenTopicURL(ctx, u) } func (o *lazyCredsOpener) OpenSubscriptionURL(ctx context.Context, u *url.URL) (*pubsub.Subscription, error) { opener, err := o.defaultConn(ctx) if err != nil { return nil, fmt.Errorf("open subscription %v: failed to open default connection: %v", u, err) } return opener.OpenSubscriptionURL(ctx, u) } // Scheme is the URL scheme gcppubsub registers its URLOpeners under on pubsub.DefaultMux. const Scheme = "gcppubsub" // URLOpener opens GCP Pub/Sub URLs like "gcppubsub://projects/myproject/topics/mytopic" for // topics or "gcppubsub://projects/myproject/subscriptions/mysub" for subscriptions. // // The shortened forms "gcppubsub://myproject/mytopic" for topics or // "gcppubsub://myproject/mysub" for subscriptions are also supported. // // The following query parameters are supported: // // - max_recv_batch_size: sets SubscriptionOptions.MaxBatchSize. // - max_send_batch_size: sets TopicOptions.BatcherOptions.MaxBatchSize. // - nacklazy: sets SubscriberOptions.NackLazy. The value must be parseable by `strconv.ParseBool`. // // Currently their use is limited to subscribers. type URLOpener struct { // Conn must be set to a non-nil ClientConn authenticated with // Cloud Pub/Sub scope or equivalent. Conn *grpc.ClientConn // TopicOptions specifies the options to pass to OpenTopic. TopicOptions TopicOptions // SubscriptionOptions specifies the options to pass to OpenSubscription. SubscriptionOptions SubscriptionOptions } // OpenTopicURL opens a pubsub.Topic based on u. func (o *URLOpener) OpenTopicURL(ctx context.Context, u *url.URL) (*pubsub.Topic, error) { opts := o.TopicOptions for param, value := range u.Query() { switch param { case "max_send_batch_size": maxBatchSize, err := queryParameterInt(value) if err != nil { return nil, fmt.Errorf("open topic %v: invalid query parameter %q: %v", u, param, err) } if maxBatchSize <= 0 || maxBatchSize > 1000 { return nil, fmt.Errorf("open topic %v: invalid query parameter %q: must be between 1 and 1000", u, param) } opts.BatcherOptions.MaxBatchSize = maxBatchSize default: return nil, fmt.Errorf("open topic %v: invalid query parameter %q", u, param) } } pc, err := PublisherClient(ctx, o.Conn) if err != nil { return nil, err } topicPath := path.Join(u.Host, u.Path) if topicPathRE.MatchString(topicPath) { return OpenTopicByPath(pc, topicPath, &opts) } // Shortened form? topicName := strings.TrimPrefix(u.Path, "/") return OpenTopic(pc, gcp.ProjectID(u.Host), topicName, &opts), nil } // OpenSubscriptionURL opens a pubsub.Subscription based on u. func (o *URLOpener) OpenSubscriptionURL(ctx context.Context, u *url.URL) (*pubsub.Subscription, error) { // Set subscription options to use defaults opts := o.SubscriptionOptions for param, value := range u.Query() { switch param { case "max_recv_batch_size": maxBatchSize, err := queryParameterInt(value) if err != nil { return nil, fmt.Errorf("open subscription %v: invalid query parameter %q: %v", u, param, err) } if maxBatchSize <= 0 || maxBatchSize > 1000 { return nil, fmt.Errorf("open subscription %v: invalid query parameter %q: must be between 1 and 1000", u, param) } opts.MaxBatchSize = maxBatchSize case "nacklazy": var err error nackLazy, err := queryParameterBool(value) if err != nil { return nil, fmt.Errorf("open subscription %v: invalid query parameter %q: %v", u, param, err) } opts.NackLazy = nackLazy default: return nil, fmt.Errorf("open subscription %v: invalid query parameter %q", u, param) } } sc, err := SubscriberClient(ctx, o.Conn) if err != nil { return nil, err } subPath := path.Join(u.Host, u.Path) if subscriptionPathRE.MatchString(subPath) { return OpenSubscriptionByPath(sc, subPath, &opts) } // Shortened form? subName := strings.TrimPrefix(u.Path, "/") return OpenSubscription(sc, gcp.ProjectID(u.Host), subName, &opts), nil } type topic struct { path string client *raw.PublisherClient } // Dial opens a gRPC connection to the GCP Pub Sub API. // // The second return value is a function that can be called to clean up // the connection opened by Dial. func Dial(ctx context.Context, ts gcp.TokenSource) (*grpc.ClientConn, func(), error) { conn, err := grpc.DialContext(ctx, endPoint, grpc.WithTransportCredentials(credentials.NewClientTLSFromCert(nil, "")), grpc.WithPerRPCCredentials(oauth.TokenSource{TokenSource: ts}), // The default message size limit for gRPC is 4MB, while GCP // PubSub supports messages up to 10MB. Aside from the message itself // there is also other data in the gRPC response, bringing the maximum // response size above 10MB. Tell gRPC to support up to 11MB. // https://github.com/googleapis/google-cloud-node/issues/1991 grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(1024*1024*11)), useragent.GRPCDialOption("pubsub"), ) if err != nil { return nil, nil, err } return conn, func() { conn.Close() }, nil } // dialEmulator opens a gRPC connection to the GCP Pub Sub API. func dialEmulator(ctx context.Context, e string) (*grpc.ClientConn, error) { conn, err := grpc.DialContext(ctx, e, grpc.WithTransportCredentials(insecure.NewCredentials()), useragent.GRPCDialOption("pubsub")) if err != nil { return nil, err } return conn, nil } // PublisherClient returns a *raw.PublisherClient that can be used in OpenTopic. func PublisherClient(ctx context.Context, conn *grpc.ClientConn) (*raw.PublisherClient, error) { return raw.NewPublisherClient(ctx, option.WithGRPCConn(conn)) } // SubscriberClient returns a *raw.SubscriberClient that can be used in OpenSubscription. func SubscriberClient(ctx context.Context, conn *grpc.ClientConn) (*raw.SubscriberClient, error) { return raw.NewSubscriberClient(ctx, option.WithGRPCConn(conn)) } // TopicOptions will contain configuration for topics. type TopicOptions struct { // BatcherOptions adds constraints to the default batching done for sends. BatcherOptions batcher.Options } // OpenTopic returns a *pubsub.Topic backed by an existing GCP PubSub topic // in the given projectID. topicName is the last part of the full topic // path, e.g., "foo" from "projects//topic/foo". // See the package documentation for an example. func OpenTopic(client *raw.PublisherClient, projectID gcp.ProjectID, topicName string, opts *TopicOptions) *pubsub.Topic { topicPath := fmt.Sprintf("projects/%s/topics/%s", projectID, topicName) if opts == nil { opts = &TopicOptions{} } bo := sendBatcherOpts.NewMergedOptions(&opts.BatcherOptions) return pubsub.NewTopic(openTopic(client, topicPath), bo) } var topicPathRE = regexp.MustCompile("^projects/.+/topics/.+$") // OpenTopicByPath returns a *pubsub.Topic backed by an existing GCP PubSub // topic. topicPath must be of the form "projects//topic/". // See the package documentation for an example. func OpenTopicByPath(client *raw.PublisherClient, topicPath string, opts *TopicOptions) (*pubsub.Topic, error) { if !topicPathRE.MatchString(topicPath) { return nil, fmt.Errorf("invalid topicPath %q; must match %v", topicPath, topicPathRE) } if opts == nil { opts = &TopicOptions{} } bo := sendBatcherOpts.NewMergedOptions(&opts.BatcherOptions) return pubsub.NewTopic(openTopic(client, topicPath), bo), nil } // openTopic returns the driver for OpenTopic. This function exists so the test // harness can get the driver interface implementation if it needs to. func openTopic(client *raw.PublisherClient, topicPath string) driver.Topic { return &topic{topicPath, client} } // SendBatch implements driver.Topic.SendBatch. func (t *topic) SendBatch(ctx context.Context, dms []*driver.Message) error { var ms []*pb.PubsubMessage for _, dm := range dms { psm := &pb.PubsubMessage{Data: dm.Body, Attributes: dm.Metadata} if dm.BeforeSend != nil { asFunc := func(i any) bool { if p, ok := i.(**pb.PubsubMessage); ok { *p = psm return true } return false } if err := dm.BeforeSend(asFunc); err != nil { return err } } ms = append(ms, psm) } req := &pb.PublishRequest{Topic: t.path, Messages: ms} pr, err := t.client.Publish(ctx, req) if err != nil { return err } if len(pr.MessageIds) == len(dms) { for n, dm := range dms { if dm.AfterSend != nil { asFunc := func(i any) bool { if p, ok := i.(*string); ok { *p = pr.MessageIds[n] return true } return false } if err := dm.AfterSend(asFunc); err != nil { return err } } } } return nil } // IsRetryable implements driver.Topic.IsRetryable. func (t *topic) IsRetryable(error) bool { // The client handles retries. return false } // As implements driver.Topic.As. func (t *topic) As(i any) bool { c, ok := i.(**raw.PublisherClient) if !ok { return false } *c = t.client return true } // ErrorAs implements driver.Topic.ErrorAs func (*topic) ErrorAs(err error, i any) bool { return errorAs(err, i) } func errorAs(err error, i any) bool { s, ok := status.FromError(err) if !ok { return false } p, ok := i.(**status.Status) if !ok { return false } *p = s return true } func (*topic) ErrorCode(err error) gcerrors.ErrorCode { return gcerr.GRPCCode(err) } // Close implements driver.Topic.Close. func (*topic) Close() error { return nil } type subscription struct { client *raw.SubscriberClient path string options *SubscriptionOptions } // SubscriptionOptions will contain configuration for subscriptions. type SubscriptionOptions struct { // MaxBatchSize caps the maximum batch size used when retrieving messages. It defaults to 1000. MaxBatchSize int // NackLazy determines what Nack does. // // By default, Nack uses ModifyAckDeadline to set the ack deadline // for the nacked message to 0, so that it will be redelivered immediately. // Set NackLazy to true to bypass this behavior; Nack will do nothing, // and the message will be redelivered after the existing ack deadline // expires. NackLazy bool // ReceiveBatcherOptions adds constraints to the default batching done for receives. ReceiveBatcherOptions batcher.Options // AckBatcherOptions adds constraints to the default batching done for acks. AckBatcherOptions batcher.Options } // OpenSubscription returns a *pubsub.Subscription backed by an existing GCP // PubSub subscription subscriptionName in the given projectID. See the package // documentation for an example. func OpenSubscription(client *raw.SubscriberClient, projectID gcp.ProjectID, subscriptionName string, opts *SubscriptionOptions) *pubsub.Subscription { path := fmt.Sprintf("projects/%s/subscriptions/%s", projectID, subscriptionName) dsub := openSubscription(client, path, opts) recvOpts := *defaultRecvBatcherOpts recvOpts.MaxBatchSize = dsub.options.MaxBatchSize rbo := recvOpts.NewMergedOptions(&dsub.options.ReceiveBatcherOptions) abo := ackBatcherOpts.NewMergedOptions(&dsub.options.AckBatcherOptions) return pubsub.NewSubscription(dsub, rbo, abo) } var subscriptionPathRE = regexp.MustCompile("^projects/.+/subscriptions/.+$") // OpenSubscriptionByPath returns a *pubsub.Subscription backed by an existing // GCP PubSub subscription. subscriptionPath must be of the form // "projects//subscriptions/". // See the package documentation for an example. func OpenSubscriptionByPath(client *raw.SubscriberClient, subscriptionPath string, opts *SubscriptionOptions) (*pubsub.Subscription, error) { if !subscriptionPathRE.MatchString(subscriptionPath) { return nil, fmt.Errorf("invalid subscriptionPath %q; must match %v", subscriptionPath, subscriptionPathRE) } dsub := openSubscription(client, subscriptionPath, opts) recvOpts := *defaultRecvBatcherOpts recvOpts.MaxBatchSize = dsub.options.MaxBatchSize rbo := recvOpts.NewMergedOptions(&dsub.options.ReceiveBatcherOptions) abo := ackBatcherOpts.NewMergedOptions(&dsub.options.AckBatcherOptions) return pubsub.NewSubscription(dsub, rbo, abo), nil } // openSubscription returns a driver.Subscription. func openSubscription(client *raw.SubscriberClient, subscriptionPath string, opts *SubscriptionOptions) *subscription { if opts == nil { opts = &SubscriptionOptions{} } if opts.MaxBatchSize == 0 { opts.MaxBatchSize = defaultRecvBatcherOpts.MaxBatchSize } return &subscription{client, subscriptionPath, opts} } // ReceiveBatch implements driver.Subscription.ReceiveBatch. func (s *subscription) ReceiveBatch(ctx context.Context, maxMessages int) ([]*driver.Message, error) { // Whether to ask Pull to return immediately, or wait for some messages to // arrive. If we're making multiple RPCs, we don't want any of them to wait; // we might have gotten messages from one of the other RPCs. // maxMessages will only be high enough to set this to true in high-throughput // situations, so the likelihood of getting 0 messages is small anyway. returnImmediately := maxMessages == s.options.MaxBatchSize req := &pb.PullRequest{ Subscription: s.path, ReturnImmediately: returnImmediately, MaxMessages: int32(maxMessages), } resp, err := s.client.Pull(ctx, req) if err != nil { return nil, err } if len(resp.ReceivedMessages) == 0 { // If we did happen to get 0 messages, and we didn't ask the server to wait // for messages, sleep a bit to avoid spinning. if returnImmediately { time.Sleep(100 * time.Millisecond) } return nil, nil } ms := make([]*driver.Message, 0, len(resp.ReceivedMessages)) for _, rm := range resp.ReceivedMessages { rmm := rm.Message m := &driver.Message{ LoggableID: rmm.MessageId, Body: rmm.Data, Metadata: rmm.Attributes, AckID: rm.AckId, AsFunc: messageAsFunc(rmm, rm), } ms = append(ms, m) } return ms, nil } func messageAsFunc(pm *pb.PubsubMessage, rm *pb.ReceivedMessage) func(any) bool { return func(i any) bool { ip, ok := i.(**pb.PubsubMessage) if ok { *ip = pm return true } rp, ok := i.(**pb.ReceivedMessage) if ok { *rp = rm return true } return false } } // SendAcks implements driver.Subscription.SendAcks. func (s *subscription) SendAcks(ctx context.Context, ids []driver.AckID) error { ids2 := make([]string, 0, len(ids)) for _, id := range ids { ids2 = append(ids2, id.(string)) } return s.client.Acknowledge(ctx, &pb.AcknowledgeRequest{Subscription: s.path, AckIds: ids2}) } // CanNack implements driver.CanNack. func (s *subscription) CanNack() bool { return true } // SendNacks implements driver.Subscription.SendNacks. func (s *subscription) SendNacks(ctx context.Context, ids []driver.AckID) error { if s.options.NackLazy { return nil } ids2 := make([]string, 0, len(ids)) for _, id := range ids { ids2 = append(ids2, id.(string)) } return s.client.ModifyAckDeadline(ctx, &pb.ModifyAckDeadlineRequest{ Subscription: s.path, AckIds: ids2, AckDeadlineSeconds: 0, }) } // IsRetryable implements driver.Subscription.IsRetryable. func (s *subscription) IsRetryable(err error) bool { // The client mostly handles retries, but does not // include DeadlineExceeded for some reason. return s.ErrorCode(err) == gcerrors.DeadlineExceeded } // As implements driver.Subscription.As. func (s *subscription) As(i any) bool { c, ok := i.(**raw.SubscriberClient) if !ok { return false } *c = s.client return true } // ErrorAs implements driver.Subscription.ErrorAs func (*subscription) ErrorAs(err error, i any) bool { return errorAs(err, i) } func (*subscription) ErrorCode(err error) gcerrors.ErrorCode { return gcerr.GRPCCode(err) } // Close implements driver.Subscription.Close. func (*subscription) Close() error { return nil } func queryParameterInt(value []string) (int, error) { if len(value) > 1 { return 0, fmt.Errorf("expected only one parameter value, got: %v", len(value)) } return strconv.Atoi(value[0]) } func queryParameterBool(value []string) (bool, error) { if len(value) > 1 { return false, fmt.Errorf("expected only one parameter value, got: %v", len(value)) } return strconv.ParseBool(value[0]) } ================================================ FILE: pubsub/gcppubsub/gcppubsub_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcppubsub import ( "context" "fmt" "path" "strings" "sync/atomic" "testing" raw "cloud.google.com/go/pubsub/apiv1" "cloud.google.com/go/pubsub/apiv1/pubsubpb" "gocloud.dev/gcp" "gocloud.dev/internal/testing/setup" "gocloud.dev/pubsub" "gocloud.dev/pubsub/driver" "gocloud.dev/pubsub/drivertest" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) // projectID is the project ID that was used during the last test run using // --record. const projectID = "go-cloud-test-216917" type harness struct { closer func() pubClient *raw.PublisherClient subClient *raw.SubscriberClient numTopics uint32 // atomic numSubs uint32 // atomic } func newHarness(ctx context.Context, t *testing.T) (drivertest.Harness, error) { t.Helper() conn, done := setup.NewGCPgRPCConn(ctx, t, endPoint, "pubsub") pubClient, err := PublisherClient(ctx, conn) if err != nil { return nil, fmt.Errorf("making publisher client: %v", err) } subClient, err := SubscriberClient(ctx, conn) if err != nil { return nil, fmt.Errorf("making subscription client: %v", err) } return &harness{closer: done, pubClient: pubClient, subClient: subClient, numTopics: 0, numSubs: 0}, nil } func (h *harness) CreateTopic(ctx context.Context, testName string) (dt driver.Topic, cleanup func(), err error) { // We may encounter topics that were created by a previous test run and were // not properly cleaned up. In such a case delete the existing topic and create // a new topic with a higher topic number (to avoid cool-off issues between // deletion and re-creation). for { topicName := fmt.Sprintf("%s-topic-%d", sanitize(testName), atomic.AddUint32(&h.numTopics, 1)) topicPath := fmt.Sprintf("projects/%s/topics/%s", projectID, topicName) dt, cleanup, err := createTopic(ctx, h.pubClient, topicName, topicPath) if err != nil && status.Code(err) == codes.AlreadyExists { // Delete the topic and retry. h.pubClient.DeleteTopic(ctx, &pubsubpb.DeleteTopicRequest{Topic: topicPath}) continue } return dt, cleanup, err } } func createTopic(ctx context.Context, pubClient *raw.PublisherClient, topicName, topicPath string) (dt driver.Topic, cleanup func(), err error) { _, err = pubClient.CreateTopic(ctx, &pubsubpb.Topic{Name: topicPath}) if err != nil { return nil, nil, err } dt = openTopic(pubClient, path.Join("projects", projectID, "topics", topicName)) cleanup = func() { pubClient.DeleteTopic(ctx, &pubsubpb.DeleteTopicRequest{Topic: topicPath}) } return dt, cleanup, nil } func (h *harness) MakeNonexistentTopic(ctx context.Context) (driver.Topic, error) { return openTopic(h.pubClient, path.Join("projects", projectID, "topics", "nonexistent-topic")), nil } func (h *harness) CreateSubscription(ctx context.Context, dt driver.Topic, testName string) (ds driver.Subscription, cleanup func(), err error) { // We may encounter subscriptions that were created by a previous test run // and were not properly cleaned up. In such a case delete the existing // subscription and create a new subscription with a higher subscription // number (to avoid cool-off issues between deletion and re-creation). for { subName := fmt.Sprintf("%s-subscription-%d", sanitize(testName), atomic.AddUint32(&h.numSubs, 1)) subPath := fmt.Sprintf("projects/%s/subscriptions/%s", projectID, subName) ds, cleanup, err := createSubscription(ctx, h.subClient, dt, subName, subPath) if err != nil && status.Code(err) == codes.AlreadyExists { // Delete the subscription and retry. h.subClient.DeleteSubscription(ctx, &pubsubpb.DeleteSubscriptionRequest{Subscription: subPath}) continue } return ds, cleanup, err } } func createSubscription(ctx context.Context, subClient *raw.SubscriberClient, dt driver.Topic, subName, subPath string) (ds driver.Subscription, cleanup func(), err error) { t := dt.(*topic) _, err = subClient.CreateSubscription(ctx, &pubsubpb.Subscription{ Name: subPath, Topic: t.path, }) if err != nil { return nil, nil, err } ds = openSubscription(subClient, path.Join("projects", projectID, "subscriptions", subName), nil) cleanup = func() { subClient.DeleteSubscription(ctx, &pubsubpb.DeleteSubscriptionRequest{Subscription: subPath}) } return ds, cleanup, nil } func (h *harness) MakeNonexistentSubscription(ctx context.Context) (driver.Subscription, func(), error) { return openSubscription(h.subClient, path.Join("projects", projectID, "subscriptions", "nonexistent-subscription"), nil), func() {}, nil } func (h *harness) Close() { h.pubClient.Close() h.subClient.Close() h.closer() } func (h *harness) MaxBatchSizes() (int, int) { return sendBatcherOpts.MaxBatchSize, ackBatcherOpts.MaxBatchSize } func (*harness) SupportsMultipleSubscriptions() bool { return true } func TestConformance(t *testing.T) { asTests := []drivertest.AsTest{gcpAsTest{}} drivertest.RunConformanceTests(t, newHarness, asTests) } func BenchmarkGcpPubSub(b *testing.B) { ctx := context.Background() creds, err := gcp.DefaultCredentials(ctx) if err != nil { b.Fatal(err) } // Connect. conn, cleanup, err := Dial(ctx, gcp.CredentialsTokenSource(creds)) if err != nil { b.Fatal(err) } defer cleanup() // Make topic. pc, err := PublisherClient(ctx, conn) if err != nil { b.Fatal(err) } topicName := fmt.Sprintf("%s-topic", b.Name()) topicPath := fmt.Sprintf("projects/%s/topics/%s", projectID, topicName) dt, cleanup1, err := createTopic(ctx, pc, topicName, topicPath) if err != nil { b.Fatal(err) } defer cleanup1() topic := pubsub.NewTopic(dt, nil) defer topic.Shutdown(ctx) // Make subscription. sc, err := SubscriberClient(ctx, conn) if err != nil { b.Fatal(err) } subName := fmt.Sprintf("%s-subscription", b.Name()) subPath := fmt.Sprintf("projects/%s/subscriptions/%s", projectID, subName) ds, cleanup2, err := createSubscription(ctx, sc, dt, subName, subPath) if err != nil { b.Fatal(err) } defer cleanup2() sub := pubsub.NewSubscription(ds, defaultRecvBatcherOpts, ackBatcherOpts) defer sub.Shutdown(ctx) drivertest.RunBenchmarks(b, topic, sub) } type gcpAsTest struct{} func (gcpAsTest) Name() string { return "gcp test" } func (gcpAsTest) TopicCheck(topic *pubsub.Topic) error { var c2 raw.PublisherClient if topic.As(&c2) { return fmt.Errorf("cast succeeded for %T, want failure", &c2) } var c3 *raw.PublisherClient if !topic.As(&c3) { return fmt.Errorf("cast failed for %T", &c3) } return nil } func (gcpAsTest) SubscriptionCheck(sub *pubsub.Subscription) error { var c2 raw.SubscriberClient if sub.As(&c2) { return fmt.Errorf("cast succeeded for %T, want failure", &c2) } var c3 *raw.SubscriberClient if !sub.As(&c3) { return fmt.Errorf("cast failed for %T", &c3) } return nil } func (gcpAsTest) TopicErrorCheck(t *pubsub.Topic, err error) error { var s *status.Status if !t.ErrorAs(err, &s) { return fmt.Errorf("failed to convert %v (%T) to a gRPC Status", err, err) } if s.Code() != codes.NotFound { return fmt.Errorf("got code %s, want NotFound", s.Code()) } return nil } func (gcpAsTest) SubscriptionErrorCheck(sub *pubsub.Subscription, err error) error { var s *status.Status if !sub.ErrorAs(err, &s) { return fmt.Errorf("failed to convert %v (%T) to a gRPC Status", err, err) } if s.Code() != codes.NotFound { return fmt.Errorf("got code %s, want NotFound", s.Code()) } return nil } func (gcpAsTest) MessageCheck(m *pubsub.Message) error { var pm pubsubpb.PubsubMessage if m.As(&pm) { return fmt.Errorf("cast succeeded for %T, want failure", &pm) } var ppm *pubsubpb.PubsubMessage if !m.As(&ppm) { return fmt.Errorf("cast failed for %T", &ppm) } var prm *pubsubpb.ReceivedMessage if !m.As(&prm) { return fmt.Errorf("cast failed for %T", &prm) } return nil } func (gcpAsTest) BeforeSend(as func(any) bool) error { var ppm *pubsubpb.PubsubMessage if !as(&ppm) { return fmt.Errorf("cast failed for %T", &ppm) } return nil } func (gcpAsTest) AfterSend(as func(any) bool) error { var msgId string if !as(&msgId) { return fmt.Errorf("cast failed for %T", &msgId) } return nil } func sanitize(testName string) string { return strings.Replace(testName, "/", "_", -1) } func TestOpenTopic(t *testing.T) { ctx := context.Background() creds, err := setup.FakeGCPCredentials(ctx) if err != nil { t.Fatal(err) } projID, err := gcp.DefaultProjectID(creds) if err != nil { t.Fatal(err) } conn, cleanup, err := Dial(ctx, gcp.CredentialsTokenSource(creds)) if err != nil { t.Fatal(err) } defer cleanup() pc, err := PublisherClient(ctx, conn) if err != nil { t.Fatal(err) } topic := OpenTopic(pc, projID, "my-topic", nil) defer topic.Shutdown(ctx) err = topic.Send(ctx, &pubsub.Message{Body: []byte("hello world")}) if err == nil { t.Error("got nil, want error") } // Repeat with OpenTopicByPath. topic, err = OpenTopicByPath(pc, path.Join("projects", string(projID), "topics", "my-topic"), nil) if err != nil { t.Fatal(err) } defer topic.Shutdown(ctx) err = topic.Send(ctx, &pubsub.Message{Body: []byte("hello world")}) if err == nil { t.Error("got nil, want error") } // Try an invalid path. _, err = OpenTopicByPath(pc, "my-topic", nil) if err == nil { t.Error("got nil, want error") } } func TestOpenSubscription(t *testing.T) { ctx := context.Background() creds, err := setup.FakeGCPCredentials(ctx) if err != nil { t.Fatal(err) } projID, err := gcp.DefaultProjectID(creds) if err != nil { t.Fatal(err) } conn, cleanup, err := Dial(ctx, gcp.CredentialsTokenSource(creds)) if err != nil { t.Fatal(err) } defer cleanup() sc, err := SubscriberClient(ctx, conn) if err != nil { t.Fatal(err) } sub := OpenSubscription(sc, projID, "my-subscription", nil) defer sub.Shutdown(ctx) _, err = sub.Receive(ctx) if err == nil { t.Error("got nil, want error") } // Repeat with OpenSubscriptionByPath. sub, err = OpenSubscriptionByPath(sc, path.Join("projects", string(projID), "subscriptions", "my-subscription"), nil) if err != nil { t.Fatal(err) } defer sub.Shutdown(ctx) _, err = sub.Receive(ctx) if err == nil { t.Error("got nil, want error") } // Try an invalid path. _, err = OpenSubscriptionByPath(sc, "my-subscription", nil) if err == nil { t.Error("got nil, want error") } } func TestOpenTopicFromURL(t *testing.T) { cleanup := setup.FakeGCPDefaultCredentials(t) defer cleanup() tests := []struct { URL string WantErr bool }{ // OK, short form. {"gcppubsub://myproject/mytopic", false}, // OK, long form. {"gcppubsub://projects/myproject/topic/mytopic", false}, // Invalid parameter. {"gcppubsub://myproject/mytopic?param=value", true}, // Valid max_send_batch_size {"gcppubsub://projects/mytopic?max_send_batch_size=1", false}, // Invalid max_send_batch_size {"gcppubsub://projects/mytopic?max_send_batch_size=0", true}, // Invalid max_send_batch_size {"gcppubsub://projects/mytopic?max_send_batch_size=1001", true}, } ctx := context.Background() for _, test := range tests { topic, err := pubsub.OpenTopic(ctx, test.URL) if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } if topic != nil { topic.Shutdown(ctx) } } } func TestOpenSubscriptionFromURL(t *testing.T) { cleanup := setup.FakeGCPDefaultCredentials(t) defer cleanup() tests := []struct { URL string WantErr bool }{ // OK, short form. {"gcppubsub://myproject/mysub", false}, // OK, long form. {"gcppubsub://projects/myproject/subscriptions/mysub", false}, // Invalid parameter. {"gcppubsub://myproject/mysub?param=value", true}, // Valid max_recv_batch_size {"gcppubsub://projects/myproject/subscriptions/mysub?max_recv_batch_size=1", false}, // Invalid max_recv_batch_size {"gcppubsub://projects/myproject/subscriptions/mysub?max_recv_batch_size=0", true}, // Invalid max_recv_batch_size {"gcppubsub://projects/myproject/subscriptions/mysub?max_recv_batch_size=1001", true}, // Valid nacklazy {"gcppubsub://projects/myproject/subscriptions/mysub?nacklazy=true", false}, // Invalid nacklazy {"gcppubsub://projects/myproject/subscriptions/mysub?nacklazy=foo", true}, } ctx := context.Background() for _, test := range tests { sub, err := pubsub.OpenSubscription(ctx, test.URL) if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } if sub != nil { sub.Shutdown(ctx) } } } ================================================ FILE: pubsub/gcppubsubv2/example_test.go ================================================ // Copyright 2025 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcppubsubv2_test import ( "context" "log" "gocloud.dev/gcp" "gocloud.dev/pubsub" "gocloud.dev/pubsub/gcppubsubv2" ) func ExampleOpenTopic() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // Your GCP credentials. // See https://cloud.google.com/docs/authentication/production // for more info on alternatives. creds, err := gcp.DefaultCredentials(ctx) if err != nil { log.Fatal(err) } // Open a gRPC connection to the GCP Pub/Sub API. // Alternatively, skip this and pass nil to Client below to use the default. conn, cleanup, err := gcppubsubv2.Dial(ctx, creds.TokenSource) if err != nil { log.Fatal(err) } defer cleanup() // Construct a Client using the connection. client, err := gcppubsubv2.Client(ctx, "myprojectid", conn) if err != nil { log.Fatal(err) } defer client.Close() // Construct a *pubsub.Topic. topic := gcppubsubv2.OpenTopic(client, "example-topic", nil) defer topic.Shutdown(ctx) } func Example_openTopicFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/pubsub/gcppubsubv2" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() topic, err := pubsub.OpenTopic(ctx, "gcppubsubv2://projects/myproject/topics/mytopic") if err != nil { log.Fatal(err) } defer topic.Shutdown(ctx) } func ExampleOpenSubscription() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // Your GCP credentials. // See https://cloud.google.com/docs/authentication/production // for more info on alternatives. creds, err := gcp.DefaultCredentials(ctx) if err != nil { log.Fatal(err) } // Open a gRPC connection to the GCP Pub/Sub API. // Alternatively, skip this and pass nil to Client below to use the default. conn, cleanup, err := gcppubsubv2.Dial(ctx, creds.TokenSource) if err != nil { log.Fatal(err) } defer cleanup() // Construct a Client using the connection. client, err := gcppubsubv2.Client(ctx, "myprojectID", conn) if err != nil { log.Fatal(err) } defer client.Close() // Construct a *pubsub.Subscription. subscription := gcppubsubv2.OpenSubscription(client, "example-subscription", nil) defer subscription.Shutdown(ctx) } func Example_openSubscriptionFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/pubsub/gcppubsubv2" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() subscription, err := pubsub.OpenSubscription(ctx, "gcppubsubv2://projects/my-project/subscriptions/my-subscription") if err != nil { log.Fatal(err) } defer subscription.Shutdown(ctx) } ================================================ FILE: pubsub/gcppubsubv2/gcppubsub.go ================================================ // Copyright 2025 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package gcppubsub provides a pubsub implementation that uses GCP // PubSub. Use OpenTopic to construct a *pubsub.Topic, and/or OpenSubscription // to construct a *pubsub.Subscription. // // # URLs // // For pubsub.OpenTopic and pubsub.OpenSubscription, gcppubsubv2 registers // for the scheme "gcppubsubv2". // The default URL opener will creating a connection using use default // credentials from the environment, as described in // https://cloud.google.com/docs/authentication/production. // To customize the URL opener, or for more details on the URL format, // see URLOpener. // See https://gocloud.dev/concepts/urls/ for background information. // // GCP Pub/Sub emulator is supported as per https://cloud.google.com/pubsub/docs/emulator // So, when environment variable 'PUBSUB_EMULATOR_HOST' is set // driver connects to the specified emulator host by default. // // # Message Delivery Semantics // // GCP Pub/Sub supports at-least-once semantics; applications must // call Message.Ack after processing a message, or it will be redelivered. // See https://godoc.org/gocloud.dev/pubsub#hdr-At_most_once_and_At_least_once_Delivery // for more background. // // # As // // gcppubsubv2 exposes the following types for As: // - Topic: *raw.Publisher // - Subscription: *raw.Subscriber // - Message.BeforeSend: *raw.Message // - Message.AfterSend: *string for the raw.PublishResult serverID corresponding to the message. // - Message: *raw.Message // - Error: *google.golang.org/grpc/status.Status package gcppubsubv2 // import "gocloud.dev/pubsub/gcppubsubv2" import ( "context" "errors" "fmt" "net/url" "os" "path" "regexp" "strconv" "strings" "sync" "time" raw "cloud.google.com/go/pubsub/v2" "github.com/google/wire" "gocloud.dev/gcerrors" "gocloud.dev/gcp" "gocloud.dev/internal/gcerr" "gocloud.dev/internal/useragent" "gocloud.dev/pubsub" "gocloud.dev/pubsub/batcher" "gocloud.dev/pubsub/driver" "google.golang.org/api/option" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/credentials/oauth" "google.golang.org/grpc/status" ) var endPoint = "pubsub.googleapis.com:443" var sendBatcherOpts = &batcher.Options{ // The underlying library does its own batching, so for throughput // what we pick here doesn't matter much. It's simpler and more // likely to elicit good behavior from the underlying library to // do one message at a time. It also results in clearer errors, // at least back to the concrete type, because returning an error // from SendBatch when some messages were sent and others weren't // is always a bit unfortunate. MaxBatchSize: 1, MaxHandlers: 1000, } var defaultRecvBatcherOpts = &batcher.Options{ // Single threaded; v2 wants only a single Receive. We get concurrency // via concurrent callbacks; the resulting messages are buffered // in memory until they can be returned via ReceiveBatch. When that // happens, we might as well return a lot of them. MaxBatchSize: 5000, MaxHandlers: 1, } var ackBatcherOpts = &batcher.Options{ // Similar to SendBatch. MaxBatchSize: 1, MaxHandlers: 1000, } func init() { o := new(lazyCredsOpener) pubsub.DefaultURLMux().RegisterTopic(Scheme, o) pubsub.DefaultURLMux().RegisterSubscription(Scheme, o) } // Set holds Wire providers for this package. var Set = wire.NewSet( Dial, Client, wire.Struct(new(SubscriptionOptions)), wire.Struct(new(TopicOptions)), wire.Struct(new(URLOpener), "Conn", "TopicOptions", "SubscriptionOptions"), ) // lazyCredsOpener obtains Application Default Credentials on the first call // to OpenTopicURL/OpenSubscriptionURL. type lazyCredsOpener struct { init sync.Once opener *URLOpener err error } func (o *lazyCredsOpener) defaultConn(ctx context.Context) (*URLOpener, error) { o.init.Do(func() { var conn *grpc.ClientConn var err error if e := os.Getenv("PUBSUB_EMULATOR_HOST"); e != "" { // Connect to the GCP pubsub emulator by overriding the default endpoint // if the 'PUBSUB_EMULATOR_HOST' environment variable is set. // Check https://cloud.google.com/pubsub/docs/emulator for more info. endPoint = e conn, err = dialEmulator(ctx, e) if err != nil { o.err = err return } } else { creds, err := gcp.DefaultCredentials(ctx) if err != nil { o.err = err return } conn, _, err = Dial(ctx, creds.TokenSource) if err != nil { o.err = err return } } o.opener = &URLOpener{Conn: conn} }) return o.opener, o.err } func (o *lazyCredsOpener) OpenTopicURL(ctx context.Context, u *url.URL) (*pubsub.Topic, error) { opener, err := o.defaultConn(ctx) if err != nil { return nil, fmt.Errorf("open topic %v: failed to open default connection: %v", u, err) } return opener.OpenTopicURL(ctx, u) } func (o *lazyCredsOpener) OpenSubscriptionURL(ctx context.Context, u *url.URL) (*pubsub.Subscription, error) { opener, err := o.defaultConn(ctx) if err != nil { return nil, fmt.Errorf("open subscription %v: failed to open default connection: %v", u, err) } return opener.OpenSubscriptionURL(ctx, u) } // Scheme is the URL scheme gcppubsubv2 registers its URLOpeners under on pubsub.DefaultMux. const Scheme = "gcppubsubv2" // URLOpener opens GCP Pub/Sub URLs like "gcppubsubv2://projects/myproject/topics/mytopic" for // topics or "gcppubsubv2://projects/myproject/subscriptions/mysub" for subscriptions. // // The shortened forms "gcppubsubv2://myproject/mytopic" for topics or // "gcppubsubv2://myproject/mysub" for subscriptions are also supported. // // The following query parameters are supported: // // - max_recv_batch_size: sets SubscriptionOptions.MaxBatchSize. // - max_send_batch_size: sets TopicOptions.BatcherOptions.MaxBatchSize. // // Currently their use is limited to subscribers. type URLOpener struct { // Conn must be set to a non-nil ClientConn authenticated with // Cloud Pub/Sub scope or equivalent. Conn *grpc.ClientConn // TopicOptions specifies the options to pass to OpenTopic. TopicOptions TopicOptions // SubscriptionOptions specifies the options to pass to OpenSubscription. SubscriptionOptions SubscriptionOptions } // OpenTopicURL opens a pubsub.Topic based on u. func (o *URLOpener) OpenTopicURL(ctx context.Context, u *url.URL) (*pubsub.Topic, error) { opts := o.TopicOptions for param, value := range u.Query() { switch param { case "max_send_batch_size": maxBatchSize, err := queryParameterInt(value) if err != nil { return nil, fmt.Errorf("open topic %v: invalid query parameter %q: %v", u, param, err) } if maxBatchSize <= 0 || maxBatchSize > 1000 { return nil, fmt.Errorf("open topic %v: invalid query parameter %q: must be between 1 and 1000", u, param) } opts.BatcherOptions.MaxBatchSize = maxBatchSize default: return nil, fmt.Errorf("open topic %v: invalid query parameter %q", u, param) } } client, err := Client(ctx, gcp.ProjectID(u.Host), o.Conn) if err != nil { return nil, err } topicPath := path.Join(u.Host, u.Path) if topicPathRE.MatchString(topicPath) { return OpenTopicByPath(client, topicPath, &opts) } // Shortened form? topicName := strings.TrimPrefix(u.Path, "/") return OpenTopic(client, topicName, &opts), nil } // OpenSubscriptionURL opens a pubsub.Subscription based on u. func (o *URLOpener) OpenSubscriptionURL(ctx context.Context, u *url.URL) (*pubsub.Subscription, error) { // Set subscription options to use defaults opts := o.SubscriptionOptions for param, value := range u.Query() { switch param { case "max_recv_batch_size": maxBatchSize, err := queryParameterInt(value) if err != nil { return nil, fmt.Errorf("open subscription %v: invalid query parameter %q: %v", u, param, err) } if maxBatchSize <= 0 || maxBatchSize > 1000 { return nil, fmt.Errorf("open subscription %v: invalid query parameter %q: must be between 1 and 1000", u, param) } opts.MaxBatchSize = maxBatchSize default: return nil, fmt.Errorf("open subscription %v: invalid query parameter %q", u, param) } } client, err := Client(ctx, gcp.ProjectID(u.Host), o.Conn) if err != nil { return nil, err } subPath := path.Join(u.Host, u.Path) if subscriptionPathRE.MatchString(subPath) { return OpenSubscriptionByPath(client, subPath, &opts) } // Shortened form? subName := strings.TrimPrefix(u.Path, "/") return OpenSubscription(client, subName, &opts), nil } type topic struct { publisher *raw.Publisher } // Dial opens a gRPC connection to the GCP Pub Sub API. // // The second return value is a function that can be called to clean up // the connection opened by Dial. func Dial(ctx context.Context, ts gcp.TokenSource) (*grpc.ClientConn, func(), error) { conn, err := grpc.DialContext(ctx, endPoint, grpc.WithTransportCredentials(credentials.NewClientTLSFromCert(nil, "")), grpc.WithPerRPCCredentials(oauth.TokenSource{TokenSource: ts}), // The default message size limit for gRPC is 4MB, while GCP // PubSub supports messages up to 10MB. Aside from the message itself // there is also other data in the gRPC response, bringing the maximum // response size above 10MB. Tell gRPC to support up to 11MB. // https://github.com/googleapis/google-cloud-node/issues/1991 grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(1024*1024*11)), useragent.GRPCDialOption("pubsub"), ) if err != nil { return nil, nil, err } return conn, func() { conn.Close() }, nil } // dialEmulator opens a gRPC connection to the GCP Pub Sub API. func dialEmulator(ctx context.Context, e string) (*grpc.ClientConn, error) { conn, err := grpc.DialContext(ctx, e, grpc.WithTransportCredentials(insecure.NewCredentials()), useragent.GRPCDialOption("pubsub")) if err != nil { return nil, err } return conn, nil } // Client returns a *raw.Client that can be used in OpenTopic and/or OpenSubscription. // conn is optional. func Client(ctx context.Context, projectID gcp.ProjectID, conn *grpc.ClientConn) (*raw.Client, error) { if conn == nil { return raw.NewClient(ctx, string(projectID)) } return raw.NewClient(ctx, string(projectID), option.WithGRPCConn(conn)) } // TopicOptions will contain configuration for topics. type TopicOptions struct { // BatcherOptions adds constraints to the default batching done for sends. BatcherOptions batcher.Options } // OpenTopic returns a *pubsub.Topic backed by an existing GCP PubSub topic // topicName is the last part of the full topic path, e.g., "foo" from "projects//topic/foo". // See the package documentation for an example. func OpenTopic(client *raw.Client, topicName string, opts *TopicOptions) *pubsub.Topic { publisher := client.Publisher(topicName) if opts == nil { opts = &TopicOptions{} } bo := sendBatcherOpts.NewMergedOptions(&opts.BatcherOptions) return pubsub.NewTopic(openTopic(publisher), bo) } var topicPathRE = regexp.MustCompile("^projects/.+/topics/(.+)$") // OpenTopicByPath returns a *pubsub.Topic backed by an existing GCP PubSub // topic. topicPath must be of the form "projects//topic/". // See the package documentation for an example. func OpenTopicByPath(client *raw.Client, topicPath string, opts *TopicOptions) (*pubsub.Topic, error) { matches := topicPathRE.FindStringSubmatch(topicPath) if len(matches) != 2 { return nil, fmt.Errorf("invalid topicPath %q; must match %v", topicPath, topicPathRE) } topicName := matches[1] return OpenTopic(client, topicName, opts), nil } // openTopic returns the driver for OpenTopic. This function exists so the test // harness can get the driver interface implementation if it needs to. func openTopic(publisher *raw.Publisher) driver.Topic { return &topic{publisher} } // SendBatch implements driver.Topic.SendBatch. func (t *topic) SendBatch(ctx context.Context, dms []*driver.Message) error { var results []*raw.PublishResult for _, dm := range dms { psm := &raw.Message{Data: dm.Body, Attributes: dm.Metadata} if dm.BeforeSend != nil { asFunc := func(i any) bool { if p, ok := i.(**raw.Message); ok { *p = psm return true } return false } if err := dm.BeforeSend(asFunc); err != nil { return err } } // Publish always returns immediately; the return value's Get // function blocks until there's a result. results = append(results, t.publisher.Publish(ctx, psm)) } for n, dm := range dms { pr := results[n] messageID, err := pr.Get(ctx) if err != nil { return err } if dm.AfterSend != nil { asFunc := func(i any) bool { if p, ok := i.(*string); ok { *p = messageID return true } return false } if err := dm.AfterSend(asFunc); err != nil { return err } } } return nil } // IsRetryable implements driver.Topic.IsRetryable. func (t *topic) IsRetryable(error) bool { // The client handles retries. return false } // As implements driver.Topic.As. func (t *topic) As(i any) bool { c, ok := i.(**raw.Publisher) if !ok { return false } *c = t.publisher return true } // ErrorAs implements driver.Topic.ErrorAs func (*topic) ErrorAs(err error, i any) bool { return errorAs(err, i) } func errorAs(err error, i any) bool { s, ok := status.FromError(err) if !ok { return false } p, ok := i.(**status.Status) if !ok { return false } *p = s return true } func (*topic) ErrorCode(err error) gcerrors.ErrorCode { return gcerr.GRPCCode(err) } // Close implements driver.Topic.Close. func (*topic) Close() error { return nil } type ackableMsg struct { rawm *raw.Message ch chan bool } type subscription struct { subscriber *raw.Subscriber options *SubscriptionOptions // Fields for managing the single Receive RPC called in the background. receiving bool // true when there's an active RPC receiveCtx context.Context // the single background context used when calling Receive receiveCancel func() // cancel func for receiveCtx; called during Close // Fields used for managing buffered messages. mu sync.Mutex dms []*driver.Message // buffered messages for next ReceiveBatch receiveErr error // error returned by last Receive, to be returned by next ReceiveBatch acks map[driver.AckID]*ackableMsg // returned messages that haven't yet been acked/nacked } // SubscriptionOptions will contain configuration for subscriptions. type SubscriptionOptions struct { // MaxBatchSize caps the maximum batch size used when retrieving messages. It defaults to 1000. MaxBatchSize int // ReceiveBatcherOptions adds constraints to the default batching done for receives. ReceiveBatcherOptions batcher.Options // AckBatcherOptions adds constraints to the default batching done for acks. AckBatcherOptions batcher.Options } // OpenSubscription returns a *pubsub.Subscription backed by an existing GCP // PubSub subscription subscriptionName. See the package documentation for an example. func OpenSubscription(client *raw.Client, subscriptionName string, opts *SubscriptionOptions) *pubsub.Subscription { subscriber := client.Subscriber(subscriptionName) dsub := openSubscription(subscriber, opts) recvOpts := *defaultRecvBatcherOpts recvOpts.MaxBatchSize = dsub.options.MaxBatchSize rbo := recvOpts.NewMergedOptions(&dsub.options.ReceiveBatcherOptions) abo := ackBatcherOpts.NewMergedOptions(&dsub.options.AckBatcherOptions) return pubsub.NewSubscription(dsub, rbo, abo) } var subscriptionPathRE = regexp.MustCompile("^projects/.+/subscriptions/(.+)$") // OpenSubscriptionByPath returns a *pubsub.Subscription backed by an existing // GCP PubSub subscription. subscriptionPath must be of the form // "projects//subscriptions/". // See the package documentation for an example. func OpenSubscriptionByPath(client *raw.Client, subscriptionPath string, opts *SubscriptionOptions) (*pubsub.Subscription, error) { matches := subscriptionPathRE.FindStringSubmatch(subscriptionPath) if len(matches) != 2 { return nil, fmt.Errorf("invalid subscriptionPath %q; must match %v", subscriptionPath, subscriptionPathRE) } subscriptionName := matches[1] return OpenSubscription(client, subscriptionName, opts), nil } // openSubscription returns a driver.Subscription. func openSubscription(subscriber *raw.Subscriber, opts *SubscriptionOptions) *subscription { if opts == nil { opts = &SubscriptionOptions{} } if opts.MaxBatchSize == 0 { opts.MaxBatchSize = defaultRecvBatcherOpts.MaxBatchSize } // Construct a context that's used (repeatedly if necessary) to call Receive. // It never expires; the Receive may last forever. // The cancel function is used during shutdown. ctx, cancel := context.WithCancel(context.Background()) return &subscription{ subscriber: subscriber, options: opts, receiving: false, receiveCtx: ctx, receiveCancel: cancel, acks: map[driver.AckID]*ackableMsg{}, } } // ReceiveBatch implements driver.Subscription.ReceiveBatch. func (s *subscription) ReceiveBatch(ctx context.Context, maxMessages int) ([]*driver.Message, error) { s.mu.Lock() defer s.mu.Unlock() if !s.receiving { // Start up the goroutine that calls Receive. s.receiving = true go func() { // Receive blocks until receiveCtx ends, which will only happen during shutdown, // or if there's a fatal error. // During normal use, this goroutine will sit here in Receive, // the underlying library will call the callback as messages arrive, // the callback implementation will add them to s.dms, and // ReceiveBatch will pull them off. // // The underlying library *requires* that Ack or Nack be called inside the // callback. Therefore, after adding the message to s.dms, the callback // (which is running in its own goroutine from the underlying library) // creates a channel and waits on it; Ack/Nack will write true/false to that // channel, allowing the callback to finally return. err := s.subscriber.Receive(s.receiveCtx, func(ctx context.Context, rawm *raw.Message) { dm := &driver.Message{ LoggableID: rawm.ID, Body: rawm.Data, Metadata: rawm.Attributes, AckID: driver.AckID(rawm.ID), AsFunc: func(i any) bool { rm, ok := i.(**raw.Message) if ok { *rm = rawm return true } return false }, } // As described above, ackCh will be used to wait here until // Ack or Nack is called. ackCh := make(chan bool) s.mu.Lock() s.acks[rawm.ID] = &ackableMsg{rawm, ackCh} s.dms = append(s.dms, dm) s.mu.Unlock() isAck := <-ackCh if isAck { rawm.Ack() } else { rawm.Nack() } }) // Receive returned. Either we're shutting down, or there's a permanent error. // Either way, reset so that if ReceiveBatch is called again, we'll retry. s.mu.Lock() if !errors.Is(err, context.Canceled) { s.receiveErr = err } s.receiving = false s.mu.Unlock() }() } // Return up to maxMessages from the buffer. var dms []*driver.Message if err := s.receiveErr; err != nil { s.receiveErr = nil return nil, err } if len(s.dms) <= maxMessages { dms = s.dms s.dms = nil } else { dms = s.dms[0:maxMessages] s.dms = s.dms[maxMessages:] } if len(dms) == 0 { time.Sleep(100 * time.Millisecond) return nil, nil } return dms, nil } // SendAcks implements driver.Subscription.SendAcks. func (s *subscription) SendAcks(ctx context.Context, ids []driver.AckID) error { s.mu.Lock() defer s.mu.Unlock() for _, id := range ids { if ackable := s.acks[id]; ackable != nil { ackable.ch <- true close(ackable.ch) delete(s.acks, id) } } return nil } // CanNack implements driver.CanNack. func (s *subscription) CanNack() bool { return true } // SendNacks implements driver.Subscription.SendNacks. func (s *subscription) SendNacks(ctx context.Context, ids []driver.AckID) error { s.mu.Lock() defer s.mu.Unlock() for _, id := range ids { if ackable := s.acks[id]; ackable != nil { ackable.ch <- false close(ackable.ch) delete(s.acks, id) } } return nil } // IsRetryable implements driver.Subscription.IsRetryable. func (s *subscription) IsRetryable(err error) bool { // The client mostly handles retries, but does not // include DeadlineExceeded for some reason. return s.ErrorCode(err) == gcerrors.DeadlineExceeded } // As implements driver.Subscription.As. func (s *subscription) As(i any) bool { c, ok := i.(**raw.Subscriber) if !ok { return false } *c = s.subscriber return true } // ErrorAs implements driver.Subscription.ErrorAs func (*subscription) ErrorAs(err error, i any) bool { return errorAs(err, i) } func (*subscription) ErrorCode(err error) gcerrors.ErrorCode { return gcerr.GRPCCode(err) } // Close implements driver.Subscription.Close. func (s *subscription) Close() error { s.receiveCancel() return nil } func queryParameterInt(value []string) (int, error) { if len(value) > 1 { return 0, fmt.Errorf("expected only one parameter value, got: %v", len(value)) } return strconv.Atoi(value[0]) } ================================================ FILE: pubsub/gcppubsubv2/gcppubsub_test.go ================================================ // Copyright 2025 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcppubsubv2 import ( "context" "fmt" "path" "strings" "sync/atomic" "testing" raw "cloud.google.com/go/pubsub/v2" "cloud.google.com/go/pubsub/v2/apiv1/pubsubpb" "gocloud.dev/gcp" "gocloud.dev/internal/testing/setup" "gocloud.dev/pubsub" "gocloud.dev/pubsub/driver" "gocloud.dev/pubsub/drivertest" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) // projectID is the project ID that was used during the last test run using // --record. const projectID = "go-cloud-test-216917" type harness struct { closer func() client *raw.Client numTopics uint32 // atomic numSubs uint32 // atomic } func newHarness(ctx context.Context, t *testing.T) (drivertest.Harness, error) { t.Helper() client, err := Client(ctx, projectID, nil) if err != nil { return nil, fmt.Errorf("making client: %v", err) } return &harness{closer: func() {}, client: client, numTopics: 0, numSubs: 0}, nil } func (h *harness) CreateTopic(ctx context.Context, testName string) (dt driver.Topic, cleanup func(), err error) { topicName := fmt.Sprintf("%s-topic-%d", sanitize(testName), atomic.AddUint32(&h.numTopics, 1)) return createTopic(ctx, h.client, topicName) } func topicPath(topicName string) string { return fmt.Sprintf("projects/%s/topics/%s", projectID, topicName) } func subscriptionPath(subName string) string { return fmt.Sprintf("projects/%s/subscriptions/%s", projectID, subName) } func createTopic(ctx context.Context, client *raw.Client, topicName string) (dt driver.Topic, cleanup func(), err error) { _, err = client.TopicAdminClient.CreateTopic(ctx, &pubsubpb.Topic{Name: topicPath(topicName)}) // We may encounter topics that were created by a previous test run and were // not properly cleaned up. In such a case delete the existing topic and create // a new topic with a higher topic number (to avoid cool-off issues between // deletion and re-creation). if err != nil && status.Code(err) == codes.AlreadyExists { deleteTopic(ctx, client, topicName) return createTopic(ctx, client, topicName) } if err != nil { return nil, nil, fmt.Errorf("failed to create topic: %w", err) } dt = openTopic(client.Publisher(topicName)) cleanup = func() { deleteTopic(ctx, client, topicName) } return dt, cleanup, nil } func deleteTopic(ctx context.Context, client *raw.Client, topicName string) { _ = client.TopicAdminClient.DeleteTopic(ctx, &pubsubpb.DeleteTopicRequest{ Topic: topicPath(topicName), }) } func (h *harness) MakeNonexistentTopic(ctx context.Context) (driver.Topic, error) { return openTopic(h.client.Publisher("nonexistent-topic")), nil } func (h *harness) CreateSubscription(ctx context.Context, dt driver.Topic, testName string) (ds driver.Subscription, cleanup func(), err error) { subName := fmt.Sprintf("%s-subscription-%d", sanitize(testName), atomic.AddUint32(&h.numSubs, 1)) return createSubscription(ctx, h.client, dt, subName) } func createSubscription(ctx context.Context, client *raw.Client, dt driver.Topic, subName string) (ds driver.Subscription, cleanup func(), err error) { t := dt.(*topic) _, err = client.SubscriptionAdminClient.CreateSubscription(ctx, &pubsubpb.Subscription{ Name: subscriptionPath(subName), Topic: t.publisher.String(), }) // We may encounter subscriptions that were created by a previous test run // and were not properly cleaned up. In such a case delete the existing // subscription and create a new subscription with a higher subscription // number (to avoid cool-off issues between deletion and re-creation). if err != nil && status.Code(err) == codes.AlreadyExists { deleteSubscription(ctx, client, subName) return createSubscription(ctx, client, dt, subName) } if err != nil { return nil, nil, fmt.Errorf("failed to create subscription: %w", err) } ds = openSubscription(client.Subscriber(subName), nil) cleanup = func() { deleteSubscription(ctx, client, subName) } return ds, cleanup, nil } func deleteSubscription(ctx context.Context, client *raw.Client, subName string) { _ = client.SubscriptionAdminClient.DeleteSubscription(ctx, &pubsubpb.DeleteSubscriptionRequest{ Subscription: subscriptionPath(subName)}, ) } func (h *harness) MakeNonexistentSubscription(ctx context.Context) (driver.Subscription, func(), error) { return openSubscription(h.client.Subscriber("nonexistent-subscription"), nil), func() {}, nil } func (h *harness) Close() { h.client.Close() h.closer() } func (h *harness) MaxBatchSizes() (int, int) { return sendBatcherOpts.MaxBatchSize, ackBatcherOpts.MaxBatchSize } func (*harness) SupportsMultipleSubscriptions() bool { return true } func TestConformance(t *testing.T) { if !*setup.Record { t.Skip("replaying is not supported for gcppubsubv2 because it uses a streaming RPC internally") } asTests := []drivertest.AsTest{gcpAsTest{}} drivertest.RunConformanceTests(t, newHarness, asTests) } func BenchmarkGcpPubSub(b *testing.B) { ctx := context.Background() creds, err := gcp.DefaultCredentials(ctx) if err != nil { b.Fatal(err) } // Connect. conn, cleanup, err := Dial(ctx, gcp.CredentialsTokenSource(creds)) if err != nil { b.Fatal(err) } defer cleanup() // Make topic. client, err := Client(ctx, projectID, conn) if err != nil { b.Fatal(err) } topicName := fmt.Sprintf("%s-topic", b.Name()) dt, cleanup1, err := createTopic(ctx, client, topicName) if err != nil { b.Fatal(err) } defer cleanup1() topic := pubsub.NewTopic(dt, nil) defer topic.Shutdown(ctx) // Make subscription. subName := fmt.Sprintf("%s-subscription", b.Name()) ds, cleanup2, err := createSubscription(ctx, client, dt, subName) if err != nil { b.Fatal(err) } defer cleanup2() sub := pubsub.NewSubscription(ds, defaultRecvBatcherOpts, ackBatcherOpts) defer sub.Shutdown(ctx) drivertest.RunBenchmarks(b, topic, sub) } type gcpAsTest struct{} func (gcpAsTest) Name() string { return "gcp test" } func (gcpAsTest) TopicCheck(topic *pubsub.Topic) error { var c2 raw.Publisher if topic.As(&c2) { return fmt.Errorf("cast succeeded for %T, want failure", &c2) } var c3 *raw.Publisher if !topic.As(&c3) { return fmt.Errorf("cast failed for %T", &c3) } return nil } func (gcpAsTest) SubscriptionCheck(sub *pubsub.Subscription) error { var c2 raw.Subscriber if sub.As(&c2) { return fmt.Errorf("cast succeeded for %T, want failure", &c2) } var c3 *raw.Subscriber if !sub.As(&c3) { return fmt.Errorf("cast failed for %T", &c3) } return nil } func (gcpAsTest) TopicErrorCheck(t *pubsub.Topic, err error) error { var s *status.Status if !t.ErrorAs(err, &s) { return fmt.Errorf("failed to convert %v (%T) to a gRPC Status", err, err) } if s.Code() != codes.NotFound { return fmt.Errorf("got code %s, want NotFound", s.Code()) } return nil } func (gcpAsTest) SubscriptionErrorCheck(sub *pubsub.Subscription, err error) error { var s *status.Status if !sub.ErrorAs(err, &s) { return fmt.Errorf("failed to convert %v (%T) to a gRPC Status", err, err) } if s.Code() != codes.NotFound { return fmt.Errorf("got code %s, want NotFound", s.Code()) } return nil } func (gcpAsTest) MessageCheck(m *pubsub.Message) error { var rm raw.Message if m.As(&rm) { return fmt.Errorf("cast succeeded for %T, want failure", &rm) } var prm *raw.Message if !m.As(&prm) { return fmt.Errorf("cast failed for %T", &prm) } return nil } func (gcpAsTest) BeforeSend(as func(any) bool) error { var prm *raw.Message if !as(&prm) { return fmt.Errorf("cast failed for %T", &prm) } return nil } func (gcpAsTest) AfterSend(as func(any) bool) error { var msgId string if !as(&msgId) { return fmt.Errorf("cast failed for %T", &msgId) } return nil } func sanitize(testName string) string { return strings.Replace(testName, "/", "_", -1) } func TestOpenTopic(t *testing.T) { ctx := context.Background() creds, err := setup.FakeGCPCredentials(ctx) if err != nil { t.Fatal(err) } projID, err := gcp.DefaultProjectID(creds) if err != nil { t.Fatal(err) } conn, cleanup, err := Dial(ctx, gcp.CredentialsTokenSource(creds)) if err != nil { t.Fatal(err) } defer cleanup() client, err := Client(ctx, projID, conn) if err != nil { t.Fatal(err) } topic := OpenTopic(client, "my-topic", nil) defer topic.Shutdown(ctx) err = topic.Send(ctx, &pubsub.Message{Body: []byte("hello world")}) if err == nil { t.Error("got nil, want error") } // Repeat with OpenTopicByPath. topic, err = OpenTopicByPath(client, path.Join("projects", string(projID), "topics", "my-topic"), nil) if err != nil { t.Fatal(err) } defer topic.Shutdown(ctx) err = topic.Send(ctx, &pubsub.Message{Body: []byte("hello world")}) if err == nil { t.Error("got nil, want error") } // Try an invalid path. _, err = OpenTopicByPath(client, "my-topic", nil) if err == nil { t.Error("got nil, want error") } } func TestOpenSubscription(t *testing.T) { ctx := context.Background() creds, err := setup.FakeGCPCredentials(ctx) if err != nil { t.Fatal(err) } projID, err := gcp.DefaultProjectID(creds) if err != nil { t.Fatal(err) } conn, cleanup, err := Dial(ctx, gcp.CredentialsTokenSource(creds)) if err != nil { t.Fatal(err) } defer cleanup() client, err := Client(ctx, projID, conn) if err != nil { t.Fatal(err) } sub := OpenSubscription(client, "my-subscription", nil) defer sub.Shutdown(ctx) _, err = sub.Receive(ctx) if err == nil { t.Error("got nil, want error") } // Repeat with OpenSubscriptionByPath. sub, err = OpenSubscriptionByPath(client, path.Join("projects", string(projID), "subscriptions", "my-subscription"), nil) if err != nil { t.Fatal(err) } defer sub.Shutdown(ctx) _, err = sub.Receive(ctx) if err == nil { t.Error("got nil, want error") } // Try an invalid path. _, err = OpenSubscriptionByPath(client, "my-subscription", nil) if err == nil { t.Error("got nil, want error") } } func TestOpenTopicFromURL(t *testing.T) { cleanup := setup.FakeGCPDefaultCredentials(t) defer cleanup() tests := []struct { URL string WantErr bool }{ // OK, short form. {"gcppubsubv2://myproject/mytopic", false}, // OK, long form. {"gcppubsubv2://projects/myproject/topic/mytopic", false}, // Invalid parameter. {"gcppubsubv2://myproject/mytopic?param=value", true}, // Valid max_send_batch_size {"gcppubsubv2://projects/mytopic?max_send_batch_size=1", false}, // Invalid max_send_batch_size {"gcppubsubv2://projects/mytopic?max_send_batch_size=0", true}, // Invalid max_send_batch_size {"gcppubsubv2://projects/mytopic?max_send_batch_size=1001", true}, } ctx := context.Background() for _, test := range tests { topic, err := pubsub.OpenTopic(ctx, test.URL) if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } if topic != nil { topic.Shutdown(ctx) } } } func TestOpenSubscriptionFromURL(t *testing.T) { cleanup := setup.FakeGCPDefaultCredentials(t) defer cleanup() tests := []struct { URL string WantErr bool }{ // OK, short form. {"gcppubsubv2://myproject/mysub", false}, // OK, long form. {"gcppubsubv2://projects/myproject/subscriptions/mysub", false}, // Invalid parameter. {"gcppubsubv2://myproject/mysub?param=value", true}, // Valid max_recv_batch_size {"gcppubsubv2://projects/myproject/subscriptions/mysub?max_recv_batch_size=1", false}, // Invalid max_recv_batch_size {"gcppubsubv2://projects/myproject/subscriptions/mysub?max_recv_batch_size=0", true}, // Invalid max_recv_batch_size {"gcppubsubv2://projects/myproject/subscriptions/mysub?max_recv_batch_size=1001", true}, } ctx := context.Background() for _, test := range tests { sub, err := pubsub.OpenSubscription(ctx, test.URL) if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } if sub != nil { sub.Shutdown(ctx) } } } ================================================ FILE: pubsub/kafkapubsub/example_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package kafkapubsub_test import ( "context" "log" "gocloud.dev/pubsub" "gocloud.dev/pubsub/kafkapubsub" ) func ExampleOpenTopic() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // The set of brokers in the Kafka cluster. addrs := []string{"1.2.3.4:9092"} // The Kafka client configuration to use. config := kafkapubsub.MinimalConfig() // Construct a *pubsub.Topic. topic, err := kafkapubsub.OpenTopic(addrs, config, "my-topic", nil) if err != nil { log.Fatal(err) } defer topic.Shutdown(ctx) } func ExampleOpenSubscription() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // The set of brokers in the Kafka cluster. addrs := []string{"1.2.3.4:9092"} // The Kafka client configuration to use. config := kafkapubsub.MinimalConfig() // Construct a *pubsub.Subscription, joining the consumer group "my-group" // and receiving messages from "my-topic". subscription, err := kafkapubsub.OpenSubscription( addrs, config, "my-group", []string{"my-topic"}, nil) if err != nil { log.Fatal(err) } defer subscription.Shutdown(ctx) } func Example_openTopicFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/pubsub/kafkapubsub" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // pubsub.OpenTopic creates a *pubsub.Topic from a URL. // The host + path are the topic name to send to. // The set of brokers must be in an environment variable KAFKA_BROKERS. topic, err := pubsub.OpenTopic(ctx, "kafka://my-topic?key_name=x-partition-key") if err != nil { log.Fatal(err) } defer topic.Shutdown(ctx) } func Example_openSubscriptionFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/pubsub/kafkapubsub" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // pubsub.OpenSubscription creates a *pubsub.Subscription from a URL. // The host + path are used as the consumer group name. // The "topic" query parameter sets one or more topics to subscribe to. // The set of brokers must be in an environment variable KAFKA_BROKERS. subscription, err := pubsub.OpenSubscription(ctx, "kafka://my-group?topic=my-topic") if err != nil { log.Fatal(err) } defer subscription.Shutdown(ctx) } ================================================ FILE: pubsub/kafkapubsub/go.mod ================================================ // Copyright 2018-2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. module gocloud.dev/pubsub/kafkapubsub go 1.25.0 require ( github.com/IBM/sarama v1.47.0 github.com/google/go-cmp v0.7.0 gocloud.dev v0.45.0 ) require ( cloud.google.com/go/auth v0.18.2 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect github.com/aws/aws-sdk-go-v2 v1.41.4 // indirect github.com/aws/aws-sdk-go-v2/config v1.32.12 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.19.12 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 // indirect github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 // indirect github.com/aws/smithy-go v1.24.2 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/eapache/go-resiliency v1.7.0 // indirect github.com/eapache/queue v1.1.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/golang/snappy v1.0.0 // indirect github.com/google/go-replayers/grpcreplay v1.3.0 // indirect github.com/google/go-replayers/httpreplay v1.2.0 // indirect github.com/google/martian/v3 v3.3.3 // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/google/uuid v1.6.0 // indirect github.com/google/wire v0.7.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.14 // indirect github.com/googleapis/gax-go/v2 v2.19.0 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect github.com/jcmturner/aescts/v2 v2.0.0 // indirect github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect github.com/jcmturner/gofork v1.7.6 // indirect github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect github.com/jcmturner/rpc/v2 v2.0.3 // indirect github.com/klauspost/compress v1.18.4 // indirect github.com/pierrec/lz4/v4 v4.1.26 // indirect github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 // indirect go.opentelemetry.io/otel v1.42.0 // indirect go.opentelemetry.io/otel/metric v1.42.0 // indirect go.opentelemetry.io/otel/sdk v1.42.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.42.0 // indirect go.opentelemetry.io/otel/trace v1.42.0 // indirect golang.org/x/crypto v0.49.0 // indirect golang.org/x/net v0.52.0 // indirect golang.org/x/oauth2 v0.36.0 // indirect golang.org/x/sync v0.20.0 // indirect golang.org/x/sys v0.42.0 // indirect golang.org/x/text v0.35.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect google.golang.org/api v0.272.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260316180232-0b37fe3546d5 // indirect google.golang.org/grpc v1.79.3 // indirect google.golang.org/protobuf v1.36.11 // indirect ) replace gocloud.dev => ../../ ================================================ FILE: pubsub/kafkapubsub/go.sum ================================================ cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= cloud.google.com/go/auth v0.18.2 h1:+Nbt5Ev0xEqxlNjd6c+yYUeosQ5TtEUaNcN/3FozlaM= cloud.google.com/go/auth v0.18.2/go.mod h1:xD+oY7gcahcu7G2SG2DsBerfFxgPAJz17zz2joOFF3M= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= cloud.google.com/go/monitoring v1.24.3 h1:dde+gMNc0UhPZD1Azu6at2e79bfdztVDS5lvhOdsgaE= cloud.google.com/go/monitoring v1.24.3/go.mod h1:nYP6W0tm3N9H/bOw8am7t62YTzZY+zUeQ+Bi6+2eonI= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/pubsub v1.50.1 h1:fzbXpPyJnSGvWXF1jabhQeXyxdbCIkXTpjXHy7xviBM= cloud.google.com/go/pubsub v1.50.1/go.mod h1:6YVJv3MzWJUVdvQXG081sFvS0dWQOdnV+oTo++q/xFk= cloud.google.com/go/pubsub/v2 v2.4.0 h1:oMKNiBQpXImRWnHYla9uSU66ZzByZwBSCJOEs/pTKVg= cloud.google.com/go/pubsub/v2 v2.4.0/go.mod h1:2lS/XQKq5qtOMs6kHBK+WX1ytUC36kLl2ig3zqsGUx8= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.61.3 h1:VS//ZfBuPGDvakfD9xyPW1RGF1Vy3BWUoVZXgW1KMOg= cloud.google.com/go/storage v1.61.3/go.mod h1:JtqK8BBB7TWv0HVGHubtUdzYYrakOQIsMLffZ2Z/HWk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0 h1:DHa2U07rk8syqvCge0QIGMCE1WxGj9njT44GH7zNJLQ= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 h1:UnDZ/zFfG1JhH/DqxIZYU/1CUAlTUScoXD/LcM2Ykk8= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0/go.mod h1:IA1C1U7jO/ENqm/vhi7V9YYpBsp+IMyqNrEN94N7tVc= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 h1:0s6TxfCu2KHkkZPnBfsQ2y5qia0jl3MMrmBhu3nCOYk= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0/go.mod h1:Mf6O40IAyB9zR/1J8nGDDPirZQQPbYJni8Yisy7NTMc= github.com/IBM/sarama v1.47.0 h1:GcQFEd12+KzfPYeLgN69Fh7vLCtYRhVIx0rO4TZO318= github.com/IBM/sarama v1.47.0/go.mod h1:7gLLIU97nznOmA6TX++Qds+DRxH89P2XICY2KAQUzAY= github.com/aws/aws-sdk-go-v2 v1.41.4 h1:10f50G7WyU02T56ox1wWXq+zTX9I1zxG46HYuG1hH/k= github.com/aws/aws-sdk-go-v2 v1.41.4/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o= github.com/aws/aws-sdk-go-v2/config v1.32.12 h1:O3csC7HUGn2895eNrLytOJQdoL2xyJy0iYXhoZ1OmP0= github.com/aws/aws-sdk-go-v2/config v1.32.12/go.mod h1:96zTvoOFR4FURjI+/5wY1vc1ABceROO4lWgWJuxgy0g= github.com/aws/aws-sdk-go-v2/credentials v1.19.12 h1:oqtA6v+y5fZg//tcTWahyN9PEn5eDU/Wpvc2+kJ4aY8= github.com/aws/aws-sdk-go-v2/credentials v1.19.12/go.mod h1:U3R1RtSHx6NB0DvEQFGyf/0sbrpJrluENHdPy1j/3TE= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 h1:zOgq3uezl5nznfoK3ODuqbhVg1JzAGDUhXOsU0IDCAo= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20/go.mod h1:z/MVwUARehy6GAg/yQ1GO2IMl0k++cu1ohP9zo887wE= github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 h1:CNXO7mvgThFGqOFgbNAP2nol2qAWBOGfqR/7tQlvLmc= github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20/go.mod h1:oydPDJKcfMhgfcgBUZaG+toBbwy8yPWubJXBVERtI4o= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 h1:tN6W/hg+pkM+tf9XDkWUbDEjGLb+raoBMFsTodcoYKw= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20/go.mod h1:YJ898MhD067hSHA6xYCx5ts/jEd8BSOLtQDL3iZsvbc= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 h1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 h1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 h1:2HvVAIq+YqgGotK6EkMf+KIEqTISmTYh5zLpYyeTo1Y= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20/go.mod h1:V4X406Y666khGa8ghKmphma/7C0DAtEQYhkq9z4vpbk= github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 h1:0GFOLzEbOyZABS3PhYfBIx2rNBACYcKty+XGkTgw1ow= github.com/aws/aws-sdk-go-v2/service/signin v1.0.8/go.mod h1:LXypKvk85AROkKhOG6/YEcHFPoX+prKTowKnVdcaIxE= github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 h1:kiIDLZ005EcKomYYITtfsjn7dtOwHDOFy7IbPXKek2o= github.com/aws/aws-sdk-go-v2/service/sso v1.30.13/go.mod h1:2h/xGEowcW/g38g06g3KpRWDlT+OTfxxI0o1KqayAB8= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 h1:jzKAXIlhZhJbnYwHbvUQZEB8KfgAEuG0dc08Bkda7NU= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17/go.mod h1:Al9fFsXjv4KfbzQHGe6V4NZSZQXecFcvaIF4e70FoRA= github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 h1:Cng+OOwCHmFljXIxpEVXAGMnBia8MSU6Ch5i9PgBkcU= github.com/aws/aws-sdk-go-v2/service/sts v1.41.9/go.mod h1:LrlIndBDdjA/EeXeyNBle+gyCwTlizzW5ycgWnvIxkk= github.com/aws/smithy-go v1.24.2 h1:FzA3bu/nt/vDvmnkg+R8Xl46gmzEDam6mZ1hzmwXFng= github.com/aws/smithy-go v1.24.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os8IaYg++6uMOdKK83QtkkvJik= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/eapache/go-resiliency v1.7.0 h1:n3NRTnBn5N0Cbi/IeOHuQn9s2UwVUH7Ga0ZWcP+9JTA= github.com/eapache/go-resiliency v1.7.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= github.com/envoyproxy/go-control-plane/envoy v1.37.0 h1:u3riX6BoYRfF4Dr7dwSOroNfdSbEPe9Yyl09/B6wBrQ= github.com/envoyproxy/go-control-plane/envoy v1.37.0/go.mod h1:DReE9MMrmecPy+YvQOAOHNYMALuowAnbjjEMkkWOi6A= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds= github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/go-replayers/grpcreplay v1.3.0 h1:1Keyy0m1sIpqstQmgz307zhiJ1pV4uIlFds5weTmxbo= github.com/google/go-replayers/grpcreplay v1.3.0/go.mod h1:v6NgKtkijC0d3e3RW8il6Sy5sqRVUwoQa4mHOGEy8DI= github.com/google/go-replayers/httpreplay v1.2.0 h1:VM1wEyyjaoU53BwrOnaf9VhAyQQEEioJvFYxYcLRKzk= github.com/google/go-replayers/httpreplay v1.2.0/go.mod h1:WahEFFZZ7a1P4VM1qEeHy+tME4bwyqPcwWbNlUI1Mcg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/wire v0.7.0 h1:JxUKI6+CVBgCO2WToKy/nQk0sS+amI9z9EjVmdaocj4= github.com/google/wire v0.7.0/go.mod h1:n6YbUQD9cPKTnHXEBN2DXlOp/mVADhVErcMFb0v3J18= github.com/googleapis/enterprise-certificate-proxy v0.3.14 h1:yh8ncqsbUY4shRD5dA6RlzjJaT4hi3kII+zYw8wmLb8= github.com/googleapis/enterprise-certificate-proxy v0.3.14/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.19.0 h1:fYQaUOiGwll0cGj7jmHT/0nPlcrZDFPrZRhTsoCr8hE= github.com/googleapis/gax-go/v2 v2.19.0/go.mod h1:w2ROXVdfGEVFXzmlciUU4EdjHgWvB5h2n6x/8XSTTJA= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg= github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o= github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8= github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.18.4 h1:RPhnKRAQ4Fh8zU2FY/6ZFDwTVTxgJ/EMydqSTzE9a2c= github.com/klauspost/compress v1.18.4/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/pierrec/lz4/v4 v4.1.26 h1:GrpZw1gZttORinvzBdXPUXATeqlJjqUG/D87TKMnhjY= github.com/pierrec/lz4/v4 v4.1.26/go.mod h1:EoQMVJgeeEOMsCqCzqFm2O0cJvljX2nGZjcRIPL34O4= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9 h1:bsUq1dX0N8AOIL7EB/X911+m4EHsnWEHeJ0c+3TTBrg= github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/detectors/gcp v1.42.0 h1:kpt2PEJuOuqYkPcktfJqWWDjTEd/FNgrxcniL7kQrXQ= go.opentelemetry.io/contrib/detectors/gcp v1.42.0/go.mod h1:W9zQ439utxymRrXsUOzZbFX4JhLxXU4+ZnCt8GG7yA8= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0 h1:yI1/OhfEPy7J9eoa6Sj051C7n5dvpj0QX8g4sRchg04= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0/go.mod h1:NoUCKYWK+3ecatC4HjkRktREheMeEtrXoQxrqYFeHSc= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 h1:OyrsyzuttWTSur2qN/Lm0m2a8yqyIjUVBZcxFPuXq2o= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0/go.mod h1:C2NGBr+kAB4bk3xtMXfZ94gqFDtg/GkI7e9zqGh5Beg= go.opentelemetry.io/otel v1.42.0 h1:lSQGzTgVR3+sgJDAU/7/ZMjN9Z+vUip7leaqBKy4sho= go.opentelemetry.io/otel v1.42.0/go.mod h1:lJNsdRMxCUIWuMlVJWzecSMuNjE7dOYyWlqOXWkdqCc= go.opentelemetry.io/otel/metric v1.42.0 h1:2jXG+3oZLNXEPfNmnpxKDeZsFI5o4J+nz6xUlaFdF/4= go.opentelemetry.io/otel/metric v1.42.0/go.mod h1:RlUN/7vTU7Ao/diDkEpQpnz3/92J9ko05BIwxYa2SSI= go.opentelemetry.io/otel/sdk v1.42.0 h1:LyC8+jqk6UJwdrI/8VydAq/hvkFKNHZVIWuslJXYsDo= go.opentelemetry.io/otel/sdk v1.42.0/go.mod h1:rGHCAxd9DAph0joO4W6OPwxjNTYWghRWmkHuGbayMts= go.opentelemetry.io/otel/sdk/metric v1.42.0 h1:D/1QR46Clz6ajyZ3G8SgNlTJKBdGp84q9RKCAZ3YGuA= go.opentelemetry.io/otel/sdk/metric v1.42.0/go.mod h1:Ua6AAlDKdZ7tdvaQKfSmnFTdHx37+J4ba8MwVCYM5hc= go.opentelemetry.io/otel/trace v1.42.0 h1:OUCgIPt+mzOnaUTpOQcBiM/PLQ/Op7oq6g4LenLmOYY= go.opentelemetry.io/otel/trace v1.42.0/go.mod h1:f3K9S+IFqnumBkKhRJMeaZeNk9epyhnCmQh/EysQCdc= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= google.golang.org/api v0.272.0 h1:eLUQZGnAS3OHn31URRf9sAmRk3w2JjMx37d2k8AjJmA= google.golang.org/api v0.272.0/go.mod h1:wKjowi5LNJc5qarNvDCvNQBn3rVK8nSy6jg2SwRwzIA= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20260316180232-0b37fe3546d5 h1:JNfk58HZ8lfmXbYK2vx/UvsqIL59TzByCxPIX4TDmsE= google.golang.org/genproto v0.0.0-20260316180232-0b37fe3546d5/go.mod h1:x5julN69+ED4PcFk/XWayw35O0lf/nGa4aNgODCmNmw= google.golang.org/genproto/googleapis/api v0.0.0-20260316180232-0b37fe3546d5 h1:CogIeEXn4qWYzzQU0QqvYBM8yDF9cFYzDq9ojSpv0Js= google.golang.org/genproto/googleapis/api v0.0.0-20260316180232-0b37fe3546d5/go.mod h1:EIQZ5bFCfRQDV4MhRle7+OgjNtZ6P1PiZBgAKuxXu/Y= google.golang.org/genproto/googleapis/rpc v0.0.0-20260316180232-0b37fe3546d5 h1:aJmi6DVGGIStN9Mobk/tZOOQUBbj0BPjZjjnOdoZKts= google.golang.org/genproto/googleapis/rpc v0.0.0-20260316180232-0b37fe3546d5/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= ================================================ FILE: pubsub/kafkapubsub/kafka.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package kafkapubsub provides an implementation of pubsub for Kafka. // It requires a minimum Kafka version of 0.11.x for Header support. // Some functionality may work with earlier versions of Kafka. // // See https://kafka.apache.org/documentation.html#semantics for a discussion // of message semantics in Kafka. sarama.Config exposes many knobs that // can affect performance and semantics, so review and set them carefully. // // kafkapubsub does not support Message.Nack; Message.Nackable will return // false, and Message.Nack will panic if called. // // # URLs // // For pubsub.OpenTopic and pubsub.OpenSubscription, kafkapubsub registers // for the scheme "kafka". // The default URL opener will connect to a default set of Kafka brokers based // on the environment variable "KAFKA_BROKERS", expected to be a comma-delimited // set of server addresses. // To customize the URL opener, or for more details on the URL format, // see URLOpener. // See https://gocloud.dev/concepts/urls/ for background information. // // # Escaping // // Go CDK supports all UTF-8 strings. No escaping is required for Kafka. // Message metadata is supported through Kafka Headers, which allow arbitrary // []byte for both key and value. These are converted to string for use in // Message.Metadata. // // # As // // kafkapubsub exposes the following types for As: // - Topic: sarama.SyncProducer // - Subscription: sarama.ConsumerGroup, sarama.ConsumerGroupSession (may be nil during session renegotiation, and session may go stale at any time) // - Message: *sarama.ConsumerMessage // - Message.BeforeSend: *sarama.ProducerMessage // - Message.AfterSend: None // - Error: sarama.ConsumerError, sarama.ConsumerErrors, sarama.ProducerError, sarama.ProducerErrors, sarama.ConfigurationError, sarama.PacketDecodingError, sarama.PacketEncodingError, sarama.KError package kafkapubsub // import "gocloud.dev/pubsub/kafkapubsub" import ( "context" "errors" "fmt" "net/url" "os" "path" "reflect" "strings" "sync" "time" "github.com/IBM/sarama" "gocloud.dev/gcerrors" "gocloud.dev/pubsub" "gocloud.dev/pubsub/batcher" "gocloud.dev/pubsub/driver" ) var sendBatcherOpts = &batcher.Options{ MaxBatchSize: 100, MaxHandlers: 100, // max concurrency for sends } var recvBatcherOpts = &batcher.Options{ // Concurrency doesn't make sense here. MaxBatchSize: 1, MaxHandlers: 1, } func init() { opener := new(defaultOpener) pubsub.DefaultURLMux().RegisterTopic(Scheme, opener) pubsub.DefaultURLMux().RegisterSubscription(Scheme, opener) } // defaultOpener create a default opener. type defaultOpener struct { init sync.Once opener *URLOpener err error } func (o *defaultOpener) defaultOpener() (*URLOpener, error) { o.init.Do(func() { brokerList := os.Getenv("KAFKA_BROKERS") if brokerList == "" { o.err = errors.New("KAFKA_BROKERS environment variable not set") return } brokers := strings.Split(brokerList, ",") for i, b := range brokers { brokers[i] = strings.TrimSpace(b) } o.opener = &URLOpener{ Brokers: brokers, Config: MinimalConfig(), } }) return o.opener, o.err } func (o *defaultOpener) OpenTopicURL(ctx context.Context, u *url.URL) (*pubsub.Topic, error) { opener, err := o.defaultOpener() if err != nil { return nil, fmt.Errorf("open topic %v: %v", u, err) } return opener.OpenTopicURL(ctx, u) } func (o *defaultOpener) OpenSubscriptionURL(ctx context.Context, u *url.URL) (*pubsub.Subscription, error) { opener, err := o.defaultOpener() if err != nil { return nil, fmt.Errorf("open subscription %v: %v", u, err) } return opener.OpenSubscriptionURL(ctx, u) } // Scheme is the URL scheme that kafkapubsub registers its URLOpeners under on pubsub.DefaultMux. const Scheme = "kafka" // URLOpener opens Kafka URLs like "kafka://mytopic" for topics and // "kafka://group?topic=mytopic" for subscriptions. // // For topics, the URL's host+path is used as the topic name, // and the "key_name" query parameter is used to extract the routing key // from metadata. // // For subscriptions, the URL's host+path is used as the group name, // and the "topic" query parameter(s) are used as the set of topics to // subscribe to. The "offset" parameter is available to subscribers to set // the Kafka consumer's initial offset. Where "oldest" starts consuming from // the oldest offset of the consumer group and "newest" starts consuming from // the most recent offset on the topic. type URLOpener struct { // Brokers is the slice of brokers in the Kafka cluster. Brokers []string // Config is the Sarama Config. // Config.Producer.Return.Success must be set to true. Config *sarama.Config // TopicOptions specifies the options to pass to OpenTopic. TopicOptions TopicOptions // SubscriptionOptions specifies the options to pass to OpenSubscription. SubscriptionOptions SubscriptionOptions } // OpenTopicURL opens a pubsub.Topic based on u. func (o *URLOpener) OpenTopicURL(ctx context.Context, u *url.URL) (*pubsub.Topic, error) { for param, value := range u.Query() { switch param { case "key_name": if len(value) != 1 || len(value[0]) == 0 { return nil, fmt.Errorf("open topic %v: invalid query parameter %q", u, param) } o.TopicOptions.KeyName = value[0] default: return nil, fmt.Errorf("open topic %v: invalid query parameter %q", u, param) } } topicName := path.Join(u.Host, u.Path) return OpenTopic(o.Brokers, o.Config, topicName, &o.TopicOptions) } // OpenSubscriptionURL opens a pubsub.Subscription based on u. func (o *URLOpener) OpenSubscriptionURL(ctx context.Context, u *url.URL) (*pubsub.Subscription, error) { var topics []string for param, value := range u.Query() { switch param { case "topic": topics = value case "offset": if len(value) == 0 { return nil, fmt.Errorf("open subscription %v: invalid query parameter %q", u, param) } offset := value[0] switch offset { case "oldest": o.Config.Consumer.Offsets.Initial = sarama.OffsetOldest case "newest": o.Config.Consumer.Offsets.Initial = sarama.OffsetNewest default: return nil, fmt.Errorf("open subscription %v: invalid query parameter %q", u, offset) } default: return nil, fmt.Errorf("open subscription %v: invalid query parameter %q", u, param) } } group := path.Join(u.Host, u.Path) return OpenSubscription(o.Brokers, o.Config, group, topics, &o.SubscriptionOptions) } // MinimalConfig returns a minimal sarama.Config. func MinimalConfig() *sarama.Config { config := sarama.NewConfig() config.Version = sarama.V0_11_0_0 // required for Headers config.Producer.Return.Successes = true // required for SyncProducer return config } type topic struct { producer sarama.SyncProducer topicName string opts TopicOptions } // TopicOptions contains configuration options for topics. type TopicOptions struct { // KeyName optionally sets the Message.Metadata key to use as the optional // Kafka message key. If set, and if a matching Message.Metadata key is found, // the value for that key will be used as the message key when sending to // Kafka, instead of being added to the message headers. KeyName string // BatcherOptions adds constraints to the default batching done for sends. BatcherOptions batcher.Options } // OpenTopic creates a pubsub.Topic that sends to a Kafka topic. // // It uses a sarama.SyncProducer to send messages. Producer options can // be configured in the Producer section of the sarama.Config: // https://godoc.org/github.com/IBM/sarama#Config. // // Config.Producer.Return.Success must be set to true. func OpenTopic(brokers []string, config *sarama.Config, topicName string, opts *TopicOptions) (*pubsub.Topic, error) { dt, err := openTopic(brokers, config, topicName, opts) if err != nil { return nil, err } bo := sendBatcherOpts.NewMergedOptions(&dt.opts.BatcherOptions) return pubsub.NewTopic(dt, bo), nil } // openTopic returns the driver for OpenTopic. This function exists so the test // harness can get the driver interface implementation if it needs to. func openTopic(brokers []string, config *sarama.Config, topicName string, opts *TopicOptions) (*topic, error) { if opts == nil { opts = &TopicOptions{} } producer, err := sarama.NewSyncProducer(brokers, config) if err != nil { return nil, err } return &topic{producer: producer, topicName: topicName, opts: *opts}, nil } // SendBatch implements driver.Topic.SendBatch. func (t *topic) SendBatch(ctx context.Context, dms []*driver.Message) error { // Convert the messages to a slice of sarama.ProducerMessage. ms := make([]*sarama.ProducerMessage, 0, len(dms)) for _, dm := range dms { var kafkaKey sarama.Encoder var headers []sarama.RecordHeader for k, v := range dm.Metadata { if k == t.opts.KeyName { // Use this key's value as the Kafka message key instead of adding it // to the headers. kafkaKey = sarama.ByteEncoder(v) } else { headers = append(headers, sarama.RecordHeader{Key: []byte(k), Value: []byte(v)}) } } pm := &sarama.ProducerMessage{ Topic: t.topicName, Key: kafkaKey, Value: sarama.ByteEncoder(dm.Body), Headers: headers, } if dm.BeforeSend != nil { asFunc := func(i any) bool { if p, ok := i.(**sarama.ProducerMessage); ok { *p = pm return true } return false } if err := dm.BeforeSend(asFunc); err != nil { return err } } ms = append(ms, pm) } err := t.producer.SendMessages(ms) if err != nil { return err } for _, dm := range dms { if dm.AfterSend != nil { asFunc := func(i any) bool { return false } if err := dm.AfterSend(asFunc); err != nil { return err } } } return nil } // Close implements io.Closer. func (t *topic) Close() error { return t.producer.Close() } // IsRetryable implements driver.Topic.IsRetryable. func (t *topic) IsRetryable(error) bool { return false } // As implements driver.Topic.As. func (t *topic) As(i any) bool { if p, ok := i.(*sarama.SyncProducer); ok { *p = t.producer return true } return false } // ErrorAs implements driver.Topic.ErrorAs. func (t *topic) ErrorAs(err error, i any) bool { return errorAs(err, i) } // ErrorCode implements driver.Topic.ErrorCode. func (t *topic) ErrorCode(err error) gcerrors.ErrorCode { return errorCode(err) } func errorCode(err error) gcerrors.ErrorCode { if pes, ok := err.(sarama.ProducerErrors); ok && len(pes) == 1 { return errorCode(pes[0]) } if pe, ok := err.(*sarama.ProducerError); ok { return errorCode(pe.Err) } if err == sarama.ErrUnknownTopicOrPartition { return gcerrors.NotFound } return gcerrors.Unknown } type subscription struct { opts SubscriptionOptions closeCh chan struct{} // closed when we've shut down joinCh chan struct{} // closed when we join for the first time cancel func() // cancels the background consumer closeErr error // fatal error detected by the background consumer consumerGroup sarama.ConsumerGroup mu sync.Mutex unacked []*ackInfo sess sarama.ConsumerGroupSession // current session, if any, used for marking offset updates expectedClaims int // # of expected claims for the current session, they should be added via ConsumeClaim claims []sarama.ConsumerGroupClaim // claims in the current session } // ackInfo stores info about a message and whether it has been acked. // It is used as the driver.AckID. type ackInfo struct { msg *sarama.ConsumerMessage acked bool } // SubscriptionOptions contains configuration for subscriptions. type SubscriptionOptions struct { // KeyName optionally sets the Message.Metadata key in which to store the // Kafka message key. If set, and if the Kafka message key is non-empty, // the key value will be stored in Message.Metadata under KeyName. KeyName string // WaitForJoin causes OpenSubscription to wait for up to WaitForJoin // to allow the client to join the consumer group. // Messages sent to the topic before the client joins the group // may not be received by this subscription. // OpenSubscription will succeed even if WaitForJoin elapses and // the subscription still hasn't been joined successfully. WaitForJoin time.Duration } // OpenSubscription creates a pubsub.Subscription that joins group, receiving // messages from topics. // // It uses a sarama.ConsumerGroup to receive messages. Consumer options can // be configured in the Consumer section of the sarama.Config: // https://godoc.org/github.com/IBM/sarama#Config. func OpenSubscription(brokers []string, config *sarama.Config, group string, topics []string, opts *SubscriptionOptions) (*pubsub.Subscription, error) { ds, err := openSubscription(brokers, config, group, topics, opts) if err != nil { return nil, err } return pubsub.NewSubscription(ds, recvBatcherOpts, nil), nil } // openSubscription returns the driver for OpenSubscription. This function // exists so the test harness can get the driver interface implementation if it // needs to. func openSubscription(brokers []string, config *sarama.Config, group string, topics []string, opts *SubscriptionOptions) (driver.Subscription, error) { if opts == nil { opts = &SubscriptionOptions{} } consumerGroup, err := sarama.NewConsumerGroup(brokers, group, config) if err != nil { return nil, err } // Create a cancelable context for the background goroutine that // consumes messages. ctx, cancel := context.WithCancel(context.Background()) joinCh := make(chan struct{}) ds := &subscription{ opts: *opts, consumerGroup: consumerGroup, closeCh: make(chan struct{}), joinCh: joinCh, cancel: cancel, } // Start a background consumer. It should run until ctx is cancelled // by Close, or until there's a fatal error (e.g., topic doesn't exist). // We're registering ds as our ConsumerGroupHandler, so sarama will // call [Setup, ConsumeClaim (possibly more than once), Cleanup] // repeatedly as the consumer group is rebalanced. // See https://godoc.org/github.com/IBM/sarama#ConsumerGroup. go func() { for { ds.closeErr = consumerGroup.Consume(ctx, topics, ds) if ds.closeErr != nil || ctx.Err() != nil { consumerGroup.Close() close(ds.closeCh) break } } }() if opts.WaitForJoin > 0 { // Best effort wait for first consumer group session. select { case <-joinCh: case <-ds.closeCh: case <-time.After(opts.WaitForJoin): } } return ds, nil } // Setup implements sarama.ConsumerGroupHandler.Setup. It is called whenever // a new session with the broker is starting. func (s *subscription) Setup(sess sarama.ConsumerGroupSession) error { // Record the current session. s.mu.Lock() defer s.mu.Unlock() s.sess = sess s.expectedClaims = 0 for _, claims := range sess.Claims() { s.expectedClaims += len(claims) } return nil } // Cleanup implements sarama.ConsumerGroupHandler.Cleanup. func (s *subscription) Cleanup(sarama.ConsumerGroupSession) error { // Clear the current session. s.mu.Lock() defer s.mu.Unlock() s.sess = nil s.expectedClaims = 0 s.claims = nil return nil } // ConsumeClaim implements sarama.ConsumerGroupHandler.ConsumeClaim. // This is where messages are actually delivered, via a channel. func (s *subscription) ConsumeClaim(sess sarama.ConsumerGroupSession, claim sarama.ConsumerGroupClaim) error { s.mu.Lock() s.claims = append(s.claims, claim) // Once all of the expected claims have registered, close joinCh to (possibly) wake up OpenSubscription. if s.joinCh != nil && len(s.claims) == s.expectedClaims { close(s.joinCh) s.joinCh = nil } s.mu.Unlock() <-sess.Context().Done() return nil } // ReceiveBatch implements driver.Subscription.ReceiveBatch. func (s *subscription) ReceiveBatch(ctx context.Context, maxMessages int) ([]*driver.Message, error) { // Try to read maxMessages for up to 100ms before giving up. maxWaitCtx, cancel := context.WithTimeout(ctx, 100*time.Millisecond) defer cancel() for { // We'll give up after maxWaitCtx is Done, or if s.closeCh is closed. // Otherwise, we want to pull a message from one of the channels in the // claim(s) we've been given. // // Note: we could multiplex this by ranging over each claim.Messages(), // writing the messages to a single ch, and then reading from that ch // here. However, this results in us reading messages from Kafka and // essentially queueing them here; when the session is closed for whatever // reason, those messages are lost, which may or may not be an issue // depending on the Kafka configuration being used. // // It seems safer to use reflect.Select to explicitly only get a single // message at a time, and hand it directly to the user. // // reflect.Select is essentially a "select" statement, but allows us to // build the cases dynamically. We need that because we need a case for // each of the claims in s.claims. s.mu.Lock() cases := make([]reflect.SelectCase, 0, len(s.claims)+2) // Add a case for s.closeCh being closed, at index = 0. cases = append(cases, reflect.SelectCase{ Dir: reflect.SelectRecv, Chan: reflect.ValueOf(s.closeCh), }) // Add a case for maxWaitCtx being Done, at index = 1. cases = append(cases, reflect.SelectCase{ Dir: reflect.SelectRecv, Chan: reflect.ValueOf(maxWaitCtx.Done()), }) // Add a case per claim, reading from the claim's Messages channel. for _, claim := range s.claims { cases = append(cases, reflect.SelectCase{ Dir: reflect.SelectRecv, Chan: reflect.ValueOf(claim.Messages()), }) } s.mu.Unlock() i, v, ok := reflect.Select(cases) if !ok { // The i'th channel was closed. switch i { case 0: // s.closeCh return nil, s.closeErr case 1: // maxWaitCtx // We've tried for a while to get a message, but didn't get any. // Return an empty slice; the portable type will call us back. return nil, ctx.Err() } // Otherwise, if one of the claim channels closed, we're probably ending // a session. Just keep trying. continue } msg := v.Interface().(*sarama.ConsumerMessage) // We've got a message! It should not be nil. // Read the metadata from msg.Headers. md := map[string]string{} for _, h := range msg.Headers { md[string(h.Key)] = string(h.Value) } // Add a metadata entry for the message key if appropriate. if len(msg.Key) > 0 && s.opts.KeyName != "" { md[s.opts.KeyName] = string(msg.Key) } ack := &ackInfo{msg: msg} var loggableID string if len(msg.Key) == 0 { loggableID = fmt.Sprintf("partition %d offset %d", msg.Partition, msg.Offset) } else { loggableID = string(msg.Key) } dm := &driver.Message{ LoggableID: loggableID, Body: msg.Value, Metadata: md, AckID: ack, AsFunc: func(i any) bool { if p, ok := i.(**sarama.ConsumerMessage); ok { *p = msg return true } return false }, } s.mu.Lock() defer s.mu.Unlock() s.unacked = append(s.unacked, ack) return []*driver.Message{dm}, nil } } // SendAcks implements driver.Subscription.SendAcks. func (s *subscription) SendAcks(ctx context.Context, ids []driver.AckID) error { s.mu.Lock() defer s.mu.Unlock() // Mark them all acked. for _, id := range ids { id.(*ackInfo).acked = true } if s.sess == nil { // We don't have a current session, so we can't send offset updates. // We'll just wait until next time and retry. return nil } // Mark all of the acked messages at the head of the slice. Since Kafka only // stores a single offset, we can't mark messages that aren't at the head; that // would move the offset past other as-yet-unacked messages. for len(s.unacked) > 0 && s.unacked[0].acked { s.sess.MarkMessage(s.unacked[0].msg, "") s.unacked = s.unacked[1:] } return nil } // CanNack implements driver.CanNack. func (s *subscription) CanNack() bool { // Nacking a single message doesn't make sense with the way Kafka maintains // offsets. return false } // SendNacks implements driver.Subscription.SendNacks. func (s *subscription) SendNacks(ctx context.Context, ids []driver.AckID) error { panic("unreachable") } // Close implements io.Closer. func (s *subscription) Close() error { // Cancel the ctx for the background goroutine and wait until it's done. s.cancel() <-s.closeCh return nil } // IsRetryable implements driver.Subscription.IsRetryable. func (*subscription) IsRetryable(error) bool { return false } // As implements driver.Subscription.As. func (s *subscription) As(i any) bool { if p, ok := i.(*sarama.ConsumerGroup); ok { *p = s.consumerGroup return true } if p, ok := i.(*sarama.ConsumerGroupSession); ok { s.mu.Lock() defer s.mu.Unlock() *p = s.sess return true } return false } // ErrorAs implements driver.Subscription.ErrorAs. func (s *subscription) ErrorAs(err error, i any) bool { return errorAs(err, i) } // ErrorCode implements driver.Subscription.ErrorCode. func (*subscription) ErrorCode(err error) gcerrors.ErrorCode { return errorCode(err) } func errorAs(err error, i any) bool { switch terr := err.(type) { case sarama.ConsumerError: if p, ok := i.(*sarama.ConsumerError); ok { *p = terr return true } case sarama.ConsumerErrors: if p, ok := i.(*sarama.ConsumerErrors); ok { *p = terr return true } case sarama.ProducerError: if p, ok := i.(*sarama.ProducerError); ok { *p = terr return true } case sarama.ProducerErrors: if p, ok := i.(*sarama.ProducerErrors); ok { *p = terr return true } case sarama.ConfigurationError: if p, ok := i.(*sarama.ConfigurationError); ok { *p = terr return true } case sarama.PacketDecodingError: if p, ok := i.(*sarama.PacketDecodingError); ok { *p = terr return true } case sarama.PacketEncodingError: if p, ok := i.(*sarama.PacketEncodingError); ok { *p = terr return true } case sarama.KError: if p, ok := i.(*sarama.KError); ok { *p = terr return true } } return false } ================================================ FILE: pubsub/kafkapubsub/kafka_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package kafkapubsub // import "gocloud.dev/pubsub/kafkapubsub" // To run these tests against a real Kafka server, run localkafka.sh. // See https://github.com/spotify/docker-kafka for more on the docker container // that the script runs. import ( "context" "errors" "fmt" "math/rand" "os" "strings" "sync/atomic" "testing" "time" "github.com/IBM/sarama" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "gocloud.dev/internal/testing/setup" "gocloud.dev/pubsub" "gocloud.dev/pubsub/driver" "gocloud.dev/pubsub/drivertest" ) var ( localBrokerAddrs = []string{"localhost:9092"} // Makes OpenSubscription wait ~forever until the subscriber has joined the // ConsumerGroup. Messages sent to the topic before the subscriber has joined // won't be received. subscriptionOptions = &SubscriptionOptions{WaitForJoin: 24 * time.Hour} ) type harness struct { uniqueID int numSubs uint32 numTopics uint32 } func newHarness(ctx context.Context, t *testing.T) (drivertest.Harness, error) { if !setup.HasDockerTestEnvironment() { t.Skip("Skipping Kafka tests since the Kafka server is not available") } return &harness{uniqueID: rand.Int()}, nil } func createKafkaTopic(topicName string, partitions int32) (func(), error) { // Create the topic. config := MinimalConfig() admin, err := sarama.NewClusterAdmin(localBrokerAddrs, config) if err != nil { return func() {}, err } close1 := func() { admin.Close() } topicDetail := &sarama.TopicDetail{ NumPartitions: partitions, ReplicationFactor: 1, } if err := admin.CreateTopic(topicName, topicDetail, false); err != nil { return close1, err } close2 := func() { admin.DeleteTopic(topicName) close1() } return close2, nil } func (h *harness) CreateTopic(ctx context.Context, testName string) (driver.Topic, func(), error) { topicName := fmt.Sprintf("%s-topic-%d-%d", sanitize(testName), h.uniqueID, atomic.AddUint32(&h.numTopics, 1)) cleanup, err := createKafkaTopic(topicName, 1) if err != nil { return nil, cleanup, err } // Open it. dt, err := openTopic(localBrokerAddrs, MinimalConfig(), topicName, nil) if err != nil { return nil, cleanup, err } return dt, cleanup, nil } func (h *harness) MakeNonexistentTopic(ctx context.Context) (driver.Topic, error) { return openTopic(localBrokerAddrs, MinimalConfig(), "nonexistent-topic", nil) } func (h *harness) CreateSubscription(ctx context.Context, dt driver.Topic, testName string) (driver.Subscription, func(), error) { groupID := fmt.Sprintf("%s-sub-%d-%d", sanitize(testName), h.uniqueID, atomic.AddUint32(&h.numSubs, 1)) ds, err := openSubscription(localBrokerAddrs, MinimalConfig(), groupID, []string{dt.(*topic).topicName}, subscriptionOptions) return ds, func() {}, err } func (h *harness) MakeNonexistentSubscription(ctx context.Context) (driver.Subscription, func(), error) { ds, err := openSubscription(localBrokerAddrs, MinimalConfig(), "unused-group", []string{"nonexistent-topic"}, subscriptionOptions) return ds, func() {}, err } func (h *harness) Close() {} func (h *harness) MaxBatchSizes() (int, int) { return sendBatcherOpts.MaxBatchSize, 0 } func (*harness) SupportsMultipleSubscriptions() bool { return true } func TestConformance(t *testing.T) { asTests := []drivertest.AsTest{asTest{}} drivertest.RunConformanceTests(t, newHarness, asTests) } type asTest struct{} func (asTest) Name() string { return "kafka" } func (asTest) TopicCheck(topic *pubsub.Topic) error { var sp sarama.SyncProducer if !topic.As(&sp) { return fmt.Errorf("cast failed for %T", sp) } return nil } func (asTest) SubscriptionCheck(sub *pubsub.Subscription) error { var cg sarama.ConsumerGroup if !sub.As(&cg) { return fmt.Errorf("cast failed for %T", cg) } var cgs sarama.ConsumerGroupSession if !sub.As(&cgs) { return fmt.Errorf("cast failed for %T", cgs) } return nil } func (asTest) TopicErrorCheck(t *pubsub.Topic, err error) error { var pe sarama.ProducerErrors if !t.ErrorAs(err, &pe) { return fmt.Errorf("failed to convert %v (%T)", err, err) } return nil } func (asTest) SubscriptionErrorCheck(s *pubsub.Subscription, err error) error { var ke sarama.KError if !s.ErrorAs(err, &ke) { return fmt.Errorf("failed to convert %v (%T)", err, err) } return nil } func (asTest) MessageCheck(m *pubsub.Message) error { var cm *sarama.ConsumerMessage if !m.As(&cm) { return fmt.Errorf("cast failed for %T", cm) } return nil } func (asTest) BeforeSend(as func(any) bool) error { var pm *sarama.ProducerMessage if !as(&pm) { return fmt.Errorf("cast failed for %T", &pm) } return nil } func (asTest) AfterSend(as func(any) bool) error { return nil } // TestKafkaKey tests sending/receiving a message with the Kafka message key set. func TestKafkaKey(t *testing.T) { if !setup.HasDockerTestEnvironment() { t.Skip("Skipping Kafka tests since the Kafka server is not available") } const ( keyName = "kafkakey" keyValue = "kafkakeyvalue" ) uniqueID := rand.Int() ctx := context.Background() topicName := fmt.Sprintf("%s-topic-%d", sanitize(t.Name()), uniqueID) topicCleanup, err := createKafkaTopic(topicName, 1) defer topicCleanup() if err != nil { t.Fatal(err) } topic, err := OpenTopic(localBrokerAddrs, MinimalConfig(), topicName, &TopicOptions{KeyName: keyName}) if err != nil { t.Fatal(err) } defer func() { if err := topic.Shutdown(ctx); err != nil { t.Error(err) } }() groupID := fmt.Sprintf("%s-sub-%d", sanitize(t.Name()), uniqueID) subOpts := *subscriptionOptions subOpts.KeyName = keyName sub, err := OpenSubscription(localBrokerAddrs, MinimalConfig(), groupID, []string{topicName}, &subOpts) if err != nil { t.Fatal(err) } defer func() { if err := sub.Shutdown(ctx); err != nil { t.Error(err) } }() m := &pubsub.Message{ Metadata: map[string]string{ "foo": "bar", keyName: keyValue, }, Body: []byte("hello world"), BeforeSend: func(as func(any) bool) error { // Verify that the Key field was set correctly on the outgoing Kafka // message. var pm *sarama.ProducerMessage if !as(&pm) { return errors.New("failed to convert to ProducerMessage") } gotKeyBytes, err := pm.Key.Encode() if err != nil { return fmt.Errorf("failed to Encode Kafka Key: %v", err) } if gotKey := string(gotKeyBytes); gotKey != keyValue { return errors.New("Kafka key wasn't set appropriately") } return nil }, } err = topic.Send(ctx, m) if err != nil { t.Fatal(err) } // The test will hang here if the message isn't available, so use a shorter timeout. ctx2, cancel := context.WithTimeout(ctx, 30*time.Second) defer cancel() got, err := sub.Receive(ctx2) if err != nil { t.Fatal(err) } got.Ack() m.BeforeSend = nil // don't expect this in the received message m.LoggableID = keyValue if diff := cmp.Diff(got, m, cmpopts.IgnoreUnexported(pubsub.Message{})); diff != "" { t.Errorf("got\n%v\nwant\n%v\ndiff\n%v", got, m, diff) } // Verify that Key was set in the received Kafka message via As. var cm *sarama.ConsumerMessage if !got.As(&cm) { t.Fatal("failed to get message As ConsumerMessage") } if gotKey := string(cm.Key); gotKey != keyValue { t.Errorf("got key %q want %q", gotKey, keyValue) } } // TestMultiplePartionsWithRebalancing tests use of a topic with multiple // partitions, including the rebalancing that happens when a new consumer // appears in the group. func TestMultiplePartionsWithRebalancing(t *testing.T) { if !setup.HasDockerTestEnvironment() { t.Skip("Skipping Kafka tests since the Kafka server is not available") } const ( keyName = "kafkakey" nMessages = 10 ) uniqueID := rand.Int() ctx := context.Background() // Create a topic with 10 partitions. Using 10 instead of just 2 because // that also tests having multiple claims. topicName := fmt.Sprintf("%s-topic-%d", sanitize(t.Name()), uniqueID) topicCleanup, err := createKafkaTopic(topicName, 10) defer topicCleanup() if err != nil { t.Fatal(err) } topic, err := OpenTopic(localBrokerAddrs, MinimalConfig(), topicName, &TopicOptions{KeyName: keyName}) if err != nil { t.Fatal(err) } defer func() { if err := topic.Shutdown(ctx); err != nil { t.Error(err) } }() // Open a subscription. groupID := fmt.Sprintf("%s-sub-%d", sanitize(t.Name()), uniqueID) subOpts := *subscriptionOptions subOpts.KeyName = keyName sub, err := OpenSubscription(localBrokerAddrs, MinimalConfig(), groupID, []string{topicName}, &subOpts) if err != nil { t.Fatal(err) } defer func() { if err := sub.Shutdown(ctx); err != nil { t.Error(err) } }() // Send some messages. send := func() { for i := 0; i < nMessages; i++ { m := &pubsub.Message{ Metadata: map[string]string{ keyName: fmt.Sprintf("key%d", i), }, Body: []byte("hello world"), } if err := topic.Send(ctx, m); err != nil { t.Fatal(err) } } } send() // Receive the messages via the subscription. got := make(chan int) done := make(chan error) read := func(ctx context.Context, subNum int, sub *pubsub.Subscription) { for { m, err := sub.Receive(ctx) if err != nil { if err == context.Canceled { // Expected after all messages are received, no error. done <- nil } else { done <- err } return } m.Ack() got <- subNum } } // The test will hang here if the messages aren't available, so use a shorter // timeout. ctx2, cancel := context.WithTimeout(ctx, 30*time.Second) go read(ctx2, 0, sub) for i := 0; i < nMessages; i++ { select { case <-got: case err := <-done: // Premature error. if err != nil { t.Fatal(err) } } } cancel() if err := <-done; err != nil { t.Fatal(err) } // Add another subscription to the same group. Kafka will rebalance the // consumer group, causing the Cleanup/Setup/ConsumeClaim loop. Each of the // two subscriptions should get claims for 50% of the partitions. sub2, err := OpenSubscription(localBrokerAddrs, MinimalConfig(), groupID, []string{topicName}, &subOpts) if err != nil { t.Fatal(err) } defer func() { if err := sub2.Shutdown(ctx); err != nil { t.Error(err) } }() // Send and receive some messages. // Now both subscriptions should get some messages. send() // The test will hang here if the message isn't available, so use a shorter timeout. ctx3, cancel := context.WithTimeout(ctx, 30*time.Second) go read(ctx3, 0, sub) go read(ctx3, 1, sub2) counts := []int{0, 0} for i := 0; i < nMessages; i++ { select { case sub := <-got: counts[sub]++ case err := <-done: // Premature error. if err != nil { t.Fatal(err) } } } cancel() for i := 0; i < 2; i++ { if err := <-done; err != nil { t.Fatal(err) } } if counts[0] == 0 || counts[1] == 0 { t.Errorf("one of the partitioned subscriptions didn't get any messages: %v", counts) } } func sanitize(testName string) string { return strings.Replace(testName, "/", "_", -1) } func BenchmarkKafka(b *testing.B) { ctx := context.Background() uniqueID := rand.Int() // Create the topic. topicName := fmt.Sprintf("%s-topic-%d", b.Name(), uniqueID) cleanup, err := createKafkaTopic(topicName, 1) defer cleanup() if err != nil { b.Fatal(err) } topic, err := OpenTopic(localBrokerAddrs, MinimalConfig(), topicName, nil) if err != nil { b.Fatal(err) } defer topic.Shutdown(ctx) groupID := fmt.Sprintf("%s-subscription-%d", b.Name(), uniqueID) sub, err := OpenSubscription(localBrokerAddrs, MinimalConfig(), groupID, []string{topicName}, subscriptionOptions) if err != nil { b.Fatal(err) } defer sub.Shutdown(ctx) drivertest.RunBenchmarks(b, topic, sub) } func fakeConnectionStringInEnv() func() { oldEnvVal := os.Getenv("KAFKA_BROKERS") os.Setenv("KAFKA_BROKERS", "localhost:10000") return func() { os.Setenv("KAFKA_BROKERS", oldEnvVal) } } func TestOpenTopicFromURL(t *testing.T) { cleanup := fakeConnectionStringInEnv() defer cleanup() tests := []struct { URL string WantErr bool }{ // OK. {"kafka://mytopic", false}, // OK, specifying key_name. {"kafka://mytopic?key_name=x-partition-key", false}, // Invalid key_name value. {"kafka://mytopic?key_name=", true}, // Invalid parameter. {"kafka://mytopic?param=value", true}, } ctx := context.Background() for _, test := range tests { topic, err := pubsub.OpenTopic(ctx, test.URL) if err != nil && errors.Is(err, sarama.ErrOutOfBrokers) { // Since we don't have a real kafka broker to talk to, we will always get an error when // opening a topic. This test is checking specifically for query parameter usage, so // we treat the "no brokers" error message as a nil error. err = nil } if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } if topic != nil { topic.Shutdown(ctx) } } } func TestOpenSubscriptionFromURL(t *testing.T) { cleanup := fakeConnectionStringInEnv() defer cleanup() tests := []struct { URL string WantErr bool }{ // OK. {"kafka://mygroup?topic=mytopic", false}, // OK, specifying initial offset. {"kafka://mygroup?topic=mytopic&offset=oldest", false}, {"kafka://mygroup?topic=mytopic&offset=newest", false}, // Invalid offset specified. {"kafka://mygroup?topic=mytopic&offset=value", true}, // Invalid parameter. {"kafka://mygroup?topic=mytopic¶m=value", true}, } ctx := context.Background() for _, test := range tests { sub, err := pubsub.OpenSubscription(ctx, test.URL) if err != nil && errors.Is(err, sarama.ErrOutOfBrokers) { // Since we don't have a real kafka broker to talk to, we will always get an error when // opening a subscription. This test is checking specifically for query parameter usage, so // we treat the "no brokers" error message as a nil error. err = nil } if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } if sub != nil { sub.Shutdown(ctx) } } } ================================================ FILE: pubsub/kafkapubsub/localkafka.sh ================================================ #!/usr/bin/env bash # Copyright 2019 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Starts a local Kafka instance (plus supporting Zookeeper) via Docker. # https://coderwall.com/p/fkfaqq/safer-bash-scripts-with-set-euxo-pipefail set -euo pipefail # Clean up and run Zookeeper. echo "Starting Zookeeper (for Kafka)..." docker rm -f zookeeper &> /dev/null || : docker run -d --net=host --name=zookeeper -e ZOOKEEPER_CLIENT_PORT=2181 confluentinc/cp-zookeeper:6.0.1 &> /dev/null echo "...done. Run \"docker rm -f zookeeper\" to clean up the container." echo # Clean up and run Kafka. echo "Starting Kafka..." docker rm -f kafka &> /dev/null || : docker run -d --net=host -p 9092:9092 --name=kafka -e KAFKA_ZOOKEEPER_CONNECT=localhost:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 -e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 -e KAFKA_AUTO_CREATE_TOPICS_ENABLE=false -e KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS=100 confluentinc/cp-kafka:6.0.1 &> /dev/null echo "...done. Run \"docker rm -f kafka\" to clean up the container." echo ================================================ FILE: pubsub/mempubsub/conformance_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package mempubsub import ( "context" "testing" "time" "gocloud.dev/pubsub/driver" "gocloud.dev/pubsub/drivertest" ) type harness struct{} func newHarness(ctx context.Context, t *testing.T) (drivertest.Harness, error) { t.Helper() return &harness{}, nil } func (h *harness) CreateTopic(ctx context.Context, testName string) (dt driver.Topic, cleanup func(), err error) { cleanup = func() {} return &topic{}, cleanup, nil } func (h *harness) MakeNonexistentTopic(ctx context.Context) (driver.Topic, error) { // A nil *topic behaves like a nonexistent topic. return (*topic)(nil), nil } func (h *harness) CreateSubscription(ctx context.Context, dt driver.Topic, testName string) (ds driver.Subscription, cleanup func(), err error) { ds = newSubscription(dt.(*topic), time.Second) cleanup = func() {} return ds, cleanup, nil } func (h *harness) MakeNonexistentSubscription(ctx context.Context) (driver.Subscription, func(), error) { return newSubscription(nil, time.Second), func() {}, nil } func (h *harness) Close() {} func (h *harness) MaxBatchSizes() (int, int) { return 0, 0 } func (*harness) SupportsMultipleSubscriptions() bool { return true } func TestConformance(t *testing.T) { drivertest.RunConformanceTests(t, newHarness, nil) } func BenchmarkMemPubSub(b *testing.B) { ctx := context.Background() topic := NewTopic() defer topic.Shutdown(ctx) sub := NewSubscription(topic, time.Second) defer sub.Shutdown(ctx) drivertest.RunBenchmarks(b, topic, sub) } ================================================ FILE: pubsub/mempubsub/example_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package mempubsub_test import ( "context" "log" "time" "gocloud.dev/pubsub" "gocloud.dev/pubsub/mempubsub" ) func ExampleNewSubscription() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // Construct a *pubsub.Topic. topic := mempubsub.NewTopic() defer topic.Shutdown(ctx) // Construct a *pubsub.Subscription for the topic. subscription := mempubsub.NewSubscription(topic, 1*time.Minute /* ack deadline */) defer subscription.Shutdown(ctx) } func ExampleNewTopic() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() topic := mempubsub.NewTopic() defer topic.Shutdown(ctx) } func Example_openSubscriptionFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/pubsub/mempubsub" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // Create a topic. topic, err := pubsub.OpenTopic(ctx, "mem://topicA") if err != nil { log.Fatal(err) } defer topic.Shutdown(ctx) // Create a subscription connected to that topic. subscription, err := pubsub.OpenSubscription(ctx, "mem://topicA") if err != nil { log.Fatal(err) } defer subscription.Shutdown(ctx) } func Example_openTopicFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/pubsub/mempubsub" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() topic, err := pubsub.OpenTopic(ctx, "mem://topicA") if err != nil { log.Fatal(err) } defer topic.Shutdown(ctx) } ================================================ FILE: pubsub/mempubsub/mem.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package mempubsub provides an in-memory pubsub implementation. // Use NewTopic to construct a *pubsub.Topic, and/or NewSubscription // to construct a *pubsub.Subscription. // // mempubsub should not be used for production: it is intended for local // development and testing. // // # URLs // // For pubsub.OpenTopic and pubsub.OpenSubscription, mempubsub registers // for the scheme "mem". // To customize the URL opener, or for more details on the URL format, // see URLOpener. // See https://gocloud.dev/concepts/urls/ for background information. // // # Message Delivery Semantics // // mempubsub supports at-least-once semantics; applications must // call Message.Ack after processing a message, or it will be redelivered. // See https://godoc.org/gocloud.dev/pubsub#hdr-At_most_once_and_At_least_once_Delivery // for more background. // // # As // // mempubsub does not support any types for As. package mempubsub // import "gocloud.dev/pubsub/mempubsub" import ( "context" "errors" "fmt" "log" "net/url" "path" "sync" "time" "gocloud.dev/gcerrors" "gocloud.dev/pubsub" "gocloud.dev/pubsub/batcher" "gocloud.dev/pubsub/driver" ) func init() { o := new(URLOpener) pubsub.DefaultURLMux().RegisterTopic(Scheme, o) pubsub.DefaultURLMux().RegisterSubscription(Scheme, o) } // Scheme is the URL scheme mempubsub registers its URLOpeners under on pubsub.DefaultMux. const Scheme = "mem" // URLOpener opens mempubsub URLs like "mem://topic". // // The URL's host+path is used as the topic to create or subscribe to. // // Query parameters: // - ackdeadline: The ack deadline for OpenSubscription, in time.ParseDuration formats. // Defaults to 1m. type URLOpener struct { mu sync.Mutex topics map[string]*pubsub.Topic } // OpenTopicURL opens a pubsub.Topic based on u. func (o *URLOpener) OpenTopicURL(ctx context.Context, u *url.URL) (*pubsub.Topic, error) { for param := range u.Query() { return nil, fmt.Errorf("open topic %v: invalid query parameter %q", u, param) } topicName := path.Join(u.Host, u.Path) o.mu.Lock() defer o.mu.Unlock() if o.topics == nil { o.topics = map[string]*pubsub.Topic{} } t := o.topics[topicName] if t == nil { t = NewTopic() o.topics[topicName] = t } return t, nil } // OpenSubscriptionURL opens a pubsub.Subscription based on u. func (o *URLOpener) OpenSubscriptionURL(ctx context.Context, u *url.URL) (*pubsub.Subscription, error) { q := u.Query() ackDeadline := 1 * time.Minute if s := q.Get("ackdeadline"); s != "" { var err error ackDeadline, err = time.ParseDuration(s) if err != nil { return nil, fmt.Errorf("open subscription %v: invalid ackdeadline %q: %v", u, s, err) } q.Del("ackdeadline") } for param := range q { return nil, fmt.Errorf("open subscription %v: invalid query parameter %q", u, param) } topicName := path.Join(u.Host, u.Path) o.mu.Lock() defer o.mu.Unlock() if o.topics == nil { o.topics = map[string]*pubsub.Topic{} } t := o.topics[topicName] if t == nil { return nil, fmt.Errorf("open subscription %v: no topic %q has been created", u, topicName) } return NewSubscription(t, ackDeadline), nil } var errNotExist = errors.New("mempubsub: topic does not exist") type topic struct { mu sync.Mutex subs []*subscription nextAckID int } // TopicOptions contains configuration options for topics. type TopicOptions struct { // BatcherOptions adds constraints to the default batching done for sends. BatcherOptions batcher.Options } // NewTopic creates a new in-memory topic. func NewTopic() *pubsub.Topic { return NewTopicWithOptions(nil) } // NewTopicWithOptions is similar to NewTopic, but supports TopicOptions. func NewTopicWithOptions(opts *TopicOptions) *pubsub.Topic { if opts == nil { opts = &TopicOptions{} } return pubsub.NewTopic(&topic{}, &opts.BatcherOptions) } // SendBatch implements driver.Topic.SendBatch. // It is error if the topic is closed or has no subscriptions. func (t *topic) SendBatch(ctx context.Context, ms []*driver.Message) error { if err := ctx.Err(); err != nil { return err } if t == nil { return errNotExist } t.mu.Lock() defer t.mu.Unlock() // Log a warning if there are no subscribers. if len(t.subs) == 0 { log.Print("warning: message sent to topic with no subscribers") } // Associate ack IDs with messages here. It would be a bit better if each subscription's // messages had their own ack IDs, so we could catch one subscription using ack IDs from another, // but that would require copying all the messages. for i, m := range ms { m.AckID = t.nextAckID + i m.LoggableID = fmt.Sprintf("msg #%d", m.AckID) m.AsFunc = func(any) bool { return false } if m.BeforeSend != nil { if err := m.BeforeSend(func(any) bool { return false }); err != nil { return err } } if m.AfterSend != nil { if err := m.AfterSend(func(any) bool { return false }); err != nil { return err } } } t.nextAckID += len(ms) for _, s := range t.subs { s.add(ms) } return nil } // IsRetryable implements driver.Topic.IsRetryable. func (*topic) IsRetryable(error) bool { return false } // As implements driver.Topic.As. // It supports *topic so that NewSubscription can recover a *topic // from the portable type (see below). External users won't be able // to use As because topic isn't exported. func (t *topic) As(i any) bool { x, ok := i.(**topic) if !ok { return false } *x = t return true } // ErrorAs implements driver.Topic.ErrorAs func (*topic) ErrorAs(error, any) bool { return false } // ErrorCode implements driver.Topic.ErrorCode func (*topic) ErrorCode(err error) gcerrors.ErrorCode { if err == errNotExist { return gcerrors.NotFound } return gcerrors.Unknown } // Close implements driver.Topic.Close. func (*topic) Close() error { return nil } // SubscriptionOptions will contain configuration for subscriptions. type SubscriptionOptions struct { // ReceiveBatcherOptions adds constraints to the default batching done for receives. ReceiveBatcherOptions batcher.Options // AckBatcherOptions adds constraints to the default batching done for acks. AckBatcherOptions batcher.Options } type subscription struct { mu sync.Mutex topic *topic ackDeadline time.Duration msgs map[driver.AckID]*message // all unacknowledged messages } // NewSubscription creates a new subscription for the given topic. // It panics if the given topic did not come from mempubsub. // If a message is not acked within in the given ack deadline from when // it is received, then it will be redelivered. func NewSubscription(pstopic *pubsub.Topic, ackDeadline time.Duration) *pubsub.Subscription { return NewSubscriptionWithOptions(pstopic, ackDeadline, nil) } // NewSubscriptionWithOptions is similar to NewSubscription, but supports SubscriptionOptions. func NewSubscriptionWithOptions(pstopic *pubsub.Topic, ackDeadline time.Duration, opts *SubscriptionOptions) *pubsub.Subscription { if opts == nil { opts = &SubscriptionOptions{} } var t *topic if !pstopic.As(&t) { panic("mempubsub: NewSubscription passed a Topic not from mempubsub") } return pubsub.NewSubscription(newSubscription(t, ackDeadline), &opts.ReceiveBatcherOptions, &opts.AckBatcherOptions) } func newSubscription(topic *topic, ackDeadline time.Duration) *subscription { s := &subscription{ topic: topic, ackDeadline: ackDeadline, msgs: map[driver.AckID]*message{}, } if topic != nil { topic.mu.Lock() defer topic.mu.Unlock() topic.subs = append(topic.subs, s) } return s } type message struct { msg *driver.Message expiration time.Time } func (s *subscription) add(ms []*driver.Message) { s.mu.Lock() defer s.mu.Unlock() for _, m := range ms { // The new message will expire at the zero time, which means it will be // immediately eligible for delivery. s.msgs[m.AckID] = &message{msg: m} } } // Collect some messages available for delivery. Since we're iterating over a map, // the order of the messages won't match the publish order, which mimics the actual // behavior of most pub/sub services. func (s *subscription) receiveNoWait(now time.Time, max int) []*driver.Message { var msgs []*driver.Message s.mu.Lock() defer s.mu.Unlock() for _, m := range s.msgs { if now.After(m.expiration) { msgs = append(msgs, m.msg) m.expiration = now.Add(s.ackDeadline) if len(msgs) == max { return msgs } } } return msgs } // How long ReceiveBatch should wait if no messages are available, to avoid // spinning. const pollDuration = 250 * time.Millisecond // ReceiveBatch implements driver.ReceiveBatch. func (s *subscription) ReceiveBatch(ctx context.Context, maxMessages int) ([]*driver.Message, error) { // Check for closed or cancelled before doing any work. if err := s.wait(ctx, 0); err != nil { return nil, err } msgs := s.receiveNoWait(time.Now(), maxMessages) if len(msgs) == 0 { // When we return no messages and no error, the portable type will call // ReceiveBatch again immediately. Sleep for a bit to avoid spinning. time.Sleep(pollDuration) } return msgs, nil } func (s *subscription) wait(ctx context.Context, dur time.Duration) error { if s.topic == nil { return errNotExist } select { case <-ctx.Done(): return ctx.Err() case <-time.After(dur): return nil } } // SendAcks implements driver.SendAcks. func (s *subscription) SendAcks(ctx context.Context, ackIDs []driver.AckID) error { if s.topic == nil { return errNotExist } // Check for context done before doing any work. if err := ctx.Err(); err != nil { return err } // Acknowledge messages by removing them from the map. // Since there is a single map, this correctly handles the case where a message // is redelivered, but the first receiver acknowledges it. s.mu.Lock() defer s.mu.Unlock() for _, id := range ackIDs { // It is OK if the message is not in the map; that just means it has been // previously acked. delete(s.msgs, id) } return nil } // CanNack implements driver.CanNack. func (s *subscription) CanNack() bool { return true } // SendNacks implements driver.SendNacks. func (s *subscription) SendNacks(ctx context.Context, ackIDs []driver.AckID) error { if s.topic == nil { return errNotExist } // Check for context done before doing any work. if err := ctx.Err(); err != nil { return err } // Nack messages by setting their expiration to the zero time. s.mu.Lock() defer s.mu.Unlock() for _, id := range ackIDs { if m := s.msgs[id]; m != nil { m.expiration = time.Time{} } } return nil } // IsRetryable implements driver.Subscription.IsRetryable. func (*subscription) IsRetryable(error) bool { return false } // As implements driver.Subscription.As. func (s *subscription) As(i any) bool { return false } // ErrorAs implements driver.Subscription.ErrorAs func (*subscription) ErrorAs(error, any) bool { return false } // ErrorCode implements driver.Subscription.ErrorCode func (*subscription) ErrorCode(err error) gcerrors.ErrorCode { if err == errNotExist { return gcerrors.NotFound } return gcerrors.Unknown } // Close implements driver.Subscription.Close. func (*subscription) Close() error { return nil } ================================================ FILE: pubsub/mempubsub/mem_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package mempubsub import ( "context" "testing" "time" "gocloud.dev/pubsub" "gocloud.dev/pubsub/driver" ) func TestReceive(t *testing.T) { ctx := context.Background() topic := &topic{} sub := newSubscription(topic, 3*time.Second) if err := topic.SendBatch(ctx, []*driver.Message{ {Body: []byte("a")}, {Body: []byte("b")}, {Body: []byte("c")}, }); err != nil { t.Fatal(err) } now := time.Now() // We should get only two of the published messages. msgs := sub.receiveNoWait(now, 2) if got, want := len(msgs), 2; got != want { t.Fatalf("got %d, want %d", got, want) } // We should get the remaining message. msgs = sub.receiveNoWait(now, 2) if got, want := len(msgs), 1; got != want { t.Fatalf("got %d, want %d", got, want) } // Since all the messages are outstanding, we shouldn't get any. msgs2 := sub.receiveNoWait(now, 10) if got, want := len(msgs2), 0; got != want { t.Fatalf("got %d, want %d", got, want) } // Advance time past expiration, and we should get all the messages again, // since we didn't ack any. now = now.Add(time.Hour) msgs = sub.receiveNoWait(now, 10) if got, want := len(msgs), 3; got != want { t.Fatalf("got %d, want %d", got, want) } // Again, since all the messages are outstanding, we shouldn't get any. msgs2 = sub.receiveNoWait(now, 10) if got, want := len(msgs2), 0; got != want { t.Fatalf("got %d, want %d", got, want) } // Now ack the messages. var ackIDs []driver.AckID for _, m := range msgs { ackIDs = append(ackIDs, m.AckID) } sub.SendAcks(ctx, ackIDs) // They will never be delivered again, even if we wait past the ack deadline. now = now.Add(time.Hour) msgs = sub.receiveNoWait(now, 10) if got, want := len(msgs), 0; got != want { t.Fatalf("got %d, want %d", got, want) } } func TestOpenTopicFromURL(t *testing.T) { tests := []struct { URL string WantErr bool }{ // OK. {"mem://mytopic", false}, // Invalid parameter. {"mem://mytopic?param=value", true}, } ctx := context.Background() for _, test := range tests { topic, err := pubsub.OpenTopic(ctx, test.URL) if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } if topic != nil { topic.Shutdown(ctx) } } } func TestOpenSubscriptionFromURL(t *testing.T) { tests := []struct { URL string WantErr bool }{ // OK. {"mem://mytopic", false}, // OK with ackdeadline {"mem://mytopic?ackdeadline=30s", false}, // Invalid ackdeadline {"mem://mytopic?ackdeadline=notaduration", true}, // Nonexistent topic. {"mem://nonexistenttopic", true}, // Invalid parameter. {"mem://myproject/mysub?param=value", true}, } ctx := context.Background() pubsub.OpenTopic(ctx, "mem://mytopic") for _, test := range tests { sub, err := pubsub.OpenSubscription(ctx, test.URL) if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } if sub != nil { sub.Shutdown(ctx) } } } func TestSendNoSubs(t *testing.T) { // It's OK to send a message to a topic with no subscribers. // (But it will log a warning: that is untested.) ctx := context.Background() topic := NewTopic() defer topic.Shutdown(ctx) if err := topic.Send(ctx, &pubsub.Message{Body: []byte("OK")}); err != nil { t.Fatal(err) } } /* // This test runs forever, so it's commented out. It's useful for playing // around with batching. Add a Printf in ../pubsub.go that prints the batch size. func TestReceiveBatching(t *testing.T) { ctx := context.Background() topic := NewTopic() defer topic.Shutdown(ctx) sub := NewSubscriptionWithOptions(topic, 10*time.Second, &SubscriptionOptions{ReceiveBatcherOptions: batcher.Options{MaxBatchSize: 10, MaxHandlers: 100}}) defer sub.Shutdown(ctx) // Receive messages as quickly as possible. go func() { for { msg, _ := sub.Receive(ctx) if msg != nil { msg.Ack() } } }() // Send slightly slower than the 250ms Sleep. for { if err := topic.Send(ctx, &pubsub.Message{Body: []byte("a")}); err != nil { t.Fatal(err) } time.Sleep(333 * time.Millisecond) } // With the above parameters, ideally the batch size would settle down to around 2. } */ ================================================ FILE: pubsub/natspubsub/example_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package natspubsub_test import ( "context" "log" "github.com/nats-io/nats.go" "gocloud.dev/pubsub" "gocloud.dev/pubsub/natspubsub" ) func ExampleOpenTopic() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() natsConn, err := nats.Connect("nats://nats.example.com") if err != nil { log.Fatal(err) } defer natsConn.Close() topic, err := natspubsub.OpenTopic(natsConn, "example.mysubject", nil) if err != nil { log.Fatal(err) } defer topic.Shutdown(ctx) } func ExampleOpenSubscription() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() natsConn, err := nats.Connect("nats://nats.example.com") if err != nil { log.Fatal(err) } defer natsConn.Close() subscription, err := natspubsub.OpenSubscription( natsConn, "example.mysubject", nil) if err != nil { log.Fatal(err) } defer subscription.Shutdown(ctx) } func ExampleOpenSubscription_queue() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() natsConn, err := nats.Connect("nats://nats.example.com") if err != nil { log.Fatal(err) } defer natsConn.Close() subscription, err := natspubsub.OpenSubscription( natsConn, "example.mysubject", &natspubsub.SubscriptionOptions{Queue: "queue1"}) if err != nil { log.Fatal(err) } defer subscription.Shutdown(ctx) } func Example_openTopicFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/pubsub/natspubsub" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // pubsub.OpenTopic creates a *pubsub.Topic from a URL. // This URL will Dial the NATS server at the URL in the environment variable // NATS_SERVER_URL and send messages with subject "example.mysubject". topic, err := pubsub.OpenTopic(ctx, "nats://example.mysubject") if err != nil { log.Fatal(err) } defer topic.Shutdown(ctx) } func Example_openSubscriptionFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/pubsub/natspubsub" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // pubsub.OpenSubscription creates a *pubsub.Subscription from a URL. // This URL will Dial the NATS server at the URL in the environment variable // NATS_SERVER_URL and receive messages with subject "example.mysubject". subscription, err := pubsub.OpenSubscription(ctx, "nats://example.mysubject") if err != nil { log.Fatal(err) } defer subscription.Shutdown(ctx) } func Example_openQueueSubscriptionFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/pubsub/natspubsub" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // pubsub.OpenSubscription creates a *pubsub.Subscription from a URL. // This URL will Dial the NATS server at the URL in the environment variable // NATS_SERVER_URL and receive messages with subject "example.mysubject" // This URL will be parsed and the queue attribute will be used as the Queue parameter when creating the NATS Subscription. subscription, err := pubsub.OpenSubscription(ctx, "nats://example.mysubject?queue=myqueue") if err != nil { log.Fatal(err) } defer subscription.Shutdown(ctx) } func ExampleOpenSubscriptionV2() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/pubsub/natspubsub" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() natsConn, err := nats.Connect("nats://nats.example.com") if err != nil { log.Fatal(err) } defer natsConn.Close() subscription, err := natspubsub.OpenSubscriptionV2( natsConn, "example.mysubject", nil) if err != nil { log.Fatal(err) } defer subscription.Shutdown(ctx) } func ExampleOpenTopicV2() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/pubsub/natspubsub" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() natsConn, err := nats.Connect("nats://nats.example.com") if err != nil { log.Fatal(err) } defer natsConn.Close() topic, err := natspubsub.OpenTopicV2(natsConn, "example.mysubject", nil) if err != nil { log.Fatal(err) } defer topic.Shutdown(ctx) } func Example_openTopicV2FromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/pubsub/natspubsub" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // pubsub.OpenTopic creates a *pubsub.Topic from a URL. // This URL will Dial the NATS server at the URL in the environment variable // NATS_SERVER_URL and send messages with subject "example.mysubject". // This URL will be parsed and the natsv2 attribute will be used to // use NATS v2.2.0+ native message headers as the message metadata. topic, err := pubsub.OpenTopic(ctx, "nats://example.mysubject?natsv2") if err != nil { log.Fatal(err) } defer topic.Shutdown(ctx) } func Example_openSubscriptionV2FromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/pubsub/natspubsub" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // pubsub.OpenSubscription creates a *pubsub.Subscription from a URL. // This URL will Dial the NATS server at the URL in the environment variable // NATS_SERVER_URL and receive messages with subject "example.mysubject". // This URL will be parsed and the natsv2 attribute will be used to // use NATS v2.2.0+ native message headers as the message metadata. subscription, err := pubsub.OpenSubscription(ctx, "nats://example.mysubject?natsv2") if err != nil { log.Fatal(err) } defer subscription.Shutdown(ctx) } ================================================ FILE: pubsub/natspubsub/go.mod ================================================ // Copyright 2018-2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. module gocloud.dev/pubsub/natspubsub go 1.25.0 require ( github.com/google/go-cmp v0.7.0 github.com/nats-io/nats-server/v2 v2.11.12 github.com/nats-io/nats.go v1.49.0 gocloud.dev v0.45.0 ) require ( github.com/antithesishq/antithesis-sdk-go v0.5.0-default-no-op // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/google/go-tpm v0.9.8 // indirect github.com/google/uuid v1.6.0 // indirect github.com/googleapis/gax-go/v2 v2.19.0 // indirect github.com/klauspost/compress v1.18.4 // indirect github.com/minio/highwayhash v1.0.4-0.20251030100505-070ab1a87a76 // indirect github.com/nats-io/jwt/v2 v2.8.0 // indirect github.com/nats-io/nkeys v0.4.15 // indirect github.com/nats-io/nuid v1.0.1 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/otel v1.42.0 // indirect go.opentelemetry.io/otel/metric v1.42.0 // indirect go.opentelemetry.io/otel/sdk v1.42.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.42.0 // indirect go.opentelemetry.io/otel/trace v1.42.0 // indirect golang.org/x/crypto v0.49.0 // indirect golang.org/x/net v0.52.0 // indirect golang.org/x/sync v0.20.0 // indirect golang.org/x/sys v0.42.0 // indirect golang.org/x/text v0.35.0 // indirect golang.org/x/time v0.15.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect google.golang.org/api v0.272.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260316180232-0b37fe3546d5 // indirect google.golang.org/grpc v1.79.3 // indirect google.golang.org/protobuf v1.36.11 // indirect ) replace gocloud.dev => ../../ ================================================ FILE: pubsub/natspubsub/go.sum ================================================ cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= cloud.google.com/go/auth v0.18.2 h1:+Nbt5Ev0xEqxlNjd6c+yYUeosQ5TtEUaNcN/3FozlaM= cloud.google.com/go/auth v0.18.2/go.mod h1:xD+oY7gcahcu7G2SG2DsBerfFxgPAJz17zz2joOFF3M= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= cloud.google.com/go/pubsub v1.50.1 h1:fzbXpPyJnSGvWXF1jabhQeXyxdbCIkXTpjXHy7xviBM= cloud.google.com/go/pubsub v1.50.1/go.mod h1:6YVJv3MzWJUVdvQXG081sFvS0dWQOdnV+oTo++q/xFk= cloud.google.com/go/pubsub/v2 v2.4.0 h1:oMKNiBQpXImRWnHYla9uSU66ZzByZwBSCJOEs/pTKVg= cloud.google.com/go/pubsub/v2 v2.4.0/go.mod h1:2lS/XQKq5qtOMs6kHBK+WX1ytUC36kLl2ig3zqsGUx8= github.com/antithesishq/antithesis-sdk-go v0.5.0-default-no-op h1:Ucf+QxEKMbPogRO5guBNe5cgd9uZgfoJLOYs8WWhtjM= github.com/antithesishq/antithesis-sdk-go v0.5.0-default-no-op/go.mod h1:IUpT2DPAKh6i/YhSbt6Gl3v2yvUZjmKncl7U91fup7E= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/go-tpm v0.9.8 h1:slArAR9Ft+1ybZu0lBwpSmpwhRXaa85hWtMinMyRAWo= github.com/google/go-tpm v0.9.8/go.mod h1:h9jEsEECg7gtLis0upRBQU+GhYVH6jMjrFxI8u6bVUY= github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.3.14 h1:yh8ncqsbUY4shRD5dA6RlzjJaT4hi3kII+zYw8wmLb8= github.com/googleapis/enterprise-certificate-proxy v0.3.14/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= github.com/googleapis/gax-go/v2 v2.19.0 h1:fYQaUOiGwll0cGj7jmHT/0nPlcrZDFPrZRhTsoCr8hE= github.com/googleapis/gax-go/v2 v2.19.0/go.mod h1:w2ROXVdfGEVFXzmlciUU4EdjHgWvB5h2n6x/8XSTTJA= github.com/klauspost/compress v1.18.4 h1:RPhnKRAQ4Fh8zU2FY/6ZFDwTVTxgJ/EMydqSTzE9a2c= github.com/klauspost/compress v1.18.4/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= github.com/minio/highwayhash v1.0.4-0.20251030100505-070ab1a87a76 h1:KGuD/pM2JpL9FAYvBrnBBeENKZNh6eNtjqytV6TYjnk= github.com/minio/highwayhash v1.0.4-0.20251030100505-070ab1a87a76/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= github.com/nats-io/jwt/v2 v2.8.0 h1:K7uzyz50+yGZDO5o772eRE7atlcSEENpL7P+b74JV1g= github.com/nats-io/jwt/v2 v2.8.0/go.mod h1:me11pOkwObtcBNR8AiMrUbtVOUGkqYjMQZ6jnSdVUIA= github.com/nats-io/nats-server/v2 v2.11.12 h1:jGDXTkcjqQ5fCRstwIxvv1K0RHfftFUoSCT/iIZcqOc= github.com/nats-io/nats-server/v2 v2.11.12/go.mod h1:5MCp/pqm5SEfsvVZ31ll1088ZTwEUdvRX1Hmh/mTTDg= github.com/nats-io/nats.go v1.49.0 h1:yh/WvY59gXqYpgl33ZI+XoVPKyut/IcEaqtsiuTJpoE= github.com/nats-io/nats.go v1.49.0/go.mod h1:fDCn3mN5cY8HooHwE2ukiLb4p4G4ImmzvXyJt+tGwdw= github.com/nats-io/nkeys v0.4.15 h1:JACV5jRVO9V856KOapQ7x+EY8Jo3qw1vJt/9Jpwzkk4= github.com/nats-io/nkeys v0.4.15/go.mod h1:CpMchTXC9fxA5zrMo4KpySxNjiDVvr8ANOSZdiNfUrs= github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0 h1:yI1/OhfEPy7J9eoa6Sj051C7n5dvpj0QX8g4sRchg04= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0/go.mod h1:NoUCKYWK+3ecatC4HjkRktREheMeEtrXoQxrqYFeHSc= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 h1:OyrsyzuttWTSur2qN/Lm0m2a8yqyIjUVBZcxFPuXq2o= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0/go.mod h1:C2NGBr+kAB4bk3xtMXfZ94gqFDtg/GkI7e9zqGh5Beg= go.opentelemetry.io/otel v1.42.0 h1:lSQGzTgVR3+sgJDAU/7/ZMjN9Z+vUip7leaqBKy4sho= go.opentelemetry.io/otel v1.42.0/go.mod h1:lJNsdRMxCUIWuMlVJWzecSMuNjE7dOYyWlqOXWkdqCc= go.opentelemetry.io/otel/metric v1.42.0 h1:2jXG+3oZLNXEPfNmnpxKDeZsFI5o4J+nz6xUlaFdF/4= go.opentelemetry.io/otel/metric v1.42.0/go.mod h1:RlUN/7vTU7Ao/diDkEpQpnz3/92J9ko05BIwxYa2SSI= go.opentelemetry.io/otel/sdk v1.42.0 h1:LyC8+jqk6UJwdrI/8VydAq/hvkFKNHZVIWuslJXYsDo= go.opentelemetry.io/otel/sdk v1.42.0/go.mod h1:rGHCAxd9DAph0joO4W6OPwxjNTYWghRWmkHuGbayMts= go.opentelemetry.io/otel/sdk/metric v1.42.0 h1:D/1QR46Clz6ajyZ3G8SgNlTJKBdGp84q9RKCAZ3YGuA= go.opentelemetry.io/otel/sdk/metric v1.42.0/go.mod h1:Ua6AAlDKdZ7tdvaQKfSmnFTdHx37+J4ba8MwVCYM5hc= go.opentelemetry.io/otel/trace v1.42.0 h1:OUCgIPt+mzOnaUTpOQcBiM/PLQ/Op7oq6g4LenLmOYY= go.opentelemetry.io/otel/trace v1.42.0/go.mod h1:f3K9S+IFqnumBkKhRJMeaZeNk9epyhnCmQh/EysQCdc= golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= google.golang.org/api v0.272.0 h1:eLUQZGnAS3OHn31URRf9sAmRk3w2JjMx37d2k8AjJmA= google.golang.org/api v0.272.0/go.mod h1:wKjowi5LNJc5qarNvDCvNQBn3rVK8nSy6jg2SwRwzIA= google.golang.org/genproto v0.0.0-20260316180232-0b37fe3546d5 h1:JNfk58HZ8lfmXbYK2vx/UvsqIL59TzByCxPIX4TDmsE= google.golang.org/genproto v0.0.0-20260316180232-0b37fe3546d5/go.mod h1:x5julN69+ED4PcFk/XWayw35O0lf/nGa4aNgODCmNmw= google.golang.org/genproto/googleapis/api v0.0.0-20260316180232-0b37fe3546d5 h1:CogIeEXn4qWYzzQU0QqvYBM8yDF9cFYzDq9ojSpv0Js= google.golang.org/genproto/googleapis/api v0.0.0-20260316180232-0b37fe3546d5/go.mod h1:EIQZ5bFCfRQDV4MhRle7+OgjNtZ6P1PiZBgAKuxXu/Y= google.golang.org/genproto/googleapis/rpc v0.0.0-20260316180232-0b37fe3546d5 h1:aJmi6DVGGIStN9Mobk/tZOOQUBbj0BPjZjjnOdoZKts= google.golang.org/genproto/googleapis/rpc v0.0.0-20260316180232-0b37fe3546d5/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= ================================================ FILE: pubsub/natspubsub/nats.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package natspubsub provides a pubsub implementation for NATS.io. Use OpenTopic to // construct a *pubsub.Topic, and/or OpenSubscription to construct a // *pubsub.Subscription. This package uses gob to encode and decode driver.Message to // []byte. // // # URLs // // For pubsub.OpenTopic and pubsub.OpenSubscription, natspubsub registers // for the scheme "nats". // The default URL opener will connect to a default server based on the // environment variable "NATS_SERVER_URL". // // For servers that support it (NATS Server 2.2.0 or later), messages can // be encoded using native NATS message headers, and native message content. // This provides full support for non-Go clients. Versions prior to 2.2.0 // uses gob.Encoder to encode the message headers and content, which limits // the subscribers only to Go clients. // To use this feature, set the query parameter "natsv2" in the URL. // If no value is provided, it assumes the value is true. Otherwise, the value // needs to be parsable as a boolean. For example: // - nats://mysubject?natsv2 // - nats://mysubject?natsv2=true // // This feature can also be enabled by setting the UseV2 field in the // URLOpener. // If the server does not support this feature, any attempt to use it will // result in an error. // Using native NATS message headers and content is more efficient than using // gob.Encoder, and allows non-Go clients to subscribe to the topic and // receive messages. It is recommended to use this feature if the server // supports it. // // To customize the URL opener, or for more details on the URL format, // see URLOpener. // See https://gocloud.dev/concepts/urls/ for background information. // // # Message Delivery Semantics // // NATS supports at-most-semantics; applications need not call Message.Ack, // and must not call Message.Nack. // See https://godoc.org/gocloud.dev/pubsub#hdr-At_most_once_and_At_least_once_Delivery // for more background. // // # As // // natspubsub exposes the following types for As: // - Topic: *nats.Conn // - Subscription: *nats.Subscription // - Message.BeforeSend: None for v1, *nats.Msg for v2. // - Message.AfterSend: None. // - Message: *nats.Msg package natspubsub // import "gocloud.dev/pubsub/natspubsub" import ( "bytes" "context" "encoding/gob" "errors" "fmt" "net/url" "os" "path" "regexp" "strconv" "strings" "sync" "time" "github.com/nats-io/nats.go" "gocloud.dev/gcerrors" "gocloud.dev/pubsub" "gocloud.dev/pubsub/batcher" "gocloud.dev/pubsub/driver" ) var errNotInitialized = errors.New("natspubsub: topic not initialized") var recvBatcherOpts = &batcher.Options{ // NATS has at-most-once semantics, meaning once it delivers a message, the // message won't be delivered again. // Therefore, we can't allow the portable type to read-ahead and queue any // messages; they might end up undelivered if the user never calls Receive // to get them. Setting both the MaxBatchSize and MaxHandlers to one means // that we'll only return a message at a time, which should be immediately // returned to the user. // // Note: there is a race condition where the original Receive that // triggered a call to ReceiveBatch ends up failing (e.g., due to a // Done context), and ReceiveBatch returns a message that ends up being // queued for the next Receive. That message is at risk of being dropped. // This seems OK. MaxBatchSize: 1, MaxHandlers: 1, // max concurrency for receives } func init() { o := new(defaultDialer) pubsub.DefaultURLMux().RegisterTopic(Scheme, o) pubsub.DefaultURLMux().RegisterSubscription(Scheme, o) } // defaultDialer dials a default NATS server based on the environment // variable "NATS_SERVER_URL". type defaultDialer struct { init sync.Once err error opener URLOpener openerV2 URLOpener } func (o *defaultDialer) defaultConn(ctx context.Context) error { o.init.Do(func() { serverURL := os.Getenv("NATS_SERVER_URL") if serverURL == "" { o.err = errors.New("NATS_SERVER_URL environment variable not set") return } conn, err := nats.Connect(serverURL) if err != nil { o.err = fmt.Errorf("failed to dial NATS_SERVER_URL %q: %v", serverURL, err) return } o.opener = URLOpener{Connection: conn} o.openerV2 = URLOpener{Connection: conn, UseV2: true} }) return o.err } type serverVersion struct { major, minor, patch int } func (o *defaultDialer) OpenTopicURL(ctx context.Context, u *url.URL) (*pubsub.Topic, error) { err := o.defaultConn(ctx) if err != nil { return nil, fmt.Errorf("open topic %v: failed to open default connection: %v", u, err) } useV2, err := queryUseV2(u.Query()) if err != nil { return nil, fmt.Errorf("open topic %v: %v", u, err) } if useV2 { return o.openerV2.OpenTopicURL(ctx, u) } return o.opener.OpenTopicURL(ctx, u) } func (o *defaultDialer) OpenSubscriptionURL(ctx context.Context, u *url.URL) (*pubsub.Subscription, error) { err := o.defaultConn(ctx) if err != nil { return nil, fmt.Errorf("open subscription %v: failed to open default connection: %v", u, err) } useV2, err := queryUseV2(u.Query()) if err != nil { return nil, fmt.Errorf("open subscription %v: %v", u, err) } if useV2 { return o.openerV2.OpenSubscriptionURL(ctx, u) } return o.opener.OpenSubscriptionURL(ctx, u) } var semVerRegexp = regexp.MustCompile(`\Av?([0-9]+)\.?([0-9]+)?\.?([0-9]+)?`) func parseServerVersion(version string) (serverVersion, error) { m := semVerRegexp.FindStringSubmatch(version) if m == nil { return serverVersion{}, errors.New("failed to parse server version") } var ( major, minor, patch int err error ) major, err = strconv.Atoi(m[1]) if err != nil { return serverVersion{}, fmt.Errorf("failed to parse server version major number %q: %v", m[1], err) } minor, err = strconv.Atoi(m[2]) if err != nil { return serverVersion{}, fmt.Errorf("failed to parse server version minor number %q: %v", m[2], err) } patch, err = strconv.Atoi(m[3]) if err != nil { return serverVersion{}, fmt.Errorf("failed to parse server version patch number %q: %v", m[3], err) } return serverVersion{major: major, minor: minor, patch: patch}, nil } // Scheme is the URL scheme natspubsub registers its URLOpeners under on pubsub.DefaultMux. const Scheme = "nats" // URLOpener opens NATS URLs like "nats://mysubject?natsv2=true". // // The URL host+path is used as the subject. // // No query parameters are supported. type URLOpener struct { // Connection to use for communication with the server. Connection *nats.Conn // TopicOptions specifies the options to pass to OpenTopic. TopicOptions TopicOptions // SubscriptionOptions specifies the options to pass to OpenSubscription. SubscriptionOptions SubscriptionOptions // UseV2 indicates whether the NATS Server is at least version 2.2.0. UseV2 bool } const natsV2QueryParameter = "natsv2" // OpenTopicURL opens a pubsub.Topic based on u. func (o *URLOpener) OpenTopicURL(ctx context.Context, u *url.URL) (*pubsub.Topic, error) { for param := range u.Query() { if strings.ToLower(param) == natsV2QueryParameter { continue } return nil, fmt.Errorf("open topic %v: invalid query parameter %s", u, param) } subject := path.Join(u.Host, u.Path) if o.UseV2 { return OpenTopicV2(o.Connection, subject, &o.TopicOptions) } return OpenTopic(o.Connection, subject, &o.TopicOptions) } // OpenSubscriptionURL opens a pubsub.Subscription based on u. func (o *URLOpener) OpenSubscriptionURL(ctx context.Context, u *url.URL) (*pubsub.Subscription, error) { opts := o.SubscriptionOptions for param, values := range u.Query() { switch strings.ToLower(param) { case natsV2QueryParameter: continue case "queue": if len(values) != 1 { return nil, fmt.Errorf("open subscription %v: invalid query parameter %s", u, param) } opts.Queue = values[0] default: return nil, fmt.Errorf("open subscription %v: invalid query parameter %s", u, param) } } subject := path.Join(u.Host, u.Path) if o.UseV2 { return OpenSubscriptionV2(o.Connection, subject, &opts) } return OpenSubscription(o.Connection, subject, &opts) } // TopicOptions sets options for constructing a *pubsub.Topic backed by NATS. type TopicOptions struct{} // SubscriptionOptions sets options for constructing a *pubsub.Subscription // backed by NATS. type SubscriptionOptions struct { // Queue sets the subscription as a QueueSubcription. // For more info, see https://docs.nats.io/nats-concepts/queue. Queue string } type topic struct { useV2 bool nc *nats.Conn subj string } // OpenTopic returns a *pubsub.Topic for use with NATS. // The subject is the NATS Subject; for more info, see // https://nats.io/documentation/writing_applications/subjects. func OpenTopic(nc *nats.Conn, subject string, _ *TopicOptions) (*pubsub.Topic, error) { dt, err := openTopic(nc, subject, false) if err != nil { return nil, err } return pubsub.NewTopic(dt, nil), nil } // OpenTopicV2 returns a *pubsub.Topic for use with NATS at least version 2.2.0. // This changes the encoding of the message as, starting with version 2.2.0, NATS supports message headers. // In previous versions the message headers were encoded along with the message content using gob.Encoder, // which limits the subscribers only to Go clients. // This implementation uses native NATS message headers, and native message content, which provides full support // for non-Go clients. func OpenTopicV2(nc *nats.Conn, subject string, _ *TopicOptions) (*pubsub.Topic, error) { dt, err := openTopic(nc, subject, true) if err != nil { return nil, err } return pubsub.NewTopic(dt, nil), nil } // openTopic returns the driver for OpenTopic. This function exists so the test // harness can get the driver interface implementation if it needs to. func openTopic(nc *nats.Conn, subject string, useV2 bool) (driver.Topic, error) { if nc == nil { return nil, errors.New("natspubsub: nats.Conn is required") } if useV2 { sv, err := parseServerVersion(nc.ConnectedServerVersion()) if err != nil { return nil, fmt.Errorf("failed to parse NATS server version %q: %v", nc.ConnectedServerVersion(), err) } // Check if the server version is at least 2.2.0. if sv.major < 2 && sv.minor < 2 { return nil, fmt.Errorf("natspubsub: NATS server version %q is not supported", nc.ConnectedServerVersion()) } } return &topic{nc: nc, subj: subject, useV2: useV2}, nil } // SendBatch implements driver.Topic.SendBatch. func (t *topic) SendBatch(ctx context.Context, msgs []*driver.Message) error { if t == nil || t.nc == nil { return errNotInitialized } for _, m := range msgs { err := ctx.Err() if err != nil { return err } if t.useV2 { err = t.sendMessageV2(m) } else { err = t.sendMessage(m) } if err != nil { return err } } // Per specification this is supposed to only return after // a message has been sent. Normally NATS is very efficient // at sending messages in batches on its own and also handles // disconnected buffering during a reconnect event. We will // let NATS handle this for now. If needed we could add a // FlushWithContext() call which ensures the connected server // has processed all the messages. return nil } func (t *topic) sendMessage(m *driver.Message) error { // TODO(jba): benchmark message encoding to see if it's // worth reusing a buffer. payload, err := encodeMessage(m) if err != nil { return err } if m.BeforeSend != nil { asFunc := func(i any) bool { return false } if err := m.BeforeSend(asFunc); err != nil { return err } } if err = t.nc.Publish(t.subj, payload); err != nil { return err } if m.AfterSend != nil { asFunc := func(i any) bool { return false } if err := m.AfterSend(asFunc); err != nil { return err } } return nil } func (t *topic) sendMessageV2(m *driver.Message) error { msg := encodeMessageV2(m, t.subj) if m.BeforeSend != nil { asFunc := func(i any) bool { if nm, ok := i.(**nats.Msg); ok { *nm = msg return true } return false } if err := m.BeforeSend(asFunc); err != nil { return err } } if err := t.nc.PublishMsg(msg); err != nil { return err } if m.AfterSend != nil { asFunc := func(i any) bool { return false } if err := m.AfterSend(asFunc); err != nil { return err } } return nil } // IsRetryable implements driver.Topic.IsRetryable. func (*topic) IsRetryable(error) bool { return false } // As implements driver.Topic.As. func (t *topic) As(i any) bool { c, ok := i.(**nats.Conn) if !ok { return false } *c = t.nc return true } // ErrorAs implements driver.Topic.ErrorAs func (*topic) ErrorAs(error, any) bool { return false } // ErrorCode implements driver.Topic.ErrorCode func (*topic) ErrorCode(err error) gcerrors.ErrorCode { switch err { case nil: return gcerrors.OK case context.Canceled: return gcerrors.Canceled case errNotInitialized: return gcerrors.NotFound case nats.ErrBadSubject: return gcerrors.FailedPrecondition case nats.ErrAuthorization: return gcerrors.PermissionDenied case nats.ErrMaxPayload, nats.ErrReconnectBufExceeded: return gcerrors.ResourceExhausted } return gcerrors.Unknown } // Close implements driver.Topic.Close. func (*topic) Close() error { return nil } type subscription struct { useV2 bool nc *nats.Conn nsub *nats.Subscription nextID int } // OpenSubscription returns a *pubsub.Subscription representing a NATS subscription or NATS queue subscription. // The subject is the NATS Subject to subscribe to; // for more info, see https://nats.io/documentation/writing_applications/subjects. func OpenSubscription(nc *nats.Conn, subject string, opts *SubscriptionOptions) (*pubsub.Subscription, error) { ds, err := openSubscription(nc, subject, opts, false) if err != nil { return nil, err } return pubsub.NewSubscription(ds, recvBatcherOpts, nil), nil } // OpenSubscriptionV2 returns a *pubsub.Subscription representing a NATS subscription or NATS queue subscription // for use with NATS at least version 2.2.0. // This changes the encoding of the message as, starting with version 2.2.0, NATS supports message headers. // In previous versions the message headers were encoded along with the message content using gob.Encoder, // which limits the subscribers only to Go clients. // This implementation uses native NATS message headers, and native message content, which provides full support // for non-Go clients. func OpenSubscriptionV2(nc *nats.Conn, subject string, opts *SubscriptionOptions) (*pubsub.Subscription, error) { ds, err := openSubscription(nc, subject, opts, true) if err != nil { return nil, err } return pubsub.NewSubscription(ds, recvBatcherOpts, nil), nil } func openSubscription(nc *nats.Conn, subject string, opts *SubscriptionOptions, useV2 bool) (driver.Subscription, error) { var sub *nats.Subscription var err error if opts != nil && opts.Queue != "" { sub, err = nc.QueueSubscribeSync(subject, opts.Queue) } else { sub, err = nc.SubscribeSync(subject) } if err != nil { return nil, err } return &subscription{nc: nc, nsub: sub, nextID: 1, useV2: useV2}, nil } // ReceiveBatch implements driver.ReceiveBatch. func (s *subscription) ReceiveBatch(ctx context.Context, _ int) ([]*driver.Message, error) { if s == nil || s.nsub == nil { return nil, nats.ErrBadSubscription } msg, err := s.nsub.NextMsg(100 * time.Millisecond) if err != nil { if err == nats.ErrTimeout { return nil, nil } return nil, err } var dm *driver.Message if s.useV2 { dm, err = decodeMessageV2(msg) } else { dm, err = decode(msg) } if err != nil { return nil, err } dm.LoggableID = fmt.Sprintf("msg #%d", s.nextID) s.nextID++ return []*driver.Message{dm}, nil } // Convert NATS msgs to *driver.Message. func decode(msg *nats.Msg) (*driver.Message, error) { if msg == nil { return nil, nats.ErrInvalidMsg } var dm driver.Message if err := decodeMessage(msg.Data, &dm); err != nil { return nil, err } dm.AckID = -1 // Not applicable to NATS dm.AsFunc = messageAsFunc(msg) return &dm, nil } func messageAsFunc(msg *nats.Msg) func(any) bool { return func(i any) bool { p, ok := i.(**nats.Msg) if !ok { return false } *p = msg return true } } // SendAcks implements driver.Subscription.SendAcks. func (s *subscription) SendAcks(ctx context.Context, ids []driver.AckID) error { // Ack is a no-op. return nil } // CanNack implements driver.CanNack. func (s *subscription) CanNack() bool { return false } // SendNacks implements driver.Subscription.SendNacks. It should never be called // because we return false for CanNack. func (s *subscription) SendNacks(ctx context.Context, ids []driver.AckID) error { panic("unreachable") } // IsRetryable implements driver.Subscription.IsRetryable. func (s *subscription) IsRetryable(error) bool { return false } // As implements driver.Subscription.As. func (s *subscription) As(i any) bool { c, ok := i.(**nats.Subscription) if !ok { return false } *c = s.nsub return true } // ErrorAs implements driver.Subscription.ErrorAs func (*subscription) ErrorAs(error, any) bool { return false } // ErrorCode implements driver.Subscription.ErrorCode func (*subscription) ErrorCode(err error) gcerrors.ErrorCode { switch err { case nil: return gcerrors.OK case context.Canceled: return gcerrors.Canceled case errNotInitialized, nats.ErrBadSubscription: return gcerrors.NotFound case nats.ErrBadSubject, nats.ErrTypeSubscription: return gcerrors.FailedPrecondition case nats.ErrAuthorization: return gcerrors.PermissionDenied case nats.ErrMaxMessages, nats.ErrSlowConsumer: return gcerrors.ResourceExhausted case nats.ErrTimeout: return gcerrors.DeadlineExceeded } return gcerrors.Unknown } // Close implements driver.Subscription.Close. func (*subscription) Close() error { return nil } func encodeMessage(dm *driver.Message) ([]byte, error) { var buf bytes.Buffer enc := gob.NewEncoder(&buf) if len(dm.Metadata) == 0 { return dm.Body, nil } if err := enc.Encode(dm.Metadata); err != nil { return nil, err } if err := enc.Encode(dm.Body); err != nil { return nil, err } return buf.Bytes(), nil } func decodeMessage(data []byte, dm *driver.Message) error { buf := bytes.NewBuffer(data) dec := gob.NewDecoder(buf) if err := dec.Decode(&dm.Metadata); err != nil { // This may indicate a normal NATS message, so just treat as the body. dm.Metadata = nil dm.Body = data return nil } return dec.Decode(&dm.Body) } func queryUseV2(q url.Values) (bool, error) { if len(q) == 0 { return false, nil } v, ok := q[natsV2QueryParameter] if !ok { return false, nil } if len(v) == 0 { // If the query parameter was provided without any value i.e. nats://mysubject?natsv2 // it assumes the value is true. return true, nil } if len(v) > 1 { return false, fmt.Errorf("invalid query parameter %s - multiple values provided", natsV2QueryParameter) } if v[0] == "" { return true, nil } useV2, err := strconv.ParseBool(v[0]) if err != nil { return false, fmt.Errorf("invalid query parameter %s - value either needs to be parsable as a boolean or empty", natsV2QueryParameter) } return useV2, nil } func encodeMessageV2(dm *driver.Message, sub string) *nats.Msg { var header nats.Header if dm.Metadata != nil { header = nats.Header{} for k, v := range dm.Metadata { header[url.QueryEscape(k)] = []string{url.QueryEscape(v)} } } return &nats.Msg{ Subject: sub, Data: dm.Body, Header: header, } } func decodeMessageV2(msg *nats.Msg) (*driver.Message, error) { if msg == nil { return nil, nats.ErrInvalidMsg } dm := driver.Message{ AsFunc: messageAsFunc(msg), Body: msg.Data, } if msg.Header != nil { dm.Metadata = map[string]string{} for k, v := range msg.Header { var sv string if len(v) > 0 { sv = v[0] } kb, err := url.QueryUnescape(k) if err != nil { return nil, err } vb, err := url.QueryUnescape(sv) if err != nil { return nil, err } dm.Metadata[kb] = vb } } return &dm, nil } ================================================ FILE: pubsub/natspubsub/nats_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package natspubsub import ( "bytes" "context" "fmt" "os" "testing" "gocloud.dev/gcerrors" "gocloud.dev/pubsub" "gocloud.dev/pubsub/driver" "gocloud.dev/pubsub/drivertest" "github.com/google/go-cmp/cmp" "github.com/nats-io/nats-server/v2/server" gnatsd "github.com/nats-io/nats-server/v2/test" "github.com/nats-io/nats.go" ) const ( testPort = 11222 benchPort = 9222 ) type harness struct { s *server.Server nc *nats.Conn useV2 bool } func newHarness(ctx context.Context, t *testing.T) (drivertest.Harness, error) { opts := gnatsd.DefaultTestOptions opts.Port = testPort s := gnatsd.RunServer(&opts) nc, err := nats.Connect(fmt.Sprintf("nats://127.0.0.1:%d", testPort)) if err != nil { return nil, err } return &harness{s: s, nc: nc, useV2: false}, nil } func newHarnessV2(ctx context.Context, t *testing.T) (drivertest.Harness, error) { opts := gnatsd.DefaultTestOptions opts.Port = testPort s := gnatsd.RunServer(&opts) nc, err := nats.Connect(fmt.Sprintf("nats://127.0.0.1:%d", testPort)) if err != nil { return nil, err } return &harness{s: s, nc: nc, useV2: true}, nil } func (h *harness) CreateTopic(ctx context.Context, testName string) (driver.Topic, func(), error) { cleanup := func() {} dt, err := openTopic(h.nc, testName, h.useV2) if err != nil { return nil, nil, err } return dt, cleanup, nil } func (h *harness) MakeNonexistentTopic(ctx context.Context) (driver.Topic, error) { // A nil *topic behaves like a nonexistent topic. return (*topic)(nil), nil } func (h *harness) CreateSubscription(ctx context.Context, dt driver.Topic, testName string) (driver.Subscription, func(), error) { ds, err := openSubscription(h.nc, testName, nil, h.useV2) if err != nil { return nil, nil, err } cleanup := func() { var sub *nats.Subscription if ds.As(&sub) { sub.Unsubscribe() } } return ds, cleanup, nil } func (h *harness) CreateQueueSubscription(ctx context.Context, dt driver.Topic, testName string) (driver.Subscription, func(), error) { ds, err := openSubscription(h.nc, testName, &SubscriptionOptions{Queue: testName}, h.useV2) if err != nil { return nil, nil, err } cleanup := func() { var sub *nats.Subscription if ds.As(&sub) { sub.Unsubscribe() } } return ds, cleanup, nil } func (h *harness) MakeNonexistentSubscription(ctx context.Context) (driver.Subscription, func(), error) { return (*subscription)(nil), func() {}, nil } func (h *harness) Close() { h.nc.Close() h.s.Shutdown() } func (h *harness) MaxBatchSizes() (int, int) { return 0, 0 } func (*harness) SupportsMultipleSubscriptions() bool { return true } type natsAsTest struct { useV2 bool } func (natsAsTest) Name() string { return "nats test" } func (natsAsTest) TopicCheck(topic *pubsub.Topic) error { var c2 nats.Conn if topic.As(&c2) { return fmt.Errorf("cast succeeded for %T, want failure", &c2) } var c3 *nats.Conn if !topic.As(&c3) { return fmt.Errorf("cast failed for %T", &c3) } return nil } func (natsAsTest) SubscriptionCheck(sub *pubsub.Subscription) error { var c2 nats.Subscription if sub.As(&c2) { return fmt.Errorf("cast succeeded for %T, want failure", &c2) } var c3 *nats.Subscription if !sub.As(&c3) { return fmt.Errorf("cast failed for %T", &c3) } return nil } func (natsAsTest) TopicErrorCheck(t *pubsub.Topic, err error) error { var dummy string if t.ErrorAs(err, &dummy) { return fmt.Errorf("cast succeeded for %T, want failure", &dummy) } return nil } func (natsAsTest) SubscriptionErrorCheck(s *pubsub.Subscription, err error) error { var dummy string if s.ErrorAs(err, &dummy) { return fmt.Errorf("cast succeeded for %T, want failure", &dummy) } return nil } func (natsAsTest) MessageCheck(m *pubsub.Message) error { var pm nats.Msg if m.As(&pm) { return fmt.Errorf("cast succeeded for %T, want failure", &pm) } var ppm *nats.Msg if !m.As(&ppm) { return fmt.Errorf("cast failed for %T", &ppm) } return nil } func (n natsAsTest) BeforeSend(as func(any) bool) error { if !n.useV2 { return nil } var pm nats.Msg if as(&pm) { return fmt.Errorf("cast succeeded for %T, want failure", &pm) } var ppm *nats.Msg if !as(&ppm) { return fmt.Errorf("cast failed for %T", &ppm) } return nil } func (natsAsTest) AfterSend(as func(any) bool) error { return nil } func TestConformance(t *testing.T) { asTests := []drivertest.AsTest{natsAsTest{}} drivertest.RunConformanceTests(t, newHarness, asTests) } func TestConformanceV2(t *testing.T) { asTests := []drivertest.AsTest{natsAsTest{useV2: true}} drivertest.RunConformanceTests(t, newHarnessV2, asTests) } // These are natspubsub specific to increase coverage. // If we only send a body we should be able to get that from a direct NATS subscriber. func TestInteropWithDirectNATS(t *testing.T) { ctx := context.Background() dh, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer dh.Close() conn := dh.(*harness).nc const topic = "foo" body := []byte("hello") // Send a message using Go CDK and receive it using NATS directly. pt, err := OpenTopic(conn, topic, nil) if err != nil { t.Fatal(err) } defer pt.Shutdown(ctx) nsub, _ := conn.SubscribeSync(topic) if err = pt.Send(ctx, &pubsub.Message{Body: body}); err != nil { t.Fatal(err) } m, err := nsub.NextMsgWithContext(ctx) if err != nil { t.Fatal(err.Error()) } if !bytes.Equal(m.Data, body) { t.Fatalf("Data did not match. %q vs %q\n", m.Data, body) } // Send a message using NATS directly and receive it using Go CDK. ps, err := OpenSubscription(conn, topic, nil) if err != nil { t.Fatal(err) } defer ps.Shutdown(ctx) if err := conn.Publish(topic, body); err != nil { t.Fatal(err) } msg, err := ps.Receive(ctx) if err != nil { t.Fatal(err) } defer msg.Ack() if !bytes.Equal(msg.Body, body) { t.Fatalf("Data did not match. %q vs %q\n", m.Data, body) } } // These are natspubsub specific to increase coverage. // If we only send a body we should be able to get that from a direct NATS subscriber. func TestInteropWithDirectNATSV2(t *testing.T) { ctx := context.Background() dh, err := newHarnessV2(ctx, t) if err != nil { t.Fatal(err) } defer dh.Close() conn := dh.(*harness).nc const topic = "foo" // In version V2 we can use metadata which will be natively used in the nats message. md := map[string]string{"a": "1", "b": "2", "c": "3"} body := []byte("hello") // Send a message using Go CDK and receive it using NATS directly. pt, err := OpenTopicV2(conn, topic, nil) if err != nil { t.Fatal(err) } defer pt.Shutdown(ctx) nsub, _ := conn.SubscribeSync(topic) if err = pt.Send(ctx, &pubsub.Message{Body: body, Metadata: md}); err != nil { t.Fatal(err) } m, err := nsub.NextMsgWithContext(ctx) if err != nil { t.Fatal(err.Error()) } if !bytes.Equal(m.Data, body) { t.Fatalf("Data did not match. %q vs %q\n", m.Data, body) } for k, v := range md { if m.Header.Get(k) != v { t.Fatalf("Metadata %q did not match. %q vs %q\n", k, m.Header.Get(k), v) } } // Send a message using NATS directly and receive it using Go CDK. ps, err := OpenSubscriptionV2(conn, topic, nil) if err != nil { t.Fatal(err) } defer ps.Shutdown(ctx) if err := conn.Publish(topic, body); err != nil { t.Fatal(err) } msg, err := ps.Receive(ctx) if err != nil { t.Fatal(err) } defer msg.Ack() if !bytes.Equal(msg.Body, body) { t.Fatalf("Data did not match. %q vs %q\n", m.Data, body) } } func TestErrorCode(t *testing.T) { ctx := context.Background() dh, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer dh.Close() h := dh.(*harness) // Topics dt, err := openTopic(h.nc, "bar", false) if err != nil { t.Fatal(err) } if gce := dt.ErrorCode(nil); gce != gcerrors.OK { t.Fatalf("Expected %v, got %v", gcerrors.OK, gce) } if gce := dt.ErrorCode(context.Canceled); gce != gcerrors.Canceled { t.Fatalf("Expected %v, got %v", gcerrors.Canceled, gce) } if gce := dt.ErrorCode(nats.ErrBadSubject); gce != gcerrors.FailedPrecondition { t.Fatalf("Expected %v, got %v", gcerrors.FailedPrecondition, gce) } if gce := dt.ErrorCode(nats.ErrAuthorization); gce != gcerrors.PermissionDenied { t.Fatalf("Expected %v, got %v", gcerrors.PermissionDenied, gce) } if gce := dt.ErrorCode(nats.ErrMaxPayload); gce != gcerrors.ResourceExhausted { t.Fatalf("Expected %v, got %v", gcerrors.ResourceExhausted, gce) } if gce := dt.ErrorCode(nats.ErrReconnectBufExceeded); gce != gcerrors.ResourceExhausted { t.Fatalf("Expected %v, got %v", gcerrors.ResourceExhausted, gce) } // Subscriptions ds, err := openSubscription(h.nc, "bar", nil, false) if err != nil { t.Fatal(err) } if gce := ds.ErrorCode(nil); gce != gcerrors.OK { t.Fatalf("Expected %v, got %v", gcerrors.OK, gce) } if gce := ds.ErrorCode(context.Canceled); gce != gcerrors.Canceled { t.Fatalf("Expected %v, got %v", gcerrors.Canceled, gce) } if gce := ds.ErrorCode(nats.ErrBadSubject); gce != gcerrors.FailedPrecondition { t.Fatalf("Expected %v, got %v", gcerrors.FailedPrecondition, gce) } if gce := ds.ErrorCode(nats.ErrBadSubscription); gce != gcerrors.NotFound { t.Fatalf("Expected %v, got %v", gcerrors.NotFound, gce) } if gce := ds.ErrorCode(nats.ErrTypeSubscription); gce != gcerrors.FailedPrecondition { t.Fatalf("Expected %v, got %v", gcerrors.FailedPrecondition, gce) } if gce := ds.ErrorCode(nats.ErrAuthorization); gce != gcerrors.PermissionDenied { t.Fatalf("Expected %v, got %v", gcerrors.PermissionDenied, gce) } if gce := ds.ErrorCode(nats.ErrMaxMessages); gce != gcerrors.ResourceExhausted { t.Fatalf("Expected %v, got %v", gcerrors.ResourceExhausted, gce) } if gce := ds.ErrorCode(nats.ErrSlowConsumer); gce != gcerrors.ResourceExhausted { t.Fatalf("Expected %v, got %v", gcerrors.ResourceExhausted, gce) } if gce := ds.ErrorCode(nats.ErrTimeout); gce != gcerrors.DeadlineExceeded { t.Fatalf("Expected %v, got %v", gcerrors.DeadlineExceeded, gce) } // Queue Subscription qs, err := openSubscription(h.nc, "bar", &SubscriptionOptions{Queue: t.Name()}, false) if err != nil { t.Fatal(err) } if gce := qs.ErrorCode(nil); gce != gcerrors.OK { t.Fatalf("Expected %v, got %v", gcerrors.OK, gce) } if gce := qs.ErrorCode(context.Canceled); gce != gcerrors.Canceled { t.Fatalf("Expected %v, got %v", gcerrors.Canceled, gce) } if gce := qs.ErrorCode(nats.ErrBadSubject); gce != gcerrors.FailedPrecondition { t.Fatalf("Expected %v, got %v", gcerrors.FailedPrecondition, gce) } if gce := qs.ErrorCode(nats.ErrBadSubscription); gce != gcerrors.NotFound { t.Fatalf("Expected %v, got %v", gcerrors.NotFound, gce) } if gce := qs.ErrorCode(nats.ErrTypeSubscription); gce != gcerrors.FailedPrecondition { t.Fatalf("Expected %v, got %v", gcerrors.FailedPrecondition, gce) } if gce := qs.ErrorCode(nats.ErrAuthorization); gce != gcerrors.PermissionDenied { t.Fatalf("Expected %v, got %v", gcerrors.PermissionDenied, gce) } if gce := qs.ErrorCode(nats.ErrMaxMessages); gce != gcerrors.ResourceExhausted { t.Fatalf("Expected %v, got %v", gcerrors.ResourceExhausted, gce) } if gce := qs.ErrorCode(nats.ErrSlowConsumer); gce != gcerrors.ResourceExhausted { t.Fatalf("Expected %v, got %v", gcerrors.ResourceExhausted, gce) } if gce := qs.ErrorCode(nats.ErrTimeout); gce != gcerrors.DeadlineExceeded { t.Fatalf("Expected %v, got %v", gcerrors.DeadlineExceeded, gce) } } func BenchmarkNatsQueuePubSub(b *testing.B) { ctx := context.Background() opts := gnatsd.DefaultTestOptions opts.Port = benchPort s := gnatsd.RunServer(&opts) defer s.Shutdown() nc, err := nats.Connect(fmt.Sprintf("nats://127.0.0.1:%d", benchPort)) if err != nil { b.Fatal(err) } defer nc.Close() for _, tc := range []struct { name string h *harness }{ {name: "V1", h: &harness{s: s, nc: nc, useV2: false}}, {name: "V2", h: &harness{s: s, nc: nc, useV2: true}}, } { b.Run(tc.name, func(b *testing.B) { dt, cleanup, err := tc.h.CreateTopic(ctx, b.Name()) if err != nil { b.Fatal(err) } defer cleanup() qs, cleanup, err := tc.h.CreateQueueSubscription(ctx, dt, b.Name()) if err != nil { b.Fatal(err) } defer cleanup() topic := pubsub.NewTopic(dt, nil) defer topic.Shutdown(ctx) queueSub := pubsub.NewSubscription(qs, recvBatcherOpts, nil) defer queueSub.Shutdown(ctx) drivertest.RunBenchmarks(b, topic, queueSub) }) } } func BenchmarkNatsPubSub(b *testing.B) { ctx := context.Background() opts := gnatsd.DefaultTestOptions opts.Port = benchPort s := gnatsd.RunServer(&opts) defer s.Shutdown() nc, err := nats.Connect(fmt.Sprintf("nats://127.0.0.1:%d", benchPort)) if err != nil { b.Fatal(err) } defer nc.Close() for _, tc := range []struct { name string h *harness }{ {name: "V1", h: &harness{s: s, nc: nc, useV2: false}}, {name: "V2", h: &harness{s: s, nc: nc, useV2: true}}, } { b.Run(tc.name, func(b *testing.B) { dt, cleanup, err := tc.h.CreateTopic(ctx, b.Name()) if err != nil { b.Fatal(err) } defer cleanup() ds, cleanup, err := tc.h.CreateSubscription(ctx, dt, b.Name()) if err != nil { b.Fatal(err) } defer cleanup() topic := pubsub.NewTopic(dt, nil) defer topic.Shutdown(ctx) sub := pubsub.NewSubscription(ds, recvBatcherOpts, nil) defer sub.Shutdown(ctx) drivertest.RunBenchmarks(b, topic, sub) }) } } func fakeConnectionStringInEnv() func() { oldEnvVal := os.Getenv("NATS_SERVER_URL") os.Setenv("NATS_SERVER_URL", fmt.Sprintf("nats://localhost:%d", testPort)) return func() { os.Setenv("NATS_SERVER_URL", oldEnvVal) } } func TestOpenTopicFromURL(t *testing.T) { ctx := context.Background() dh, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer dh.Close() cleanup := fakeConnectionStringInEnv() defer cleanup() tests := []struct { URL string WantErr bool }{ // OK. {"nats://mytopic", false}, // Invalid parameter. {"nats://mytopic?param=value", true}, } for _, test := range tests { topic, err := pubsub.OpenTopic(ctx, test.URL) if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } if topic != nil { topic.Shutdown(ctx) } } } func TestOpenSubscriptionFromURL(t *testing.T) { ctx := context.Background() dh, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer dh.Close() cleanup := fakeConnectionStringInEnv() defer cleanup() tests := []struct { URL string WantErr bool }{ // OK. {"nats://mytopic", false}, // Invalid parameter. {"nats://mytopic?param=value", true}, // Queue URL Parameter for QueueSubscription. {"nats://mytopic?queue=queue1", false}, // Multiple values for Queue URL Parameter for QueueSubscription. {"nats://mytopic?queue=queue1&queue=queue2", true}, // NATSV2 URL should be acceptable without values. {"nats://mytopic?natsv2", false}, // NATSV2 URL should be acceptable with boolean parsable values. {"nats://mytopic?natsv2=true", false}, {"nats://mytopic?natsv2=false", false}, // NATSV2 URL should throw error with non-boolean parsable values. {"nats://mytopic?natsv2=foo", true}, } for _, test := range tests { sub, err := pubsub.OpenSubscription(ctx, test.URL) if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } if sub != nil { sub.Shutdown(ctx) } } } func TestCodec(t *testing.T) { const sub = "foo" for _, dm := range []*driver.Message{ {Metadata: nil, Body: nil}, {Metadata: map[string]string{"a": "1"}, Body: nil}, {Metadata: nil, Body: []byte("hello")}, {Metadata: map[string]string{"a": "1"}, Body: []byte("hello")}, { Metadata: map[string]string{"a": "1"}, Body: []byte("hello"), AckID: "foo", AsFunc: func(any) bool { return true }, }, } { t.Run("V1", func(t *testing.T) { bytes, err := encodeMessage(dm) if err != nil { t.Fatal(err) } var got driver.Message if err := decodeMessage(bytes, &got); err != nil { t.Fatal(err) } want := *dm want.AckID = nil want.AsFunc = nil if diff := cmp.Diff(got, want); diff != "" { t.Errorf("%+v:\n%s", want, diff) } }) t.Run("V2", func(t *testing.T) { nm := encodeMessageV2(dm, sub) got, err := decodeMessageV2(nm) if err != nil { t.Fatal(err) } want := *dm want.AckID = nil want.AsFunc = nil // AsFunc needs to be cleared as it cannot be comparable using Diff. got.AsFunc = nil if diff := cmp.Diff(*got, want); diff != "" { t.Errorf("%+v:\n%s", want, diff) } }) } } ================================================ FILE: pubsub/pub_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package pubsub_test import ( "context" "errors" "testing" "time" "gocloud.dev/pubsub" "gocloud.dev/pubsub/driver" ) type funcTopic struct { driver.Topic sendBatch func(ctx context.Context, ms []*driver.Message) error closed bool } func (t *funcTopic) SendBatch(ctx context.Context, ms []*driver.Message) error { return t.sendBatch(ctx, ms) } func (t *funcTopic) IsRetryable(error) bool { return false } func (t *funcTopic) Close() error { t.closed = true return nil } func TestTopicShutdownCanBeCanceledEvenWithHangingSend(t *testing.T) { dt := &funcTopic{ sendBatch: func(ctx context.Context, ms []*driver.Message) error { <-ctx.Done() return ctx.Err() }, } topic := pubsub.NewTopic(dt, nil) errs := make(chan error, 1) go func() { m := &pubsub.Message{} if err := topic.Send(context.Background(), m); err == nil { errs <- errors.New("nil err from Send, expected context cancellation error") } }() done := make(chan struct{}) ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond) defer cancel() go func() { topic.Shutdown(ctx) close(done) }() // Now cancel the context being used by topic.Shutdown. cancel() // It shouldn't take too long before topic.Shutdown stops. tooLong := 5 * time.Second select { case <-done: case <-time.After(tooLong): t.Fatalf("waited too long(%v) for Shutdown(ctx) to run", tooLong) case err := <-errs: t.Fatalf("got error from goroutine: %v", err) } } func TestTopicCloseIsCalled(t *testing.T) { ctx := context.Background() dt := &funcTopic{} topic := pubsub.NewTopic(dt, nil) topic.Shutdown(ctx) if !dt.closed { t.Error("want Topic.Close to have been called") } } ================================================ FILE: pubsub/pubsub.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package pubsub provides an easy and portable way to interact with // publish/subscribe systems. Subpackages contain driver implementations of // pubsub for supported services // // See https://gocloud.dev/howto/pubsub/ for a detailed how-to guide. // // # At-most-once and At-least-once Delivery // // The semantics of message delivery vary across PubSub services. // Some services guarantee that messages received by subscribers but not // acknowledged are delivered again (at-least-once semantics). In others, // a message will be delivered only once, if it is delivered at all // (at-most-once semantics). Some services support both modes via options. // // This package accommodates both kinds of systems, but application developers // should think carefully about which kind of semantics the application needs. // Even though the application code may look similar, system-level // characteristics are quite different. See the driver package // documentation for more information about message delivery semantics. // // After receiving a Message via Subscription.Receive: // - Always call Message.Ack or Message.Nack after processing the message. // - For some drivers, Ack will be a no-op. // - For some drivers, Nack is not supported and will panic; you can call // Message.Nackable to see. // // # OpenTelemetry Integration. // // OpenTelemetry supports tracing and metric collection for multiple languages and // backend providers. See https://opentelemetry.io. // // This API collects OpenTelemetry traces and metrics for the following methods: // - Topic.Send // - Topic.Shutdown // - Subscription.Receive // - Subscription.Shutdown // - The internal driver methods SendBatch, SendAcks and ReceiveBatch. // // All trace and metric names begin with the package import path. // The traces add the method name. // For example, "gocloud.dev/pubsub/Topic.Send". // The metrics are "completed_calls", a count of completed method calls by driver, // method and status (error code); and "latency", a distribution of method latency // by driver and method. // For example, "gocloud.dev/pubsub/latency". // // To enable trace collection in your application, see "Configure an Exporter" at // https://opentelemetry.io/docs/languages/go/getting-started/. // To enable metric collection in your application, see "Metrics" at // https://opentelemetry.io/docs/languages/go/metrics/. package pubsub // import "gocloud.dev/pubsub" import ( "context" "errors" "fmt" "log" "math" "net/url" "reflect" "runtime" "sync" "time" "unicode/utf8" "github.com/googleapis/gax-go/v2" "gocloud.dev/gcerrors" "gocloud.dev/internal/gcerr" "gocloud.dev/internal/openurl" gcdkotel "gocloud.dev/internal/otel" "gocloud.dev/internal/retry" "gocloud.dev/pubsub/batcher" "gocloud.dev/pubsub/driver" "golang.org/x/sync/errgroup" ) // Message contains data to be published. type Message struct { // LoggableID will be set to an opaque message identifer for // received messages, useful for debug logging. No assumptions should // be made about the content. LoggableID string // Body contains the content of the message. Body []byte // Metadata has key/value metadata for the message. // // When sending a message, set any key/value pairs you want associated with // the message. It is acceptable for Metadata to be nil. // Note that some services limit the number of key/value pairs per message. // // When receiving a message, Metadata will be nil if the message has no // associated metadata. Metadata map[string]string // BeforeSend is a callback used when sending a message. It will always be // set to nil for received messages. // // The callback will be called exactly once, before the message is sent. // // asFunc converts its argument to driver-specific types. // See https://gocloud.dev/concepts/as/ for background information. BeforeSend func(asFunc func(any) bool) error // AfterSend is a callback used when sending a message. It will always be // set to nil for received messages. // // The callback will be called at most once, after the message is sent. // If Send returns an error, AfterSend will not be called. // // asFunc converts its argument to driver-specific types. // See https://gocloud.dev/concepts/as/ for background information. AfterSend func(asFunc func(any) bool) error // asFunc invokes driver.Message.AsFunc. asFunc func(any) bool // ack is a closure that queues this message for the action (ack or nack). ack func(isAck bool) // nackable is true iff Nack can be called without panicking. nackable bool // mu guards isAcked in case Ack/Nack is called concurrently. mu sync.Mutex // isAcked tells whether this message has already had its Ack or Nack // method called. isAcked bool } // Ack acknowledges the message, telling the server that it does not need to be // sent again to the associated Subscription. It will be a no-op for some // drivers; see // https://godoc.org/gocloud.dev/pubsub#hdr-At_most_once_and_At_least_once_Delivery // for more info. // // Ack returns immediately, but the actual ack is sent in the background, and // is not guaranteed to succeed. If background acks persistently fail, the error // will be returned from a subsequent Receive. func (m *Message) Ack() { m.mu.Lock() defer m.mu.Unlock() if m.isAcked { panic(fmt.Sprintf("Ack/Nack called twice on message: %+v", m)) } m.ack(true) m.isAcked = true } // Nackable returns true iff Nack can be called without panicking. // // Some services do not support Nack; for example, at-most-once services // can't redeliver a message. See // https://godoc.org/gocloud.dev/pubsub#hdr-At_most_once_and_At_least_once_Delivery // for more info. func (m *Message) Nackable() bool { return m.nackable } // Nack (short for negative acknowledgment) tells the server that this Message // was not processed and should be redelivered. // // Nack panics for some drivers, as Nack is meaningless when messages can't be // redelivered. You can call Nackable to determine if Nack is available. See // https://godoc.org/gocloud.dev/pubsub#hdr-At_most_once_and_At_least_once_Delivery // fore more info. // // Nack returns immediately, but the actual nack is sent in the background, // and is not guaranteed to succeed. // // Nack is a performance optimization for retrying transient failures. It // must not be used for message parse errors or other messages that the // application will never be able to process: calling Nack will cause them to // be redelivered and overload the server. Instead, an application should call // Ack and log the failure in some monitored way. func (m *Message) Nack() { m.mu.Lock() defer m.mu.Unlock() if m.isAcked { panic(fmt.Sprintf("Ack/Nack called twice on message: %+v", m)) } if !m.nackable { panic("Message.Nack is not supported by this driver") } m.ack(false) m.isAcked = true } // As converts i to driver-specific types. // See https://gocloud.dev/concepts/as/ for background information, the "As" // examples in this package for examples, and the driver package // documentation for the specific types supported for that driver. // As panics unless it is called on a message obtained from Subscription.Receive. func (m *Message) As(i any) bool { if m.asFunc == nil { panic("As called on a Message that was not obtained from Receive") } return m.asFunc(i) } // Topic publishes messages to all its subscribers. type Topic struct { driver driver.Topic batcher *batcher.Batcher tracer *gcdkotel.Tracer mu sync.Mutex err error // cancel cancels all SendBatch calls. cancel func() } // Send publishes a message. It only returns after the message has been // sent, or failed to be sent. Send can be called from multiple goroutines // at once. func (t *Topic) Send(ctx context.Context, m *Message) (err error) { ctx, span := t.tracer.Start(ctx, "Topic.Send") defer func() { t.tracer.End(ctx, span, err) }() // Check for doneness before we do any work. if err := ctx.Err(); err != nil { return err // Return context errors unwrapped. } t.mu.Lock() err = t.err t.mu.Unlock() if err != nil { return err // t.err wrapped when set } if m.LoggableID != "" { return gcerr.Newf(gcerr.InvalidArgument, nil, "pubsub: Message.LoggableID should not be set when sending a message") } for k, v := range m.Metadata { if !utf8.ValidString(k) { return gcerr.Newf(gcerr.InvalidArgument, nil, "pubsub: Message.Metadata keys must be valid UTF-8 strings: %q", k) } if !utf8.ValidString(v) { return gcerr.Newf(gcerr.InvalidArgument, nil, "pubsub: Message.Metadata values must be valid UTF-8 strings: %q", v) } } dm := &driver.Message{ Body: m.Body, Metadata: m.Metadata, BeforeSend: m.BeforeSend, AfterSend: m.AfterSend, } return t.batcher.Add(ctx, dm) } var errTopicShutdown = gcerr.Newf(gcerr.FailedPrecondition, nil, "pubsub: Topic has been Shutdown") // Shutdown flushes pending message sends and disconnects the Topic. // It only returns after all pending messages have been sent. func (t *Topic) Shutdown(ctx context.Context) (err error) { ctx, span := t.tracer.Start(ctx, "Topic.Shutdown") defer func() { t.tracer.End(ctx, span, err) }() t.mu.Lock() if errors.Is(t.err, errTopicShutdown) { defer t.mu.Unlock() return t.err } t.err = errTopicShutdown t.mu.Unlock() c := make(chan struct{}) go func() { defer close(c) t.batcher.Shutdown() }() select { case <-ctx.Done(): case <-c: } t.cancel() if err := t.driver.Close(); err != nil { return wrapError(t.driver, err) } return ctx.Err() } // As converts i to driver-specific types. // See https://gocloud.dev/concepts/as/ for background information, the "As" // examples in this package for examples, and the driver package // documentation for the specific types supported for that driver. func (t *Topic) As(i any) bool { return t.driver.As(i) } // ErrorAs converts err to driver-specific types. // ErrorAs panics if i is nil or not a pointer. // ErrorAs returns false if err == nil. // See https://gocloud.dev/concepts/as/ for background information. func (t *Topic) ErrorAs(err error, i any) bool { return gcerr.ErrorAs(err, i, t.driver.ErrorAs) } // NewTopic is for use by drivers only. Do not use in application code. var NewTopic = newTopic // newSendBatcher creates a batcher for topics, for use with NewTopic. func newSendBatcher(ctx context.Context, t *Topic, dt driver.Topic, opts *batcher.Options) *batcher.Batcher { handler := func(items any) error { dms := items.([]*driver.Message) err := retry.Call(ctx, gax.Backoff{}, dt.IsRetryable, func() (err error) { spanCtx, span := t.tracer.Start(ctx, "driver.Topic.SendBatch") defer func() { t.tracer.End(spanCtx, span, err) }() return dt.SendBatch(spanCtx, dms) }) if err != nil { return wrapError(dt, err) } return nil } return batcher.New(reflect.TypeFor[*driver.Message](), opts, handler) } // newTopic makes a pubsub.Topic from a driver.Topic. // // opts may be nil to accept defaults. func newTopic(d driver.Topic, opts *batcher.Options) *Topic { ctx, cancel := context.WithCancel(context.Background()) t := &Topic{ driver: d, tracer: gcdkotel.NewTracer(pkgName, gcdkotel.ProviderName(d)), cancel: cancel, } t.batcher = newSendBatcher(ctx, t, d, opts) return t } const pkgName = "gocloud.dev/pubsub" var ( // OpenTelemetryViews are predefined views for OpenTelemetry metrics. // The views include counts and latency distributions for API method calls. // See the explanations at https://opentelemetry.io/docs/specs/otel/metrics/data-model/ for usage. OpenTelemetryViews = gcdkotel.Views(pkgName) ) // Subscription receives published messages. type Subscription struct { driver driver.Subscription tracer *gcdkotel.Tracer // ackBatcher makes batches of acks and nacks and sends them to the server. ackBatcher *batcher.Batcher canNack bool // true iff the driver supports Nack backgroundCtx context.Context // for background SendAcks and ReceiveBatch calls cancel func() // for canceling backgroundCtx recvBatchOpts *batcher.Options mu sync.Mutex // protects everything below q []*driver.Message // local queue of messages downloaded from server err error // permanent error unreportedAckErr error // permanent error from background SendAcks that hasn't been returned to the user yet waitc chan struct{} // for goroutines waiting on ReceiveBatch runningBatchSize float64 // running number of messages to request via ReceiveBatch throughputStart time.Time // start time for throughput measurement throughputCount int // number of msgs given out via Receive since throughputStart // Used in tests. preReceiveBatchHook func(maxMessages int) } const ( // The desired duration of a subscription's queue of messages (the messages pulled // and waiting in memory to be doled out to Receive callers). This is how long // it would take to drain the queue at the current processing rate. // The relationship to queue length (number of messages) is // // lengthInMessages = desiredQueueDuration / averageProcessTimePerMessage // // In other words, if it takes 100ms to process a message on average, and we want // 2s worth of queued messages, then we need 2/.1 = 20 messages in the queue. // // If desiredQueueDuration is too small, then there won't be a large enough buffer // of messages to handle fluctuations in processing time, and the queue is likely // to become empty, reducing throughput. If desiredQueueDuration is too large, then // messages will wait in memory for a long time, possibly timing out (that is, // their ack deadline will be exceeded). Those messages could have been handled // by another process receiving from the same subscription. desiredQueueDuration = 2 * time.Second // Expected duration of calls to driver.ReceiveBatch, at some high percentile. // We'll try to fetch more messages when the current queue is predicted // to be used up in expectedReceiveBatchDuration. expectedReceiveBatchDuration = 1 * time.Second // s.runningBatchSize holds our current best guess for how many messages to // fetch in order to have a buffer of desiredQueueDuration. When we have // fewer than prefetchRatio * s.runningBatchSize messages left, that means // we expect to run out of messages in expectedReceiveBatchDuration, so we // should initiate another ReceiveBatch call. prefetchRatio = float64(expectedReceiveBatchDuration) / float64(desiredQueueDuration) // The initial # of messages to request via ReceiveBatch. initialBatchSize = 1 // The factor by which old batch sizes decay when a new value is added to the // running value. The larger this number, the more weight will be given to the // newest value in preference to older ones. // // The delta based on a single value is capped by the constants below. decay = 0.5 // The maximum growth factor in a single jump. Higher values mean that the // batch size can increase more aggressively. For example, 2.0 means that the // batch size will at most double from one ReceiveBatch call to the next. maxGrowthFactor = 2.0 // Similarly, the maximum shrink factor. Lower values mean that the batch size // can shrink more aggressively. For example; 0.75 means that the batch size // will at most shrink to 75% of what it was before. Note that values less // than (1-decay) will have no effect because the running value can't change // by more than that. maxShrinkFactor = 0.75 // The maximum batch size to request. Setting this too low doesn't allow // drivers to get lots of messages at once; setting it too small risks having // drivers spend a long time in ReceiveBatch trying to achieve it. maxBatchSize = 3000 ) // updateBatchSize updates the number of messages to request in ReceiveBatch // based on the previous batch size and the rate of messages being pulled from // the queue, measured using s.throughput*. // // It returns the number of messages to request in this ReceiveBatch call. // // s.mu must be held. func (s *Subscription) updateBatchSize() int { // If we're always only doing one at a time, there's no point in this. if s.recvBatchOpts != nil && s.recvBatchOpts.MaxBatchSize == 1 && s.recvBatchOpts.MaxHandlers == 1 { return 1 } now := time.Now() if s.throughputStart.IsZero() { // No throughput measurement; don't update s.runningBatchSize. } else { // Update s.runningBatchSize based on throughput since our last time here, // as measured by the ratio of the number of messages returned to elapsed // time. elapsed := max(now.Sub(s.throughputStart), // Avoid divide-by-zero and huge numbers. 100*time.Millisecond) msgsPerSec := float64(s.throughputCount) / elapsed.Seconds() // The "ideal" batch size is how many messages we'd need in the queue to // support desiredQueueDuration at the msgsPerSec rate. idealBatchSize := desiredQueueDuration.Seconds() * msgsPerSec // Move s.runningBatchSize towards the ideal. // We first combine the previous value and the new value, with weighting // based on decay, and then cap the growth/shrinkage. newBatchSize := s.runningBatchSize*(1-decay) + idealBatchSize*decay if maxSize := s.runningBatchSize * maxGrowthFactor; newBatchSize > maxSize { s.runningBatchSize = maxSize } else if minSize := s.runningBatchSize * maxShrinkFactor; newBatchSize < minSize { s.runningBatchSize = minSize } else { s.runningBatchSize = newBatchSize } } // Reset throughput measurement markers. s.throughputStart = now s.throughputCount = 0 // Using Ceil guarantees at least one message. return int(math.Ceil(math.Min(s.runningBatchSize, maxBatchSize))) } // Receive receives and returns the next message from the Subscription's queue, // blocking and polling if none are available. It can be called // concurrently from multiple goroutines. // // Receive retries retryable errors from the underlying driver forever. // Therefore, if Receive returns an error, either: // 1. It is a non-retryable error from the underlying driver, either from // // an attempt to fetch more messages or from an attempt to ack messages. // Operator intervention may be required (e.g., invalid resource, quota // error, etc.). Receive will return the same error from then on, so the // application should log the error and either recreate the Subscription, // or exit. // // 2. The provided ctx is Done. Error() on the returned error will include both // // the ctx error and the underlying driver error, and ErrorAs on it // can access the underlying driver error type if needed. Receive may // be called again with a fresh ctx. // // Callers can distinguish between the two by checking if the ctx they passed // is Done, or via xerrors.Is(err, context.DeadlineExceeded or context.Canceled) // on the returned error. // // The Ack method of the returned Message must be called once the message has // been processed, to prevent it from being received again. func (s *Subscription) Receive(ctx context.Context) (_ *Message, err error) { ctx, span := s.tracer.Start(ctx, "Subscription.Receive") defer func() { s.tracer.End(ctx, span, err) }() s.mu.Lock() defer s.mu.Unlock() for { // The lock is always held here, at the top of the loop. if s.err != nil { // The Subscription is in a permanent error state. Return the error. s.unreportedAckErr = nil return nil, s.err // s.err wrapped when set } // Short circuit if ctx is Done. // Otherwise, we'll continue to return messages from the queue, and even // get new messages if driver.ReceiveBatch doesn't return an error when // ctx is done. if err := ctx.Err(); err != nil { return nil, err } if s.waitc == nil && float64(len(s.q)) <= s.runningBatchSize*prefetchRatio { // We think we're going to run out of messages in expectedReceiveBatchDuration, // and there's no outstanding ReceiveBatch call, so initiate one in the // background. // Completion will be signalled to this goroutine, and to any other // waiting goroutines, by closing s.waitc. s.waitc = make(chan struct{}) batchSize := s.updateBatchSize() // log.Printf("BATCH SIZE %d", batchSize) go func() { if s.preReceiveBatchHook != nil { s.preReceiveBatchHook(batchSize) } resultChannel := s.getNextBatch(batchSize) for msgsOrError := range resultChannel { if len(msgsOrError.msgs) > 0 { // messages received from channel s.mu.Lock() s.q = append(s.q, msgsOrError.msgs...) s.mu.Unlock() // notify that queue should now have messages s.waitc <- struct{}{} } else if msgsOrError.err != nil { // err can receive message only after batch group completes // Non-retryable error from ReceiveBatch -> permanent error s.mu.Lock() s.err = msgsOrError.err s.mu.Unlock() } } // batch reception finished s.mu.Lock() close(s.waitc) s.waitc = nil s.mu.Unlock() }() } if len(s.q) > 0 { // At least one message is available. Return it. m := s.q[0] s.q = s.q[1:] s.throughputCount++ // Convert driver.Message to Message. id := m.AckID md := m.Metadata if len(md) == 0 { md = nil } loggableID := m.LoggableID if loggableID == "" { // This shouldn't happen, but just in case it's better to be explicit. loggableID = "unknown" } m2 := &Message{ LoggableID: loggableID, Body: m.Body, Metadata: md, asFunc: m.AsFunc, nackable: s.canNack, } m2.ack = func(isAck bool) { // Ignore the error channel. Errors are dealt with // in the ackBatcher handler. _ = s.ackBatcher.AddNoWait(&driver.AckInfo{AckID: id, IsAck: isAck}) } // Add a finalizer that complains if the Message we return isn't // acked or nacked. _, file, lineno, ok := runtime.Caller(1) // the caller of Receive runtime.SetFinalizer(m2, func(m *Message) { m.mu.Lock() defer m.mu.Unlock() if !m.isAcked { var caller string if ok { caller = fmt.Sprintf(" (%s:%d)", file, lineno) } log.Printf("A pubsub.Message was never Acked or Nacked%s", caller) } }) return m2, nil } // A call to ReceiveBatch must be in flight. Wait for it. waitc := s.waitc s.mu.Unlock() // unlock to allow message or error processing from background goroutine select { case <-waitc: // Continue to top of loop. s.mu.Lock() case <-ctx.Done(): s.mu.Lock() return nil, ctx.Err() } } } type msgsOrError struct { msgs []*driver.Message err error } // getNextBatch gets the next batch of messages from the server. It will return a channel that will itself return the // messages as they come from each independent batch, or an operation error func (s *Subscription) getNextBatch(nMessages int) chan msgsOrError { // Split nMessages into batches based on recvBatchOpts; we'll make a // separate ReceiveBatch call for each batch, and aggregate the results in // msgs. batches := batcher.Split(nMessages, s.recvBatchOpts) result := make(chan msgsOrError, len(batches)) g, ctx := errgroup.WithContext(s.backgroundCtx) for _, maxMessagesInBatch := range batches { // Make a copy of the loop variable since it will be used by a goroutine. curMaxMessagesInBatch := maxMessagesInBatch g.Go(func() error { var msgs []*driver.Message err := retry.Call(ctx, gax.Backoff{}, s.driver.IsRetryable, func() error { var err error spanCtx, span := s.tracer.Start(ctx, "driver.Subscription.ReceiveBatch") defer func() { s.tracer.End(spanCtx, span, err) }() msgs, err = s.driver.ReceiveBatch(spanCtx, curMaxMessagesInBatch) return err }) if err != nil { return wrapError(s.driver, err) } result <- msgsOrError{msgs: msgs} return nil }) } go func() { // wait on group completion on the background and proper channel closing if err := g.Wait(); err != nil { result <- msgsOrError{err: err} } close(result) }() return result } var errSubscriptionShutdown = gcerr.Newf(gcerr.FailedPrecondition, nil, "pubsub: Subscription has been Shutdown") // Shutdown flushes pending ack sends and disconnects the Subscription. func (s *Subscription) Shutdown(ctx context.Context) (err error) { ctx, span := s.tracer.Start(ctx, "Subscription.Shutdown") defer func() { s.tracer.End(ctx, span, err) }() s.mu.Lock() if errors.Is(s.err, errSubscriptionShutdown) { // Already Shutdown. defer s.mu.Unlock() return s.err } s.err = errSubscriptionShutdown s.mu.Unlock() c := make(chan struct{}) go func() { defer close(c) if s.ackBatcher != nil { s.ackBatcher.Shutdown() } }() select { case <-ctx.Done(): case <-c: } s.cancel() if err := s.driver.Close(); err != nil { return wrapError(s.driver, err) } s.mu.Lock() defer s.mu.Unlock() if err := s.unreportedAckErr; err != nil { s.unreportedAckErr = nil return err } return ctx.Err() } // As converts i to driver-specific types. // See https://gocloud.dev/concepts/as/ for background information, the "As" // examples in this package for examples, and the driver package // documentation for the specific types supported for that driver. func (s *Subscription) As(i any) bool { return s.driver.As(i) } // ErrorAs converts err to driver-specific types. // ErrorAs panics if i is nil or not a pointer. // ErrorAs returns false if err == nil. // See Topic.As for more details. func (s *Subscription) ErrorAs(err error, i any) bool { return gcerr.ErrorAs(err, i, s.driver.ErrorAs) } // NewSubscription is for use by drivers only. Do not use in application code. var NewSubscription = newSubscription // newSubscription creates a Subscription from a driver.Subscription. // // recvBatchOpts sets options for Receive batching. May be nil to accept // defaults. The ideal number of messages to receive at a time is determined // dynamically, then split into multiple possibly concurrent calls to // driver.ReceiveBatch based on recvBatchOptions. // // ackBatcherOpts sets options for ack+nack batching. May be nil to accept // defaults. func newSubscription(ds driver.Subscription, recvBatchOpts, ackBatcherOpts *batcher.Options) *Subscription { ctx, cancel := context.WithCancel(context.Background()) s := &Subscription{ driver: ds, tracer: gcdkotel.NewTracer(pkgName, gcdkotel.ProviderName(ds)), cancel: cancel, backgroundCtx: ctx, recvBatchOpts: recvBatchOpts, runningBatchSize: initialBatchSize, canNack: ds.CanNack(), } s.ackBatcher = newAckBatcher(ctx, s, ds, ackBatcherOpts) return s } func newAckBatcher(ctx context.Context, s *Subscription, ds driver.Subscription, opts *batcher.Options) *batcher.Batcher { handler := func(items any) error { var acks, nacks []driver.AckID for _, a := range items.([]*driver.AckInfo) { if a.IsAck { acks = append(acks, a.AckID) } else { nacks = append(nacks, a.AckID) } } g, ctx := errgroup.WithContext(ctx) if len(acks) > 0 { g.Go(func() error { return retry.Call(ctx, gax.Backoff{}, ds.IsRetryable, func() (err error) { spanCtx, span := s.tracer.Start(ctx, "driver.Subscription.SendAcks") defer func() { s.tracer.End(spanCtx, span, err) }() return ds.SendAcks(spanCtx, acks) }) }) } if len(nacks) > 0 { g.Go(func() error { return retry.Call(ctx, gax.Backoff{}, ds.IsRetryable, func() (err error) { spanCtx, span := s.tracer.Start(ctx, "driver.Subscription.SendNacks") defer func() { s.tracer.End(spanCtx, span, err) }() return ds.SendNacks(spanCtx, nacks) }) }) } err := g.Wait() // Remember a non-retryable error from SendAcks/Nacks. It will be returned on the // next call to Receive. if err != nil { err = wrapError(s.driver, err) s.mu.Lock() s.err = err s.unreportedAckErr = err s.mu.Unlock() } return err } return batcher.New(reflect.TypeFor[[]*driver.AckInfo]().Elem(), opts, handler) } type errorCoder interface { ErrorCode(error) gcerrors.ErrorCode } func wrapError(ec errorCoder, err error) error { if err == nil { return nil } if gcerr.DoNotWrap(err) { return err } return gcerr.New(ec.ErrorCode(err), err, 2, "pubsub") } // TopicURLOpener represents types than can open Topics based on a URL. // The opener must not modify the URL argument. OpenTopicURL must be safe to // call from multiple goroutines. // // This interface is generally implemented by types in driver packages. type TopicURLOpener interface { OpenTopicURL(ctx context.Context, u *url.URL) (*Topic, error) } // SubscriptionURLOpener represents types than can open Subscriptions based on a URL. // The opener must not modify the URL argument. OpenSubscriptionURL must be safe to // call from multiple goroutines. // // This interface is generally implemented by types in driver packages. type SubscriptionURLOpener interface { OpenSubscriptionURL(ctx context.Context, u *url.URL) (*Subscription, error) } // URLMux is a URL opener multiplexer. It matches the scheme of the URLs // against a set of registered schemes and calls the opener that matches the // URL's scheme. // See https://gocloud.dev/concepts/urls/ for more information. // // The zero value is a multiplexer with no registered schemes. type URLMux struct { subscriptionSchemes openurl.SchemeMap topicSchemes openurl.SchemeMap } // TopicSchemes returns a sorted slice of the registered Topic schemes. func (mux *URLMux) TopicSchemes() []string { return mux.topicSchemes.Schemes() } // ValidTopicScheme returns true iff scheme has been registered for Topics. func (mux *URLMux) ValidTopicScheme(scheme string) bool { return mux.topicSchemes.ValidScheme(scheme) } // SubscriptionSchemes returns a sorted slice of the registered Subscription schemes. func (mux *URLMux) SubscriptionSchemes() []string { return mux.subscriptionSchemes.Schemes() } // ValidSubscriptionScheme returns true iff scheme has been registered for Subscriptions. func (mux *URLMux) ValidSubscriptionScheme(scheme string) bool { return mux.subscriptionSchemes.ValidScheme(scheme) } // RegisterTopic registers the opener with the given scheme. If an opener // already exists for the scheme, RegisterTopic panics. func (mux *URLMux) RegisterTopic(scheme string, opener TopicURLOpener) { mux.topicSchemes.Register("pubsub", "Topic", scheme, opener) } // RegisterSubscription registers the opener with the given scheme. If an opener // already exists for the scheme, RegisterSubscription panics. func (mux *URLMux) RegisterSubscription(scheme string, opener SubscriptionURLOpener) { mux.subscriptionSchemes.Register("pubsub", "Subscription", scheme, opener) } // OpenTopic calls OpenTopicURL with the URL parsed from urlstr. // OpenTopic is safe to call from multiple goroutines. func (mux *URLMux) OpenTopic(ctx context.Context, urlstr string) (*Topic, error) { opener, u, err := mux.topicSchemes.FromString("Topic", urlstr) if err != nil { return nil, err } return opener.(TopicURLOpener).OpenTopicURL(ctx, u) } // OpenSubscription calls OpenSubscriptionURL with the URL parsed from urlstr. // OpenSubscription is safe to call from multiple goroutines. func (mux *URLMux) OpenSubscription(ctx context.Context, urlstr string) (*Subscription, error) { opener, u, err := mux.subscriptionSchemes.FromString("Subscription", urlstr) if err != nil { return nil, err } return opener.(SubscriptionURLOpener).OpenSubscriptionURL(ctx, u) } // OpenTopicURL dispatches the URL to the opener that is registered with the // URL's scheme. OpenTopicURL is safe to call from multiple goroutines. func (mux *URLMux) OpenTopicURL(ctx context.Context, u *url.URL) (*Topic, error) { opener, err := mux.topicSchemes.FromURL("Topic", u) if err != nil { return nil, err } return opener.(TopicURLOpener).OpenTopicURL(ctx, u) } // OpenSubscriptionURL dispatches the URL to the opener that is registered with the // URL's scheme. OpenSubscriptionURL is safe to call from multiple goroutines. func (mux *URLMux) OpenSubscriptionURL(ctx context.Context, u *url.URL) (*Subscription, error) { opener, err := mux.subscriptionSchemes.FromURL("Subscription", u) if err != nil { return nil, err } return opener.(SubscriptionURLOpener).OpenSubscriptionURL(ctx, u) } var defaultURLMux = &URLMux{} // DefaultURLMux returns the URLMux used by OpenTopic and OpenSubscription. // // Driver packages can use this to register their TopicURLOpener and/or // SubscriptionURLOpener on the mux. func DefaultURLMux() *URLMux { return defaultURLMux } // OpenTopic opens the Topic identified by the URL given. // See the URLOpener documentation in driver subpackages for // details on supported URL formats, and https://gocloud.dev/concepts/urls // for more information. func OpenTopic(ctx context.Context, urlstr string) (*Topic, error) { return defaultURLMux.OpenTopic(ctx, urlstr) } // OpenSubscription opens the Subscription identified by the URL given. // See the URLOpener documentation in driver subpackages for // details on supported URL formats, and https://gocloud.dev/concepts/urls // for more information. func OpenSubscription(ctx context.Context, urlstr string) (*Subscription, error) { return defaultURLMux.OpenSubscription(ctx, urlstr) } ================================================ FILE: pubsub/pubsub_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package pubsub import ( "context" "errors" "fmt" "net/url" "strings" "sync" "sync/atomic" "testing" "time" "github.com/google/go-cmp/cmp" "gocloud.dev/gcerrors" "gocloud.dev/internal/gcerr" "gocloud.dev/internal/testing/oteltest" "gocloud.dev/pubsub/batcher" "gocloud.dev/pubsub/driver" ) type driverTopic struct { driver.Topic subs []*driverSub } func (t *driverTopic) SendBatch(ctx context.Context, ms []*driver.Message) error { for _, s := range t.subs { select { case <-s.sem: s.q = append(s.q, ms...) s.sem <- struct{}{} case <-ctx.Done(): return ctx.Err() } } return nil } func (*driverTopic) IsRetryable(error) bool { return false } func (*driverTopic) ErrorCode(error) gcerrors.ErrorCode { return gcerrors.Unknown } func (*driverTopic) Close() error { return nil } type driverSub struct { driver.Subscription sem chan struct{} // Normally this queue would live on a separate server in the cloud. q []*driver.Message } func NewDriverSub() *driverSub { ds := &driverSub{ sem: make(chan struct{}, 1), } ds.sem <- struct{}{} return ds } func (s *driverSub) ReceiveBatch(ctx context.Context, maxMessages int) ([]*driver.Message, error) { for { select { case <-s.sem: ms := s.grabQueue(maxMessages) if len(ms) != 0 { return ms, nil } case <-ctx.Done(): return nil, ctx.Err() } } } func (s *driverSub) grabQueue(maxMessages int) []*driver.Message { defer func() { s.sem <- struct{}{} }() if len(s.q) > 0 { if len(s.q) <= maxMessages { ms := s.q s.q = nil return ms } ms := s.q[:maxMessages] s.q = s.q[maxMessages:] return ms } return nil } func (s *driverSub) SendAcks(ctx context.Context, ackIDs []driver.AckID) error { return nil } func (*driverSub) IsRetryable(error) bool { return false } func (*driverSub) ErrorCode(error) gcerrors.ErrorCode { return gcerrors.Internal } func (*driverSub) CanNack() bool { return false } func (*driverSub) Close() error { return nil } func TestSendReceive(t *testing.T) { ctx := context.Background() ds := NewDriverSub() dt := &driverTopic{ subs: []*driverSub{ds}, } topic := NewTopic(dt, nil) defer topic.Shutdown(ctx) m := &Message{LoggableID: "foo", Body: []byte("user signed up")} if err := topic.Send(ctx, m); err == nil { t.Fatalf("expected a Send with a non-empty LoggableID to fail") } m.LoggableID = "" if err := topic.Send(ctx, m); err != nil { t.Fatal(err) } sub := NewSubscription(ds, nil, nil) defer sub.Shutdown(ctx) m2, err := sub.Receive(ctx) if err != nil { t.Fatal(err) } if string(m2.Body) != string(m.Body) { t.Fatalf("received message has body %q, want %q", m2.Body, m.Body) } m2.Ack() } func TestConcurrentReceivesGetAllTheMessages(t *testing.T) { howManyToSend := int(1e3) ctx, cancel := context.WithCancel(context.Background()) dt := &driverTopic{} // wg is used to wait until all messages are received. var wg sync.WaitGroup wg.Add(howManyToSend) // Make a subscription. ds := NewDriverSub() dt.subs = append(dt.subs, ds) s := NewSubscription(ds, nil, nil) defer s.Shutdown(ctx) // Start 10 goroutines to receive from it. var mu sync.Mutex receivedMsgs := make(map[string]bool) for range 10 { go func() { for { m, err := s.Receive(ctx) if err != nil { // Permanent error; ctx cancelled or subscription closed is // expected once we've received all the messages. mu.Lock() n := len(receivedMsgs) mu.Unlock() if n != howManyToSend { t.Errorf("Worker's Receive failed before all messages were received (%d)", n) } return } m.Ack() mu.Lock() receivedMsgs[string(m.Body)] = true mu.Unlock() wg.Done() } }() } // Send messages. Each message has a unique body used as a key to receivedMsgs. topic := NewTopic(dt, nil) defer topic.Shutdown(ctx) for i := range howManyToSend { key := fmt.Sprintf("message #%d", i) m := &Message{Body: []byte(key)} if err := topic.Send(ctx, m); err != nil { t.Fatal(err) } } // Wait for the goroutines to receive all of the messages, then cancel the // ctx so they all exit. wg.Wait() defer cancel() // Check that all the messages were received. for i := range howManyToSend { key := fmt.Sprintf("message #%d", i) if !receivedMsgs[key] { t.Errorf("message %q was not received", key) } } } func TestCancelSend(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) ds := NewDriverSub() dt := &driverTopic{ subs: []*driverSub{ds}, } topic := NewTopic(dt, nil) defer topic.Shutdown(ctx) m := &Message{} // Intentionally break the driver subscription by acquiring its semaphore. // Now topic.Send will have to wait for cancellation. <-ds.sem cancel() if err := topic.Send(ctx, m); err == nil { t.Error("got nil, want cancellation error") } } func TestCancelReceive(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) ds := NewDriverSub() s := NewSubscription(ds, nil, nil) defer s.Shutdown(ctx) cancel() // Without cancellation, this Receive would hang. if _, err := s.Receive(ctx); err == nil { t.Error("got nil, want cancellation error") } } type blockingDriverSub struct { driver.Subscription inReceiveBatch chan struct{} } func (b blockingDriverSub) ReceiveBatch(ctx context.Context, maxMessages int) ([]*driver.Message, error) { b.inReceiveBatch <- struct{}{} <-ctx.Done() return nil, ctx.Err() } func (blockingDriverSub) CanNack() bool { return false } func (blockingDriverSub) IsRetryable(error) bool { return false } func (blockingDriverSub) Close() error { return nil } func TestCancelTwoReceives(t *testing.T) { // We want to create the following situation: // 1. Goroutine 1 calls Receive, obtains the lock (Subscription.mu), // then releases the lock and calls driver.ReceiveBatch, which hangs. // 2. Goroutine 2 calls Receive. // 3. The context passed to the Goroutine 2 call is canceled. // We expect Goroutine 2's Receive to exit immediately. That won't // happen if Receive holds the lock during the call to ReceiveBatch. inReceiveBatch := make(chan struct{}) s := NewSubscription(blockingDriverSub{inReceiveBatch: inReceiveBatch}, nil, nil) defer s.Shutdown(context.Background()) go func() { _, err := s.Receive(context.Background()) // This should happen at the very end of the test, during Shutdown. if err != context.Canceled { t.Errorf("got %v, want context.Canceled", err) } }() <-inReceiveBatch // Give the Receive call time to block on the mutex before timing out. ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond) defer cancel() errc := make(chan error) go func() { _, err := s.Receive(ctx) errc <- err }() err := <-errc if err != context.DeadlineExceeded { t.Errorf("got %v, want context.DeadlineExceeded", err) } } type secondReceiveBlockedDriverSub struct { driver.Subscription receiveCounter atomic.Uint64 } func (s *secondReceiveBlockedDriverSub) ReceiveBatch(ctx context.Context, _ int) ([]*driver.Message, error) { // The first request will return a message right away. // The second one will block ~forever. if n := s.receiveCounter.Add(1); n > 1 { <-ctx.Done() } msg := &driver.Message{Body: fmt.Appendf(nil, "message #%d", s.receiveCounter.Load())} return []*driver.Message{msg}, nil } func (*secondReceiveBlockedDriverSub) CanNack() bool { return false } func (*secondReceiveBlockedDriverSub) SendAcks(_ context.Context, _ []driver.AckID) error { return nil } func (*secondReceiveBlockedDriverSub) IsRetryable(error) bool { return false } func (*secondReceiveBlockedDriverSub) Close() error { return nil } // TestIndependentBatchReturn verifies that when multiple batch requests are sent, // as long as one of them succeeds it should not block Subscription.Receive. func TestIndependentBatchReturn(t *testing.T) { s := NewSubscription( &secondReceiveBlockedDriverSub{}, &batcher.Options{MaxBatchSize: 1, MaxHandlers: 2}, // force 2 batches by allowing 2 handlers and 1 msg per batch nil, ) ctx := context.Background() defer s.Shutdown(ctx) // Set the batch size to force 2 batches to be called. s.runningBatchSize = 2 ctxTimeout, cancel := context.WithTimeout(ctx, 10*time.Second) defer cancel() m, err := s.Receive(ctxTimeout) if err != nil { t.Fatal("Receive should not fail", err) return } m.Ack() } func TestRetryTopic(t *testing.T) { // Test that Send is retried if the driver returns a retryable error. ctx := context.Background() ft := &failTopic{} topic := NewTopic(ft, nil) defer topic.Shutdown(ctx) err := topic.Send(ctx, &Message{}) if err != nil { t.Errorf("Send: got %v, want nil", err) } if got, want := ft.calls, nRetryCalls+1; got != want { t.Errorf("calls: got %d, want %d", got, want) } } var errRetry = errors.New("retry") func isRetryable(err error) bool { return err == errRetry } const nRetryCalls = 2 // failTopic helps test retries for SendBatch. // // SendBatch will fail nRetryCall times before succeeding. type failTopic struct { driver.Topic calls int } func (t *failTopic) SendBatch(ctx context.Context, ms []*driver.Message) error { t.calls++ if t.calls <= nRetryCalls { return errRetry } return nil } func (*failTopic) IsRetryable(err error) bool { return isRetryable(err) } func (*failTopic) ErrorCode(error) gcerrors.ErrorCode { return gcerrors.Unknown } func (*failTopic) Close() error { return nil } func TestRetryReceive(t *testing.T) { ctx := context.Background() fs := &failSub{fail: true} sub := NewSubscription(fs, nil, nil) defer sub.Shutdown(ctx) m, err := sub.Receive(ctx) if err != nil { t.Fatalf("Receive: got %v, want nil", err) } m.Ack() if got, want := fs.calls, nRetryCalls+1; got != want { t.Errorf("calls: got %d, want %d", got, want) } } // TestBatchSizeDecay verifies that the batch size decays when no messages are available. // (see https://github.com/google/go-cloud/issues/2849). func TestBatchSizeDecays(t *testing.T) { ctx := context.Background() fs := &failSub{} // Allow multiple handlers and cap max batch size to ensure we get concurrency. sub := NewSubscription(fs, &batcher.Options{MaxHandlers: 10, MaxBatchSize: 2}, nil) defer sub.Shutdown(ctx) // Records the last batch size. var mu sync.Mutex lastMaxMessages := 0 sub.preReceiveBatchHook = func(maxMessages int) { mu.Lock() defer mu.Unlock() lastMaxMessages = maxMessages } // Do some receives to allow the number of batches to increase past 1. for range 100 { m, err := sub.Receive(ctx) if err != nil { t.Fatalf("Receive: got %v, want nil", err) } m.Ack() } // Tell the failSub to start returning no messages. fs.mu.Lock() fs.empty = true fs.mu.Unlock() mu.Lock() highWaterMarkBatchSize := lastMaxMessages if lastMaxMessages <= 1 { t.Fatal("max messages wasn't greater than 1") } mu.Unlock() // Make a bunch of calls to Receive to drain any outstanding // messages, and wait some extra time during which we should // continue polling, and the batch size should decay. for { ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) defer cancel() m, err := sub.Receive(ctx) if err != nil { // Expected: no more messages, and timed out. break } // Drained a message. m.Ack() } // Verify that the batch size decayed. mu.Lock() if lastMaxMessages >= highWaterMarkBatchSize { t.Fatalf("wanted batch size to decay; high water mark was %d, now %d", highWaterMarkBatchSize, lastMaxMessages) } mu.Unlock() } // TestRetryReceiveBatches verifies that batching and retries work without races // (see https://github.com/google/go-cloud/issues/2676). func TestRetryReceiveInBatchesDoesntRace(t *testing.T) { ctx := context.Background() fs := &failSub{} // Allow multiple handlers and cap max batch size to ensure we get concurrency. sub := NewSubscription(fs, &batcher.Options{MaxHandlers: 10, MaxBatchSize: 2}, nil) defer sub.Shutdown(ctx) // Do some receives to allow the number of batches to increase past 1. for range 100 { m, err := sub.Receive(ctx) if err != nil { t.Fatalf("Receive: got %v, want nil", err) } m.Ack() } // Tell the failSub to start failing. fs.mu.Lock() fs.fail = true fs.mu.Unlock() // This call to Receive should result in nRetryCalls+1 calls to ReceiveBatch for // each batch. In the issue noted above, this would cause a race. for range 100 { m, err := sub.Receive(ctx) if err != nil { t.Fatalf("Receive: got %v, want nil", err) } m.Ack() } // Don't try to verify the exact number of calls, as it is unpredictable // based on the timing of the batching. } // failSub helps test retries for ReceiveBatch. // // Once start=true, ReceiveBatch will fail nRetryCalls times before succeeding. type failSub struct { driver.Subscription fail bool empty bool calls int mu sync.Mutex } func (t *failSub) ReceiveBatch(ctx context.Context, maxMessages int) ([]*driver.Message, error) { t.mu.Lock() defer t.mu.Unlock() if t.fail { t.calls++ if t.calls <= nRetryCalls { return nil, errRetry } } if t.empty { t.calls++ return nil, nil } return []*driver.Message{{Body: []byte("")}}, nil } func (*failSub) SendAcks(ctx context.Context, ackIDs []driver.AckID) error { return nil } func (*failSub) IsRetryable(err error) bool { return isRetryable(err) } func (*failSub) CanNack() bool { return false } func (*failSub) Close() error { return nil } // TODO(jba): add a test for retry of SendAcks. var errDriver = errors.New("driver error") type erroringTopic struct { driver.Topic } func (erroringTopic) SendBatch(context.Context, []*driver.Message) error { return errDriver } func (erroringTopic) IsRetryable(err error) bool { return isRetryable(err) } func (erroringTopic) ErrorCode(error) gcerrors.ErrorCode { return gcerrors.AlreadyExists } func (erroringTopic) Close() error { return errDriver } type erroringSubscription struct { driver.Subscription } func (erroringSubscription) ReceiveBatch(context.Context, int) ([]*driver.Message, error) { return nil, errDriver } func (erroringSubscription) SendAcks(context.Context, []driver.AckID) error { return errDriver } func (erroringSubscription) IsRetryable(err error) bool { return isRetryable(err) } func (erroringSubscription) ErrorCode(error) gcerrors.ErrorCode { return gcerrors.AlreadyExists } func (erroringSubscription) CanNack() bool { return false } func (erroringSubscription) Close() error { return errDriver } // TestErrorsAreWrapped tests that all errors returned from the driver are // wrapped exactly once by the portable type. func TestErrorsAreWrapped(t *testing.T) { ctx := context.Background() verify := func(err error) { t.Helper() if err == nil { t.Errorf("got nil error, wanted non-nil") return } if e, ok := err.(*gcerr.Error); !ok { t.Errorf("not wrapped: %v", err) } else if got := e.Unwrap(); got != errDriver { t.Errorf("got %v for wrapped error, not errDriver", got) } if s := err.Error(); !strings.HasPrefix(s, "pubsub ") { t.Errorf("Error() for wrapped error doesn't start with 'pubsub': prefix: %s", s) } } topic := NewTopic(erroringTopic{}, nil) verify(topic.Send(ctx, &Message{})) err := topic.Shutdown(ctx) verify(err) sub := NewSubscription(erroringSubscription{}, nil, nil) _, err = sub.Receive(ctx) verify(err) err = sub.Shutdown(ctx) verify(err) } // TestOpenTelemetry tests that OpenTelemetry tracing is working correctly. func TestOpenTelemetry(t *testing.T) { ctx := context.Background() te := oteltest.NewTestExporter(t, OpenTelemetryViews) defer func() { err := te.Shutdown(ctx) if err != nil { t.Logf("Error shutting down test exporter: %v", err) } }() ds := NewDriverSub() dt := &driverTopic{ subs: []*driverSub{ds}, } topic := NewTopic(dt, nil) defer topic.Shutdown(ctx) sub := NewSubscription(ds, nil, nil) defer sub.Shutdown(ctx) if err := topic.Send(ctx, &Message{Body: []byte("x")}); err != nil { t.Fatal(err) } if err := topic.Shutdown(ctx); err != nil { t.Fatal(err) } msg, err := sub.Receive(ctx) if err != nil { t.Fatal(err) } msg.Ack() err = sub.Shutdown(ctx) if err != nil { t.Fatal(err) } _, _ = sub.Receive(ctx) spans := te.GetSpans() metrics := te.GetMetrics(ctx) diff := oteltest.Diff(spans.Snapshots(), metrics, pkgName, "gocloud.dev/pubsub", []oteltest.Call{ {Method: "driver.Topic.SendBatch", Code: gcerrors.OK}, {Method: "Topic.Send", Code: gcerrors.OK}, {Method: "Topic.Shutdown", Code: gcerrors.OK}, {Method: "driver.Subscription.ReceiveBatch", Code: gcerrors.OK}, {Method: "Subscription.Receive", Code: gcerrors.OK}, {Method: "driver.Subscription.SendAcks", Code: gcerrors.OK}, {Method: "Subscription.Shutdown", Code: gcerrors.OK}, {Method: "Subscription.Receive", Code: gcerrors.FailedPrecondition}, }) if diff != "" { t.Error(diff) } } func TestURLMux(t *testing.T) { ctx := context.Background() mux := new(URLMux) fake := &fakeOpener{} mux.RegisterTopic("foo", fake) mux.RegisterTopic("err", fake) mux.RegisterSubscription("foo", fake) mux.RegisterSubscription("err", fake) if diff := cmp.Diff(mux.TopicSchemes(), []string{"err", "foo"}); diff != "" { t.Errorf("Schemes: %s", diff) } if !mux.ValidTopicScheme("foo") || !mux.ValidTopicScheme("err") { t.Errorf("ValidTopicScheme didn't return true for valid scheme") } if mux.ValidTopicScheme("foo2") || mux.ValidTopicScheme("http") { t.Errorf("ValidTopicScheme didn't return false for invalid scheme") } if diff := cmp.Diff(mux.SubscriptionSchemes(), []string{"err", "foo"}); diff != "" { t.Errorf("Schemes: %s", diff) } if !mux.ValidSubscriptionScheme("foo") || !mux.ValidSubscriptionScheme("err") { t.Errorf("ValidSubscriptionScheme didn't return true for valid scheme") } if mux.ValidSubscriptionScheme("foo2") || mux.ValidSubscriptionScheme("http") { t.Errorf("ValidSubscriptionScheme didn't return false for invalid scheme") } for _, tc := range []struct { name string url string wantErr bool }{ { name: "empty URL", wantErr: true, }, { name: "invalid URL", url: ":foo", wantErr: true, }, { name: "invalid URL no scheme", url: "foo", wantErr: true, }, { name: "unregistered scheme", url: "bar://myps", wantErr: true, }, { name: "func returns error", url: "err://myps", wantErr: true, }, { name: "no query options", url: "foo://myps", }, { name: "empty query options", url: "foo://myps?", }, { name: "query options", url: "foo://myps?aAa=bBb&cCc=dDd", }, { name: "multiple query options", url: "foo://myps?x=a&x=b&x=c", }, { name: "fancy ps name", url: "foo:///foo/bar/baz", }, { name: "using api schema prefix", url: "pubsub+foo://foo", }, } { t.Run("topic: "+tc.name, func(t *testing.T) { _, gotErr := mux.OpenTopic(ctx, tc.url) if (gotErr != nil) != tc.wantErr { t.Fatalf("got err %v, want error %v", gotErr, tc.wantErr) } if gotErr != nil { return } if got := fake.u.String(); got != tc.url { t.Errorf("got %q want %q", got, tc.url) } // Repeat with OpenTopicURL. parsed, err := url.Parse(tc.url) if err != nil { t.Fatal(err) } _, gotErr = mux.OpenTopicURL(ctx, parsed) if gotErr != nil { t.Fatalf("got err %v, want nil", gotErr) } if got := fake.u.String(); got != tc.url { t.Errorf("got %q want %q", got, tc.url) } }) t.Run("subscription: "+tc.name, func(t *testing.T) { _, gotErr := mux.OpenSubscription(ctx, tc.url) if (gotErr != nil) != tc.wantErr { t.Fatalf("got err %v, want error %v", gotErr, tc.wantErr) } if gotErr != nil { return } if got := fake.u.String(); got != tc.url { t.Errorf("got %q want %q", got, tc.url) } // Repeat with OpenSubscriptionURL. parsed, err := url.Parse(tc.url) if err != nil { t.Fatal(err) } _, gotErr = mux.OpenSubscriptionURL(ctx, parsed) if gotErr != nil { t.Fatalf("got err %v, want nil", gotErr) } if got := fake.u.String(); got != tc.url { t.Errorf("got %q want %q", got, tc.url) } }) } } type fakeOpener struct { u *url.URL // last url passed to OpenTopicURL/OpenSubscriptionURL } func (o *fakeOpener) OpenTopicURL(ctx context.Context, u *url.URL) (*Topic, error) { if u.Scheme == "err" { return nil, errors.New("fail") } o.u = u return nil, nil } func (o *fakeOpener) OpenSubscriptionURL(ctx context.Context, u *url.URL) (*Subscription, error) { if u.Scheme == "err" { return nil, errors.New("fail") } o.u = u return nil, nil } ================================================ FILE: pubsub/rabbitpubsub/amqp.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package rabbitpubsub // Interfaces for the AMQP protocol, and adapters for the real amqp client. // Fake implementations of the interfaces are in fake_test.go import ( "context" amqp "github.com/rabbitmq/amqp091-go" ) // Values we use for the amqp client. // See https://www.rabbitmq.com/amqp-0-9-1-reference.html. const ( // Many methods of the amqp client take a "no-wait" parameter, which // if true causes the client to return without waiting for a server // response. We always want to wait. wait = false // If the message can't be enqueued, return it to the sender rather than silently // dropping it. mandatory = true // If there are no waiting consumers, enqueue the message instead of dropping it. immediate = false ) // See https://pkg.go.dev/github.com/rabbitmq/amqp091-go#Connection for the documentation of these methods. type amqpConnection interface { Channel() (amqpChannel, error) Close() error } // See https://pkg.go.dev/github.com/rabbitmq/amqp091-go#Channel for the documentation of these methods. type amqpChannel interface { Publish(exchange, routingKey string, msg amqp.Publishing) error PublishWithContext(ctx context.Context, exchange, routingKey string, msg amqp.Publishing) error Consume(queue, consumer string) (<-chan amqp.Delivery, error) Ack(tag uint64) error Nack(tag uint64) error Cancel(consumer string) error Close() error NotifyPublish(chan amqp.Confirmation) chan amqp.Confirmation NotifyReturn(chan amqp.Return) chan amqp.Return NotifyClose(chan *amqp.Error) chan *amqp.Error ExchangeDeclare(string) error QueueDeclareAndBind(qname, ename string) error ExchangeDelete(string) error QueueDelete(qname string) error Qos(prefetchCount, prefetchSize int, global bool) error } // connection adapts an *amqp.Connection to the amqpConnection interface. type connection struct { conn *amqp.Connection } // Channel creates a new channel. We always want the channel in confirm mode (where // confirmations are delivered for each publish), so we do that here as well. func (c *connection) Channel() (amqpChannel, error) { ch, err := c.conn.Channel() if err != nil { return nil, err } if err := ch.Confirm(wait); err != nil { return nil, err } return &channel{ch}, nil } func (c *connection) Close() error { return c.conn.Close() } // channel adapts an *amqp.Channel to the amqpChannel interface. type channel struct { ch *amqp.Channel } func (ch *channel) Publish(exchange, routingKey string, msg amqp.Publishing) error { return ch.PublishWithContext(context.Background(), exchange, routingKey, msg) } func (ch *channel) PublishWithContext(ctx context.Context, exchange, routingKey string, msg amqp.Publishing) error { return ch.ch.PublishWithContext(ctx, exchange, routingKey, mandatory, immediate, msg) } func (ch *channel) Consume(queue, consumer string) (<-chan amqp.Delivery, error) { return ch.ch.Consume(queue, consumer, false, // autoAck false, // exclusive false, // noLocal wait, nil) // args } func (ch *channel) Ack(tag uint64) error { return ch.ch.Ack(tag, false) // multiple=false: acking only this ID } func (ch *channel) Nack(tag uint64) error { return ch.ch.Nack(tag, false, true) // multiple=false: acking only this ID, requeue: true to redeliver } func (ch *channel) Confirm() error { return ch.ch.Confirm(wait) } func (ch *channel) Cancel(consumer string) error { return ch.ch.Cancel(consumer, wait) } func (ch *channel) Close() error { return ch.ch.Close() } func (ch *channel) NotifyPublish(c chan amqp.Confirmation) chan amqp.Confirmation { return ch.ch.NotifyPublish(c) } func (ch *channel) NotifyReturn(c chan amqp.Return) chan amqp.Return { return ch.ch.NotifyReturn(c) } func (ch *channel) NotifyClose(c chan *amqp.Error) chan *amqp.Error { return ch.ch.NotifyClose(c) } func (ch *channel) ExchangeDeclare(name string) error { return ch.ch.ExchangeDeclare(name, amqp.ExchangeFanout, // kind false, // durable false, // delete when unused false, // internal wait, nil) // args } // QueueDeclareAndBind declares a queue and binds it to an exchange. func (ch *channel) QueueDeclareAndBind(queueName, exchangeName string) error { q, err := ch.ch.QueueDeclare(queueName, false, // durable false, // delete when unused false, // exclusive wait, nil) // args if err != nil { return err } return ch.ch.QueueBind(q.Name, q.Name, exchangeName, wait, nil) } func (ch *channel) ExchangeDelete(name string) error { return ch.ch.ExchangeDelete(name, false, false) } func (ch *channel) QueueDelete(qname string) error { _, err := ch.ch.QueueDelete(qname, false, false, false) return err } func (ch *channel) Qos(prefetchCount, prefetchSize int, global bool) error { return ch.ch.Qos(prefetchCount, prefetchSize, global) } ================================================ FILE: pubsub/rabbitpubsub/doc.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package rabbitpubsub provides an pubsub implementation for RabbitMQ. // Use OpenTopic to construct a *pubsub.Topic, and/or OpenSubscription // to construct a *pubsub.Subscription. // // RabbitMQ follows the AMQP specification, which uses different terminology // than the Go CDK Pub/Sub. // // A Pub/Sub topic is an AMQP exchange. The exchange kind should be "fanout" to match // the Pub/Sub model, although publishing will work with any kind of exchange. // // A Pub/Sub subscription is an AMQP queue. The queue should be bound to the exchange // that is the topic of the subscription. See the package example for details. // // # URLs // // For pubsub.OpenTopic and pubsub.OpenSubscription, rabbitpubsub registers // for the scheme "rabbit". // The default URL opener will connect to a default server based on the // environment variable "RABBIT_SERVER_URL". // To customize the URL opener, or for more details on the URL format, // see URLOpener. // See https://gocloud.dev/concepts/urls/ for background information. // // # Message Delivery Semantics // // RabbitMQ supports at-least-once semantics; applications must // call Message.Ack after processing a message, or it will be redelivered. // See https://godoc.org/gocloud.dev/pubsub#hdr-At_most_once_and_At_least_once_Delivery // for more background. // // # As // // rabbitpubsub exposes the following types for As: // - Topic: *amqp.Connection // - Subscription: *amqp.Connection // - Message.BeforeSend: *amqp.Publishing // - Message.AfterSend: None // - Message: amqp.Delivery // - Error: *amqp.Error and MultiError package rabbitpubsub // import "gocloud.dev/pubsub/rabbitpubsub" ================================================ FILE: pubsub/rabbitpubsub/example_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package rabbitpubsub_test import ( "context" "log" amqp "github.com/rabbitmq/amqp091-go" "gocloud.dev/pubsub" "gocloud.dev/pubsub/rabbitpubsub" ) func ExampleOpenTopic() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() rabbitConn, err := amqp.Dial("amqp://guest:guest@localhost:5672/") if err != nil { log.Fatal(err) } defer rabbitConn.Close() topic := rabbitpubsub.OpenTopic(rabbitConn, "myexchange", nil) defer topic.Shutdown(ctx) } func ExampleOpenSubscription() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() rabbitConn, err := amqp.Dial("amqp://guest:guest@localhost:5672/") if err != nil { log.Fatal(err) } defer rabbitConn.Close() subscription := rabbitpubsub.OpenSubscription(rabbitConn, "myqueue", nil) defer subscription.Shutdown(ctx) } func Example_openTopicFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/pubsub/rabbitpubsub" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // pubsub.OpenTopic creates a *pubsub.Topic from a URL. // This URL will Dial the RabbitMQ server at the URL in the environment // variable RABBIT_SERVER_URL and open the exchange "myexchange". topic, err := pubsub.OpenTopic(ctx, "rabbit://myexchange") if err != nil { log.Fatal(err) } defer topic.Shutdown(ctx) } func Example_openSubscriptionFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/pubsub/rabbitpubsub" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // pubsub.OpenSubscription creates a *pubsub.Subscription from a URL. // This URL will Dial the RabbitMQ server at the URL in the environment // variable RABBIT_SERVER_URL and open the queue "myqueue". subscription, err := pubsub.OpenSubscription(ctx, "rabbit://myqueue") if err != nil { log.Fatal(err) } defer subscription.Shutdown(ctx) } ================================================ FILE: pubsub/rabbitpubsub/fake_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package rabbitpubsub // This file implements a fake for the parts of the AMQP protocol used by our RabbitMQ // implementation. import ( "context" "fmt" "sync" "time" amqp "github.com/rabbitmq/amqp091-go" ) // fakeConnection implements the amqpConnection interface. // It also doubles as the state of the fake server. type fakeConnection struct { mu sync.Mutex closed chan struct{} exchanges map[string]*exchange // exchange names are server-scoped queues map[string]*queue // queue names are server-scoped } // fakeChannel implements the amqpChannel interface. type fakeChannel struct { conn *fakeConnection // The following fields are protected by conn.mu. deliveryTag uint64 // counter; used to distinguish published messages pubChans []chan<- amqp.Confirmation returnChans []chan<- amqp.Return closeChans []chan<- *amqp.Error consumerCancels map[string]func() // from consumer name to cancel func for the context closeMu sync.Mutex closed chan struct{} } // An exchange is a collection of queues. // Every queue is also in the fakeConnection.queues map, so they can be looked up // by name. An exchange needs a list of its own queues (the ones bound to it) so // it can deliver incoming messages to them. type exchange struct { queues []*queue } // A queue holds a set of messages to be delivered. type queue struct { messages []amqp.Delivery pendingAck map[uint64]amqp.Delivery } func newFakeConnection() *fakeConnection { return &fakeConnection{ exchanges: map[string]*exchange{}, queues: map[string]*queue{}, closed: make(chan struct{}), } } // Channel creates a new AMQP fake channel. func (c *fakeConnection) Channel() (amqpChannel, error) { if chanIsClosed(c.closed) { return nil, amqp.ErrClosed } return &fakeChannel{ conn: c, consumerCancels: map[string]func(){}, closed: make(chan struct{}), }, nil } func (c *fakeConnection) Close() error { c.mu.Lock() defer c.mu.Unlock() closeChan(c.closed) return nil } // getExchange returns the named exchange, or error if it doesn't exist. // It closes the channel on error. // It must be called with the lock held. func (ch *fakeChannel) getExchange(name string) (*exchange, error) { if ex := ch.conn.exchanges[name]; ex != nil { return ex, nil } return nil, ch.errorf(amqp.NotFound, "exchange %q not found", name) } // errorf returns an amqp.Error and closes the channel. (In the AMQP protocol, any channel error // closes the channel and makes it unusable.) // It must be called with ch.conn.mu held. func (ch *fakeChannel) errorf(code int, reasonFormat string, args ...any) error { _ = ch.Close() return &amqp.Error{Code: code, Reason: fmt.Sprintf(reasonFormat, args...)} } // Report whether the channel or its connection is closed. Does not require the lock. func (ch *fakeChannel) isClosed() bool { return chanIsClosed(ch.closed) || chanIsClosed(ch.conn.closed) } // ExchangeDeclare creates a new exchange with the given name if one doesn't already // exist. func (ch *fakeChannel) ExchangeDeclare(name string) error { if ch.isClosed() { return amqp.ErrClosed } ch.conn.mu.Lock() defer ch.conn.mu.Unlock() if _, ok := ch.conn.exchanges[name]; !ok { ch.conn.exchanges[name] = &exchange{} } return nil } // QueueDeclareAndBind binds a queue to the given exchange. // The exchange must exist. // If the queue doesn't exist, it's created. func (ch *fakeChannel) QueueDeclareAndBind(queueName, exchangeName string) error { if ch.isClosed() { return amqp.ErrClosed } ch.conn.mu.Lock() defer ch.conn.mu.Unlock() ex, err := ch.getExchange(exchangeName) if err != nil { return err } if _, ok := ch.conn.queues[queueName]; ok { return nil } q := &queue{pendingAck: map[uint64]amqp.Delivery{}} ch.conn.queues[queueName] = q ex.queues = append(ex.queues, q) return nil } func (ch *fakeChannel) Publish(exchangeName, routingKey string, pub amqp.Publishing) error { return ch.PublishWithContext(context.Background(), exchangeName, routingKey, pub) } func (ch *fakeChannel) PublishWithContext(ctx context.Context, exchangeName, routingKey string, pub amqp.Publishing, ) error { if ch.isClosed() { return amqp.ErrClosed } ch.conn.mu.Lock() defer ch.conn.mu.Unlock() ex, err := ch.getExchange(exchangeName) if err != nil { return err } if len(ex.queues) == 0 { // The message is unroutable. Send a Return to all channels registered with // NotifyReturn. ret := amqp.Return{ Exchange: exchangeName, ReplyCode: amqp.NoRoute, ReplyText: "NO_ROUTE: no queues bound to exchange", RoutingKey: routingKey, } for _, c := range ch.returnChans { select { case c <- ret: case <-ch.closed: return amqp.ErrClosed case <-ch.conn.closed: return amqp.ErrClosed } } } else { // Each published message in the channel gets a new delivery tag, starting at 1. ch.deliveryTag++ // Convert the Publishing into a Delivery. del := amqp.Delivery{ Headers: pub.Headers, Body: pub.Body, DeliveryTag: ch.deliveryTag, // We don't care about the other fields. } // All exchanges are "fanout" exchanges, so the message is sent to all queues. for _, q := range ex.queues { q.messages = append(q.messages, del) } } // Every Go channel registered with NotifyPublish gets a confirmation message. // Ack is true even if the message was unroutable. for _, c := range ch.pubChans { select { case c <- amqp.Confirmation{DeliveryTag: ch.deliveryTag, Ack: true}: case <-ch.closed: return amqp.ErrClosed case <-ch.conn.closed: return amqp.ErrClosed } } return nil } // Consume starts a consumer that reads from the given queue. // The consumerName can be used in a Cancel call to stop the consumer. func (ch *fakeChannel) Consume(queueName, consumerName string) (<-chan amqp.Delivery, error) { if ch.isClosed() { return nil, amqp.ErrClosed } ch.conn.mu.Lock() defer ch.conn.mu.Unlock() q, ok := ch.conn.queues[queueName] if !ok { return nil, ch.errorf(amqp.NotFound, "queue %q not found", queueName) } if _, ok := ch.consumerCancels[consumerName]; ok { return nil, ch.errorf(amqp.PreconditionFailed, "consumer %q already exists", consumerName) } ctx, cancel := context.WithCancel(context.Background()) ch.consumerCancels[consumerName] = cancel // used by fakeChannel.Cancel delc := make(chan amqp.Delivery) go func() { // For this simple fake, just deliver one message every once in a while if // any are available, until the consumer is canceled. for { m, ok := ch.takeOneMessage(q) if ok { select { case delc <- m: case <-ctx.Done(): // ignore errors here and below return case <-ch.closed: return case <-ch.conn.closed: return } } select { case <-time.After(10 * time.Millisecond): case <-ctx.Done(): // ignore error return } } }() return delc, nil } // Take a message from q, if one is available. We just remove // the message from the queue permanently. In a more sophisticated implementation // we'd mark it as outstanding and keep it around until it got acked, but we don't // need acks for this fake. func (ch *fakeChannel) takeOneMessage(q *queue) (amqp.Delivery, bool) { ch.conn.mu.Lock() defer ch.conn.mu.Unlock() if len(q.messages) == 0 { return amqp.Delivery{}, false } m := q.messages[0] q.messages = q.messages[1:] q.pendingAck[m.DeliveryTag] = m return m, true } // Ack removes the message from q.pendingAck. func (ch *fakeChannel) Ack(tag uint64) error { if ch.isClosed() { return amqp.ErrClosed } ch.conn.mu.Lock() defer ch.conn.mu.Unlock() for _, q := range ch.conn.queues { if _, ok := q.pendingAck[tag]; ok { delete(q.pendingAck, tag) return nil } } // No error if we couldn't find it to ack it. return nil } // Nack moves the message from q.pendingAck back to q.messages // to be redelivered. func (ch *fakeChannel) Nack(tag uint64) error { if ch.isClosed() { return amqp.ErrClosed } ch.conn.mu.Lock() defer ch.conn.mu.Unlock() for _, q := range ch.conn.queues { if m, ok := q.pendingAck[tag]; ok { delete(q.pendingAck, tag) q.messages = append(q.messages, m) return nil } } // No error if we couldn't find it to nack it. return nil } // Cancel stops the consumer's goroutine. func (ch *fakeChannel) Cancel(consumerName string) error { if ch.isClosed() { return amqp.ErrClosed } ch.conn.mu.Lock() defer ch.conn.mu.Unlock() cancel, ok := ch.consumerCancels[consumerName] if !ok { return ch.errorf(amqp.NotFound, "consumer %q not found", consumerName) } cancel() delete(ch.consumerCancels, consumerName) return nil } // NotifyPublish remembers its argument channel so it can be notified for every // published message. It returns its argument. func (ch *fakeChannel) NotifyPublish(c chan amqp.Confirmation) chan amqp.Confirmation { ch.conn.mu.Lock() defer ch.conn.mu.Unlock() ch.pubChans = append(ch.pubChans, c) return c } // NotifyReturn remembers its argument channel so it can be notified for every // published message that's returned due to being unroutable. func (ch *fakeChannel) NotifyReturn(c chan amqp.Return) chan amqp.Return { ch.conn.mu.Lock() defer ch.conn.mu.Unlock() ch.returnChans = append(ch.returnChans, c) return c } // NotifyClose remembers its argument channel so it can be notified when // the channel is closed. func (ch *fakeChannel) NotifyClose(c chan *amqp.Error) chan *amqp.Error { ch.conn.mu.Lock() defer ch.conn.mu.Unlock() ch.closeChans = append(ch.closeChans, c) return c } // Close marks the fakeChannel as closed and sends an error to all channels // registered with NotifyClose. func (ch *fakeChannel) Close() error { if chanIsClosed(ch.conn.closed) { return amqp.ErrClosed } ch.closeMu.Lock() closeChans := ch.closeChans closeChan(ch.closed) ch.closeMu.Unlock() for _, c := range closeChans { // Don't block on notifying. select { case c <- amqp.ErrClosed: default: } } return nil } func (ch *fakeChannel) ExchangeDelete(name string) error { ch.conn.mu.Lock() defer ch.conn.mu.Unlock() delete(ch.conn.exchanges, name) return nil } func (ch *fakeChannel) QueueDelete(name string) error { ch.conn.mu.Lock() defer ch.conn.mu.Unlock() delete(ch.conn.queues, name) return nil } func (ch *fakeChannel) Qos(_, _ int, _ bool) error { if ch.isClosed() { return amqp.ErrClosed } return nil } // Assumes nothing is ever written to the channel. func chanIsClosed(ch chan struct{}) bool { select { case <-ch: return true default: return false } } // Avoid panic when closing a closed channel. // Must be called with the lock held. func closeChan(ch chan struct{}) { select { case <-ch: default: close(ch) } } ================================================ FILE: pubsub/rabbitpubsub/go.mod ================================================ // Copyright 2018-2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. module gocloud.dev/pubsub/rabbitpubsub go 1.25.0 require ( github.com/rabbitmq/amqp091-go v1.10.0 gocloud.dev v0.45.0 ) require ( cloud.google.com/go/auth v0.18.2 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect github.com/aws/aws-sdk-go-v2 v1.41.4 // indirect github.com/aws/aws-sdk-go-v2/config v1.32.12 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.19.12 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 // indirect github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 // indirect github.com/aws/smithy-go v1.24.2 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/go-cmp v0.7.0 // indirect github.com/google/go-replayers/grpcreplay v1.3.0 // indirect github.com/google/go-replayers/httpreplay v1.2.0 // indirect github.com/google/martian/v3 v3.3.3 // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/google/uuid v1.6.0 // indirect github.com/google/wire v0.7.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.14 // indirect github.com/googleapis/gax-go/v2 v2.19.0 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 // indirect go.opentelemetry.io/otel v1.42.0 // indirect go.opentelemetry.io/otel/metric v1.42.0 // indirect go.opentelemetry.io/otel/sdk v1.42.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.42.0 // indirect go.opentelemetry.io/otel/trace v1.42.0 // indirect golang.org/x/crypto v0.49.0 // indirect golang.org/x/net v0.52.0 // indirect golang.org/x/oauth2 v0.36.0 // indirect golang.org/x/sync v0.20.0 // indirect golang.org/x/sys v0.42.0 // indirect golang.org/x/text v0.35.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect google.golang.org/api v0.272.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260316180232-0b37fe3546d5 // indirect google.golang.org/grpc v1.79.3 // indirect google.golang.org/protobuf v1.36.11 // indirect ) replace gocloud.dev => ../../ ================================================ FILE: pubsub/rabbitpubsub/go.sum ================================================ cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= cloud.google.com/go/auth v0.18.2 h1:+Nbt5Ev0xEqxlNjd6c+yYUeosQ5TtEUaNcN/3FozlaM= cloud.google.com/go/auth v0.18.2/go.mod h1:xD+oY7gcahcu7G2SG2DsBerfFxgPAJz17zz2joOFF3M= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= cloud.google.com/go/monitoring v1.24.3 h1:dde+gMNc0UhPZD1Azu6at2e79bfdztVDS5lvhOdsgaE= cloud.google.com/go/monitoring v1.24.3/go.mod h1:nYP6W0tm3N9H/bOw8am7t62YTzZY+zUeQ+Bi6+2eonI= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/pubsub v1.50.1 h1:fzbXpPyJnSGvWXF1jabhQeXyxdbCIkXTpjXHy7xviBM= cloud.google.com/go/pubsub v1.50.1/go.mod h1:6YVJv3MzWJUVdvQXG081sFvS0dWQOdnV+oTo++q/xFk= cloud.google.com/go/pubsub/v2 v2.4.0 h1:oMKNiBQpXImRWnHYla9uSU66ZzByZwBSCJOEs/pTKVg= cloud.google.com/go/pubsub/v2 v2.4.0/go.mod h1:2lS/XQKq5qtOMs6kHBK+WX1ytUC36kLl2ig3zqsGUx8= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.61.3 h1:VS//ZfBuPGDvakfD9xyPW1RGF1Vy3BWUoVZXgW1KMOg= cloud.google.com/go/storage v1.61.3/go.mod h1:JtqK8BBB7TWv0HVGHubtUdzYYrakOQIsMLffZ2Z/HWk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0 h1:DHa2U07rk8syqvCge0QIGMCE1WxGj9njT44GH7zNJLQ= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 h1:UnDZ/zFfG1JhH/DqxIZYU/1CUAlTUScoXD/LcM2Ykk8= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0/go.mod h1:IA1C1U7jO/ENqm/vhi7V9YYpBsp+IMyqNrEN94N7tVc= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 h1:0s6TxfCu2KHkkZPnBfsQ2y5qia0jl3MMrmBhu3nCOYk= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0/go.mod h1:Mf6O40IAyB9zR/1J8nGDDPirZQQPbYJni8Yisy7NTMc= github.com/aws/aws-sdk-go-v2 v1.41.4 h1:10f50G7WyU02T56ox1wWXq+zTX9I1zxG46HYuG1hH/k= github.com/aws/aws-sdk-go-v2 v1.41.4/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o= github.com/aws/aws-sdk-go-v2/config v1.32.12 h1:O3csC7HUGn2895eNrLytOJQdoL2xyJy0iYXhoZ1OmP0= github.com/aws/aws-sdk-go-v2/config v1.32.12/go.mod h1:96zTvoOFR4FURjI+/5wY1vc1ABceROO4lWgWJuxgy0g= github.com/aws/aws-sdk-go-v2/credentials v1.19.12 h1:oqtA6v+y5fZg//tcTWahyN9PEn5eDU/Wpvc2+kJ4aY8= github.com/aws/aws-sdk-go-v2/credentials v1.19.12/go.mod h1:U3R1RtSHx6NB0DvEQFGyf/0sbrpJrluENHdPy1j/3TE= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 h1:zOgq3uezl5nznfoK3ODuqbhVg1JzAGDUhXOsU0IDCAo= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20/go.mod h1:z/MVwUARehy6GAg/yQ1GO2IMl0k++cu1ohP9zo887wE= github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 h1:CNXO7mvgThFGqOFgbNAP2nol2qAWBOGfqR/7tQlvLmc= github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20/go.mod h1:oydPDJKcfMhgfcgBUZaG+toBbwy8yPWubJXBVERtI4o= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 h1:tN6W/hg+pkM+tf9XDkWUbDEjGLb+raoBMFsTodcoYKw= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20/go.mod h1:YJ898MhD067hSHA6xYCx5ts/jEd8BSOLtQDL3iZsvbc= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 h1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 h1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 h1:2HvVAIq+YqgGotK6EkMf+KIEqTISmTYh5zLpYyeTo1Y= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20/go.mod h1:V4X406Y666khGa8ghKmphma/7C0DAtEQYhkq9z4vpbk= github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 h1:0GFOLzEbOyZABS3PhYfBIx2rNBACYcKty+XGkTgw1ow= github.com/aws/aws-sdk-go-v2/service/signin v1.0.8/go.mod h1:LXypKvk85AROkKhOG6/YEcHFPoX+prKTowKnVdcaIxE= github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 h1:kiIDLZ005EcKomYYITtfsjn7dtOwHDOFy7IbPXKek2o= github.com/aws/aws-sdk-go-v2/service/sso v1.30.13/go.mod h1:2h/xGEowcW/g38g06g3KpRWDlT+OTfxxI0o1KqayAB8= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 h1:jzKAXIlhZhJbnYwHbvUQZEB8KfgAEuG0dc08Bkda7NU= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17/go.mod h1:Al9fFsXjv4KfbzQHGe6V4NZSZQXecFcvaIF4e70FoRA= github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 h1:Cng+OOwCHmFljXIxpEVXAGMnBia8MSU6Ch5i9PgBkcU= github.com/aws/aws-sdk-go-v2/service/sts v1.41.9/go.mod h1:LrlIndBDdjA/EeXeyNBle+gyCwTlizzW5ycgWnvIxkk= github.com/aws/smithy-go v1.24.2 h1:FzA3bu/nt/vDvmnkg+R8Xl46gmzEDam6mZ1hzmwXFng= github.com/aws/smithy-go v1.24.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os8IaYg++6uMOdKK83QtkkvJik= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= github.com/envoyproxy/go-control-plane/envoy v1.37.0 h1:u3riX6BoYRfF4Dr7dwSOroNfdSbEPe9Yyl09/B6wBrQ= github.com/envoyproxy/go-control-plane/envoy v1.37.0/go.mod h1:DReE9MMrmecPy+YvQOAOHNYMALuowAnbjjEMkkWOi6A= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds= github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/go-replayers/grpcreplay v1.3.0 h1:1Keyy0m1sIpqstQmgz307zhiJ1pV4uIlFds5weTmxbo= github.com/google/go-replayers/grpcreplay v1.3.0/go.mod h1:v6NgKtkijC0d3e3RW8il6Sy5sqRVUwoQa4mHOGEy8DI= github.com/google/go-replayers/httpreplay v1.2.0 h1:VM1wEyyjaoU53BwrOnaf9VhAyQQEEioJvFYxYcLRKzk= github.com/google/go-replayers/httpreplay v1.2.0/go.mod h1:WahEFFZZ7a1P4VM1qEeHy+tME4bwyqPcwWbNlUI1Mcg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/wire v0.7.0 h1:JxUKI6+CVBgCO2WToKy/nQk0sS+amI9z9EjVmdaocj4= github.com/google/wire v0.7.0/go.mod h1:n6YbUQD9cPKTnHXEBN2DXlOp/mVADhVErcMFb0v3J18= github.com/googleapis/enterprise-certificate-proxy v0.3.14 h1:yh8ncqsbUY4shRD5dA6RlzjJaT4hi3kII+zYw8wmLb8= github.com/googleapis/enterprise-certificate-proxy v0.3.14/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.19.0 h1:fYQaUOiGwll0cGj7jmHT/0nPlcrZDFPrZRhTsoCr8hE= github.com/googleapis/gax-go/v2 v2.19.0/go.mod h1:w2ROXVdfGEVFXzmlciUU4EdjHgWvB5h2n6x/8XSTTJA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rabbitmq/amqp091-go v1.10.0 h1:STpn5XsHlHGcecLmMFCtg7mqq0RnD+zFr4uzukfVhBw= github.com/rabbitmq/amqp091-go v1.10.0/go.mod h1:Hy4jKW5kQART1u+JkDTF9YYOQUHXqMuhrgxOEeS7G4o= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/detectors/gcp v1.42.0 h1:kpt2PEJuOuqYkPcktfJqWWDjTEd/FNgrxcniL7kQrXQ= go.opentelemetry.io/contrib/detectors/gcp v1.42.0/go.mod h1:W9zQ439utxymRrXsUOzZbFX4JhLxXU4+ZnCt8GG7yA8= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0 h1:yI1/OhfEPy7J9eoa6Sj051C7n5dvpj0QX8g4sRchg04= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0/go.mod h1:NoUCKYWK+3ecatC4HjkRktREheMeEtrXoQxrqYFeHSc= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 h1:OyrsyzuttWTSur2qN/Lm0m2a8yqyIjUVBZcxFPuXq2o= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0/go.mod h1:C2NGBr+kAB4bk3xtMXfZ94gqFDtg/GkI7e9zqGh5Beg= go.opentelemetry.io/otel v1.42.0 h1:lSQGzTgVR3+sgJDAU/7/ZMjN9Z+vUip7leaqBKy4sho= go.opentelemetry.io/otel v1.42.0/go.mod h1:lJNsdRMxCUIWuMlVJWzecSMuNjE7dOYyWlqOXWkdqCc= go.opentelemetry.io/otel/metric v1.42.0 h1:2jXG+3oZLNXEPfNmnpxKDeZsFI5o4J+nz6xUlaFdF/4= go.opentelemetry.io/otel/metric v1.42.0/go.mod h1:RlUN/7vTU7Ao/diDkEpQpnz3/92J9ko05BIwxYa2SSI= go.opentelemetry.io/otel/sdk v1.42.0 h1:LyC8+jqk6UJwdrI/8VydAq/hvkFKNHZVIWuslJXYsDo= go.opentelemetry.io/otel/sdk v1.42.0/go.mod h1:rGHCAxd9DAph0joO4W6OPwxjNTYWghRWmkHuGbayMts= go.opentelemetry.io/otel/sdk/metric v1.42.0 h1:D/1QR46Clz6ajyZ3G8SgNlTJKBdGp84q9RKCAZ3YGuA= go.opentelemetry.io/otel/sdk/metric v1.42.0/go.mod h1:Ua6AAlDKdZ7tdvaQKfSmnFTdHx37+J4ba8MwVCYM5hc= go.opentelemetry.io/otel/trace v1.42.0 h1:OUCgIPt+mzOnaUTpOQcBiM/PLQ/Op7oq6g4LenLmOYY= go.opentelemetry.io/otel/trace v1.42.0/go.mod h1:f3K9S+IFqnumBkKhRJMeaZeNk9epyhnCmQh/EysQCdc= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= google.golang.org/api v0.272.0 h1:eLUQZGnAS3OHn31URRf9sAmRk3w2JjMx37d2k8AjJmA= google.golang.org/api v0.272.0/go.mod h1:wKjowi5LNJc5qarNvDCvNQBn3rVK8nSy6jg2SwRwzIA= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20260316180232-0b37fe3546d5 h1:JNfk58HZ8lfmXbYK2vx/UvsqIL59TzByCxPIX4TDmsE= google.golang.org/genproto v0.0.0-20260316180232-0b37fe3546d5/go.mod h1:x5julN69+ED4PcFk/XWayw35O0lf/nGa4aNgODCmNmw= google.golang.org/genproto/googleapis/api v0.0.0-20260316180232-0b37fe3546d5 h1:CogIeEXn4qWYzzQU0QqvYBM8yDF9cFYzDq9ojSpv0Js= google.golang.org/genproto/googleapis/api v0.0.0-20260316180232-0b37fe3546d5/go.mod h1:EIQZ5bFCfRQDV4MhRle7+OgjNtZ6P1PiZBgAKuxXu/Y= google.golang.org/genproto/googleapis/rpc v0.0.0-20260316180232-0b37fe3546d5 h1:aJmi6DVGGIStN9Mobk/tZOOQUBbj0BPjZjjnOdoZKts= google.golang.org/genproto/googleapis/rpc v0.0.0-20260316180232-0b37fe3546d5/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= ================================================ FILE: pubsub/rabbitpubsub/localrabbit.sh ================================================ #!/usr/bin/env bash # Copyright 2019 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Starts a local RabbitMQ instance via Docker. # https://coderwall.com/p/fkfaqq/safer-bash-scripts-with-set-euxo-pipefail set -euo pipefail echo "Starting RabbitMQ..." docker rm -f rabbit &> /dev/null || : docker run -d --name rabbit -p 5672:5672 rabbitmq:3.10.17 &> /dev/null echo Sleeping to give RabbitMQ some time to come up.... sleep 60 echo "...done. Run \"docker rm -f rabbit\" to clean up the container." echo ================================================ FILE: pubsub/rabbitpubsub/rabbit.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package rabbitpubsub import ( "context" "errors" "fmt" "net/url" "os" "path" "strconv" "strings" "sync" "sync/atomic" "time" amqp "github.com/rabbitmq/amqp091-go" "gocloud.dev/gcerrors" "gocloud.dev/pubsub" "gocloud.dev/pubsub/driver" ) func init() { o := new(defaultDialer) pubsub.DefaultURLMux().RegisterTopic(Scheme, o) pubsub.DefaultURLMux().RegisterSubscription(Scheme, o) } // defaultDialer dials a default Rabbit server based on the environment // variable "RABBIT_SERVER_URL". type defaultDialer struct { mu sync.Mutex conn *amqp.Connection opener *URLOpener } func (o *defaultDialer) defaultConn(ctx context.Context) (*URLOpener, error) { o.mu.Lock() defer o.mu.Unlock() // Re-use the connection if possible. if o.opener != nil && o.conn != nil && !o.conn.IsClosed() { return o.opener, nil } // First time through, or last time resulted in an error, or connection // was closed. Initialize the connection. serverURL := os.Getenv("RABBIT_SERVER_URL") if serverURL == "" { return nil, errors.New("RABBIT_SERVER_URL environment variable not set") } conn, err := amqp.Dial(serverURL) if err != nil { return nil, fmt.Errorf("failed to dial RABBIT_SERVER_URL %q: %w", serverURL, err) } o.conn = conn o.opener = &URLOpener{Connection: conn} return o.opener, nil } func (o *defaultDialer) OpenTopicURL(ctx context.Context, u *url.URL) (*pubsub.Topic, error) { opener, err := o.defaultConn(ctx) if err != nil { return nil, fmt.Errorf("open topic %v: failed to open default connection: %w", u, err) } return opener.OpenTopicURL(ctx, u) } func (o *defaultDialer) OpenSubscriptionURL(ctx context.Context, u *url.URL) (*pubsub.Subscription, error) { opener, err := o.defaultConn(ctx) if err != nil { return nil, fmt.Errorf("open subscription %v: failed to open default connection: %w", u, err) } return opener.OpenSubscriptionURL(ctx, u) } // Scheme is the URL scheme rabbitpubsub registers its URLOpeners under on pubsub.DefaultMux. const Scheme = "rabbit" // URLOpener opens RabbitMQ URLs like "rabbit://myexchange" for // topics or "rabbit://myqueue" for subscriptions. // // For topics, the URL's host+path is used as the exchange name. // // For subscriptions, the URL's host+path is used as the queue name. // // An optional query string can be used to set the Qos consumer prefetch on subscriptions // like "rabbit://myqueue?prefetch_count=1000" to set the consumer prefetch count to 1000 // see also https://www.rabbitmq.com/docs/consumer-prefetch type URLOpener struct { // Connection to use for communication with the server. Connection *amqp.Connection // TopicOptions specifies the options to pass to OpenTopic. TopicOptions TopicOptions // SubscriptionOptions specifies the options to pass to OpenSubscription. SubscriptionOptions SubscriptionOptions } // OpenTopicURL opens a pubsub.Topic based on u. func (o *URLOpener) OpenTopicURL(ctx context.Context, u *url.URL) (*pubsub.Topic, error) { opts := o.TopicOptions for param, value := range u.Query() { switch param { case "key_name": if len(value) != 1 || len(value[0]) == 0 { return nil, fmt.Errorf("open topic %v: invalid query parameter %q", u, param) } opts.KeyName = value[0] default: return nil, fmt.Errorf("open topic %v: invalid query parameter %q", u, param) } } exchangeName := path.Join(u.Host, u.Path) return OpenTopic(o.Connection, exchangeName, &opts), nil } // OpenSubscriptionURL opens a pubsub.Subscription based on u. func (o *URLOpener) OpenSubscriptionURL(ctx context.Context, u *url.URL) (*pubsub.Subscription, error) { opts := o.SubscriptionOptions for param, value := range u.Query() { switch param { case "prefetch_count": if len(value) != 1 || len(value[0]) == 0 { return nil, fmt.Errorf("open subscription %v: invalid query parameter %q", u, param) } prefetchCount, err := strconv.Atoi(value[0]) if err != nil { return nil, fmt.Errorf("open subscription %v: invalid query parameter %q: %w", u, param, err) } opts.PrefetchCount = &prefetchCount default: return nil, fmt.Errorf("open subscription %v: invalid query parameter %q", u, param) } } queueName := path.Join(u.Host, u.Path) return OpenSubscription(o.Connection, queueName, &opts), nil } type topic struct { exchange string // the AMQP exchange conn amqpConnection opts *TopicOptions mu sync.Mutex ch amqpChannel // AMQP channel used for all communication. pubc <-chan amqp.Confirmation // Go channel for server acks of publishes retc <-chan amqp.Return // Go channel for "returned" undeliverable messages closec <-chan *amqp.Error // Go channel for AMQP channel close notifications } // TopicOptions sets options for constructing a *pubsub.Topic backed by // RabbitMQ. type TopicOptions struct { // KeyName optionally sets the Message.Metadata key to use as the optional // RabbitMQ message key. If set, and if a matching Message.Metadata key is found, // the value for that key will be used as the routing key when sending to // RabbitMQ, instead of being added to the message headers. KeyName string } // SubscriptionOptions sets options for constructing a *pubsub.Subscription // backed by RabbitMQ. type SubscriptionOptions struct { // KeyName optionally sets the Message.Metadata key in which to store the // RabbitMQ message key. If set, and if the RabbitMQ message key is non-empty, // the key value will be stored in Message.Metadata under KeyName. KeyName string // Qos property prefetch count. Optional. PrefetchCount *int } // OpenTopic returns a *pubsub.Topic corresponding to the named exchange. // See the package documentation for an example. // // The exchange should already exist (for instance, by using // amqp.Channel.ExchangeDeclare), although this won't be checked until the first call // to SendBatch. For the Go CDK Pub/Sub model to make sense, the exchange should // be a fanout exchange, although nothing in this package enforces that. // // OpenTopic uses the supplied amqp.Connection for all communication. It is the // caller's responsibility to establish this connection before calling OpenTopic, and // to close it when Close has been called on all Topics opened with it. // // The documentation of the amqp package recommends using separate connections for // publishing and subscribing. func OpenTopic(conn *amqp.Connection, name string, opts *TopicOptions) *pubsub.Topic { return pubsub.NewTopic(newTopic(&connection{conn}, name, opts), nil) } func newTopic(conn amqpConnection, name string, opts *TopicOptions) *topic { if opts == nil { opts = &TopicOptions{} } return &topic{ conn: conn, exchange: name, opts: opts, } } // establishChannel creates an AMQP channel if necessary. According to the amqp // package docs, once an error is returned from the channel, it must be discarded and // a new one created. // // Must be called with t.mu held. func (t *topic) establishChannel(ctx context.Context) error { if t.ch != nil { // We already have a channel. select { // If it was closed, open a new one. // (Ignore the error, if any.) case <-t.closec: // If it isn't closed, nothing to do. default: return nil } } var ch amqpChannel err := runWithContext(ctx, func() error { // Create a new channel in confirm mode. var err error ch, err = t.conn.Channel() return err }) if err != nil { return err } t.ch = ch // Get Go channels which will hold acks and returns from the server. The server // will send an ack for each published message to confirm that it was received. // It will return undeliverable messages. // All the Notify methods return their arg. t.pubc = ch.NotifyPublish(make(chan amqp.Confirmation)) t.retc = ch.NotifyReturn(make(chan amqp.Return)) t.closec = ch.NotifyClose(make(chan *amqp.Error, 1)) // closec will get at most one element return nil } // Run f while checking to see if ctx is done. // Return the error from f if it completes, or ctx.Err() if ctx is done. func runWithContext(ctx context.Context, f func() error) error { c := make(chan error, 1) // buffer so the goroutine can finish even if ctx is done go func() { c <- f() }() select { case <-ctx.Done(): return ctx.Err() case err := <-c: return err } } // SendBatch implements driver.SendBatch. func (t *topic) SendBatch(ctx context.Context, ms []*driver.Message) error { // It is simplest to allow only one SendBatch at a time. Allowing concurrent // calls to SendBatch would complicate the logic of receiving publish // confirmations and returns. We can go that route if performance warrants it. t.mu.Lock() defer t.mu.Unlock() if err := t.establishChannel(ctx); err != nil { return err } // Receive from Go channels concurrently or we will deadlock with the Publish // RPC. (The amqp package docs recommend setting the capacity of the Go channel // to the number of messages to be published, but we can't do that because we // want to reuse the channel for all calls to SendBatch--it takes two RPCs to set // up.) errc := make(chan error, 1) cctx, cancel := context.WithCancel(ctx) defer cancel() ch := t.ch // Avoid touching t.ch while goroutine is running. go func() { // This goroutine runs with t.mu held because its lifetime is within the // lifetime of the t.mu.Lock call at the start of SendBatch. errc <- t.receiveFromPublishChannels(cctx, len(ms)) }() var perr error for _, m := range ms { routingKey, pub := toRoutingKeyAndAMQPPublishing(m, t.opts) if m.BeforeSend != nil { asFunc := func(i any) bool { if p, ok := i.(**amqp.Publishing); ok { *p = &pub return true } return false } if err := m.BeforeSend(asFunc); err != nil { return err } } if perr = ch.Publish(t.exchange, routingKey, pub); perr != nil { cancel() break } if m.AfterSend != nil { asFunc := func(i any) bool { return false } if err := m.AfterSend(asFunc); err != nil { return err } } } // Wait for the goroutine to finish. err := <-errc // If we got an error from Publish, prefer that. if perr != nil { // Set t.ch to nil because an AMQP channel is broken after error. // Do this here, after the goroutine has finished, rather than in the Publish loop // above, to avoid a race condition. t.ch = nil err = perr } // If there is only one error, return it rather than a MultiError. That // will work better with ErrorCode and ErrorAs. var merr MultiError if errors.As(err, &merr) && len(merr) == 1 { return merr[0] } return err } // Read from the channels established with NotifyPublish and NotifyReturn. // Must be called with t.mu held. func (t *topic) receiveFromPublishChannels(ctx context.Context, nMessages int) error { // Consume all the acknowledgments for the messages we are publishing, and also // get returned messages. The server will send exactly one ack for each published // message (successful or not), and one return for each undeliverable message. // Since SendBatch (the only caller of this method) holds the lock, we expect // exactly as many acks as messages. var merr MultiError nAcks := 0 for nAcks < nMessages { select { case <-ctx.Done(): if t.ch != nil { // Channel will be in a weird state (not all publish acks consumed, perhaps) // so re-create it next time. t.ch.Close() t.ch = nil } return ctx.Err() case ret, ok := <-t.retc: if !ok { // Channel closed. Handled in the pubc case below. But set // the channel to nil to prevent it from being selected again. t.retc = nil } else { // The message was returned from the server because it is unroutable. // Record the error and continue so we drain all // items from pubc. We don't need to re-establish the channel on this // error. merr = append(merr, fmt.Errorf("rabbitpubsub: message returned from %s: %s (code %d)", ret.Exchange, ret.ReplyText, ret.ReplyCode)) } case conf, ok := <-t.pubc: if !ok { // t.pubc was closed unexpectedly. t.ch = nil // re-create the channel on next use if merr != nil { return merr } // t.closec must be closed too. See if it has an error. if err := closeErr(t.closec); err != nil { merr = append(merr, err) return merr } // We shouldn't be here, but if we are, we still want to return an // error. merr = append(merr, errors.New("rabbitpubsub: publish listener closed unexpectedly")) return merr } nAcks++ if !conf.Ack { merr = append(merr, errors.New("rabbitpubsub: ack failed on publish")) } } } if merr != nil { return merr } // Returning a nil merr would mean the returned error interface value is non-nil, so return nil explicitly. return nil } // A MultiError is an error that contains multiple errors. type MultiError []error func (m MultiError) Error() string { var s []string for _, e := range m { s = append(s, e.Error()) } return strings.Join(s, "; ") } // Return the error from a Go channel monitoring the closing of an AMQP channel. // closec must have been registered via Channel.NotifyClose. // When closeErr is called, we expect closec to be closed. If it isn't, we also // consider that an error. func closeErr(closec <-chan *amqp.Error) error { select { case aerr := <-closec: // This nil check is necessary. aerr is of type *amqp.Error. If we // returned it directly (effectively assigning it to a variable of // type error), then the return value would not be a nil interface // value even if aerr was a nil pointer, and that would break tests // like "if err == nil ...". if aerr == nil { return nil } return aerr default: return errors.New("rabbitpubsub: NotifyClose Go channel is unexpectedly open") } } // toRoutingKeyAndAMQPPublishing converts a driver.Message to a pair routingKey + amqp.Publishing. func toRoutingKeyAndAMQPPublishing(m *driver.Message, opts *TopicOptions) (routingKey string, msg amqp.Publishing) { h := amqp.Table{} for k, v := range m.Metadata { if opts.KeyName == k { routingKey = v } else { h[k] = v } } msg = amqp.Publishing{ Headers: h, Body: m.Body, } return routingKey, msg } // IsRetryable implements driver.Topic.IsRetryable. func (*topic) IsRetryable(err error) bool { return isRetryable(err) } func (*topic) ErrorCode(err error) gcerrors.ErrorCode { return errorCode(err) } var errorCodes = map[int]gcerrors.ErrorCode{ amqp.NotFound: gcerrors.NotFound, amqp.PreconditionFailed: gcerrors.FailedPrecondition, // These next indicate a bug in our driver, not the user's code. amqp.SyntaxError: gcerrors.Internal, amqp.CommandInvalid: gcerrors.Internal, amqp.InternalError: gcerrors.Internal, amqp.NotImplemented: gcerrors.Unimplemented, amqp.ChannelError: gcerrors.FailedPrecondition, // typically channel closed } func errorCode(err error) gcerrors.ErrorCode { var aerr *amqp.Error if !errors.As(err, &aerr) { return gcerrors.Unknown } if ec, ok := errorCodes[aerr.Code]; ok { return ec } return gcerrors.Unknown } func isRetryable(err error) bool { var aerr *amqp.Error if !errors.As(err, &aerr) { return false } // amqp.Error has a Recover field which sounds like it should mean "retryable". // But it actually means "can be recovered by retrying later or with different // parameters," which is not what we want. The error codes for which Recover is // true, defined in the isSoftExceptionCode function of // https://github.com/rabbitmq/amqp091-go/blob/main/spec091.go, including things // like NotFound and AccessRefused, which require outside action. // // The following are the codes which might be resolved by retry without external // action, according to the AMQP 0.91 spec // (https://www.rabbitmq.com/amqp-0-9-1-reference.html#constants). The quotations // are from that page. switch aerr.Code { case amqp.ContentTooLarge: // "The client attempted to transfer content larger than the server could // accept at the present time. The client may retry at a later time." return true case amqp.ConnectionForced: // "An operator intervened to close the connection for some reason. The // client may retry at some later date." return true default: return false } } // As implements driver.Topic.As. func (t *topic) As(i any) bool { c, ok := i.(**amqp.Connection) if !ok { return false } conn, ok := t.conn.(*connection) if !ok { // running against the fake return false } *c = conn.conn return true } // ErrorAs implements driver.Topic.ErrorAs func (*topic) ErrorAs(err error, i any) bool { return errorAs(err, i) } func errorAs(err error, i any) bool { var aerr *amqp.Error if errors.As(err, &aerr) { if p, ok := i.(**amqp.Error); ok { *p = aerr return true } } var merr MultiError if errors.As(err, &merr) { if p, ok := i.(*MultiError); ok { *p = merr return true } } return false } // Close implements driver.Topic.Close. func (*topic) Close() error { return nil } // OpenSubscription returns a *pubsub.Subscription corresponding to the named queue. // See the package documentation for an example. // // The queue must have been previously created (for instance, by using // amqp.Channel.QueueDeclare) and bound to an exchange. // // OpenSubscription uses the supplied amqp.Connection for all communication. It is // the caller's responsibility to establish this connection before calling // OpenSubscription and to close it when Close has been called on all Subscriptions // opened with it. // // The documentation of the amqp package recommends using separate connections for // publishing and subscribing. func OpenSubscription(conn *amqp.Connection, name string, opts *SubscriptionOptions) *pubsub.Subscription { return pubsub.NewSubscription(newSubscription(&connection{conn}, name, opts), nil, nil) } type subscription struct { conn amqpConnection queue string // the AMQP queue name consumer string // the client-generated name for this particular subscriber opts *SubscriptionOptions mu sync.Mutex ch amqpChannel // AMQP channel used for all communication. delc <-chan amqp.Delivery closec <-chan *amqp.Error receiveBatchHook func() // for testing } var nextConsumer int64 // atomic func newSubscription(conn amqpConnection, name string, opts *SubscriptionOptions) *subscription { if opts == nil { opts = &SubscriptionOptions{} } return &subscription{ conn: conn, queue: name, consumer: fmt.Sprintf("c%d", atomic.AddInt64(&nextConsumer, 1)), opts: opts, receiveBatchHook: func() {}, } } // Must be called with s.mu held. func (s *subscription) establishChannel(ctx context.Context) error { if s.ch != nil { // We already have a channel. select { // If it was closed, open a new one. // (Ignore the error, if any.) case <-s.closec: // If it isn't closed, nothing to do. default: return nil } } var ch amqpChannel err := runWithContext(ctx, func() error { // Create a new channel. var err error ch, err = s.conn.Channel() if err != nil { return err } // Apply subscription options to channel. err = applyOptionsToChannel(s.opts, ch) if err != nil { return err } // Subscribe to messages from the queue. s.delc, err = ch.Consume(s.queue, s.consumer) return err }) if err != nil { return err } s.ch = ch s.closec = ch.NotifyClose(make(chan *amqp.Error, 1)) // closec will get at most one element return nil } func applyOptionsToChannel(opts *SubscriptionOptions, ch amqpChannel) error { if opts.PrefetchCount == nil { return nil } if err := ch.Qos(*opts.PrefetchCount, 0, false); err != nil { return fmt.Errorf("unable to set channel Qos: %w", err) } return nil } // ReceiveBatch implements driver.Subscription.ReceiveBatch. func (s *subscription) ReceiveBatch(ctx context.Context, maxMessages int) ([]*driver.Message, error) { s.mu.Lock() defer s.mu.Unlock() if err := s.establishChannel(ctx); err != nil { return nil, err } s.receiveBatchHook() // Get up to maxMessages waiting messages, but don't take too long. var ms []*driver.Message maxTime := time.NewTimer(50 * time.Millisecond) for { select { case <-ctx.Done(): // Cancel the Consume. _ = s.ch.Cancel(s.consumer) // ignore the error s.ch = nil return nil, ctx.Err() case d, ok := <-s.delc: if !ok { // channel closed s.ch = nil // re-establish the channel next time if len(ms) > 0 { return ms, nil } // s.closec must be closed too. See if it has an error. if err := closeErr(s.closec); err != nil { // PreconditionFailed can happen if we send an Ack or Nack for a // message that has already been acked/nacked. Ignore those errors. var aerr *amqp.Error if errors.As(err, &aerr) && aerr.Code == amqp.PreconditionFailed { return nil, nil } return nil, err } // We shouldn't be here, but if we are, we still want to return an // error. return nil, errors.New("rabbitpubsub: delivery channel closed unexpectedly") } ms = append(ms, toDriverMessage(d, s.opts)) if len(ms) >= maxMessages { return ms, nil } case <-maxTime.C: // Timed out. Return whatever we have. If we have nothing, we'll get // called again soon, but returning allows us to give up the lock in // case there are acks/nacks to be sent. return ms, nil } } } // toDriverMessage converts an amqp.Delivery (a received message) to a driver.Message. func toDriverMessage(d amqp.Delivery, opts *SubscriptionOptions) *driver.Message { // Delivery.Headers is a map[string]any, so we have to // convert each value to a string. md := map[string]string{} for k, v := range d.Headers { md[k] = fmt.Sprint(v) } // Add a metadata entry for the message routing key if appropriate. if d.RoutingKey != "" && opts.KeyName != "" { md[opts.KeyName] = d.RoutingKey } loggableID := d.MessageId if loggableID == "" { loggableID = d.CorrelationId } if loggableID == "" { loggableID = fmt.Sprintf("DeliveryTag %d", d.DeliveryTag) } return &driver.Message{ LoggableID: loggableID, Body: d.Body, AckID: d.DeliveryTag, Metadata: md, AsFunc: func(i any) bool { p, ok := i.(*amqp.Delivery) if !ok { return false } *p = d return true }, } } // SendAcks implements driver.Subscription.SendAcks. func (s *subscription) SendAcks(ctx context.Context, ackIDs []driver.AckID) error { return s.sendAcksOrNacks(ctx, ackIDs, true) } // CanNack implements driver.CanNack. func (s *subscription) CanNack() bool { return true } // SendNacks implements driver.Subscription.SendNacks. func (s *subscription) SendNacks(ctx context.Context, ackIDs []driver.AckID) error { return s.sendAcksOrNacks(ctx, ackIDs, false) } func (s *subscription) sendAcksOrNacks(ctx context.Context, ackIDs []driver.AckID, ack bool) error { s.mu.Lock() defer s.mu.Unlock() if err := s.establishChannel(ctx); err != nil { return err } // Ack/Nack calls don't wait for a response, so this loop should execute relatively // quickly. // It wouldn't help to make it concurrent, because Channel.Ack/Nack grabs a // channel-wide mutex. (We could consider using multiple channels if performance // becomes an issue.) for _, id := range ackIDs { if ctx.Err() != nil { return ctx.Err() } var err error if ack { err = s.ch.Ack(id.(uint64)) } else { err = s.ch.Nack(id.(uint64)) } if err != nil { s.ch = nil // re-establish channel after an error return err } } return nil } // IsRetryable implements driver.Subscription.IsRetryable. func (*subscription) IsRetryable(err error) bool { return isRetryable(err) } func (*subscription) ErrorCode(err error) gcerrors.ErrorCode { return errorCode(err) } // As implements driver.Subscription.As. func (s *subscription) As(i any) bool { c, ok := i.(**amqp.Connection) if !ok { return false } conn, ok := s.conn.(*connection) if !ok { // running against the fake return false } *c = conn.conn return true } // ErrorAs implements driver.Subscription.ErrorAs func (*subscription) ErrorAs(err error, i any) bool { return errorAs(err, i) } // Close implements driver.Subscription.Close. func (*subscription) Close() error { return nil } ================================================ FILE: pubsub/rabbitpubsub/rabbit_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package rabbitpubsub // To run these tests against a real RabbitMQ server, first run localrabbit.sh. // Then wait a few seconds for the server to be ready. // If no server is running, the tests will use a fake (see fake_test.go). import ( "context" "errors" "fmt" "io" "os" "strings" "sync" "sync/atomic" "testing" "time" amqp "github.com/rabbitmq/amqp091-go" "gocloud.dev/gcerrors" "gocloud.dev/internal/testing/setup" "gocloud.dev/pubsub" "gocloud.dev/pubsub/driver" "gocloud.dev/pubsub/drivertest" ) const rabbitURL = "amqp://guest:guest@localhost:5672/" var logOnce sync.Once func mustDialRabbit(t testing.TB) amqpConnection { t.Helper() if !setup.HasDockerTestEnvironment() { logOnce.Do(func() { t.Log("using the fake because the RabbitMQ server is not available") }) return newFakeConnection() } conn, err := amqp.Dial(rabbitURL) if err != nil { t.Fatal(err) } logOnce.Do(func() { t.Logf("using the RabbitMQ server at %s", rabbitURL) }) return &connection{conn} } func TestConformance(t *testing.T) { harnessMaker := func(_ context.Context, t *testing.T) (drivertest.Harness, error) { t.Helper() return &harness{conn: mustDialRabbit(t)}, nil } _, isFake := mustDialRabbit(t).(*fakeConnection) asTests := []drivertest.AsTest{rabbitAsTest{isFake}} drivertest.RunConformanceTests(t, harnessMaker, asTests) // Run the conformance tests with the fake if we haven't. if isFake { return } t.Logf("now running tests with the fake") harnessMaker = func(_ context.Context, t *testing.T) (drivertest.Harness, error) { t.Helper() return &harness{conn: newFakeConnection()}, nil } asTests = []drivertest.AsTest{rabbitAsTest{true}} drivertest.RunConformanceTests(t, harnessMaker, asTests) } func BenchmarkRabbit(b *testing.B) { ctx := context.Background() h := &harness{conn: mustDialRabbit(b)} dt, cleanup, err := h.CreateTopic(ctx, b.Name()) if err != nil { b.Fatal(err) } defer cleanup() ds, cleanup, err := h.CreateSubscription(ctx, dt, b.Name()) if err != nil { b.Fatal(err) } defer cleanup() topic := pubsub.NewTopic(dt, nil) defer topic.Shutdown(ctx) sub := pubsub.NewSubscription(ds, nil, nil) defer sub.Shutdown(ctx) drivertest.RunBenchmarks(b, topic, sub) } type harness struct { conn amqpConnection numTopics uint32 numSubs uint32 } func (h *harness) CreateTopic(_ context.Context, testName string) (dt driver.Topic, cleanup func(), err error) { exchange := fmt.Sprintf("%s-topic-%d", testName, atomic.AddUint32(&h.numTopics, 1)) if err := declareExchange(h.conn, exchange); err != nil { return nil, nil, err } cleanup = func() { ch, err := h.conn.Channel() if err != nil { panic(err) } ch.ExchangeDelete(exchange) } return newTopic(h.conn, exchange, nil), cleanup, nil } func (h *harness) MakeNonexistentTopic(context.Context) (driver.Topic, error) { return newTopic(h.conn, "nonexistent-topic", nil), nil } func (h *harness) CreateSubscription(_ context.Context, dt driver.Topic, testName string) (ds driver.Subscription, cleanup func(), err error) { queue := fmt.Sprintf("%s-subscription-%d", testName, atomic.AddUint32(&h.numSubs, 1)) if err := bindQueue(h.conn, queue, dt.(*topic).exchange); err != nil { return nil, nil, err } cleanup = func() { ch, err := h.conn.Channel() if err != nil { panic(err) } ch.QueueDelete(queue) } ds = newSubscription(h.conn, queue, nil) return ds, cleanup, nil } func (h *harness) MakeNonexistentSubscription(_ context.Context) (driver.Subscription, func(), error) { return newSubscription(h.conn, "nonexistent-subscription", nil), func() {}, nil } func (h *harness) Close() { h.conn.Close() } func (h *harness) MaxBatchSizes() (int, int) { return 0, 0 } func (*harness) SupportsMultipleSubscriptions() bool { return true } func TestUnroutable(t *testing.T) { // Expect that we get an error on publish if the exchange has no queue bound to it. // The error should be a MultiError containing one error per message. ctx := context.Background() conn := mustDialRabbit(t) defer conn.Close() if err := declareExchange(conn, "u"); err != nil { t.Fatal(err) } topic := newTopic(conn, "u", nil) msgs := []*driver.Message{ {Body: []byte("")}, {Body: []byte("")}, } err := topic.SendBatch(ctx, msgs) var merr MultiError if !topic.ErrorAs(err, &merr) { t.Fatalf("got error of type %T, want MultiError", err) } if got, want := len(merr), len(msgs); got != want { t.Fatalf("got %d errors, want %d", got, want) } // Test MultiError.Error. if got, want := strings.Count(merr.Error(), ";")+1, len(merr); got != want { t.Errorf("got %d semicolon-separated messages, want %d", got, want) } // Test each individual error. for i, err := range merr { if !strings.Contains(err.Error(), "NO_ROUTE") { t.Errorf("%d: got %v, want an error with 'NO_ROUTE'", i, err) } } } func TestErrorCode(t *testing.T) { for _, test := range []struct { in error want gcerrors.ErrorCode }{ {nil, gcerrors.Unknown}, {&os.PathError{}, gcerrors.Unknown}, {&amqp.Error{Code: amqp.SyntaxError}, gcerrors.Internal}, {&amqp.Error{Code: amqp.NotImplemented}, gcerrors.Unimplemented}, {&amqp.Error{Code: amqp.ContentTooLarge}, gcerrors.Unknown}, } { if got := errorCode(test.in); got != test.want { t.Errorf("%v: got %s, want %s", test.in, got, test.want) } } } func TestOpens(t *testing.T) { ctx := context.Background() if got := OpenTopic(nil, "t", nil); got == nil { t.Error("got nil, want non-nil") } else { got.Shutdown(ctx) } if got := OpenSubscription(nil, "s", nil); got == nil { t.Error("got nil, want non-nil") } else { got.Shutdown(ctx) } } func TestIsRetryable(t *testing.T) { for _, test := range []struct { err error want bool }{ {errors.New("xyz"), false}, {io.ErrUnexpectedEOF, false}, {&amqp.Error{Code: amqp.AccessRefused}, false}, {&amqp.Error{Code: amqp.ContentTooLarge}, true}, {&amqp.Error{Code: amqp.ConnectionForced}, true}, } { got := isRetryable(test.err) if got != test.want { t.Errorf("%+v: got %t, want %t", test.err, got, test.want) } } } func TestRunWithContext(t *testing.T) { // runWithContext will run its argument to completion if the context isn't done. e := errors.New("") // f sleeps for a bit just to give the scheduler a chance to run. f := func() error { time.Sleep(100 * time.Millisecond); return e } got := runWithContext(context.Background(), f) if want := e; got != want { t.Errorf("got %v, want %v", got, want) } // runWithContext will return ctx.Err if context is done. ctx, cancel := context.WithCancel(context.Background()) cancel() got = runWithContext(ctx, f) if want := context.Canceled; got != want { t.Errorf("got %v, want %v", got, want) } } func declareExchange(conn amqpConnection, name string) error { ch, err := conn.Channel() if err != nil { panic(err) } defer ch.Close() return ch.ExchangeDeclare(name) } func bindQueue(conn amqpConnection, queueName, exchangeName string) error { ch, err := conn.Channel() if err != nil { return err } defer ch.Close() return ch.QueueDeclareAndBind(queueName, exchangeName) } type rabbitAsTest struct { usingFake bool } func (rabbitAsTest) Name() string { return "rabbit test" } func (r rabbitAsTest) TopicCheck(topic *pubsub.Topic) error { var conn2 amqp.Connection if topic.As(&conn2) { return fmt.Errorf("cast succeeded for %T, want failure", &conn2) } if !r.usingFake { var conn3 *amqp.Connection if !topic.As(&conn3) { return fmt.Errorf("cast failed for %T", &conn3) } } return nil } func (r rabbitAsTest) SubscriptionCheck(sub *pubsub.Subscription) error { var conn2 amqp.Connection if sub.As(&conn2) { return fmt.Errorf("cast succeeded for %T, want failure", &conn2) } if !r.usingFake { var conn3 *amqp.Connection if !sub.As(&conn3) { return fmt.Errorf("cast failed for %T", &conn3) } } return nil } func (rabbitAsTest) TopicErrorCheck(t *pubsub.Topic, err error) error { var aerr *amqp.Error if !t.ErrorAs(err, &aerr) { return fmt.Errorf("failed to convert %v (%T) to an amqp.Error", err, err) } if aerr.Code != amqp.NotFound { return fmt.Errorf("got code %v, want NotFound", aerr.Code) } err = MultiError{err} var merr MultiError if !t.ErrorAs(err, &merr) { return fmt.Errorf("failed to convert %v (%T) to a MultiError", err, err) } var perr *os.PathError if t.ErrorAs(err, &perr) { return errors.New("got true for PathError, want false") } return nil } func (rabbitAsTest) SubscriptionErrorCheck(s *pubsub.Subscription, err error) error { var aerr *amqp.Error if !s.ErrorAs(err, &aerr) { return fmt.Errorf("failed to convert %v (%T) to an amqp.Error", err, err) } if aerr.Code != amqp.NotFound { return fmt.Errorf("got code %v, want NotFound", aerr.Code) } err = MultiError{err} var merr MultiError if !s.ErrorAs(err, &merr) { return fmt.Errorf("failed to convert %v (%T) to a MultiError", err, err) } var perr *os.PathError if s.ErrorAs(err, &perr) { return errors.New("got true for PathError, want false") } return nil } func (r rabbitAsTest) MessageCheck(m *pubsub.Message) error { var pd *amqp.Delivery if m.As(&pd) { return fmt.Errorf("cast succeeded for %T, want failure", &pd) } if !r.usingFake { var d amqp.Delivery if !m.As(&d) { return fmt.Errorf("cast failed for %T", &d) } } return nil } func (rabbitAsTest) BeforeSend(as func(any) bool) error { var pub *amqp.Publishing if !as(&pub) { return fmt.Errorf("cast failed for %T", &pub) } return nil } func (rabbitAsTest) AfterSend(as func(any) bool) error { return nil } func TestOpenTopicFromURL(t *testing.T) { t.Setenv("RABBIT_SERVER_URL", rabbitURL) tests := []struct { label string URLTemplate string WantErr bool }{ {"valid url", "rabbit://%s", false}, {"valid url with key name parameter", "rabbit://%s?key_name=foo", false}, {"invalid url with parameters", "rabbit://%s?param=value", true}, {"invalid url with key name parameter", "rabbit://%s?key_name=", true}, } for _, test := range tests { t.Run(test.label, func(t *testing.T) { conn := mustDialRabbit(t) _, isFake := conn.(*fakeConnection) if isFake { t.Skip("test requires real rabbitmq") } h := &harness{conn: conn} ctx := context.Background() dt, cleanupTopic, err := h.CreateTopic(ctx, t.Name()) if err != nil { t.Fatalf("unable to create topic: %v", err) } t.Cleanup(cleanupTopic) exchange := dt.(*topic).exchange url := fmt.Sprintf(test.URLTemplate, exchange) topic, err := pubsub.OpenTopic(ctx, url) if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URLTemplate, err, test.WantErr) } if topic != nil { topic.Shutdown(ctx) } }) } } func TestOpenSubscriptionFromURL(t *testing.T) { t.Setenv("RABBIT_SERVER_URL", rabbitURL) tests := []struct { label string URLTemplate string WantErr bool }{ {"url with no QoS prefetch count", "rabbit://%s", false}, {"invalid parameters", "rabbit://%s?param=value", true}, {"valid url with QoS prefetch count", "rabbit://%s?prefetch_count=1024", false}, {"invalid url with QoS prefetch count", "rabbit://%s?prefetch_count=value", true}, } for _, test := range tests { t.Run(test.label, func(t *testing.T) { conn := mustDialRabbit(t) _, isFake := conn.(*fakeConnection) if isFake { t.Skip("test requires real rabbitmq") } h := &harness{conn: conn} ctx := context.Background() dt, cleanupTopic, err := h.CreateTopic(ctx, t.Name()) if err != nil { t.Fatalf("unable to create topic: %v", err) } t.Cleanup(cleanupTopic) ds, cleanupSubscription, err := h.CreateSubscription(ctx, dt, t.Name()) if err != nil { t.Fatalf("unable to create subscription: %v", err) } t.Cleanup(cleanupSubscription) queue := ds.(*subscription).queue url := fmt.Sprintf(test.URLTemplate, queue) sub, err := pubsub.OpenSubscription(ctx, url) if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URLTemplate, err, test.WantErr) } if sub != nil { sub.Shutdown(ctx) } }) } } ================================================ FILE: pubsub/sub_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package pubsub_test import ( "context" "testing" "gocloud.dev/pubsub" "gocloud.dev/pubsub/driver" ) // scriptedSub returns batches of messages in a predefined order from // ReceiveBatch. type scriptedSub struct { driver.Subscription // batches contains slices of messages to return from ReceiveBatch, one // after the other. batches [][]*driver.Message // calls counts how many times ReceiveBatch has been called. calls int // closed records if Close was called. closed bool } func (s *scriptedSub) ReceiveBatch(ctx context.Context, maxMessages int) ([]*driver.Message, error) { b := s.batches[s.calls] s.calls++ return b, nil } func (s *scriptedSub) SendAcks(ctx context.Context, ackIDs []driver.AckID) error { return nil } func (*scriptedSub) CanNack() bool { return false } func (s *scriptedSub) Close() error { s.closed = true return nil } func TestReceiveWithEmptyBatchReturnedFromDriver(t *testing.T) { ctx := context.Background() ds := &scriptedSub{ batches: [][]*driver.Message{ // First call gets an empty batch. {}, // Second call gets a non-empty batch. {&driver.Message{}}, }, } sub := pubsub.NewSubscription(ds, nil, nil) defer sub.Shutdown(ctx) m, err := sub.Receive(ctx) if err != nil { t.Fatal(err) } m.Ack() } func TestSubscriptionCloseIsCalled(t *testing.T) { ctx := context.Background() ds := &scriptedSub{} sub := pubsub.NewSubscription(ds, nil, nil) sub.Shutdown(ctx) if !ds.closed { t.Error("want Subscription.Close to have been called") } } ================================================ FILE: runtimevar/awsparamstore/awsparamstore.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package awsparamstore provides a runtimevar implementation with variables // read from AWS Systems Manager Parameter Store // (https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-paramstore.html) // Use OpenVariable to construct a *runtimevar.Variable. // // # URLs // // For runtimevar.OpenVariable, awsparamstore registers for the scheme "awsparamstore". // The default URL opener will use an AWS session with the default credentials // and configuration. // // To customize the URL opener, or for more details on the URL format, // see URLOpener. // See https://gocloud.dev/concepts/urls/ for background information. // // # As // // awsparamstore exposes the following types for As: // - Snapshot: *ssm.GetParameterOutput // - Error: any error type returned by the service, notably smithy.APIError package awsparamstore // import "gocloud.dev/runtimevar/awsparamstore" import ( "context" "errors" "fmt" "net/url" "path" "strings" "sync" "time" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/ssm" "github.com/aws/smithy-go" "github.com/google/wire" gcaws "gocloud.dev/aws" "gocloud.dev/gcerrors" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/driver" ) func init() { runtimevar.DefaultURLMux().RegisterVariable(Scheme, new(lazySessionOpener)) } // Set holds Wire providers for this package. var Set = wire.NewSet( Dial, ) // Dial gets an AWS SSM service client using the AWS SDK V2. func Dial(cfg aws.Config) *ssm.Client { return ssm.NewFromConfig(cfg) } // URLOpener opens AWS Paramstore URLs like "awsparamstore://myvar". // // See https://pkg.go.dev/gocloud.dev/aws#V2ConfigFromURLParams. // // In addition, the following URL parameters are supported: // - decoder: The decoder to use. Defaults to URLOpener.Decoder, or // runtimevar.BytesDecoder if URLOpener.Decoder is nil. // See runtimevar.DecoderByName for supported values. // - wait: The poll interval, in time.ParseDuration formats. // Defaults to 30s. type URLOpener struct { // Decoder specifies the decoder to use if one is not specified in the URL. // Defaults to runtimevar.BytesDecoder. Decoder *runtimevar.Decoder // Options specifies the options to pass to New. Options Options } // lazySessionOpener obtains the AWS session from the environment on the first // call to OpenVariableURL. type lazySessionOpener struct { init sync.Once opener *URLOpener err error } func (o *lazySessionOpener) OpenVariableURL(ctx context.Context, u *url.URL) (*runtimevar.Variable, error) { opener := &URLOpener{} return opener.OpenVariableURL(ctx, u) } // Scheme is the URL scheme awsparamstore registers its URLOpener under on runtimevar.DefaultMux. const Scheme = "awsparamstore" // OpenVariableURL opens the variable at the URL's path. See the package doc // for more details. func (o *URLOpener) OpenVariableURL(ctx context.Context, u *url.URL) (*runtimevar.Variable, error) { q := u.Query() decoderName := q.Get("decoder") q.Del("decoder") decoder, err := runtimevar.DecoderByName(ctx, decoderName, o.Decoder) if err != nil { return nil, fmt.Errorf("open variable %v: invalid decoder: %v", u, err) } opts := o.Options if s := q.Get("wait"); s != "" { q.Del("wait") d, err := time.ParseDuration(s) if err != nil { return nil, fmt.Errorf("open variable %v: invalid wait %q: %v", u, s, err) } opts.WaitDuration = d } cfg, err := gcaws.V2ConfigFromURLParams(ctx, q) if err != nil { return nil, fmt.Errorf("open variable %v: %v", u, err) } return OpenVariable(ssm.NewFromConfig(cfg), path.Join(u.Host, u.Path), decoder, &opts) } // Options sets options. type Options struct { // WaitDuration controls the rate at which Parameter Store is polled. // Defaults to 30 seconds. WaitDuration time.Duration } // OpenVariable constructs a *runtimevar.Variable backed by the variable name in // AWS Systems Manager Parameter Store, using AWS SDK V2. // Parameter Store returns raw bytes; provide a decoder to decode the raw bytes // into the appropriate type for runtimevar.Snapshot.Value. // See the runtimevar package documentation for examples of decoders. func OpenVariable(client *ssm.Client, name string, decoder *runtimevar.Decoder, opts *Options) (*runtimevar.Variable, error) { return runtimevar.New(newWatcher(client, name, decoder, opts)), nil } var OpenVariableV2 = OpenVariable func newWatcher(client *ssm.Client, name string, decoder *runtimevar.Decoder, opts *Options) *watcher { if opts == nil { opts = &Options{} } return &watcher{ client: client, name: name, wait: driver.WaitDuration(opts.WaitDuration), decoder: decoder, } } // state implements driver.State. type state struct { val any rawGet *ssm.GetParameterOutput updateTime time.Time version int64 err error } // Value implements driver.State.Value. func (s *state) Value() (any, error) { return s.val, s.err } // UpdateTime implements driver.State.UpdateTime. func (s *state) UpdateTime() time.Time { return s.updateTime } // As implements driver.State.As. func (s *state) As(i any) bool { switch p := i.(type) { case **ssm.GetParameterOutput: *p = s.rawGet default: return false } return true } // errorState returns a new State with err, unless prevS also represents // the same error, in which case it returns nil. func errorState(err error, prevS driver.State) driver.State { // Map aws.RequestCanceled to the more standard context package errors. if getErrorCode(err) == "CancelledError" { msg := err.Error() if strings.Contains(msg, "context deadline exceeded") { err = context.DeadlineExceeded } else { err = context.Canceled } } s := &state{err: err} if prevS == nil { return s } prev := prevS.(*state) if prev.err == nil { // New error. return s } if equivalentError(err, prev.err) { // Same error, return nil to indicate no change. return nil } return s } // equivalentError returns true iff err1 and err2 represent an equivalent error; // i.e., we don't want to return it to the user as a different error. func equivalentError(err1, err2 error) bool { if err1 == err2 || err1.Error() == err2.Error() { return true } code1 := getErrorCode(err1) code2 := getErrorCode(err2) return code1 != "" && code1 == code2 } type watcher struct { // client is the client to use. client *ssm.Client // name is the parameter to retrieve. name string // wait is the amount of time to wait between querying AWS. wait time.Duration // decoder is the decoder that unmarshals the value in the param. decoder *runtimevar.Decoder } func getParameter(ctx context.Context, client *ssm.Client, name string) (int64, []byte, time.Time, *ssm.GetParameterOutput, error) { getResp, err := client.GetParameter(ctx, &ssm.GetParameterInput{ Name: aws.String(name), // Ignored if the parameter is not encrypted. WithDecryption: aws.Bool(true), }) if err != nil { return 0, nil, time.Time{}, nil, err } if getResp.Parameter == nil { return 0, nil, time.Time{}, getResp, fmt.Errorf("unable to get %q parameter", name) } return getResp.Parameter.Version, []byte(aws.ToString(getResp.Parameter.Value)), aws.ToTime(getResp.Parameter.LastModifiedDate), getResp, nil } func (w *watcher) WatchVariable(ctx context.Context, prev driver.State) (driver.State, time.Duration) { lastVersion := int64(-1) if prev != nil { lastVersion = prev.(*state).version } // GetParameter from S3 to get the current value and version. newVersion, newVal, newLastModified, rawGet, err := getParameter(ctx, w.client, w.name) if err != nil { return errorState(err, prev), w.wait } if newVersion == lastVersion { // Version hasn't changed, so no change; return nil. return nil, w.wait } // New value (or at least, new version). Decode it. val, err := w.decoder.Decode(ctx, newVal) if err != nil { return errorState(err, prev), w.wait } return &state{ val: val, rawGet: rawGet, updateTime: newLastModified, version: newVersion, }, w.wait } // Close implements driver.Close. func (w *watcher) Close() error { return nil } // ErrorAs implements driver.ErrorAs. func (w *watcher) ErrorAs(err error, i any) bool { return errors.As(err, i) } func getErrorCode(err error) string { var ae smithy.APIError if errors.As(err, &ae) { return ae.ErrorCode() } return "" } // ErrorCode implements driver.ErrorCode. func (w *watcher) ErrorCode(err error) gcerrors.ErrorCode { code := getErrorCode(err) if code == "ParameterNotFound" { return gcerrors.NotFound } return gcerrors.Unknown } ================================================ FILE: runtimevar/awsparamstore/awsparamstore_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package awsparamstore import ( "context" "errors" "testing" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/ssm" "github.com/aws/smithy-go" "gocloud.dev/internal/testing/setup" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/driver" "gocloud.dev/runtimevar/drivertest" ) // This constant records the region used for the last --record. // If you want to use --record mode, // 1. Update this constant to your AWS region. // TODO(issue #300): Use Terraform to get this. const region = "us-east-2" type harness struct { client *ssm.Client closer func() } func newHarness(t *testing.T) (drivertest.Harness, error) { t.Helper() cfg, _, done, _ := setup.NewAWSv2Config(context.Background(), t, region, false) return &harness{client: ssm.NewFromConfig(cfg), closer: done}, nil } func (h *harness) MakeWatcher(ctx context.Context, name string, decoder *runtimevar.Decoder) (driver.Watcher, error) { return newWatcher(h.client, name, decoder, nil), nil } func (h *harness) CreateVariable(ctx context.Context, name string, val []byte) error { _, err := h.client.PutParameter(ctx, &ssm.PutParameterInput{ Name: aws.String(name), Type: "String", Value: aws.String(string(val)), Overwrite: aws.Bool(true), }) return err } func (h *harness) UpdateVariable(ctx context.Context, name string, val []byte) error { return h.CreateVariable(ctx, name, val) } func (h *harness) DeleteVariable(ctx context.Context, name string) error { _, err := h.client.DeleteParameter(ctx, &ssm.DeleteParameterInput{Name: aws.String(name)}) return err } func (h *harness) Close() { h.closer() } func (h *harness) Mutable() bool { return true } func TestConformance(t *testing.T) { drivertest.RunConformanceTests(t, newHarness, []drivertest.AsTest{verifyAs{}}) } type verifyAs struct { } func (verifyAs) Name() string { return "verify As" } func (v verifyAs) SnapshotCheck(s *runtimevar.Snapshot) error { var getParam *ssm.GetParameterOutput if !s.As(&getParam) { return errors.New("Snapshot.As failed for GetParameterOutput") } return nil } func (va verifyAs) ErrorCheck(v *runtimevar.Variable, err error) error { var e smithy.APIError if !v.ErrorAs(err, &e) { return errors.New("Keeper.ErrorAs failed") } return nil } // Paramstore-specific tests. func TestOpenVariable(t *testing.T) { tests := []struct { URL string WantErr bool }{ // OK. {"awsparamstore://myvar", false}, // OK, setting region. {"awsparamstore://myvar?region=us-west-1", false}, // OK, setting decoder. {"awsparamstore://myvar?decoder=string", false}, // Invalid decoder. {"awsparamstore://myvar?decoder=notadecoder", true}, // OK, setting wait. {"awsparamstore://myvar?wait=2m", false}, // Invalid wait. {"awsparamstore://myvar?wait=x", true}, // Invalid parameter. {"awsparamstore://myvar?param=value", true}, } ctx := context.Background() for _, test := range tests { v, err := runtimevar.OpenVariable(ctx, test.URL) if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } if err == nil { v.Close() } } } ================================================ FILE: runtimevar/awsparamstore/example_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package awsparamstore_test import ( "context" "log" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/ssm" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/awsparamstore" ) func ExampleOpenVariable() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // Establish a AWS V2 Config. // See https://aws.github.io/aws-sdk-go-v2/docs/configuring-sdk/ for more info. ctx := context.Background() cfg, err := config.LoadDefaultConfig(ctx) if err != nil { log.Fatal(err) } // Construct a *runtimevar.Variable that watches the variable. client := ssm.NewFromConfig(cfg) v, err := awsparamstore.OpenVariable(client, "cfg-variable-name", runtimevar.StringDecoder, nil) if err != nil { log.Fatal(err) } defer v.Close() } func Example_openVariableFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/runtimevar/awsparamstore" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // runtimevar.OpenVariable creates a *runtimevar.Variable from a URL. v, err := runtimevar.OpenVariable(ctx, "awsparamstore://myvar?region=us-west-1&decoder=string") if err != nil { log.Fatal(err) } defer v.Close() } ================================================ FILE: runtimevar/awsparamstore/testdata/TestConformance/TestAs/verify_As.replay ================================================ { "Initial": "AQAAAA7hTg3hIHztaQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "d9c13e06bae9af47", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "48" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.GetParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidmFyaWFibGUtZm9yLWFzIiwiV2l0aERlY3J5cHRpb24iOnRydWV9" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Encoding": [ "gzip" ], "Content-Length": [ "50" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:45 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "5e0e26dd-76d3-48f9-8c5e-ea2aa843ffa0" ] }, "Body": "H4sIAAAAAAAA/6tWio8vqSxIVbJSCkgsSsxNLUkt8ssvccsvzUtRqgUAF48DRR4AAAA=" } }, { "ID": "0a30adab85c7b754", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "81" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.PutParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidmFyaWFibGUtZm9yLWFzIiwiT3ZlcndyaXRlIjp0cnVlLCJUeXBlIjoiU3RyaW5nIiwiVmFsdWUiOiJoZWxsbyB3b3JsZCJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "51" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:45 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "62eb8453-0c83-4b2e-91a8-e5eae748c479" ] }, "Body": "H4sIAAAAAAAA/6tWCslMLVKyUgouScxLSSxKUdJRCkstKs7Mz1OyMqwFAFB+6N8fAAAA" } }, { "ID": "c3dfd4e5b8205809", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "48" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.GetParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidmFyaWFibGUtZm9yLWFzIiwiV2l0aERlY3J5cHRpb24iOnRydWV9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "179" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:45 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "0c64933d-8e54-46ba-b3c8-527fb7742f61" ] }, "Body": "H4sIAAAAAAAA/2XMzQqCQBRA4VeJu9bKn3Hy7gLblURF+xtea2B0ZGbMQnz3EGrV9sB3RjiSpYY9W8ARtqcSEMi2SIND5xrsXcjkfBhjKjIp4iwTQmbY/dTqSVbRTXNYGxuSgwAK8nR5dwwInl8eAtiT8wdTqVpxVZBnwGgpZZInabIWGyl3eQAlNbP4331XZ29Ve4cArqT7OTxYa7MYjNXVXNk6ZVrAaJo+3RYui9UAAAA=" } }, { "ID": "5cfdf10e970dbed6", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "26" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.DeleteParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidmFyaWFibGUtZm9yLWFzIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "22" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:46 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "896490ea-b669-4ab5-9581-29ec821f0b59" ] }, "Body": "H4sIAAAAAAAA/6uuBQBDv6ajAgAAAA==" } } ] } ================================================ FILE: runtimevar/awsparamstore/testdata/TestConformance/TestAs/verify_As_returns_false_when_passed_nil.replay ================================================ { "Initial": "AQAAAA7hTg3iB7py5wAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "95810ddf5e793153", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "48" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.GetParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidmFyaWFibGUtZm9yLWFzIiwiV2l0aERlY3J5cHRpb24iOnRydWV9" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Encoding": [ "gzip" ], "Content-Length": [ "50" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:46 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "d6bd41ec-476b-4922-96c2-b22b8c261764" ] }, "Body": "H4sIAAAAAAAA/6tWio8vqSxIVbJSCkgsSsxNLUkt8ssvccsvzUtRqgUAF48DRR4AAAA=" } }, { "ID": "3da904bb4d554de4", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "81" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.PutParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidmFyaWFibGUtZm9yLWFzIiwiT3ZlcndyaXRlIjp0cnVlLCJUeXBlIjoiU3RyaW5nIiwiVmFsdWUiOiJoZWxsbyB3b3JsZCJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "51" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:46 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "3b9d5a6c-1fdc-4919-947b-c069fae9ea54" ] }, "Body": "H4sIAAAAAAAA/6tWCslMLVKyUgouScxLSSxKUdJRCkstKs7Mz1OyMqwFAFB+6N8fAAAA" } }, { "ID": "ba005cdafc09f396", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "48" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.GetParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidmFyaWFibGUtZm9yLWFzIiwiV2l0aERlY3J5cHRpb24iOnRydWV9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "180" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:46 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "bc5434be-9335-400c-a91b-f9dc9b596209" ] }, "Body": "H4sIAAAAAAAA/2XMzQqCQBRA4VeJu9bKnxnz7gLblURF+xtea2B0ZGbMQnz3EGrV9sB3RjiSpYY9W8ARtqcSEMi2SIND5xrsXcjkfBhjKmQmYimFyCR2P7V6klV00xzWxobkIICCPF3eHQOC55eHAPbk/MFUqlZcFeQZMFpmWZInabKWqdjs8gBKambxv/uuzt6q9g4BXEn3c3iw1mYxGKurubJ1yrSA0TR9AAF5OIHVAAAA" } }, { "ID": "3c4c4e7e76baa82c", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "26" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.DeleteParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidmFyaWFibGUtZm9yLWFzIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "22" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:46 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "484a3033-6e72-4a33-981a-3d776819d32b" ] }, "Body": "H4sIAAAAAAAA/6uuBQBDv6ajAgAAAA==" } } ] } ================================================ FILE: runtimevar/awsparamstore/testdata/TestConformance/TestDelete.replay ================================================ { "Initial": "AQAAAA7hTg3fMZOKCgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "5ad9e70f6cf54b0d", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "86" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.PutParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJPdmVyd3JpdGUiOnRydWUsIlR5cGUiOiJTdHJpbmciLCJWYWx1ZSI6ImhlbGxvIHdvcmxkIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "51" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:44 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "7a2458d2-71cc-41b0-8ee5-3af895606987" ] }, "Body": "H4sIAAAAAAAA/6tWCslMLVKyUgouScxLSSxKUdJRCkstKs7Mz1OyMqwFAFB+6N8fAAAA" } }, { "ID": "99b51afa2d55822b", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.GetParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJXaXRoRGVjcnlwdGlvbiI6dHJ1ZX0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "183" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:44 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "d54ab45e-304c-46f3-98df-f4ddeaa32116" ] }, "Body": "H4sIAAAAAAAA/23MywrCMBBA0V+RWTe+2jR0doLuVETF/WinNZA2kowvpP8uRd25vXDuCzYUqGHhAPiC2XYNCBRapHvEGBu8RsUURU0x07nR0zzX2uR4+amRcBR18m1la3WjYOnoGBKYk9D+eWFAEH4IJLCkKCtf2spyOSdhwMnQmLRIs3ScjU2xKBJYU/MRf5/f306CbWtI4EDu2oczO+cHdx9c2VcO0foWcNJ1b6sETzbfAAAA" } }, { "ID": "8c41721fc2fa67ae", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.DeleteParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "22" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:44 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "381a0459-b537-4071-96fb-aa265ab183b0" ] }, "Body": "H4sIAAAAAAAA/6uuBQBDv6ajAgAAAA==" } }, { "ID": "420f28b6b2eb6878", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.GetParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJXaXRoRGVjcnlwdGlvbiI6dHJ1ZX0=" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Encoding": [ "gzip" ], "Content-Length": [ "50" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:44 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "ad93b93a-1f5d-436e-a7f3-d45bcf8669ef" ] }, "Body": "H4sIAAAAAAAA/6tWio8vqSxIVbJSCkgsSsxNLUkt8ssvccsvzUtRqgUAF48DRR4AAAA=" } }, { "ID": "75171cf00ce36fc0", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "88" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.PutParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJPdmVyd3JpdGUiOnRydWUsIlR5cGUiOiJTdHJpbmciLCJWYWx1ZSI6Imdvb2RieWUgd29ybGQifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "51" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:44 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "8eafb31f-dcbd-49fc-9a7e-33ba2c2b3569" ] }, "Body": "H4sIAAAAAAAA/6tWCslMLVKyUgouScxLSSxKUdJRCkstKs7Mz1OyMqwFAFB+6N8fAAAA" } }, { "ID": "45a809650a474000", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.GetParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJXaXRoRGVjcnlwdGlvbiI6dHJ1ZX0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "185" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:44 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "08f0f361-744b-46d1-8718-01b1aefc818a" ] }, "Body": "H4sIAAAAAAAA/23MywrCMBBA0V+RWTe+mrQ4O0F3WkTF/WinJdAmkkytRfx3EXXn9sK5D9hRoJaFA+ADlvsCECg4pD5ijC12UTFFUXPUJsvNPMuMyTO8/tREOIq6eFfZWt0oWDo3DAmsSOg4XBkQhO8CCWwoytaXtrJcrkgYcDbO83SR6nSqtUnXiwQKaj/i7/P7O0iwroYETtR071B7X54HHvU+NOW7c4jWO8DZ8/kCESNT3+EAAAA=" } }, { "ID": "1fd480fc1d575e5c", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.DeleteParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "22" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:44 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "5566240a-2e78-4393-8d4d-e5de5217151c" ] }, "Body": "H4sIAAAAAAAA/6uuBQBDv6ajAgAAAA==" } } ] } ================================================ FILE: runtimevar/awsparamstore/testdata/TestConformance/TestInvalidJSON.replay ================================================ { "Initial": "AQAAAA7hTg3eIkBuNAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "47294058ce228e0c", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "83" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.PutParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJPdmVyd3JpdGUiOnRydWUsIlR5cGUiOiJTdHJpbmciLCJWYWx1ZSI6Im5vdC1qc29uIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "51" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:42 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "3bd48c3c-492b-4faa-b61c-3f05d6e4ef68" ] }, "Body": "H4sIAAAAAAAA/6tWCslMLVKyUgouScxLSSxKUdJRCkstKs7Mz1OyMqwFAFB+6N8fAAAA" } }, { "ID": "6f482a67e21625ba", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.GetParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJXaXRoRGVjcnlwdGlvbiI6dHJ1ZX0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "180" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:42 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "63c28b71-1381-4ab3-8b36-af5934129de4" ] }, "Body": "H4sIAAAAAAAA/23MuwrCQBBA0X+ZOusjTzOdoJ0GUbEfzSgrZjfsTHwQ/HcRtbO9cG4PKwrUsHIA7GG6rgCBgkO6CYo02IlhEjUxplleZHGeZ1mRY/tTQ2VRc/DuaE/mSsHS/sIQwYyUto+WAUH5rhDBgkSXvrZHy/WMlAHHg6JIyiRNRvEkTudlBBU1H/H3+f1tNFh3ggh2dOnewXk1Z/HunTiI9Q5w/Hy+AMAm4NLcAAAA" } }, { "ID": "101cea1a10a5e61d", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.DeleteParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "22" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:43 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "e9fe0bb9-95d3-47dd-9f9f-e62a250b8169" ] }, "Body": "H4sIAAAAAAAA/6uuBQBDv6ajAgAAAA==" } } ] } ================================================ FILE: runtimevar/awsparamstore/testdata/TestConformance/TestJSON.replay ================================================ { "Initial": "AQAAAA7hTg3eBDN3qgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "d02dbca91a73d036", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "177" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.PutParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJPdmVyd3JpdGUiOnRydWUsIlR5cGUiOiJTdHJpbmciLCJWYWx1ZSI6IltcbntcIk5hbWVcIjogXCJFZFwiLCBcIlRleHRcIjogXCJLbm9jayBrbm9jay5cIn0sXG57XCJOYW1lXCI6IFwiU2FtXCIsIFwiVGV4dFwiOiBcIldobydzIHRoZXJlP1wifVxuXSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "51" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:42 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "fb757156-2b17-4135-94e4-76644f0fa40b" ] }, "Body": "H4sIAAAAAAAA/6tWCslMLVKyUgouScxLSSxKUdJRCkstKs7Mz1OyMqwFAFB+6N8fAAAA" } }, { "ID": "3ed336535af13b9f", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.GetParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJXaXRoRGVjcnlwdGlvbiI6dHJ1ZX0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "235" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:42 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "95e9973d-bbef-4e1d-ba3e-46560a9b6da0" ] }, "Body": "H4sIAAAAAAAA/23NQU/CQBQE4L/SzMXLFqWlbdiLMYGTSowQPbAenvQBG+gu2X0opul/NxW9EC9zmOSbafFEgRoWDtAt7p5n0KDgNH1GHWOjjzFlipJmelSUVZGVZVFUpT78qWvhKOnKu7XdpB8ULL3vGQoTElp8HRgawieBwgNFefS1XVuuJyQMPRxUVT7OR/lNlufZdKwwo+Ys/t383ZtLsG4DhRfaH/tiaVxrfqyBTgymtYFKDBZ8knNz7/xql+z6HBh06gLMqbkUr1t/FRPZcuBbg864t/6QQ7TeQQ+77huKxps0OgEAAA==" } }, { "ID": "7041ecd1f2e5c70d", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.DeleteParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "22" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:42 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "f9090f76-2c16-4d68-9cf4-69687e7aa95f" ] }, "Body": "H4sIAAAAAAAA/6uuBQBDv6ajAgAAAA==" } } ] } ================================================ FILE: runtimevar/awsparamstore/testdata/TestConformance/TestNonExistentVariable.replay ================================================ { "Initial": "AQAAAA7hTg3YAK7f3QAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "2f615ac921111966", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "47" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.GetParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoiZG9lcy1ub3QtZXhpc3QiLCJXaXRoRGVjcnlwdGlvbiI6dHJ1ZX0=" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Encoding": [ "gzip" ], "Content-Length": [ "50" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:36 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "9c820ef3-64bb-4996-a1ca-fcffe9b7027f" ] }, "Body": "H4sIAAAAAAAA/6tWio8vqSxIVbJSCkgsSsxNLUkt8ssvccsvzUtRqgUAF48DRR4AAAA=" } } ] } ================================================ FILE: runtimevar/awsparamstore/testdata/TestConformance/TestString.replay ================================================ { "Initial": "AQAAAA7hTg3YIE2nDgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "d0bc84aad41e97a4", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "86" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.PutParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJPdmVyd3JpdGUiOnRydWUsIlR5cGUiOiJTdHJpbmciLCJWYWx1ZSI6ImhlbGxvIHdvcmxkIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "51" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:36 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "23c493ff-3e01-4dee-9447-cf6e35d6ea9f" ] }, "Body": "H4sIAAAAAAAA/6tWCslMLVKyUgouScxLSSxKUdJRCkstKs7Mz1OyMqwFAFB+6N8fAAAA" } }, { "ID": "44464232858665ab", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.GetParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJXaXRoRGVjcnlwdGlvbiI6dHJ1ZX0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "183" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:36 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "5f809082-f5ca-4ecb-a37d-557ea728ab3f" ] }, "Body": "H4sIAAAAAAAA/23MTQ/BQBCA4b8ic27RZbc6N0ndEEHch05rk21XdsdXxH8Xwc31TZ73ASsK1LJwAHzAdL0EBAod0jVijC2eY8oUJVU41ibXyhitc4OnnxoIR0kPvqttk14oWNo7hgRKEtreTwwIwjeBBOYUZeErW1uuShIGzPp5PipGY1WYyVDNigSW1H7E3+f3t5FguwYS2JE7v8ORnfO9qw+uelcO0foOMHs+X9RMI9XfAAAA" } }, { "ID": "c3e4b16b517ea35c", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.DeleteParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "22" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:42 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "5f039f9a-e750-49bf-9847-4d92f50fb4b9" ] }, "Body": "H4sIAAAAAAAA/6uuBQBDv6ajAgAAAA==" } } ] } ================================================ FILE: runtimevar/awsparamstore/testdata/TestConformance/TestUpdate.replay ================================================ { "Initial": "AQAAAA7hTg3fBHklAwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "356d1aed695b7d89", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "86" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.PutParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJPdmVyd3JpdGUiOnRydWUsIlR5cGUiOiJTdHJpbmciLCJWYWx1ZSI6ImhlbGxvIHdvcmxkIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "51" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:43 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "c9802027-7c85-43bf-ac4a-3bbafddaea7c" ] }, "Body": "H4sIAAAAAAAA/6tWCslMLVKyUgouScxLSSxKUdJRCkstKs7Mz1OyMqwFAFB+6N8fAAAA" } }, { "ID": "620b8173980162b1", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.GetParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJXaXRoRGVjcnlwdGlvbiI6dHJ1ZX0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "183" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:43 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "4396d460-9704-4b59-94d0-0dea24df1222" ] }, "Body": "H4sIAAAAAAAA/23MTQuCQBCA4b8Sc9ZK1w+aW2C3kqjoPuVUC6sru2MW4n+PqG5dX3jeAbbkqGZhBzjAclcCArkGqffofY2dD5m8hDEmaZancZalaZ5h+1MzYS/h2TYXfQ3v5DSdDEMABQkdni0DgvBDIIA1ednYSl80VwUJA0bTPFcLlai5UnG0WgRQUv0Rf5/f316cbq4QwJFM9w43NsZOeutM9a7svLYNYDSOL3Gt66bfAAAA" } }, { "ID": "1fd780b5fddb43cb", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.GetParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJXaXRoRGVjcnlwdGlvbiI6dHJ1ZX0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "183" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:43 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "87ca58fe-9c85-42ab-9fb0-f608e2343923" ] }, "Body": "H4sIAAAAAAAA/23MTQuCQBCA4b8Sc9ZK1w+aW2C3kqjoPuVUC6sru2MW4n+PqG5dX3jeAbbkqGZhBzjAclcCArkGqffofY2dD5m8hDEmaZancZalaZ5h+1MzYS/h2TYXfQ3v5DSdDEMABQkdni0DgvBDIIA1ednYSl80VwUJA0bTPFcLlai5UnG0WgRQUv0Rf5/f316cbq4QwJFM9w43NsZOeutM9a7svLYNYDSOL3Gt66bfAAAA" } }, { "ID": "15dc22451b7b1ee5", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "88" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.PutParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJPdmVyd3JpdGUiOnRydWUsIlR5cGUiOiJTdHJpbmciLCJWYWx1ZSI6Imdvb2RieWUgd29ybGQifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "51" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:43 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "fa5219d4-11aa-4e58-adda-56c829b1fdbf" ] }, "Body": "H4sIAAAAAAAA/6tWCslMLVKyUgouScxLSSxKUdJRCkstKs7Mz1OyMqoFAJMtxfQfAAAA" } }, { "ID": "f9200aff7a213110", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.GetParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJXaXRoRGVjcnlwdGlvbiI6dHJ1ZX0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "185" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:43 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "f631e22c-5e35-43ad-a5e2-30824033e61d" ] }, "Body": "H4sIAAAAAAAA/23MywrCMBBA0V+RWbc+2qaxsxN0pyIq7kczlkCbSDK+kP67FHXn9sK5L9hQoJaFA+ALZts1IFBwSPeIMbZ4jSlTlDTDQpVaZWWplC7x8lMj4SjpybuzrdMbBUvHhiGBOQntnxcGBOGHQAJLirLyxp4tmzkJA06GWudVXuTjXE2LRZXAmtqP+Pv8/nYSrKshgQM11z7U3pvjkwd3HxrTdw7RegeYdd0bh+OmiuEAAAA=" } }, { "ID": "16bb2a39c28e133c", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "31" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.DeleteParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "22" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:43 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "ae7acf20-e89d-45e4-90bf-5f7f79f5054f" ] }, "Body": "H4sIAAAAAAAA/6uuBQBDv6ajAgAAAA==" } } ] } ================================================ FILE: runtimevar/awsparamstore/testdata/TestConformance/TestUpdateWithErrors.replay ================================================ { "Initial": "AQAAAA7hTg3gKT4J9wAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "9d6fc729a7e41e42", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "126" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.PutParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidGVzdC11cGRhdGluZy12YXJpYWJsZS10by1lcnJvciIsIk92ZXJ3cml0ZSI6dHJ1ZSwiVHlwZSI6IlN0cmluZyIsIlZhbHVlIjoiW3tcIk5hbWVcIjogXCJGb29cIiwgXCJUZXh0XCI6IFwiQmFyXCJ9XSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "51" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:44 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "c3e72635-350d-4b90-b6a7-15d063e0143b" ] }, "Body": "H4sIAAAAAAAA/6tWCslMLVKyUgouScxLSSxKUdJRCkstKs7Mz1OyMqwFAFB+6N8fAAAA" } }, { "ID": "ea526badd6c01db8", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "64" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.GetParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidGVzdC11cGRhdGluZy12YXJpYWJsZS10by1lcnJvciIsIldpdGhEZWNyeXB0aW9uIjp0cnVlfQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "211" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:45 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "baa86db5-cd30-4c42-a863-c0b720883dbf" ] }, "Body": "H4sIAAAAAAAA/4XMwUrDQBRG4Vcp/3pGbZNJyN0p1ZUW0eLG6eJKrmWgyYSZG62EvLvU6trtge9MeOTEnagk0ITrpw0InHriz0w5dzRmK5zVrqh0Ve1WVeVcXdHwpy5VstpxaFlDv7cfnAK/HcRqtJJSTDBYs/L2axAQVI4Kg3vO+hDb8B6kXbMKaHlR10VTlMVV2RTutjHYcHcW/+1/18+aQr+HwQsfxlN4nfzPxIMWHncxepiFx1aOek43nDzm3YlIyiH2oOU8fwP0yWXeEgEAAA==" } }, { "ID": "6fc3c68440efd192", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "98" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.PutParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidGVzdC11cGRhdGluZy12YXJpYWJsZS10by1lcnJvciIsIk92ZXJ3cml0ZSI6dHJ1ZSwiVHlwZSI6IlN0cmluZyIsIlZhbHVlIjoiaW52YWxpZC1qc29uIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "51" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:45 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "3a3aaae3-ec18-4c96-973d-619243b6da4e" ] }, "Body": "H4sIAAAAAAAA/6tWCslMLVKyUgouScxLSSxKUdJRCkstKs7Mz1OyMqoFAJMtxfQfAAAA" } }, { "ID": "997c161fba912829", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "64" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.GetParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidGVzdC11cGRhdGluZy12YXJpYWJsZS10by1lcnJvciIsIldpdGhEZWNyeXB0aW9uIjp0cnVlfQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "191" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:45 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "0483e0c5-eadc-4dbc-8a76-f3d00e901a25" ] }, "Body": "H4sIAAAAAAAA/4XMTWvCQBCA4f8y56yaxN3g3AR7UxEtvU/JVLYku2Fm4gfify+iPXt94XlvsCOhno0F8AbL/RYQSBLSWVG1x1Edk5qrcO5D46sQvG8CDv9qaqzmxqEli+noTiSRvjt2lh2LZIECVmT0eR0YEIwvBgWsSW2T2/gTuV2RMWA5aZp6Uc/rmS/L8LEoYEv9U7zbv9YHk5iOUMAXdeMjxHSiLrbuV3N6ZBaNOQFW9/sflwn4QfYAAAA=" } }, { "ID": "47ec2ac7a1e49888", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "99" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.PutParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidGVzdC11cGRhdGluZy12YXJpYWJsZS10by1lcnJvciIsIk92ZXJ3cml0ZSI6dHJ1ZSwiVHlwZSI6IlN0cmluZyIsIlZhbHVlIjoiaW52YWxpZC1qc29uMiJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "51" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:45 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "bd5088ef-8903-4623-a759-60712821025c" ] }, "Body": "H4sIAAAAAAAA/6tWCslMLVKyUgouScxLSSxKUdJRCkstKs7Mz1OyMq4FANIc3u0fAAAA" } }, { "ID": "f0c975de37417413", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "64" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.GetParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidGVzdC11cGRhdGluZy12YXJpYWJsZS10by1lcnJvciIsIldpdGhEZWNyeXB0aW9uIjp0cnVlfQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "191" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:45 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "86147139-5cad-4217-8d59-b89ba7d6c056" ] }, "Body": "H4sIAAAAAAAA/4XMwU6DQBCA4XeZM6sVWAhza1JvSow23qdhbLaBXTIzYBvCuxtSPXv9k+9f4I2EBjYWwAX27y0gkESkb0XVASd1TGoux9JXtc+ryvu6wvFPPRqruWnsyEI8u5kk0KlnZ8mxSBLI4EBGx9vIgGB8NcjghdReUxe+AncHMgZ8eqjroinKYufz5rnJoKXhDv67/54/TEI8Qwaf1E9bCHGmPnTuoinmW2fRkCJgsa4/cndOePYAAAA=" } }, { "ID": "57e39d5e6487683d", "Request": { "Method": "POST", "URL": "https://ssm.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "42" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "AmazonSSM.DeleteParameter" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJOYW1lIjoidGVzdC11cGRhdGluZy12YXJpYWJsZS10by1lcnJvciJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-store" ], "Content-Encoding": [ "gzip" ], "Content-Length": [ "22" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:45 GMT" ], "Server": [ "Server" ], "X-Amzn-Requestid": [ "2ebae488-97a7-49bb-bc87-57d3e70fdc8e" ] }, "Body": "H4sIAAAAAAAA/6uuBQBDv6ajAgAAAA==" } } ] } ================================================ FILE: runtimevar/awssecretsmanager/awssecretsmanager.go ================================================ // Copyright 2020 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package awssecretsmanager provides a runtimevar implementation with variables // read from AWS Secrets Manager (https://aws.amazon.com/secrets-manager) // Use OpenVariable to construct a *runtimevar.Variable. // // # URLs // // For runtimevar.OpenVariable, awssecretsmanager registers for the scheme "awssecretsmanager". // The default URL opener will use an AWS session with the default credentials // and configuration. // // To customize the URL opener, or for more details on the URL format, // see URLOpener. // See https://gocloud.dev/concepts/urls/ for background information. // // # As // // awssecretsmanager exposes the following types for As: // - Snapshot: *secretsmanager.GetSecretValueOutput, *secretsmanager.DescribeSecretOutput // - Error: any error type returned by the service, notably smithy.APIError package awssecretsmanager // import "gocloud.dev/runtimevar/awssecretsmanager" import ( "context" "errors" "fmt" "net/url" "path" "strings" "sync" "time" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/secretsmanager" "github.com/aws/aws-sdk-go-v2/service/secretsmanager/types" "github.com/aws/smithy-go" "github.com/google/wire" gcaws "gocloud.dev/aws" "gocloud.dev/gcerrors" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/driver" ) func init() { runtimevar.DefaultURLMux().RegisterVariable(Scheme, new(lazySessionOpener)) } // Set holds Wire providers for this package. var Set = wire.NewSet( Dial, ) // Dial gets an AWS secretsmanager service client using the AWS SDK V2. func Dial(cfg aws.Config) *secretsmanager.Client { return secretsmanager.NewFromConfig(cfg) } // URLOpener opens AWS Secrets Manager URLs like "awssecretsmanager://my-secret-var-name". // A friendly name of the secret must be specified. You can NOT specify the Amazon Resource Name (ARN). // // See https://pkg.go.dev/gocloud.dev/aws#V2ConfigFromURLParams. // // In addition, the following URL parameters are supported: // - decoder: The decoder to use. Defaults to URLOpener.Decoder, or // runtimevar.BytesDecoder if URLOpener.Decoder is nil. // See runtimevar.DecoderByName for supported values. // - wait: The poll interval, in time.ParseDuration formats. // Defaults to 30s. type URLOpener struct { // Decoder specifies the decoder to use if one is not specified in the URL. // Defaults to runtimevar.BytesDecoder. Decoder *runtimevar.Decoder // Options specifies the options to pass to New. Options Options } // lazySessionOpener obtains the AWS session from the environment on the first // call to OpenVariableURL. type lazySessionOpener struct { init sync.Once opener *URLOpener err error } func (o *lazySessionOpener) OpenVariableURL(ctx context.Context, u *url.URL) (*runtimevar.Variable, error) { opener := &URLOpener{} return opener.OpenVariableURL(ctx, u) } // Scheme is the URL scheme awssecretsmanager registers its URLOpener under on runtimevar.DefaultMux. const Scheme = "awssecretsmanager" // OpenVariableURL opens the variable at the URL's path. See the package doc // for more details. func (o *URLOpener) OpenVariableURL(ctx context.Context, u *url.URL) (*runtimevar.Variable, error) { q := u.Query() decoderName := q.Get("decoder") q.Del("decoder") decoder, err := runtimevar.DecoderByName(ctx, decoderName, o.Decoder) if err != nil { return nil, fmt.Errorf("open variable %v: invalid decoder: %v", u, err) } opts := o.Options if s := q.Get("wait"); s != "" { q.Del("wait") d, err := time.ParseDuration(s) if err != nil { return nil, fmt.Errorf("open variable %v: invalid wait %q: %v", u, s, err) } opts.WaitDuration = d } cfg, err := gcaws.V2ConfigFromURLParams(ctx, q) if err != nil { return nil, fmt.Errorf("open variable %v: %v", u, err) } return OpenVariable(secretsmanager.NewFromConfig(cfg), path.Join(u.Host, u.Path), decoder, &opts) } // Options sets options. type Options struct { // WaitDuration controls the rate at which AWS Secrets Manager is polled. // Defaults to 30 seconds. WaitDuration time.Duration } // OpenVariable constructs a *runtimevar.Variable backed by the variable name in AWS Secrets Manager, // using AWS SDK V2. // A friendly name of the secret must be specified. You can NOT specify the Amazon Resource Name (ARN). // Secrets Manager returns raw bytes; provide a decoder to decode the raw bytes // into the appropriate type for runtimevar.Snapshot.Value. // See the runtimevar package documentation for examples of decoders. func OpenVariable(client *secretsmanager.Client, name string, decoder *runtimevar.Decoder, opts *Options) (*runtimevar.Variable, error) { return runtimevar.New(newWatcher(client, name, decoder, opts)), nil } var OpenVariableV2 = OpenVariable // state implements driver.State. type state struct { val any rawGet *secretsmanager.GetSecretValueOutput rawDesc *secretsmanager.DescribeSecretOutput updateTime time.Time versionID string err error } // Value implements driver.State.Value. func (s *state) Value() (any, error) { return s.val, s.err } // UpdateTime implements driver.State.UpdateTime. func (s *state) UpdateTime() time.Time { return s.updateTime } // As implements driver.State.As. func (s *state) As(i any) bool { switch p := i.(type) { case **secretsmanager.GetSecretValueOutput: *p = s.rawGet case **secretsmanager.DescribeSecretOutput: *p = s.rawDesc default: return false } return true } // errorState returns a new State with err, unless prevS also represents // the same error, in which case it returns nil. func errorState(err error, prevS driver.State) driver.State { // Map to the more standard context package error. if strings.Contains(err.Error(), "context deadline exceeded") { err = context.DeadlineExceeded } else if getErrorCode(err) == "CancelledError" { err = context.Canceled } s := &state{err: err} if prevS == nil { return s } prev := prevS.(*state) if prev.err == nil { // New error. return s } if equivalentError(err, prev.err) { // Same error, return nil to indicate no change. return nil } return s } // equivalentError returns true iff err1 and err2 represent an equivalent error; // i.e., we don't want to return it to the user as a different error. func equivalentError(err1, err2 error) bool { if err1 == err2 || err1.Error() == err2.Error() { return true } code1 := getErrorCode(err1) code2 := getErrorCode(err2) return code1 != "" && code1 == code2 } type watcher struct { // client is the client to use. client *secretsmanager.Client // name is an ID of a secret to retrieve. name string // wait is the amount of time to wait between querying AWS. wait time.Duration // decoder is the decoder that unmarshalls the value in the param. decoder *runtimevar.Decoder } func newWatcher(client *secretsmanager.Client, name string, decoder *runtimevar.Decoder, opts *Options) *watcher { if opts == nil { opts = &Options{} } return &watcher{ client: client, name: name, wait: driver.WaitDuration(opts.WaitDuration), decoder: decoder, } } func getSecretValue(ctx context.Context, client *secretsmanager.Client, secretID string) (string, []byte, string, *secretsmanager.GetSecretValueOutput, error) { getResp, err := client.GetSecretValue(ctx, &secretsmanager.GetSecretValueInput{ SecretId: aws.String(secretID), }) if err != nil { return "", nil, "", nil, err } return aws.ToString(getResp.VersionId), getResp.SecretBinary, aws.ToString(getResp.SecretString), getResp, nil } func describeSecret(ctx context.Context, client *secretsmanager.Client, secretID string) (time.Time, *secretsmanager.DescribeSecretOutput, error) { descResp, err := client.DescribeSecret(ctx, &secretsmanager.DescribeSecretInput{ SecretId: aws.String(secretID), }) if err != nil { return time.Time{}, nil, err } return aws.ToTime(descResp.LastChangedDate), descResp, nil } // WatchVariable implements driver.WatchVariable. func (w *watcher) WatchVariable(ctx context.Context, prev driver.State) (driver.State, time.Duration) { var lastVersionID string if prev != nil { lastVersionID = prev.(*state).versionID } // GetParameter from S3 to get the current value and version. newVersionID, newValBinary, newValString, rawGet, err := getSecretValue(ctx, w.client, w.name) if err != nil { return errorState(err, prev), w.wait } if newVersionID == lastVersionID { // Version hasn't changed, so no change; return nil. return nil, w.wait } // Both SecretBinary and SecretString fields are not empty // which could indicate some internal Secrets Manager issues. // Hence, return explicit error instead of choosing one field over another. if len(newValBinary) > 0 && newValString != "" { err = fmt.Errorf("invalid %q response: both SecretBinary and SecretString are not empty", w.name) return errorState(err, prev), w.wait } data := newValBinary if len(data) == 0 { if newValString == "" { err = fmt.Errorf("invalid %q response: both SecretBinary and SecretString are empty", w.name) return errorState(err, prev), w.wait } // SecretBinary is empty so use SecretString data = []byte(newValString) } // DescribeParameters from S3 to get the LastModified date. newLastModified, rawDesc, err := describeSecret(ctx, w.client, w.name) if err != nil { return errorState(err, prev), w.wait } // New value (or at least, new version). Decode it. val, err := w.decoder.Decode(ctx, data) if err != nil { return errorState(err, prev), w.wait } return &state{ val: val, rawGet: rawGet, rawDesc: rawDesc, updateTime: newLastModified, versionID: newVersionID, }, w.wait } // Close implements driver.Close. func (w *watcher) Close() error { return nil } // ErrorAs implements driver.ErrorAs. func (w *watcher) ErrorAs(err error, i any) bool { return errors.As(err, i) } func getErrorCode(err error) string { var ae smithy.APIError if errors.As(err, &ae) { return ae.ErrorCode() } return "" } // ErrorCode implements driver.ErrorCode. func (w *watcher) ErrorCode(err error) gcerrors.ErrorCode { code := getErrorCode(err) ec, ok := errorCodeMap[code] if !ok { return gcerrors.Unknown } return ec } var errorCodeMap = map[string]gcerrors.ErrorCode{ (&types.ResourceNotFoundException{}).ErrorCode(): gcerrors.NotFound, (&types.InvalidParameterException{}).ErrorCode(): gcerrors.InvalidArgument, (&types.InvalidRequestException{}).ErrorCode(): gcerrors.InvalidArgument, (&types.InvalidNextTokenException{}).ErrorCode(): gcerrors.InvalidArgument, (&types.EncryptionFailure{}).ErrorCode(): gcerrors.Internal, (&types.DecryptionFailure{}).ErrorCode(): gcerrors.Internal, (&types.InternalServiceError{}).ErrorCode(): gcerrors.Internal, (&types.ResourceExistsException{}).ErrorCode(): gcerrors.AlreadyExists, (&types.PreconditionNotMetException{}).ErrorCode(): gcerrors.FailedPrecondition, (&types.MalformedPolicyDocumentException{}).ErrorCode(): gcerrors.FailedPrecondition, (&types.LimitExceededException{}).ErrorCode(): gcerrors.ResourceExhausted, } ================================================ FILE: runtimevar/awssecretsmanager/awssecretsmanager_test.go ================================================ // Copyright 2020 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package awssecretsmanager import ( "bytes" "context" "crypto/sha1" "errors" "fmt" "testing" "time" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/secretsmanager" "github.com/aws/smithy-go" "github.com/googleapis/gax-go/v2" "gocloud.dev/gcerrors" "gocloud.dev/internal/gcerr" "gocloud.dev/internal/retry" "gocloud.dev/internal/testing/setup" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/driver" "gocloud.dev/runtimevar/drivertest" ) // This constant records the region used for the last --record. // If you want to use --record mode, // 1. Update this constant to your AWS region. // TODO(issue #300): Use Terraform to get this. const region = "us-east-2" type harness struct { client *secretsmanager.Client closer func() } // waitForMutation uses check to wait until a mutation has taken effect. // The check function should return nil to indicate success (the mutation has // taken effect), an error with gcerrors.ErrorCode == NotFound to trigger // a retry, or any other error to signal permanent failure. func waitForMutation(ctx context.Context, check func() error) error { backoff := gax.Backoff{Multiplier: 1.0} var initial time.Duration if *setup.Record { // When recording, wait 3 seconds and then poll every 2s. initial = 3 * time.Second backoff.Initial = 2 * time.Second } else { // During replay, we don't wait at all. // The recorded file may have retries, but we don't need to actually wait between them. backoff.Initial = 1 * time.Millisecond } backoff.Max = backoff.Initial // Sleep before the check, since we know it doesn't take effect right away. time.Sleep(initial) // retryIfNotFound returns true if err is NotFound. retryIfNotFound := func(err error) bool { return gcerrors.Code(err) == gcerrors.NotFound } // Poll until the mtuation is seen. return retry.Call(ctx, backoff, retryIfNotFound, check) } // AWS Secrets Manager requires unique token for Create and Update requests to ensure idempotency. // From the other side, request data must be deterministic in order to make tests reproducible. // generateClientRequestToken generates token which is unique per test session but deterministic. func generateClientRequestToken(name string, data []byte) string { const maxClientRequestTokenLen = 64 h := sha1.New() _, _ = h.Write(data) token := fmt.Sprintf("%s-%x", name, h.Sum(nil)) // Token must have length less than or equal to 64 if len(token) > maxClientRequestTokenLen { token = token[:maxClientRequestTokenLen] } return token } func newHarness(t *testing.T) (drivertest.Harness, error) { t.Helper() cfg, _, done, _ := setup.NewAWSv2Config(context.Background(), t, region, false) return &harness{ client: secretsmanager.NewFromConfig(cfg), closer: done, }, nil } func (h *harness) MakeWatcher(_ context.Context, name string, decoder *runtimevar.Decoder) (driver.Watcher, error) { return newWatcher(h.client, name, decoder, nil), nil } func (h *harness) CreateVariable(ctx context.Context, name string, val []byte) error { if _, err := h.client.CreateSecret(ctx, &secretsmanager.CreateSecretInput{ Name: aws.String(name), ClientRequestToken: aws.String(generateClientRequestToken(name, val)), SecretBinary: val, }); err != nil { return err } // Secret Manager is only eventually consistent, so we retry until we've // verified that the mutation was applied. This is still not a guarantee // but in practice seems to work well enough to make tests repeatable. return waitForMutation(ctx, func() error { _, err := h.client.GetSecretValue(ctx, &secretsmanager.GetSecretValueInput{SecretId: aws.String(name)}) if err == nil { // Create was seen. return nil } // Failure; we'll retry if it's a NotFound. w := &watcher{} return gcerr.New(w.ErrorCode(err), err, 1, "runtimevar") }) } func (h *harness) UpdateVariable(ctx context.Context, name string, val []byte) error { if _, err := h.client.PutSecretValue(ctx, &secretsmanager.PutSecretValueInput{ ClientRequestToken: aws.String(generateClientRequestToken(name, val)), SecretBinary: val, SecretId: aws.String(name), }); err != nil { return err } // Secret Manager is only eventually consistent, so we retry until we've // verified that the mutation was applied. This is still not a guarantee // but in practice seems to work well enough to make tests repeatable. return waitForMutation(ctx, func() error { var err error var bb []byte var getResp *secretsmanager.GetSecretValueOutput getResp, err = h.client.GetSecretValue(ctx, &secretsmanager.GetSecretValueInput{SecretId: aws.String(name)}) if err == nil { bb = getResp.SecretBinary } if err != nil { // Failure; we'll retry if it's a NotFound, but that's not // really expected for an Update. w := &watcher{} return gcerr.New(w.ErrorCode(err), err, 1, "runtimevar") } if !bytes.Equal(bb, val) { // Value hasn't been updated yet, return a NotFound to // trigger retry. return gcerr.Newf(gcerr.NotFound, nil, "updated value not seen yet") } // Update was seen. return nil }) } func (h *harness) DeleteVariable(ctx context.Context, name string) error { if _, err := h.client.DeleteSecret(ctx, &secretsmanager.DeleteSecretInput{ ForceDeleteWithoutRecovery: aws.Bool(true), SecretId: aws.String(name), }); err != nil { return err } // Secret Manager is only eventually consistent, so we retry until we've // verified that the mutation was applied. This is still not a guarantee // but in practice seems to work well enough to make tests repeatable. // Note that "success" after a delete is a NotFound error, so we massage // the err returned from DescribeSecret to reflect that. return waitForMutation(ctx, func() error { _, err := h.client.DescribeSecret(ctx, &secretsmanager.DescribeSecretInput{SecretId: aws.String(name)}) if err == nil { // Secret still exists, return a NotFound to trigger a retry. return gcerr.Newf(gcerr.NotFound, nil, "delete not seen yet") } w := &watcher{} if w.ErrorCode(err) == gcerrors.NotFound { // Delete was seen. return nil } // Other errors are not retryable. return gcerr.New(w.ErrorCode(err), err, 1, "runtimevar") }) } func (h *harness) Close() { h.closer() } func (h *harness) Mutable() bool { return true } func TestConformance(t *testing.T) { drivertest.RunConformanceTests(t, newHarness, []drivertest.AsTest{verifyAs{}}) } type verifyAs struct { } func (verifyAs) Name() string { return "verify As" } func (v verifyAs) SnapshotCheck(s *runtimevar.Snapshot) error { var getParam *secretsmanager.GetSecretValueOutput if !s.As(&getParam) { return errors.New("Snapshot.As failed for GetSecretValueOutput") } var descParam *secretsmanager.DescribeSecretOutput if !s.As(&descParam) { return errors.New("Snapshot.As failed for DescribeSecretOutput") } return nil } func (va verifyAs) ErrorCheck(v *runtimevar.Variable, err error) error { var e smithy.APIError if !v.ErrorAs(err, &e) { return errors.New("Keeper.ErrorAs failed") } return nil } // Secrets Manager-specific tests. func TestOpenVariable(t *testing.T) { tests := []struct { URL string WantErr bool }{ // OK. {"awssecretsmanager://myvar", false}, // OK, setting region. {"awssecretsmanager://myvar?region=us-west-1", false}, // OK, setting decoder. {"awssecretsmanager://myvar?decoder=string", false}, // Invalid decoder. {"awssecretsmanager://myvar?decoder=notadecoder", true}, // OK, setting wait. {"awssecretsmanager://myvar?wait=5m", false}, // Invalid wait. {"awssecretsmanager://myvar?wait=xx", true}, // Invalid parameter. {"awssecretsmanager://myvar?param=value", true}, } ctx := context.Background() for _, test := range tests { v, err := runtimevar.OpenVariable(ctx, test.URL) if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } if err == nil { v.Close() } } } ================================================ FILE: runtimevar/awssecretsmanager/example_test.go ================================================ // Copyright 2020 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package awssecretsmanager_test import ( "context" "log" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/secretsmanager" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/awssecretsmanager" ) func ExampleOpenVariable() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // Establish a AWS V2 Config. // See https://aws.github.io/aws-sdk-go-v2/docs/configuring-sdk/ for more info. ctx := context.Background() cfg, err := config.LoadDefaultConfig(ctx) if err != nil { log.Fatal(err) } // Construct a *runtimevar.Variable that watches the variable. // `secret-variable-name` must be a friendly name of the secret, NOT the Amazon Resource Name (ARN). client := secretsmanager.NewFromConfig(cfg) v, err := awssecretsmanager.OpenVariable(client, "secret-variable-name", runtimevar.StringDecoder, nil) if err != nil { log.Fatal(err) } defer v.Close() } func Example_openVariableFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/runtimevar/awssecretsmanager" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // runtimevar.OpenVariable creates a *runtimevar.Variable from a URL. // `secret-variable-name` must be a friendly name of the secret, NOT the Amazon Resource Name (ARN). v, err := runtimevar.OpenVariable(ctx, "awssecretsmanager://secret-variable-name?region=us-east-2&decoder=string") if err != nil { log.Fatal(err) } defer v.Close() } ================================================ FILE: runtimevar/awssecretsmanager/testdata/TestConformance/TestAs/verify_As.replay ================================================ { "Initial": "AQAAAA7hTg42Dc4DEAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "38827ed1bfd1a813", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "30" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InZhcmlhYmxlLWZvci1hcyJ9" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:33:10 GMT" ], "X-Amzn-Requestid": [ "90ecc1ad-8bed-44f3-bd72-44dc2ac5757d" ] }, "Body": "eyJfX3R5cGUiOiJSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIiwiTWVzc2FnZSI6IlNlY3JldHMgTWFuYWdlciBjYW4ndCBmaW5kIHRoZSBzcGVjaWZpZWQgc2VjcmV0LiJ9" } }, { "ID": "32e9bb8b57a693ba", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "140" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.CreateSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDbGllbnRSZXF1ZXN0VG9rZW4iOiJ2YXJpYWJsZS1mb3ItYXMtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCIsIk5hbWUiOiJ2YXJpYWJsZS1mb3ItYXMiLCJTZWNyZXRCaW5hcnkiOiJhR1ZzYkc4Z2QyOXliR1E9In0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "181" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:33:10 GMT" ], "X-Amzn-Requestid": [ "2d580836-5d04-4bf1-a4f8-5499aa4317e2" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnZhcmlhYmxlLWZvci1hcy1tNnRadzgiLCJOYW1lIjoidmFyaWFibGUtZm9yLWFzIiwiVmVyc2lvbklkIjoidmFyaWFibGUtZm9yLWFzLTJhYWU2YzM1Yzk0ZmNmYjQxNWRiZTk1ZjQwOGI5Y2U5MWVlODQ2ZWQifQ==" } }, { "ID": "4692a867750fd5e6", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "30" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InZhcmlhYmxlLWZvci1hcyJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "277" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:33:13 GMT" ], "X-Amzn-Requestid": [ "843409b5-2323-4a60-9832-d437403819af" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnZhcmlhYmxlLWZvci1hcy1tNnRadzgiLCJDcmVhdGVkRGF0ZSI6MS43NzM5MzQzOTA2OTJFOSwiTmFtZSI6InZhcmlhYmxlLWZvci1hcyIsIlNlY3JldEJpbmFyeSI6ImFHVnNiRzhnZDI5eWJHUT0iLCJWZXJzaW9uSWQiOiJ2YXJpYWJsZS1mb3ItYXMtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCIsIlZlcnNpb25TdGFnZXMiOlsiQVdTQ1VSUkVOVCJdfQ==" } }, { "ID": "ad9968f0d4068e04", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "30" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InZhcmlhYmxlLWZvci1hcyJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "277" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:33:13 GMT" ], "X-Amzn-Requestid": [ "c3ea72ec-11dc-420a-ac5d-54d5537bb161" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnZhcmlhYmxlLWZvci1hcy1tNnRadzgiLCJDcmVhdGVkRGF0ZSI6MS43NzM5MzQzOTA2OTJFOSwiTmFtZSI6InZhcmlhYmxlLWZvci1hcyIsIlNlY3JldEJpbmFyeSI6ImFHVnNiRzhnZDI5eWJHUT0iLCJWZXJzaW9uSWQiOiJ2YXJpYWJsZS1mb3ItYXMtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCIsIlZlcnNpb25TdGFnZXMiOlsiQVdTQ1VSUkVOVCJdfQ==" } }, { "ID": "e1adc7aef61c09bd", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "30" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InZhcmlhYmxlLWZvci1hcyJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "304" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:33:13 GMT" ], "X-Amzn-Requestid": [ "67aee586-92b7-4a11-a3d7-0d1fb8f9daf5" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnZhcmlhYmxlLWZvci1hcy1tNnRadzgiLCJDcmVhdGVkRGF0ZSI6MS43NzM5MzQzOTA2NjRFOSwiTGFzdEFjY2Vzc2VkRGF0ZSI6MS43NzM4Nzg0RTksIkxhc3RDaGFuZ2VkRGF0ZSI6MS43NzM5MzQzOTA2OTVFOSwiTmFtZSI6InZhcmlhYmxlLWZvci1hcyIsIlZlcnNpb25JZHNUb1N0YWdlcyI6eyJ2YXJpYWJsZS1mb3ItYXMtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCI6WyJBV1NDVVJSRU5UIl19fQ==" } }, { "ID": "dc9041aa6d711935", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "64" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DeleteSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJGb3JjZURlbGV0ZVdpdGhvdXRSZWNvdmVyeSI6dHJ1ZSwiU2VjcmV0SWQiOiJ2YXJpYWJsZS1mb3ItYXMifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "142" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:33:14 GMT" ], "X-Amzn-Requestid": [ "0c888e84-d408-4d8f-b9af-46c4f5917fb3" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnZhcmlhYmxlLWZvci1hcy1tNnRadzgiLCJEZWxldGlvbkRhdGUiOjEuNzczOTM0Mzk0MDQyRTksIk5hbWUiOiJ2YXJpYWJsZS1mb3ItYXMifQ==" } }, { "ID": "a9fe07fbae592d17", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "30" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InZhcmlhYmxlLWZvci1hcyJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "335" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:33:17 GMT" ], "X-Amzn-Requestid": [ "b5d13935-4833-4550-8e6f-56c0c908bd90" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnZhcmlhYmxlLWZvci1hcy1tNnRadzgiLCJDcmVhdGVkRGF0ZSI6MS43NzM5MzQzOTA2NjRFOSwiRGVsZXRlZERhdGUiOjEuNzczOTM0Mzk0MDUxRTksIkxhc3RBY2Nlc3NlZERhdGUiOjEuNzczODc4NEU5LCJMYXN0Q2hhbmdlZERhdGUiOjEuNzczOTM0Mzk0MDU3RTksIk5hbWUiOiJ2YXJpYWJsZS1mb3ItYXMiLCJWZXJzaW9uSWRzVG9TdGFnZXMiOnsidmFyaWFibGUtZm9yLWFzLTJhYWU2YzM1Yzk0ZmNmYjQxNWRiZTk1ZjQwOGI5Y2U5MWVlODQ2ZWQiOlsiQVdTQ1VSUkVOVCJdfX0=" } }, { "ID": "461ea396cf093101", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "30" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InZhcmlhYmxlLWZvci1hcyJ9" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:33:18 GMT" ], "X-Amzn-Requestid": [ "ded353e8-edc6-45c2-afa7-760f44f543ce" ] }, "Body": "eyJfX3R5cGUiOiJSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIiwiTWVzc2FnZSI6IlNlY3JldHMgTWFuYWdlciBjYW4ndCBmaW5kIHRoZSBzcGVjaWZpZWQgc2VjcmV0LiJ9" } } ] } ================================================ FILE: runtimevar/awssecretsmanager/testdata/TestConformance/TestAs/verify_As_returns_false_when_passed_nil.replay ================================================ { "Initial": "AQAAAA7hTg4+Fw/2LQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "9807eea9d820fa92", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "30" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InZhcmlhYmxlLWZvci1hcyJ9" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:33:18 GMT" ], "X-Amzn-Requestid": [ "3a7282d1-5cdd-41a0-8af3-58d5fab4385b" ] }, "Body": "eyJfX3R5cGUiOiJSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIiwiTWVzc2FnZSI6IlNlY3JldHMgTWFuYWdlciBjYW4ndCBmaW5kIHRoZSBzcGVjaWZpZWQgc2VjcmV0LiJ9" } }, { "ID": "4f2c0003d0c07162", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "140" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.CreateSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDbGllbnRSZXF1ZXN0VG9rZW4iOiJ2YXJpYWJsZS1mb3ItYXMtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCIsIk5hbWUiOiJ2YXJpYWJsZS1mb3ItYXMiLCJTZWNyZXRCaW5hcnkiOiJhR1ZzYkc4Z2QyOXliR1E9In0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "181" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:33:18 GMT" ], "X-Amzn-Requestid": [ "18d0853a-b064-47a3-9565-9585a08e21dc" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnZhcmlhYmxlLWZvci1hcy10QXF1ZVgiLCJOYW1lIjoidmFyaWFibGUtZm9yLWFzIiwiVmVyc2lvbklkIjoidmFyaWFibGUtZm9yLWFzLTJhYWU2YzM1Yzk0ZmNmYjQxNWRiZTk1ZjQwOGI5Y2U5MWVlODQ2ZWQifQ==" } }, { "ID": "465e651b8987d237", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "30" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InZhcmlhYmxlLWZvci1hcyJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "277" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:33:21 GMT" ], "X-Amzn-Requestid": [ "b608a6b6-f65a-41f2-ac99-e3a0c9f700fe" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnZhcmlhYmxlLWZvci1hcy10QXF1ZVgiLCJDcmVhdGVkRGF0ZSI6MS43NzM5MzQzOTg4NTFFOSwiTmFtZSI6InZhcmlhYmxlLWZvci1hcyIsIlNlY3JldEJpbmFyeSI6ImFHVnNiRzhnZDI5eWJHUT0iLCJWZXJzaW9uSWQiOiJ2YXJpYWJsZS1mb3ItYXMtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCIsIlZlcnNpb25TdGFnZXMiOlsiQVdTQ1VSUkVOVCJdfQ==" } }, { "ID": "308e29cd3c14aa66", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "30" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InZhcmlhYmxlLWZvci1hcyJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "277" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:33:22 GMT" ], "X-Amzn-Requestid": [ "ff3eace2-7154-4d3e-8b71-fe349eb0a04a" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnZhcmlhYmxlLWZvci1hcy10QXF1ZVgiLCJDcmVhdGVkRGF0ZSI6MS43NzM5MzQzOTg4NTFFOSwiTmFtZSI6InZhcmlhYmxlLWZvci1hcyIsIlNlY3JldEJpbmFyeSI6ImFHVnNiRzhnZDI5eWJHUT0iLCJWZXJzaW9uSWQiOiJ2YXJpYWJsZS1mb3ItYXMtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCIsIlZlcnNpb25TdGFnZXMiOlsiQVdTQ1VSUkVOVCJdfQ==" } }, { "ID": "6deca769420eefb0", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "30" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InZhcmlhYmxlLWZvci1hcyJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "304" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:33:22 GMT" ], "X-Amzn-Requestid": [ "927a46c7-4f77-46a9-88c6-beaf7c66d289" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnZhcmlhYmxlLWZvci1hcy10QXF1ZVgiLCJDcmVhdGVkRGF0ZSI6MS43NzM5MzQzOTg4MjNFOSwiTGFzdEFjY2Vzc2VkRGF0ZSI6MS43NzM4Nzg0RTksIkxhc3RDaGFuZ2VkRGF0ZSI6MS43NzM5MzQzOTg4NTZFOSwiTmFtZSI6InZhcmlhYmxlLWZvci1hcyIsIlZlcnNpb25JZHNUb1N0YWdlcyI6eyJ2YXJpYWJsZS1mb3ItYXMtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCI6WyJBV1NDVVJSRU5UIl19fQ==" } }, { "ID": "298c67b9a4e746ca", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "64" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DeleteSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJGb3JjZURlbGV0ZVdpdGhvdXRSZWNvdmVyeSI6dHJ1ZSwiU2VjcmV0SWQiOiJ2YXJpYWJsZS1mb3ItYXMifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "142" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:33:22 GMT" ], "X-Amzn-Requestid": [ "40c01bd6-d097-4650-9457-0cfdeb32f644" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnZhcmlhYmxlLWZvci1hcy10QXF1ZVgiLCJEZWxldGlvbkRhdGUiOjEuNzczOTM0NDAyMjA2RTksIk5hbWUiOiJ2YXJpYWJsZS1mb3ItYXMifQ==" } }, { "ID": "c9753806727a18f0", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "30" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InZhcmlhYmxlLWZvci1hcyJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "335" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:33:25 GMT" ], "X-Amzn-Requestid": [ "1abfce70-3d9a-460a-b632-8e5730fe1bdc" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnZhcmlhYmxlLWZvci1hcy10QXF1ZVgiLCJDcmVhdGVkRGF0ZSI6MS43NzM5MzQzOTg4MjNFOSwiRGVsZXRlZERhdGUiOjEuNzczOTM0NDAyMjE2RTksIkxhc3RBY2Nlc3NlZERhdGUiOjEuNzczODc4NEU5LCJMYXN0Q2hhbmdlZERhdGUiOjEuNzczOTM0NDAyMjIzRTksIk5hbWUiOiJ2YXJpYWJsZS1mb3ItYXMiLCJWZXJzaW9uSWRzVG9TdGFnZXMiOnsidmFyaWFibGUtZm9yLWFzLTJhYWU2YzM1Yzk0ZmNmYjQxNWRiZTk1ZjQwOGI5Y2U5MWVlODQ2ZWQiOlsiQVdTQ1VSUkVOVCJdfX0=" } }, { "ID": "7fd07c0734b62aa4", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "30" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InZhcmlhYmxlLWZvci1hcyJ9" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:33:26 GMT" ], "X-Amzn-Requestid": [ "b618ddb5-e776-4a9c-bb9a-2aad56c547a7" ] }, "Body": "eyJfX3R5cGUiOiJSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIiwiTWVzc2FnZSI6IlNlY3JldHMgTWFuYWdlciBjYW4ndCBmaW5kIHRoZSBzcGVjaWZpZWQgc2VjcmV0LiJ9" } } ] } ================================================ FILE: runtimevar/awssecretsmanager/testdata/TestConformance/TestConformanceV2/TestAs/verify_As.replay ================================================ { "Initial": "AQAAAA7eRgZADTGztAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "e5e75378dd81adcf", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "30" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InZhcmlhYmxlLWZvci1hcyJ9" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:15 GMT" ], "X-Amzn-Requestid": [ "740ca705-83b1-4de2-a8de-9e1cbcb18d9e" ] }, "Body": "eyJfX3R5cGUiOiJSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIiwiTWVzc2FnZSI6IlNlY3JldHMgTWFuYWdlciBjYW4ndCBmaW5kIHRoZSBzcGVjaWZpZWQgc2VjcmV0LiJ9" } }, { "ID": "255d4e41eb662826", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "140" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.CreateSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDbGllbnRSZXF1ZXN0VG9rZW4iOiJ2YXJpYWJsZS1mb3ItYXMtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCIsIk5hbWUiOiJ2YXJpYWJsZS1mb3ItYXMiLCJTZWNyZXRCaW5hcnkiOiJhR1ZzYkc4Z2QyOXliR1E9In0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "181" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:16 GMT" ], "X-Amzn-Requestid": [ "c83f75c6-dc60-494e-8e76-21c3e938d368" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnZhcmlhYmxlLWZvci1hcy1lOWFpcU8iLCJOYW1lIjoidmFyaWFibGUtZm9yLWFzIiwiVmVyc2lvbklkIjoidmFyaWFibGUtZm9yLWFzLTJhYWU2YzM1Yzk0ZmNmYjQxNWRiZTk1ZjQwOGI5Y2U5MWVlODQ2ZWQifQ==" } }, { "ID": "430f308ce3dc00d6", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "30" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InZhcmlhYmxlLWZvci1hcyJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "277" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:19 GMT" ], "X-Amzn-Requestid": [ "6deb5986-63c0-4cd1-9569-82b8e736ad43" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnZhcmlhYmxlLWZvci1hcy1lOWFpcU8iLCJDcmVhdGVkRGF0ZSI6MS43MjMwNzY0MTY1ODhFOSwiTmFtZSI6InZhcmlhYmxlLWZvci1hcyIsIlNlY3JldEJpbmFyeSI6ImFHVnNiRzhnZDI5eWJHUT0iLCJWZXJzaW9uSWQiOiJ2YXJpYWJsZS1mb3ItYXMtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCIsIlZlcnNpb25TdGFnZXMiOlsiQVdTQ1VSUkVOVCJdfQ==" } }, { "ID": "bb7f433a694039b4", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "30" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InZhcmlhYmxlLWZvci1hcyJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "277" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:19 GMT" ], "X-Amzn-Requestid": [ "f7e82c25-7644-4da3-b51a-41d42a37c65b" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnZhcmlhYmxlLWZvci1hcy1lOWFpcU8iLCJDcmVhdGVkRGF0ZSI6MS43MjMwNzY0MTY1ODhFOSwiTmFtZSI6InZhcmlhYmxlLWZvci1hcyIsIlNlY3JldEJpbmFyeSI6ImFHVnNiRzhnZDI5eWJHUT0iLCJWZXJzaW9uSWQiOiJ2YXJpYWJsZS1mb3ItYXMtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCIsIlZlcnNpb25TdGFnZXMiOlsiQVdTQ1VSUkVOVCJdfQ==" } }, { "ID": "4a8c21bcb877e3a1", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "30" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InZhcmlhYmxlLWZvci1hcyJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "304" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:19 GMT" ], "X-Amzn-Requestid": [ "4d48501d-d804-4fc6-933f-697f4a1c4156" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnZhcmlhYmxlLWZvci1hcy1lOWFpcU8iLCJDcmVhdGVkRGF0ZSI6MS43MjMwNzY0MTY1NjNFOSwiTGFzdEFjY2Vzc2VkRGF0ZSI6MS43MjMwNzUyRTksIkxhc3RDaGFuZ2VkRGF0ZSI6MS43MjMwNzY0MTY1OTFFOSwiTmFtZSI6InZhcmlhYmxlLWZvci1hcyIsIlZlcnNpb25JZHNUb1N0YWdlcyI6eyJ2YXJpYWJsZS1mb3ItYXMtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCI6WyJBV1NDVVJSRU5UIl19fQ==" } }, { "ID": "0f6e251daeb0bd33", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "64" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DeleteSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJGb3JjZURlbGV0ZVdpdGhvdXRSZWNvdmVyeSI6dHJ1ZSwiU2VjcmV0SWQiOiJ2YXJpYWJsZS1mb3ItYXMifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "142" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:19 GMT" ], "X-Amzn-Requestid": [ "f86fdfd9-54a3-4e99-883a-988fb512ff8b" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnZhcmlhYmxlLWZvci1hcy1lOWFpcU8iLCJEZWxldGlvbkRhdGUiOjEuNzIzMDc2NDE5ODgzRTksIk5hbWUiOiJ2YXJpYWJsZS1mb3ItYXMifQ==" } }, { "ID": "a1eb7d42b6d189e9", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "30" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InZhcmlhYmxlLWZvci1hcyJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "335" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:22 GMT" ], "X-Amzn-Requestid": [ "3a79c38e-3e97-4348-92d6-b2333547ab54" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnZhcmlhYmxlLWZvci1hcy1lOWFpcU8iLCJDcmVhdGVkRGF0ZSI6MS43MjMwNzY0MTY1NjNFOSwiRGVsZXRlZERhdGUiOjEuNzIzMDc2NDE5ODkxRTksIkxhc3RBY2Nlc3NlZERhdGUiOjEuNzIzMDc1MkU5LCJMYXN0Q2hhbmdlZERhdGUiOjEuNzIzMDc2NDE5ODk4RTksIk5hbWUiOiJ2YXJpYWJsZS1mb3ItYXMiLCJWZXJzaW9uSWRzVG9TdGFnZXMiOnsidmFyaWFibGUtZm9yLWFzLTJhYWU2YzM1Yzk0ZmNmYjQxNWRiZTk1ZjQwOGI5Y2U5MWVlODQ2ZWQiOlsiQVdTQ1VSUkVOVCJdfX0=" } }, { "ID": "7ce9c22fe4f51b84", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "30" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InZhcmlhYmxlLWZvci1hcyJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "335" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:22 GMT" ], "X-Amzn-Requestid": [ "3519c295-fc5e-46d8-8d8c-0f2b3b76909c" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnZhcmlhYmxlLWZvci1hcy1lOWFpcU8iLCJDcmVhdGVkRGF0ZSI6MS43MjMwNzY0MTY1NjNFOSwiRGVsZXRlZERhdGUiOjEuNzIzMDc2NDE5ODkxRTksIkxhc3RBY2Nlc3NlZERhdGUiOjEuNzIzMDc1MkU5LCJMYXN0Q2hhbmdlZERhdGUiOjEuNzIzMDc2NDE5ODk4RTksIk5hbWUiOiJ2YXJpYWJsZS1mb3ItYXMiLCJWZXJzaW9uSWRzVG9TdGFnZXMiOnsidmFyaWFibGUtZm9yLWFzLTJhYWU2YzM1Yzk0ZmNmYjQxNWRiZTk1ZjQwOGI5Y2U5MWVlODQ2ZWQiOlsiQVdTQ1VSUkVOVCJdfX0=" } }, { "ID": "31d4610ea61de62b", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "30" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InZhcmlhYmxlLWZvci1hcyJ9" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:23 GMT" ], "X-Amzn-Requestid": [ "2e5cbca3-f4a6-4a7d-b2dc-0314d62db163" ] }, "Body": "eyJfX3R5cGUiOiJSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIiwiTWVzc2FnZSI6IlNlY3JldHMgTWFuYWdlciBjYW4ndCBmaW5kIHRoZSBzcGVjaWZpZWQgc2VjcmV0LiJ9" } } ] } ================================================ FILE: runtimevar/awssecretsmanager/testdata/TestConformance/TestConformanceV2/TestAs/verify_As_returns_false_when_passed_nil.replay ================================================ { "Initial": "AQAAAA7eRgZIIhB0tgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "a62ed477b68f177d", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "30" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InZhcmlhYmxlLWZvci1hcyJ9" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:24 GMT" ], "X-Amzn-Requestid": [ "20ceff74-442f-4e53-9d89-d952143cdf17" ] }, "Body": "eyJfX3R5cGUiOiJSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIiwiTWVzc2FnZSI6IlNlY3JldHMgTWFuYWdlciBjYW4ndCBmaW5kIHRoZSBzcGVjaWZpZWQgc2VjcmV0LiJ9" } }, { "ID": "449d4b9a6a9586d0", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "140" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.CreateSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDbGllbnRSZXF1ZXN0VG9rZW4iOiJ2YXJpYWJsZS1mb3ItYXMtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCIsIk5hbWUiOiJ2YXJpYWJsZS1mb3ItYXMiLCJTZWNyZXRCaW5hcnkiOiJhR1ZzYkc4Z2QyOXliR1E9In0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "181" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:24 GMT" ], "X-Amzn-Requestid": [ "13b90041-9671-41f2-a664-fc67e2355f53" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnZhcmlhYmxlLWZvci1hcy1RZFJ5OVUiLCJOYW1lIjoidmFyaWFibGUtZm9yLWFzIiwiVmVyc2lvbklkIjoidmFyaWFibGUtZm9yLWFzLTJhYWU2YzM1Yzk0ZmNmYjQxNWRiZTk1ZjQwOGI5Y2U5MWVlODQ2ZWQifQ==" } }, { "ID": "186ab8551c0c9f45", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "30" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InZhcmlhYmxlLWZvci1hcyJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "277" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:27 GMT" ], "X-Amzn-Requestid": [ "8f2a56f0-d2a9-4906-930e-2c4bc6db205d" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnZhcmlhYmxlLWZvci1hcy1RZFJ5OVUiLCJDcmVhdGVkRGF0ZSI6MS43MjMwNzY0MjQ5MzZFOSwiTmFtZSI6InZhcmlhYmxlLWZvci1hcyIsIlNlY3JldEJpbmFyeSI6ImFHVnNiRzhnZDI5eWJHUT0iLCJWZXJzaW9uSWQiOiJ2YXJpYWJsZS1mb3ItYXMtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCIsIlZlcnNpb25TdGFnZXMiOlsiQVdTQ1VSUkVOVCJdfQ==" } }, { "ID": "17f4dcfccb03ca53", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "30" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InZhcmlhYmxlLWZvci1hcyJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "277" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:27 GMT" ], "X-Amzn-Requestid": [ "24cb0ed3-2337-4a2e-8613-8497ccb3ec7d" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnZhcmlhYmxlLWZvci1hcy1RZFJ5OVUiLCJDcmVhdGVkRGF0ZSI6MS43MjMwNzY0MjQ5MzZFOSwiTmFtZSI6InZhcmlhYmxlLWZvci1hcyIsIlNlY3JldEJpbmFyeSI6ImFHVnNiRzhnZDI5eWJHUT0iLCJWZXJzaW9uSWQiOiJ2YXJpYWJsZS1mb3ItYXMtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCIsIlZlcnNpb25TdGFnZXMiOlsiQVdTQ1VSUkVOVCJdfQ==" } }, { "ID": "4d4e5cfc23d4f317", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "30" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InZhcmlhYmxlLWZvci1hcyJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "304" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:27 GMT" ], "X-Amzn-Requestid": [ "fba00c12-a669-46d6-a848-c71f572f19ac" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnZhcmlhYmxlLWZvci1hcy1RZFJ5OVUiLCJDcmVhdGVkRGF0ZSI6MS43MjMwNzY0MjQ5MTNFOSwiTGFzdEFjY2Vzc2VkRGF0ZSI6MS43MjMwNzUyRTksIkxhc3RDaGFuZ2VkRGF0ZSI6MS43MjMwNzY0MjQ5MzlFOSwiTmFtZSI6InZhcmlhYmxlLWZvci1hcyIsIlZlcnNpb25JZHNUb1N0YWdlcyI6eyJ2YXJpYWJsZS1mb3ItYXMtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCI6WyJBV1NDVVJSRU5UIl19fQ==" } }, { "ID": "2d047a833716d6c1", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "64" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DeleteSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJGb3JjZURlbGV0ZVdpdGhvdXRSZWNvdmVyeSI6dHJ1ZSwiU2VjcmV0SWQiOiJ2YXJpYWJsZS1mb3ItYXMifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "142" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:28 GMT" ], "X-Amzn-Requestid": [ "b1236672-db0f-4f74-9a16-2fd1828d4cbb" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnZhcmlhYmxlLWZvci1hcy1RZFJ5OVUiLCJEZWxldGlvbkRhdGUiOjEuNzIzMDc2NDI4MjQ1RTksIk5hbWUiOiJ2YXJpYWJsZS1mb3ItYXMifQ==" } }, { "ID": "82406e28e8e978d8", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "30" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InZhcmlhYmxlLWZvci1hcyJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "335" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:31 GMT" ], "X-Amzn-Requestid": [ "8739d5c3-8885-4a78-bdec-164f53f34786" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnZhcmlhYmxlLWZvci1hcy1RZFJ5OVUiLCJDcmVhdGVkRGF0ZSI6MS43MjMwNzY0MjQ5MTNFOSwiRGVsZXRlZERhdGUiOjEuNzIzMDc2NDI4MjU1RTksIkxhc3RBY2Nlc3NlZERhdGUiOjEuNzIzMDc1MkU5LCJMYXN0Q2hhbmdlZERhdGUiOjEuNzIzMDc2NDI4MjU5RTksIk5hbWUiOiJ2YXJpYWJsZS1mb3ItYXMiLCJWZXJzaW9uSWRzVG9TdGFnZXMiOnsidmFyaWFibGUtZm9yLWFzLTJhYWU2YzM1Yzk0ZmNmYjQxNWRiZTk1ZjQwOGI5Y2U5MWVlODQ2ZWQiOlsiQVdTQ1VSUkVOVCJdfX0=" } }, { "ID": "326e9cea4dd29eb1", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "30" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InZhcmlhYmxlLWZvci1hcyJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "335" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:31 GMT" ], "X-Amzn-Requestid": [ "01d03688-7f89-451d-be30-1305610693fb" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnZhcmlhYmxlLWZvci1hcy1RZFJ5OVUiLCJDcmVhdGVkRGF0ZSI6MS43MjMwNzY0MjQ5MTNFOSwiRGVsZXRlZERhdGUiOjEuNzIzMDc2NDI4MjU1RTksIkxhc3RBY2Nlc3NlZERhdGUiOjEuNzIzMDc1MkU5LCJMYXN0Q2hhbmdlZERhdGUiOjEuNzIzMDc2NDI4MjU5RTksIk5hbWUiOiJ2YXJpYWJsZS1mb3ItYXMiLCJWZXJzaW9uSWRzVG9TdGFnZXMiOnsidmFyaWFibGUtZm9yLWFzLTJhYWU2YzM1Yzk0ZmNmYjQxNWRiZTk1ZjQwOGI5Y2U5MWVlODQ2ZWQiOlsiQVdTQ1VSUkVOVCJdfX0=" } }, { "ID": "dd189d54850cb546", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "30" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InZhcmlhYmxlLWZvci1hcyJ9" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:33 GMT" ], "X-Amzn-Requestid": [ "4011360a-5822-431c-aaaa-4b0f0b768ab1" ] }, "Body": "eyJfX3R5cGUiOiJSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIiwiTWVzc2FnZSI6IlNlY3JldHMgTWFuYWdlciBjYW4ndCBmaW5kIHRoZSBzcGVjaWZpZWQgc2VjcmV0LiJ9" } } ] } ================================================ FILE: runtimevar/awssecretsmanager/testdata/TestConformance/TestConformanceV2/TestDelete.replay ================================================ { "Initial": "AQAAAA7eRgYhGbnqcAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "f2ac250745a0990b", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "150" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.CreateSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDbGllbnRSZXF1ZXN0VG9rZW4iOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZS0yYWFlNmMzNWM5NGZjZmI0MTVkYmU5NWY0MDhiOWNlOTFlZTg0NmVkIiwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIiwiU2VjcmV0QmluYXJ5IjoiYUdWc2JHOGdkMjl5YkdRPSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "196" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:45 GMT" ], "X-Amzn-Requestid": [ "60122a5b-f5f7-47f5-af37-90749dc17538" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLUdvRVdZTSIsIk5hbWUiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZSIsIlZlcnNpb25JZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlLTJhYWU2YzM1Yzk0ZmNmYjQxNWRiZTk1ZjQwOGI5Y2U5MWVlODQ2ZWQifQ==" } }, { "ID": "b31bf99e99b7d17b", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "292" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:48 GMT" ], "X-Amzn-Requestid": [ "6dcf1fbf-f8c5-4516-bda1-be7d8c9dd29c" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLUdvRVdZTSIsIkNyZWF0ZWREYXRlIjoxLjcyMzA3NjM4NTYwNUU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJTZWNyZXRCaW5hcnkiOiJhR1ZzYkc4Z2QyOXliR1E9IiwiVmVyc2lvbklkIjoidGVzdC1jb25maWctdmFyaWFibGUtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCIsIlZlcnNpb25TdGFnZXMiOlsiQVdTQ1VSUkVOVCJdfQ==" } }, { "ID": "d7a9f3537b0e924b", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "292" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:48 GMT" ], "X-Amzn-Requestid": [ "9cb14934-b470-48c0-be13-eb69c169fc1f" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLUdvRVdZTSIsIkNyZWF0ZWREYXRlIjoxLjcyMzA3NjM4NTYwNUU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJTZWNyZXRCaW5hcnkiOiJhR1ZzYkc4Z2QyOXliR1E9IiwiVmVyc2lvbklkIjoidGVzdC1jb25maWctdmFyaWFibGUtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCIsIlZlcnNpb25TdGFnZXMiOlsiQVdTQ1VSUkVOVCJdfQ==" } }, { "ID": "4dfd588a9b2fa91e", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "319" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:48 GMT" ], "X-Amzn-Requestid": [ "ca7efaa2-c282-41c6-9c79-a0362d3f0a72" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLUdvRVdZTSIsIkNyZWF0ZWREYXRlIjoxLjcyMzA3NjM4NTU3OUU5LCJMYXN0QWNjZXNzZWREYXRlIjoxLjcyMzA3NTJFOSwiTGFzdENoYW5nZWREYXRlIjoxLjcyMzA3NjM4NTYwOEU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJWZXJzaW9uSWRzVG9TdGFnZXMiOnsidGVzdC1jb25maWctdmFyaWFibGUtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCI6WyJBV1NDVVJSRU5UIl19fQ==" } }, { "ID": "f49f49e5209786ce", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "69" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DeleteSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJGb3JjZURlbGV0ZVdpdGhvdXRSZWNvdmVyeSI6dHJ1ZSwiU2VjcmV0SWQiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "152" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:48 GMT" ], "X-Amzn-Requestid": [ "d8e5f89d-acce-495e-bc36-366a15d9edc3" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLUdvRVdZTSIsIkRlbGV0aW9uRGF0ZSI6MS43MjMwNzYzODg5MjZFOSwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" } }, { "ID": "99d9f33220a95db1", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "350" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:51 GMT" ], "X-Amzn-Requestid": [ "b00cde68-c76b-4b85-8308-6ef0433b08e1" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLUdvRVdZTSIsIkNyZWF0ZWREYXRlIjoxLjcyMzA3NjM4NTU3OUU5LCJEZWxldGVkRGF0ZSI6MS43MjMwNzYzODg5MzZFOSwiTGFzdEFjY2Vzc2VkRGF0ZSI6MS43MjMwNzUyRTksIkxhc3RDaGFuZ2VkRGF0ZSI6MS43MjMwNzYzODg5NDNFOSwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIiwiVmVyc2lvbklkc1RvU3RhZ2VzIjp7InRlc3QtY29uZmlnLXZhcmlhYmxlLTJhYWU2YzM1Yzk0ZmNmYjQxNWRiZTk1ZjQwOGI5Y2U5MWVlODQ2ZWQiOlsiQVdTQ1VSUkVOVCJdfX0=" } }, { "ID": "e479ed0443641926", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:52 GMT" ], "X-Amzn-Requestid": [ "fe012b83-45ef-4387-b9ca-9f4c6d001fad" ] }, "Body": "eyJfX3R5cGUiOiJSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIiwiTWVzc2FnZSI6IlNlY3JldHMgTWFuYWdlciBjYW4ndCBmaW5kIHRoZSBzcGVjaWZpZWQgc2VjcmV0LiJ9" } }, { "ID": "4a14de3cb4d3fba7", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:53 GMT" ], "X-Amzn-Requestid": [ "1ed85d0e-131c-4d0f-b553-2d9c8a9c7cd5" ] }, "Body": "eyJfX3R5cGUiOiJSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIiwiTWVzc2FnZSI6IlNlY3JldHMgTWFuYWdlciBjYW4ndCBmaW5kIHRoZSBzcGVjaWZpZWQgc2VjcmV0LiJ9" } }, { "ID": "bd3c8115e73f615b", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "154" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.CreateSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDbGllbnRSZXF1ZXN0VG9rZW4iOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZS0wMDc4YmI4ZTVjOWQ4YWJmN2YxZTRlMTRjODdkOTAyMzIzNWI2MjMwIiwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIiwiU2VjcmV0QmluYXJ5IjoiWjI5dlpHSjVaU0IzYjNKc1pBPT0ifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "196" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:53 GMT" ], "X-Amzn-Requestid": [ "f233906f-0911-4cee-8712-52e1678637aa" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLVdKaE5oWiIsIk5hbWUiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZSIsIlZlcnNpb25JZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlLTAwNzhiYjhlNWM5ZDhhYmY3ZjFlNGUxNGM4N2Q5MDIzMjM1YjYyMzAifQ==" } }, { "ID": "1180009a2e2f0e71", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "296" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:56 GMT" ], "X-Amzn-Requestid": [ "2370f2bb-21fe-41b1-87cd-a3fefdd34d7e" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLVdKaE5oWiIsIkNyZWF0ZWREYXRlIjoxLjcyMzA3NjM5MzYwNEU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJTZWNyZXRCaW5hcnkiOiJaMjl2WkdKNVpTQjNiM0pzWkE9PSIsIlZlcnNpb25JZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlLTAwNzhiYjhlNWM5ZDhhYmY3ZjFlNGUxNGM4N2Q5MDIzMjM1YjYyMzAiLCJWZXJzaW9uU3RhZ2VzIjpbIkFXU0NVUlJFTlQiXX0=" } }, { "ID": "f65fa5627768c742", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "296" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:56 GMT" ], "X-Amzn-Requestid": [ "842cee5e-984d-4ebe-8680-198a556bf477" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLVdKaE5oWiIsIkNyZWF0ZWREYXRlIjoxLjcyMzA3NjM5MzYwNEU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJTZWNyZXRCaW5hcnkiOiJaMjl2WkdKNVpTQjNiM0pzWkE9PSIsIlZlcnNpb25JZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlLTAwNzhiYjhlNWM5ZDhhYmY3ZjFlNGUxNGM4N2Q5MDIzMjM1YjYyMzAiLCJWZXJzaW9uU3RhZ2VzIjpbIkFXU0NVUlJFTlQiXX0=" } }, { "ID": "c2d329784dd5534b", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "319" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:56 GMT" ], "X-Amzn-Requestid": [ "e6e301a0-ed9d-44b2-8324-01811679c2d6" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLVdKaE5oWiIsIkNyZWF0ZWREYXRlIjoxLjcyMzA3NjM5MzU3OEU5LCJMYXN0QWNjZXNzZWREYXRlIjoxLjcyMzA3NTJFOSwiTGFzdENoYW5nZWREYXRlIjoxLjcyMzA3NjM5MzYwOEU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJWZXJzaW9uSWRzVG9TdGFnZXMiOnsidGVzdC1jb25maWctdmFyaWFibGUtMDA3OGJiOGU1YzlkOGFiZjdmMWU0ZTE0Yzg3ZDkwMjMyMzViNjIzMCI6WyJBV1NDVVJSRU5UIl19fQ==" } }, { "ID": "7d3fd817f5976256", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "69" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DeleteSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJGb3JjZURlbGV0ZVdpdGhvdXRSZWNvdmVyeSI6dHJ1ZSwiU2VjcmV0SWQiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "152" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:56 GMT" ], "X-Amzn-Requestid": [ "2646eec1-6cbc-4ada-bcda-f0038a19260a" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLVdKaE5oWiIsIkRlbGV0aW9uRGF0ZSI6MS43MjMwNzYzOTY5MjJFOSwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" } }, { "ID": "3f9cb44ad6cf985f", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "349" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:59 GMT" ], "X-Amzn-Requestid": [ "b5389401-1eaa-4df0-9970-fdb59e0250c2" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLVdKaE5oWiIsIkNyZWF0ZWREYXRlIjoxLjcyMzA3NjM5MzU3OEU5LCJEZWxldGVkRGF0ZSI6MS43MjMwNzYzOTY5M0U5LCJMYXN0QWNjZXNzZWREYXRlIjoxLjcyMzA3NTJFOSwiTGFzdENoYW5nZWREYXRlIjoxLjcyMzA3NjM5NjkzNUU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJWZXJzaW9uSWRzVG9TdGFnZXMiOnsidGVzdC1jb25maWctdmFyaWFibGUtMDA3OGJiOGU1YzlkOGFiZjdmMWU0ZTE0Yzg3ZDkwMjMyMzViNjIzMCI6WyJBV1NDVVJSRU5UIl19fQ==" } }, { "ID": "9423b8d9d0db3816", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:01 GMT" ], "X-Amzn-Requestid": [ "ddcb5774-c1cd-409b-bc6f-9b6fd6ef46cf" ] }, "Body": "eyJfX3R5cGUiOiJSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIiwiTWVzc2FnZSI6IlNlY3JldHMgTWFuYWdlciBjYW4ndCBmaW5kIHRoZSBzcGVjaWZpZWQgc2VjcmV0LiJ9" } } ] } ================================================ FILE: runtimevar/awssecretsmanager/testdata/TestConformance/TestConformanceV2/TestInvalidJSON.replay ================================================ { "Initial": "AQAAAA7eRgYNAGuaKgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "1632d340f34be0c5", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "146" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.CreateSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDbGllbnRSZXF1ZXN0VG9rZW4iOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZS0zMzMzYzU5NjE3OTFjMjg3MDI4MzY2NTgxYWQ3NmQ5MjFjYTYxY2FkIiwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIiwiU2VjcmV0QmluYXJ5IjoiYm05MExXcHpiMjQ9In0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "196" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:25 GMT" ], "X-Amzn-Requestid": [ "8647c373-62c3-4824-81ae-b88639f7bcdd" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLTRZYW1FbSIsIk5hbWUiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZSIsIlZlcnNpb25JZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlLTMzMzNjNTk2MTc5MWMyODcwMjgzNjY1ODFhZDc2ZDkyMWNhNjFjYWQifQ==" } }, { "ID": "b7267c607fe6e7a0", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "288" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:28 GMT" ], "X-Amzn-Requestid": [ "79f71d9d-3b01-43b9-9aa0-3fb51e62cfb0" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLTRZYW1FbSIsIkNyZWF0ZWREYXRlIjoxLjcyMzA3NjM2NTE5MUU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJTZWNyZXRCaW5hcnkiOiJibTkwTFdwemIyND0iLCJWZXJzaW9uSWQiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZS0zMzMzYzU5NjE3OTFjMjg3MDI4MzY2NTgxYWQ3NmQ5MjFjYTYxY2FkIiwiVmVyc2lvblN0YWdlcyI6WyJBV1NDVVJSRU5UIl19" } }, { "ID": "3c870cbe9270f7ec", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "288" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:28 GMT" ], "X-Amzn-Requestid": [ "20ee862a-2d7c-4f69-a816-8775efb6767d" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLTRZYW1FbSIsIkNyZWF0ZWREYXRlIjoxLjcyMzA3NjM2NTE5MUU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJTZWNyZXRCaW5hcnkiOiJibTkwTFdwemIyND0iLCJWZXJzaW9uSWQiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZS0zMzMzYzU5NjE3OTFjMjg3MDI4MzY2NTgxYWQ3NmQ5MjFjYTYxY2FkIiwiVmVyc2lvblN0YWdlcyI6WyJBV1NDVVJSRU5UIl19" } }, { "ID": "d24675827a024aff", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "319" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:28 GMT" ], "X-Amzn-Requestid": [ "1aaaeff1-13a4-409d-a3d3-a05ebea036a2" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLTRZYW1FbSIsIkNyZWF0ZWREYXRlIjoxLjcyMzA3NjM2NTE2OEU5LCJMYXN0QWNjZXNzZWREYXRlIjoxLjcyMzA3NTJFOSwiTGFzdENoYW5nZWREYXRlIjoxLjcyMzA3NjM2NTE5NUU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJWZXJzaW9uSWRzVG9TdGFnZXMiOnsidGVzdC1jb25maWctdmFyaWFibGUtMzMzM2M1OTYxNzkxYzI4NzAyODM2NjU4MWFkNzZkOTIxY2E2MWNhZCI6WyJBV1NDVVJSRU5UIl19fQ==" } }, { "ID": "459cb68bc950a8f1", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "69" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DeleteSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJGb3JjZURlbGV0ZVdpdGhvdXRSZWNvdmVyeSI6dHJ1ZSwiU2VjcmV0SWQiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "152" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:28 GMT" ], "X-Amzn-Requestid": [ "ac1b5590-671e-4295-b424-7af58786e152" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLTRZYW1FbSIsIkRlbGV0aW9uRGF0ZSI6MS43MjMwNzYzNjg0OTdFOSwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" } }, { "ID": "f529fb8e9d859f1f", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "350" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:31 GMT" ], "X-Amzn-Requestid": [ "47073e41-d4b0-40ae-b683-f58ddb2219f5" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLTRZYW1FbSIsIkNyZWF0ZWREYXRlIjoxLjcyMzA3NjM2NTE2OEU5LCJEZWxldGVkRGF0ZSI6MS43MjMwNzYzNjg1MDdFOSwiTGFzdEFjY2Vzc2VkRGF0ZSI6MS43MjMwNzUyRTksIkxhc3RDaGFuZ2VkRGF0ZSI6MS43MjMwNzYzNjg1MTFFOSwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIiwiVmVyc2lvbklkc1RvU3RhZ2VzIjp7InRlc3QtY29uZmlnLXZhcmlhYmxlLTMzMzNjNTk2MTc5MWMyODcwMjgzNjY1ODFhZDc2ZDkyMWNhNjFjYWQiOlsiQVdTQ1VSUkVOVCJdfX0=" } }, { "ID": "12854ed0aae16e73", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:33 GMT" ], "X-Amzn-Requestid": [ "d69a6ed5-31e8-4227-8134-7b5fe02436e4" ] }, "Body": "eyJfX3R5cGUiOiJSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIiwiTWVzc2FnZSI6IlNlY3JldHMgTWFuYWdlciBjYW4ndCBmaW5kIHRoZSBzcGVjaWZpZWQgc2VjcmV0LiJ9" } } ] } ================================================ FILE: runtimevar/awssecretsmanager/testdata/TestConformance/TestConformanceV2/TestJSON.replay ================================================ { "Initial": "AQAAAA7eRgYFFABmpgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "fdf4ab7f4cf9e2c7", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "246" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.CreateSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDbGllbnRSZXF1ZXN0VG9rZW4iOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZS0wNjllMGIzNTU3ZDExZjNiNTg5OGE3YmI3ZTE4Mzg0ZTMxMjVjYWJjIiwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIiwiU2VjcmV0QmluYXJ5IjoiV3dwN0lrNWhiV1VpT2lBaVJXUWlMQ0FpVkdWNGRDSTZJQ0pMYm05amF5QnJibTlqYXk0aWZTd0tleUpPWVcxbElqb2dJbE5oYlNJc0lDSlVaWGgwSWpvZ0lsZG9ieWR6SUhSb1pYSmxQeUo5Q2wwPSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "196" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:17 GMT" ], "X-Amzn-Requestid": [ "2e37cabe-e1b5-42d8-b91f-96b49c5699be" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLVphdXJWbiIsIk5hbWUiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZSIsIlZlcnNpb25JZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlLTA2OWUwYjM1NTdkMTFmM2I1ODk4YTdiYjdlMTgzODRlMzEyNWNhYmMifQ==" } }, { "ID": "00be7a10a5540ade", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "388" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:20 GMT" ], "X-Amzn-Requestid": [ "90ce6f29-9e1c-4d13-8f70-c1a2eb8db279" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLVphdXJWbiIsIkNyZWF0ZWREYXRlIjoxLjcyMzA3NjM1NzUwNUU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJTZWNyZXRCaW5hcnkiOiJXd3A3SWs1aGJXVWlPaUFpUldRaUxDQWlWR1Y0ZENJNklDSkxibTlqYXlCcmJtOWpheTRpZlN3S2V5Sk9ZVzFsSWpvZ0lsTmhiU0lzSUNKVVpYaDBJam9nSWxkb2J5ZHpJSFJvWlhKbFB5SjlDbDA9IiwiVmVyc2lvbklkIjoidGVzdC1jb25maWctdmFyaWFibGUtMDY5ZTBiMzU1N2QxMWYzYjU4OThhN2JiN2UxODM4NGUzMTI1Y2FiYyIsIlZlcnNpb25TdGFnZXMiOlsiQVdTQ1VSUkVOVCJdfQ==" } }, { "ID": "6589f5d0c8f2d34c", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "388" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:20 GMT" ], "X-Amzn-Requestid": [ "2808a418-be9f-4af7-aa9b-146b64cd7069" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLVphdXJWbiIsIkNyZWF0ZWREYXRlIjoxLjcyMzA3NjM1NzUwNUU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJTZWNyZXRCaW5hcnkiOiJXd3A3SWs1aGJXVWlPaUFpUldRaUxDQWlWR1Y0ZENJNklDSkxibTlqYXlCcmJtOWpheTRpZlN3S2V5Sk9ZVzFsSWpvZ0lsTmhiU0lzSUNKVVpYaDBJam9nSWxkb2J5ZHpJSFJvWlhKbFB5SjlDbDA9IiwiVmVyc2lvbklkIjoidGVzdC1jb25maWctdmFyaWFibGUtMDY5ZTBiMzU1N2QxMWYzYjU4OThhN2JiN2UxODM4NGUzMTI1Y2FiYyIsIlZlcnNpb25TdGFnZXMiOlsiQVdTQ1VSUkVOVCJdfQ==" } }, { "ID": "7ce70562c939f4ea", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "319" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:20 GMT" ], "X-Amzn-Requestid": [ "42381e06-43ad-4f5e-b382-b931cafdba0a" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLVphdXJWbiIsIkNyZWF0ZWREYXRlIjoxLjcyMzA3NjM1NzQ4MUU5LCJMYXN0QWNjZXNzZWREYXRlIjoxLjcyMzA3NTJFOSwiTGFzdENoYW5nZWREYXRlIjoxLjcyMzA3NjM1NzUwOUU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJWZXJzaW9uSWRzVG9TdGFnZXMiOnsidGVzdC1jb25maWctdmFyaWFibGUtMDY5ZTBiMzU1N2QxMWYzYjU4OThhN2JiN2UxODM4NGUzMTI1Y2FiYyI6WyJBV1NDVVJSRU5UIl19fQ==" } }, { "ID": "610a9e56a5f677cc", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "69" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DeleteSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJGb3JjZURlbGV0ZVdpdGhvdXRSZWNvdmVyeSI6dHJ1ZSwiU2VjcmV0SWQiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "152" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:20 GMT" ], "X-Amzn-Requestid": [ "98a1e763-eef7-4d30-93e6-85b544672c66" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLVphdXJWbiIsIkRlbGV0aW9uRGF0ZSI6MS43MjMwNzYzNjA4MjJFOSwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" } }, { "ID": "005a8ce48c10f21b", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "350" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:23 GMT" ], "X-Amzn-Requestid": [ "b0393fb6-c7ae-4fff-b934-2600ea2a5501" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLVphdXJWbiIsIkNyZWF0ZWREYXRlIjoxLjcyMzA3NjM1NzQ4MUU5LCJEZWxldGVkRGF0ZSI6MS43MjMwNzYzNjA4MzNFOSwiTGFzdEFjY2Vzc2VkRGF0ZSI6MS43MjMwNzUyRTksIkxhc3RDaGFuZ2VkRGF0ZSI6MS43MjMwNzYzNjA4MzhFOSwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIiwiVmVyc2lvbklkc1RvU3RhZ2VzIjp7InRlc3QtY29uZmlnLXZhcmlhYmxlLTA2OWUwYjM1NTdkMTFmM2I1ODk4YTdiYjdlMTgzODRlMzEyNWNhYmMiOlsiQVdTQ1VSUkVOVCJdfX0=" } }, { "ID": "589c46e1191f01e5", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:24 GMT" ], "X-Amzn-Requestid": [ "bc55a142-e457-4bdc-9ef9-0fd377ba9242" ] }, "Body": "eyJfX3R5cGUiOiJSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIiwiTWVzc2FnZSI6IlNlY3JldHMgTWFuYWdlciBjYW4ndCBmaW5kIHRoZSBzcGVjaWZpZWQgc2VjcmV0LiJ9" } } ] } ================================================ FILE: runtimevar/awssecretsmanager/testdata/TestConformance/TestConformanceV2/TestNonExistentVariable.replay ================================================ { "Initial": "AQAAAA7eRgX4DSuMEwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "92b8718d3a30881a", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "29" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6ImRvZXMtbm90LWV4aXN0In0=" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:03 GMT" ], "X-Amzn-Requestid": [ "d0c55a01-c8de-44b6-bbef-7c6ca6c36c6b" ] }, "Body": "eyJfX3R5cGUiOiJSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIiwiTWVzc2FnZSI6IlNlY3JldHMgTWFuYWdlciBjYW4ndCBmaW5kIHRoZSBzcGVjaWZpZWQgc2VjcmV0LiJ9" } } ] } ================================================ FILE: runtimevar/awssecretsmanager/testdata/TestConformance/TestConformanceV2/TestString.replay ================================================ { "Initial": "AQAAAA7eRgX4F/72ewAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "ae512b51a0ffd19c", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "150" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.CreateSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDbGllbnRSZXF1ZXN0VG9rZW4iOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZS0yYWFlNmMzNWM5NGZjZmI0MTVkYmU5NWY0MDhiOWNlOTFlZTg0NmVkIiwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIiwiU2VjcmV0QmluYXJ5IjoiYUdWc2JHOGdkMjl5YkdRPSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "196" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:04 GMT" ], "X-Amzn-Requestid": [ "62c3905e-6889-46d1-9646-ee6b6c9a4f97" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLUVmQXNtdCIsIk5hbWUiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZSIsIlZlcnNpb25JZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlLTJhYWU2YzM1Yzk0ZmNmYjQxNWRiZTk1ZjQwOGI5Y2U5MWVlODQ2ZWQifQ==" } }, { "ID": "9409eaf7eb9007aa", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "292" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:07 GMT" ], "X-Amzn-Requestid": [ "820dc6f9-70be-4dd1-8e64-870156ab6297" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLUVmQXNtdCIsIkNyZWF0ZWREYXRlIjoxLjcyMzA3NjM0NDU5NUU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJTZWNyZXRCaW5hcnkiOiJhR1ZzYkc4Z2QyOXliR1E9IiwiVmVyc2lvbklkIjoidGVzdC1jb25maWctdmFyaWFibGUtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCIsIlZlcnNpb25TdGFnZXMiOlsiQVdTQ1VSUkVOVCJdfQ==" } }, { "ID": "549f7b61918fe9f8", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "292" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:07 GMT" ], "X-Amzn-Requestid": [ "c8533964-10aa-4441-9efe-05e3cf416e29" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLUVmQXNtdCIsIkNyZWF0ZWREYXRlIjoxLjcyMzA3NjM0NDU5NUU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJTZWNyZXRCaW5hcnkiOiJhR1ZzYkc4Z2QyOXliR1E9IiwiVmVyc2lvbklkIjoidGVzdC1jb25maWctdmFyaWFibGUtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCIsIlZlcnNpb25TdGFnZXMiOlsiQVdTQ1VSUkVOVCJdfQ==" } }, { "ID": "0adba87ca6ab2203", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "318" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:07 GMT" ], "X-Amzn-Requestid": [ "7cdcb0f5-dc93-415c-a3d1-ec23248a6743" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLUVmQXNtdCIsIkNyZWF0ZWREYXRlIjoxLjcyMzA3NjM0NDU3RTksIkxhc3RBY2Nlc3NlZERhdGUiOjEuNzIzMDc1MkU5LCJMYXN0Q2hhbmdlZERhdGUiOjEuNzIzMDc2MzQ0NTk4RTksIk5hbWUiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZSIsIlZlcnNpb25JZHNUb1N0YWdlcyI6eyJ0ZXN0LWNvbmZpZy12YXJpYWJsZS0yYWFlNmMzNWM5NGZjZmI0MTVkYmU5NWY0MDhiOWNlOTFlZTg0NmVkIjpbIkFXU0NVUlJFTlQiXX19" } }, { "ID": "ca97901e7ea923b0", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "69" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DeleteSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJGb3JjZURlbGV0ZVdpdGhvdXRSZWNvdmVyeSI6dHJ1ZSwiU2VjcmV0SWQiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "152" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:12 GMT" ], "X-Amzn-Requestid": [ "ef2b3795-bf8b-4d0a-9418-e079463b1968" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLUVmQXNtdCIsIkRlbGV0aW9uRGF0ZSI6MS43MjMwNzYzNTI5MTNFOSwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" } }, { "ID": "e3c16638f79cddc8", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "349" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:15 GMT" ], "X-Amzn-Requestid": [ "11e6a1ba-abfd-4ddf-ba9c-7b99c54a189b" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLUVmQXNtdCIsIkNyZWF0ZWREYXRlIjoxLjcyMzA3NjM0NDU3RTksIkRlbGV0ZWREYXRlIjoxLjcyMzA3NjM1MjkyMkU5LCJMYXN0QWNjZXNzZWREYXRlIjoxLjcyMzA3NTJFOSwiTGFzdENoYW5nZWREYXRlIjoxLjcyMzA3NjM1MjkyOUU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJWZXJzaW9uSWRzVG9TdGFnZXMiOnsidGVzdC1jb25maWctdmFyaWFibGUtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCI6WyJBV1NDVVJSRU5UIl19fQ==" } }, { "ID": "500e47bb5fea4287", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:16 GMT" ], "X-Amzn-Requestid": [ "1ad09c40-0d8a-409b-beef-6e630642823a" ] }, "Body": "eyJfX3R5cGUiOiJSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIiwiTWVzc2FnZSI6IlNlY3JldHMgTWFuYWdlciBjYW4ndCBmaW5kIHRoZSBzcGVjaWZpZWQgc2VjcmV0LiJ9" } } ] } ================================================ FILE: runtimevar/awssecretsmanager/testdata/TestConformance/TestConformanceV2/TestUpdate.replay ================================================ { "Initial": "AQAAAA7eRgYVETQGPQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "82b5beeb65529c07", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "150" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.CreateSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDbGllbnRSZXF1ZXN0VG9rZW4iOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZS0yYWFlNmMzNWM5NGZjZmI0MTVkYmU5NWY0MDhiOWNlOTFlZTg0NmVkIiwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIiwiU2VjcmV0QmluYXJ5IjoiYUdWc2JHOGdkMjl5YkdRPSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "196" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:33 GMT" ], "X-Amzn-Requestid": [ "6cad8177-f705-4ec1-919d-fef97c3270b1" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXIzSHdVWSIsIk5hbWUiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZSIsIlZlcnNpb25JZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlLTJhYWU2YzM1Yzk0ZmNmYjQxNWRiZTk1ZjQwOGI5Y2U5MWVlODQ2ZWQifQ==" } }, { "ID": "bbbf9d1d7cb49b56", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "292" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:36 GMT" ], "X-Amzn-Requestid": [ "cd3d9c03-a1f2-4d69-b7b9-30864c5a64dd" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXIzSHdVWSIsIkNyZWF0ZWREYXRlIjoxLjcyMzA3NjM3MzQ2N0U5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJTZWNyZXRCaW5hcnkiOiJhR1ZzYkc4Z2QyOXliR1E9IiwiVmVyc2lvbklkIjoidGVzdC1jb25maWctdmFyaWFibGUtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCIsIlZlcnNpb25TdGFnZXMiOlsiQVdTQ1VSUkVOVCJdfQ==" } }, { "ID": "6af6d348ab564892", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "292" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:36 GMT" ], "X-Amzn-Requestid": [ "0d88c9df-2f6a-4015-a91e-7009314e6c13" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXIzSHdVWSIsIkNyZWF0ZWREYXRlIjoxLjcyMzA3NjM3MzQ2N0U5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJTZWNyZXRCaW5hcnkiOiJhR1ZzYkc4Z2QyOXliR1E9IiwiVmVyc2lvbklkIjoidGVzdC1jb25maWctdmFyaWFibGUtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCIsIlZlcnNpb25TdGFnZXMiOlsiQVdTQ1VSUkVOVCJdfQ==" } }, { "ID": "f3901b9ecb9b6c74", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "318" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:36 GMT" ], "X-Amzn-Requestid": [ "9bef7fe0-f482-4cfc-8789-dc9289909868" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXIzSHdVWSIsIkNyZWF0ZWREYXRlIjoxLjcyMzA3NjM3MzQ0RTksIkxhc3RBY2Nlc3NlZERhdGUiOjEuNzIzMDc1MkU5LCJMYXN0Q2hhbmdlZERhdGUiOjEuNzIzMDc2MzczNDcxRTksIk5hbWUiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZSIsIlZlcnNpb25JZHNUb1N0YWdlcyI6eyJ0ZXN0LWNvbmZpZy12YXJpYWJsZS0yYWFlNmMzNWM5NGZjZmI0MTVkYmU5NWY0MDhiOWNlOTFlZTg0NmVkIjpbIkFXU0NVUlJFTlQiXX19" } }, { "ID": "0886e0d21c0529e8", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "292" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:36 GMT" ], "X-Amzn-Requestid": [ "c2947dd8-09c0-4eda-a293-b401642669bc" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXIzSHdVWSIsIkNyZWF0ZWREYXRlIjoxLjcyMzA3NjM3MzQ2N0U5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJTZWNyZXRCaW5hcnkiOiJhR1ZzYkc4Z2QyOXliR1E9IiwiVmVyc2lvbklkIjoidGVzdC1jb25maWctdmFyaWFibGUtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCIsIlZlcnNpb25TdGFnZXMiOlsiQVdTQ1VSUkVOVCJdfQ==" } }, { "ID": "862ec5d58dde5330", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "158" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.PutSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDbGllbnRSZXF1ZXN0VG9rZW4iOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZS0wMDc4YmI4ZTVjOWQ4YWJmN2YxZTRlMTRjODdkOTAyMzIzNWI2MjMwIiwiU2VjcmV0QmluYXJ5IjoiWjI5dlpHSjVaU0IzYjNKc1pBPT0iLCJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "227" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:36 GMT" ], "X-Amzn-Requestid": [ "2763739a-3d1f-4adc-b8e4-c6b5cf774e95" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXIzSHdVWSIsIk5hbWUiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZSIsIlZlcnNpb25JZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlLTAwNzhiYjhlNWM5ZDhhYmY3ZjFlNGUxNGM4N2Q5MDIzMjM1YjYyMzAiLCJWZXJzaW9uU3RhZ2VzIjpbIkFXU0NVUlJFTlQiXX0=" } }, { "ID": "ce4fc3ae4b671afd", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "296" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:39 GMT" ], "X-Amzn-Requestid": [ "1743d11a-92a2-4b9c-811d-e6320919ddc6" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXIzSHdVWSIsIkNyZWF0ZWREYXRlIjoxLjcyMzA3NjM3Njg2NUU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJTZWNyZXRCaW5hcnkiOiJaMjl2WkdKNVpTQjNiM0pzWkE9PSIsIlZlcnNpb25JZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlLTAwNzhiYjhlNWM5ZDhhYmY3ZjFlNGUxNGM4N2Q5MDIzMjM1YjYyMzAiLCJWZXJzaW9uU3RhZ2VzIjpbIkFXU0NVUlJFTlQiXX0=" } }, { "ID": "54b7a0e05bddbeb8", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "296" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:39 GMT" ], "X-Amzn-Requestid": [ "8f59a286-050f-4a72-9500-26f411b1dca4" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXIzSHdVWSIsIkNyZWF0ZWREYXRlIjoxLjcyMzA3NjM3Njg2NUU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJTZWNyZXRCaW5hcnkiOiJaMjl2WkdKNVpTQjNiM0pzWkE9PSIsIlZlcnNpb25JZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlLTAwNzhiYjhlNWM5ZDhhYmY3ZjFlNGUxNGM4N2Q5MDIzMjM1YjYyMzAiLCJWZXJzaW9uU3RhZ2VzIjpbIkFXU0NVUlJFTlQiXX0=" } }, { "ID": "9ae67fd4811cdf07", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "398" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:39 GMT" ], "X-Amzn-Requestid": [ "7a91123a-9da8-4523-8130-ae6bb58040e6" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXIzSHdVWSIsIkNyZWF0ZWREYXRlIjoxLjcyMzA3NjM3MzQ0RTksIkxhc3RBY2Nlc3NlZERhdGUiOjEuNzIzMDc1MkU5LCJMYXN0Q2hhbmdlZERhdGUiOjEuNzIzMDc2Mzc2ODY5RTksIk5hbWUiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZSIsIlZlcnNpb25JZHNUb1N0YWdlcyI6eyJ0ZXN0LWNvbmZpZy12YXJpYWJsZS0wMDc4YmI4ZTVjOWQ4YWJmN2YxZTRlMTRjODdkOTAyMzIzNWI2MjMwIjpbIkFXU0NVUlJFTlQiXSwidGVzdC1jb25maWctdmFyaWFibGUtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCI6WyJBV1NQUkVWSU9VUyJdfX0=" } }, { "ID": "fefd523fe4544af9", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "69" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DeleteSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJGb3JjZURlbGV0ZVdpdGhvdXRSZWNvdmVyeSI6dHJ1ZSwiU2VjcmV0SWQiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "152" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:39 GMT" ], "X-Amzn-Requestid": [ "2811a048-57b1-4659-ab45-f1d60f76adf9" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXIzSHdVWSIsIkRlbGV0aW9uRGF0ZSI6MS43MjMwNzYzODAxMzVFOSwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" } }, { "ID": "af2ae070e049791d", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "429" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:42 GMT" ], "X-Amzn-Requestid": [ "9e2f8432-6004-436c-8870-890cf5f07bb4" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXIzSHdVWSIsIkNyZWF0ZWREYXRlIjoxLjcyMzA3NjM3MzQ0RTksIkRlbGV0ZWREYXRlIjoxLjcyMzA3NjM4MDE0OEU5LCJMYXN0QWNjZXNzZWREYXRlIjoxLjcyMzA3NTJFOSwiTGFzdENoYW5nZWREYXRlIjoxLjcyMzA3NjM4MDE1NEU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJWZXJzaW9uSWRzVG9TdGFnZXMiOnsidGVzdC1jb25maWctdmFyaWFibGUtMDA3OGJiOGU1YzlkOGFiZjdmMWU0ZTE0Yzg3ZDkwMjMyMzViNjIzMCI6WyJBV1NDVVJSRU5UIl0sInRlc3QtY29uZmlnLXZhcmlhYmxlLTJhYWU2YzM1Yzk0ZmNmYjQxNWRiZTk1ZjQwOGI5Y2U5MWVlODQ2ZWQiOlsiQVdTUFJFVklPVVMiXX19" } }, { "ID": "827844f6a7fc44b6", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "429" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:43 GMT" ], "X-Amzn-Requestid": [ "9c143a37-8a91-4942-b335-c0c7810bea4c" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXIzSHdVWSIsIkNyZWF0ZWREYXRlIjoxLjcyMzA3NjM3MzQ0RTksIkRlbGV0ZWREYXRlIjoxLjcyMzA3NjM4MDE0OEU5LCJMYXN0QWNjZXNzZWREYXRlIjoxLjcyMzA3NTJFOSwiTGFzdENoYW5nZWREYXRlIjoxLjcyMzA3NjM4MDE1NEU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJWZXJzaW9uSWRzVG9TdGFnZXMiOnsidGVzdC1jb25maWctdmFyaWFibGUtMDA3OGJiOGU1YzlkOGFiZjdmMWU0ZTE0Yzg3ZDkwMjMyMzViNjIzMCI6WyJBV1NDVVJSRU5UIl0sInRlc3QtY29uZmlnLXZhcmlhYmxlLTJhYWU2YzM1Yzk0ZmNmYjQxNWRiZTk1ZjQwOGI5Y2U5MWVlODQ2ZWQiOlsiQVdTUFJFVklPVVMiXX19" } }, { "ID": "73c29d8c1ab6674c", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:19:44 GMT" ], "X-Amzn-Requestid": [ "4b838475-9906-4c92-9d1d-120898381351" ] }, "Body": "eyJfX3R5cGUiOiJSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIiwiTWVzc2FnZSI6IlNlY3JldHMgTWFuYWdlciBjYW4ndCBmaW5kIHRoZSBzcGVjaWZpZWQgc2VjcmV0LiJ9" } } ] } ================================================ FILE: runtimevar/awssecretsmanager/testdata/TestConformance/TestConformanceV2/TestUpdateWithErrors.replay ================================================ { "Initial": "AQAAAA7eRgYxM3lkAgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "e7378230dd7a0fd9", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "192" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.CreateSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDbGllbnRSZXF1ZXN0VG9rZW4iOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yLTQ3MmFiZDIyZDc5ZDA2MjAzZWQ3MWI4OTc5OWJlNmMzIiwiTmFtZSI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IiLCJTZWNyZXRCaW5hcnkiOiJXM3NpVG1GdFpTSTZJQ0pHYjI4aUxDQWlWR1Y0ZENJNklDSkNZWElpZlYwPSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "221" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:02 GMT" ], "X-Amzn-Requestid": [ "ca78b1b8-1a5a-45c6-849d-b2e8d86cbed0" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3Ita3VrTHJZIiwiTmFtZSI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IiLCJWZXJzaW9uSWQiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yLTQ3MmFiZDIyZDc5ZDA2MjAzZWQ3MWI4OTc5OWJlNmMzIn0=" } }, { "ID": "d0fd50ad8a23e23e", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "46" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "345" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:05 GMT" ], "X-Amzn-Requestid": [ "6ea93183-3dbf-4019-81ca-256d7b45e562" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3Ita3VrTHJZIiwiQ3JlYXRlZERhdGUiOjEuNzIzMDc2NDAyMDU4RTksIk5hbWUiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yIiwiU2VjcmV0QmluYXJ5IjoiVzNzaVRtRnRaU0k2SUNKR2IyOGlMQ0FpVkdWNGRDSTZJQ0pDWVhJaWZWMD0iLCJWZXJzaW9uSWQiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yLTQ3MmFiZDIyZDc5ZDA2MjAzZWQ3MWI4OTc5OWJlNmMzIiwiVmVyc2lvblN0YWdlcyI6WyJBV1NDVVJSRU5UIl19" } }, { "ID": "4e31626782f9baa1", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "46" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "345" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:05 GMT" ], "X-Amzn-Requestid": [ "b9c130e3-0b1d-4aad-b2f5-6b42f044bb2d" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3Ita3VrTHJZIiwiQ3JlYXRlZERhdGUiOjEuNzIzMDc2NDAyMDU4RTksIk5hbWUiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yIiwiU2VjcmV0QmluYXJ5IjoiVzNzaVRtRnRaU0k2SUNKR2IyOGlMQ0FpVkdWNGRDSTZJQ0pDWVhJaWZWMD0iLCJWZXJzaW9uSWQiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yLTQ3MmFiZDIyZDc5ZDA2MjAzZWQ3MWI4OTc5OWJlNmMzIiwiVmVyc2lvblN0YWdlcyI6WyJBV1NDVVJSRU5UIl19" } }, { "ID": "91b451a2f6cb7da1", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "46" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "344" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:05 GMT" ], "X-Amzn-Requestid": [ "4015d3f5-d355-472f-9614-29b985de30e4" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3Ita3VrTHJZIiwiQ3JlYXRlZERhdGUiOjEuNzIzMDc2NDAyMDM0RTksIkxhc3RBY2Nlc3NlZERhdGUiOjEuNzIzMDc1MkU5LCJMYXN0Q2hhbmdlZERhdGUiOjEuNzIzMDc2NDAyMDYyRTksIk5hbWUiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yIiwiVmVyc2lvbklkc1RvU3RhZ2VzIjp7InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3ItNDcyYWJkMjJkNzlkMDYyMDNlZDcxYjg5Nzk5YmU2YzMiOlsiQVdTQ1VSUkVOVCJdfX0=" } }, { "ID": "a82ea2278ba525f1", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "168" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.PutSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDbGllbnRSZXF1ZXN0VG9rZW4iOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yLTcwNWQxMTYxMDhjNmJmYzlkMThlMjUyNmQwODlkNmMxIiwiU2VjcmV0QmluYXJ5IjoiYVc1MllXeHBaQzFxYzI5dSIsIlNlY3JldElkIjoidGVzdC11cGRhdGluZy12YXJpYWJsZS10by1lcnJvciJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "252" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:05 GMT" ], "X-Amzn-Requestid": [ "92b8b569-5e1e-47c6-a00b-b59fb5a1d224" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3Ita3VrTHJZIiwiTmFtZSI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IiLCJWZXJzaW9uSWQiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yLTcwNWQxMTYxMDhjNmJmYzlkMThlMjUyNmQwODlkNmMxIiwiVmVyc2lvblN0YWdlcyI6WyJBV1NDVVJSRU5UIl19" } }, { "ID": "12414765af83e798", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "46" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "317" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:08 GMT" ], "X-Amzn-Requestid": [ "ac830d92-14b5-41be-8fa7-0670f74050c9" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3Ita3VrTHJZIiwiQ3JlYXRlZERhdGUiOjEuNzIzMDc2NDA1MzkyRTksIk5hbWUiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yIiwiU2VjcmV0QmluYXJ5IjoiYVc1MllXeHBaQzFxYzI5dSIsIlZlcnNpb25JZCI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3ItNzA1ZDExNjEwOGM2YmZjOWQxOGUyNTI2ZDA4OWQ2YzEiLCJWZXJzaW9uU3RhZ2VzIjpbIkFXU0NVUlJFTlQiXX0=" } }, { "ID": "877d3a3eda335390", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "46" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "317" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:08 GMT" ], "X-Amzn-Requestid": [ "39166b95-606e-4fb5-933e-a13815b0224a" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3Ita3VrTHJZIiwiQ3JlYXRlZERhdGUiOjEuNzIzMDc2NDA1MzkyRTksIk5hbWUiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yIiwiU2VjcmV0QmluYXJ5IjoiYVc1MllXeHBaQzFxYzI5dSIsIlZlcnNpb25JZCI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3ItNzA1ZDExNjEwOGM2YmZjOWQxOGUyNTI2ZDA4OWQ2YzEiLCJWZXJzaW9uU3RhZ2VzIjpbIkFXU0NVUlJFTlQiXX0=" } }, { "ID": "d977128844c6e41c", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "46" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "427" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:08 GMT" ], "X-Amzn-Requestid": [ "f325093b-5711-42b2-a8c6-f94e5b8ec41f" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3Ita3VrTHJZIiwiQ3JlYXRlZERhdGUiOjEuNzIzMDc2NDAyMDM0RTksIkxhc3RBY2Nlc3NlZERhdGUiOjEuNzIzMDc1MkU5LCJMYXN0Q2hhbmdlZERhdGUiOjEuNzIzMDc2NDA1Mzk3RTksIk5hbWUiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yIiwiVmVyc2lvbklkc1RvU3RhZ2VzIjp7InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3ItNDcyYWJkMjJkNzlkMDYyMDNlZDcxYjg5Nzk5YmU2YzMiOlsiQVdTUFJFVklPVVMiXSwidGVzdC11cGRhdGluZy12YXJpYWJsZS10by1lcnJvci03MDVkMTE2MTA4YzZiZmM5ZDE4ZTI1MjZkMDg5ZDZjMSI6WyJBV1NDVVJSRU5UIl19fQ==" } }, { "ID": "5c56ceda4b302ba8", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "172" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.PutSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDbGllbnRSZXF1ZXN0VG9rZW4iOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yLTY0NTVhNzI4OWQ4NjY0NGU3OTBiYTU5NjJiNDE2MTEwIiwiU2VjcmV0QmluYXJ5IjoiYVc1MllXeHBaQzFxYzI5dU1nPT0iLCJTZWNyZXRJZCI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "252" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:08 GMT" ], "X-Amzn-Requestid": [ "36576310-8e5c-4918-ac84-2a2ccd823c1d" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3Ita3VrTHJZIiwiTmFtZSI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IiLCJWZXJzaW9uSWQiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yLTY0NTVhNzI4OWQ4NjY0NGU3OTBiYTU5NjJiNDE2MTEwIiwiVmVyc2lvblN0YWdlcyI6WyJBV1NDVVJSRU5UIl19" } }, { "ID": "94010ae5fa45f87b", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "46" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "321" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:11 GMT" ], "X-Amzn-Requestid": [ "663ae774-965d-4d82-9a1d-e986b438f731" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3Ita3VrTHJZIiwiQ3JlYXRlZERhdGUiOjEuNzIzMDc2NDA4NjgyRTksIk5hbWUiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yIiwiU2VjcmV0QmluYXJ5IjoiYVc1MllXeHBaQzFxYzI5dU1nPT0iLCJWZXJzaW9uSWQiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yLTY0NTVhNzI4OWQ4NjY0NGU3OTBiYTU5NjJiNDE2MTEwIiwiVmVyc2lvblN0YWdlcyI6WyJBV1NDVVJSRU5UIl19" } }, { "ID": "d0785179280f168b", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "46" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "321" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:11 GMT" ], "X-Amzn-Requestid": [ "88f1dbef-11a0-4989-8566-36e5eaf76a5c" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3Ita3VrTHJZIiwiQ3JlYXRlZERhdGUiOjEuNzIzMDc2NDA4NjgyRTksIk5hbWUiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yIiwiU2VjcmV0QmluYXJ5IjoiYVc1MllXeHBaQzFxYzI5dU1nPT0iLCJWZXJzaW9uSWQiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yLTY0NTVhNzI4OWQ4NjY0NGU3OTBiYTU5NjJiNDE2MTEwIiwiVmVyc2lvblN0YWdlcyI6WyJBV1NDVVJSRU5UIl19" } }, { "ID": "6464d4fef7c1337c", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "46" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "427" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:11 GMT" ], "X-Amzn-Requestid": [ "de015a36-debf-402b-bb54-5155ba0d9671" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3Ita3VrTHJZIiwiQ3JlYXRlZERhdGUiOjEuNzIzMDc2NDAyMDM0RTksIkxhc3RBY2Nlc3NlZERhdGUiOjEuNzIzMDc1MkU5LCJMYXN0Q2hhbmdlZERhdGUiOjEuNzIzMDc2NDA4Njg2RTksIk5hbWUiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yIiwiVmVyc2lvbklkc1RvU3RhZ2VzIjp7InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3ItNjQ1NWE3Mjg5ZDg2NjQ0ZTc5MGJhNTk2MmI0MTYxMTAiOlsiQVdTQ1VSUkVOVCJdLCJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yLTcwNWQxMTYxMDhjNmJmYzlkMThlMjUyNmQwODlkNmMxIjpbIkFXU1BSRVZJT1VTIl19fQ==" } }, { "ID": "6a15da7b83185ceb", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "80" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DeleteSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJGb3JjZURlbGV0ZVdpdGhvdXRSZWNvdmVyeSI6dHJ1ZSwiU2VjcmV0SWQiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "174" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:11 GMT" ], "X-Amzn-Requestid": [ "8b6cfcc2-3bd2-4eed-a418-ce7e606352c1" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3Ita3VrTHJZIiwiRGVsZXRpb25EYXRlIjoxLjcyMzA3NjQxMTk2MUU5LCJOYW1lIjoidGVzdC11cGRhdGluZy12YXJpYWJsZS10by1lcnJvciJ9" } }, { "ID": "2b580935647b5985", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "46" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "457" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:15 GMT" ], "X-Amzn-Requestid": [ "6233b4aa-cc9c-495f-9f02-b1db1a4a498c" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NjIzODAyMjU3MjI6c2VjcmV0OnRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3Ita3VrTHJZIiwiQ3JlYXRlZERhdGUiOjEuNzIzMDc2NDAyMDM0RTksIkRlbGV0ZWREYXRlIjoxLjcyMzA3NjQxMTk3RTksIkxhc3RBY2Nlc3NlZERhdGUiOjEuNzIzMDc1MkU5LCJMYXN0Q2hhbmdlZERhdGUiOjEuNzIzMDc2NDExOTc1RTksIk5hbWUiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yIiwiVmVyc2lvbklkc1RvU3RhZ2VzIjp7InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3ItNjQ1NWE3Mjg5ZDg2NjQ0ZTc5MGJhNTk2MmI0MTYxMTAiOlsiQVdTQ1VSUkVOVCJdLCJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yLTcwNWQxMTYxMDhjNmJmYzlkMThlMjUyNmQwODlkNmMxIjpbIkFXU1BSRVZJT1VTIl19fQ==" } }, { "ID": "5657bca3256a2c5d", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "46" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IifQ==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 08 Aug 2024 00:20:16 GMT" ], "X-Amzn-Requestid": [ "d7ef5491-2eb0-4c5a-badb-f7e0f4edc3f1" ] }, "Body": "eyJfX3R5cGUiOiJSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIiwiTWVzc2FnZSI6IlNlY3JldHMgTWFuYWdlciBjYW4ndCBmaW5kIHRoZSBzcGVjaWZpZWQgc2VjcmV0LiJ9" } } ] } ================================================ FILE: runtimevar/awssecretsmanager/testdata/TestConformance/TestDelete.replay ================================================ { "Initial": "AQAAAA7hTg4VGvfXdQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "cf6e5738ba47b739", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "150" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.CreateSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDbGllbnRSZXF1ZXN0VG9rZW4iOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZS0yYWFlNmMzNWM5NGZjZmI0MTVkYmU5NWY0MDhiOWNlOTFlZTg0NmVkIiwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIiwiU2VjcmV0QmluYXJ5IjoiYUdWc2JHOGdkMjl5YkdRPSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "196" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:37 GMT" ], "X-Amzn-Requestid": [ "1d27f6cf-71c9-4916-bb8c-9cb6571a35d5" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLVAyMXNaaiIsIk5hbWUiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZSIsIlZlcnNpb25JZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlLTJhYWU2YzM1Yzk0ZmNmYjQxNWRiZTk1ZjQwOGI5Y2U5MWVlODQ2ZWQifQ==" } }, { "ID": "d7f5e20c20a5c2fc", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "292" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:40 GMT" ], "X-Amzn-Requestid": [ "19bf46da-e111-4d5a-afd0-1cd41c8bb8dc" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLVAyMXNaaiIsIkNyZWF0ZWREYXRlIjoxLjc3MzkzNDM1NzY5NEU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJTZWNyZXRCaW5hcnkiOiJhR1ZzYkc4Z2QyOXliR1E9IiwiVmVyc2lvbklkIjoidGVzdC1jb25maWctdmFyaWFibGUtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCIsIlZlcnNpb25TdGFnZXMiOlsiQVdTQ1VSUkVOVCJdfQ==" } }, { "ID": "ee098634af09c922", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "292" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:40 GMT" ], "X-Amzn-Requestid": [ "75de0cdb-7c41-441d-ba0d-01b690a414e5" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLVAyMXNaaiIsIkNyZWF0ZWREYXRlIjoxLjc3MzkzNDM1NzY5NEU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJTZWNyZXRCaW5hcnkiOiJhR1ZzYkc4Z2QyOXliR1E9IiwiVmVyc2lvbklkIjoidGVzdC1jb25maWctdmFyaWFibGUtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCIsIlZlcnNpb25TdGFnZXMiOlsiQVdTQ1VSUkVOVCJdfQ==" } }, { "ID": "d04f5e0d3e8abc91", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "319" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:40 GMT" ], "X-Amzn-Requestid": [ "651941a3-1c77-488c-8dc9-b39fb7c87037" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLVAyMXNaaiIsIkNyZWF0ZWREYXRlIjoxLjc3MzkzNDM1NzY1NkU5LCJMYXN0QWNjZXNzZWREYXRlIjoxLjc3Mzg3ODRFOSwiTGFzdENoYW5nZWREYXRlIjoxLjc3MzkzNDM1NzY5OUU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJWZXJzaW9uSWRzVG9TdGFnZXMiOnsidGVzdC1jb25maWctdmFyaWFibGUtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCI6WyJBV1NDVVJSRU5UIl19fQ==" } }, { "ID": "50c88dfb31ce7041", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "69" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DeleteSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJGb3JjZURlbGV0ZVdpdGhvdXRSZWNvdmVyeSI6dHJ1ZSwiU2VjcmV0SWQiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "152" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:41 GMT" ], "X-Amzn-Requestid": [ "4fb8fd70-0d28-4464-8358-2eddae7b307d" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLVAyMXNaaiIsIkRlbGV0aW9uRGF0ZSI6MS43NzM5MzQzNjEwNTRFOSwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" } }, { "ID": "059eb4d04eb32803", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "350" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:44 GMT" ], "X-Amzn-Requestid": [ "fb798e8d-3ecf-41de-82ef-0197cff5aed6" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLVAyMXNaaiIsIkNyZWF0ZWREYXRlIjoxLjc3MzkzNDM1NzY1NkU5LCJEZWxldGVkRGF0ZSI6MS43NzM5MzQzNjEwNjNFOSwiTGFzdEFjY2Vzc2VkRGF0ZSI6MS43NzM4Nzg0RTksIkxhc3RDaGFuZ2VkRGF0ZSI6MS43NzM5MzQzNjEwNzJFOSwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIiwiVmVyc2lvbklkc1RvU3RhZ2VzIjp7InRlc3QtY29uZmlnLXZhcmlhYmxlLTJhYWU2YzM1Yzk0ZmNmYjQxNWRiZTk1ZjQwOGI5Y2U5MWVlODQ2ZWQiOlsiQVdTQ1VSUkVOVCJdfX0=" } }, { "ID": "4b4844f635ea9d44", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "350" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:44 GMT" ], "X-Amzn-Requestid": [ "38349852-ff64-4e74-a32c-ba18cb6a9216" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLVAyMXNaaiIsIkNyZWF0ZWREYXRlIjoxLjc3MzkzNDM1NzY1NkU5LCJEZWxldGVkRGF0ZSI6MS43NzM5MzQzNjEwNjNFOSwiTGFzdEFjY2Vzc2VkRGF0ZSI6MS43NzM4Nzg0RTksIkxhc3RDaGFuZ2VkRGF0ZSI6MS43NzM5MzQzNjEwNzJFOSwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIiwiVmVyc2lvbklkc1RvU3RhZ2VzIjp7InRlc3QtY29uZmlnLXZhcmlhYmxlLTJhYWU2YzM1Yzk0ZmNmYjQxNWRiZTk1ZjQwOGI5Y2U5MWVlODQ2ZWQiOlsiQVdTQ1VSUkVOVCJdfX0=" } }, { "ID": "69f588b9aedf1b21", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "350" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:45 GMT" ], "X-Amzn-Requestid": [ "cd49127d-9335-4df7-b093-3129c3acab40" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLVAyMXNaaiIsIkNyZWF0ZWREYXRlIjoxLjc3MzkzNDM1NzY1NkU5LCJEZWxldGVkRGF0ZSI6MS43NzM5MzQzNjEwNjNFOSwiTGFzdEFjY2Vzc2VkRGF0ZSI6MS43NzM4Nzg0RTksIkxhc3RDaGFuZ2VkRGF0ZSI6MS43NzM5MzQzNjEwNzJFOSwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIiwiVmVyc2lvbklkc1RvU3RhZ2VzIjp7InRlc3QtY29uZmlnLXZhcmlhYmxlLTJhYWU2YzM1Yzk0ZmNmYjQxNWRiZTk1ZjQwOGI5Y2U5MWVlODQ2ZWQiOlsiQVdTQ1VSUkVOVCJdfX0=" } }, { "ID": "fb50dd29ca4be664", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:46 GMT" ], "X-Amzn-Requestid": [ "f8667cbe-009b-4bd4-8680-89e5dbe333ed" ] }, "Body": "eyJfX3R5cGUiOiJSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIiwiTWVzc2FnZSI6IlNlY3JldHMgTWFuYWdlciBjYW4ndCBmaW5kIHRoZSBzcGVjaWZpZWQgc2VjcmV0LiJ9" } }, { "ID": "aecab3d83642d098", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:46 GMT" ], "X-Amzn-Requestid": [ "e6bbbf08-be9b-42a6-bbbb-272f97a91abd" ] }, "Body": "eyJfX3R5cGUiOiJSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIiwiTWVzc2FnZSI6IlNlY3JldHMgTWFuYWdlciBjYW4ndCBmaW5kIHRoZSBzcGVjaWZpZWQgc2VjcmV0LiJ9" } }, { "ID": "7a66d30b43f1a8d7", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "154" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.CreateSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDbGllbnRSZXF1ZXN0VG9rZW4iOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZS0wMDc4YmI4ZTVjOWQ4YWJmN2YxZTRlMTRjODdkOTAyMzIzNWI2MjMwIiwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIiwiU2VjcmV0QmluYXJ5IjoiWjI5dlpHSjVaU0IzYjNKc1pBPT0ifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "196" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:46 GMT" ], "X-Amzn-Requestid": [ "f8205c4f-1e0e-4502-b1a3-5c9feb68528f" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXRKVm5uSSIsIk5hbWUiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZSIsIlZlcnNpb25JZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlLTAwNzhiYjhlNWM5ZDhhYmY3ZjFlNGUxNGM4N2Q5MDIzMjM1YjYyMzAifQ==" } }, { "ID": "eeb8327b15d537d4", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "296" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:49 GMT" ], "X-Amzn-Requestid": [ "6b1c3359-da4b-458f-9e4a-9273965ed475" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXRKVm5uSSIsIkNyZWF0ZWREYXRlIjoxLjc3MzkzNDM2NjYwOUU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJTZWNyZXRCaW5hcnkiOiJaMjl2WkdKNVpTQjNiM0pzWkE9PSIsIlZlcnNpb25JZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlLTAwNzhiYjhlNWM5ZDhhYmY3ZjFlNGUxNGM4N2Q5MDIzMjM1YjYyMzAiLCJWZXJzaW9uU3RhZ2VzIjpbIkFXU0NVUlJFTlQiXX0=" } }, { "ID": "b2ded1b913c5e146", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "296" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:49 GMT" ], "X-Amzn-Requestid": [ "848b1e4c-d667-45ee-99a9-f1cb67a836d2" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXRKVm5uSSIsIkNyZWF0ZWREYXRlIjoxLjc3MzkzNDM2NjYwOUU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJTZWNyZXRCaW5hcnkiOiJaMjl2WkdKNVpTQjNiM0pzWkE9PSIsIlZlcnNpb25JZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlLTAwNzhiYjhlNWM5ZDhhYmY3ZjFlNGUxNGM4N2Q5MDIzMjM1YjYyMzAiLCJWZXJzaW9uU3RhZ2VzIjpbIkFXU0NVUlJFTlQiXX0=" } }, { "ID": "a64f8ed6cf6329d1", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "319" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:49 GMT" ], "X-Amzn-Requestid": [ "658440f4-7780-4337-98d8-edb1114ae914" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXRKVm5uSSIsIkNyZWF0ZWREYXRlIjoxLjc3MzkzNDM2NjU3OEU5LCJMYXN0QWNjZXNzZWREYXRlIjoxLjc3Mzg3ODRFOSwiTGFzdENoYW5nZWREYXRlIjoxLjc3MzkzNDM2NjYxMkU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJWZXJzaW9uSWRzVG9TdGFnZXMiOnsidGVzdC1jb25maWctdmFyaWFibGUtMDA3OGJiOGU1YzlkOGFiZjdmMWU0ZTE0Yzg3ZDkwMjMyMzViNjIzMCI6WyJBV1NDVVJSRU5UIl19fQ==" } }, { "ID": "1c45d2b618dc5b1e", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "69" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DeleteSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJGb3JjZURlbGV0ZVdpdGhvdXRSZWNvdmVyeSI6dHJ1ZSwiU2VjcmV0SWQiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "152" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:50 GMT" ], "X-Amzn-Requestid": [ "60de5b45-0c56-4c91-a33f-e87ee7eb8590" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXRKVm5uSSIsIkRlbGV0aW9uRGF0ZSI6MS43NzM5MzQzNjk5NTlFOSwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" } }, { "ID": "a1fc7acfb87b752b", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "350" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:53 GMT" ], "X-Amzn-Requestid": [ "f291be83-eb2c-4eca-8a8c-e0200eb139ff" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXRKVm5uSSIsIkNyZWF0ZWREYXRlIjoxLjc3MzkzNDM2NjU3OEU5LCJEZWxldGVkRGF0ZSI6MS43NzM5MzQzNjk5NjVFOSwiTGFzdEFjY2Vzc2VkRGF0ZSI6MS43NzM4Nzg0RTksIkxhc3RDaGFuZ2VkRGF0ZSI6MS43NzM5MzQzNjk5NzFFOSwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIiwiVmVyc2lvbklkc1RvU3RhZ2VzIjp7InRlc3QtY29uZmlnLXZhcmlhYmxlLTAwNzhiYjhlNWM5ZDhhYmY3ZjFlNGUxNGM4N2Q5MDIzMjM1YjYyMzAiOlsiQVdTQ1VSUkVOVCJdfX0=" } }, { "ID": "401bb215c5847f8c", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:54 GMT" ], "X-Amzn-Requestid": [ "2ef60675-f3bd-4a7b-804d-8867e3c5ab60" ] }, "Body": "eyJfX3R5cGUiOiJSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIiwiTWVzc2FnZSI6IlNlY3JldHMgTWFuYWdlciBjYW4ndCBmaW5kIHRoZSBzcGVjaWZpZWQgc2VjcmV0LiJ9" } } ] } ================================================ FILE: runtimevar/awssecretsmanager/testdata/TestConformance/TestInvalidJSON.replay ================================================ { "Initial": "AQAAAA7hTg4AJpa6pgAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "dfce9de0ca459e82", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "146" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.CreateSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDbGllbnRSZXF1ZXN0VG9rZW4iOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZS0zMzMzYzU5NjE3OTFjMjg3MDI4MzY2NTgxYWQ3NmQ5MjFjYTYxY2FkIiwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIiwiU2VjcmV0QmluYXJ5IjoiYm05MExXcHpiMjQ9In0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "196" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:16 GMT" ], "X-Amzn-Requestid": [ "0985f9bd-259c-4246-b7ae-5a65c8effee5" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXdKSDdmbCIsIk5hbWUiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZSIsIlZlcnNpb25JZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlLTMzMzNjNTk2MTc5MWMyODcwMjgzNjY1ODFhZDc2ZDkyMWNhNjFjYWQifQ==" } }, { "ID": "58c150b476a8b8c9", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "288" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:20 GMT" ], "X-Amzn-Requestid": [ "d3049823-ecc9-47bf-ad95-1100f1e502cb" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXdKSDdmbCIsIkNyZWF0ZWREYXRlIjoxLjc3MzkzNDMzNjg4NkU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJTZWNyZXRCaW5hcnkiOiJibTkwTFdwemIyND0iLCJWZXJzaW9uSWQiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZS0zMzMzYzU5NjE3OTFjMjg3MDI4MzY2NTgxYWQ3NmQ5MjFjYTYxY2FkIiwiVmVyc2lvblN0YWdlcyI6WyJBV1NDVVJSRU5UIl19" } }, { "ID": "c0eb27a971d8eacc", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "288" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:20 GMT" ], "X-Amzn-Requestid": [ "6498080d-5700-4f50-b08b-6c6171733bf7" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXdKSDdmbCIsIkNyZWF0ZWREYXRlIjoxLjc3MzkzNDMzNjg4NkU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJTZWNyZXRCaW5hcnkiOiJibTkwTFdwemIyND0iLCJWZXJzaW9uSWQiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZS0zMzMzYzU5NjE3OTFjMjg3MDI4MzY2NTgxYWQ3NmQ5MjFjYTYxY2FkIiwiVmVyc2lvblN0YWdlcyI6WyJBV1NDVVJSRU5UIl19" } }, { "ID": "5b692f2f6b14765b", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "318" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:20 GMT" ], "X-Amzn-Requestid": [ "5f79649e-b989-4dce-bee9-91a0509d9491" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXdKSDdmbCIsIkNyZWF0ZWREYXRlIjoxLjc3MzkzNDMzNjg1MUU5LCJMYXN0QWNjZXNzZWREYXRlIjoxLjc3Mzg3ODRFOSwiTGFzdENoYW5nZWREYXRlIjoxLjc3MzkzNDMzNjg5RTksIk5hbWUiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZSIsIlZlcnNpb25JZHNUb1N0YWdlcyI6eyJ0ZXN0LWNvbmZpZy12YXJpYWJsZS0zMzMzYzU5NjE3OTFjMjg3MDI4MzY2NTgxYWQ3NmQ5MjFjYTYxY2FkIjpbIkFXU0NVUlJFTlQiXX19" } }, { "ID": "655d61f9f21e45f1", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "69" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DeleteSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJGb3JjZURlbGV0ZVdpdGhvdXRSZWNvdmVyeSI6dHJ1ZSwiU2VjcmV0SWQiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "152" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:20 GMT" ], "X-Amzn-Requestid": [ "6d00ec79-aa99-4473-8177-adb6bcb977b0" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXdKSDdmbCIsIkRlbGV0aW9uRGF0ZSI6MS43NzM5MzQzNDAyNDdFOSwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" } }, { "ID": "280532ba45fea71c", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "350" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:23 GMT" ], "X-Amzn-Requestid": [ "bac67e08-879c-478a-817e-9ab95b7384d2" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXdKSDdmbCIsIkNyZWF0ZWREYXRlIjoxLjc3MzkzNDMzNjg1MUU5LCJEZWxldGVkRGF0ZSI6MS43NzM5MzQzNDAyNTdFOSwiTGFzdEFjY2Vzc2VkRGF0ZSI6MS43NzM4Nzg0RTksIkxhc3RDaGFuZ2VkRGF0ZSI6MS43NzM5MzQzNDAyNjNFOSwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIiwiVmVyc2lvbklkc1RvU3RhZ2VzIjp7InRlc3QtY29uZmlnLXZhcmlhYmxlLTMzMzNjNTk2MTc5MWMyODcwMjgzNjY1ODFhZDc2ZDkyMWNhNjFjYWQiOlsiQVdTQ1VSUkVOVCJdfX0=" } }, { "ID": "a2cac6a0c7470cc8", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:25 GMT" ], "X-Amzn-Requestid": [ "efce6cab-b470-44e8-90e1-228ff1f81408" ] }, "Body": "eyJfX3R5cGUiOiJSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIiwiTWVzc2FnZSI6IlNlY3JldHMgTWFuYWdlciBjYW4ndCBmaW5kIHRoZSBzcGVjaWZpZWQgc2VjcmV0LiJ9" } } ] } ================================================ FILE: runtimevar/awssecretsmanager/testdata/TestConformance/TestJSON.replay ================================================ { "Initial": "AQAAAA7hTg34IRiV4gAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "3b6c77f89b32e88e", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "246" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.CreateSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDbGllbnRSZXF1ZXN0VG9rZW4iOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZS0wNjllMGIzNTU3ZDExZjNiNTg5OGE3YmI3ZTE4Mzg0ZTMxMjVjYWJjIiwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIiwiU2VjcmV0QmluYXJ5IjoiV3dwN0lrNWhiV1VpT2lBaVJXUWlMQ0FpVkdWNGRDSTZJQ0pMYm05amF5QnJibTlqYXk0aWZTd0tleUpPWVcxbElqb2dJbE5oYlNJc0lDSlVaWGgwSWpvZ0lsZG9ieWR6SUhSb1pYSmxQeUo5Q2wwPSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "196" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:08 GMT" ], "X-Amzn-Requestid": [ "82537010-d847-4818-8a11-c55b36ab07e5" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLU5YY05RbyIsIk5hbWUiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZSIsIlZlcnNpb25JZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlLTA2OWUwYjM1NTdkMTFmM2I1ODk4YTdiYjdlMTgzODRlMzEyNWNhYmMifQ==" } }, { "ID": "da577f238a3745ce", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "388" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:11 GMT" ], "X-Amzn-Requestid": [ "2b397555-d0ee-45a2-b32b-c8a763c9aaa6" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLU5YY05RbyIsIkNyZWF0ZWREYXRlIjoxLjc3MzkzNDMyODc5OEU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJTZWNyZXRCaW5hcnkiOiJXd3A3SWs1aGJXVWlPaUFpUldRaUxDQWlWR1Y0ZENJNklDSkxibTlqYXlCcmJtOWpheTRpZlN3S2V5Sk9ZVzFsSWpvZ0lsTmhiU0lzSUNKVVpYaDBJam9nSWxkb2J5ZHpJSFJvWlhKbFB5SjlDbDA9IiwiVmVyc2lvbklkIjoidGVzdC1jb25maWctdmFyaWFibGUtMDY5ZTBiMzU1N2QxMWYzYjU4OThhN2JiN2UxODM4NGUzMTI1Y2FiYyIsIlZlcnNpb25TdGFnZXMiOlsiQVdTQ1VSUkVOVCJdfQ==" } }, { "ID": "da37a5f2c9cba0ac", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "388" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:12 GMT" ], "X-Amzn-Requestid": [ "b6f9f405-ddb7-4072-9405-3626e2ec983e" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLU5YY05RbyIsIkNyZWF0ZWREYXRlIjoxLjc3MzkzNDMyODc5OEU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJTZWNyZXRCaW5hcnkiOiJXd3A3SWs1aGJXVWlPaUFpUldRaUxDQWlWR1Y0ZENJNklDSkxibTlqYXlCcmJtOWpheTRpZlN3S2V5Sk9ZVzFsSWpvZ0lsTmhiU0lzSUNKVVpYaDBJam9nSWxkb2J5ZHpJSFJvWlhKbFB5SjlDbDA9IiwiVmVyc2lvbklkIjoidGVzdC1jb25maWctdmFyaWFibGUtMDY5ZTBiMzU1N2QxMWYzYjU4OThhN2JiN2UxODM4NGUzMTI1Y2FiYyIsIlZlcnNpb25TdGFnZXMiOlsiQVdTQ1VSUkVOVCJdfQ==" } }, { "ID": "f6029e8027e9650f", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "319" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:12 GMT" ], "X-Amzn-Requestid": [ "867f5d37-4246-4a63-bba5-5c30fdad2f1c" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLU5YY05RbyIsIkNyZWF0ZWREYXRlIjoxLjc3MzkzNDMyODc1OEU5LCJMYXN0QWNjZXNzZWREYXRlIjoxLjc3Mzg3ODRFOSwiTGFzdENoYW5nZWREYXRlIjoxLjc3MzkzNDMyODgwM0U5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJWZXJzaW9uSWRzVG9TdGFnZXMiOnsidGVzdC1jb25maWctdmFyaWFibGUtMDY5ZTBiMzU1N2QxMWYzYjU4OThhN2JiN2UxODM4NGUzMTI1Y2FiYyI6WyJBV1NDVVJSRU5UIl19fQ==" } }, { "ID": "d194a85fc33b6c9b", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "69" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DeleteSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJGb3JjZURlbGV0ZVdpdGhvdXRSZWNvdmVyeSI6dHJ1ZSwiU2VjcmV0SWQiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "152" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:12 GMT" ], "X-Amzn-Requestid": [ "6bcaae57-512d-4e28-bc31-99044ebfc308" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLU5YY05RbyIsIkRlbGV0aW9uRGF0ZSI6MS43NzM5MzQzMzIxNTZFOSwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" } }, { "ID": "aec138f3bad09125", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "350" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:15 GMT" ], "X-Amzn-Requestid": [ "4c9cfb15-9448-4dfe-a6ed-ae67d1a6971a" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLU5YY05RbyIsIkNyZWF0ZWREYXRlIjoxLjc3MzkzNDMyODc1OEU5LCJEZWxldGVkRGF0ZSI6MS43NzM5MzQzMzIxNjRFOSwiTGFzdEFjY2Vzc2VkRGF0ZSI6MS43NzM4Nzg0RTksIkxhc3RDaGFuZ2VkRGF0ZSI6MS43NzM5MzQzMzIxNjlFOSwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIiwiVmVyc2lvbklkc1RvU3RhZ2VzIjp7InRlc3QtY29uZmlnLXZhcmlhYmxlLTA2OWUwYjM1NTdkMTFmM2I1ODk4YTdiYjdlMTgzODRlMzEyNWNhYmMiOlsiQVdTQ1VSUkVOVCJdfX0=" } }, { "ID": "9af7bd7df4ff11a2", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "350" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:15 GMT" ], "X-Amzn-Requestid": [ "951f398b-b0d8-43f1-ac8b-f5c8a464b472" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLU5YY05RbyIsIkNyZWF0ZWREYXRlIjoxLjc3MzkzNDMyODc1OEU5LCJEZWxldGVkRGF0ZSI6MS43NzM5MzQzMzIxNjRFOSwiTGFzdEFjY2Vzc2VkRGF0ZSI6MS43NzM4Nzg0RTksIkxhc3RDaGFuZ2VkRGF0ZSI6MS43NzM5MzQzMzIxNjlFOSwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIiwiVmVyc2lvbklkc1RvU3RhZ2VzIjp7InRlc3QtY29uZmlnLXZhcmlhYmxlLTA2OWUwYjM1NTdkMTFmM2I1ODk4YTdiYjdlMTgzODRlMzEyNWNhYmMiOlsiQVdTQ1VSUkVOVCJdfX0=" } }, { "ID": "19ed5ddb8e89f712", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:16 GMT" ], "X-Amzn-Requestid": [ "79c82300-caf5-45c6-8cff-1370c40e1dc8" ] }, "Body": "eyJfX3R5cGUiOiJSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIiwiTWVzc2FnZSI6IlNlY3JldHMgTWFuYWdlciBjYW4ndCBmaW5kIHRoZSBzcGVjaWZpZWQgc2VjcmV0LiJ9" } } ] } ================================================ FILE: runtimevar/awssecretsmanager/testdata/TestConformance/TestNonExistentVariable.replay ================================================ { "Initial": "AQAAAA7hTg3qJKY/FQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "9c689d04aa605e98", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "29" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6ImRvZXMtbm90LWV4aXN0In0=" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:55 GMT" ], "X-Amzn-Requestid": [ "17978698-fdf8-4543-9270-6a3ae5008f1a" ] }, "Body": "eyJfX3R5cGUiOiJSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIiwiTWVzc2FnZSI6IlNlY3JldHMgTWFuYWdlciBjYW4ndCBmaW5kIHRoZSBzcGVjaWZpZWQgc2VjcmV0LiJ9" } } ] } ================================================ FILE: runtimevar/awssecretsmanager/testdata/TestConformance/TestString.replay ================================================ { "Initial": "AQAAAA7hTg3rClTPkAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "4a583881ebe0ba11", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "150" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.CreateSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDbGllbnRSZXF1ZXN0VG9rZW4iOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZS0yYWFlNmMzNWM5NGZjZmI0MTVkYmU5NWY0MDhiOWNlOTFlZTg0NmVkIiwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIiwiU2VjcmV0QmluYXJ5IjoiYUdWc2JHOGdkMjl5YkdRPSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "196" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:55 GMT" ], "X-Amzn-Requestid": [ "b898947d-e86f-4556-a632-e65a18e30472" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLWp3RGZxZSIsIk5hbWUiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZSIsIlZlcnNpb25JZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlLTJhYWU2YzM1Yzk0ZmNmYjQxNWRiZTk1ZjQwOGI5Y2U5MWVlODQ2ZWQifQ==" } }, { "ID": "61bc36195df4756a", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "292" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:58 GMT" ], "X-Amzn-Requestid": [ "23564970-228d-4634-83a6-8c5a926c452e" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLWp3RGZxZSIsIkNyZWF0ZWREYXRlIjoxLjc3MzkzNDMxNTQwM0U5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJTZWNyZXRCaW5hcnkiOiJhR1ZzYkc4Z2QyOXliR1E9IiwiVmVyc2lvbklkIjoidGVzdC1jb25maWctdmFyaWFibGUtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCIsIlZlcnNpb25TdGFnZXMiOlsiQVdTQ1VSUkVOVCJdfQ==" } }, { "ID": "eb2c3934364a51ac", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "292" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:58 GMT" ], "X-Amzn-Requestid": [ "fe81d395-7cd1-45c3-a888-92a7cbc034c7" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLWp3RGZxZSIsIkNyZWF0ZWREYXRlIjoxLjc3MzkzNDMxNTQwM0U5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJTZWNyZXRCaW5hcnkiOiJhR1ZzYkc4Z2QyOXliR1E9IiwiVmVyc2lvbklkIjoidGVzdC1jb25maWctdmFyaWFibGUtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCIsIlZlcnNpb25TdGFnZXMiOlsiQVdTQ1VSUkVOVCJdfQ==" } }, { "ID": "7eab00f9c2138253", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "319" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:58 GMT" ], "X-Amzn-Requestid": [ "1a5183b3-67ef-46cd-863e-d16a70baab47" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLWp3RGZxZSIsIkNyZWF0ZWREYXRlIjoxLjc3MzkzNDMxNTM3MkU5LCJMYXN0QWNjZXNzZWREYXRlIjoxLjc3Mzg3ODRFOSwiTGFzdENoYW5nZWREYXRlIjoxLjc3MzkzNDMxNTQwN0U5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJWZXJzaW9uSWRzVG9TdGFnZXMiOnsidGVzdC1jb25maWctdmFyaWFibGUtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCI6WyJBV1NDVVJSRU5UIl19fQ==" } }, { "ID": "c2d62c662e77b1b2", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "69" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DeleteSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJGb3JjZURlbGV0ZVdpdGhvdXRSZWNvdmVyeSI6dHJ1ZSwiU2VjcmV0SWQiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "152" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:03 GMT" ], "X-Amzn-Requestid": [ "471bddc8-e0d4-43c8-a36f-7030d94a81b3" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLWp3RGZxZSIsIkRlbGV0aW9uRGF0ZSI6MS43NzM5MzQzMjM3NjFFOSwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" } }, { "ID": "f95522284aaa8017", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "350" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:06 GMT" ], "X-Amzn-Requestid": [ "0df94c27-331b-4381-979e-b0a57b2ab00d" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLWp3RGZxZSIsIkNyZWF0ZWREYXRlIjoxLjc3MzkzNDMxNTM3MkU5LCJEZWxldGVkRGF0ZSI6MS43NzM5MzQzMjM3NjlFOSwiTGFzdEFjY2Vzc2VkRGF0ZSI6MS43NzM4Nzg0RTksIkxhc3RDaGFuZ2VkRGF0ZSI6MS43NzM5MzQzMjM3NzRFOSwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIiwiVmVyc2lvbklkc1RvU3RhZ2VzIjp7InRlc3QtY29uZmlnLXZhcmlhYmxlLTJhYWU2YzM1Yzk0ZmNmYjQxNWRiZTk1ZjQwOGI5Y2U5MWVlODQ2ZWQiOlsiQVdTQ1VSUkVOVCJdfX0=" } }, { "ID": "ee405e37b5ba9a58", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:08 GMT" ], "X-Amzn-Requestid": [ "cc08d9bb-bc98-4d43-9105-2f59c98d62fd" ] }, "Body": "eyJfX3R5cGUiOiJSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIiwiTWVzc2FnZSI6IlNlY3JldHMgTWFuYWdlciBjYW4ndCBmaW5kIHRoZSBzcGVjaWZpZWQgc2VjcmV0LiJ9" } } ] } ================================================ FILE: runtimevar/awssecretsmanager/testdata/TestConformance/TestUpdate.replay ================================================ { "Initial": "AQAAAA7hTg4JEZVaAAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "211e30c752a113cb", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "150" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.CreateSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDbGllbnRSZXF1ZXN0VG9rZW4iOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZS0yYWFlNmMzNWM5NGZjZmI0MTVkYmU5NWY0MDhiOWNlOTFlZTg0NmVkIiwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIiwiU2VjcmV0QmluYXJ5IjoiYUdWc2JHOGdkMjl5YkdRPSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "196" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:25 GMT" ], "X-Amzn-Requestid": [ "5079ca96-d777-4c8f-9d21-28331be54afe" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXRUSTRiWiIsIk5hbWUiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZSIsIlZlcnNpb25JZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlLTJhYWU2YzM1Yzk0ZmNmYjQxNWRiZTk1ZjQwOGI5Y2U5MWVlODQ2ZWQifQ==" } }, { "ID": "f1d70ba6ac5b80e2", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "292" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:28 GMT" ], "X-Amzn-Requestid": [ "591187ad-7f66-41a8-a060-329d42a61f3e" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXRUSTRiWiIsIkNyZWF0ZWREYXRlIjoxLjc3MzkzNDM0NTUyNUU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJTZWNyZXRCaW5hcnkiOiJhR1ZzYkc4Z2QyOXliR1E9IiwiVmVyc2lvbklkIjoidGVzdC1jb25maWctdmFyaWFibGUtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCIsIlZlcnNpb25TdGFnZXMiOlsiQVdTQ1VSUkVOVCJdfQ==" } }, { "ID": "14ee2780c063b86f", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "292" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:28 GMT" ], "X-Amzn-Requestid": [ "f86eafc4-e153-4848-bacf-010b7c7c5d79" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXRUSTRiWiIsIkNyZWF0ZWREYXRlIjoxLjc3MzkzNDM0NTUyNUU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJTZWNyZXRCaW5hcnkiOiJhR1ZzYkc4Z2QyOXliR1E9IiwiVmVyc2lvbklkIjoidGVzdC1jb25maWctdmFyaWFibGUtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCIsIlZlcnNpb25TdGFnZXMiOlsiQVdTQ1VSUkVOVCJdfQ==" } }, { "ID": "4b9520303d9a6c6b", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "319" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:28 GMT" ], "X-Amzn-Requestid": [ "4bcf6e7a-3101-4270-a1df-05cfb9461516" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXRUSTRiWiIsIkNyZWF0ZWREYXRlIjoxLjc3MzkzNDM0NTQ5N0U5LCJMYXN0QWNjZXNzZWREYXRlIjoxLjc3Mzg3ODRFOSwiTGFzdENoYW5nZWREYXRlIjoxLjc3MzkzNDM0NTUyOUU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJWZXJzaW9uSWRzVG9TdGFnZXMiOnsidGVzdC1jb25maWctdmFyaWFibGUtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCI6WyJBV1NDVVJSRU5UIl19fQ==" } }, { "ID": "2427f684d29cdef5", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "292" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:28 GMT" ], "X-Amzn-Requestid": [ "01b033de-43a0-42c9-b5e4-29392f45a71c" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXRUSTRiWiIsIkNyZWF0ZWREYXRlIjoxLjc3MzkzNDM0NTUyNUU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJTZWNyZXRCaW5hcnkiOiJhR1ZzYkc4Z2QyOXliR1E9IiwiVmVyc2lvbklkIjoidGVzdC1jb25maWctdmFyaWFibGUtMmFhZTZjMzVjOTRmY2ZiNDE1ZGJlOTVmNDA4YjljZTkxZWU4NDZlZCIsIlZlcnNpb25TdGFnZXMiOlsiQVdTQ1VSUkVOVCJdfQ==" } }, { "ID": "c88a51cc1d82f776", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "158" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.PutSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDbGllbnRSZXF1ZXN0VG9rZW4iOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZS0wMDc4YmI4ZTVjOWQ4YWJmN2YxZTRlMTRjODdkOTAyMzIzNWI2MjMwIiwiU2VjcmV0QmluYXJ5IjoiWjI5dlpHSjVaU0IzYjNKc1pBPT0iLCJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "227" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:29 GMT" ], "X-Amzn-Requestid": [ "6068d38b-5583-46ee-bbaa-47ce6b43815a" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXRUSTRiWiIsIk5hbWUiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZSIsIlZlcnNpb25JZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlLTAwNzhiYjhlNWM5ZDhhYmY3ZjFlNGUxNGM4N2Q5MDIzMjM1YjYyMzAiLCJWZXJzaW9uU3RhZ2VzIjpbIkFXU0NVUlJFTlQiXX0=" } }, { "ID": "49602d4f96cc3476", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "296" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:32 GMT" ], "X-Amzn-Requestid": [ "22301a5f-ba15-4f32-b542-d3c1a978ed42" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXRUSTRiWiIsIkNyZWF0ZWREYXRlIjoxLjc3MzkzNDM0ODk5N0U5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJTZWNyZXRCaW5hcnkiOiJaMjl2WkdKNVpTQjNiM0pzWkE9PSIsIlZlcnNpb25JZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlLTAwNzhiYjhlNWM5ZDhhYmY3ZjFlNGUxNGM4N2Q5MDIzMjM1YjYyMzAiLCJWZXJzaW9uU3RhZ2VzIjpbIkFXU0NVUlJFTlQiXX0=" } }, { "ID": "ca446bbe7e6a5f01", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "296" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:32 GMT" ], "X-Amzn-Requestid": [ "aa0ec954-d7dc-496d-a043-34751a023bba" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXRUSTRiWiIsIkNyZWF0ZWREYXRlIjoxLjc3MzkzNDM0ODk5N0U5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJTZWNyZXRCaW5hcnkiOiJaMjl2WkdKNVpTQjNiM0pzWkE9PSIsIlZlcnNpb25JZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlLTAwNzhiYjhlNWM5ZDhhYmY3ZjFlNGUxNGM4N2Q5MDIzMjM1YjYyMzAiLCJWZXJzaW9uU3RhZ2VzIjpbIkFXU0NVUlJFTlQiXX0=" } }, { "ID": "de203f7b48b9f0bb", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "399" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:32 GMT" ], "X-Amzn-Requestid": [ "4913de66-87e6-4c84-ad74-2519783387c2" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXRUSTRiWiIsIkNyZWF0ZWREYXRlIjoxLjc3MzkzNDM0NTQ5N0U5LCJMYXN0QWNjZXNzZWREYXRlIjoxLjc3Mzg3ODRFOSwiTGFzdENoYW5nZWREYXRlIjoxLjc3MzkzNDM0OTAwMUU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJWZXJzaW9uSWRzVG9TdGFnZXMiOnsidGVzdC1jb25maWctdmFyaWFibGUtMDA3OGJiOGU1YzlkOGFiZjdmMWU0ZTE0Yzg3ZDkwMjMyMzViNjIzMCI6WyJBV1NDVVJSRU5UIl0sInRlc3QtY29uZmlnLXZhcmlhYmxlLTJhYWU2YzM1Yzk0ZmNmYjQxNWRiZTk1ZjQwOGI5Y2U5MWVlODQ2ZWQiOlsiQVdTUFJFVklPVVMiXX19" } }, { "ID": "f17fff068220745f", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "69" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DeleteSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJGb3JjZURlbGV0ZVdpdGhvdXRSZWNvdmVyeSI6dHJ1ZSwiU2VjcmV0SWQiOiJ0ZXN0LWNvbmZpZy12YXJpYWJsZSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "152" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:32 GMT" ], "X-Amzn-Requestid": [ "6feb271b-acf3-4d2e-9b19-483f64698730" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXRUSTRiWiIsIkRlbGV0aW9uRGF0ZSI6MS43NzM5MzQzNTIzMjRFOSwiTmFtZSI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" } }, { "ID": "9ac022f809011e93", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "429" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:35 GMT" ], "X-Amzn-Requestid": [ "841b36e7-7ad6-450c-9ba4-d56589812894" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXRUSTRiWiIsIkNyZWF0ZWREYXRlIjoxLjc3MzkzNDM0NTQ5N0U5LCJEZWxldGVkRGF0ZSI6MS43NzM5MzQzNTIzMzNFOSwiTGFzdEFjY2Vzc2VkRGF0ZSI6MS43NzM4Nzg0RTksIkxhc3RDaGFuZ2VkRGF0ZSI6MS43NzM5MzQzNTIzNEU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJWZXJzaW9uSWRzVG9TdGFnZXMiOnsidGVzdC1jb25maWctdmFyaWFibGUtMDA3OGJiOGU1YzlkOGFiZjdmMWU0ZTE0Yzg3ZDkwMjMyMzViNjIzMCI6WyJBV1NDVVJSRU5UIl0sInRlc3QtY29uZmlnLXZhcmlhYmxlLTJhYWU2YzM1Yzk0ZmNmYjQxNWRiZTk1ZjQwOGI5Y2U5MWVlODQ2ZWQiOlsiQVdTUFJFVklPVVMiXX19" } }, { "ID": "9fc4080489636df8", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "429" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:36 GMT" ], "X-Amzn-Requestid": [ "200f0050-5e4e-4781-a4b0-3762f19e017e" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtY29uZmlnLXZhcmlhYmxlLXRUSTRiWiIsIkNyZWF0ZWREYXRlIjoxLjc3MzkzNDM0NTQ5N0U5LCJEZWxldGVkRGF0ZSI6MS43NzM5MzQzNTIzMzNFOSwiTGFzdEFjY2Vzc2VkRGF0ZSI6MS43NzM4Nzg0RTksIkxhc3RDaGFuZ2VkRGF0ZSI6MS43NzM5MzQzNTIzNEU5LCJOYW1lIjoidGVzdC1jb25maWctdmFyaWFibGUiLCJWZXJzaW9uSWRzVG9TdGFnZXMiOnsidGVzdC1jb25maWctdmFyaWFibGUtMDA3OGJiOGU1YzlkOGFiZjdmMWU0ZTE0Yzg3ZDkwMjMyMzViNjIzMCI6WyJBV1NDVVJSRU5UIl0sInRlc3QtY29uZmlnLXZhcmlhYmxlLTJhYWU2YzM1Yzk0ZmNmYjQxNWRiZTk1ZjQwOGI5Y2U5MWVlODQ2ZWQiOlsiQVdTUFJFVklPVVMiXX19" } }, { "ID": "d2d3b118c7045da7", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "35" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtY29uZmlnLXZhcmlhYmxlIn0=" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:37 GMT" ], "X-Amzn-Requestid": [ "cd7d0319-c1de-476b-8db3-c487ba0363aa" ] }, "Body": "eyJfX3R5cGUiOiJSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIiwiTWVzc2FnZSI6IlNlY3JldHMgTWFuYWdlciBjYW4ndCBmaW5kIHRoZSBzcGVjaWZpZWQgc2VjcmV0LiJ9" } } ] } ================================================ FILE: runtimevar/awssecretsmanager/testdata/TestConformance/TestUpdateWithErrors.replay ================================================ { "Initial": "AQAAAA7hTg4mD3KcdwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "bda06799903f3216", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "192" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.CreateSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDbGllbnRSZXF1ZXN0VG9rZW4iOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yLTQ3MmFiZDIyZDc5ZDA2MjAzZWQ3MWI4OTc5OWJlNmMzIiwiTmFtZSI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IiLCJTZWNyZXRCaW5hcnkiOiJXM3NpVG1GdFpTSTZJQ0pHYjI4aUxDQWlWR1Y0ZENJNklDSkNZWElpZlYwPSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "221" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:54 GMT" ], "X-Amzn-Requestid": [ "81ea6c28-dc05-4786-972b-b3fe54794db0" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3ItUzdudkNYIiwiTmFtZSI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IiLCJWZXJzaW9uSWQiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yLTQ3MmFiZDIyZDc5ZDA2MjAzZWQ3MWI4OTc5OWJlNmMzIn0=" } }, { "ID": "17f852a2266f5035", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "46" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "345" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:57 GMT" ], "X-Amzn-Requestid": [ "ed7272c2-1f95-406a-9342-c89b19eb6fc1" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3ItUzdudkNYIiwiQ3JlYXRlZERhdGUiOjEuNzczOTM0Mzc0NjUxRTksIk5hbWUiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yIiwiU2VjcmV0QmluYXJ5IjoiVzNzaVRtRnRaU0k2SUNKR2IyOGlMQ0FpVkdWNGRDSTZJQ0pDWVhJaWZWMD0iLCJWZXJzaW9uSWQiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yLTQ3MmFiZDIyZDc5ZDA2MjAzZWQ3MWI4OTc5OWJlNmMzIiwiVmVyc2lvblN0YWdlcyI6WyJBV1NDVVJSRU5UIl19" } }, { "ID": "9e82fd64c7c11961", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "46" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "345" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:57 GMT" ], "X-Amzn-Requestid": [ "95d6883d-4121-48e1-8a0c-92a81a918993" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3ItUzdudkNYIiwiQ3JlYXRlZERhdGUiOjEuNzczOTM0Mzc0NjUxRTksIk5hbWUiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yIiwiU2VjcmV0QmluYXJ5IjoiVzNzaVRtRnRaU0k2SUNKR2IyOGlMQ0FpVkdWNGRDSTZJQ0pDWVhJaWZWMD0iLCJWZXJzaW9uSWQiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yLTQ3MmFiZDIyZDc5ZDA2MjAzZWQ3MWI4OTc5OWJlNmMzIiwiVmVyc2lvblN0YWdlcyI6WyJBV1NDVVJSRU5UIl19" } }, { "ID": "ce1b0c2d738b2197", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "46" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "344" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:57 GMT" ], "X-Amzn-Requestid": [ "ce90e07b-052a-4fa2-9419-057ff5f8370b" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3ItUzdudkNYIiwiQ3JlYXRlZERhdGUiOjEuNzczOTM0Mzc0NjA4RTksIkxhc3RBY2Nlc3NlZERhdGUiOjEuNzczODc4NEU5LCJMYXN0Q2hhbmdlZERhdGUiOjEuNzczOTM0Mzc0NjU2RTksIk5hbWUiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yIiwiVmVyc2lvbklkc1RvU3RhZ2VzIjp7InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3ItNDcyYWJkMjJkNzlkMDYyMDNlZDcxYjg5Nzk5YmU2YzMiOlsiQVdTQ1VSUkVOVCJdfX0=" } }, { "ID": "09e1df355c7e9d5f", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "168" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.PutSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDbGllbnRSZXF1ZXN0VG9rZW4iOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yLTcwNWQxMTYxMDhjNmJmYzlkMThlMjUyNmQwODlkNmMxIiwiU2VjcmV0QmluYXJ5IjoiYVc1MllXeHBaQzFxYzI5dSIsIlNlY3JldElkIjoidGVzdC11cGRhdGluZy12YXJpYWJsZS10by1lcnJvciJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "252" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:32:58 GMT" ], "X-Amzn-Requestid": [ "8f63dc6c-59cb-41c0-a979-1dca11c14585" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3ItUzdudkNYIiwiTmFtZSI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IiLCJWZXJzaW9uSWQiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yLTcwNWQxMTYxMDhjNmJmYzlkMThlMjUyNmQwODlkNmMxIiwiVmVyc2lvblN0YWdlcyI6WyJBV1NDVVJSRU5UIl19" } }, { "ID": "310d95223beceb61", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "46" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "317" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:33:01 GMT" ], "X-Amzn-Requestid": [ "348f91ae-5ebd-431a-989e-9e8d239428c3" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3ItUzdudkNYIiwiQ3JlYXRlZERhdGUiOjEuNzczOTM0Mzc4MDI0RTksIk5hbWUiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yIiwiU2VjcmV0QmluYXJ5IjoiYVc1MllXeHBaQzFxYzI5dSIsIlZlcnNpb25JZCI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3ItNzA1ZDExNjEwOGM2YmZjOWQxOGUyNTI2ZDA4OWQ2YzEiLCJWZXJzaW9uU3RhZ2VzIjpbIkFXU0NVUlJFTlQiXX0=" } }, { "ID": "5319b0126b1a34d5", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "46" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "317" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:33:01 GMT" ], "X-Amzn-Requestid": [ "b5e0b207-e2b2-438a-8b8e-04a8b4374f9a" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3ItUzdudkNYIiwiQ3JlYXRlZERhdGUiOjEuNzczOTM0Mzc4MDI0RTksIk5hbWUiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yIiwiU2VjcmV0QmluYXJ5IjoiYVc1MllXeHBaQzFxYzI5dSIsIlZlcnNpb25JZCI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3ItNzA1ZDExNjEwOGM2YmZjOWQxOGUyNTI2ZDA4OWQ2YzEiLCJWZXJzaW9uU3RhZ2VzIjpbIkFXU0NVUlJFTlQiXX0=" } }, { "ID": "d8f8db49ac6ae992", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "46" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "427" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:33:01 GMT" ], "X-Amzn-Requestid": [ "c92cc9d2-6ad3-42e0-8010-b1290f0204b6" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3ItUzdudkNYIiwiQ3JlYXRlZERhdGUiOjEuNzczOTM0Mzc0NjA4RTksIkxhc3RBY2Nlc3NlZERhdGUiOjEuNzczODc4NEU5LCJMYXN0Q2hhbmdlZERhdGUiOjEuNzczOTM0Mzc4MDI3RTksIk5hbWUiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yIiwiVmVyc2lvbklkc1RvU3RhZ2VzIjp7InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3ItNDcyYWJkMjJkNzlkMDYyMDNlZDcxYjg5Nzk5YmU2YzMiOlsiQVdTUFJFVklPVVMiXSwidGVzdC11cGRhdGluZy12YXJpYWJsZS10by1lcnJvci03MDVkMTE2MTA4YzZiZmM5ZDE4ZTI1MjZkMDg5ZDZjMSI6WyJBV1NDVVJSRU5UIl19fQ==" } }, { "ID": "030000b3320e856c", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "172" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.PutSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDbGllbnRSZXF1ZXN0VG9rZW4iOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yLTY0NTVhNzI4OWQ4NjY0NGU3OTBiYTU5NjJiNDE2MTEwIiwiU2VjcmV0QmluYXJ5IjoiYVc1MllXeHBaQzFxYzI5dU1nPT0iLCJTZWNyZXRJZCI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "252" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:33:01 GMT" ], "X-Amzn-Requestid": [ "ce72a5b0-82d7-4e22-ac8c-0ea7a14025a1" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3ItUzdudkNYIiwiTmFtZSI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IiLCJWZXJzaW9uSWQiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yLTY0NTVhNzI4OWQ4NjY0NGU3OTBiYTU5NjJiNDE2MTEwIiwiVmVyc2lvblN0YWdlcyI6WyJBV1NDVVJSRU5UIl19" } }, { "ID": "b917eba74d01f9af", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "46" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "321" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:33:04 GMT" ], "X-Amzn-Requestid": [ "293f6b52-59c6-4cfd-8ea0-7acd5e8e57f3" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3ItUzdudkNYIiwiQ3JlYXRlZERhdGUiOjEuNzczOTM0MzgxMzY1RTksIk5hbWUiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yIiwiU2VjcmV0QmluYXJ5IjoiYVc1MllXeHBaQzFxYzI5dU1nPT0iLCJWZXJzaW9uSWQiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yLTY0NTVhNzI4OWQ4NjY0NGU3OTBiYTU5NjJiNDE2MTEwIiwiVmVyc2lvblN0YWdlcyI6WyJBV1NDVVJSRU5UIl19" } }, { "ID": "c0e00f937042f9cc", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "46" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.GetSecretValue" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "321" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:33:04 GMT" ], "X-Amzn-Requestid": [ "c24d95ad-2ea1-4305-bebf-d1c3f27e0436" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3ItUzdudkNYIiwiQ3JlYXRlZERhdGUiOjEuNzczOTM0MzgxMzY1RTksIk5hbWUiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yIiwiU2VjcmV0QmluYXJ5IjoiYVc1MllXeHBaQzFxYzI5dU1nPT0iLCJWZXJzaW9uSWQiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yLTY0NTVhNzI4OWQ4NjY0NGU3OTBiYTU5NjJiNDE2MTEwIiwiVmVyc2lvblN0YWdlcyI6WyJBV1NDVVJSRU5UIl19" } }, { "ID": "1c55521d99f52d36", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "46" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "427" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:33:04 GMT" ], "X-Amzn-Requestid": [ "5874805d-fd08-4f00-8934-6970d5e25423" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3ItUzdudkNYIiwiQ3JlYXRlZERhdGUiOjEuNzczOTM0Mzc0NjA4RTksIkxhc3RBY2Nlc3NlZERhdGUiOjEuNzczODc4NEU5LCJMYXN0Q2hhbmdlZERhdGUiOjEuNzczOTM0MzgxMzY5RTksIk5hbWUiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yIiwiVmVyc2lvbklkc1RvU3RhZ2VzIjp7InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3ItNjQ1NWE3Mjg5ZDg2NjQ0ZTc5MGJhNTk2MmI0MTYxMTAiOlsiQVdTQ1VSUkVOVCJdLCJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yLTcwNWQxMTYxMDhjNmJmYzlkMThlMjUyNmQwODlkNmMxIjpbIkFXU1BSRVZJT1VTIl19fQ==" } }, { "ID": "adf549df46106020", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "80" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DeleteSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJGb3JjZURlbGV0ZVdpdGhvdXRSZWNvdmVyeSI6dHJ1ZSwiU2VjcmV0SWQiOiJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "174" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:33:04 GMT" ], "X-Amzn-Requestid": [ "2ccb90bf-d766-42de-b76a-64b77a27c766" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3ItUzdudkNYIiwiRGVsZXRpb25EYXRlIjoxLjc3MzkzNDM4NDY5MUU5LCJOYW1lIjoidGVzdC11cGRhdGluZy12YXJpYWJsZS10by1lcnJvciJ9" } }, { "ID": "bcb036d7b0acf478", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "46" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "458" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:33:07 GMT" ], "X-Amzn-Requestid": [ "e87fcd08-d869-4840-a7db-6df48e19700a" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3ItUzdudkNYIiwiQ3JlYXRlZERhdGUiOjEuNzczOTM0Mzc0NjA4RTksIkRlbGV0ZWREYXRlIjoxLjc3MzkzNDM4NDY5OUU5LCJMYXN0QWNjZXNzZWREYXRlIjoxLjc3Mzg3ODRFOSwiTGFzdENoYW5nZWREYXRlIjoxLjc3MzkzNDM4NDcwM0U5LCJOYW1lIjoidGVzdC11cGRhdGluZy12YXJpYWJsZS10by1lcnJvciIsIlZlcnNpb25JZHNUb1N0YWdlcyI6eyJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yLTY0NTVhNzI4OWQ4NjY0NGU3OTBiYTU5NjJiNDE2MTEwIjpbIkFXU0NVUlJFTlQiXSwidGVzdC11cGRhdGluZy12YXJpYWJsZS10by1lcnJvci03MDVkMTE2MTA4YzZiZmM5ZDE4ZTI1MjZkMDg5ZDZjMSI6WyJBV1NQUkVWSU9VUyJdfX0=" } }, { "ID": "29bd93a055f6e950", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "46" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "458" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:33:08 GMT" ], "X-Amzn-Requestid": [ "0450ca0a-9a92-45cf-88c6-3b711536a0bd" ] }, "Body": "eyJBUk4iOiJhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6c2VjcmV0OnRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3ItUzdudkNYIiwiQ3JlYXRlZERhdGUiOjEuNzczOTM0Mzc0NjA4RTksIkRlbGV0ZWREYXRlIjoxLjc3MzkzNDM4NDY5OUU5LCJMYXN0QWNjZXNzZWREYXRlIjoxLjc3Mzg3ODRFOSwiTGFzdENoYW5nZWREYXRlIjoxLjc3MzkzNDM4NDcwM0U5LCJOYW1lIjoidGVzdC11cGRhdGluZy12YXJpYWJsZS10by1lcnJvciIsIlZlcnNpb25JZHNUb1N0YWdlcyI6eyJ0ZXN0LXVwZGF0aW5nLXZhcmlhYmxlLXRvLWVycm9yLTY0NTVhNzI4OWQ4NjY0NGU3OTBiYTU5NjJiNDE2MTEwIjpbIkFXU0NVUlJFTlQiXSwidGVzdC11cGRhdGluZy12YXJpYWJsZS10by1lcnJvci03MDVkMTE2MTA4YzZiZmM5ZDE4ZTI1MjZkMDg5ZDZjMSI6WyJBV1NQUkVWSU9VUyJdfX0=" } }, { "ID": "17a156184804c8b1", "Request": { "Method": "POST", "URL": "https://secretsmanager.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "46" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "secretsmanager.DescribeSecret" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJTZWNyZXRJZCI6InRlc3QtdXBkYXRpbmctdmFyaWFibGUtdG8tZXJyb3IifQ==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Content-Length": [ "99" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:33:10 GMT" ], "X-Amzn-Requestid": [ "89a2be67-bd49-44d1-bb1a-dd69ca09c281" ] }, "Body": "eyJfX3R5cGUiOiJSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIiwiTWVzc2FnZSI6IlNlY3JldHMgTWFuYWdlciBjYW4ndCBmaW5kIHRoZSBzcGVjaWZpZWQgc2VjcmV0LiJ9" } } ] } ================================================ FILE: runtimevar/blobvar/blobvar.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package blobvar provides a runtimevar implementation with // variables read from a blob.Bucket. // Use OpenVariable to construct a *runtimevar.Variable. // // # URLs // // For runtimevar.OpenVariable, blobvar registers for the scheme "blob". // The default URL opener will open a blob.Bucket based on the environment // variable "BLOBVAR_BUCKET_URL". // To customize the URL opener, or for more details on the URL format, // see URLOpener. // See https://gocloud.dev/concepts/urls/ for background information. // // # As // // blobvar exposes the following types for As: // - Snapshot: Not supported. // - Error: error, which can be passed to blob.ErrorAs. package blobvar // import "gocloud.dev/runtimevar/blobvar" import ( "bytes" "context" "errors" "fmt" "net/url" "os" "path" "sync" "time" "gocloud.dev/blob" "gocloud.dev/gcerrors" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/driver" ) func init() { runtimevar.DefaultURLMux().RegisterVariable(Scheme, &defaultOpener{}) } type defaultOpener struct { init sync.Once opener *URLOpener err error } func (o *defaultOpener) OpenVariableURL(ctx context.Context, u *url.URL) (*runtimevar.Variable, error) { o.init.Do(func() { bucketURL := os.Getenv("BLOBVAR_BUCKET_URL") if bucketURL == "" { o.err = errors.New("BLOBVAR_BUCKET_URL environment variable is not set") return } bucket, err := blob.OpenBucket(ctx, bucketURL) if err != nil { o.err = fmt.Errorf("failed to open default bucket %q: %v", bucketURL, err) return } o.opener = &URLOpener{Bucket: bucket} }) if o.err != nil { return nil, fmt.Errorf("open variable %v: %v", u, o.err) } return o.opener.OpenVariableURL(ctx, u) } // Scheme is the URL scheme blobvar registers its URLOpener under on runtimevar.DefaultMux. const Scheme = "blob" // URLOpener opens blob-backed URLs like "blob://myblobkey?decoder=string". // It supports the following URL parameters: // - decoder: The decoder to use. Defaults to URLOpener.Decoder, or // runtimevar.BytesDecoder if URLOpener.Decoder is nil. // See runtimevar.DecoderByName for supported values. // - wait: The poll interval, in time.ParseDuration formats. // Defaults to 30s. type URLOpener struct { // Bucket is required. Bucket *blob.Bucket // Decoder specifies the decoder to use if one is not specified in the URL. // Defaults to runtimevar.BytesDecoder. Decoder *runtimevar.Decoder // Options specifies the Options for OpenVariable. Options Options } // OpenVariableURL opens the variable at the URL's path. See the package doc // for more details. func (o *URLOpener) OpenVariableURL(ctx context.Context, u *url.URL) (*runtimevar.Variable, error) { q := u.Query() if o.Bucket == nil { return nil, fmt.Errorf("open variable %v: bucket is required", u) } decoderName := q.Get("decoder") q.Del("decoder") decoder, err := runtimevar.DecoderByName(ctx, decoderName, o.Decoder) if err != nil { return nil, fmt.Errorf("open variable %v: invalid decoder: %v", u, err) } opts := o.Options if s := q.Get("wait"); s != "" { q.Del("wait") d, err := time.ParseDuration(s) if err != nil { return nil, fmt.Errorf("open variable %v: invalid wait %q: %v", u, s, err) } opts.WaitDuration = d } for param := range q { return nil, fmt.Errorf("open variable %v: invalid query parameter %q", u, param) } return OpenVariable(o.Bucket, path.Join(u.Host, u.Path), decoder, &opts) } // Options sets options. type Options struct { // WaitDuration controls the rate at which the blob is polled. // Defaults to 30 seconds. WaitDuration time.Duration } // OpenVariable constructs a *runtimevar.Variable backed by the referenced blob. // Reads of the blob return raw bytes; provide a decoder to decode the raw bytes // into the appropriate type for runtimevar.Snapshot.Value. // See the runtimevar package documentation for examples of decoders. func OpenVariable(bucket *blob.Bucket, key string, decoder *runtimevar.Decoder, opts *Options) (*runtimevar.Variable, error) { return runtimevar.New(newWatcher(bucket, key, decoder, nil, opts)), nil } func newWatcher(bucket *blob.Bucket, key string, decoder *runtimevar.Decoder, opener *URLOpener, opts *Options) driver.Watcher { if opts == nil { opts = &Options{} } return &watcher{ bucket: bucket, opener: opener, key: key, wait: driver.WaitDuration(opts.WaitDuration), decoder: decoder, } } // state implements driver.State. type state struct { val any updateTime time.Time rawBytes []byte err error } // Value implements driver.State.Value. func (s *state) Value() (any, error) { return s.val, s.err } // UpdateTime implements driver.State.UpdateTime. func (s *state) UpdateTime() time.Time { return s.updateTime } // As implements driver.State.As. func (s *state) As(i any) bool { return false } // errorState returns a new State with err, unless prevS also represents // the same error, in which case it returns nil. func errorState(err error, prevS driver.State) driver.State { s := &state{err: err} if prevS == nil { return s } prev := prevS.(*state) if prev.err == nil { // New error. return s } if err == prev.err || err.Error() == prev.err.Error() { // Same error, return nil to indicate no change. return nil } return s } // watcher implements driver.Watcher for configurations provided by the Runtime Configurator // service. type watcher struct { bucket *blob.Bucket opener *URLOpener key string wait time.Duration decoder *runtimevar.Decoder } // WatchVariable implements driver.WatchVariable. func (w *watcher) WatchVariable(ctx context.Context, prev driver.State) (driver.State, time.Duration) { // Read the blob. b, err := w.bucket.ReadAll(ctx, w.key) if err != nil { return errorState(err, prev), w.wait } // See if it's the same raw bytes as before. if prev != nil && bytes.Equal(b, prev.(*state).rawBytes) { // No change! return nil, w.wait } // Decode the value. val, err := w.decoder.Decode(ctx, b) if err != nil { return errorState(err, prev), w.wait } return &state{val: val, updateTime: time.Now(), rawBytes: b}, w.wait } // Close implements driver.Close. func (w *watcher) Close() error { return nil } // ErrorAs implements driver.ErrorAs. // Since blobvar uses the blob package, ErrorAs delegates // to the bucket's ErrorAs method. func (w *watcher) ErrorAs(err error, i any) bool { return w.bucket.ErrorAs(err, i) } // ErrorCode implements driver.ErrorCode. func (*watcher) ErrorCode(err error) gcerrors.ErrorCode { // err might have come from blob, in which case use its code. return gcerrors.Code(err) } ================================================ FILE: runtimevar/blobvar/blobvar_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package blobvar import ( "context" "errors" "net/url" "os" "path/filepath" "strings" "testing" "github.com/google/go-cmp/cmp" "gocloud.dev/blob" "gocloud.dev/blob/fileblob" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/driver" "gocloud.dev/runtimevar/drivertest" ) type harness struct { dir string bucket *blob.Bucket } func newHarness(t *testing.T) (drivertest.Harness, error) { t.Helper() dir := t.TempDir() b, err := fileblob.OpenBucket(dir, nil) if err != nil { return nil, err } return &harness{dir: dir, bucket: b}, nil } func (h *harness) MakeWatcher(ctx context.Context, name string, decoder *runtimevar.Decoder) (driver.Watcher, error) { return newWatcher(h.bucket, name, decoder, nil, nil), nil } func (h *harness) CreateVariable(ctx context.Context, name string, val []byte) error { return h.bucket.WriteAll(ctx, name, val, nil) } func (h *harness) UpdateVariable(ctx context.Context, name string, val []byte) error { return h.bucket.WriteAll(ctx, name, val, nil) } func (h *harness) DeleteVariable(ctx context.Context, name string) error { return h.bucket.Delete(ctx, name) } func (h *harness) Close() { h.bucket.Close() _ = os.RemoveAll(h.dir) } func (h *harness) Mutable() bool { return true } func TestConformance(t *testing.T) { drivertest.RunConformanceTests(t, newHarness, []drivertest.AsTest{verifyAs{}}) } type verifyAs struct{} func (verifyAs) Name() string { return "verify As" } func (verifyAs) SnapshotCheck(s *runtimevar.Snapshot) error { return nil } func (verifyAs) ErrorCheck(v *runtimevar.Variable, err error) error { var perr *os.PathError if !v.ErrorAs(err, &perr) { return errors.New("runtimevar.ErrorAs failed with *os.PathError") } return nil } func TestOpenVariable(t *testing.T) { dir := t.TempDir() if err := os.WriteFile(filepath.Join(dir, "myvar.json"), []byte(`{"Foo": "Bar"}`), 0o666); err != nil { t.Fatal(err) } if err := os.WriteFile(filepath.Join(dir, "myvar.txt"), []byte("hello world!"), 0o666); err != nil { t.Fatal(err) } // Convert dir to a URL path, adding a leading "/" if needed on Windows // (on Unix, dirpath already has a leading "/"). dirpath := filepath.ToSlash(dir) if os.PathSeparator != '/' && !strings.HasPrefix(dirpath, "/") { dirpath = "/" + dirpath } bucketURL := "file://" + dirpath tests := []struct { BucketURL string URL string WantErr bool WantWatchErr bool Want any }{ // myvar does not exist. {"mem://", "blob://myvar", false, true, nil}, // badscheme does not exist. {"badscheme://", "blob://myvar", true, false, nil}, // directory dirnotfound does not exist, so Bucket creation fails. {"file:///dirnotfound", "blob://myvar.txt", true, false, nil}, // filenotfound does not exist so Watch returns an error. {bucketURL, "blob://filenotfound", false, true, nil}, // Missing bucket env variable. {"", "blob://myvar.txt", true, false, nil}, // Invalid decoder. {bucketURL, "blob://myvar.txt?decoder=notadecoder", true, false, nil}, // Invalid arg. {bucketURL, "blob://myvar.txt?param=value", true, false, nil}, // Working example with default decoder. {bucketURL, "blob://myvar.txt", false, false, []byte("hello world!")}, // Working example with string decoder. {bucketURL, "blob://myvar.txt?decoder=string", false, false, "hello world!"}, // Working example with JSON decoder. {bucketURL, "blob://myvar.json?decoder=jsonmap", false, false, &map[string]any{"Foo": "Bar"}}, // Setting wait. {bucketURL, "blob://myvar.txt?wait=2m", false, false, []byte("hello world!")}, // Invalid wait. {bucketURL, "blob://myvar.txt?wait=x", true, false, nil}, } ctx := context.Background() for _, test := range tests { t.Run(test.BucketURL, func(t *testing.T) { t.Setenv("BLOBVAR_BUCKET_URL", test.BucketURL) opener := &defaultOpener{} defer func() { if opener.opener != nil && opener.opener.Bucket != nil { opener.opener.Bucket.Close() } }() u, err := url.Parse(test.URL) if err != nil { t.Error(err) } v, err := opener.OpenVariableURL(ctx, u) if v != nil { defer v.Close() } if (err != nil) != test.WantErr { t.Errorf("BucketURL %s URL %s: got error %v, want error %v", test.BucketURL, test.URL, err, test.WantErr) } if err != nil { return } defer v.Close() snapshot, err := v.Watch(ctx) if (err != nil) != test.WantWatchErr { t.Errorf("BucketURL %s URL %s: got Watch error %v, want error %v", test.BucketURL, test.URL, err, test.WantWatchErr) } if err != nil { return } if !cmp.Equal(snapshot.Value, test.Want) { t.Errorf("BucketURL %s URL %s: got snapshot value\n%v\n want\n%v", test.BucketURL, test.URL, snapshot.Value, test.Want) } }) } } ================================================ FILE: runtimevar/blobvar/example_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package blobvar_test import ( "context" "fmt" "log" "gocloud.dev/blob/memblob" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/blobvar" ) func ExampleOpenVariable() { // Create a *blob.Bucket. // Here, we use an in-memory implementation and write a sample value. bucket := memblob.OpenBucket(nil) defer bucket.Close() ctx := context.Background() err := bucket.WriteAll(ctx, "cfg-variable-name", []byte("hello world"), nil) if err != nil { log.Fatal(err) } // Construct a *runtimevar.Variable that watches the blob. v, err := blobvar.OpenVariable(bucket, "cfg-variable-name", runtimevar.StringDecoder, nil) if err != nil { log.Fatal(err) } defer v.Close() // We can now read the current value of the variable from v. snapshot, err := v.Latest(ctx) if err != nil { log.Fatal(err) } // runtimevar.Snapshot.Value is decoded to a string. fmt.Println(snapshot.Value.(string)) // Output: // hello world } func Example_openVariableFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/runtimevar/blobvar" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // runtimevar.OpenVariable creates a *runtimevar.Variable from a URL. // The default opener opens a blob.Bucket via a URL, based on the environment // variable BLOBVAR_BUCKET_URL. v, err := runtimevar.OpenVariable(ctx, "blob://myvar.txt?decoder=string") if err != nil { log.Fatal(err) } defer v.Close() } ================================================ FILE: runtimevar/constantvar/constantvar.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package constantvar provides a runtimevar implementation with Variables // that never change. Use New, NewBytes, NewFromEnv, or NewError to construct a // *runtimevar.Variable. // // # URLs // // For runtimevar.OpenVariable, constantvar registers for the scheme "constant". // For more details on the URL format, see URLOpener. // See https://gocloud.dev/concepts/urls/ for background information. // // # As // // constantvar does not support any types for As. package constantvar // import "gocloud.dev/runtimevar/constantvar" import ( "context" "errors" "fmt" "net/url" "os" "time" "gocloud.dev/gcerrors" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/driver" ) func init() { runtimevar.DefaultURLMux().RegisterVariable(Scheme, &URLOpener{}) } // Scheme is the URL scheme constantvar registers its URLOpener under on blob.DefaultMux. const Scheme = "constant" // URLOpener opens constantvar URLs like "constant://?val=foo&decoder=string". // // The host and path are ignored. // // The following URL parameters are supported: // - val: The value to use for the constant Variable. The bytes from val // are passed to NewBytes. // - envvar: The name of an environment variable to read the value from. // - err: The error to use for the constant Variable. A new error is created // using errors.New and passed to NewError. // - decoder: The decoder to use. Defaults to runtimevar.BytesDecoder. // See runtimevar.DecoderByName for supported values. // // If multiple of "val", "envvar", or "err" are provided, "err" wins, then "envvar", // then "val". type URLOpener struct { // Decoder specifies the decoder to use if one is not specified in the URL. // Defaults to runtimevar.BytesDecoder. Decoder *runtimevar.Decoder } // OpenVariableURL opens the variable at the URL's path. See the package doc // for more details. func (o *URLOpener) OpenVariableURL(ctx context.Context, u *url.URL) (*runtimevar.Variable, error) { q := u.Query() val := q.Get("val") q.Del("val") envvar := q.Get("envvar") q.Del("envvar") errVal := q.Get("err") q.Del("err") decoderName := q.Get("decoder") q.Del("decoder") decoder, err := runtimevar.DecoderByName(ctx, decoderName, o.Decoder) if err != nil { return nil, fmt.Errorf("open variable %v: invalid decoder: %v", u, err) } for param := range q { return nil, fmt.Errorf("open variable %v: invalid query parameter %q", u, param) } if errVal != "" { return NewError(errors.New(errVal)), nil } if envvar != "" { return NewFromEnv(envvar, decoder), nil } return NewBytes([]byte(val), decoder), nil } var errNotExist = errors.New("variable does not exist") // New constructs a *runtimevar.Variable holding value. func New(value any) *runtimevar.Variable { return runtimevar.New(&watcher{value: value, t: time.Now()}) } // NewBytes uses decoder to decode b. If the decode succeeds, it constructs // a *runtimevar.Variable holding the decoded value. If the decode fails, it // constructs a runtimevar.Variable that always fails with the error. func NewBytes(b []byte, decoder *runtimevar.Decoder) *runtimevar.Variable { value, err := decoder.Decode(context.Background(), b) if err != nil { return NewError(err) } return New(value) } // NewFromEnv reads an environment variable and uses decoder to decode it. // If the decode succeeds, it constructs a *runtimevar.Variable holding the // decoded value. If the decode fails, it constructs a runtimevar.Variable // that always fails with the error. // Note that the value of the constantvar is frozen at initialization time; // it does not get a new value if the underlying environment variable value // changes. func NewFromEnv(envVarName string, decoder *runtimevar.Decoder) *runtimevar.Variable { val := os.Getenv(envVarName) value, err := decoder.Decode(context.Background(), []byte(val)) if err != nil { return NewError(err) } return New(value) } // NewError constructs a *runtimevar.Variable that always fails. Runtimevar // wraps errors returned by drivers, so the error returned // by runtimevar will not equal err. func NewError(err error) *runtimevar.Variable { return runtimevar.New(&watcher{err: err}) } // watcher implements driver.Watcher and driver.State. type watcher struct { value any err error t time.Time } // Value implements driver.State.Value. func (w *watcher) Value() (any, error) { return w.value, w.err } // UpdateTime implements driver.State.UpdateTime. func (w *watcher) UpdateTime() time.Time { return w.t } // As implements driver.State.As. func (w *watcher) As(i any) bool { return false } // WatchVariable implements driver.WatchVariable. func (w *watcher) WatchVariable(ctx context.Context, prev driver.State) (driver.State, time.Duration) { // The first time this is called, return the constant value. if prev == nil { return w, 0 } // On subsequent calls, block forever as the value will never change. <-ctx.Done() w.err = ctx.Err() return w, 0 } // Close implements driver.Close. func (*watcher) Close() error { return nil } // ErrorAs implements driver.ErrorAs. func (*watcher) ErrorAs(err error, i any) bool { return false } // ErrorCode implements driver.ErrorCode func (*watcher) ErrorCode(err error) gcerrors.ErrorCode { if err == errNotExist { return gcerrors.NotFound } return gcerrors.Unknown } ================================================ FILE: runtimevar/constantvar/constantvar_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package constantvar import ( "context" "errors" "testing" "time" "github.com/google/go-cmp/cmp" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/driver" "gocloud.dev/runtimevar/drivertest" ) type harness struct { // vars stores the variable value(s) that have been set using CreateVariable. vars map[string][]byte } func newHarness(t *testing.T) (drivertest.Harness, error) { t.Helper() return &harness{vars: map[string][]byte{}}, nil } func (h *harness) MakeWatcher(ctx context.Context, name string, decoder *runtimevar.Decoder) (driver.Watcher, error) { rawVal, found := h.vars[name] if !found { // The variable isn't set. Create a Variable that always returns an error. return &watcher{err: errNotExist}, nil } val, err := decoder.Decode(ctx, rawVal) if err != nil { // The variable didn't decode. return &watcher{err: err}, nil } return &watcher{value: val, t: time.Now()}, nil } func (h *harness) CreateVariable(ctx context.Context, name string, val []byte) error { h.vars[name] = val return nil } func (h *harness) UpdateVariable(ctx context.Context, name string, val []byte) error { return errors.New("not supported") } func (h *harness) DeleteVariable(ctx context.Context, name string) error { return errors.New("not supported") } func (h *harness) Close() {} func (h *harness) Mutable() bool { return false } func TestConformance(t *testing.T) { drivertest.RunConformanceTests(t, newHarness, []drivertest.AsTest{verifyAs{}}) } type verifyAs struct{} func (verifyAs) Name() string { return "verify As" } func (verifyAs) SnapshotCheck(s *runtimevar.Snapshot) error { var ss string if s.As(&ss) { return errors.New("Snapshot.As expected to fail") } return nil } func (verifyAs) ErrorCheck(v *runtimevar.Variable, err error) error { var ss string if v.ErrorAs(err, &ss) { return errors.New("runtimevar.ErrorAs expected to fail") } return nil } func TestNew(t *testing.T) { ctx := context.Background() // Use New with an error value; it should be plumbed through as a Value. errFail := errors.New("fail") v := New(errFail) defer v.Close() val, err := v.Watch(ctx) if err != nil { t.Fatal(err) } if val.Value != errFail { t.Errorf("got %v want %v", val.Value, errFail) } } func TestNewBytes(t *testing.T) { ctx := context.Background() content := "hello world" // Decode succeeds. v := NewBytes([]byte(content), runtimevar.StringDecoder) defer v.Close() val, err := v.Watch(ctx) if err != nil { t.Fatal(err) } if val.Value != content { t.Errorf("got %v want %v", val.Value, content) } // Decode fails. var jsonData []string v = NewBytes([]byte(content), runtimevar.NewDecoder(jsonData, runtimevar.JSONDecode)) defer v.Close() val, err = v.Watch(ctx) if err == nil { t.Errorf("got nil error and %v, want error", val) } } func TestNewFromEnv(t *testing.T) { ctx := context.Background() const ( content = "hello world" name = "RUNTIMEVAR_CONST_TEST" ) t.Setenv(name, content) // Decode succeeds. v := NewFromEnv(name, runtimevar.StringDecoder) defer v.Close() val, err := v.Watch(ctx) if err != nil { t.Fatal(err) } if val.Value != content { t.Errorf("got %v want %v", val.Value, content) } // Decode fails. var jsonData []string v = NewFromEnv(name, runtimevar.NewDecoder(jsonData, runtimevar.JSONDecode)) defer v.Close() val, err = v.Watch(ctx) if err == nil { t.Errorf("got nil error and %v, want error", val) } } func TestNewError(t *testing.T) { ctx := context.Background() v := NewError(errors.New("fail")) defer v.Close() _, err := v.Watch(ctx) if err == nil { t.Errorf("got nil err want fail err") } } func TestOpenVariable(t *testing.T) { t.Setenv("RUNTIMEVAR_CONST_TEST", "hello world") tests := []struct { URL string WantErr bool WantWatchErr bool Want any }{ // Empty URL results in empty byte slice. {"constant://", false, false, []byte("")}, // Invalid query param. {"constant://?param=value", true, false, nil}, // String value. {"constant://?val=hello+world&decoder=string", false, false, "hello world"}, // JSON value; val parameter is {"Foo": "Bar"}, URL-encoded. {"constant://?val=%7B%22Foo%22%3A%22Bar%22%7d&decoder=jsonmap", false, false, &map[string]any{"Foo": "Bar"}}, // Environment variable value. {"constant://?envvar=RUNTIMEVAR_CONST_TEST&decoder=string", false, false, "hello world"}, // Error. {"constant://?err=fail", false, true, nil}, // Invalid decoder. {"constant://?decoder=notadecoder", true, false, nil}, } ctx := context.Background() for _, test := range tests { t.Run(test.URL, func(t *testing.T) { v, err := runtimevar.OpenVariable(ctx, test.URL) if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } if err != nil { return } defer v.Close() snapshot, err := v.Watch(ctx) if (err != nil) != test.WantWatchErr { t.Errorf("%s: got Watch error %v, want error %v", test.URL, err, test.WantWatchErr) } if err != nil { return } if !cmp.Equal(snapshot.Value, test.Want) { t.Errorf("%s: got snapshot value\n%v\n want\n%v", test.URL, snapshot.Value, test.Want) } }) } } func TestDecryptWithNoURLEnv(t *testing.T) { if _, err := runtimevar.OpenVariable(context.Background(), "constant://?decoder=decrypt"); err == nil { t.Error("got nil error, want environment variable not set") } } ================================================ FILE: runtimevar/constantvar/example_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package constantvar_test import ( "context" "errors" "fmt" "log" "os" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/constantvar" ) func ExampleNew() { // Construct a *runtimevar.Variable that always returns "hello world". v := constantvar.New("hello world") defer v.Close() // We can now read the current value of the variable from v. snapshot, err := v.Latest(context.Background()) if err != nil { log.Fatal(err) } fmt.Println(snapshot.Value.(string)) // Output: // hello world } func ExampleNewBytes() { // Construct a *runtimevar.Variable with a []byte. v := constantvar.NewBytes([]byte(`hello world`), runtimevar.BytesDecoder) defer v.Close() // We can now read the current value of the variable from v. snapshot, err := v.Latest(context.Background()) if err != nil { log.Fatal(err) } fmt.Printf("byte slice of length %d\n", len(snapshot.Value.([]byte))) // Output: // byte slice of length 11 } func ExampleNewFromEnv() { // Construct a *runtimevar.Variable with an environment variable name. os.Setenv("MY_ENVIRONMENT_VARIABLE", "hello world") v := constantvar.NewFromEnv("MY_ENVIRONMENT_VARIABLE", runtimevar.BytesDecoder) defer v.Close() // We can now read the value from v. snapshot, err := v.Latest(context.Background()) if err != nil { log.Fatal(err) } fmt.Printf("byte slice of length %d\n", len(snapshot.Value.([]byte))) // Output: // byte slice of length 11 } func ExampleNewError() { // Construct a runtimevar.Variable that always returns errFake. errFake := errors.New("my error") v := constantvar.NewError(errFake) defer v.Close() // We can now use Watch to read the current value of the variable // from v. Note that Latest would block here since it waits for // a "good" value, and v will never get one. _, err := v.Watch(context.Background()) if err == nil { log.Fatal("Expected an error!") } fmt.Println(err) // Output: // runtimevar (code=Unknown): my error } func Example_openVariableFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/runtimevar/constantvar" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // runtimevar.OpenVariable creates a *runtimevar.Variable from a URL. // The constant value is in the URL param "val". v, err := runtimevar.OpenVariable(ctx, "constant://?val=hello+world&decoder=string") if err != nil { log.Fatal(err) } defer v.Close() // The constant value is read from an environment variable specified in "envvar". v2, err := runtimevar.OpenVariable(ctx, "constant://?envvar=MY_ENVIRONMENT_VARIABLE&decoder=string") if err != nil { log.Fatal(err) } defer v2.Close() // PRAGMA: On gocloud.dev, hide the rest of the function. snapshot, err := v.Latest(ctx) if err != nil { log.Fatal(err) } fmt.Println(snapshot.Value.(string)) // Output // hello world } ================================================ FILE: runtimevar/driver/driver.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package driver defines interfaces to be implemented by runtimevar drivers, which // will be used by the runtimevar package to interact with the underlying services. // Application code should use package runtimevar. package driver // import "gocloud.dev/runtimevar/driver" import ( "context" "time" "gocloud.dev/gcerrors" ) // DefaultWaitDuration is the default value for WaitDuration. const DefaultWaitDuration = 30 * time.Second // WaitDuration returns DefaultWaitDuration if d is <= 0, otherwise it returns d. func WaitDuration(d time.Duration) time.Duration { if d <= 0 { return DefaultWaitDuration } return d } // State represents the current state of a variable. type State interface { // Value returns the current variable value. Value() (any, error) // UpdateTime returns the update time for the variable. UpdateTime() time.Time // As converts i to driver-specific types. // See https://gocloud.dev/concepts/as/ for background information. As(any) bool } // Watcher watches for updates on a variable and returns an updated Variable object if // there are changes. A Watcher object is associated with a variable upon construction. // // An application can have more than one Watcher, one for each variable. It is typical // to only have one Watcher per variable. // // Many services store their configuration data as raw bytes; drivers for such // services should include a runtimevar.Decoder in their constructor to allow // users to decode the raw bytes into a particular format (e.g., parsing a // JSON string). // // Drivers for services that don't have raw bytes may dictate the type of the exposed // Snapshot.Value, or expose custom decoding logic. type Watcher interface { // WatchVariable returns the current State of the variable. // If the State has not changed, it returns nil. // // If WatchVariable returns a wait time > 0, the portable type uses // it as a hint to not call WatchVariable again for the wait time. // // Implementations *may* block, but must return if ctx is Done. If the // variable has changed, then implementations *must* eventually return // it. // // A polling implementation should return (State, ) for // a new State, or (nil, ) if State hasn't changed. // // An implementation that receives notifications from an external source // about changes to the underlying variable should: // 1. If prev != nil, subscribe to change notifications. // 2. Fetch the current State. // 3. If prev == nil or if the State has changed, return (State, 0). // A non-zero wait should be returned if State holds an error, to avoid // spinning. // 4. Block until it detects a change or ctx is Done, then fetch and return // (State, 0). // Note that the subscription in 1 must occur before 2 to avoid race conditions. WatchVariable(ctx context.Context, prev State) (state State, wait time.Duration) // Close cleans up any resources used by the Watcher object. Close() error // ErrorAs allows drivers to expose driver-specific types for returned // errors; see State.As for more details. ErrorAs(error, any) bool // ErrorCode should return a code that describes the error, which was returned by // one of the other methods in this interface. ErrorCode(error) gcerrors.ErrorCode } ================================================ FILE: runtimevar/drivertest/drivertest.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package drivertest provides a conformance test for implementations of // runtimevar. package drivertest // import "gocloud.dev/runtimevar/drivertest" import ( "context" "errors" "testing" "time" "github.com/google/go-cmp/cmp" "gocloud.dev/gcerrors" "gocloud.dev/internal/testing/setup" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/driver" ) // Harness describes the functionality test harnesses must provide to run conformance tests. type Harness interface { // MakeWatcher creates a driver.Watcher to watch the given variable. MakeWatcher(ctx context.Context, name string, decoder *runtimevar.Decoder) (driver.Watcher, error) // CreateVariable creates the variable with the given contents. CreateVariable(ctx context.Context, name string, val []byte) error // UpdateVariable updates an existing variable to have the given contents. UpdateVariable(ctx context.Context, name string, val []byte) error // DeleteVariable deletes an existing variable. DeleteVariable(ctx context.Context, name string) error // Close is called when the test is complete. Close() // Mutable returns true iff the driver supports UpdateVariable/DeleteVariable. // If false, those functions should return errors, and the conformance tests // will skip and/or ignore errors for tests that require them. Mutable() bool } // HarnessMaker describes functions that construct a harness for running tests. // It is called exactly once per test; Harness.Close() will be called when the test is complete. type HarnessMaker func(t *testing.T) (Harness, error) // AsTest represents a test of As functionality. // The conformance test: // 1. Reads a Snapshot of the variable before it exists. // 2. Calls ErrorCheck. // 3. Creates the variable and reads a Snapshot of it. // 4. Calls SnapshotCheck. type AsTest interface { // Name should return a descriptive name for the test. Name() string // SnapshotCheck will be called to allow verification of Snapshot.As. SnapshotCheck(s *runtimevar.Snapshot) error // ErrorCheck will be called to allow verification of Variable.ErrorAs. // driver is provided so that errors other than err can be checked; // Variable.ErrorAs won't work since it expects driver errors to be wrapped. ErrorCheck(v *runtimevar.Variable, err error) error } type verifyAsFailsOnNil struct{} func (verifyAsFailsOnNil) Name() string { return "verify As returns false when passed nil" } func (verifyAsFailsOnNil) SnapshotCheck(v *runtimevar.Snapshot) error { if v.As(nil) { return errors.New("want Snapshot.As to return false when passed nil") } return nil } func (verifyAsFailsOnNil) ErrorCheck(v *runtimevar.Variable, err error) (ret error) { defer func() { if recover() == nil { ret = errors.New("want ErrorAs to panic when passed nil") } }() v.ErrorAs(err, nil) return nil } // RunConformanceTests runs conformance tests for driver implementations // of runtimevar. func RunConformanceTests(t *testing.T, newHarness HarnessMaker, asTests []AsTest) { t.Helper() t.Run("TestNonExistentVariable", func(t *testing.T) { testNonExistentVariable(t, newHarness) }) t.Run("TestString", func(t *testing.T) { testString(t, newHarness) }) t.Run("TestJSON", func(t *testing.T) { testJSON(t, newHarness) }) t.Run("TestInvalidJSON", func(t *testing.T) { testInvalidJSON(t, newHarness) }) t.Run("TestUpdate", func(t *testing.T) { testUpdate(t, newHarness) }) t.Run("TestDelete", func(t *testing.T) { testDelete(t, newHarness) }) t.Run("TestUpdateWithErrors", func(t *testing.T) { testUpdateWithErrors(t, newHarness) }) asTests = append(asTests, verifyAsFailsOnNil{}) t.Run("TestAs", func(t *testing.T) { for _, st := range asTests { if st.Name() == "" { t.Fatalf("AsTest.Name is required") } t.Run(st.Name(), func(t *testing.T) { testAs(t, newHarness, st) }) } }) } // waitTimeForBlockingCheck returns a duration to wait when verifying that a // call blocks. When in replay mode, it can be quite short to make tests run // quickly. When in record mode, it has to be long enough that RPCs can // consistently finish. func waitTimeForBlockingCheck() time.Duration { if *setup.Record { return 5 * time.Second } return 10 * time.Millisecond } func testNonExistentVariable(t *testing.T, newHarness HarnessMaker) { t.Helper() h, err := newHarness(t) if err != nil { t.Fatal(err) } defer h.Close() ctx := context.Background() drv, err := h.MakeWatcher(ctx, "does-not-exist", runtimevar.StringDecoder) if err != nil { t.Fatal(err) } v := runtimevar.New(drv) defer func() { if err := v.Close(); err != nil { t.Error(err) } }() got, err := v.Watch(ctx) if err == nil { t.Errorf("got %v expected not-found error", got.Value) } else if gcerrors.Code(err) != gcerrors.NotFound { t.Error("got IsNotExist false, expected true") } } func testString(t *testing.T, newHarness HarnessMaker) { t.Helper() const ( name = "test-config-variable" content = "hello world" ) h, err := newHarness(t) if err != nil { t.Fatal(err) } defer h.Close() ctx := context.Background() if err := h.CreateVariable(ctx, name, []byte(content)); err != nil { t.Fatal(err) } if h.Mutable() { defer func() { if err := h.DeleteVariable(ctx, name); err != nil { t.Fatal(err) } }() } drv, err := h.MakeWatcher(ctx, name, runtimevar.StringDecoder) if err != nil { t.Fatal(err) } v := runtimevar.New(drv) defer func() { if err := v.Close(); err != nil { t.Error(err) } }() got, err := v.Watch(ctx) if err != nil { t.Fatal(err) } // The variable is decoded to a string and matches the expected content. if gotS, ok := got.Value.(string); !ok { t.Fatalf("got value of type %T expected string", got.Value) } else if gotS != content { t.Errorf("got %q want %q", got.Value, content) } // A second watch should block forever since the value hasn't changed. // A short wait here doesn't guarantee that this is working, but will catch // most problems. tCtx, cancel := context.WithTimeout(ctx, waitTimeForBlockingCheck()) defer cancel() got, err = v.Watch(tCtx) if err == nil { t.Errorf("got %v want error", got) } // tCtx should be cancelled. However, tests using record/replay mode can // be in the middle of an RPC when that happens, and save the resulting // RPC error during record. During replay, that error can be returned // immediately (before tCtx is cancelled). So, we accept deadline exceeded // errors as well. if tCtx.Err() == nil && gcerrors.Code(err) != gcerrors.DeadlineExceeded { t.Errorf("got err %v/%v; want Watch to have blocked until context was Done, or for the error to be deadline exceeded", err, gcerrors.Code(err)) } } // Message is used as a target for JSON decoding. type Message struct { Name, Text string } func testJSON(t *testing.T, newHarness HarnessMaker) { t.Helper() const ( name = "test-config-variable" jsonContent = `[ {"Name": "Ed", "Text": "Knock knock."}, {"Name": "Sam", "Text": "Who's there?"} ]` ) want := []*Message{{Name: "Ed", Text: "Knock knock."}, {Name: "Sam", Text: "Who's there?"}} h, err := newHarness(t) if err != nil { t.Fatal(err) } defer h.Close() ctx := context.Background() if err := h.CreateVariable(ctx, name, []byte(jsonContent)); err != nil { t.Fatal(err) } if h.Mutable() { defer func() { if err := h.DeleteVariable(ctx, name); err != nil { t.Fatal(err) } }() } var jsonData []*Message drv, err := h.MakeWatcher(ctx, name, runtimevar.NewDecoder(jsonData, runtimevar.JSONDecode)) if err != nil { t.Fatal(err) } v := runtimevar.New(drv) defer func() { if err := v.Close(); err != nil { t.Error(err) } }() got, err := v.Watch(ctx) if err != nil { t.Fatal(err) } // The variable is decoded to a []*Message and matches the expected content. if gotSlice, ok := got.Value.([]*Message); !ok { t.Fatalf("got value of type %T expected []*Message", got.Value) } else if !cmp.Equal(gotSlice, want) { t.Errorf("got %v want %v", gotSlice, want) } } func testInvalidJSON(t *testing.T, newHarness HarnessMaker) { t.Helper() const ( name = "test-config-variable" content = "not-json" ) h, err := newHarness(t) if err != nil { t.Fatal(err) } defer h.Close() ctx := context.Background() if err := h.CreateVariable(ctx, name, []byte(content)); err != nil { t.Fatal(err) } if h.Mutable() { defer func() { if err := h.DeleteVariable(ctx, name); err != nil { t.Fatal(err) } }() } var jsonData []*Message drv, err := h.MakeWatcher(ctx, name, runtimevar.NewDecoder(jsonData, runtimevar.JSONDecode)) if err != nil { t.Fatal(err) } v := runtimevar.New(drv) defer func() { if err := v.Close(); err != nil { t.Error(err) } }() got, err := v.Watch(ctx) if err == nil { t.Errorf("got %v wanted invalid-json error", got.Value) } } func testUpdate(t *testing.T, newHarness HarnessMaker) { t.Helper() const ( name = "test-config-variable" content1 = "hello world" content2 = "goodbye world" ) h, err := newHarness(t) if err != nil { t.Fatal(err) } defer h.Close() if !h.Mutable() { return } ctx := context.Background() // Create the variable and verify WatchVariable sees the value. if err := h.CreateVariable(ctx, name, []byte(content1)); err != nil { t.Fatal(err) } defer func() { if err := h.DeleteVariable(ctx, name); err != nil { t.Fatal(err) } }() drv, err := h.MakeWatcher(ctx, name, runtimevar.StringDecoder) if err != nil { t.Fatal(err) } defer func() { if err := drv.Close(); err != nil { t.Error(err) } }() state, _ := drv.WatchVariable(ctx, nil) if state == nil { t.Fatalf("got nil state, want a non-nil state with a value") } got, err := state.Value() if err != nil { t.Fatal(err) } if gotS, ok := got.(string); !ok { t.Fatalf("got value of type %T expected string", got) } else if gotS != content1 { t.Errorf("got %q want %q", got, content1) } // The variable hasn't changed, so drv.WatchVariable should either // return nil or block. cancelCtx, cancel := context.WithTimeout(ctx, waitTimeForBlockingCheck()) defer cancel() unchangedState, _ := drv.WatchVariable(cancelCtx, state) if unchangedState == nil { // OK } else { got, err = unchangedState.Value() if gcerrors.Code(err) != gcerrors.DeadlineExceeded { t.Fatalf("got state %v/%v/%v, wanted nil or nil/DeadlineExceeded after no change", got, err, gcerrors.Code(err)) } } // Update the variable and verify WatchVariable sees the updated value. if err := h.UpdateVariable(ctx, name, []byte(content2)); err != nil { t.Fatal(err) } state, _ = drv.WatchVariable(ctx, state) // In rare race conditions during replay, if the earlier WatchVariable // was cancelled/timed out before actually calling an RPC, this one // might have returned the old/unchanged value. This only happens during // replay mode. Just try again, the next RPC should get the updated value. // BTW this is easy to reproduce by setting the timeout in // waitForBlockingCheck to 1 nanosecond. if state == nil && !*setup.Record { state, _ = drv.WatchVariable(ctx, state) } if state == nil { t.Fatalf("got nil state, want a non-nil state with a value") } got, err = state.Value() if err != nil { t.Fatal(err) } if gotS, ok := got.(string); !ok { t.Fatalf("got value of type %T expected string", got) } else if gotS != content2 { t.Errorf("got %q want %q", got, content2) } } func testDelete(t *testing.T, newHarness HarnessMaker) { t.Helper() const ( name = "test-config-variable" content1 = "hello world" content2 = "goodbye world" ) h, err := newHarness(t) if err != nil { t.Fatal(err) } defer h.Close() if !h.Mutable() { return } ctx := context.Background() // Create the variable and verify WatchVariable sees the value. if err := h.CreateVariable(ctx, name, []byte(content1)); err != nil { t.Fatal(err) } needToDelete := true defer func() { if needToDelete { if err := h.DeleteVariable(ctx, name); err != nil { t.Fatal(err) } } }() drv, err := h.MakeWatcher(ctx, name, runtimevar.StringDecoder) if err != nil { t.Fatal(err) } defer func() { if err := drv.Close(); err != nil { t.Error(err) } }() state, _ := drv.WatchVariable(ctx, nil) if state == nil { t.Fatalf("got nil state, want a non-nil state with a value") } got, err := state.Value() if err != nil { t.Fatal(err) } if gotS, ok := got.(string); !ok { t.Fatalf("got value of type %T expected string", got) } else if gotS != content1 { t.Errorf("got %q want %q", got, content1) } prev := state // Delete the variable. if err := h.DeleteVariable(ctx, name); err != nil { t.Fatal(err) } needToDelete = false // WatchVariable should return a state with an error now. state, _ = drv.WatchVariable(ctx, state) if state == nil { t.Fatalf("got nil state, want a non-nil state with an error") } got, err = state.Value() if err == nil { t.Fatalf("got %v want error because variable is deleted", got) } // Reset the variable with new content and verify via WatchVariable. if err := h.CreateVariable(ctx, name, []byte(content2)); err != nil { t.Fatal(err) } needToDelete = true state, _ = drv.WatchVariable(ctx, state) if state == nil { t.Fatalf("got nil state, want a non-nil state with a value") } got, err = state.Value() if err != nil { t.Fatal(err) } if gotS, ok := got.(string); !ok { t.Fatalf("got value of type %T expected string", got) } else if gotS != content2 { t.Errorf("got %q want %q", got, content2) } if state.UpdateTime().Before(prev.UpdateTime()) { t.Errorf("got UpdateTime %v < previous %v, want >=", state.UpdateTime(), prev.UpdateTime()) } } func testUpdateWithErrors(t *testing.T, newHarness HarnessMaker) { t.Helper() const ( name = "test-updating-variable-to-error" content1 = `[{"Name": "Foo", "Text": "Bar"}]` content2 = "invalid-json" content3 = "invalid-json2" ) want := []*Message{{Name: "Foo", Text: "Bar"}} h, err := newHarness(t) if err != nil { t.Fatal(err) } defer h.Close() if !h.Mutable() { return } ctx := context.Background() // Create the variable and verify WatchVariable sees the value. if err := h.CreateVariable(ctx, name, []byte(content1)); err != nil { t.Fatal(err) } defer func() { if err := h.DeleteVariable(ctx, name); err != nil { t.Fatal(err) } }() var jsonData []*Message drv, err := h.MakeWatcher(ctx, name, runtimevar.NewDecoder(jsonData, runtimevar.JSONDecode)) if err != nil { t.Fatal(err) } defer func() { if err := drv.Close(); err != nil { t.Error(err) } }() state, _ := drv.WatchVariable(ctx, nil) if state == nil { t.Fatal("got nil state, want a non-nil state with a value") } got, err := state.Value() if err != nil { t.Fatal(err) } if gotSlice, ok := got.([]*Message); !ok { t.Fatalf("got value of type %T expected []*Message", got) } else if !cmp.Equal(gotSlice, want) { t.Errorf("got %v want %v", gotSlice, want) } // Update the variable to invalid JSON and verify WatchVariable returns an error. if err := h.UpdateVariable(ctx, name, []byte(content2)); err != nil { t.Fatal(err) } state, _ = drv.WatchVariable(ctx, state) if state == nil { t.Fatal("got nil state, want a non-nil state with an error") } _, err = state.Value() if err == nil { t.Fatal("got nil err want invalid JSON error") } // Update the variable again, with different invalid JSON. // WatchVariable should block or return nil since it's the same error as before. if err := h.UpdateVariable(ctx, name, []byte(content3)); err != nil { t.Fatal(err) } tCtx, cancel := context.WithTimeout(ctx, waitTimeForBlockingCheck()) defer cancel() state, _ = drv.WatchVariable(tCtx, state) if state == nil { // OK: nil indicates no change. } else { // WatchVariable should have blocked until tCtx was cancelled, and we // should have gotten that error back. got, err := state.Value() if err == nil { t.Fatalf("got %v and nil error, want non-nil error", got) } // tCtx should be cancelled. However, tests using record/replay mode can // be in the middle of an RPC when that happens, and save the resulting // RPC error during record. During replay, that error can be returned // immediately (before tCtx is cancelled). So, we accept deadline exceeded // errors as well. if tCtx.Err() == nil && gcerrors.Code(err) != gcerrors.DeadlineExceeded { t.Errorf("got err %v/%v; want Watch to have blocked until context was Done, or for the error to be deadline exceeded", err, gcerrors.Code(err)) } } } // testAs tests the various As functions, using AsTest. func testAs(t *testing.T, newHarness HarnessMaker, st AsTest) { t.Helper() const ( name = "variable-for-as" content = "hello world" ) h, err := newHarness(t) if err != nil { t.Fatal(err) } defer h.Close() ctx := context.Background() // Try to read the variable before it exists. drv, err := h.MakeWatcher(ctx, name, runtimevar.StringDecoder) if err != nil { t.Fatal(err) } v := runtimevar.New(drv) s, gotErr := v.Watch(ctx) if gotErr == nil { t.Fatalf("got nil error and %v, expected non-nil error", v) } if err := st.ErrorCheck(v, gotErr); err != nil { t.Error(err) } var dummy string if s.As(&dummy) { t.Error(errors.New("want Snapshot.As to return false when Snapshot is zero value")) } if err := v.Close(); err != nil { t.Error(err) } // Create the variable and verify WatchVariable sees the value. if err := h.CreateVariable(ctx, name, []byte(content)); err != nil { t.Fatal(err) } if h.Mutable() { defer func() { if err := h.DeleteVariable(ctx, name); err != nil { t.Fatal(err) } }() } drv, err = h.MakeWatcher(ctx, name, runtimevar.StringDecoder) if err != nil { t.Fatal(err) } v = runtimevar.New(drv) defer func() { if err := v.Close(); err != nil { t.Error(err) } }() s, err = v.Watch(ctx) if err != nil { t.Fatal(err) } if err := st.SnapshotCheck(&s); err != nil { t.Error(err) } } ================================================ FILE: runtimevar/etcdvar/etcdvar.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package etcdvar provides a runtimevar implementation with variables // backed by etcd. Use OpenVariable to construct a *runtimevar.Variable. // // # URLs // // For runtimevar.OpenVariable, etcdvar registers for the scheme "etcd". // The default URL opener will dial an etcd server based on the environment // variable "ETCD_SERVER_URL". // To customize the URL opener, or for more details on the URL format, // see URLOpener. // See https://gocloud.dev/concepts/urls/ for background information. // // # As // // etcdvar exposes the following types for As: // - Snapshot: *clientv3.GetResponse // - Error: rpctypes.EtcdError package etcdvar // import "gocloud.dev/runtimevar/etcdvar" import ( "context" "errors" "fmt" "net/url" "os" "path" "sync" "time" "go.etcd.io/etcd/client/v3" "go.etcd.io/etcd/etcdserver/api/v3rpc/rpctypes" "gocloud.dev/gcerrors" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/driver" "google.golang.org/grpc/codes" ) func init() { runtimevar.DefaultURLMux().RegisterVariable(Scheme, &defaultDialer{}) } // Scheme is the URL scheme etcdvar registers its URLOpener under on runtimevar.DefaultMux. const Scheme = "etcd" type defaultDialer struct { init sync.Once opener *URLOpener err error } func (o *defaultDialer) OpenVariableURL(ctx context.Context, u *url.URL) (*runtimevar.Variable, error) { o.init.Do(func() { serverURL := os.Getenv("ETCD_SERVER_URL") if serverURL == "" { o.err = errors.New("ETCD_SERVER_URL environment variable is not set") return } client, err := clientv3.NewFromURL(serverURL) if err != nil { o.err = fmt.Errorf("failed to connect to default client %q: %v", serverURL, err) return } o.opener = &URLOpener{Client: client} }) if o.err != nil { return nil, fmt.Errorf("open variable %v: %v", u, o.err) } return o.opener.OpenVariableURL(ctx, u) } // URLOpener opens etcd URLs like "etcd://mykey?decoder=string". // // The host+path is used as the variable name. // // The following URL parameters are supported: // - decoder: The decoder to use. Defaults to runtimevar.BytesDecoder. // See runtimevar.DecoderByName for supported values. type URLOpener struct { // The Client to use; required. Client *clientv3.Client // Decoder specifies the decoder to use if one is not specified in the URL. // Defaults to runtimevar.BytesDecoder. Decoder *runtimevar.Decoder // Options specifies the options to pass to OpenVariable. Options Options } // OpenVariableURL opens a etcdvar Variable for u. func (o *URLOpener) OpenVariableURL(ctx context.Context, u *url.URL) (*runtimevar.Variable, error) { q := u.Query() decoderName := q.Get("decoder") q.Del("decoder") decoder, err := runtimevar.DecoderByName(ctx, decoderName, o.Decoder) if err != nil { return nil, fmt.Errorf("open variable %v: invalid decoder: %v", u, err) } for param := range q { return nil, fmt.Errorf("open variable %v: invalid query parameter %q", u, param) } return OpenVariable(o.Client, path.Join(u.Host, u.Path), decoder, &o.Options) } // Options sets options. type Options struct { // Timeout controls the timeout on RPCs to etcd; timeouts will result in // errors being returned from Watch. Defaults to 30 seconds. Timeout time.Duration } // OpenVariable constructs a *runtimevar.Variable that uses client to watch the variable // name on an etcd server. // etcd returns raw bytes; provide a decoder to decode the raw bytes into the // appropriate type for runtimevar.Snapshot.Value. // See the runtimevar package documentation for examples of decoders. func OpenVariable(cli *clientv3.Client, name string, decoder *runtimevar.Decoder, opts *Options) (*runtimevar.Variable, error) { return runtimevar.New(newWatcher(cli, name, decoder, opts)), nil } func newWatcher(cli *clientv3.Client, name string, decoder *runtimevar.Decoder, opts *Options) *watcher { if opts == nil { opts = &Options{} } // Create a ctx for the background goroutine that does all of the reading. // The cancel function will be used to shut it down during Close. ctx, cancel := context.WithCancel(context.Background()) w := &watcher{ // See struct comments for why it's buffered. ch: make(chan *state, 1), shutdown: cancel, } go w.watch(ctx, cli, name, decoder, driver.WaitDuration(opts.Timeout)) return w } // errNotExist is a sentinel error for nonexistent variables. var errNotExist = errors.New("variable does not exist") // state implements driver.State. type state struct { val any raw *clientv3.GetResponse updateTime time.Time version int64 err error } // Value implements driver.State.Value. func (s *state) Value() (any, error) { return s.val, s.err } // UpdateTime implements driver.State.UpdateTime. func (s *state) UpdateTime() time.Time { return s.updateTime } // As implements driver.State.As. func (s *state) As(i any) bool { if s.raw == nil { return false } p, ok := i.(**clientv3.GetResponse) if !ok { return false } *p = s.raw return true } // watcher implements driver.Watcher. type watcher struct { // The background goroutine writes new *state values to ch. // It is buffered so that the background goroutine can write without // blocking; it always drains the buffer before writing so that the latest // write is buffered. If writes could block, the background goroutine could be // blocked indefinitely from reading etcd's Watch events. // The background goroutine closes ch during shutdown. ch chan *state // shutdown tells the background goroutine to exit. shutdown func() } // WatchVariable implements driver.WatchVariable. func (w *watcher) WatchVariable(ctx context.Context, _ driver.State) (driver.State, time.Duration) { select { case <-ctx.Done(): return &state{err: ctx.Err()}, 0 case cur := <-w.ch: return cur, 0 } } // updateState checks to see if s and prev both represent the same error. // If not, it drains any previous state buffered in w.ch, then writes s to it. // It always return s. func (w *watcher) updateState(s, prev *state) *state { if s.err != nil && prev != nil && prev.err != nil { if equivalentError(s.err, prev.err) { // s represents the same error as prev. return s } } // Drain any buffered value on ch; it is now stale. select { case <-w.ch: default: } // This write can't block, since we're the only writer, ch has a buffer // size of 1, and we just read anything that was buffered. w.ch <- s return s } // equivalentError returns true iff err1 and err2 represent an equivalent error; // i.e., we don't want to return it to the user as a different error. func equivalentError(err1, err2 error) bool { if err1 == err2 || err1.Error() == err2.Error() { return true } var code1, code2 codes.Code if etcdErr, ok := err1.(rpctypes.EtcdError); ok { code1 = etcdErr.Code() } if etcdErr, ok := err2.(rpctypes.EtcdError); ok { code2 = etcdErr.Code() } return code1 != codes.OK && code1 == code2 } // watch is run by a background goroutine. // It watches file using cli.Watch, and writes new states to w.ch. // It exits when ctx is canceled, and closes w.ch. func (w *watcher) watch(ctx context.Context, cli *clientv3.Client, name string, decoder *runtimevar.Decoder, timeout time.Duration) { var cur *state defer close(w.ch) var watchCh clientv3.WatchChan for { if watchCh == nil { ctxWithTimeout, cancel := context.WithTimeout(ctx, timeout) watchCh = cli.Watch(ctxWithTimeout, name) cancel() } ctxWithTimeout, cancel := context.WithTimeout(ctx, timeout) resp, err := cli.Get(ctxWithTimeout, name) cancel() if err != nil { cur = w.updateState(&state{err: err}, cur) } else if len(resp.Kvs) == 0 { cur = w.updateState(&state{err: errNotExist}, cur) } else if len(resp.Kvs) > 1 { cur = w.updateState(&state{err: fmt.Errorf("%q has multiple values", name)}, cur) } else { kv := resp.Kvs[0] if cur == nil || cur.err != nil || kv.Version != cur.version { val, err := decoder.Decode(ctx, kv.Value) if err != nil { cur = w.updateState(&state{err: err}, cur) } else { cur = w.updateState(&state{val: val, raw: resp, updateTime: time.Now(), version: kv.Version}, cur) } } } // Value hasn't changed. Wait for change events. select { case <-ctx.Done(): return case _, ok := <-watchCh: if !ok { // watchCh has closed; retry in next loop iteration. watchCh = nil } } } } // Close implements driver.Close. func (w *watcher) Close() error { // Tell the background goroutine to shut down by canceling its ctx. w.shutdown() // Wait for it to exit. for range w.ch { } return nil } // ErrorAs implements driver.ErrorAs. func (w *watcher) ErrorAs(err error, i any) bool { switch v := err.(type) { case rpctypes.EtcdError: if p, ok := i.(*rpctypes.EtcdError); ok { *p = v return true } } return false } // ErrorCode implements driver.ErrorCode. func (*watcher) ErrorCode(err error) gcerrors.ErrorCode { if err == errNotExist { return gcerrors.NotFound } return gcerrors.Unknown } ================================================ FILE: runtimevar/etcdvar/etcdvar_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package etcdvar import ( "context" "errors" "os" "testing" "time" "github.com/google/go-cmp/cmp" "go.etcd.io/etcd/client/v3" "go.etcd.io/etcd/etcdserver/api/v3rpc/rpctypes" "gocloud.dev/internal/testing/setup" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/driver" "gocloud.dev/runtimevar/drivertest" ) // To run these tests against a local etcd server, first run ./localetcd.sh. // Then wait a few seconds for the server to be ready. type harness struct { client *clientv3.Client } func newHarness(t *testing.T) (drivertest.Harness, error) { if !setup.HasDockerTestEnvironment() { t.Skip("Skipping etcd tests since the etcd server is not available") } c, err := clientv3.NewFromURL("http://localhost:2379") if err != nil { t.Fatalf("No local etcd server running: %v; see runtimevar/etcdvar/localetcd.sh", err) } return &harness{client: c}, nil } func (h *harness) MakeWatcher(ctx context.Context, name string, decoder *runtimevar.Decoder) (driver.Watcher, error) { return newWatcher(h.client, name, decoder, nil), nil } func (h *harness) CreateVariable(ctx context.Context, name string, val []byte) error { _, err := h.client.Put(ctx, name, string(val)) return err } func (h *harness) UpdateVariable(ctx context.Context, name string, val []byte) error { return h.CreateVariable(ctx, name, val) } func (h *harness) DeleteVariable(ctx context.Context, name string) error { _, err := h.client.Delete(ctx, name) return err } func (h *harness) Mutable() bool { return true } func (h *harness) Close() {} func TestConformance(t *testing.T) { drivertest.RunConformanceTests(t, newHarness, []drivertest.AsTest{verifyAs{}}) } type verifyAs struct{} func (verifyAs) Name() string { return "verify As" } func (verifyAs) SnapshotCheck(s *runtimevar.Snapshot) error { var resp *clientv3.GetResponse if !s.As(&resp) { return errors.New("Snapshot.As failed") } return nil } func (verifyAs) ErrorCheck(v *runtimevar.Variable, err error) error { // etcdvar returns a fmt.Errorf error for "not found", so this is expected // to fail. var to rpctypes.EtcdError if v.ErrorAs(err, &to) { return errors.New("ErrorAs expected to fail") } // Try with a real etcd error. if !v.ErrorAs(rpctypes.ErrUnhealthy, &to) { return errors.New("ErrorAs expected to succeed with real etcd error") } return nil } // Etcd-specific tests. func TestEquivalentError(t *testing.T) { tests := []struct { Err1, Err2 error Want bool }{ {Err1: errors.New("not etcd"), Err2: errors.New("not etcd"), Want: true}, {Err1: errors.New("not etcd"), Err2: errors.New("not etcd but different")}, {Err1: errors.New("not etcd"), Err2: rpctypes.ErrUnhealthy}, {Err1: rpctypes.ErrUnhealthy, Err2: rpctypes.ErrRequestTooLarge}, {Err1: rpctypes.ErrUnhealthy, Err2: rpctypes.ErrUnhealthy, Want: true}, } for _, test := range tests { got := equivalentError(test.Err1, test.Err2) if got != test.Want { t.Errorf("%v vs %v: got %v want %v", test.Err1, test.Err2, got, test.Want) } } } func TestNoConnectionError(t *testing.T) { cli, err := clientv3.NewFromURL("http://no.server.here:999") if err != nil { t.Fatal(err) } v, err := OpenVariable(cli, "variable-name", nil, nil) if err != nil { t.Fatal(err) } defer v.Close() // Watch will block for quite a while trying to connect, // so use a short timeout. ctx, cancel := context.WithTimeout(context.Background(), 1*time.Millisecond) defer cancel() _, err = v.Watch(ctx) if err == nil { t.Error("got nil want error") } } func TestOpenVariable(t *testing.T) { h, err := newHarness(t) if err != nil { t.Fatal(err) } os.Setenv("ETCD_SERVER_URL", "http://localhost:2379") ctx := context.Background() if err := h.CreateVariable(ctx, "string-var", []byte("hello world")); err != nil { t.Fatal(err) } if err := h.CreateVariable(ctx, "json-var", []byte(`{"Foo": "Bar"}`)); err != nil { t.Fatal(err) } tests := []struct { URL string WantErr bool WantWatchErr bool Want any }{ // Nonexistentvar does not exist, so we get an error from Watch. {"etcd://nonexistentvar", false, true, nil}, // Invalid decoder arg. {"etcd://string-var?decoder=notadecoder", true, false, nil}, // Invalid parameter. {"etcd://string-var?param=value", true, false, nil}, // Working example with string decoder. {"etcd://string-var?decoder=string", false, false, "hello world"}, // Working example with default decoder. {"etcd://string-var", false, false, []byte("hello world")}, // Working example with JSON decoder. {"etcd://json-var?decoder=jsonmap", false, false, &map[string]any{"Foo": "Bar"}}, } for _, test := range tests { t.Run(test.URL, func(t *testing.T) { v, err := runtimevar.OpenVariable(ctx, test.URL) if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } if err != nil { return } defer v.Close() snapshot, err := v.Watch(ctx) if (err != nil) != test.WantWatchErr { t.Errorf("%s: got Watch error %v, want error %v", test.URL, err, test.WantWatchErr) } if err != nil { return } if !cmp.Equal(snapshot.Value, test.Want) { t.Errorf("%s: got snapshot value\n%v\n want\n%v", test.URL, snapshot.Value, test.Want) } }) } } ================================================ FILE: runtimevar/etcdvar/example_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package etcdvar_test import ( "context" "log" "go.etcd.io/etcd/client/v3" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/etcdvar" ) func ExampleOpenVariable() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // Connect to the etcd server. client, err := clientv3.NewFromURL("http://your.etcd.server:9999") if err != nil { log.Fatal(err) } // Construct a *runtimevar.Variable that watches the variable. v, err := etcdvar.OpenVariable(client, "cfg-variable-name", runtimevar.StringDecoder, nil) if err != nil { log.Fatal(err) } defer v.Close() } func Example_openVariableFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/runtimevar/etcdvar" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // runtimevar.OpenVariable creates a *runtimevar.Variable from a URL. // The default opener connects to an etcd server based on the environment // variable ETCD_SERVER_URL. v, err := runtimevar.OpenVariable(ctx, "etcd://myvarname?decoder=string") if err != nil { log.Fatal(err) } defer v.Close() } ================================================ FILE: runtimevar/etcdvar/go.mod ================================================ // Copyright 2018-2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. module gocloud.dev/runtimevar/etcdvar go 1.25.0 require ( github.com/google/go-cmp v0.7.0 go.etcd.io/etcd v3.3.27+incompatible go.etcd.io/etcd/client/v3 v3.6.8 gocloud.dev v0.45.0 google.golang.org/grpc v1.79.3 ) require ( cloud.google.com/go/auth v0.18.2 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect github.com/aws/aws-sdk-go-v2 v1.41.4 // indirect github.com/aws/aws-sdk-go-v2/config v1.32.12 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.19.12 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 // indirect github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 // indirect github.com/aws/smithy-go v1.24.2 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/coreos/go-semver v0.3.1 // indirect github.com/coreos/go-systemd/v22 v22.7.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/go-replayers/grpcreplay v1.3.0 // indirect github.com/google/go-replayers/httpreplay v1.2.0 // indirect github.com/google/martian/v3 v3.3.3 // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/google/uuid v1.6.0 // indirect github.com/google/wire v0.7.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.14 // indirect github.com/googleapis/gax-go/v2 v2.19.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect go.etcd.io/etcd/api/v3 v3.6.8 // indirect go.etcd.io/etcd/client/pkg/v3 v3.6.8 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 // indirect go.opentelemetry.io/otel v1.42.0 // indirect go.opentelemetry.io/otel/metric v1.42.0 // indirect go.opentelemetry.io/otel/sdk v1.42.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.42.0 // indirect go.opentelemetry.io/otel/trace v1.42.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.1 // indirect golang.org/x/crypto v0.49.0 // indirect golang.org/x/net v0.52.0 // indirect golang.org/x/oauth2 v0.36.0 // indirect golang.org/x/sys v0.42.0 // indirect golang.org/x/text v0.35.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect google.golang.org/api v0.272.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260316180232-0b37fe3546d5 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260316180232-0b37fe3546d5 // indirect google.golang.org/protobuf v1.36.11 // indirect ) replace gocloud.dev => ../../ ================================================ FILE: runtimevar/etcdvar/go.sum ================================================ cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= cloud.google.com/go/auth v0.18.2 h1:+Nbt5Ev0xEqxlNjd6c+yYUeosQ5TtEUaNcN/3FozlaM= cloud.google.com/go/auth v0.18.2/go.mod h1:xD+oY7gcahcu7G2SG2DsBerfFxgPAJz17zz2joOFF3M= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= cloud.google.com/go/kms v1.26.0 h1:cK9mN2cf+9V63D3H1f6koxTatWy39aTI/hCjz1I+adU= cloud.google.com/go/kms v1.26.0/go.mod h1:pHKOdFJm63hxBsiPkYtowZPltu9dW0MWvBa6IA4HM58= cloud.google.com/go/longrunning v0.8.0 h1:LiKK77J3bx5gDLi4SMViHixjD2ohlkwBi+mKA7EhfW8= cloud.google.com/go/longrunning v0.8.0/go.mod h1:UmErU2Onzi+fKDg2gR7dusz11Pe26aknR4kHmJJqIfk= cloud.google.com/go/monitoring v1.24.3 h1:dde+gMNc0UhPZD1Azu6at2e79bfdztVDS5lvhOdsgaE= cloud.google.com/go/monitoring v1.24.3/go.mod h1:nYP6W0tm3N9H/bOw8am7t62YTzZY+zUeQ+Bi6+2eonI= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.61.3 h1:VS//ZfBuPGDvakfD9xyPW1RGF1Vy3BWUoVZXgW1KMOg= cloud.google.com/go/storage v1.61.3/go.mod h1:JtqK8BBB7TWv0HVGHubtUdzYYrakOQIsMLffZ2Z/HWk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0 h1:DHa2U07rk8syqvCge0QIGMCE1WxGj9njT44GH7zNJLQ= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 h1:UnDZ/zFfG1JhH/DqxIZYU/1CUAlTUScoXD/LcM2Ykk8= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0/go.mod h1:IA1C1U7jO/ENqm/vhi7V9YYpBsp+IMyqNrEN94N7tVc= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 h1:0s6TxfCu2KHkkZPnBfsQ2y5qia0jl3MMrmBhu3nCOYk= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0/go.mod h1:Mf6O40IAyB9zR/1J8nGDDPirZQQPbYJni8Yisy7NTMc= github.com/aws/aws-sdk-go-v2 v1.41.4 h1:10f50G7WyU02T56ox1wWXq+zTX9I1zxG46HYuG1hH/k= github.com/aws/aws-sdk-go-v2 v1.41.4/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o= github.com/aws/aws-sdk-go-v2/config v1.32.12 h1:O3csC7HUGn2895eNrLytOJQdoL2xyJy0iYXhoZ1OmP0= github.com/aws/aws-sdk-go-v2/config v1.32.12/go.mod h1:96zTvoOFR4FURjI+/5wY1vc1ABceROO4lWgWJuxgy0g= github.com/aws/aws-sdk-go-v2/credentials v1.19.12 h1:oqtA6v+y5fZg//tcTWahyN9PEn5eDU/Wpvc2+kJ4aY8= github.com/aws/aws-sdk-go-v2/credentials v1.19.12/go.mod h1:U3R1RtSHx6NB0DvEQFGyf/0sbrpJrluENHdPy1j/3TE= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 h1:zOgq3uezl5nznfoK3ODuqbhVg1JzAGDUhXOsU0IDCAo= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20/go.mod h1:z/MVwUARehy6GAg/yQ1GO2IMl0k++cu1ohP9zo887wE= github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 h1:CNXO7mvgThFGqOFgbNAP2nol2qAWBOGfqR/7tQlvLmc= github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20/go.mod h1:oydPDJKcfMhgfcgBUZaG+toBbwy8yPWubJXBVERtI4o= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 h1:tN6W/hg+pkM+tf9XDkWUbDEjGLb+raoBMFsTodcoYKw= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20/go.mod h1:YJ898MhD067hSHA6xYCx5ts/jEd8BSOLtQDL3iZsvbc= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 h1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 h1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 h1:2HvVAIq+YqgGotK6EkMf+KIEqTISmTYh5zLpYyeTo1Y= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20/go.mod h1:V4X406Y666khGa8ghKmphma/7C0DAtEQYhkq9z4vpbk= github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 h1:0GFOLzEbOyZABS3PhYfBIx2rNBACYcKty+XGkTgw1ow= github.com/aws/aws-sdk-go-v2/service/signin v1.0.8/go.mod h1:LXypKvk85AROkKhOG6/YEcHFPoX+prKTowKnVdcaIxE= github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 h1:kiIDLZ005EcKomYYITtfsjn7dtOwHDOFy7IbPXKek2o= github.com/aws/aws-sdk-go-v2/service/sso v1.30.13/go.mod h1:2h/xGEowcW/g38g06g3KpRWDlT+OTfxxI0o1KqayAB8= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 h1:jzKAXIlhZhJbnYwHbvUQZEB8KfgAEuG0dc08Bkda7NU= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17/go.mod h1:Al9fFsXjv4KfbzQHGe6V4NZSZQXecFcvaIF4e70FoRA= github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 h1:Cng+OOwCHmFljXIxpEVXAGMnBia8MSU6Ch5i9PgBkcU= github.com/aws/aws-sdk-go-v2/service/sts v1.41.9/go.mod h1:LrlIndBDdjA/EeXeyNBle+gyCwTlizzW5ycgWnvIxkk= github.com/aws/smithy-go v1.24.2 h1:FzA3bu/nt/vDvmnkg+R8Xl46gmzEDam6mZ1hzmwXFng= github.com/aws/smithy-go v1.24.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os8IaYg++6uMOdKK83QtkkvJik= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4= github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= github.com/coreos/go-systemd/v22 v22.7.0 h1:LAEzFkke61DFROc7zNLX/WA2i5J8gYqe0rSj9KI28KA= github.com/coreos/go-systemd/v22 v22.7.0/go.mod h1:xNUYtjHu2EDXbsxz1i41wouACIwT7Ybq9o0BQhMwD0w= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= github.com/envoyproxy/go-control-plane/envoy v1.37.0 h1:u3riX6BoYRfF4Dr7dwSOroNfdSbEPe9Yyl09/B6wBrQ= github.com/envoyproxy/go-control-plane/envoy v1.37.0/go.mod h1:DReE9MMrmecPy+YvQOAOHNYMALuowAnbjjEMkkWOi6A= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds= github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/go-replayers/grpcreplay v1.3.0 h1:1Keyy0m1sIpqstQmgz307zhiJ1pV4uIlFds5weTmxbo= github.com/google/go-replayers/grpcreplay v1.3.0/go.mod h1:v6NgKtkijC0d3e3RW8il6Sy5sqRVUwoQa4mHOGEy8DI= github.com/google/go-replayers/httpreplay v1.2.0 h1:VM1wEyyjaoU53BwrOnaf9VhAyQQEEioJvFYxYcLRKzk= github.com/google/go-replayers/httpreplay v1.2.0/go.mod h1:WahEFFZZ7a1P4VM1qEeHy+tME4bwyqPcwWbNlUI1Mcg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/wire v0.7.0 h1:JxUKI6+CVBgCO2WToKy/nQk0sS+amI9z9EjVmdaocj4= github.com/google/wire v0.7.0/go.mod h1:n6YbUQD9cPKTnHXEBN2DXlOp/mVADhVErcMFb0v3J18= github.com/googleapis/enterprise-certificate-proxy v0.3.14 h1:yh8ncqsbUY4shRD5dA6RlzjJaT4hi3kII+zYw8wmLb8= github.com/googleapis/enterprise-certificate-proxy v0.3.14/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.19.0 h1:fYQaUOiGwll0cGj7jmHT/0nPlcrZDFPrZRhTsoCr8hE= github.com/googleapis/gax-go/v2 v2.19.0/go.mod h1:w2ROXVdfGEVFXzmlciUU4EdjHgWvB5h2n6x/8XSTTJA= github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs= github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.etcd.io/etcd v3.3.27+incompatible h1:5hMrpf6REqTHV2LW2OclNpRtxI0k9ZplMemJsMSWju0= go.etcd.io/etcd v3.3.27+incompatible/go.mod h1:yaeTdrJi5lOmYerz05bd8+V7KubZs8YSFZfzsF9A6aI= go.etcd.io/etcd/api/v3 v3.6.8 h1:gqb1VN92TAI6G2FiBvWcqKtHiIjr4SU2GdXxTwyexbM= go.etcd.io/etcd/api/v3 v3.6.8/go.mod h1:qyQj1HZPUV3B5cbAL8scG62+fyz5dSxxu0w8pn28N6Q= go.etcd.io/etcd/client/pkg/v3 v3.6.8 h1:Qs/5C0LNFiqXxYf2GU8MVjYUEXJ6sZaYOz0zEqQgy50= go.etcd.io/etcd/client/pkg/v3 v3.6.8/go.mod h1:GsiTRUZE2318PggZkAo6sWb6l8JLVrnckTNfbG8PWtw= go.etcd.io/etcd/client/v3 v3.6.8 h1:B3G76t1UykqAOrbio7s/EPatixQDkQBevN8/mwiplrY= go.etcd.io/etcd/client/v3 v3.6.8/go.mod h1:MVG4BpSIuumPi+ELF7wYtySETmoTWBHVcDoHdVupwt8= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/detectors/gcp v1.42.0 h1:kpt2PEJuOuqYkPcktfJqWWDjTEd/FNgrxcniL7kQrXQ= go.opentelemetry.io/contrib/detectors/gcp v1.42.0/go.mod h1:W9zQ439utxymRrXsUOzZbFX4JhLxXU4+ZnCt8GG7yA8= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0 h1:yI1/OhfEPy7J9eoa6Sj051C7n5dvpj0QX8g4sRchg04= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0/go.mod h1:NoUCKYWK+3ecatC4HjkRktREheMeEtrXoQxrqYFeHSc= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 h1:OyrsyzuttWTSur2qN/Lm0m2a8yqyIjUVBZcxFPuXq2o= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0/go.mod h1:C2NGBr+kAB4bk3xtMXfZ94gqFDtg/GkI7e9zqGh5Beg= go.opentelemetry.io/otel v1.42.0 h1:lSQGzTgVR3+sgJDAU/7/ZMjN9Z+vUip7leaqBKy4sho= go.opentelemetry.io/otel v1.42.0/go.mod h1:lJNsdRMxCUIWuMlVJWzecSMuNjE7dOYyWlqOXWkdqCc= go.opentelemetry.io/otel/metric v1.42.0 h1:2jXG+3oZLNXEPfNmnpxKDeZsFI5o4J+nz6xUlaFdF/4= go.opentelemetry.io/otel/metric v1.42.0/go.mod h1:RlUN/7vTU7Ao/diDkEpQpnz3/92J9ko05BIwxYa2SSI= go.opentelemetry.io/otel/sdk v1.42.0 h1:LyC8+jqk6UJwdrI/8VydAq/hvkFKNHZVIWuslJXYsDo= go.opentelemetry.io/otel/sdk v1.42.0/go.mod h1:rGHCAxd9DAph0joO4W6OPwxjNTYWghRWmkHuGbayMts= go.opentelemetry.io/otel/sdk/metric v1.42.0 h1:D/1QR46Clz6ajyZ3G8SgNlTJKBdGp84q9RKCAZ3YGuA= go.opentelemetry.io/otel/sdk/metric v1.42.0/go.mod h1:Ua6AAlDKdZ7tdvaQKfSmnFTdHx37+J4ba8MwVCYM5hc= go.opentelemetry.io/otel/trace v1.42.0 h1:OUCgIPt+mzOnaUTpOQcBiM/PLQ/Op7oq6g4LenLmOYY= go.opentelemetry.io/otel/trace v1.42.0/go.mod h1:f3K9S+IFqnumBkKhRJMeaZeNk9epyhnCmQh/EysQCdc= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= google.golang.org/api v0.272.0 h1:eLUQZGnAS3OHn31URRf9sAmRk3w2JjMx37d2k8AjJmA= google.golang.org/api v0.272.0/go.mod h1:wKjowi5LNJc5qarNvDCvNQBn3rVK8nSy6jg2SwRwzIA= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20260316180232-0b37fe3546d5 h1:JNfk58HZ8lfmXbYK2vx/UvsqIL59TzByCxPIX4TDmsE= google.golang.org/genproto v0.0.0-20260316180232-0b37fe3546d5/go.mod h1:x5julN69+ED4PcFk/XWayw35O0lf/nGa4aNgODCmNmw= google.golang.org/genproto/googleapis/api v0.0.0-20260316180232-0b37fe3546d5 h1:CogIeEXn4qWYzzQU0QqvYBM8yDF9cFYzDq9ojSpv0Js= google.golang.org/genproto/googleapis/api v0.0.0-20260316180232-0b37fe3546d5/go.mod h1:EIQZ5bFCfRQDV4MhRle7+OgjNtZ6P1PiZBgAKuxXu/Y= google.golang.org/genproto/googleapis/rpc v0.0.0-20260316180232-0b37fe3546d5 h1:aJmi6DVGGIStN9Mobk/tZOOQUBbj0BPjZjjnOdoZKts= google.golang.org/genproto/googleapis/rpc v0.0.0-20260316180232-0b37fe3546d5/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= ================================================ FILE: runtimevar/etcdvar/localetcd.sh ================================================ #!/usr/bin/env bash # Copyright 2019 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Starts a local etcd instance via Docker. # https://coderwall.com/p/fkfaqq/safer-bash-scripts-with-set-euxo-pipefail set -euo pipefail # Clean up and run etcd. echo "Starting etcd..." docker rm -f etcd &> /dev/null || : docker run -d -p 2379:2379 -p 4001:4001 --name etcd quay.io/coreos/etcd:v3.5.4 /usr/local/bin/etcd --advertise-client-urls http://0.0.0.0:2379 --listen-client-urls http://0.0.0.0:2379 &> /dev/null echo "...done. Run \"docker rm -f etcd\" to clean up the container." echo ================================================ FILE: runtimevar/example_openvariable_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package runtimevar_test import ( "context" "fmt" "log" "gocloud.dev/runtimevar" _ "gocloud.dev/runtimevar/constantvar" ) func Example_openVariableFromURL() { // Connect to a Variable using a URL. // This example uses "constantvar", an in-memory implementation. // We need to add a blank import line to register the constantvar driver's // URLOpener, which implements runtimevar.VariableURLOpener: // import _ "gocloud.dev/runtimevar/constantvar" // constantvar registers for the "constant" scheme. // All runtimevar.OpenVariable URLs also work with "runtimevar+" or "runtimevar+variable+" prefixes, // e.g., "runtimevar+constant://..." or "runtimevar+variable+constant://...". ctx := context.Background() v, err := runtimevar.OpenVariable(ctx, "constant://?val=hello+world&decoder=string") if err != nil { log.Fatal(err) } defer v.Close() // Now we can use the Variable as normal. snapshot, err := v.Latest(ctx) if err != nil { log.Fatal(err) } // It's safe to cast the Value to string since we used the string decoder. fmt.Printf("%s\n", snapshot.Value.(string)) // Output: // hello world } ================================================ FILE: runtimevar/example_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package runtimevar_test import ( "context" "fmt" "log" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/constantvar" "gocloud.dev/secrets" _ "gocloud.dev/runtimevar/gcpruntimeconfig" runtimeconfig "google.golang.org/genproto/googleapis/cloud/runtimeconfig/v1beta1" "google.golang.org/grpc/status" ) func Example_jsonDecoder() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // Config is the sample config struct we're going to parse our JSON into. type Config struct { Host string Port int } // A sample JSON config that will decode into Config. const jsonConfig = `{"Host": "gocloud.dev", "Port": 8080}` // Construct a Decoder that decodes raw bytes into our config. decoder := runtimevar.NewDecoder(Config{}, runtimevar.JSONDecode) // Next, a construct a *Variable using a constructor or URL opener. // This example uses constantvar. // If you're using a URL opener, you can't decode JSON into a struct, but // you can use the query parameter "decoder=jsonmap" to decode into a map. v := constantvar.NewBytes([]byte(jsonConfig), decoder) defer v.Close() // snapshot.Value will be of type Config. // PRAGMA: On gocloud.dev, hide the rest of the function. snapshot, err := v.Latest(ctx) if err != nil { log.Fatalf("Error in retrieving variable: %v", err) } fmt.Printf("Config: %+v\n", snapshot.Value.(Config)) // Output: // Config: {Host:gocloud.dev Port:8080} } func Example_stringDecoder() { // Construct a *Variable using a constructor from one of the // runtimevar subpackages. This example uses constantvar. // The variable value is of type string, so we use StringDecoder. v := constantvar.NewBytes([]byte("hello world"), runtimevar.StringDecoder) defer v.Close() // Call Latest to retrieve the value. snapshot, err := v.Latest(context.Background()) if err != nil { log.Fatalf("Error in retrieving variable: %v", err) } // snapshot.Value will be of type string. fmt.Printf("%q\n", snapshot.Value.(string)) // Output: // "hello world" } func ExampleVariable_Latest() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. var v *runtimevar.Variable snapshot, err := v.Latest(context.Background()) if err != nil { log.Fatalf("Error in retrieving variable: %v", err) } // PRAGMA: On gocloud.dev, hide the rest of the function. _ = snapshot } func ExampleSnapshot_As() { // This example is specific to the gcpruntimeconfig implementation; it // demonstrates access to the underlying // google.golang.org/genproto/googleapis/cloud/runtimeconfig.Variable type. // The types exposed for As by gcpruntimeconfig are documented in // https://godoc.org/gocloud.dev/runtimevar/gcpruntimeconfig#hdr-As ctx := context.Background() const url = "gcpruntimeconfig://proj/config/key" v, err := runtimevar.OpenVariable(ctx, url) if err != nil { log.Fatal(err) } s, err := v.Latest(ctx) if err != nil { log.Fatal(err) } var rcv *runtimeconfig.Variable if s.As(&rcv) { fmt.Println(rcv.UpdateTime) } } func ExampleVariable_ErrorAs() { // This example is specific to the gcpruntimeconfig implementation; it // demonstrates access to the underlying google.golang.org/grpc/status.Status // type. // The types exposed for As by gcpruntimeconfig are documented in // https://godoc.org/gocloud.dev/runtimevar/gcpruntimeconfig#hdr-As ctx := context.Background() const url = "gcpruntimeconfig://proj/wrongconfig/key" v, err := runtimevar.OpenVariable(ctx, url) if err != nil { log.Fatal(err) } _, err = v.Watch(ctx) if err != nil { var s *status.Status if v.ErrorAs(err, &s) { fmt.Println(s.Code()) } } } func ExampleVariable_Watch() { // Construct a *Variable using a constructor from one of the // runtimevar subpackages. This example uses constantvar. // The variable value is of type string, so we use StringDecoder. v := constantvar.NewBytes([]byte("hello world"), runtimevar.StringDecoder) defer v.Close() // Call Watch in a loop from a background goroutine to see all changes, // including errors. // // You can use this for logging, or to trigger behaviors when the // config changes. // // Note that Latest always returns the latest "good" config, so seeing // an error from Watch doesn't mean that Latest will return one. go func() { for { snapshot, err := v.Watch(context.Background()) if err == runtimevar.ErrClosed { // v has been closed; exit. return } if err == nil { // Casting to a string here because we used StringDecoder. log.Printf("New config: %v", snapshot.Value.(string)) } else { log.Printf("Error loading config: %v", err) // Even though there's been an error loading the config, // v.Latest will continue to return the latest "good" value. } } }() } func ExampleDecryptDecode() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. var keeper *secrets.Keeper decodeFunc := runtimevar.DecryptDecode(keeper, runtimevar.StringDecode) decoder := runtimevar.NewDecoder("", decodeFunc) // PRAGMA: On gocloud.dev, hide the rest of the function. _ = decoder } ================================================ FILE: runtimevar/filevar/example_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package filevar_test import ( "context" "fmt" "log" "os" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/filevar" ) func ExampleOpenVariable() { // Create a temporary file to hold our config. f, err := os.CreateTemp("", "") if err != nil { log.Fatal(err) } if _, err := f.Write([]byte("hello world")); err != nil { log.Fatal(err) } // Construct a *runtimevar.Variable pointing at f. v, err := filevar.OpenVariable(f.Name(), runtimevar.StringDecoder, nil) if err != nil { log.Fatal(err) } defer v.Close() // We can now read the current value of the variable from v. snapshot, err := v.Latest(context.Background()) if err != nil { log.Fatal(err) } // runtimevar.Snapshot.Value is decoded to a string. fmt.Println(snapshot.Value.(string)) // Output: // hello world } func Example_openVariableFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/runtimevar/filevar" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // runtimevar.OpenVariable creates a *runtimevar.Variable from a URL. v, err := runtimevar.OpenVariable(ctx, "file:///path/to/config.txt?decoder=string") if err != nil { log.Fatal(err) } defer v.Close() } ================================================ FILE: runtimevar/filevar/filevar.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package filevar provides a runtimevar implementation with variables // backed by the filesystem. Use OpenVariable to construct a *runtimevar.Variable. // // Configuration files can be updated using any commands (cp, mv) or // tools/editors. This package does not guarantee read consistency since // it does not have control over the writes. For example, some kinds of // updates might result in filevar temporarily receiving an error or an // empty value. // // Known Issues: // // * On macOS, if an empty file is copied into a configuration file, // // filevar will not detect the change. // // # URLs // // For runtimevar.OpenVariable, filevar registers for the scheme "file". // To customize the URL opener, or for more details on the URL format, // see URLOpener. // See https://gocloud.dev/concepts/urls/ for background information. // // # As // // filevar does not support any types for As. package filevar // import "gocloud.dev/runtimevar/filevar" import ( "bytes" "context" "errors" "fmt" "net/url" "os" "path/filepath" "strings" "time" "github.com/fsnotify/fsnotify" "gocloud.dev/gcerrors" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/driver" ) func init() { runtimevar.DefaultURLMux().RegisterVariable(Scheme, &URLOpener{}) } // Scheme is the URL scheme filevar registers its URLOpener under on runtimevar.DefaultMux. const Scheme = "file" // URLOpener opens filevar URLs like "file:///path/to/config.json?decoder=json". // // The URL's host+path is used as the path to the file to watch. // If os.PathSeparator != "/", any leading "/" from the path is dropped // and remaining '/' characters are converted to os.PathSeparator. // // The following URL parameters are supported: // - decoder: The decoder to use. Defaults to URLOpener.Decoder, or // runtimevar.BytesDecoder if URLOpener.Decoder is nil. // See runtimevar.DecoderByName for supported values. // - wait: The frequency for retries after an error, in time.ParseDuration formats. // Defaults to 30s. type URLOpener struct { // Decoder specifies the decoder to use if one is not specified in the URL. // Defaults to runtimevar.BytesDecoder. Decoder *runtimevar.Decoder // Options specifies the options to pass to OpenVariable. Options Options } // OpenVariableURL opens the variable at the URL's path. See the package doc // for more details. func (o *URLOpener) OpenVariableURL(ctx context.Context, u *url.URL) (*runtimevar.Variable, error) { q := u.Query() decoderName := q.Get("decoder") q.Del("decoder") decoder, err := runtimevar.DecoderByName(ctx, decoderName, o.Decoder) if err != nil { return nil, fmt.Errorf("open variable %v: invalid decoder: %v", u, err) } opts := o.Options if s := q.Get("wait"); s != "" { q.Del("wait") d, err := time.ParseDuration(s) if err != nil { return nil, fmt.Errorf("open variable %v: invalid wait %q: %v", u, s, err) } opts.WaitDuration = d } for param := range q { return nil, fmt.Errorf("open variable %v: invalid query parameter %q", u, param) } path := u.Path // Hostname == "." means a relative path, so drop the leading "/". // Also drop the leading "/" on Windows. if u.Host == "." || os.PathSeparator != '/' { path = strings.TrimPrefix(path, "/") } return OpenVariable(filepath.FromSlash(path), decoder, &opts) } // Options sets options. type Options struct { // WaitDuration controls the frequency of retries after an error. For example, // if the file does not exist. Defaults to 30 seconds. WaitDuration time.Duration } // OpenVariable constructs a *runtimevar.Variable backed by the file at path. // The file holds raw bytes; provide a decoder to decode the raw bytes into the // appropriate type for runtimevar.Snapshot.Value. // See the runtimevar package documentation for examples of decoders. func OpenVariable(path string, decoder *runtimevar.Decoder, opts *Options) (*runtimevar.Variable, error) { w, err := newWatcher(path, decoder, opts) if err != nil { return nil, err } return runtimevar.New(w), nil } func newWatcher(path string, decoder *runtimevar.Decoder, opts *Options) (*watcher, error) { if opts == nil { opts = &Options{} } if path == "" { return nil, errors.New("path is required") } if decoder == nil { return nil, errors.New("decoder is required") } // Use absolute file path. abspath, err := filepath.Abs(path) if err != nil { return nil, err } // Construct a fsnotify.Watcher. notifier, err := fsnotify.NewWatcher() if err != nil { return nil, err } // Create a ctx for the background goroutine that does all of the reading. // The cancel function will be used to shut it down during Close, with the // result being passed back via closeCh. ctx, cancel := context.WithCancel(context.Background()) w := &watcher{ path: abspath, // See struct comments for why it's buffered. ch: make(chan *state, 1), closeCh: make(chan error), shutdown: cancel, } go w.watch(ctx, notifier, abspath, decoder, driver.WaitDuration(opts.WaitDuration)) return w, nil } // errNotExist wraps an underlying error in cases where the file likely doesn't // exist. type errNotExist struct { err error } func (e *errNotExist) Error() string { return e.err.Error() } // state implements driver.State. type state struct { val any updateTime time.Time raw []byte err error } func (s *state) Value() (any, error) { return s.val, s.err } func (s *state) UpdateTime() time.Time { return s.updateTime } func (s *state) As(i any) bool { return false } // watcher implements driver.Watcher for configurations stored in files. type watcher struct { // The path for the file we're watching. path string // The background goroutine writes new *state values to ch. // It is buffered so that the background goroutine can write without // blocking; it always drains the buffer before writing so that the latest // write is buffered. If writes could block, the background goroutine could be // blocked indefinitely from reading fsnotify events. ch chan *state // closeCh is used to return any errors from closing the notifier // back to watcher.Close. closeCh chan error // shutdown tells the background goroutine to exit. shutdown func() } // WatchVariable implements driver.WatchVariable. func (w *watcher) WatchVariable(ctx context.Context, _ driver.State) (driver.State, time.Duration) { select { case <-ctx.Done(): return &state{err: ctx.Err()}, 0 case cur := <-w.ch: return cur, 0 } } // updateState checks to see if s and prev both represent the same error. // If not, it drains any previous state buffered in w.ch, then writes s to it. // It always return s. func (w *watcher) updateState(s, prev *state) *state { if s.err != nil && prev != nil && prev.err != nil && (s.err == prev.err || s.err.Error() == prev.err.Error() || (os.IsNotExist(s.err) && os.IsNotExist(prev.err))) { // s represents the same error as prev. return s } // Drain any buffered value on ch; it is now stale. select { case <-w.ch: default: } // This write can't block, since we're the only writer, ch has a buffer // size of 1, and we just read anything that was buffered. w.ch <- s return s } // watch is run by a background goroutine. // It watches file using notifier, and writes new states to w.ch. // If it can't read or watch the file, it re-checks every wait. // It exits when ctx is canceled, and writes any shutdown errors (or // nil if there weren't any) to w.closeCh. func (w *watcher) watch(ctx context.Context, notifier *fsnotify.Watcher, file string, decoder *runtimevar.Decoder, wait time.Duration) { var cur *state for { // If the current state is an error, pause between attempts // to avoid spin loops. In particular, this happens when the file // doesn't exist. if cur != nil && cur.err != nil { select { case <-ctx.Done(): w.closeCh <- notifier.Close() return case <-time.After(wait): } } // Add the file to the notifier to be watched. It's fine to be // added multiple times, and fsnotifier is a bit flaky about when // it's needed during renames, so just always try. if err := notifier.Add(file); err != nil { // File probably does not exist. Try again later. cur = w.updateState(&state{err: &errNotExist{err}}, cur) continue } // Read the file. b, err := os.ReadFile(file) if err != nil { // File probably does not exist. Try again later. cur = w.updateState(&state{err: &errNotExist{err}}, cur) continue } // If it's a new value, decode and return it. if cur == nil || cur.err != nil || !bytes.Equal(cur.raw, b) { if val, err := decoder.Decode(ctx, b); err != nil { cur = w.updateState(&state{err: err}, cur) } else { cur = w.updateState(&state{val: val, updateTime: time.Now(), raw: b}, cur) } } // Block until notifier tells us something relevant changed. wait := true for wait { select { case <-ctx.Done(): w.closeCh <- notifier.Close() return case event := <-notifier.Events: if event.Name != file { continue } // Ignore if not one of the following operations. if event.Op&(fsnotify.Create|fsnotify.Write|fsnotify.Remove|fsnotify.Rename) == 0 { continue } wait = false case err := <-notifier.Errors: cur = w.updateState(&state{err: err}, cur) } } } } // Close implements driver.WatchVariable. func (w *watcher) Close() error { // Tell the background goroutine to shut down by canceling its ctx. w.shutdown() // Wait for it to return the result of closing the notifier. err := <-w.closeCh // Cleanup our channels. close(w.ch) close(w.closeCh) return err } // ErrorAs implements driver.ErrorAs. func (w *watcher) ErrorAs(err error, i any) bool { return false } // ErrorCode implements driver.ErrorCode. func (*watcher) ErrorCode(err error) gcerrors.ErrorCode { if _, ok := err.(*errNotExist); ok { return gcerrors.NotFound } return gcerrors.Unknown } ================================================ FILE: runtimevar/filevar/filevar_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package filevar import ( "context" "errors" "net/url" "os" "path/filepath" "strings" "testing" "time" "github.com/google/go-cmp/cmp" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/driver" "gocloud.dev/runtimevar/drivertest" "gocloud.dev/secrets" _ "gocloud.dev/secrets/localsecrets" ) type harness struct { dir string closer func() } func newHarness(t *testing.T) (drivertest.Harness, error) { t.Helper() dir := t.TempDir() return &harness{ dir: dir, closer: func() { _ = os.RemoveAll(dir) }, }, nil } func (h *harness) MakeWatcher(ctx context.Context, name string, decoder *runtimevar.Decoder) (driver.Watcher, error) { // filevar uses a goroutine in the background that poll every WaitDuration if // the file is deleted. Make this fast for tests. return newWatcher(filepath.Join(h.dir, name), decoder, &Options{WaitDuration: 1 * time.Millisecond}) } func (h *harness) CreateVariable(ctx context.Context, name string, val []byte) error { // Write to a temporary file and rename; otherwise, // Watch can read an empty file during the write. tmp, err := os.CreateTemp(h.dir, "tmp") if err != nil { return err } if _, err := tmp.Write(val); err != nil { tmp.Close() return err } tmp.Close() return os.Rename(tmp.Name(), filepath.Join(h.dir, name)) } func (h *harness) UpdateVariable(ctx context.Context, name string, val []byte) error { return h.CreateVariable(ctx, name, val) } func (h *harness) DeleteVariable(ctx context.Context, name string) error { path := filepath.Join(h.dir, name) return os.Remove(path) } func (h *harness) Close() { h.closer() } func (h *harness) Mutable() bool { return true } func TestConformance(t *testing.T) { drivertest.RunConformanceTests(t, newHarness, []drivertest.AsTest{verifyAs{}}) } type verifyAs struct{} func (verifyAs) Name() string { return "verify As" } func (verifyAs) SnapshotCheck(s *runtimevar.Snapshot) error { var ss string if s.As(&ss) { return errors.New("Snapshot.As expected to fail") } return nil } func (verifyAs) ErrorCheck(v *runtimevar.Variable, err error) error { var ss string if v.ErrorAs(err, &ss) { return errors.New("runtimevar.ErrorAs expected to fail") } return nil } // Filevar-specific tests. func TestOpenVariable(t *testing.T) { dir := t.TempDir() tests := []struct { description string path string decoder *runtimevar.Decoder want string wantErr bool }{ { description: "empty path results in error", decoder: runtimevar.StringDecoder, wantErr: true, }, { description: "empty decoder results in error", path: filepath.Join(dir, "foo.txt"), wantErr: true, }, { description: "basic path works", path: filepath.Join(dir, "foo.txt"), decoder: runtimevar.StringDecoder, want: filepath.Join(dir, "foo.txt"), }, { description: "path with extra relative dirs works and is cleaned up", path: filepath.Join(dir, "bar/../foo.txt"), decoder: runtimevar.StringDecoder, want: filepath.Join(dir, "foo.txt"), }, } for _, test := range tests { t.Run(test.description, func(t *testing.T) { // Create driver impl. drv, err := newWatcher(test.path, test.decoder, nil) if (err != nil) != test.wantErr { t.Errorf("got err %v want error %v", err, test.wantErr) } if drv != nil { if drv.path != test.want { t.Errorf("got %q want %q", drv.path, test.want) } drv.Close() } // Create portable type. w, err := OpenVariable(test.path, test.decoder, nil) if (err != nil) != test.wantErr { t.Errorf("got err %v want error %v", err, test.wantErr) } if w != nil { w.Close() } }) } } func TestOpenVariableURL(t *testing.T) { dir := t.TempDir() jsonPath := filepath.Join(dir, "myvar.json") if err := os.WriteFile(jsonPath, []byte(`{"Foo": "Bar"}`), 0o666); err != nil { t.Fatal(err) } txtPath := filepath.Join(dir, "myvar.txt") if err := os.WriteFile(txtPath, []byte("hello world!"), 0o666); err != nil { t.Fatal(err) } nonexistentPath := filepath.Join(dir, "filenotfound") ctx := context.Background() secretsPath := filepath.Join(dir, "mysecret.txt") cleanup, err := setupTestSecrets(ctx, dir, secretsPath) if err != nil { t.Fatal(err) } defer cleanup() // Convert paths to a URL path, adding a leading "/" if needed on Windows // (on Unix, dirpath already has a leading "/"). jsonPath = filepath.ToSlash(jsonPath) txtPath = filepath.ToSlash(txtPath) nonexistentPath = filepath.ToSlash(nonexistentPath) secretsPath = filepath.ToSlash(secretsPath) if os.PathSeparator != '/' { if !strings.HasPrefix(jsonPath, "/") { jsonPath = "/" + jsonPath } if !strings.HasPrefix(txtPath, "/") { txtPath = "/" + txtPath } if !strings.HasPrefix(nonexistentPath, "/") { nonexistentPath = "/" + nonexistentPath } if !strings.HasPrefix(secretsPath, "/") { secretsPath = "/" + secretsPath } } tests := []struct { URL string WantErr bool WantWatchErr bool Want any }{ // Variable construction succeeds, but the file does not exist. {"file://" + nonexistentPath, false, true, nil}, // Variable construction fails due to invalid decoder arg. {"file://" + txtPath + "?decoder=notadecoder", true, false, nil}, // Variable construction fails due to invalid arg. {"file://" + txtPath + "?param=value", true, false, nil}, // Working example with default decoder. {"file://" + txtPath, false, false, []byte("hello world!")}, // Working example with string decoder. {"file://" + txtPath + "?decoder=string", false, false, "hello world!"}, // Working example with JSON decoder. {"file://" + jsonPath + "?decoder=jsonmap", false, false, &map[string]any{"Foo": "Bar"}}, // Working example with decrypt (default) decoder. {"file://" + secretsPath + "?decoder=decrypt", false, false, []byte(`{"Foo":"Bar"}`)}, // Working example with decrypt+bytes decoder. {"file://" + secretsPath + "?decoder=decrypt+bytes", false, false, []byte(`{"Foo":"Bar"}`)}, // Working example with decrypt+json decoder. {"file://" + secretsPath + "?decoder=decrypt+jsonmap", false, false, &map[string]any{"Foo": "Bar"}}, // Working example with escaped decrypt+json decoder {"file://" + secretsPath + "?decoder=" + url.QueryEscape("decrypt+jsonmap"), false, false, &map[string]any{"Foo": "Bar"}}, // Setting wait. {"file://" + txtPath + "?decoder=string&wait=1m", false, false, "hello world!"}, // Invalid wait. {"file://" + txtPath + "?decoder=string&wait=xx", true, false, nil}, // Relative path using host="."; bucket is created but error at read time. {"file://./../.." + nonexistentPath, false, true, nil}, } for _, test := range tests { t.Run(test.URL, func(t *testing.T) { v, err := runtimevar.OpenVariable(ctx, test.URL) if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } if err != nil { return } defer v.Close() snapshot, err := v.Watch(ctx) if (err != nil) != test.WantWatchErr { t.Errorf("%s: got Watch error %v, want error %v", test.URL, err, test.WantWatchErr) } if err != nil { return } if !cmp.Equal(snapshot.Value, test.Want) { t.Errorf("%s: got snapshot value\n%v\n want\n%v", test.URL, snapshot.Value, test.Want) } }) } } func setupTestSecrets(ctx context.Context, dir, secretsPath string) (func(), error) { const keeperEnv = "RUNTIMEVAR_KEEPER_URL" const keeperURL = "base64key://smGbjm71Nxd1Ig5FS0wj9SlbzAIrnolCz9bQQ6uAhl4=" oldURL := os.Getenv(keeperEnv) os.Setenv(keeperEnv, keeperURL) cleanup := func() { os.Setenv(keeperEnv, oldURL) } k, err := secrets.OpenKeeper(ctx, keeperURL) if err != nil { return cleanup, err } sc, err := k.Encrypt(ctx, []byte(`{"Foo":"Bar"}`)) if err != nil { return cleanup, err } if err := os.WriteFile(secretsPath, sc, 0o666); err != nil { return cleanup, err } return cleanup, nil } ================================================ FILE: runtimevar/gcpruntimeconfig/example_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcpruntimeconfig_test import ( "context" "log" "gocloud.dev/gcp" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/gcpruntimeconfig" ) func ExampleOpenVariable() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // Your GCP credentials. // See https://cloud.google.com/docs/authentication/production // for more info on alternatives. creds, err := gcp.DefaultCredentials(ctx) if err != nil { log.Fatal(err) } // Connect to the Runtime Configurator service. client, cleanup, err := gcpruntimeconfig.Dial(ctx, creds.TokenSource) if err != nil { log.Fatal(err) } defer cleanup() // You can use the VariableKey helper to construct a Variable key from // your project ID, config ID, and the variable name; alternatively, // you can construct the full string yourself (e.g., // "projects/gcp-project-id/configs/config-id/variables/variable-name"). // See https://cloud.google.com/deployment-manager/runtime-configurator/ // for more details. // // For this example, the GCP Cloud Runtime Configurator variable being // referenced should have a JSON string that decodes into MyConfig. variableKey := gcpruntimeconfig.VariableKey("gcp-project-id", "config-id", "variable-name") // Construct a *runtimevar.Variable that watches the variable. v, err := gcpruntimeconfig.OpenVariable(client, variableKey, runtimevar.StringDecoder, nil) if err != nil { log.Fatal(err) } defer v.Close() } func Example_openVariableFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/runtimevar/gcpruntimeconfig" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // runtimevar.OpenVariable creates a *runtimevar.Variable from a URL. // The URL Host+Path are used as the GCP Runtime Configurator Variable key; // see https://cloud.google.com/deployment-manager/runtime-configurator/ // for more details. v, err := runtimevar.OpenVariable(ctx, "gcpruntimeconfig://projects/myproject/configs/myconfigid/variables/myvar?decoder=string") if err != nil { log.Fatal(err) } defer v.Close() } ================================================ FILE: runtimevar/gcpruntimeconfig/gcpruntimeconfig.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package gcpruntimeconfig provides a runtimevar implementation with // variables read from GCP Cloud Runtime Configurator // (https://cloud.google.com/deployment-manager/runtime-configurator). // Use OpenVariable to construct a *runtimevar.Variable. // // # URLs // // For runtimevar.OpenVariable, gcpruntimeconfig registers for the scheme // "gcpruntimeconfig". // The default URL opener will creating a connection using use default // credentials from the environment, as described in // https://cloud.google.com/docs/authentication/production. // To customize the URL opener, or for more details on the URL format, // see URLOpener. // See https://gocloud.dev/concepts/urls/ for background information. // // # As // // gcpruntimeconfig exposes the following types for As: // - Snapshot: *pb.Variable // - Error: *status.Status package gcpruntimeconfig // import "gocloud.dev/runtimevar/gcpruntimeconfig" import ( "bytes" "context" "fmt" "net/url" "path" "regexp" "sync" "time" "github.com/google/wire" "gocloud.dev/gcerrors" "gocloud.dev/gcp" "gocloud.dev/internal/gcerr" "gocloud.dev/internal/useragent" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/driver" pb "google.golang.org/genproto/googleapis/cloud/runtimeconfig/v1beta1" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials/oauth" "google.golang.org/grpc/status" ) const ( // endpoint is the address of the GCP Runtime Configurator API. endPoint = "runtimeconfig.googleapis.com:443" ) // Dial opens a gRPC connection to the Runtime Configurator API using // credentials from ts. It is provided as an optional helper with useful // defaults. // // The second return value is a function that should be called to clean up // the connection opened by Dial. func Dial(ctx context.Context, ts gcp.TokenSource) (pb.RuntimeConfigManagerClient, func(), error) { conn, err := grpc.DialContext(ctx, endPoint, grpc.WithTransportCredentials(credentials.NewClientTLSFromCert(nil, "")), grpc.WithPerRPCCredentials(oauth.TokenSource{TokenSource: ts}), useragent.GRPCDialOption("runtimevar"), ) if err != nil { return nil, nil, err } return pb.NewRuntimeConfigManagerClient(conn), func() { conn.Close() }, nil } func init() { runtimevar.DefaultURLMux().RegisterVariable(Scheme, new(lazyCredsOpener)) } // Set holds Wire providers for this package. var Set = wire.NewSet( Dial, wire.Struct(new(URLOpener), "Client"), ) // lazyCredsOpener obtains Application Default Credentials on the first call // to OpenVariableURL. type lazyCredsOpener struct { init sync.Once opener *URLOpener err error } func (o *lazyCredsOpener) OpenVariableURL(ctx context.Context, u *url.URL) (*runtimevar.Variable, error) { o.init.Do(func() { creds, err := gcp.DefaultCredentials(ctx) if err != nil { o.err = err return } client, _, err := Dial(ctx, creds.TokenSource) if err != nil { o.err = err return } o.opener = &URLOpener{Client: client} }) if o.err != nil { return nil, fmt.Errorf("open variable %v: %v", u, o.err) } return o.opener.OpenVariableURL(ctx, u) } // Scheme is the URL scheme gcpruntimeconfig registers its URLOpener under on runtimevar.DefaultMux. const Scheme = "gcpruntimeconfig" // URLOpener opens gcpruntimeconfig URLs like "gcpruntimeconfig://projects/[project_id]/configs/[CONFIG_ID]/variables/[VARIABLE_NAME]". // // The URL Host+Path are used as the GCP Runtime Configurator Variable key; // see https://cloud.google.com/deployment-manager/runtime-configurator/ // for more details. // // The following query parameters are supported: // // - decoder: The decoder to use. Defaults to URLOpener.Decoder, or // runtimevar.BytesDecoder if URLOpener.Decoder is nil. // See runtimevar.DecoderByName for supported values. // - wait: The poll interval, in time.ParseDuration formats. // Defaults to 30s. type URLOpener struct { // Client must be set to a non-nil client authenticated with // Cloud RuntimeConfigurator scope or equivalent. Client pb.RuntimeConfigManagerClient // Decoder specifies the decoder to use if one is not specified in the URL. // Defaults to runtimevar.BytesDecoder. Decoder *runtimevar.Decoder // Options specifies the options to pass to New. Options Options } // OpenVariableURL opens a gcpruntimeconfig Variable for u. func (o *URLOpener) OpenVariableURL(ctx context.Context, u *url.URL) (*runtimevar.Variable, error) { q := u.Query() decoderName := q.Get("decoder") q.Del("decoder") decoder, err := runtimevar.DecoderByName(ctx, decoderName, o.Decoder) if err != nil { return nil, fmt.Errorf("open variable %v: invalid decoder: %v", u, err) } opts := o.Options if s := q.Get("wait"); s != "" { q.Del("wait") d, err := time.ParseDuration(s) if err != nil { return nil, fmt.Errorf("open variable %v: invalid wait %q: %v", u, s, err) } opts.WaitDuration = d } for param := range q { return nil, fmt.Errorf("open variable %v: invalid query parameter %q", u, param) } return OpenVariable(o.Client, path.Join(u.Host, u.Path), decoder, &opts) } // Options sets options. type Options struct { // WaitDuration controls the rate at which Parameter Store is polled. // Defaults to 30 seconds. WaitDuration time.Duration } // OpenVariable constructs a *runtimevar.Variable backed by variableKey in // GCP Cloud Runtime Configurator. // // A variableKey will look like: // // projects/[project_id]/configs/[CONFIG_ID]/variables/[VARIABLE_NAME] // // You can use the full string (e.g., copied from the GCP Console), or // construct one from its parts using VariableKey. // // See https://cloud.google.com/deployment-manager/runtime-configurator/ for // more details. // // Runtime Configurator returns raw bytes; provide a decoder to decode the raw bytes // into the appropriate type for runtimevar.Snapshot.Value. // See the runtimevar package documentation for examples of decoders. func OpenVariable(client pb.RuntimeConfigManagerClient, variableKey string, decoder *runtimevar.Decoder, opts *Options) (*runtimevar.Variable, error) { w, err := newWatcher(client, variableKey, decoder, opts) if err != nil { return nil, err } return runtimevar.New(w), nil } var variableKeyRE = regexp.MustCompile("^projects/.+/configs/.+/variables/.+$") func newWatcher(client pb.RuntimeConfigManagerClient, variableKey string, decoder *runtimevar.Decoder, opts *Options) (driver.Watcher, error) { if opts == nil { opts = &Options{} } if !variableKeyRE.MatchString(variableKey) { return nil, fmt.Errorf("invalid variableKey %q; must match %v", variableKey, variableKeyRE) } return &watcher{ client: client, wait: driver.WaitDuration(opts.WaitDuration), name: variableKey, decoder: decoder, }, nil } // VariableKey constructs a GCP Runtime Configurator variable key from // component parts. See // https://cloud.google.com/deployment-manager/runtime-configurator/ // for more details. func VariableKey(projectID gcp.ProjectID, configID, variableName string) string { return fmt.Sprintf("projects/%s/configs/%s/variables/%s", projectID, configID, variableName) } // state implements driver.State. type state struct { val any raw *pb.Variable updateTime time.Time rawBytes []byte err error } // Value implements driver.State.Value. func (s *state) Value() (any, error) { return s.val, s.err } // UpdateTime implements driver.State.UpdateTime. func (s *state) UpdateTime() time.Time { return s.updateTime } // As implements driver.State.As. func (s *state) As(i any) bool { if s.raw == nil { return false } p, ok := i.(**pb.Variable) if !ok { return false } *p = s.raw return true } // errorState returns a new State with err, unless prevS also represents // the same error, in which case it returns nil. func errorState(err error, prevS driver.State) driver.State { s := &state{err: err} if prevS == nil { return s } prev := prevS.(*state) if prev.err == nil { // New error. return s } if equivalentError(err, prev.err) { // Same error, return nil to indicate no change. return nil } return s } // equivalentError returns true iff err1 and err2 represent an equivalent error; // i.e., we don't want to return it to the user as a different error. func equivalentError(err1, err2 error) bool { if err1 == err2 || err1.Error() == err2.Error() { return true } code1, code2 := status.Code(err1), status.Code(err2) return code1 != codes.OK && code1 != codes.Unknown && code1 == code2 } // watcher implements driver.Watcher for configurations provided by the Runtime Configurator // service. type watcher struct { client pb.RuntimeConfigManagerClient wait time.Duration name string decoder *runtimevar.Decoder } // WatchVariable implements driver.WatchVariable. func (w *watcher) WatchVariable(ctx context.Context, prev driver.State) (driver.State, time.Duration) { // Get the variable from the backend. vpb, err := w.client.GetVariable(ctx, &pb.GetVariableRequest{Name: w.name}) if err != nil { return errorState(err, prev), w.wait } updateTime, err := parseUpdateTime(vpb) if err != nil { return errorState(err, prev), w.wait } // See if it's the same raw bytes as before. b := bytesFromProto(vpb) if prev != nil && bytes.Equal(b, prev.(*state).rawBytes) { // No change! return nil, w.wait } // Decode the value. val, err := w.decoder.Decode(ctx, b) if err != nil { return errorState(err, prev), w.wait } return &state{val: val, raw: vpb, updateTime: updateTime, rawBytes: b}, w.wait } // Close implements driver.Close. func (w *watcher) Close() error { return nil } // ErrorAs implements driver.ErrorAs. func (w *watcher) ErrorAs(err error, i any) bool { // FromError converts err to a *status.Status. s, _ := status.FromError(err) if p, ok := i.(**status.Status); ok { *p = s return true } return false } // ErrorCode implements driver.ErrorCode. func (*watcher) ErrorCode(err error) gcerrors.ErrorCode { return gcerr.GRPCCode(err) } func bytesFromProto(vpb *pb.Variable) []byte { // Proto may contain either bytes or text. If it contains text content, convert that to []byte. if _, isBytes := vpb.GetContents().(*pb.Variable_Value); isBytes { return vpb.GetValue() } return []byte(vpb.GetText()) } func parseUpdateTime(vpb *pb.Variable) (time.Time, error) { return vpb.GetUpdateTime().AsTime(), nil } ================================================ FILE: runtimevar/gcpruntimeconfig/gcpruntimeconfig_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcpruntimeconfig import ( "context" "errors" "fmt" "testing" "gocloud.dev/internal/testing/setup" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/driver" "gocloud.dev/runtimevar/drivertest" pb "google.golang.org/genproto/googleapis/cloud/runtimeconfig/v1beta1" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) // This constant records the project used for the last --record. // If you want to use --record mode, // 1. Update this constant to your GCP project ID. // 2. Ensure that the "Runtime Configuration API" is enabled for your project. // TODO(issue #300): Use Terraform to get this. const projectID = "go-cloud-test-216917" const ( // configID is the runtimeconfig high-level config that variables sit under. configID = "go_cloud_runtimeconfigurator_test" ) func configPath() string { return fmt.Sprintf("projects/%s/configs/%s", projectID, configID) } func variableKey(variableName string) string { return VariableKey(projectID, configID, variableName) } type harness struct { client pb.RuntimeConfigManagerClient closer func() } func newHarness(t *testing.T) (drivertest.Harness, error) { t.Helper() ctx := context.Background() conn, done := setup.NewGCPgRPCConn(ctx, t, endPoint, "runtimevar") client := pb.NewRuntimeConfigManagerClient(conn) // Ignore errors if the config already exists. _, _ = client.CreateConfig(ctx, &pb.CreateConfigRequest{ Parent: "projects/" + projectID, Config: &pb.RuntimeConfig{ Name: configPath(), Description: t.Name(), }, }) return &harness{ client: client, closer: func() { _, _ = client.DeleteConfig(ctx, &pb.DeleteConfigRequest{Name: configPath()}) done() }, }, nil } func (h *harness) MakeWatcher(ctx context.Context, name string, decoder *runtimevar.Decoder) (driver.Watcher, error) { return newWatcher(h.client, variableKey(name), decoder, nil) } func (h *harness) CreateVariable(ctx context.Context, name string, val []byte) error { _, err := h.client.CreateVariable(ctx, &pb.CreateVariableRequest{ Parent: configPath(), Variable: &pb.Variable{ Name: variableKey(name), Contents: &pb.Variable_Value{Value: val}, }, }) return err } func (h *harness) UpdateVariable(ctx context.Context, name string, val []byte) error { _, err := h.client.UpdateVariable(ctx, &pb.UpdateVariableRequest{ Name: variableKey(name), Variable: &pb.Variable{ Contents: &pb.Variable_Value{Value: val}, }, }) return err } func (h *harness) DeleteVariable(ctx context.Context, name string) error { _, err := h.client.DeleteVariable(ctx, &pb.DeleteVariableRequest{Name: variableKey(name)}) return err } func (h *harness) Close() { h.closer() } func (h *harness) Mutable() bool { return true } func TestConformance(t *testing.T) { drivertest.RunConformanceTests(t, newHarness, []drivertest.AsTest{verifyAs{}}) } type verifyAs struct{} func (verifyAs) Name() string { return "verify As" } func (verifyAs) SnapshotCheck(s *runtimevar.Snapshot) error { var v *pb.Variable if !s.As(&v) { return errors.New("Snapshot.As failed") } return nil } func (verifyAs) ErrorCheck(v *runtimevar.Variable, err error) error { var s *status.Status if !v.ErrorAs(err, &s) { return errors.New("runtimevar.ErrorAs failed") } return nil } // Runtimeconfigurator-specific tests. func TestEquivalentError(t *testing.T) { tests := []struct { Err1, Err2 error Want bool }{ {Err1: errors.New("not grpc"), Err2: errors.New("not grpc"), Want: true}, {Err1: errors.New("not grpc"), Err2: errors.New("not grpc but different")}, {Err1: errors.New("not grpc"), Err2: status.Errorf(codes.Internal, "fail")}, {Err1: status.Errorf(codes.Internal, "fail"), Err2: status.Errorf(codes.InvalidArgument, "fail")}, {Err1: status.Errorf(codes.Internal, "fail"), Err2: status.Errorf(codes.Internal, "fail"), Want: true}, } for _, test := range tests { got := equivalentError(test.Err1, test.Err2) if got != test.Want { t.Errorf("%v vs %v: got %v want %v", test.Err1, test.Err2, got, test.Want) } } } func TestNoConnectionError(t *testing.T) { ctx := context.Background() creds, err := setup.FakeGCPCredentials(ctx) if err != nil { t.Fatal(err) } // Connect to the Runtime Configurator service. client, cleanup, err := Dial(ctx, creds.TokenSource) if err != nil { t.Fatal(err) } defer cleanup() variableKey := VariableKey("gcp-project-id", "cfg-name", "cfg-variable-name") v, err := OpenVariable(client, variableKey, nil, nil) if err != nil { t.Fatal(err) } defer v.Close() _, err = v.Watch(context.Background()) if err == nil { t.Error("got nil want error") } } func TestOpenVariable(t *testing.T) { cleanup := setup.FakeGCPDefaultCredentials(t) defer cleanup() tests := []struct { URL string WantErr bool }{ // OK. {"gcpruntimeconfig://projects/myproject/configs/mycfg/variables/myvar", false}, // OK, hierarchical key name. {"gcpruntimeconfig://projects/myproject/configs/mycfg/variables/myvar1/myvar2", false}, // OK, setting decoder. {"gcpruntimeconfig://projects/myproject/configs/mycfg/variables/myvar?decoder=string", false}, // Missing projects prefix. {"gcpruntimeconfig://project/myproject/configs/mycfg/variables/myvar", true}, // Missing project. {"gcpruntimeconfig://projects//configs/mycfg/variables/myvar", true}, // Missing configs. {"gcpruntimeconfig://projects/myproject/mycfg/variables/myvar", true}, // Missing configID. {"gcpruntimeconfig://projects/myproject/configs//variables/myvar", true}, // Missing variables. {"gcpruntimeconfig://projects/myproject/configs/mycfg//myvar", true}, // Missing variable name. {"gcpruntimeconfig://projects/myproject/configs/mycfg/variables/", true}, // Invalid decoder. {"gcpruntimeconfig://myproject/mycfg/myvar?decoder=notadecoder", true}, // Invalid param. {"gcpruntimeconfig://myproject/mycfg/myvar?param=value", true}, // OK, setting wait. {"gcpruntimeconfig://projects/myproject/configs/mycfg/variables/myvar?wait=1m", false}, // Invalid wait. {"gcpruntimeconfig://projects/myproject/configs/mycfg/variables/myvar?wait=xx", true}, } ctx := context.Background() for _, test := range tests { v, err := runtimevar.OpenVariable(ctx, test.URL) if v != nil { defer v.Close() } if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } } } ================================================ FILE: runtimevar/gcpsecretmanager/example_test.go ================================================ // Copyright 2020 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcpsecretmanager_test import ( "context" "log" "gocloud.dev/gcp" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/gcpsecretmanager" ) func ExampleOpenVariable() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // Your GCP credentials. // See https://cloud.google.com/docs/authentication/production // for more info on alternatives. creds, err := gcp.DefaultCredentials(ctx) if err != nil { log.Fatal(err) } // Connect to the GCP Secret Manager service. client, cleanup, err := gcpsecretmanager.Dial(ctx, creds.TokenSource) if err != nil { log.Fatal(err) } defer cleanup() // You can use the SecretKey helper to construct a secret key from // your project ID and the secret ID; alternatively, // you can construct the full string yourself (e.g., // "projects/gcp-project-id/secrets/secret-id"). // gcpsecretmanager package will always use the latest secret value, // so `/version/latest` postfix must NOT be added to the secret key. // See https://cloud.google.com/secret-manager // for more details. // // For this example, the GCP Secret Manager secret being // referenced should have a JSON string that decodes into MyConfig. variableKey := gcpsecretmanager.SecretKey("gcp-project-id", "secret-id") // Construct a *runtimevar.Variable that watches the variable. v, err := gcpsecretmanager.OpenVariable(client, variableKey, runtimevar.StringDecoder, nil) if err != nil { log.Fatal(err) } defer v.Close() } func Example_openVariableFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/runtimevar/gcpsecretmanager" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // runtimevar.OpenVariable creates a *runtimevar.Variable from a URL. // The URL Host+Path are used as the GCP Secret Manager secret key; // see https://cloud.google.com/secret-manager // for more details. v, err := runtimevar.OpenVariable(ctx, "gcpsecretmanager://projects/myproject/secrets/mysecret?decoder=string") if err != nil { log.Fatal(err) } defer v.Close() } ================================================ FILE: runtimevar/gcpsecretmanager/gcpsecretmanager.go ================================================ // Copyright 2020 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package gcpsecretmanager provides a runtimevar implementation with // secrets read from GCP Secret Manager // (https://cloud.google.com/secret-manager). // Use OpenVariable to construct a *runtimevar.Variable. // // # URLs // // For runtimevar.OpenVariable, gcpsecretmanager registers for the scheme // "gcpsecretmanager". // The default URL opener will creating a connection using use default // credentials from the environment, as described in // https://cloud.google.com/docs/authentication/production. // To customize the URL opener, or for more details on the URL format, // see URLOpener. // See https://gocloud.dev/concepts/urls/ for background information. // // # As // // gcpsecretmanager exposes the following types for As: // - Snapshot: *secretmanagerpb.AccessSecretVersionResponse // - Error: *status.Status package gcpsecretmanager // import "gocloud.dev/runtimevar/gcpsecretmanager" import ( "bytes" "context" "errors" "fmt" "net/url" "path" "regexp" "sync" "time" secretmanager "cloud.google.com/go/secretmanager/apiv1" "cloud.google.com/go/secretmanager/apiv1/secretmanagerpb" "github.com/google/wire" "gocloud.dev/gcerrors" "gocloud.dev/gcp" "gocloud.dev/internal/gcerr" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/driver" "google.golang.org/api/option" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials/oauth" "google.golang.org/grpc/status" ) // Dial opens a gRPC connection to the Secret Manager API using // credentials from ts. It is provided as an optional helper with useful // defaults. // // The second return value is a function that should be called to clean up // the connection opened by Dial. func Dial(ctx context.Context, ts gcp.TokenSource) (*secretmanager.Client, func(), error) { client, err := secretmanager.NewClient(ctx, option.WithGRPCDialOption( grpc.WithTransportCredentials(credentials.NewClientTLSFromCert(nil, "")), ), option.WithTokenSource(oauth.TokenSource{TokenSource: ts}), option.WithUserAgent("runtimevar"), ) if err != nil { return nil, nil, err } return client, func() { _ = client.Close() }, nil } func init() { runtimevar.DefaultURLMux().RegisterVariable(Scheme, new(lazyCredsOpener)) } // Set holds Wire providers for this package. var Set = wire.NewSet( Dial, wire.Struct(new(URLOpener), "Client"), ) // lazyCredsOpener obtains Application Default Credentials on the first call // to OpenVariableURL. type lazyCredsOpener struct { init sync.Once opener *URLOpener err error } func (o *lazyCredsOpener) OpenVariableURL(ctx context.Context, u *url.URL) (*runtimevar.Variable, error) { o.init.Do(func() { creds, err := gcp.DefaultCredentials(ctx) if err != nil { o.err = err return } client, _, err := Dial(ctx, creds.TokenSource) if err != nil { o.err = err return } o.opener = &URLOpener{Client: client} }) if o.err != nil { return nil, fmt.Errorf("open variable %v: %v", u, o.err) } return o.opener.OpenVariableURL(ctx, u) } // Scheme is the URL scheme gcpsecretmanager registers its URLOpener under on runtimevar.DefaultMux. const Scheme = "gcpsecretmanager" // URLOpener opens gcpsecretmanager URLs like "gcpsecretmanager://projects/[project_id]/secrets/[secret_id]". // // The URL Host+Path are used as the GCP Secret Manager secret key; // see https://cloud.google.com/secret-manager // for more details. // // The following query parameters are supported: // // - decoder: The decoder to use. Defaults to URLOpener.Decoder, or // runtimevar.BytesDecoder if URLOpener.Decoder is nil. // See runtimevar.DecoderByName for supported values. // - wait: The poll interval, in time.ParseDuration formats. // Defaults to 30s. type URLOpener struct { // Client must be set to a non-nil client authenticated with // Secret Manager scope or equivalent. Client *secretmanager.Client // Decoder specifies the decoder to use if one is not specified in the URL. // Defaults to runtimevar.BytesDecoder. Decoder *runtimevar.Decoder // Options specifies the options to pass to New. Options Options } // OpenVariableURL opens a gcpsecretmanager Secret. func (o *URLOpener) OpenVariableURL(ctx context.Context, u *url.URL) (*runtimevar.Variable, error) { q := u.Query() decoderName := q.Get("decoder") q.Del("decoder") decoder, err := runtimevar.DecoderByName(ctx, decoderName, o.Decoder) if err != nil { return nil, fmt.Errorf("open variable %v: invalid decoder: %v", u, err) } opts := o.Options if s := q.Get("wait"); s != "" { q.Del("wait") d, err := time.ParseDuration(s) if err != nil { return nil, fmt.Errorf("open variable %v: invalid wait %q: %v", u, s, err) } opts.WaitDuration = d } for param := range q { return nil, fmt.Errorf("open variable %v: invalid query parameter %q", u, param) } return OpenVariable(o.Client, path.Join(u.Host, u.Path), decoder, &opts) } // Options sets options. type Options struct { // WaitDuration controls the rate at which Secret Manager is polled. // Defaults to 30 seconds. WaitDuration time.Duration } // OpenVariable constructs a *runtimevar.Variable backed by secretKey in GCP Secret Manager. // // A secretKey will look like: // // projects/[project_id]/secrets/[secret_id] // // A project ID is a unique, user-assigned ID of the Project. // It must be 6 to 30 lowercase letters, digits, or hyphens. // It must start with a letter. Trailing hyphens are prohibited. // // A secret ID is a string with a maximum length of 255 characters and can // contain uppercase and lowercase letters, numerals, and the hyphen (`-`) and // underscore (`_`) characters. // // gcpsecretmanager package will always use the latest secret value, // so `/version/latest` postfix must NOT be added to the secret key. // // You can use the full string (e.g., copied from the GCP Console), or // construct one from its parts using SecretKey. // // See https://cloud.google.com/secret-manager for more details. // // Secret Manager returns raw bytes; provide a decoder to decode the raw bytes // into the appropriate type for runtimevar.Snapshot.Value. // See the runtimevar package documentation for examples of decoders. func OpenVariable(client *secretmanager.Client, secretKey string, decoder *runtimevar.Decoder, opts *Options) (*runtimevar.Variable, error) { w, err := newWatcher(client, secretKey, decoder, opts) if err != nil { return nil, err } return runtimevar.New(w), nil } var secretKeyRE = regexp.MustCompile(`^projects/[a-z][a-z0-9_\-]{4,28}[a-z0-9_]/secrets/[a-zA-Z0-9_\-]{1,255}$`) const latestVersion = "/versions/latest" func newWatcher(client *secretmanager.Client, secretKey string, decoder *runtimevar.Decoder, opts *Options) (driver.Watcher, error) { if opts == nil { opts = &Options{} } if !secretKeyRE.MatchString(secretKey) { return nil, fmt.Errorf("invalid secretKey %q; must match %v", secretKey, secretKeyRE) } return &watcher{ client: client, wait: driver.WaitDuration(opts.WaitDuration), name: secretKey, decoder: decoder, }, nil } // SecretKey constructs a GCP Secret Manager secret key from component parts. // See https://cloud.google.com/secret-manager for more details. func SecretKey(projectID gcp.ProjectID, secretID string) string { return "projects/" + string(projectID) + "/secrets/" + secretID } // state implements driver.State. type state struct { val any raw *secretmanagerpb.AccessSecretVersionResponse updateTime time.Time rawBytes []byte err error } // Value implements driver.State.Value. func (s *state) Value() (any, error) { return s.val, s.err } // UpdateTime implements driver.State.UpdateTime. func (s *state) UpdateTime() time.Time { return s.updateTime } // As implements driver.State.As. func (s *state) As(i any) bool { if s.raw == nil { return false } p, ok := i.(**secretmanagerpb.AccessSecretVersionResponse) if !ok { return false } *p = s.raw return true } // errorState returns a new State with err, unless prevS also represents // the same error, in which case it returns nil. func errorState(err error, prevS driver.State) driver.State { s := &state{err: err} if prevS == nil { return s } prev := prevS.(*state) if prev.err == nil { // New error. return s } if equivalentError(err, prev.err) { // Same error, return nil to indicate no change. return nil } return s } // equivalentError returns true iff err1 and err2 represent an equivalent error; // i.e., we don't want to return it to the user as a different error. func equivalentError(err1, err2 error) bool { if err1 == err2 || err1.Error() == err2.Error() { return true } code1, code2 := status.Code(err1), status.Code(err2) return code1 != codes.OK && code1 != codes.Unknown && code1 == code2 } // watcher implements driver.Watcher for secrets provided by the Secret Manager service. type watcher struct { client *secretmanager.Client wait time.Duration name string decoder *runtimevar.Decoder } // WatchVariable implements driver.WatchVariable. func (w *watcher) WatchVariable(ctx context.Context, prev driver.State) (driver.State, time.Duration) { latest := w.name + latestVersion secret, err := w.client.AccessSecretVersion(ctx, &secretmanagerpb.AccessSecretVersionRequest{Name: latest}) if err != nil { return errorState(err, prev), w.wait } if secret == nil || secret.Payload == nil || secret.Payload.Data == nil { return errorState(errors.New("invalid secret payload"), prev), w.wait } meta, err := w.client.GetSecretVersion(ctx, &secretmanagerpb.GetSecretVersionRequest{Name: latest}) if err != nil { return errorState(err, prev), w.wait } createTime := meta.CreateTime.AsTime() // See if it's the same raw bytes as before. if prev != nil { prevState, ok := prev.(*state) if ok && prevState != nil && bytes.Equal(secret.Payload.Data, prevState.rawBytes) { // No change! return nil, w.wait } } // Decode the value. val, err := w.decoder.Decode(ctx, secret.Payload.Data) if err != nil { return errorState(err, prev), w.wait } // A secret version is immutable. // The latest secret value creation time is the last time the secret value has been changed. // Hence set updateTime as createTime. return &state{val: val, raw: secret, updateTime: createTime, rawBytes: secret.Payload.Data}, w.wait } // Close implements driver.Close. func (w *watcher) Close() error { return nil } // ErrorAs implements driver.ErrorAs. func (w *watcher) ErrorAs(err error, i any) bool { // FromError converts err to a *status.Status. s, _ := status.FromError(err) if p, ok := i.(**status.Status); ok { *p = s return true } return false } // ErrorCode implements driver.ErrorCode. func (*watcher) ErrorCode(err error) gcerrors.ErrorCode { return gcerr.GRPCCode(err) } ================================================ FILE: runtimevar/gcpsecretmanager/gcpsecretmanager_test.go ================================================ // Copyright 2020 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcpsecretmanager import ( "context" "errors" "fmt" "testing" secretmanager "cloud.google.com/go/secretmanager/apiv1" "cloud.google.com/go/secretmanager/apiv1/secretmanagerpb" "gocloud.dev/internal/gcerr" "gocloud.dev/internal/testing/setup" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/driver" "gocloud.dev/runtimevar/drivertest" "google.golang.org/api/option" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) // This constant records the project used for the last --record. // If you want to use --record mode, // 1. Update this constant to your GCP project ID. // 2. Ensure that the "Secret Manager API" is enabled for your project. // TODO(issue #300): Use Terraform to get this. const projectID = "go-cloud-test-216917" func secretKey(secretID string) string { return "projects/" + projectID + "/secrets/" + secretID } type harness struct { client *secretmanager.Client closer func() } func newHarness(t *testing.T) (drivertest.Harness, error) { t.Helper() ctx := context.Background() conn, done := setup.NewGCPgRPCConn(ctx, t, "secretmanager.googleapis.com:443", "runtimevar") client, err := secretmanager.NewClient(ctx, option.WithGRPCConn(conn)) if err != nil { return nil, err } return &harness{ client: client, closer: func() { _ = client.Close() done() }, }, nil } func (h *harness) MakeWatcher(_ context.Context, name string, decoder *runtimevar.Decoder) (driver.Watcher, error) { return newWatcher(h.client, secretKey(name), decoder, nil) } func (h *harness) CreateVariable(ctx context.Context, name string, val []byte) error { _, err := h.client.CreateSecret(ctx, &secretmanagerpb.CreateSecretRequest{ Parent: "projects/" + projectID, SecretId: name, Secret: &secretmanagerpb.Secret{ Replication: &secretmanagerpb.Replication{ Replication: &secretmanagerpb.Replication_Automatic_{ Automatic: &secretmanagerpb.Replication_Automatic{}, }, }, Labels: map[string]string{ "project": "runtimevar", }, }, }) if err != nil { return err } // Add initial secret version. _, err = h.client.AddSecretVersion(ctx, &secretmanagerpb.AddSecretVersionRequest{ Parent: secretKey(name), Payload: &secretmanagerpb.SecretPayload{Data: val}, }) return err } func (h *harness) UpdateVariable(ctx context.Context, name string, val []byte) error { _, err := h.client.AddSecretVersion(ctx, &secretmanagerpb.AddSecretVersionRequest{ Parent: secretKey(name), Payload: &secretmanagerpb.SecretPayload{Data: val}, }) return err } func (h *harness) DeleteVariable(ctx context.Context, name string) error { return h.client.DeleteSecret(ctx, &secretmanagerpb.DeleteSecretRequest{Name: secretKey(name)}) } func (h *harness) Close() { h.closer() } func (h *harness) Mutable() bool { return true } func TestConformance(t *testing.T) { drivertest.RunConformanceTests(t, newHarness, []drivertest.AsTest{verifyAs{}}) } type verifyAs struct{} func (verifyAs) Name() string { return "verify As" } func (verifyAs) SnapshotCheck(s *runtimevar.Snapshot) error { var v *secretmanagerpb.AccessSecretVersionResponse if !s.As(&v) { return errors.New("Snapshot.As failed") } return nil } func (verifyAs) ErrorCheck(v *runtimevar.Variable, err error) error { var s *status.Status if !v.ErrorAs(err, &s) { return errors.New("runtimevar.ErrorAs failed") } return nil } // Secretmanager-specific tests. func TestEquivalentError(t *testing.T) { tests := []struct { Err1, Err2 error Want bool }{ {Err1: errors.New("not grpc"), Err2: errors.New("not grpc"), Want: true}, {Err1: errors.New("not grpc"), Err2: errors.New("not grpc but different")}, {Err1: errors.New("not grpc"), Err2: status.Errorf(codes.Internal, "fail")}, {Err1: status.Errorf(codes.Internal, "fail"), Err2: status.Errorf(codes.InvalidArgument, "fail")}, {Err1: status.Errorf(codes.Internal, "fail"), Err2: status.Errorf(codes.Internal, "fail"), Want: true}, } for _, test := range tests { got := equivalentError(test.Err1, test.Err2) if got != test.Want { t.Errorf("%v vs %v: got %v want %v", test.Err1, test.Err2, got, test.Want) } } } func TestNoConnectionError(t *testing.T) { ctx := context.Background() creds, err := setup.FakeGCPCredentials(ctx) if err != nil { t.Fatal(err) } // Connect to the Secret Manager service. client, cleanup, err := Dial(ctx, creds.TokenSource) if err != nil { t.Fatal(err) } defer cleanup() key := SecretKey("gcp-project-id", "secret-name") v, err := OpenVariable(client, key, nil, nil) if err != nil { t.Fatal(err) } defer func() { if err := v.Close(); err != nil { t.Error(err) } }() _, err = v.Watch(ctx) if err == nil { t.Error("got nil want error") } } func TestOpenVariable(t *testing.T) { cleanup := setup.FakeGCPDefaultCredentials(t) defer cleanup() tests := []struct { URL string WantErr bool }{ // OK. {"gcpsecretmanager://projects/myproject/secrets/mysecret", false}, // OK, hierarchical key name. {"gcpsecretmanager://projects/myproject/secrets/mysecret2", false}, // OK, setting decoder. {"gcpsecretmanager://projects/myproject/secrets/mysecret?decoder=string", false}, // Missing projects prefix. {"gcpsecretmanager://project/myproject/secrets/mysecret", true}, // Missing project. {"gcpsecretmanager://projects//secrets/mysecret", true}, // Missing configs. {"gcpsecretmanager://projects/myproject/mysecret", true}, // Missing secretID with trailing slash. {"gcpsecretmanager://projects/myproject/secrets/", true}, // Missing secretID. {"gcpsecretmanager://projects/myproject/secrets", true}, // Invalid decoder. {"gcpsecretmanager://projects/myproject/secrets/mysecret?decoder=notadecoder", true}, // Invalid param. {"gcpsecretmanager://projects/myproject/secrets/mysecret?param=value", true}, // Setting wait. {"gcpsecretmanager://projects/myproject/secrets/mysecret?wait=1m", false}, // Invalid wait. {"gcpsecretmanager://projects/myproject/secrets/mysecret?wait=xx", true}, } ctx := context.Background() for _, test := range tests { if err := openVariable(ctx, test.URL); (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } } } func openVariable(ctx context.Context, URL string) (err error) { var v *runtimevar.Variable v, err = runtimevar.OpenVariable(ctx, URL) defer func() { if v == nil { return } if closeErr := v.Close(); closeErr != nil { if grpcErr, ok := closeErr.(*gcerr.Error); ok && grpcErr.Code != gcerr.Canceled { err = fmt.Errorf("close failed: %v. prev error: %v", closeErr, err) } } }() return err } ================================================ FILE: runtimevar/hashivault/example_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package hashivault_test import ( "context" "log" "github.com/hashicorp/vault/api" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/hashivault" ) func ExampleOpenVariable() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // Get a client to use with the Vault API. client, err := hashivault.Dial(ctx, &hashivault.Config{ Token: "CLIENT_TOKEN", APIConfig: api.Config{ Address: "http://127.0.0.1:8200", }, }) if err != nil { log.Fatal(err) } // Construct a *runtimevar.Variable that watches the secret. v, err := hashivault.OpenVariable(client, "myapp/config", runtimevar.StringDecoder, nil) if err != nil { log.Fatal(err) } defer v.Close() } func Example_openVariableFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/runtimevar/hashivault" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // runtimevar.OpenVariable creates a *runtimevar.Variable from a URL. // The default opener connects to a Vault server based on the environment // variables VAULT_SERVER_URL/VAULT_ADDR and VAULT_SERVER_TOKEN/VAULT_TOKEN. v, err := runtimevar.OpenVariable(ctx, "hashivault://myapp/config?decoder=string") if err != nil { log.Fatal(err) } defer v.Close() } ================================================ FILE: runtimevar/hashivault/go.mod ================================================ // Copyright 2018-2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. module gocloud.dev/runtimevar/hashivault go 1.25.0 require ( github.com/hashicorp/vault/api v1.22.0 gocloud.dev v0.45.0 ) require ( cloud.google.com/go/auth v0.18.2 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect github.com/aws/aws-sdk-go-v2 v1.41.4 // indirect github.com/aws/aws-sdk-go-v2/config v1.32.12 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.19.12 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 // indirect github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 // indirect github.com/aws/smithy-go v1.24.2 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/go-jose/go-jose/v4 v4.1.3 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/google/go-cmp v0.7.0 // indirect github.com/google/go-replayers/grpcreplay v1.3.0 // indirect github.com/google/go-replayers/httpreplay v1.2.0 // indirect github.com/google/martian/v3 v3.3.3 // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/google/uuid v1.6.0 // indirect github.com/google/wire v0.7.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.14 // indirect github.com/googleapis/gax-go/v2 v2.19.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-retryablehttp v0.7.8 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect github.com/hashicorp/go-secure-stdlib/parseutil v0.2.0 // indirect github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 // indirect github.com/hashicorp/go-sockaddr v1.0.7 // indirect github.com/hashicorp/hcl v1.0.1-vault-7 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/ryanuber/go-glob v1.0.0 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 // indirect go.opentelemetry.io/otel v1.42.0 // indirect go.opentelemetry.io/otel/metric v1.42.0 // indirect go.opentelemetry.io/otel/sdk v1.42.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.42.0 // indirect go.opentelemetry.io/otel/trace v1.42.0 // indirect golang.org/x/crypto v0.49.0 // indirect golang.org/x/net v0.52.0 // indirect golang.org/x/oauth2 v0.36.0 // indirect golang.org/x/sys v0.42.0 // indirect golang.org/x/text v0.35.0 // indirect golang.org/x/time v0.15.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect google.golang.org/api v0.272.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260316180232-0b37fe3546d5 // indirect google.golang.org/grpc v1.79.3 // indirect google.golang.org/protobuf v1.36.11 // indirect ) replace gocloud.dev => ../../ ================================================ FILE: runtimevar/hashivault/go.sum ================================================ cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= cloud.google.com/go/auth v0.18.2 h1:+Nbt5Ev0xEqxlNjd6c+yYUeosQ5TtEUaNcN/3FozlaM= cloud.google.com/go/auth v0.18.2/go.mod h1:xD+oY7gcahcu7G2SG2DsBerfFxgPAJz17zz2joOFF3M= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= cloud.google.com/go/kms v1.26.0 h1:cK9mN2cf+9V63D3H1f6koxTatWy39aTI/hCjz1I+adU= cloud.google.com/go/kms v1.26.0/go.mod h1:pHKOdFJm63hxBsiPkYtowZPltu9dW0MWvBa6IA4HM58= cloud.google.com/go/longrunning v0.8.0 h1:LiKK77J3bx5gDLi4SMViHixjD2ohlkwBi+mKA7EhfW8= cloud.google.com/go/longrunning v0.8.0/go.mod h1:UmErU2Onzi+fKDg2gR7dusz11Pe26aknR4kHmJJqIfk= cloud.google.com/go/monitoring v1.24.3 h1:dde+gMNc0UhPZD1Azu6at2e79bfdztVDS5lvhOdsgaE= cloud.google.com/go/monitoring v1.24.3/go.mod h1:nYP6W0tm3N9H/bOw8am7t62YTzZY+zUeQ+Bi6+2eonI= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.61.3 h1:VS//ZfBuPGDvakfD9xyPW1RGF1Vy3BWUoVZXgW1KMOg= cloud.google.com/go/storage v1.61.3/go.mod h1:JtqK8BBB7TWv0HVGHubtUdzYYrakOQIsMLffZ2Z/HWk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0 h1:DHa2U07rk8syqvCge0QIGMCE1WxGj9njT44GH7zNJLQ= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 h1:UnDZ/zFfG1JhH/DqxIZYU/1CUAlTUScoXD/LcM2Ykk8= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0/go.mod h1:IA1C1U7jO/ENqm/vhi7V9YYpBsp+IMyqNrEN94N7tVc= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 h1:0s6TxfCu2KHkkZPnBfsQ2y5qia0jl3MMrmBhu3nCOYk= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0/go.mod h1:Mf6O40IAyB9zR/1J8nGDDPirZQQPbYJni8Yisy7NTMc= github.com/aws/aws-sdk-go-v2 v1.41.4 h1:10f50G7WyU02T56ox1wWXq+zTX9I1zxG46HYuG1hH/k= github.com/aws/aws-sdk-go-v2 v1.41.4/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o= github.com/aws/aws-sdk-go-v2/config v1.32.12 h1:O3csC7HUGn2895eNrLytOJQdoL2xyJy0iYXhoZ1OmP0= github.com/aws/aws-sdk-go-v2/config v1.32.12/go.mod h1:96zTvoOFR4FURjI+/5wY1vc1ABceROO4lWgWJuxgy0g= github.com/aws/aws-sdk-go-v2/credentials v1.19.12 h1:oqtA6v+y5fZg//tcTWahyN9PEn5eDU/Wpvc2+kJ4aY8= github.com/aws/aws-sdk-go-v2/credentials v1.19.12/go.mod h1:U3R1RtSHx6NB0DvEQFGyf/0sbrpJrluENHdPy1j/3TE= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 h1:zOgq3uezl5nznfoK3ODuqbhVg1JzAGDUhXOsU0IDCAo= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20/go.mod h1:z/MVwUARehy6GAg/yQ1GO2IMl0k++cu1ohP9zo887wE= github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 h1:CNXO7mvgThFGqOFgbNAP2nol2qAWBOGfqR/7tQlvLmc= github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20/go.mod h1:oydPDJKcfMhgfcgBUZaG+toBbwy8yPWubJXBVERtI4o= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 h1:tN6W/hg+pkM+tf9XDkWUbDEjGLb+raoBMFsTodcoYKw= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20/go.mod h1:YJ898MhD067hSHA6xYCx5ts/jEd8BSOLtQDL3iZsvbc= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 h1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 h1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 h1:2HvVAIq+YqgGotK6EkMf+KIEqTISmTYh5zLpYyeTo1Y= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20/go.mod h1:V4X406Y666khGa8ghKmphma/7C0DAtEQYhkq9z4vpbk= github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 h1:0GFOLzEbOyZABS3PhYfBIx2rNBACYcKty+XGkTgw1ow= github.com/aws/aws-sdk-go-v2/service/signin v1.0.8/go.mod h1:LXypKvk85AROkKhOG6/YEcHFPoX+prKTowKnVdcaIxE= github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 h1:kiIDLZ005EcKomYYITtfsjn7dtOwHDOFy7IbPXKek2o= github.com/aws/aws-sdk-go-v2/service/sso v1.30.13/go.mod h1:2h/xGEowcW/g38g06g3KpRWDlT+OTfxxI0o1KqayAB8= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 h1:jzKAXIlhZhJbnYwHbvUQZEB8KfgAEuG0dc08Bkda7NU= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17/go.mod h1:Al9fFsXjv4KfbzQHGe6V4NZSZQXecFcvaIF4e70FoRA= github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 h1:Cng+OOwCHmFljXIxpEVXAGMnBia8MSU6Ch5i9PgBkcU= github.com/aws/aws-sdk-go-v2/service/sts v1.41.9/go.mod h1:LrlIndBDdjA/EeXeyNBle+gyCwTlizzW5ycgWnvIxkk= github.com/aws/smithy-go v1.24.2 h1:FzA3bu/nt/vDvmnkg+R8Xl46gmzEDam6mZ1hzmwXFng= github.com/aws/smithy-go v1.24.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os8IaYg++6uMOdKK83QtkkvJik= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= github.com/envoyproxy/go-control-plane/envoy v1.37.0 h1:u3riX6BoYRfF4Dr7dwSOroNfdSbEPe9Yyl09/B6wBrQ= github.com/envoyproxy/go-control-plane/envoy v1.37.0/go.mod h1:DReE9MMrmecPy+YvQOAOHNYMALuowAnbjjEMkkWOi6A= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds= github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/go-replayers/grpcreplay v1.3.0 h1:1Keyy0m1sIpqstQmgz307zhiJ1pV4uIlFds5weTmxbo= github.com/google/go-replayers/grpcreplay v1.3.0/go.mod h1:v6NgKtkijC0d3e3RW8il6Sy5sqRVUwoQa4mHOGEy8DI= github.com/google/go-replayers/httpreplay v1.2.0 h1:VM1wEyyjaoU53BwrOnaf9VhAyQQEEioJvFYxYcLRKzk= github.com/google/go-replayers/httpreplay v1.2.0/go.mod h1:WahEFFZZ7a1P4VM1qEeHy+tME4bwyqPcwWbNlUI1Mcg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/wire v0.7.0 h1:JxUKI6+CVBgCO2WToKy/nQk0sS+amI9z9EjVmdaocj4= github.com/google/wire v0.7.0/go.mod h1:n6YbUQD9cPKTnHXEBN2DXlOp/mVADhVErcMFb0v3J18= github.com/googleapis/enterprise-certificate-proxy v0.3.14 h1:yh8ncqsbUY4shRD5dA6RlzjJaT4hi3kII+zYw8wmLb8= github.com/googleapis/enterprise-certificate-proxy v0.3.14/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.19.0 h1:fYQaUOiGwll0cGj7jmHT/0nPlcrZDFPrZRhTsoCr8hE= github.com/googleapis/gax-go/v2 v2.19.0/go.mod h1:w2ROXVdfGEVFXzmlciUU4EdjHgWvB5h2n6x/8XSTTJA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-retryablehttp v0.7.8 h1:ylXZWnqa7Lhqpk0L1P1LzDtGcCR0rPVUrx/c8Unxc48= github.com/hashicorp/go-retryablehttp v0.7.8/go.mod h1:rjiScheydd+CxvumBsIrFKlx3iS0jrZ7LvzFGFmuKbw= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-secure-stdlib/parseutil v0.2.0 h1:U+kC2dOhMFQctRfhK0gRctKAPTloZdMU5ZJxaesJ/VM= github.com/hashicorp/go-secure-stdlib/parseutil v0.2.0/go.mod h1:Ll013mhdmsVDuoIXVfBtvgGJsXDYkTw1kooNcoCXuE0= github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 h1:kes8mmyCpxJsI7FTwtzRqEy9CdjCtrXrXGuOpxEA7Ts= github.com/hashicorp/go-secure-stdlib/strutil v0.1.2/go.mod h1:Gou2R9+il93BqX25LAKCLuM+y9U2T4hlwvT1yprcna4= github.com/hashicorp/go-sockaddr v1.0.7 h1:G+pTkSO01HpR5qCxg7lxfsFEZaG+C0VssTy/9dbT+Fw= github.com/hashicorp/go-sockaddr v1.0.7/go.mod h1:FZQbEYa1pxkQ7WLpyXJ6cbjpT8q0YgQaK/JakXqGyWw= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.1-vault-7 h1:ag5OxFVy3QYTFTJODRzTKVZ6xvdfLLCA1cy/Y6xGI0I= github.com/hashicorp/hcl v1.0.1-vault-7/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM= github.com/hashicorp/vault/api v1.22.0 h1:+HYFquE35/B74fHoIeXlZIP2YADVboaPjaSicHEZiH0= github.com/hashicorp/vault/api v1.22.0/go.mod h1:IUZA2cDvr4Ok3+NtK2Oq/r+lJeXkeCrHRmqdyWfpmGM= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/detectors/gcp v1.42.0 h1:kpt2PEJuOuqYkPcktfJqWWDjTEd/FNgrxcniL7kQrXQ= go.opentelemetry.io/contrib/detectors/gcp v1.42.0/go.mod h1:W9zQ439utxymRrXsUOzZbFX4JhLxXU4+ZnCt8GG7yA8= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0 h1:yI1/OhfEPy7J9eoa6Sj051C7n5dvpj0QX8g4sRchg04= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0/go.mod h1:NoUCKYWK+3ecatC4HjkRktREheMeEtrXoQxrqYFeHSc= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 h1:OyrsyzuttWTSur2qN/Lm0m2a8yqyIjUVBZcxFPuXq2o= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0/go.mod h1:C2NGBr+kAB4bk3xtMXfZ94gqFDtg/GkI7e9zqGh5Beg= go.opentelemetry.io/otel v1.42.0 h1:lSQGzTgVR3+sgJDAU/7/ZMjN9Z+vUip7leaqBKy4sho= go.opentelemetry.io/otel v1.42.0/go.mod h1:lJNsdRMxCUIWuMlVJWzecSMuNjE7dOYyWlqOXWkdqCc= go.opentelemetry.io/otel/metric v1.42.0 h1:2jXG+3oZLNXEPfNmnpxKDeZsFI5o4J+nz6xUlaFdF/4= go.opentelemetry.io/otel/metric v1.42.0/go.mod h1:RlUN/7vTU7Ao/diDkEpQpnz3/92J9ko05BIwxYa2SSI= go.opentelemetry.io/otel/sdk v1.42.0 h1:LyC8+jqk6UJwdrI/8VydAq/hvkFKNHZVIWuslJXYsDo= go.opentelemetry.io/otel/sdk v1.42.0/go.mod h1:rGHCAxd9DAph0joO4W6OPwxjNTYWghRWmkHuGbayMts= go.opentelemetry.io/otel/sdk/metric v1.42.0 h1:D/1QR46Clz6ajyZ3G8SgNlTJKBdGp84q9RKCAZ3YGuA= go.opentelemetry.io/otel/sdk/metric v1.42.0/go.mod h1:Ua6AAlDKdZ7tdvaQKfSmnFTdHx37+J4ba8MwVCYM5hc= go.opentelemetry.io/otel/trace v1.42.0 h1:OUCgIPt+mzOnaUTpOQcBiM/PLQ/Op7oq6g4LenLmOYY= go.opentelemetry.io/otel/trace v1.42.0/go.mod h1:f3K9S+IFqnumBkKhRJMeaZeNk9epyhnCmQh/EysQCdc= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= google.golang.org/api v0.272.0 h1:eLUQZGnAS3OHn31URRf9sAmRk3w2JjMx37d2k8AjJmA= google.golang.org/api v0.272.0/go.mod h1:wKjowi5LNJc5qarNvDCvNQBn3rVK8nSy6jg2SwRwzIA= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20260316180232-0b37fe3546d5 h1:JNfk58HZ8lfmXbYK2vx/UvsqIL59TzByCxPIX4TDmsE= google.golang.org/genproto v0.0.0-20260316180232-0b37fe3546d5/go.mod h1:x5julN69+ED4PcFk/XWayw35O0lf/nGa4aNgODCmNmw= google.golang.org/genproto/googleapis/api v0.0.0-20260316180232-0b37fe3546d5 h1:CogIeEXn4qWYzzQU0QqvYBM8yDF9cFYzDq9ojSpv0Js= google.golang.org/genproto/googleapis/api v0.0.0-20260316180232-0b37fe3546d5/go.mod h1:EIQZ5bFCfRQDV4MhRle7+OgjNtZ6P1PiZBgAKuxXu/Y= google.golang.org/genproto/googleapis/rpc v0.0.0-20260316180232-0b37fe3546d5 h1:aJmi6DVGGIStN9Mobk/tZOOQUBbj0BPjZjjnOdoZKts= google.golang.org/genproto/googleapis/rpc v0.0.0-20260316180232-0b37fe3546d5/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= ================================================ FILE: runtimevar/hashivault/hashivault.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package hashivault provides a runtimevar implementation with variables // backed by HashiCorp Vault's KV Secrets Engine. // Use OpenVariable to construct a *runtimevar.Variable. // // # URLs // // For runtimevar.OpenVariable, hashivault registers for the scheme "hashivault". // The default URL opener will dial a Vault server using the environment variables // "VAULT_SERVER_URL" (or "VAULT_ADDR") and "VAULT_SERVER_TOKEN" (or "VAULT_TOKEN"). // To customize the URL opener, or for more details on the URL format, // see URLOpener. // See https://gocloud.dev/concepts/urls/ for background information. // // # As // // hashivault exposes the following types for As: // - Snapshot: *api.Secret // - Error: *SecretError, *api.ResponseError package hashivault // import "gocloud.dev/runtimevar/hashivault" import ( "bytes" "context" "encoding/json" "errors" "fmt" "net/url" "os" "path" "strconv" "sync" "time" "github.com/hashicorp/vault/api" "gocloud.dev/gcerrors" "gocloud.dev/internal/gcerr" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/driver" ) func init() { runtimevar.DefaultURLMux().RegisterVariable(Scheme, new(defaultDialer)) } // Scheme is the URL scheme hashivault registers its URLOpener under on runtimevar.DefaultMux. const Scheme = "hashivault" // SecretError represents an error from a Vault operation. type SecretError struct { // Code is the error code (e.g., 404 for not found). Code int // Message is the error message. Message string } func (e *SecretError) Error() string { return fmt.Sprintf("hashivault: %s (code %d)", e.Message, e.Code) } func newNotFoundError(path string) *SecretError { return &SecretError{ Code: 404, Message: fmt.Sprintf("secret not found at path %q", path), } } func newInvalidDataError(path, reason string) *SecretError { return &SecretError{ Code: 400, Message: fmt.Sprintf("invalid data at path %q: %s", path, reason), } } // Config is the authentication configuration for the Vault server. type Config struct { // Token is the access token the Vault client uses to talk to the server. // See https://www.vaultproject.io/docs/concepts/tokens.html for more // information. Token string // APIConfig is used to configure the creation of the client. APIConfig api.Config } // Dial creates a Vault API client using the provided configuration. func Dial(ctx context.Context, cfg *Config) (*api.Client, error) { if cfg == nil { return nil, errors.New("no auth Config provided") } c, err := api.NewClient(&cfg.APIConfig) if err != nil { return nil, err } if cfg.Token != "" { c.SetToken(cfg.Token) } return c, nil } func getVaultURL() (string, error) { if url := os.Getenv("VAULT_SERVER_URL"); url != "" { return url, nil } if url := os.Getenv("VAULT_ADDR"); url != "" { return url, nil } return "", errors.New("neither VAULT_SERVER_URL nor VAULT_ADDR environment variables are set") } func getVaultToken() string { if token := os.Getenv("VAULT_SERVER_TOKEN"); token != "" { return token } if token := os.Getenv("VAULT_TOKEN"); token != "" { return token } return "" } type defaultDialer struct { init sync.Once opener *URLOpener err error } func (o *defaultDialer) OpenVariableURL(ctx context.Context, u *url.URL) (*runtimevar.Variable, error) { o.init.Do(func() { serverURL, err := getVaultURL() if err != nil { o.err = err return } token := getVaultToken() cfg := Config{Token: token, APIConfig: api.Config{Address: serverURL}} client, err := Dial(ctx, &cfg) if err != nil { o.err = fmt.Errorf("failed to Dial default Vault server at %q: %v", serverURL, err) return } o.opener = &URLOpener{Client: client} }) if o.err != nil { return nil, fmt.Errorf("open variable %v: %v", u, o.err) } return o.opener.OpenVariableURL(ctx, u) } // URLOpener opens Vault URLs like "hashivault://myapp/config". // // The URL host+path are used as the secret path. // // The following query parameters are supported: // - decoder: The decoder to use. Defaults to runtimevar.BytesDecoder. // See runtimevar.DecoderByName for supported values. // - wait: The poll interval, in time.ParseDuration formats. Defaults to 30s. // - engine_version: The KV engine version (1 or 2). Defaults to 2. // - mount: The KV mount path. Defaults to "secret". type URLOpener struct { // Client must be non-nil. Client *api.Client // Decoder specifies the decoder to use if one is not specified in the URL. // Defaults to runtimevar.BytesDecoder. Decoder *runtimevar.Decoder // Options specifies the options to pass to OpenVariable. Options Options } // OpenVariableURL opens a hashivault Variable for u. func (o *URLOpener) OpenVariableURL(ctx context.Context, u *url.URL) (*runtimevar.Variable, error) { q := u.Query() decoderName := q.Get("decoder") q.Del("decoder") decoder, err := runtimevar.DecoderByName(ctx, decoderName, o.Decoder) if err != nil { return nil, fmt.Errorf("open variable %v: invalid decoder: %v", u, err) } opts := o.Options if s := q.Get("wait"); s != "" { q.Del("wait") d, err := time.ParseDuration(s) if err != nil { return nil, fmt.Errorf("open variable %v: invalid wait %q: %v", u, s, err) } opts.WaitDuration = d } if s := q.Get("engine_version"); s != "" { q.Del("engine_version") v, err := strconv.Atoi(s) if err != nil || (v != 1 && v != 2) { return nil, fmt.Errorf("open variable %v: invalid engine_version %q: must be 1 or 2", u, s) } opts.EngineVersion = v } if s := q.Get("mount"); s != "" { q.Del("mount") opts.Mount = s } for param := range q { return nil, fmt.Errorf("open variable %v: invalid query parameter %q", u, param) } secretPath := path.Join(u.Host, u.Path) return OpenVariable(o.Client, secretPath, decoder, &opts) } // Options sets options for constructing a *runtimevar.Variable backed by Vault. type Options struct { // WaitDuration controls the rate at which the Vault server is polled. // Defaults to 30 seconds. WaitDuration time.Duration // EngineVersion specifies the KV secrets engine version. // Valid values are 1 and 2. Defaults to 2 (modern KV v2). EngineVersion int // Mount is the mount path of the KV secrets engine. // Defaults to "secret". Mount string } // OpenVariable constructs a *runtimevar.Variable that uses client to read the // variable at the given path from a Vault KV secrets engine. // // The path should be the path to the secret without the mount prefix or // "data" segment (for KV v2). For example, "myapp/config". func OpenVariable(client *api.Client, secretPath string, decoder *runtimevar.Decoder, opts *Options) (*runtimevar.Variable, error) { w, err := newWatcher(client, secretPath, decoder, opts) if err != nil { return nil, err } return runtimevar.New(w), nil } func newWatcher(client *api.Client, secretPath string, decoder *runtimevar.Decoder, opts *Options) (driver.Watcher, error) { if opts == nil { opts = &Options{} } engineVersion := opts.EngineVersion if engineVersion == 0 { engineVersion = 2 } if engineVersion != 1 && engineVersion != 2 { return nil, fmt.Errorf("invalid engine_version %d; must be 1 or 2", engineVersion) } mount := opts.Mount if mount == "" { mount = "secret" } var fullPath string if engineVersion == 2 { fullPath = path.Join(mount, "data", secretPath) } else { fullPath = path.Join(mount, secretPath) } return &watcher{ client: client, path: fullPath, decoder: decoder, wait: driver.WaitDuration(opts.WaitDuration), engineVersion: engineVersion, mount: mount, }, nil } type state struct { val any raw *api.Secret rawBytes []byte updateTime time.Time err error } // Value implements driver.State.Value. func (s *state) Value() (any, error) { return s.val, s.err } // UpdateTime implements driver.State.UpdateTime. func (s *state) UpdateTime() time.Time { return s.updateTime } // As implements driver.State.As. func (s *state) As(i any) bool { if s.raw == nil { return false } p, ok := i.(**api.Secret) if !ok { return false } *p = s.raw return true } func errorState(err error, prevS driver.State) driver.State { s := &state{err: err} if prevS == nil { return s } prev := prevS.(*state) if prev.err == nil { return s } if equivalentError(err, prev.err) { return nil } return s } func equivalentError(err1, err2 error) bool { if err1 == err2 || err1.Error() == err2.Error() { return true } var secErr1, secErr2 *SecretError if errors.As(err1, &secErr1) && errors.As(err2, &secErr2) { return secErr1.Code == secErr2.Code } var respErr1, respErr2 *api.ResponseError if errors.As(err1, &respErr1) && errors.As(err2, &respErr2) { return respErr1.StatusCode == respErr2.StatusCode } return false } type watcher struct { client *api.Client path string decoder *runtimevar.Decoder wait time.Duration engineVersion int mount string } // WatchVariable implements driver.WatchVariable. func (w *watcher) WatchVariable(ctx context.Context, prev driver.State) (driver.State, time.Duration) { secret, err := w.client.Logical().ReadWithContext(ctx, w.path) if err != nil { return errorState(err, prev), w.wait } if secret == nil { return errorState(newNotFoundError(w.path), prev), w.wait } var data map[string]any if w.engineVersion == 2 { dataRaw, ok := secret.Data["data"] if !ok { return errorState(newInvalidDataError(w.path, "no data field in KV v2 response"), prev), w.wait } data, ok = dataRaw.(map[string]any) if !ok { return errorState(newInvalidDataError(w.path, "invalid data format"), prev), w.wait } } else { data = secret.Data } var rawBytes []byte if len(data) == 1 { if v, ok := data["value"]; ok { switch val := v.(type) { case string: rawBytes = []byte(val) case []byte: rawBytes = val default: rawBytes, err = json.Marshal(data) if err != nil { return errorState(err, prev), w.wait } } } else { rawBytes, err = json.Marshal(data) if err != nil { return errorState(err, prev), w.wait } } } else { rawBytes, err = json.Marshal(data) if err != nil { return errorState(err, prev), w.wait } } if prev != nil { if prevState, ok := prev.(*state); ok && bytes.Equal(rawBytes, prevState.rawBytes) { return nil, w.wait } } val, err := w.decoder.Decode(ctx, rawBytes) if err != nil { return errorState(err, prev), w.wait } return &state{ val: val, raw: secret, rawBytes: rawBytes, updateTime: time.Now(), }, w.wait } // Close implements driver.Close. func (w *watcher) Close() error { return nil } // ErrorAs implements driver.ErrorAs. func (w *watcher) ErrorAs(err error, i any) bool { var secErr *SecretError if errors.As(err, &secErr) { if p, ok := i.(**SecretError); ok { *p = secErr return true } } var respErr *api.ResponseError if errors.As(err, &respErr) { if p, ok := i.(**api.ResponseError); ok { *p = respErr return true } } return false } // ErrorCode implements driver.ErrorCode. func (w *watcher) ErrorCode(err error) gcerrors.ErrorCode { var secErr *SecretError if errors.As(err, &secErr) { switch secErr.Code { case 400: return gcerr.InvalidArgument case 403: return gcerr.PermissionDenied case 404: return gcerr.NotFound case 429, 503: return gcerr.ResourceExhausted case 500, 502: return gcerr.Internal } } var respErr *api.ResponseError if errors.As(err, &respErr) { switch respErr.StatusCode { case 400: return gcerr.InvalidArgument case 403: return gcerr.PermissionDenied case 404: return gcerr.NotFound case 429, 503: return gcerr.ResourceExhausted case 500, 502: return gcerr.Internal } } return gcerr.Unknown } ================================================ FILE: runtimevar/hashivault/hashivault_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package hashivault import ( "context" "encoding/json" "errors" "fmt" "os" "path" "testing" "time" "github.com/hashicorp/vault/api" "gocloud.dev/internal/testing/setup" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/driver" "gocloud.dev/runtimevar/drivertest" ) // To run these tests against a real Vault server, first run ./localvault.sh. // Then wait a few seconds for the server to be ready. const ( apiAddress = "http://127.0.0.1:8200" testToken = "faketoken" ) type harness struct { client *api.Client } func (h *harness) MakeWatcher(ctx context.Context, name string, decoder *runtimevar.Decoder) (driver.Watcher, error) { return newWatcher(h.client, name, decoder, nil) } func (h *harness) CreateVariable(ctx context.Context, name string, val []byte) error { var data map[string]any if err := json.Unmarshal(val, &data); err != nil { data = map[string]any{"value": string(val)} } _, err := h.client.Logical().Write(path.Join("secret/data", name), map[string]any{ "data": data, }) return err } func (h *harness) UpdateVariable(ctx context.Context, name string, val []byte) error { return h.CreateVariable(ctx, name, val) } func (h *harness) DeleteVariable(ctx context.Context, name string) error { _, err := h.client.Logical().Delete(path.Join("secret/metadata", name)) return err } func (h *harness) Close() {} func (h *harness) Mutable() bool { return true } func newHarness(t *testing.T) (drivertest.Harness, error) { t.Helper() if !setup.HasDockerTestEnvironment() { t.Skip("Skipping Vault tests since the Vault server is not available") } ctx := context.Background() c, err := Dial(ctx, &Config{ Token: testToken, APIConfig: api.Config{ Address: apiAddress, }, }) if err != nil { return nil, err } c.SetClientTimeout(3 * time.Second) _, err = c.Sys().Health() if err != nil { return nil, fmt.Errorf("vault server not healthy (run runtimevar/hashivault/localvault.sh): %v", err) } return &harness{client: c}, nil } func TestConformance(t *testing.T) { drivertest.RunConformanceTests(t, newHarness, []drivertest.AsTest{verifyAs{}}) } type verifyAs struct{} func (verifyAs) Name() string { return "verify As" } func (verifyAs) SnapshotCheck(s *runtimevar.Snapshot) error { var secret *api.Secret if !s.As(&secret) { return errors.New("Snapshot.As failed for *api.Secret") } return nil } func (verifyAs) ErrorCheck(v *runtimevar.Variable, err error) error { var secErr *SecretError if !v.ErrorAs(err, &secErr) { return errors.New("ErrorAs expected to succeed with *SecretError") } if secErr.Code != 404 { return fmt.Errorf("expected SecretError code 404, got %d", secErr.Code) } return nil } func TestNoConfigError(t *testing.T) { if _, err := Dial(context.Background(), nil); err == nil { t.Error("got nil, want no auth Config provided") } } func TestEquivalentError(t *testing.T) { err1 := errors.New("error one") err2 := errors.New("error one") err3 := errors.New("error two") respErr404 := &api.ResponseError{StatusCode: 404} respErr403 := &api.ResponseError{StatusCode: 403} secErr404 := &SecretError{Code: 404, Message: "not found"} secErr404b := &SecretError{Code: 404, Message: "also not found"} secErr400 := &SecretError{Code: 400, Message: "bad request"} tests := []struct { Err1, Err2 error Want bool }{ {Err1: err1, Err2: err2, Want: true}, {Err1: err1, Err2: err3, Want: false}, {Err1: respErr404, Err2: respErr404, Want: true}, {Err1: respErr404, Err2: respErr403, Want: false}, {Err1: err1, Err2: respErr404, Want: false}, {Err1: secErr404, Err2: secErr404b, Want: true}, {Err1: secErr404, Err2: secErr400, Want: false}, {Err1: secErr404, Err2: respErr404, Want: false}, // Different error types } for _, test := range tests { got := equivalentError(test.Err1, test.Err2) if got != test.Want { t.Errorf("%v vs %v: got %v want %v", test.Err1, test.Err2, got, test.Want) } } } func TestWatcherErrorCode(t *testing.T) { ctx := context.Background() client, err := Dial(ctx, &Config{ Token: "fake", APIConfig: api.Config{ Address: "http://localhost:8200", }, }) if err != nil { t.Fatal(err) } w, err := newWatcher(client, "test", runtimevar.StringDecoder, nil) if err != nil { t.Fatal(err) } defer w.Close() codes := []struct { Code int Want string }{ {400, "InvalidArgument"}, {403, "PermissionDenied"}, {404, "NotFound"}, {429, "ResourceExhausted"}, {500, "Internal"}, {502, "Internal"}, {503, "ResourceExhausted"}, {999, "Unknown"}, } for _, test := range codes { err := &api.ResponseError{StatusCode: test.Code} code := w.ErrorCode(err) if code.String() != test.Want { t.Errorf("api.ResponseError StatusCode %d: got %v, want %v", test.Code, code, test.Want) } } for _, test := range codes { err := &SecretError{Code: test.Code, Message: "test"} code := w.ErrorCode(err) if code.String() != test.Want { t.Errorf("SecretError Code %d: got %v, want %v", test.Code, code, test.Want) } } } func TestEngineVersionPaths(t *testing.T) { ctx := context.Background() client, err := Dial(ctx, &Config{ Token: "fake", APIConfig: api.Config{ Address: "http://localhost:8200", }, }) if err != nil { t.Fatal(err) } tests := []struct { EngineVersion int Mount string SecretPath string WantPath string }{ {2, "secret", "myapp/config", "secret/data/myapp/config"}, {1, "secret", "myapp/config", "secret/myapp/config"}, {2, "kv", "myapp/config", "kv/data/myapp/config"}, {1, "kv", "myapp/config", "kv/myapp/config"}, {0, "", "test", "secret/data/test"}, // defaults } for _, test := range tests { opts := &Options{ EngineVersion: test.EngineVersion, Mount: test.Mount, } w, err := newWatcher(client, test.SecretPath, runtimevar.StringDecoder, opts) if err != nil { t.Errorf("newWatcher failed: %v", err) continue } watcher := w.(*watcher) if watcher.path != test.WantPath { t.Errorf("EngineVersion=%d, Mount=%q, SecretPath=%q: got path %q, want %q", test.EngineVersion, test.Mount, test.SecretPath, watcher.path, test.WantPath) } w.Close() } } func TestInvalidEngineVersion(t *testing.T) { ctx := context.Background() client, err := Dial(ctx, &Config{ Token: "fake", APIConfig: api.Config{ Address: "http://localhost:8200", }, }) if err != nil { t.Fatal(err) } _, err = newWatcher(client, "test", runtimevar.StringDecoder, &Options{EngineVersion: 3}) if err == nil { t.Error("expected error for invalid engine version") } } func fakeConnectionStringInEnv() func() { oldURLVal := os.Getenv("VAULT_SERVER_URL") oldTokenVal := os.Getenv("VAULT_SERVER_TOKEN") os.Setenv("VAULT_SERVER_URL", "http://myvaultserver") os.Setenv("VAULT_SERVER_TOKEN", "faketoken") return func() { os.Setenv("VAULT_SERVER_URL", oldURLVal) os.Setenv("VAULT_SERVER_TOKEN", oldTokenVal) } } func alternativeConnectionStringEnvVars() func() { oldURLVal := os.Getenv("VAULT_ADDR") oldTokenVal := os.Getenv("VAULT_TOKEN") os.Setenv("VAULT_ADDR", "http://myalternativevaultserver") os.Setenv("VAULT_TOKEN", "faketoken2") return func() { os.Setenv("VAULT_ADDR", oldURLVal) os.Setenv("VAULT_TOKEN", oldTokenVal) } } func unsetConnectionStringEnvVars() func() { oldURLVal := os.Getenv("VAULT_ADDR") oldTokenVal := os.Getenv("VAULT_TOKEN") oldServerURLVal := os.Getenv("VAULT_SERVER_URL") oldServerTokenVal := os.Getenv("VAULT_SERVER_TOKEN") os.Unsetenv("VAULT_ADDR") os.Unsetenv("VAULT_TOKEN") os.Unsetenv("VAULT_SERVER_URL") os.Unsetenv("VAULT_SERVER_TOKEN") return func() { os.Setenv("VAULT_ADDR", oldURLVal) os.Setenv("VAULT_SERVER_URL", oldServerURLVal) os.Setenv("VAULT_TOKEN", oldTokenVal) os.Setenv("VAULT_SERVER_TOKEN", oldServerTokenVal) } } func TestGetVaultConnectionDetails(t *testing.T) { t.Run("Test Current Env Vars", func(t *testing.T) { cleanup := fakeConnectionStringInEnv() defer cleanup() serverURL, err := getVaultURL() if err != nil { t.Errorf("got unexpected error: %v", err) } if serverURL != "http://myvaultserver" { t.Errorf("expected 'http://myvaultserver': got %q", serverURL) } vaultToken := getVaultToken() if vaultToken != "faketoken" { t.Errorf("expected 'faketoken': got %q", vaultToken) } }) t.Run("Test Alternative Env Vars", func(t *testing.T) { cleanup := alternativeConnectionStringEnvVars() defer cleanup() serverURL, err := getVaultURL() if err != nil { t.Errorf("got unexpected error: %v", err) } if serverURL != "http://myalternativevaultserver" { t.Errorf("expected 'http://myalternativevaultserver': got %q", serverURL) } vaultToken := getVaultToken() if vaultToken != "faketoken2" { t.Errorf("expected 'faketoken2': got %q", vaultToken) } }) t.Run("Test Unset Env Vars Throws Error", func(t *testing.T) { cleanup := unsetConnectionStringEnvVars() defer cleanup() serverURL, err := getVaultURL() if err == nil { t.Errorf("expected error but got a url: %s", serverURL) } vaultToken := getVaultToken() if vaultToken != "" { t.Errorf("expected '': got %q", vaultToken) } }) } func TestOpenVariableURL(t *testing.T) { cleanup := fakeConnectionStringInEnv() defer cleanup() tests := []struct { URL string WantErr bool }{ // OK. {"hashivault://myapp/config", false}, // OK, setting decoder. {"hashivault://myapp/config?decoder=string", false}, // OK, setting wait. {"hashivault://myapp/config?wait=1m", false}, // OK, setting engine_version. {"hashivault://myapp/config?engine_version=1", false}, {"hashivault://myapp/config?engine_version=2", false}, // OK, setting mount. {"hashivault://myapp/config?mount=kv", false}, // OK, setting all. {"hashivault://myapp/config?decoder=string&wait=1m&engine_version=2&mount=secret", false}, // Invalid decoder. {"hashivault://myapp/config?decoder=notadecoder", true}, // Invalid wait. {"hashivault://myapp/config?wait=xx", true}, // Invalid engine_version. {"hashivault://myapp/config?engine_version=3", true}, {"hashivault://myapp/config?engine_version=abc", true}, // Invalid parameter. {"hashivault://myapp/config?param=value", true}, } ctx := context.Background() for _, test := range tests { t.Run(test.URL, func(t *testing.T) { v, err := runtimevar.OpenVariable(ctx, test.URL) if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } if err == nil { if err := v.Close(); err != nil { t.Errorf("%s: got error during close: %v", test.URL, err) } } }) } } ================================================ FILE: runtimevar/hashivault/localvault.sh ================================================ #!/usr/bin/env bash # Copyright 2019 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Starts a local Vault instance via Docker. # https://coderwall.com/p/fkfaqq/safer-bash-scripts-with-set-euxo-pipefail set -euo pipefail echo "Starting Vault Server..." docker rm -f dev-vault &> /dev/null || : docker run --cap-add=IPC_LOCK -d --name=dev-vault -e 'VAULT_DEV_ROOT_TOKEN_ID=faketoken' -p 8200:8200 vault:1.6.0 &> /dev/null echo "...done. Run \"docker rm -f dev-vault\" to clean up the container." echo ================================================ FILE: runtimevar/httpvar/example_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package httpvar_test import ( "context" "log" "net/http" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/httpvar" ) func ExampleOpenVariable() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // Create an HTTP.Client httpClient := http.DefaultClient // Construct a *runtimevar.Variable that watches the page. v, err := httpvar.OpenVariable(httpClient, "http://example.com", runtimevar.StringDecoder, nil) if err != nil { log.Fatal(err) } defer v.Close() } func Example_openVariableFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/runtimevar/httpvar" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // runtimevar.OpenVariable creates a *runtimevar.Variable from a URL. // The default opener connects to an etcd server based on the environment // variable ETCD_SERVER_URL. v, err := runtimevar.OpenVariable(ctx, "http://myserver.com/foo.txt?decoder=string") if err != nil { log.Fatal(err) } defer v.Close() } ================================================ FILE: runtimevar/httpvar/httpvar.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package httpvar provides a runtimevar implementation with variables // backed by http endpoint. Use OpenVariable to construct a *runtimevar.Variable. // // # URLs // // For runtimevar.OpenVariable, httpvar registers for the schemes "http" and // "https". The default URL opener will use http.DefaultClient. // To use HTTP Basic Auth for the requests, set the environment variables // "HTTPVAR_AUTH_USERNAME" and "HTTPVAR_AUTH_PASSWORD". // To customize the URL opener, or for more details on the URL format, // see URLOpener. // See https://gocloud.dev/concepts/urls/ for background information. // // # As // // httpvar exposes the following types for As: // - Snapshot: *http.Response // - Error: httpvar.RequestError, url.Error package httpvar // import "gocloud.dev/runtimevar/httpvar" import ( "bytes" "context" "fmt" "io" "net/http" "net/url" "os" "time" "gocloud.dev/gcerrors" "gocloud.dev/internal/gcerr" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/driver" ) func init() { o := &URLOpener{Client: http.DefaultClient} for _, scheme := range Schemes { runtimevar.DefaultURLMux().RegisterVariable(scheme, o) } } // Schemes are the URL schemes httpvar registers its URLOpener under on runtimevar.DefaultMux. var Schemes = []string{"http", "https"} // URLOpener opens HTTP URLs like "http://myserver.com/foo.txt". // // The full URL, including scheme, is used as the endpoint, except that the // the following URL parameters are removed if present: // - decoder: The decoder to use. Defaults to runtimevar.BytesDecoder. // See runtimevar.DecoderByName for supported values. // - wait: The poll interval, in time.ParseDuration formats. // Defaults to 30s. type URLOpener struct { // The Client to use; required. Client *http.Client // Decoder specifies the decoder to use if one is not specified in the URL. // Defaults to runtimevar.BytesDecoder. Decoder *runtimevar.Decoder // Options specifies the options to pass to OpenVariable. Options Options } // OpenVariableURL opens a httpvar Variable for u. func (o *URLOpener) OpenVariableURL(ctx context.Context, u *url.URL) (*runtimevar.Variable, error) { // Clone u because we may strip some query parameters. u2 := *u q := u2.Query() decoderName := q.Get("decoder") q.Del("decoder") decoder, err := runtimevar.DecoderByName(ctx, decoderName, o.Decoder) if err != nil { return nil, fmt.Errorf("open variable %v: invalid decoder: %v", u, err) } opts := o.Options if s := q.Get("wait"); s != "" { q.Del("wait") d, err := time.ParseDuration(s) if err != nil { return nil, fmt.Errorf("open variable %v: invalid wait %q: %v", u, s, err) } opts.WaitDuration = d } // See if we changed the query parameters. if rawq := q.Encode(); rawq != u.Query().Encode() { u2.RawQuery = rawq } return OpenVariable(o.Client, u2.String(), decoder, &opts) } // Options sets options. type Options struct { // WaitDuration controls the rate at which the HTTP endpoint is called to check for changes. // Defaults to 30 seconds. WaitDuration time.Duration } // RequestError represents an HTTP error that occurred during endpoint call. type RequestError struct { Response *http.Response } func (e *RequestError) Error() string { return fmt.Sprintf("httpvar: received status code %d", e.Response.StatusCode) } func newRequestError(response *http.Response) *RequestError { return &RequestError{Response: response} } // OpenVariable constructs a *runtimevar.Variable that uses client // to retrieve the variable contents from the URL urlStr. func OpenVariable(client *http.Client, urlStr string, decoder *runtimevar.Decoder, opts *Options) (*runtimevar.Variable, error) { endpointURL, err := url.Parse(urlStr) if err != nil { return nil, fmt.Errorf("httpvar: failed to parse url %q: %v", urlStr, err) } return runtimevar.New(newWatcher(client, endpointURL, decoder, opts)), nil } type state struct { val any raw *http.Response rawBytes []byte updateTime time.Time err error } // Value implements driver.State.Value. func (s *state) Value() (any, error) { return s.val, s.err } // UpdateTime implements driver.State.UpdateTime. func (s *state) UpdateTime() time.Time { return s.updateTime } // As implements driver.State.As. func (s *state) As(i any) bool { if s.raw == nil { return false } p, ok := i.(**http.Response) if !ok { return false } *p = s.raw return true } // errorState returns a new State with err, unless prevS also represents // the same error, in which case it returns nil. func errorState(err error, prevS driver.State) driver.State { s := &state{err: err} if prevS == nil { return s } prev := prevS.(*state) if prev.err == nil { // New error. return s } if equivalentError(err, prev.err) { // Same error, return nil to indicate no change. return nil } return s } // equivalentError returns true if err1 and err2 represent an equivalent error; // i.e., we don't want to return it to the user as a different error. func equivalentError(err1, err2 error) bool { if err1 == err2 || err1.Error() == err2.Error() { return true } var code1, code2 int if e, ok := err1.(*RequestError); ok { code1 = e.Response.StatusCode } if e, ok := err2.(*RequestError); ok { code2 = e.Response.StatusCode } return code1 != 0 && code1 == code2 } // watcher implements driver.Watcher for configurations provided by the Runtime Configurator // service. type watcher struct { client *http.Client endpoint *url.URL decoder *runtimevar.Decoder wait time.Duration } // WatchVariable implements driver.WatchVariable. func (w *watcher) WatchVariable(ctx context.Context, prev driver.State) (driver.State, time.Duration) { req, err := http.NewRequestWithContext(ctx, http.MethodGet, w.endpoint.String(), nil) if err != nil { return errorState(err, prev), w.wait } authUsername := os.Getenv("HTTPVAR_AUTH_USERNAME") authPassword := os.Getenv("HTTPVAR_AUTH_PASSWORD") if authUsername != "" && authPassword != "" { req.SetBasicAuth(authUsername, authPassword) } resp, err := w.client.Do(req) if err != nil { return errorState(err, prev), w.wait } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { err := newRequestError(resp) return errorState(err, prev), w.wait } respBodyBytes, err := io.ReadAll(resp.Body) if err != nil { return errorState(err, prev), w.wait } // When endpoint returns the same response again, we return nil as state to not trigger variable update. if prev != nil && bytes.Equal(respBodyBytes, prev.(*state).rawBytes) { return nil, w.wait } val, err := w.decoder.Decode(ctx, respBodyBytes) if err != nil { return errorState(err, prev), w.wait } return &state{ val: val, raw: resp, rawBytes: respBodyBytes, updateTime: time.Now(), }, w.wait } // Close implements driver.Close. func (w *watcher) Close() error { return nil } // ErrorAs implements driver.ErrorAs. func (w *watcher) ErrorAs(err error, i any) bool { switch v := err.(type) { case *url.Error: if p, ok := i.(*url.Error); ok { *p = *v return true } case *RequestError: if p, ok := i.(*RequestError); ok { *p = *v return true } } return false } // ErrorCode implements driver.ErrorCode. func (*watcher) ErrorCode(err error) gcerrors.ErrorCode { if requestErr, ok := err.(*RequestError); ok { switch requestErr.Response.StatusCode { case http.StatusBadRequest: return gcerr.InvalidArgument case http.StatusNotFound: return gcerr.NotFound case http.StatusUnauthorized: return gcerr.PermissionDenied case http.StatusGatewayTimeout, http.StatusRequestTimeout: return gcerr.DeadlineExceeded case http.StatusInternalServerError, http.StatusServiceUnavailable, http.StatusBadGateway: return gcerr.Internal } } return gcerr.Unknown } func newWatcher(client *http.Client, endpoint *url.URL, decoder *runtimevar.Decoder, opts *Options) driver.Watcher { if opts == nil { opts = &Options{} } return &watcher{ client: client, endpoint: endpoint, decoder: decoder, wait: driver.WaitDuration(opts.WaitDuration), } } ================================================ FILE: runtimevar/httpvar/httpvar_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package httpvar import ( "context" "errors" "fmt" "net/http" "net/http/httptest" "net/url" "strconv" "strings" "testing" "time" "github.com/google/go-cmp/cmp" "gocloud.dev/internal/gcerr" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/driver" "gocloud.dev/runtimevar/drivertest" ) type harness struct { mockServer *mockServer } func (h *harness) MakeWatcher(ctx context.Context, name string, decoder *runtimevar.Decoder) (driver.Watcher, error) { endpointURL, err := url.Parse(h.mockServer.baseURL + "/" + name) if err != nil { return nil, err } return newWatcher(http.DefaultClient, endpointURL, decoder, nil), nil } func (h *harness) CreateVariable(ctx context.Context, name string, val []byte) error { h.mockServer.SetResponse(name, string(val)) return nil } func (h *harness) UpdateVariable(ctx context.Context, name string, val []byte) error { h.mockServer.SetResponse(name, string(val)) return nil } func (h *harness) DeleteVariable(ctx context.Context, name string) error { h.mockServer.DeleteResponse(name) return nil } func (h *harness) Close() { h.mockServer.close() } func (h *harness) Mutable() bool { return true } func newHarness(t *testing.T) (drivertest.Harness, error) { t.Helper() return &harness{ mockServer: newMockServer(), }, nil } func TestConformance(t *testing.T) { drivertest.RunConformanceTests(t, newHarness, []drivertest.AsTest{verifyAs{}}) } type verifyAs struct{} func (verifyAs) Name() string { return "verify As" } func (verifyAs) SnapshotCheck(s *runtimevar.Snapshot) error { var resp *http.Response if !s.As(&resp) { return errors.New("Snapshot.As failed") } s2 := state{raw: nil} if s2.As(nil) { return errors.New("Snapshot.As was expected to fail") } return nil } func (verifyAs) ErrorCheck(v *runtimevar.Variable, err error) error { var e RequestError if !v.ErrorAs(err, &e) { return errors.New("ErrorAs expected to succeed with *httpvar.RequestError") } if !strings.Contains(e.Error(), strconv.Itoa(e.Response.StatusCode)) { return errors.New("should contain url and status code") } var e2 url.Error urlError := &url.Error{URL: "http://example.com", Op: "GET", Err: errors.New("example error")} if !v.ErrorAs(urlError, &e2) { return errors.New("ErrorAs expected to succeed with *url.Error") } var e3 RequestError if v.ErrorAs(errors.New("example error"), &e3) { return errors.New("ErrorAs was expected to fail") } return nil } // httpvar-specific tests. func TestOpenVariable(t *testing.T) { tests := []struct { URL string WantErr bool }{ {"http://example.com/config", false}, {"%gh&%ij", true}, } for _, test := range tests { v, err := OpenVariable(http.DefaultClient, test.URL, runtimevar.StringDecoder, nil) if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } if v != nil { v.Close() } } } func TestEquivalentError(t *testing.T) { notFoundErr := newRequestError(&http.Response{StatusCode: http.StatusNotFound}) badGatewayErr := newRequestError(&http.Response{StatusCode: http.StatusBadGateway}) tests := []struct { Err1, Err2 error Want bool }{ {Err1: errors.New("error one"), Err2: errors.New("error one"), Want: true}, {Err1: errors.New("error one"), Err2: errors.New("error two"), Want: false}, {Err1: errors.New("error one"), Err2: notFoundErr, Want: false}, {Err1: notFoundErr, Err2: notFoundErr, Want: true}, {Err1: notFoundErr, Err2: badGatewayErr, Want: false}, } for _, test := range tests { got := equivalentError(test.Err1, test.Err2) if got != test.Want { t.Errorf("%v vs %v: got %v want %v", test.Err1, test.Err2, got, test.Want) } } } func TestWatcher_ErrorCode(t *testing.T) { tests := []struct { Err *RequestError GCErr gcerr.ErrorCode }{ {Err: newRequestError(&http.Response{StatusCode: http.StatusBadRequest}), GCErr: gcerr.InvalidArgument}, {Err: newRequestError(&http.Response{StatusCode: http.StatusNotFound}), GCErr: gcerr.NotFound}, {Err: newRequestError(&http.Response{StatusCode: http.StatusUnauthorized}), GCErr: gcerr.PermissionDenied}, {Err: newRequestError(&http.Response{StatusCode: http.StatusGatewayTimeout}), GCErr: gcerr.DeadlineExceeded}, {Err: newRequestError(&http.Response{StatusCode: http.StatusRequestTimeout}), GCErr: gcerr.DeadlineExceeded}, {Err: newRequestError(&http.Response{StatusCode: http.StatusInternalServerError}), GCErr: gcerr.Internal}, {Err: newRequestError(&http.Response{StatusCode: http.StatusServiceUnavailable}), GCErr: gcerr.Internal}, {Err: newRequestError(&http.Response{StatusCode: http.StatusBadGateway}), GCErr: gcerr.Internal}, } endpointURL, err := url.Parse("http://example.com") if err != nil { t.Fatal(err) } watcher := newWatcher(http.DefaultClient, endpointURL, runtimevar.StringDecoder, nil) defer watcher.Close() for _, test := range tests { actualGCErr := watcher.ErrorCode(test.Err) if test.GCErr != actualGCErr { t.Errorf("expected gcerr.ErrorCode to be %d, got %d", test.GCErr, actualGCErr) } } } func TestWatcher_WatchVariable(t *testing.T) { t.Run("client returns an error", func(t *testing.T) { endpointURL, err := url.Parse("http://example.com") if err != nil { t.Fatal(err) } // In order to force httpClient.Get to return an error, we pass custom *http.Client // with every short timeout, so that request will timed out and return an error. httpClient := &http.Client{ Timeout: time.Duration(1 * time.Millisecond), } watcher := newWatcher(httpClient, endpointURL, runtimevar.StringDecoder, nil) defer watcher.Close() state, _ := watcher.WatchVariable(context.Background(), &state{}) val, err := state.Value() if err == nil { t.Errorf("expected error got nil") } if val != nil { t.Errorf("expected state value to be nil, got %v", val) } }) } func TestWithAuth(t *testing.T) { const ( authUser = "test_user" authPwd = "test_pwd" value = "hello world" ) h, err := newHarness(t) if err != nil { t.Fatal(err) } defer h.Close() mockServer := h.(*harness).mockServer testURL := mockServer.baseURL + "/string-var?decoder=string" mockServer.authUser = authUser mockServer.authPwd = authPwd ctx := context.Background() if err := h.CreateVariable(ctx, "string-var", []byte(value)); err != nil { t.Fatal(err) } tests := []struct { AuthUser string AuthPwd string WantErr bool }{ // No auth provided, fails. {"", "", true}, // Invalid user, fails. {"wronguser", authPwd, true}, // Invalid password, fails. {authUser, "wrongpassword", true}, // Auth good, works. {authUser, authPwd, false}, } for _, test := range tests { name := fmt.Sprintf("user=%s,pwd=%s", test.AuthUser, test.AuthPwd) t.Run(name, func(t *testing.T) { t.Setenv("HTTPVAR_AUTH_USERNAME", test.AuthUser) t.Setenv("HTTPVAR_AUTH_PASSWORD", test.AuthPwd) v, err := runtimevar.OpenVariable(ctx, testURL) if err != nil { t.Fatalf("failed OpenVariable: %v", err) } defer v.Close() snapshot, err := v.Watch(ctx) if (err != nil) != test.WantErr { t.Errorf("got Watch error %v, want error %v", err, test.WantErr) } if err != nil { return } if !cmp.Equal(snapshot.Value, value) { t.Errorf("got snapshot value\n%v\n want\n%v", snapshot.Value, value) } }) } } func TestOpenVariableURL(t *testing.T) { h, err := newHarness(t) if err != nil { t.Fatal(err) } defer h.Close() baseURL := h.(*harness).mockServer.baseURL ctx := context.Background() if err := h.CreateVariable(ctx, "string-var", []byte("hello world")); err != nil { t.Fatal(err) } if err := h.CreateVariable(ctx, "json-var", []byte(`{"Foo": "Bar"}`)); err != nil { t.Fatal(err) } tests := []struct { URL string WantErr bool WantWatchErr bool Want any }{ // Nonexistentvar does not exist, so we get an error from Watch. {baseURL + "/nonexistentvar", false, true, nil}, // Invalid decoder arg. {baseURL + "/string-var?decoder=notadecoder", true, false, nil}, // Working example with string decoder. {baseURL + "/string-var?decoder=string", false, false, "hello world"}, // Working example with default decoder. {baseURL + "/string-var", false, false, []byte("hello world")}, // Working example with JSON decoder. {baseURL + "/json-var?decoder=jsonmap", false, false, &map[string]any{"Foo": "Bar"}}, // Setting wait. {baseURL + "/string-var?decoder=string&wait=1m", false, false, "hello world"}, // Invalid wait. {baseURL + "/string-var?decoder=string&wait=xx", true, false, nil}, } for _, test := range tests { t.Run(test.URL, func(t *testing.T) { v, err := runtimevar.OpenVariable(ctx, test.URL) if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } if err != nil { return } defer v.Close() snapshot, err := v.Watch(ctx) if (err != nil) != test.WantWatchErr { t.Errorf("%s: got Watch error %v, want error %v", test.URL, err, test.WantWatchErr) } if err != nil { return } if !cmp.Equal(snapshot.Value, test.Want) { t.Errorf("%s: got snapshot value\n%v\n want\n%v", test.URL, snapshot.Value, test.Want) } }) } } type mockServer struct { baseURL string close func() responses map[string]any authUser string authPwd string } func (m *mockServer) SetResponse(name string, response any) { m.responses[name] = response } func (m *mockServer) DeleteResponse(name string) { delete(m.responses, name) } func newMockServer() *mockServer { mock := &mockServer{responses: map[string]any{}} mux := http.NewServeMux() mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { if mock.authUser != "" { user, pwd, ok := r.BasicAuth() if !ok || user != mock.authUser || pwd != mock.authPwd { w.WriteHeader(http.StatusUnauthorized) return } } resp := mock.responses[strings.TrimPrefix(r.URL.String(), "/")] if resp == nil { w.WriteHeader(http.StatusNotFound) return } fmt.Fprint(w, resp) }) server := httptest.NewServer(mux) mock.baseURL = server.URL mock.close = server.Close return mock } ================================================ FILE: runtimevar/otel_test.go ================================================ // Copyright 2019-2025 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package runtimevar_test import ( "context" "gocloud.dev/gcerrors" "gocloud.dev/internal/testing/oteltest" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/constantvar" "testing" ) const ( pkgName = "gocloud.dev/runtimevar" driver = "gocloud.dev/runtimevar/constantvar" ) func TestOpenTelemetry(t *testing.T) { ctx := context.Background() te := oteltest.NewTestExporter(t, runtimevar.OpenTelemetryViews) defer te.Shutdown(ctx) v := constantvar.New(1) defer v.Close() if _, err := v.Watch(ctx); err != nil { t.Fatal(err) } cctx, cancel := context.WithCancel(ctx) cancel() _, _ = v.Watch(cctx) // Check metrics - during migration, we may need to look for different metric names. metrics := te.GetMetrics(ctx) diff := oteltest.DiffMetrics(metrics, pkgName, driver, []oteltest.Call{ {Method: "", Code: gcerrors.OK}, }) if diff != "" { t.Error(diff) } } ================================================ FILE: runtimevar/runtimevar.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package runtimevar provides an easy and portable way to watch runtime // configuration variables. Subpackages contain driver implementations of // runtimevar for supported services. // // See https://gocloud.dev/howto/runtimevar/ for a detailed how-to guide. // // # OpenTelemetry Integration // // OpenTelemetry supports tracing and metric collection for multiple languages and // backend providers. See https://opentelemetry.io. // // This API collects an OpenTelemetry metric "gocloud.dev/runtimevar/value_changes", // a count of the number of times all variables have changed values, by driver. // // To enable metric collection in your application, see the OpenTelemetry documentation at // https://opentelemetry.io/docs/instrumentation/go/getting-started/ package runtimevar // import "gocloud.dev/runtimevar" import ( "bytes" "context" "encoding/gob" "encoding/json" "errors" "fmt" "net/url" "os" "reflect" "strings" "sync" "time" "go.opentelemetry.io/otel/metric" "gocloud.dev/internal/gcerr" "gocloud.dev/internal/openurl" "gocloud.dev/runtimevar/driver" "gocloud.dev/secrets" gcdkotel "gocloud.dev/internal/otel" ) // Snapshot contains a snapshot of a variable's value and metadata about it. // It is intended to be read-only for users. type Snapshot struct { // Value contains the value of the variable. // The type for Value depends on the decoder used when creating the Variable. Value any // UpdateTime is the time when the last change was detected. UpdateTime time.Time asFunc func(any) bool } // As converts i to driver-specific types. // See https://gocloud.dev/concepts/as/ for background information, the "As" // examples in this package for examples, and the driver package // documentation for the specific types supported for that driver. func (s *Snapshot) As(i any) bool { if s.asFunc == nil { return false } return s.asFunc(i) } const pkgName = "gocloud.dev/runtimevar" var ( OpenTelemetryViews = gcdkotel.CounterView(pkgName, "/value_changes", "Count of variable value changes by driver.") ) // Variable provides an easy and portable way to watch runtime configuration // variables. To create a Variable, use constructors found in driver subpackages. type Variable struct { dw driver.Watcher changeMeasure metric.Int64Counter // For cancelling the background goroutine, and noticing when it has exited. backgroundCancel context.CancelFunc backgroundDone chan struct{} // haveGoodCh is closed when we get the first good value for the variable. haveGoodCh chan struct{} // A reference to changed at the last time Watch was called. // Not protected by mu because it's only referenced in Watch, which is not // supposed to be called from multiple goroutines. lastWatch <-chan struct{} mu sync.RWMutex changed chan struct{} // closed when changing any of the other variables and replaced with a new channel last Snapshot lastErr error lastGood Snapshot } // New is intended for use by drivers only. Do not use in application code. var New = newVar // newVar creates a new *Variable based on a specific driver implementation. func newVar(w driver.Watcher) *Variable { ctx, cancel := context.WithCancel(context.Background()) changed := make(chan struct{}) providerName := gcdkotel.ProviderName(w) v := &Variable{ dw: w, changeMeasure: gcdkotel.DimensionlessMeasure(pkgName, providerName, "/value_changes", "Count of variable value changes by driver"), backgroundCancel: cancel, backgroundDone: make(chan struct{}), haveGoodCh: make(chan struct{}), changed: changed, lastWatch: changed, lastErr: gcerr.Newf(gcerr.FailedPrecondition, nil, "no value yet"), } go v.background(ctx) return v } // ErrClosed is returned from Watch when the Variable has been Closed. var ErrClosed = gcerr.Newf(gcerr.FailedPrecondition, nil, "Variable has been Closed") // Watch returns when there is a new Snapshot of the current value of the // variable. // // The first call to Watch will block while reading the variable from the // driver, and will return the resulting Snapshot or error. If an error is // returned, the returned Snapshot is a zero value and should be ignored. // Subsequent calls will block until the variable's value changes or a different // error occurs. // // Watch returns an ErrClosed error if the Variable has been closed. // // Watch should not be called on the same variable from multiple goroutines // concurrently. The typical use case is to call it in a single goroutine in a // loop. // // If the variable does not exist, Watch returns an error for which // gcerrors.Code will return gcerrors.NotFound. // // Alternatively, use Latest to retrieve the latest good value. func (c *Variable) Watch(ctx context.Context) (Snapshot, error) { // Block until there's a change since the last Watch call, signaled // by lastWatch being closed by the background goroutine. var ctxErr error select { case <-c.lastWatch: case <-ctx.Done(): ctxErr = ctx.Err() } c.mu.Lock() defer c.mu.Unlock() if errors.Is(c.lastErr, ErrClosed) { return Snapshot{}, ErrClosed } else if ctxErr != nil { return Snapshot{}, ctxErr } c.lastWatch = c.changed return c.last, c.lastErr } func (c *Variable) background(ctx context.Context) { var curState, prevState driver.State var wait time.Duration for { select { case <-ctx.Done(): // We're shutting down; exit the goroutine. close(c.backgroundDone) return case <-time.After(wait): // Continue. } curState, wait = c.dw.WatchVariable(ctx, prevState) if curState == nil { // No change. continue } // There's something new to return! prevState = curState c.changeMeasure.Add(ctx, 1) // Error from RecordWithTags is not possible. // Updates under the lock. c.mu.Lock() if errors.Is(c.lastErr, ErrClosed) { close(c.backgroundDone) c.mu.Unlock() return } if val, err := curState.Value(); err == nil { // We got a good value! c.last = Snapshot{ Value: val, UpdateTime: curState.UpdateTime(), asFunc: curState.As, } c.lastErr = nil c.lastGood = c.last // Close c.haveGoodCh if it's not already closed. select { case <-c.haveGoodCh: default: close(c.haveGoodCh) } } else { // We got an error value. c.last = Snapshot{} c.lastErr = wrapError(c.dw, err) } close(c.changed) c.changed = make(chan struct{}) c.mu.Unlock() } } func (c *Variable) haveGood() bool { select { case <-c.haveGoodCh: return true default: return false } } // Latest is intended to be called per request, with the request context. // It returns the latest good Snapshot of the variable value, blocking if no // good value has ever been received. If ctx is Done, it returns the latest // error indicating why no good value is available (not the ctx.Err()). // You can pass an already-Done ctx to make Latest not block. // // Latest returns ErrClosed if the Variable has been closed. func (c *Variable) Latest(ctx context.Context) (Snapshot, error) { haveGood := c.haveGood() if !haveGood { select { case <-c.haveGoodCh: haveGood = true case <-ctx.Done(): // We don't return ctx.Err(). } } c.mu.RLock() defer c.mu.RUnlock() if haveGood && !errors.Is(c.lastErr, ErrClosed) { return c.lastGood, nil } return Snapshot{}, c.lastErr } // CheckHealth returns an error unless Latest will return a good value // without blocking. func (c *Variable) CheckHealth() error { haveGood := c.haveGood() c.mu.RLock() defer c.mu.RUnlock() if haveGood && !errors.Is(c.lastErr, ErrClosed) { return nil } return c.lastErr } // Close closes the Variable. The Variable is unusable after Close returns. func (c *Variable) Close() error { // Record that we're closing. Subsequent calls to Watch/Latest will return ErrClosed. c.mu.Lock() if errors.Is(c.lastErr, ErrClosed) { c.mu.Unlock() return ErrClosed } c.last = Snapshot{} c.lastErr = ErrClosed // Close any remaining channels to wake up any callers that are waiting on them. close(c.changed) // If it's the first good value, close haveGoodCh so that Latest doesn't block. select { case <-c.haveGoodCh: default: close(c.haveGoodCh) } c.mu.Unlock() // Shut down the background goroutine. c.backgroundCancel() <-c.backgroundDone // Close the driver. err := c.dw.Close() return wrapError(c.dw, err) } func wrapError(w driver.Watcher, err error) error { if err == nil { return nil } if gcerr.DoNotWrap(err) { return err } return gcerr.New(w.ErrorCode(err), err, 2, "runtimevar") } // ErrorAs converts err to driver-specific types. // ErrorAs panics if i is nil or not a pointer. // ErrorAs returns false if err == nil. // See https://gocloud.dev/concepts/as/ for background information. func (c *Variable) ErrorAs(err error, i any) bool { return gcerr.ErrorAs(err, i, c.dw.ErrorAs) } // VariableURLOpener represents types than can open Variables based on a URL. // The opener must not modify the URL argument. OpenVariableURL must be safe to // call from multiple goroutines. // // This interface is generally implemented by types in driver packages. type VariableURLOpener interface { OpenVariableURL(ctx context.Context, u *url.URL) (*Variable, error) } // URLMux is a URL opener multiplexer. It matches the scheme of the URLs // against a set of registered schemes and calls the opener that matches the // URL's scheme. // See https://gocloud.dev/concepts/urls/ for more information. // // The zero value is a multiplexer with no registered schemes. type URLMux struct { schemes openurl.SchemeMap } // VariableSchemes returns a sorted slice of the registered Variable schemes. func (mux *URLMux) VariableSchemes() []string { return mux.schemes.Schemes() } // ValidVariableScheme returns true iff scheme has been registered for Variables. func (mux *URLMux) ValidVariableScheme(scheme string) bool { return mux.schemes.ValidScheme(scheme) } // RegisterVariable registers the opener with the given scheme. If an opener // already exists for the scheme, RegisterVariable panics. func (mux *URLMux) RegisterVariable(scheme string, opener VariableURLOpener) { mux.schemes.Register("runtimevar", "Variable", scheme, opener) } // OpenVariable calls OpenVariableURL with the URL parsed from urlstr. // OpenVariable is safe to call from multiple goroutines. func (mux *URLMux) OpenVariable(ctx context.Context, urlstr string) (*Variable, error) { opener, u, err := mux.schemes.FromString("Variable", urlstr) if err != nil { return nil, err } return opener.(VariableURLOpener).OpenVariableURL(ctx, u) } // OpenVariableURL dispatches the URL to the opener that is registered with the // URL's scheme. OpenVariableURL is safe to call from multiple goroutines. func (mux *URLMux) OpenVariableURL(ctx context.Context, u *url.URL) (*Variable, error) { opener, err := mux.schemes.FromURL("Variable", u) if err != nil { return nil, err } return opener.(VariableURLOpener).OpenVariableURL(ctx, u) } var defaultURLMux = new(URLMux) // DefaultURLMux returns the URLMux used by OpenVariable. // // Driver packages can use this to register their VariableURLOpener on the mux. func DefaultURLMux() *URLMux { return defaultURLMux } // OpenVariable opens the variable identified by the URL given. // See the URLOpener documentation in driver subpackages for // details on supported URL formats, and https://gocloud.dev/concepts/urls // for more information. func OpenVariable(ctx context.Context, urlstr string) (*Variable, error) { return defaultURLMux.OpenVariable(ctx, urlstr) } // Decode is a function type for unmarshaling/decoding a slice of bytes into // an arbitrary type. Decode functions are used when creating a Decoder via // NewDecoder. This package provides common Decode functions including // GobDecode and JSONDecode. type Decode func(context.Context, []byte, any) error // Decoder decodes a slice of bytes into a particular Go object. // // This package provides some common Decoders that you can use directly, // including StringDecoder and BytesDecoder. You can also NewDecoder to // construct other Decoders. type Decoder struct { typ reflect.Type fn Decode } // NewDecoder returns a Decoder that uses fn to decode a slice of bytes into // an object of type obj. // // This package provides some common Decode functions, including JSONDecode // and GobDecode, which can be passed to this function to create Decoders for // JSON and gob values. func NewDecoder(obj any, fn Decode) *Decoder { return &Decoder{ typ: reflect.TypeOf(obj), fn: fn, } } // Decode decodes b into a new instance of the target type. func (d *Decoder) Decode(ctx context.Context, b []byte) (any, error) { nv := reflect.New(d.typ).Interface() if err := d.fn(ctx, b, nv); err != nil { return nil, err } ptr := reflect.ValueOf(nv) return ptr.Elem().Interface(), nil } var ( // StringDecoder decodes into strings. StringDecoder = NewDecoder("", StringDecode) // BytesDecoder copies the slice of bytes. BytesDecoder = NewDecoder([]byte{}, BytesDecode) ) // JSONDecode can be passed to NewDecoder when decoding JSON (https://golang.org/pkg/encoding/json/). func JSONDecode(ctx context.Context, data []byte, obj any) error { return json.Unmarshal(data, obj) } // GobDecode can be passed to NewDecoder when decoding gobs (https://golang.org/pkg/encoding/gob/). func GobDecode(ctx context.Context, data []byte, obj any) error { return gob.NewDecoder(bytes.NewBuffer(data)).Decode(obj) } // StringDecode decodes raw bytes b into a string. func StringDecode(ctx context.Context, b []byte, obj any) error { v := obj.(*string) *v = string(b) return nil } // BytesDecode copies the slice of bytes b into obj. func BytesDecode(ctx context.Context, b []byte, obj any) error { v := obj.(*[]byte) *v = b[:] return nil } // DecryptDecode returns a decode function that can be passed to NewDecoder when // decoding an encrypted message (https://godoc.org/gocloud.dev/secrets). // // post defaults to BytesDecode. An optional decoder can be passed in to do // further decode operation based on the decrypted message. func DecryptDecode(k *secrets.Keeper, post Decode) Decode { return func(ctx context.Context, b []byte, obj any) error { decrypted, err := k.Decrypt(ctx, b) if err != nil { return err } if post == nil { return BytesDecode(ctx, decrypted, obj) } return post(ctx, decrypted, obj) } } // DecoderByName returns a *Decoder based on decoderName. // // It is intended to be used by URL openers in driver packages. // // Supported values include: // - empty string: Returns the default from the URLOpener.Decoder, or // BytesDecoder if URLOpener.Decoder is nil (which is true if you're // using the default URLOpener). // - "bytes": Returns a BytesDecoder; Snapshot.Value will be of type []byte. // - "jsonmap": Returns a JSON decoder for a map[string]any; // Snapshot.Value will be of type *map[string]any. // - "string": Returns StringDecoder; Snapshot.Value will be of type string. // // It also supports using "decrypt+" (or "decrypt" for default // decoder) to decrypt the data before decoding. It uses the secrets package to // open a keeper by the URL string stored in a environment variable // "RUNTIMEVAR_KEEPER_URL". See https://godoc.org/gocloud.dev/secrets#OpenKeeper // for more details. func DecoderByName(ctx context.Context, decoderName string, dflt *Decoder) (*Decoder, error) { // Open a *secrets.Keeper if the decoderName contains "decrypt". k, decoderName, err := decryptByName(ctx, decoderName) if err != nil { return nil, err } if dflt == nil { dflt = BytesDecoder } switch decoderName { case "": return maybeDecrypt(ctx, k, dflt), nil case "bytes": return maybeDecrypt(ctx, k, BytesDecoder), nil case "jsonmap": var m map[string]any return maybeDecrypt(ctx, k, NewDecoder(&m, JSONDecode)), nil case "string": return maybeDecrypt(ctx, k, StringDecoder), nil default: return nil, fmt.Errorf("unsupported decoder %q", decoderName) } } // decryptByName returns a *secrets.Keeper for decryption when decoderName // contains "decrypt". func decryptByName(ctx context.Context, decoderName string) (*secrets.Keeper, string, error) { if !strings.HasPrefix(decoderName, "decrypt") { return nil, decoderName, nil } keeperURL := os.Getenv("RUNTIMEVAR_KEEPER_URL") if keeperURL == "" { return nil, "", errors.New("environment variable RUNTIMEVAR_KEEPER_URL needed to open a *secrets.Keeper for decryption") } k, err := secrets.OpenKeeper(ctx, keeperURL) if err != nil { return nil, "", err } decoderName = strings.TrimPrefix(decoderName, "decrypt") if decoderName != "" { decoderName = strings.TrimLeftFunc(decoderName, func(r rune) bool { return r == ' ' || r == '+' }) } // The parsed value is "decrypt ". return k, decoderName, nil } func maybeDecrypt(ctx context.Context, k *secrets.Keeper, dec *Decoder) *Decoder { if k == nil { return dec } return NewDecoder(reflect.New(dec.typ).Elem().Interface(), DecryptDecode(k, dec.fn)) } ================================================ FILE: runtimevar/runtimevar_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package runtimevar contains tests that exercises the runtimevar APIs. It does not test // driver implementations. package runtimevar import ( "bytes" "context" "encoding/gob" "encoding/json" "errors" "fmt" "net/url" "reflect" "sync" "testing" "time" "github.com/google/go-cmp/cmp" "gocloud.dev/gcerrors" "gocloud.dev/internal/gcerr" "gocloud.dev/runtimevar/driver" "gocloud.dev/secrets/localsecrets" ) // How long we wait on a call that is expected to block forever before cancelling it. const blockingCheckDelay = 25 * time.Millisecond // state implements driver.State. type state struct { val string updateTime time.Time err error } func (s *state) Value() (any, error) { return s.val, s.err } func (s *state) UpdateTime() time.Time { return s.updateTime } func (s *state) As(i any) bool { return false } // fakeWatcher is a fake implementation of driver.Watcher that returns a set *state. type fakeWatcher struct { driver.Watcher mu sync.Mutex state *state newval bool // true iff WatchVariable should return state } func (w *fakeWatcher) Set(s *state) { w.mu.Lock() defer w.mu.Unlock() w.state = s w.newval = true } func (w *fakeWatcher) WatchVariable(ctx context.Context, prev driver.State) (driver.State, time.Duration) { if err := ctx.Err(); err != nil { w.Set(&state{err: err}) } w.mu.Lock() defer w.mu.Unlock() if !w.newval { return nil, 1 * time.Millisecond // to avoid spinning } w.newval = false return w.state, 0 } func (*fakeWatcher) Close() error { return nil } func (*fakeWatcher) ErrorCode(error) gcerrors.ErrorCode { return gcerrors.Internal } func TestVariable_Watch(t *testing.T) { fake := &fakeWatcher{} v := New(fake) ctx := context.Background() // Watch should block when there's no value yet. ctx2, cancel := context.WithTimeout(ctx, blockingCheckDelay) defer cancel() if _, err := v.Watch(ctx2); err == nil { t.Errorf("Watch with no value yet should block: got nil err, want err") } if ctx2.Err() == nil { t.Error("Watch with no value yet should block") } // Setting an error value makes Watch return an error. fake.Set(&state{err: errFake}) if _, err := v.Watch(ctx); err == nil { t.Fatal("Watch returned non-nil error, want error") } // But calling Watch again blocks. ctx2, cancel = context.WithTimeout(ctx, blockingCheckDelay) defer cancel() if _, err := v.Watch(ctx2); err == nil { t.Errorf("Watch called again with error value should block: got nil err, want err") } if ctx2.Err() == nil { t.Error("Watch called again with error value should block") } // Setting a different error makes Watch return again. fake.Set(&state{err: errors.New("another fake error")}) if _, err := v.Watch(ctx); err == nil { t.Fatal("Watch returned non-nil error, want error") } // Setting a value makes Watch return again. fake.Set(&state{val: "hello"}) if _, err := v.Watch(ctx); err != nil { t.Fatalf("Watch returned error %v, want nil", err) } // Make a few updates. Each of these will try to write to the nextWatchCh, // but we should only keep the latest one. fake.Set(&state{val: "hello1"}) fake.Set(&state{val: "hello2"}) fake.Set(&state{val: "hello3"}) fake.Set(&state{val: "hello4"}) fake.Set(&state{val: "hello5"}) // Wait until we're sure the last one has been received. for { snap, err := v.Latest(ctx) if err != nil { t.Errorf("got unexpected error from Latest: %v", err) } if snap.Value == "hello5" { break } } // Watch should get the last one, hello5. if snap, err := v.Watch(ctx); err != nil { t.Fatalf("Watch returned error %v, want nil", err) } else if snap.Value != "hello5" { t.Errorf("Watch got %v, want hello5", snap.Value) } // And the next call should block. ctx2, cancel = context.WithTimeout(ctx, blockingCheckDelay) defer cancel() if _, err := v.Watch(ctx2); err == nil { t.Errorf("Watch after no change in good value should block: got nil err, want err") } if ctx2.Err() == nil { t.Error("Watch after no change in good value should block") } // Ensure a blocking Watch returns when a new value arrives. // Wait blockingCheckDelay to give some time to be blocking in Watch. // There's no guarantee it will get there, but if Watch doesn't handle // cancelation properly, then the test will fail whenever it does get there, // so at least we'll observe a flaky test. time.AfterFunc(blockingCheckDelay, func() { fake.Set(&state{val: "hello6"}) }) if snap, err := v.Watch(ctx); err != nil { t.Errorf("Watch interrupted by new value returned %v, want nil", err) } else if snap.Value != "hello6" { t.Errorf("Watch got %v, want hello6", snap.Value) } // Similarly, ensure a blocking Watch is interrupted by Close. time.AfterFunc(blockingCheckDelay, func() { if err := v.Close(); err != nil { t.Error(err) } }) if _, err := v.Watch(ctx); err != ErrClosed { t.Errorf("Watch interrupted by Close returned %v, want ErrClosed", err) } // Watch should now return ErrClosed. if _, err := v.Watch(ctx); err != ErrClosed { t.Errorf("Watch after Close returned %v, want ErrClosed", err) } } func TestVariable_Latest(t *testing.T) { const content1, content2 = "foo", "bar" const numGoroutines = 10 ctx := context.Background() fake := &fakeWatcher{} v := New(fake) // Not healthy at startup. if v.CheckHealth() == nil { t.Error("got nil from CheckHealth, want error") } // Latest should block until the context is done, as there's no value. ctx2, cancel := context.WithTimeout(ctx, blockingCheckDelay) defer cancel() if _, err := v.Latest(ctx2); err == nil { t.Errorf("Latest with no value yet should block: got nil err, want err") } if ctx2.Err() == nil { t.Error("Latest with no value yet should block") } // And we're not healthy. if v.CheckHealth() == nil { t.Error("got nil from CheckHealth, want error") } // Call Latest concurrently. There's still no value. var wg sync.WaitGroup wg.Add(numGoroutines) for range numGoroutines { go func() { ctx2, cancel := context.WithTimeout(ctx, blockingCheckDelay) cancel() if _, err := v.Latest(ctx2); err == nil { t.Errorf("Latest with no value yet: got nil err, want err") } wg.Done() }() } wg.Wait() // Set an error value. Latest should still block. fake.Set(&state{err: errFake}) ctx2, cancel = context.WithTimeout(ctx, blockingCheckDelay) defer cancel() if _, err := v.Latest(ctx2); err == nil { t.Errorf("Latest with error value should block: got nil err, want err") } if ctx2.Err() == nil { t.Error("Latest with error value should block") } // And we're still not healthy. if v.CheckHealth() == nil { t.Error("got nil from CheckHealth, want error") } // Call Latest concurrently, only exiting each goroutine when they // see the content1 value. wg.Add(numGoroutines) for range numGoroutines { go func() { for { val, err := v.Latest(ctx) if err != nil { continue } if val.Value != content1 { t.Errorf("got %v want %s", val, content1) } wg.Done() return } }() } // Set a good value, after a small delay to give the goroutines a chance // to get into Latest. time.Sleep(blockingCheckDelay) fake.Set(&state{val: content1}) wg.Wait() // And now we're healthy. if err := v.CheckHealth(); err != nil { t.Errorf("got %v from CheckHealth, want nil", err) } // Set a different value. At some point after this, Latest should start // returning a Snapshot with Value set to content2. fake.Set(&state{val: content2}) // Call Latest concurrently, only exiting each goroutine when they // see the content2 value. wg.Add(numGoroutines) for range numGoroutines { go func() { for { val, err := v.Latest(ctx) if err != nil { // Errors are unexpected at this point. t.Error(err) } if val.Value == content1 { // Still seeing the old value. continue } if val.Value != content2 { t.Errorf("got %v want %s", val, content2) } wg.Done() return } }() } wg.Wait() // Set an error value. Latest should still return content2. fake.Set(&state{err: errFake}) // Call Latest concurrently. The test will be flaky if some of them // start getting errors. wg.Add(numGoroutines) for range numGoroutines { go func() { val, err := v.Latest(ctx) if err != nil { // Errors are unexpected at this point. t.Error(err) } else if val.Value != content2 { t.Errorf("got %v want %s", val.Value, content2) } wg.Done() return }() } wg.Wait() // Still healthy. if err := v.CheckHealth(); err != nil { t.Errorf("got %v from CheckHealth, want nil", err) } // Close the variable. if err := v.Close(); err != nil { t.Error(err) } // Latest should now return ErrClosed. if _, err := v.Latest(ctx); err != ErrClosed { t.Errorf("Latest after close returned %v, want ErrClosed", err) } // Unhealthy now. if err := v.CheckHealth(); err != ErrClosed { t.Errorf("got %v from CheckHealth, want ErrClosed", err) } } // Tests that Latest is interrupted by Close. func TestVariable_LatestBlockedDuringClose(t *testing.T) { fake := &fakeWatcher{} v := New(fake) ctx := context.Background() // Wait blockingCheckDelay to give some time to be blocking in Latest. // There's no guarantee it will get there, but if Latest doesn't handle // cancelation properly, then the test will fail whenever it does get there, // so at least we'll observe a flaky test. time.AfterFunc(blockingCheckDelay, func() { if err := v.Close(); err != nil { t.Error(err) } }) if _, err := v.Latest(ctx); err != ErrClosed { t.Errorf("Latest interrupted by Close got %v, want ErrClosed", err) } // Calling Close again should return ErrClosed. if err := v.Close(); err != ErrClosed { t.Errorf("calling Close 2x returned %v, want ErrClosed", err) } } var errFake = errors.New("fake") // erroringWatcher implements driver.Watcher. // WatchVariable always returns a state with errFake, and Close // always returns errFake. type erroringWatcher struct { driver.Watcher } func (b *erroringWatcher) WatchVariable(ctx context.Context, prev driver.State) (driver.State, time.Duration) { return &state{err: errFake}, 0 } func (b *erroringWatcher) Close() error { return errFake } func (b *erroringWatcher) ErrorCode(err error) gcerrors.ErrorCode { return gcerrors.Internal } // TestErrorsAreWrapped tests that all errors returned from the driver are // wrapped exactly once by the portable type. func TestErrorsAreWrapped(t *testing.T) { ctx := context.Background() v := New(&erroringWatcher{}) // verifyWrap ensures that err is wrapped exactly once. verifyWrap := func(description string, err error) { if unwrapped, ok := err.(*gcerr.Error); !ok { t.Errorf("%s: not wrapped: %v", description, err) } else if du, ok := unwrapped.Unwrap().(*gcerr.Error); ok { t.Errorf("%s: double wrapped: %v", description, du) } } _, err := v.Watch(ctx) verifyWrap("Watch", err) err = v.Close() verifyWrap("Close", err) } var ( testOpenOnce sync.Once testOpenGot *url.URL ) func TestURLMux(t *testing.T) { ctx := context.Background() mux := new(URLMux) fake := &fakeOpener{} mux.RegisterVariable("foo", fake) mux.RegisterVariable("err", fake) if diff := cmp.Diff(mux.VariableSchemes(), []string{"err", "foo"}); diff != "" { t.Errorf("Schemes: %s", diff) } if !mux.ValidVariableScheme("foo") || !mux.ValidVariableScheme("err") { t.Errorf("ValidVariableScheme didn't return true for valid scheme") } if mux.ValidVariableScheme("foo2") || mux.ValidVariableScheme("http") { t.Errorf("ValidVariableScheme didn't return false for invalid scheme") } for _, tc := range []struct { name string url string wantErr bool }{ { name: "empty URL", wantErr: true, }, { name: "invalid URL", url: ":foo", wantErr: true, }, { name: "invalid URL no scheme", url: "foo", wantErr: true, }, { name: "unregistered scheme", url: "bar://myvar", wantErr: true, }, { name: "func returns error", url: "err://myvar", wantErr: true, }, { name: "no query options", url: "foo://myvar", }, { name: "empty query options", url: "foo://myvar?", }, { name: "query options", url: "foo://myvar?aAa=bBb&cCc=dDd", }, { name: "multiple query options", url: "foo://myvar?x=a&x=b&x=c", }, { name: "fancy var name", url: "foo:///foo/bar/baz", }, { name: "using api scheme prefix", url: "runtimevar+foo:///foo/bar/baz", }, { name: "using api+type scheme prefix", url: "runtimevar+variable+foo:///foo/bar/baz", }, } { t.Run(tc.name, func(t *testing.T) { _, gotErr := mux.OpenVariable(ctx, tc.url) if (gotErr != nil) != tc.wantErr { t.Fatalf("got err %v, want error %v", gotErr, tc.wantErr) } if gotErr != nil { return } if got := fake.u.String(); got != tc.url { t.Errorf("got %q want %q", got, tc.url) } // Repeat with OpenVariableURL. parsed, err := url.Parse(tc.url) if err != nil { t.Fatal(err) } _, gotErr = mux.OpenVariableURL(ctx, parsed) if gotErr != nil { t.Fatalf("got err %v, want nil", gotErr) } if got := fake.u.String(); got != tc.url { t.Errorf("got %q want %q", got, tc.url) } }) } } type fakeOpener struct { u *url.URL // last url passed to OpenVariableURL } func (o *fakeOpener) OpenVariableURL(ctx context.Context, u *url.URL) (*Variable, error) { if u.Scheme == "err" { return nil, errors.New("fail") } o.u = u return nil, nil } func TestDecoder(t *testing.T) { type Struct struct { FieldA string FieldB map[string]any } num := 4321 numptr := &num str := "boring string" strptr := &str inputs := []any{ str, strptr, num, numptr, 100.1, Struct{ FieldA: "hello", FieldB: map[string]any{ "hello": "world", }, }, &Struct{ FieldA: "world", }, map[string]string{ "slice": "pizza", }, &map[string]any{}, []string{"hello", "world"}, &[]int{1, 0, 1}, [...]float64{3.1415}, &[...]int64{4, 5, 6}, } for _, tc := range []struct { desc string encodeFn func(any) ([]byte, error) decodeFn Decode }{ { desc: "JSON", encodeFn: json.Marshal, decodeFn: JSONDecode, }, { desc: "Gob", encodeFn: gobMarshal, decodeFn: GobDecode, }, } { for i, input := range inputs { t.Run(fmt.Sprintf("%s_%d", tc.desc, i), func(t *testing.T) { decoder := NewDecoder(input, tc.decodeFn) b, err := tc.encodeFn(input) if err != nil { t.Fatalf("marshal error %v", err) } got, err := decoder.Decode(context.Background(), b) if err != nil { t.Fatalf("parse input\n%s\nerror: %v", string(b), err) } if reflect.TypeOf(got) != reflect.TypeOf(input) { t.Errorf("type mismatch got %T, want %T", got, input) } if diff := cmp.Diff(got, input); diff != "" { t.Errorf("value diff:\n%v", diff) } }) } } } func gobMarshal(v any) ([]byte, error) { var buf bytes.Buffer if err := gob.NewEncoder(&buf).Encode(v); err != nil { return nil, err } return buf.Bytes(), nil } func TestStringDecoder(t *testing.T) { input := "hello world" got, err := StringDecoder.Decode(context.Background(), []byte(input)) if err != nil { t.Fatalf("error: %v", err) } if input != got.(string) { t.Errorf("output got %v, want %q", got, input) } } func TestBytesDecoder(t *testing.T) { input := []byte("hello world") got, err := BytesDecoder.Decode(context.Background(), input) if err != nil { t.Fatalf("error: %v", err) } if diff := cmp.Diff(got, input); diff != "" { t.Errorf("output got %v, want %q", got, input) } } func TestDecryptDecoder(t *testing.T) { ctx := context.Background() secretKey, err := localsecrets.NewRandomKey() if err != nil { t.Fatal(err) } keeper := localsecrets.NewKeeper(secretKey) tests := []struct { desc string in any encodeFn func(any) ([]byte, error) postDecFn Decode }{ { desc: "Bytes", in: []byte("hello world"), encodeFn: func(obj any) ([]byte, error) { return obj.([]byte), nil }, }, { desc: "String", in: "hello world", encodeFn: func(obj any) ([]byte, error) { return []byte(obj.(string)), nil }, postDecFn: StringDecode, }, { desc: "JSON", in: map[string]string{ "slice": "pizza", }, encodeFn: json.Marshal, postDecFn: JSONDecode, }, } for _, tc := range tests { t.Run(tc.desc, func(t *testing.T) { decoder := NewDecoder(tc.in, DecryptDecode(keeper, tc.postDecFn)) b, err := tc.encodeFn(tc.in) if err != nil { t.Fatalf("encode error %v", err) } encrypted, err := keeper.Encrypt(ctx, b) if err != nil { t.Fatalf("encrypt error: %v", err) } got, err := decoder.Decode(ctx, encrypted) if err != nil { t.Fatalf("parse input\n%s\nerror: %v", string(b), err) } if reflect.TypeOf(got) != reflect.TypeOf(tc.in) { t.Errorf("type mismatch got %T, want %T", got, tc.in) } if diff := cmp.Diff(got, tc.in); diff != "" { t.Errorf("value diff:\n%v", diff) } }) } } ================================================ FILE: samples/appengine/.gcloudignore ================================================ # This file specifies files that are *not* uploaded to Google Cloud Platform # using gcloud. It follows the same syntax as .gitignore, with the addition of # "#!include" directives (which insert the entries of the given .gitignore-style # file at that point). # # For more information, run: # $ gcloud topic gcloudignore # .gcloudignore # If you would like to upload your .git directory, .gitignore file or files # from your .gitignore file, remove the corresponding line # below: .git .gitignore # Binaries for programs and plugins *.exe *.exe~ *.dll *.so *.dylib # Test binary, build with `go test -c` *.test # Output of the go coverage tool, specifically when used with LiteIDE *.out ================================================ FILE: samples/appengine/README.md ================================================ # AppEngine Sample This directory holds a simple "Hello world!" AppEngine app that uses [server.Server](https://github.com/google/go-cloud/blob/master/server/server.go). ## Prerequisites You will need to install the following software to run this sample: - [Go](https://golang.org/doc/install) - [gcloud CLI](https://cloud.google.com/sdk/downloads) ## Deploying Run the following in this `samples/appengine` directory: ```shell # Build the binary. go build # Deploy it to AppEngine. gcloud app deploy # Open a browser to the app. gcloud app browse ``` Try browsing to the `/healthz/readiness` page that `server.Server` adds a handler for. ================================================ FILE: samples/appengine/app.yaml ================================================ runtime: go111 ================================================ FILE: samples/appengine/helloworld.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // A simple "hello world" application using server.Server, to be run on // Google App Engine (GAE). package main import ( "fmt" "log" "net/http" "os" "github.com/gorilla/mux" "gocloud.dev/server" ) func main() { r := mux.NewRouter() r.HandleFunc("/", handle) port := os.Getenv("PORT") if port == "" { port = "8080" } srv := server.New(r, nil) log.Printf("Listening on port %s", port) log.Fatal(srv.ListenAndServe(fmt.Sprintf(":%s", port))) } func handle(w http.ResponseWriter, r *http.Request) { if r.URL.Path != "/" { http.NotFound(w, r) return } fmt.Fprint(w, "Hello world!") } ================================================ FILE: samples/go.mod ================================================ // Copyright 2018-2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. module gocloud.dev/samples go 1.25.0 require ( github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.4 github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1 github.com/aws/aws-sdk-go-v2/service/ssm v1.68.3 github.com/go-sql-driver/mysql v1.9.3 github.com/google/go-cmdtest v0.3.0 github.com/google/go-cmp v0.7.0 github.com/google/subcommands v1.2.0 github.com/google/uuid v1.6.0 github.com/google/wire v0.7.0 github.com/gorilla/mux v1.8.1 github.com/streadway/amqp v1.0.0 go.opentelemetry.io/contrib/exporters/autoexport v0.67.0 go.opentelemetry.io/contrib/propagators/autoprop v0.67.0 go.opentelemetry.io/otel v1.42.0 go.opentelemetry.io/otel/log v0.18.0 go.opentelemetry.io/otel/metric v1.42.0 go.opentelemetry.io/otel/sdk v1.42.0 go.opentelemetry.io/otel/sdk/log v0.18.0 go.opentelemetry.io/otel/sdk/metric v1.42.0 go.opentelemetry.io/otel/trace v1.42.0 gocloud.dev v0.45.0 gocloud.dev/docstore/mongodocstore v0.45.0 gocloud.dev/pubsub/kafkapubsub v0.45.0 gocloud.dev/pubsub/natspubsub v0.45.0 gocloud.dev/pubsub/rabbitpubsub v0.45.0 gocloud.dev/runtimevar/hashivault v0.45.0 gocloud.dev/secrets/hashivault v0.45.0 google.golang.org/genproto v0.0.0-20260316180232-0b37fe3546d5 gopkg.in/pipe.v2 v2.0.0-20140414041502-3c2ca4d52544 ) require ( cel.dev/expr v0.25.1 // indirect cloud.google.com/go v0.123.0 // indirect cloud.google.com/go/auth v0.18.2 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect cloud.google.com/go/firestore v1.21.0 // indirect cloud.google.com/go/iam v1.5.3 // indirect cloud.google.com/go/kms v1.26.0 // indirect cloud.google.com/go/longrunning v0.8.0 // indirect cloud.google.com/go/monitoring v1.24.3 // indirect cloud.google.com/go/pubsub v1.50.1 // indirect cloud.google.com/go/pubsub/v2 v2.4.0 // indirect cloud.google.com/go/storage v1.61.3 // indirect cloud.google.com/go/trace v1.11.7 // indirect filippo.io/edwards25519 v1.2.0 // indirect github.com/Azure/azure-amqp-common-go/v3 v3.2.3 // indirect github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 // indirect github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys v0.10.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.7.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.10.0 // indirect github.com/Azure/go-amqp v1.5.1 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.7.0 // indirect github.com/GoogleCloudPlatform/cloudsql-proxy v1.37.13 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.31.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/propagator v0.55.0 // indirect github.com/IBM/sarama v1.47.0 // indirect github.com/XSAM/otelsql v0.41.0 // indirect github.com/aws/aws-sdk-go v1.55.8 // indirect github.com/aws/aws-sdk-go-v2 v1.41.4 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7 // indirect github.com/aws/aws-sdk-go-v2/config v1.32.12 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.19.12 // indirect github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.20.35 // indirect github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.8.35 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 // indirect github.com/aws/aws-sdk-go-v2/feature/rds/auth v1.6.20 // indirect github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.22.8 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 // indirect github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21 // indirect github.com/aws/aws-sdk-go-v2/service/dynamodb v1.56.2 // indirect github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.32.13 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 // indirect github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12 // indirect github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.11.20 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 // indirect github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20 // indirect github.com/aws/aws-sdk-go-v2/service/kms v1.50.3 // indirect github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 // indirect github.com/aws/aws-sdk-go-v2/service/sns v1.39.14 // indirect github.com/aws/aws-sdk-go-v2/service/sqs v1.42.24 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 // indirect github.com/aws/smithy-go v1.24.2 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/eapache/go-resiliency v1.7.0 // indirect github.com/eapache/queue v1.1.0 // indirect github.com/envoyproxy/go-control-plane/envoy v1.37.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/go-jose/go-jose/v4 v4.1.3 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/golang-jwt/jwt/v5 v5.3.1 // indirect github.com/golang/snappy v1.0.0 // indirect github.com/google/go-replayers/grpcreplay v1.3.0 // indirect github.com/google/go-replayers/httpreplay v1.2.0 // indirect github.com/google/martian/v3 v3.3.3 // indirect github.com/google/renameio v0.1.0 // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.14 // indirect github.com/googleapis/gax-go/v2 v2.19.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-retryablehttp v0.7.8 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect github.com/hashicorp/go-secure-stdlib/parseutil v0.2.0 // indirect github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 // indirect github.com/hashicorp/go-sockaddr v1.0.7 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect github.com/hashicorp/hcl v1.0.1-vault-7 // indirect github.com/hashicorp/vault/api v1.22.0 // indirect github.com/jcmturner/aescts/v2 v2.0.0 // indirect github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect github.com/jcmturner/gofork v1.7.6 // indirect github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect github.com/jcmturner/rpc/v2 v2.0.3 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/klauspost/compress v1.18.4 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/montanaflynn/stats v0.8.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nats-io/nats.go v1.49.0 // indirect github.com/nats-io/nkeys v0.4.15 // indirect github.com/nats-io/nuid v1.0.1 // indirect github.com/pierrec/lz4/v4 v4.1.26 // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/prometheus/client_golang v1.23.2 // indirect github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.67.5 // indirect github.com/prometheus/otlptranslator v1.0.0 // indirect github.com/prometheus/procfs v0.20.1 // indirect github.com/rabbitmq/amqp091-go v1.10.0 // indirect github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9 // indirect github.com/ryanuber/go-glob v1.0.0 // indirect github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect github.com/xdg-go/scram v1.2.0 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect go.mongodb.org/mongo-driver v1.17.9 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/bridges/prometheus v0.67.0 // indirect go.opentelemetry.io/contrib/detectors/aws/ec2 v1.38.0 // indirect go.opentelemetry.io/contrib/detectors/gcp v1.42.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 // indirect go.opentelemetry.io/contrib/propagators/aws v1.42.0 // indirect go.opentelemetry.io/contrib/propagators/b3 v1.42.0 // indirect go.opentelemetry.io/contrib/propagators/jaeger v1.42.0 // indirect go.opentelemetry.io/contrib/propagators/ot v1.42.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.18.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.18.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.42.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.42.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.42.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.42.0 // indirect go.opentelemetry.io/otel/exporters/prometheus v0.64.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.18.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.42.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.42.0 // indirect go.opentelemetry.io/proto/otlp v1.10.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.1 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect golang.org/x/crypto v0.49.0 // indirect golang.org/x/net v0.52.0 // indirect golang.org/x/oauth2 v0.36.0 // indirect golang.org/x/sync v0.20.0 // indirect golang.org/x/sys v0.42.0 // indirect golang.org/x/text v0.35.0 // indirect golang.org/x/time v0.15.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect google.golang.org/api v0.272.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260316180232-0b37fe3546d5 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260316180232-0b37fe3546d5 // indirect google.golang.org/grpc v1.79.3 // indirect google.golang.org/protobuf v1.36.11 // indirect ) replace gocloud.dev => ../ replace gocloud.dev/docstore/mongodocstore => ../docstore/mongodocstore replace gocloud.dev/pubsub/kafkapubsub => ../pubsub/kafkapubsub replace gocloud.dev/pubsub/natspubsub => ../pubsub/natspubsub replace gocloud.dev/pubsub/rabbitpubsub => ../pubsub/rabbitpubsub replace gocloud.dev/runtimevar/hashivault => ../runtimevar/hashivault replace gocloud.dev/secrets/hashivault => ../secrets/hashivault ================================================ FILE: samples/go.sum ================================================ cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= cloud.google.com/go/auth v0.18.2 h1:+Nbt5Ev0xEqxlNjd6c+yYUeosQ5TtEUaNcN/3FozlaM= cloud.google.com/go/auth v0.18.2/go.mod h1:xD+oY7gcahcu7G2SG2DsBerfFxgPAJz17zz2joOFF3M= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.21.0 h1:BhopUsx7kh6NFx77ccRsHhrtkbJUmDAxNY3uapWdjcM= cloud.google.com/go/firestore v1.21.0/go.mod h1:1xH6HNcnkf/gGyR8udd6pFO4Z7GWJSwLKQMx/u6UrP4= cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= cloud.google.com/go/kms v1.26.0 h1:cK9mN2cf+9V63D3H1f6koxTatWy39aTI/hCjz1I+adU= cloud.google.com/go/kms v1.26.0/go.mod h1:pHKOdFJm63hxBsiPkYtowZPltu9dW0MWvBa6IA4HM58= cloud.google.com/go/logging v1.13.2 h1:qqlHCBvieJT9Cdq4QqYx1KPadCQ2noD4FK02eNqHAjA= cloud.google.com/go/logging v1.13.2/go.mod h1:zaybliM3yun1J8mU2dVQ1/qDzjbOqEijZCn6hSBtKak= cloud.google.com/go/longrunning v0.8.0 h1:LiKK77J3bx5gDLi4SMViHixjD2ohlkwBi+mKA7EhfW8= cloud.google.com/go/longrunning v0.8.0/go.mod h1:UmErU2Onzi+fKDg2gR7dusz11Pe26aknR4kHmJJqIfk= cloud.google.com/go/monitoring v1.24.3 h1:dde+gMNc0UhPZD1Azu6at2e79bfdztVDS5lvhOdsgaE= cloud.google.com/go/monitoring v1.24.3/go.mod h1:nYP6W0tm3N9H/bOw8am7t62YTzZY+zUeQ+Bi6+2eonI= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/pubsub v1.50.1 h1:fzbXpPyJnSGvWXF1jabhQeXyxdbCIkXTpjXHy7xviBM= cloud.google.com/go/pubsub v1.50.1/go.mod h1:6YVJv3MzWJUVdvQXG081sFvS0dWQOdnV+oTo++q/xFk= cloud.google.com/go/pubsub/v2 v2.4.0 h1:oMKNiBQpXImRWnHYla9uSU66ZzByZwBSCJOEs/pTKVg= cloud.google.com/go/pubsub/v2 v2.4.0/go.mod h1:2lS/XQKq5qtOMs6kHBK+WX1ytUC36kLl2ig3zqsGUx8= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.61.3 h1:VS//ZfBuPGDvakfD9xyPW1RGF1Vy3BWUoVZXgW1KMOg= cloud.google.com/go/storage v1.61.3/go.mod h1:JtqK8BBB7TWv0HVGHubtUdzYYrakOQIsMLffZ2Z/HWk= cloud.google.com/go/trace v1.11.7 h1:kDNDX8JkaAG3R2nq1lIdkb7FCSi1rCmsEtKVsty7p+U= cloud.google.com/go/trace v1.11.7/go.mod h1:TNn9d5V3fQVf6s4SCveVMIBS2LJUqo73GACmq/Tky0s= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= filippo.io/edwards25519 v1.2.0 h1:crnVqOiS4jqYleHd9vaKZ+HKtHfllngJIiOpNpoJsjo= filippo.io/edwards25519 v1.2.0/go.mod h1:xzAOLCNug/yB62zG1bQ8uziwrIqIuxhctzJT18Q77mc= github.com/Azure/azure-amqp-common-go/v3 v3.2.3 h1:uDF62mbd9bypXWi19V1bN5NZEO84JqgmI5G73ibAmrk= github.com/Azure/azure-amqp-common-go/v3 v3.2.3/go.mod h1:7rPmbSfszeovxGfc5fSAXE4ehlXQZHpMja2OtxC2Tas= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0 h1:fou+2+WFTib47nS+nz/ozhEBnvU96bKHy6LjRsY4E28= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0/go.mod h1:t76Ruy8AHvUAC8GfMWJMa0ElSbuIcO03NLpynfbgsPA= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1 h1:Hk5QBxZQC1jb2Fwj6mpzme37xbCDdNTxU7O9eb5+LB4= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1/go.mod h1:IYus9qsFobWIc2YVwe/WPjcnyCkPKtnHAqUYeebc8z0= github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2 h1:yz1bePFlP5Vws5+8ez6T3HWXPmwOK7Yvq8QxDBD3SKY= github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2/go.mod h1:Pa9ZNPuoNu/GztvBSKk9J1cDJW6vk/n0zLtV4mgd8N8= github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 h1:9iefClla7iYpfYWdzPCRDozdmndjTm8DXdpCzPajMgA= github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2/go.mod h1:XtLgD3ZD34DAaVIIAyG3objl5DynM3CQ/vMcbBNJZGI= github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys v0.10.0 h1:m/sWOGCREuSBqg2htVQTBY8nOZpyajYztF0vUvSZTuM= github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys v0.10.0/go.mod h1:Pu5Zksi2KrU7LPbZbNINx6fuVrUp/ffvpxdDj+i8LeE= github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.7.1 h1:FbH3BbSb4bvGluTesZZ+ttN/MDsnMmQP36OSnDuSXqw= github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.7.1/go.mod h1:9V2j0jn9jDEkCkv8w/bKTNppX/d0FVA1ud77xCIP4KA= github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.10.0 h1:kE5kpeiSqu4jcCQ/sWuyggMXJ/pT6oQ99+8hwPmyeJ0= github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.10.0/go.mod h1:IAN3Z0DMtehoxoQQnfqg1891z1P7GNoDryKtFcAyMBI= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.1 h1:/Zt+cDPnpC3OVDm/JKLOs7M2DKmLRIIp3XIx9pHHiig= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.1/go.mod h1:Ng3urmn6dYe8gnbCMoHHVl5APYz2txho3koEkV2o2HA= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.4 h1:jWQK1GI+LeGGUKBADtcH2rRqPxYB1Ljwms5gFA2LqrM= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.4/go.mod h1:8mwH4klAm9DUgR2EEHyEEAQlRDvLPyg5fQry3y+cDew= github.com/Azure/go-amqp v0.17.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= github.com/Azure/go-amqp v1.5.1 h1:WyiPTz2C3zVvDL7RLAqwWdeoYhMtX62MZzQoP09fzsU= github.com/Azure/go-amqp v1.5.1/go.mod h1:vZAogwdrkbyK3Mla8m/CxSc/aKdnTZ4IbPxl51Y5WZE= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJTmL004Abzc5wDB5VtZG2PJk5ndYDgVacGqfirKxjM= github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE= github.com/AzureAD/microsoft-authentication-library-for-go v1.7.0 h1:4iB+IesclUXdP0ICgAabvq2FYLXrJWKx1fJQ+GxSo3Y= github.com/AzureAD/microsoft-authentication-library-for-go v1.7.0/go.mod h1:HKpQxkWaGLJ+D/5H8QRpyQXA1eKjxkFlOMwck5+33Jk= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/GoogleCloudPlatform/cloudsql-proxy v1.37.13 h1:cszvE7VCNLGIvcr7mOZ5lOIqITQfQnn4NXbuHozqO4c= github.com/GoogleCloudPlatform/cloudsql-proxy v1.37.13/go.mod h1:6IMmxkLFo8kvCZbG0egv30L6YSgeZwxjH0WVRMGAacQ= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0 h1:DHa2U07rk8syqvCge0QIGMCE1WxGj9njT44GH7zNJLQ= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 h1:UnDZ/zFfG1JhH/DqxIZYU/1CUAlTUScoXD/LcM2Ykk8= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0/go.mod h1:IA1C1U7jO/ENqm/vhi7V9YYpBsp+IMyqNrEN94N7tVc= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.31.0 h1:xQMhkBXPOKe/GzC6TctwlK2aNF+9k5VwFgdE83rBK2Y= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.31.0/go.mod h1:VLoD5cAsRQXsAFXpOZrrTGzbuMsntlspIZno4xor5Zg= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.55.0 h1:7t/qx5Ost0s0wbA/VDrByOooURhp+ikYwv20i9Y07TQ= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.55.0/go.mod h1:vB2GH9GAYYJTO3mEn8oYwzEdhlayZIdQz6zdzgUIRvA= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 h1:0s6TxfCu2KHkkZPnBfsQ2y5qia0jl3MMrmBhu3nCOYk= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0/go.mod h1:Mf6O40IAyB9zR/1J8nGDDPirZQQPbYJni8Yisy7NTMc= github.com/GoogleCloudPlatform/opentelemetry-operations-go/propagator v0.55.0 h1:0G1Faw/W6OirxOw2Kgz303+JuUgifQXYS5J21NtZxog= github.com/GoogleCloudPlatform/opentelemetry-operations-go/propagator v0.55.0/go.mod h1:8W5IW/jylevlBQKSWkh5ZMP2oy7yT9Pnfug6Y6W/9D8= github.com/IBM/sarama v1.47.0 h1:GcQFEd12+KzfPYeLgN69Fh7vLCtYRhVIx0rO4TZO318= github.com/IBM/sarama v1.47.0/go.mod h1:7gLLIU97nznOmA6TX++Qds+DRxH89P2XICY2KAQUzAY= github.com/XSAM/otelsql v0.41.0 h1:uZifjQhZhv5EDYJh+IVk1DiYxQZJBlNSen0MBFnfxB8= github.com/XSAM/otelsql v0.41.0/go.mod h1:NMQT0PiKoFILp9QgjQz+D5mvW+9mT0suR7OejqrtMaM= github.com/antithesishq/antithesis-sdk-go v0.5.0-default-no-op h1:Ucf+QxEKMbPogRO5guBNe5cgd9uZgfoJLOYs8WWhtjM= github.com/antithesishq/antithesis-sdk-go v0.5.0-default-no-op/go.mod h1:IUpT2DPAKh6i/YhSbt6Gl3v2yvUZjmKncl7U91fup7E= github.com/aws/aws-sdk-go v1.55.8 h1:JRmEUbU52aJQZ2AjX4q4Wu7t4uZjOu71uyNmaWlUkJQ= github.com/aws/aws-sdk-go v1.55.8/go.mod h1:ZkViS9AqA6otK+JBBNH2++sx1sgxrPKcSzPPvQkUtXk= github.com/aws/aws-sdk-go-v2 v1.41.4 h1:10f50G7WyU02T56ox1wWXq+zTX9I1zxG46HYuG1hH/k= github.com/aws/aws-sdk-go-v2 v1.41.4/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7 h1:3kGOqnh1pPeddVa/E37XNTaWJ8W6vrbYV9lJEkCnhuY= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7/go.mod h1:lyw7GFp3qENLh7kwzf7iMzAxDn+NzjXEAGjKS2UOKqI= github.com/aws/aws-sdk-go-v2/config v1.32.12 h1:O3csC7HUGn2895eNrLytOJQdoL2xyJy0iYXhoZ1OmP0= github.com/aws/aws-sdk-go-v2/config v1.32.12/go.mod h1:96zTvoOFR4FURjI+/5wY1vc1ABceROO4lWgWJuxgy0g= github.com/aws/aws-sdk-go-v2/credentials v1.19.12 h1:oqtA6v+y5fZg//tcTWahyN9PEn5eDU/Wpvc2+kJ4aY8= github.com/aws/aws-sdk-go-v2/credentials v1.19.12/go.mod h1:U3R1RtSHx6NB0DvEQFGyf/0sbrpJrluENHdPy1j/3TE= github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.20.35 h1:CQ2kB9Q4xQ2PDBmn+KCr/pw1DvK7pH6NkR2nl2KV7ng= github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.20.35/go.mod h1:ypTMB9nZhpqfMeRVesGj4dEknIg0YS+aXGtLMidw/Ek= github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.8.35 h1:qxsbiWRtwChp/rrSHMfYoosVDVWRICoYXoDdczaLFiI= github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.8.35/go.mod h1:SomvXQRUKYBML53k4LqIgszKJKz8TdUwi/Zwig7JhfU= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 h1:zOgq3uezl5nznfoK3ODuqbhVg1JzAGDUhXOsU0IDCAo= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20/go.mod h1:z/MVwUARehy6GAg/yQ1GO2IMl0k++cu1ohP9zo887wE= github.com/aws/aws-sdk-go-v2/feature/rds/auth v1.6.20 h1:nBtAkfvLanKNwKfmsxfpLqYAjKpTAO9yRfuXAKconUY= github.com/aws/aws-sdk-go-v2/feature/rds/auth v1.6.20/go.mod h1:wtCkeFPPKHdxFPrZGkdT5tKR4boa3GvW54sYdGNWPHg= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.22.8 h1:nuc44j+otOY0d1e+CWwB6zul57d2YEGlgCyiq3SL0lI= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.22.8/go.mod h1:qSFgGCN8fjdhvlLhTPZdWRWXbwfeZZWF2FEaIplYPhE= github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 h1:CNXO7mvgThFGqOFgbNAP2nol2qAWBOGfqR/7tQlvLmc= github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20/go.mod h1:oydPDJKcfMhgfcgBUZaG+toBbwy8yPWubJXBVERtI4o= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 h1:tN6W/hg+pkM+tf9XDkWUbDEjGLb+raoBMFsTodcoYKw= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20/go.mod h1:YJ898MhD067hSHA6xYCx5ts/jEd8BSOLtQDL3iZsvbc= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 h1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY= github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21 h1:SwGMTMLIlvDNyhMteQ6r8IJSBPlRdXX5d4idhIGbkXA= github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21/go.mod h1:UUxgWxofmOdAMuqEsSppbDtGKLfR04HGsD0HXzvhI1k= github.com/aws/aws-sdk-go-v2/service/dynamodb v1.56.2 h1:xi/ECwajy2mixviBD7bKAlGGSwzEaFKX2wIhrZt9NGw= github.com/aws/aws-sdk-go-v2/service/dynamodb v1.56.2/go.mod h1:dLREOeW66eVaaGIOi2ZlLHDgkR3nuJ02rd00j0YSlBE= github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.32.13 h1:xQ9dX2jxVm14uNVe0WomcCSza832ytYWt1ZBu2LrBLM= github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.32.13/go.mod h1:D5up2/CMSP4sF8ESBWla6gJvIMySJi8dYYAaED4oTCc= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 h1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12 h1:qtJZ70afD3ISKWnoX3xB0J2otEqu3LqicRcDBqsj0hQ= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12/go.mod h1:v2pNpJbRNl4vEUWEh5ytQok0zACAKfdmKS51Hotc3pQ= github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.11.20 h1:ru+seMuylHiNZlvgZei83eD8h37hRjm1XIMOEmcV0BU= github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.11.20/go.mod h1:ihZMtPTKoX/ugQRHbui6zNdSgVYN1KY2Dgwb2d3hXlc= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 h1:2HvVAIq+YqgGotK6EkMf+KIEqTISmTYh5zLpYyeTo1Y= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20/go.mod h1:V4X406Y666khGa8ghKmphma/7C0DAtEQYhkq9z4vpbk= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20 h1:siU1A6xjUZ2N8zjTHSXFhB9L/2OY8Dqs0xXiLjF30jA= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20/go.mod h1:4TLZCmVJDM3FOu5P5TJP0zOlu9zWgDWU7aUxWbr+rcw= github.com/aws/aws-sdk-go-v2/service/kms v1.50.3 h1:s/zDSG/a/Su9aX+v0Ld9cimUCdkr5FWPmBV8owaEbZY= github.com/aws/aws-sdk-go-v2/service/kms v1.50.3/go.mod h1:/iSgiUor15ZuxFGQSTf3lA2FmKxFsQoc2tADOarQBSw= github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1 h1:csi9NLpFZXb9fxY7rS1xVzgPRGMt7MSNWeQ6eo247kE= github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1/go.mod h1:qXVal5H0ChqXP63t6jze5LmFalc7+ZE7wOdLtZ0LCP0= github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 h1:0GFOLzEbOyZABS3PhYfBIx2rNBACYcKty+XGkTgw1ow= github.com/aws/aws-sdk-go-v2/service/signin v1.0.8/go.mod h1:LXypKvk85AROkKhOG6/YEcHFPoX+prKTowKnVdcaIxE= github.com/aws/aws-sdk-go-v2/service/sns v1.39.14 h1:p8WdWDh5AwSZdp19Haa3XMyPCICi9Z375a/Nu3IIEZY= github.com/aws/aws-sdk-go-v2/service/sns v1.39.14/go.mod h1:NKVY7DER6VXHkt2I/ycmHakALNboi3Rqwt4eEf/1Cnk= github.com/aws/aws-sdk-go-v2/service/sqs v1.42.24 h1:JP2wjWGmUp8lTCZb13Dv0Eciyc1jbO8pd0HZVMHFlrc= github.com/aws/aws-sdk-go-v2/service/sqs v1.42.24/go.mod h1:Ql9ziDutk8ERAN9HMaYANCW3lop451ppebkxEJMLCTM= github.com/aws/aws-sdk-go-v2/service/ssm v1.68.3 h1:bBoWhx8lsFLTXintRX64ZBXcmFZbGqUmaPUrjXECqIc= github.com/aws/aws-sdk-go-v2/service/ssm v1.68.3/go.mod h1:rcRkKbUJ2437WuXdq9fbj+MjTudYWzY9Ct8kiBbN8a8= github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 h1:kiIDLZ005EcKomYYITtfsjn7dtOwHDOFy7IbPXKek2o= github.com/aws/aws-sdk-go-v2/service/sso v1.30.13/go.mod h1:2h/xGEowcW/g38g06g3KpRWDlT+OTfxxI0o1KqayAB8= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 h1:jzKAXIlhZhJbnYwHbvUQZEB8KfgAEuG0dc08Bkda7NU= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17/go.mod h1:Al9fFsXjv4KfbzQHGe6V4NZSZQXecFcvaIF4e70FoRA= github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 h1:Cng+OOwCHmFljXIxpEVXAGMnBia8MSU6Ch5i9PgBkcU= github.com/aws/aws-sdk-go-v2/service/sts v1.41.9/go.mod h1:LrlIndBDdjA/EeXeyNBle+gyCwTlizzW5ycgWnvIxkk= github.com/aws/smithy-go v1.24.2 h1:FzA3bu/nt/vDvmnkg+R8Xl46gmzEDam6mZ1hzmwXFng= github.com/aws/smithy-go v1.24.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os8IaYg++6uMOdKK83QtkkvJik= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4= github.com/coder/websocket v1.8.13 h1:f3QZdXy7uGVz+4uCJy2nTZyM0yTBj8yANEHhqlXZ9FE= github.com/coder/websocket v1.8.13/go.mod h1:LNVeNrXQZfe5qhS9ALED3uA+l5pPqvwXg3CKoDBB2gs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= github.com/eapache/go-resiliency v1.7.0 h1:n3NRTnBn5N0Cbi/IeOHuQn9s2UwVUH7Ga0ZWcP+9JTA= github.com/eapache/go-resiliency v1.7.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU= github.com/envoyproxy/go-control-plane/envoy v1.37.0 h1:u3riX6BoYRfF4Dr7dwSOroNfdSbEPe9Yyl09/B6wBrQ= github.com/envoyproxy/go-control-plane/envoy v1.37.0/go.mod h1:DReE9MMrmecPy+YvQOAOHNYMALuowAnbjjEMkkWOi6A= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds= github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo= github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU= github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63YCY= github.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmdtest v0.3.0 h1:382oNMtKBpvJjOm5c5ONU3pzwh2ZK/eNA4/h2v9PnXM= github.com/google/go-cmdtest v0.3.0/go.mod h1:apVn/GCasLZUVpAJ6oWAuyP7Ne7CEsQbTnc0plM3m+o= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/go-replayers/grpcreplay v1.3.0 h1:1Keyy0m1sIpqstQmgz307zhiJ1pV4uIlFds5weTmxbo= github.com/google/go-replayers/grpcreplay v1.3.0/go.mod h1:v6NgKtkijC0d3e3RW8il6Sy5sqRVUwoQa4mHOGEy8DI= github.com/google/go-replayers/httpreplay v1.2.0 h1:VM1wEyyjaoU53BwrOnaf9VhAyQQEEioJvFYxYcLRKzk= github.com/google/go-replayers/httpreplay v1.2.0/go.mod h1:WahEFFZZ7a1P4VM1qEeHy+tME4bwyqPcwWbNlUI1Mcg= github.com/google/go-tpm v0.9.8 h1:slArAR9Ft+1ybZu0lBwpSmpwhRXaa85hWtMinMyRAWo= github.com/google/go-tpm v0.9.8/go.mod h1:h9jEsEECg7gtLis0upRBQU+GhYVH6jMjrFxI8u6bVUY= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/subcommands v1.2.0 h1:vWQspBTo2nEqTUFita5/KeEWlUL8kQObDFbub/EN9oE= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/wire v0.7.0 h1:JxUKI6+CVBgCO2WToKy/nQk0sS+amI9z9EjVmdaocj4= github.com/google/wire v0.7.0/go.mod h1:n6YbUQD9cPKTnHXEBN2DXlOp/mVADhVErcMFb0v3J18= github.com/googleapis/enterprise-certificate-proxy v0.3.14 h1:yh8ncqsbUY4shRD5dA6RlzjJaT4hi3kII+zYw8wmLb8= github.com/googleapis/enterprise-certificate-proxy v0.3.14/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.19.0 h1:fYQaUOiGwll0cGj7jmHT/0nPlcrZDFPrZRhTsoCr8hE= github.com/googleapis/gax-go/v2 v2.19.0/go.mod h1:w2ROXVdfGEVFXzmlciUU4EdjHgWvB5h2n6x/8XSTTJA= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs= github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-retryablehttp v0.7.8 h1:ylXZWnqa7Lhqpk0L1P1LzDtGcCR0rPVUrx/c8Unxc48= github.com/hashicorp/go-retryablehttp v0.7.8/go.mod h1:rjiScheydd+CxvumBsIrFKlx3iS0jrZ7LvzFGFmuKbw= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-secure-stdlib/parseutil v0.2.0 h1:U+kC2dOhMFQctRfhK0gRctKAPTloZdMU5ZJxaesJ/VM= github.com/hashicorp/go-secure-stdlib/parseutil v0.2.0/go.mod h1:Ll013mhdmsVDuoIXVfBtvgGJsXDYkTw1kooNcoCXuE0= github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 h1:kes8mmyCpxJsI7FTwtzRqEy9CdjCtrXrXGuOpxEA7Ts= github.com/hashicorp/go-secure-stdlib/strutil v0.1.2/go.mod h1:Gou2R9+il93BqX25LAKCLuM+y9U2T4hlwvT1yprcna4= github.com/hashicorp/go-sockaddr v1.0.7 h1:G+pTkSO01HpR5qCxg7lxfsFEZaG+C0VssTy/9dbT+Fw= github.com/hashicorp/go-sockaddr v1.0.7/go.mod h1:FZQbEYa1pxkQ7WLpyXJ6cbjpT8q0YgQaK/JakXqGyWw= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.1-vault-7 h1:ag5OxFVy3QYTFTJODRzTKVZ6xvdfLLCA1cy/Y6xGI0I= github.com/hashicorp/hcl v1.0.1-vault-7/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM= github.com/hashicorp/vault/api v1.22.0 h1:+HYFquE35/B74fHoIeXlZIP2YADVboaPjaSicHEZiH0= github.com/hashicorp/vault/api v1.22.0/go.mod h1:IUZA2cDvr4Ok3+NtK2Oq/r+lJeXkeCrHRmqdyWfpmGM= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg= github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o= github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8= github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/keybase/go-keychain v0.0.1 h1:way+bWYa6lDppZoZcgMbYsvC7GxljxrskdNInRtuthU= github.com/keybase/go-keychain v0.0.1/go.mod h1:PdEILRW3i9D8JcdM+FmY6RwkHGnhHxXwkPPMeUgOK1k= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.18.4 h1:RPhnKRAQ4Fh8zU2FY/6ZFDwTVTxgJ/EMydqSTzE9a2c= github.com/klauspost/compress v1.18.4/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/minio/highwayhash v1.0.4-0.20251030100505-070ab1a87a76 h1:KGuD/pM2JpL9FAYvBrnBBeENKZNh6eNtjqytV6TYjnk= github.com/minio/highwayhash v1.0.4-0.20251030100505-070ab1a87a76/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/montanaflynn/stats v0.8.2 h1:52wnefTJnPI5FoHif1DQh2soKRw0yYs+4AVyvtcZCH0= github.com/montanaflynn/stats v0.8.2/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/nats-io/jwt/v2 v2.8.0 h1:K7uzyz50+yGZDO5o772eRE7atlcSEENpL7P+b74JV1g= github.com/nats-io/jwt/v2 v2.8.0/go.mod h1:me11pOkwObtcBNR8AiMrUbtVOUGkqYjMQZ6jnSdVUIA= github.com/nats-io/nats-server/v2 v2.11.12 h1:jGDXTkcjqQ5fCRstwIxvv1K0RHfftFUoSCT/iIZcqOc= github.com/nats-io/nats-server/v2 v2.11.12/go.mod h1:5MCp/pqm5SEfsvVZ31ll1088ZTwEUdvRX1Hmh/mTTDg= github.com/nats-io/nats.go v1.49.0 h1:yh/WvY59gXqYpgl33ZI+XoVPKyut/IcEaqtsiuTJpoE= github.com/nats-io/nats.go v1.49.0/go.mod h1:fDCn3mN5cY8HooHwE2ukiLb4p4G4ImmzvXyJt+tGwdw= github.com/nats-io/nkeys v0.4.15 h1:JACV5jRVO9V856KOapQ7x+EY8Jo3qw1vJt/9Jpwzkk4= github.com/nats-io/nkeys v0.4.15/go.mod h1:CpMchTXC9fxA5zrMo4KpySxNjiDVvr8ANOSZdiNfUrs= github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/pierrec/lz4/v4 v4.1.26 h1:GrpZw1gZttORinvzBdXPUXATeqlJjqUG/D87TKMnhjY= github.com/pierrec/lz4/v4 v4.1.26/go.mod h1:EoQMVJgeeEOMsCqCzqFm2O0cJvljX2nGZjcRIPL34O4= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4= github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw= github.com/prometheus/otlptranslator v1.0.0 h1:s0LJW/iN9dkIH+EnhiD3BlkkP5QVIUVEoIwkU+A6qos= github.com/prometheus/otlptranslator v1.0.0/go.mod h1:vRYWnXvI6aWGpsdY/mOT/cbeVRBlPWtBNDb7kGR3uKM= github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc= github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo= github.com/rabbitmq/amqp091-go v1.10.0 h1:STpn5XsHlHGcecLmMFCtg7mqq0RnD+zFr4uzukfVhBw= github.com/rabbitmq/amqp091-go v1.10.0/go.mod h1:Hy4jKW5kQART1u+JkDTF9YYOQUHXqMuhrgxOEeS7G4o= github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9 h1:bsUq1dX0N8AOIL7EB/X911+m4EHsnWEHeJ0c+3TTBrg= github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= github.com/streadway/amqp v1.0.0 h1:kuuDrUJFZL1QYL9hUNuCxNObNzB0bV/ZG5jV3RWAQgo= github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.2.0 h1:bYKF2AEwG5rqd1BumT4gAnvwU/M9nBp2pTSxeZw7Wvs= github.com/xdg-go/scram v1.2.0/go.mod h1:3dlrS0iBaWKYVt2ZfA4cj48umJZ+cAEbR6/SjLA88I8= github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.mongodb.org/mongo-driver v1.17.9 h1:IexDdCuuNJ3BHrELgBlyaH9p60JXAvdzWR128q+U5tU= go.mongodb.org/mongo-driver v1.17.9/go.mod h1:LlOhpH5NUEfhxcAwG0UEkMqwYcc4JU18gtCdGudk/tQ= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/bridges/prometheus v0.67.0 h1:dkBzNEAIKADEaFnuESzcXvpd09vxvDZsOjx11gjUqLk= go.opentelemetry.io/contrib/bridges/prometheus v0.67.0/go.mod h1:Z5RIwRkZgauOIfnG5IpidvLpERjhTninpP1dTG2jTl4= go.opentelemetry.io/contrib/detectors/aws/ec2 v1.38.0 h1:gSqtaXUzONG+J3PutTnKpLVLpKLsX+FztJwxSFQ15PU= go.opentelemetry.io/contrib/detectors/aws/ec2 v1.38.0/go.mod h1:AqLDNPbKVFwdXy2/Xu2EYElVHO7ghhbEhKCCWymjpMI= go.opentelemetry.io/contrib/detectors/gcp v1.42.0 h1:kpt2PEJuOuqYkPcktfJqWWDjTEd/FNgrxcniL7kQrXQ= go.opentelemetry.io/contrib/detectors/gcp v1.42.0/go.mod h1:W9zQ439utxymRrXsUOzZbFX4JhLxXU4+ZnCt8GG7yA8= go.opentelemetry.io/contrib/exporters/autoexport v0.67.0 h1:4fnRcNpc6YFtG3zsFw9achKn3XgmxPxuMuqIL5rE8e8= go.opentelemetry.io/contrib/exporters/autoexport v0.67.0/go.mod h1:qTvIHMFKoxW7HXg02gm6/Wofhq5p3Ib/A/NNt1EoBSQ= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0 h1:yI1/OhfEPy7J9eoa6Sj051C7n5dvpj0QX8g4sRchg04= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0/go.mod h1:NoUCKYWK+3ecatC4HjkRktREheMeEtrXoQxrqYFeHSc= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 h1:OyrsyzuttWTSur2qN/Lm0m2a8yqyIjUVBZcxFPuXq2o= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0/go.mod h1:C2NGBr+kAB4bk3xtMXfZ94gqFDtg/GkI7e9zqGh5Beg= go.opentelemetry.io/contrib/propagators/autoprop v0.67.0 h1:XhcQRf4MeqwQw96FcnatDAj6gwE19SUrWZ1VwNg77iE= go.opentelemetry.io/contrib/propagators/autoprop v0.67.0/go.mod h1:7OK06SuNIBIlc5Uq3JGQEsKHuXw29t9OJemvDYyP1dk= go.opentelemetry.io/contrib/propagators/aws v1.42.0 h1:Kbr3xDxs6kcxp5ThXTKWK2OtwLhNoXBVtqguNYcsZL0= go.opentelemetry.io/contrib/propagators/aws v1.42.0/go.mod h1:Jzw9hZHtxdpCN7x8S17UH59X/EiFivp6VXLs9bdM1OQ= go.opentelemetry.io/contrib/propagators/b3 v1.42.0 h1:B2Pew5ufEtgkjLF+tSkXjgYZXQr9m7aCm1wLKB0URbU= go.opentelemetry.io/contrib/propagators/b3 v1.42.0/go.mod h1:iPgUcSEF5DORW6+yNbdw/YevUy+QqJ508ncjhrRSCjc= go.opentelemetry.io/contrib/propagators/jaeger v1.42.0 h1:jP8unWI6q5kcb3gpGLjKDGaUa+JW+nHKWvpS/q+YuWA= go.opentelemetry.io/contrib/propagators/jaeger v1.42.0/go.mod h1:xd89e/pUyPatUP1C4z1UknD9jHptESO99tWyvd4mWD4= go.opentelemetry.io/contrib/propagators/ot v1.42.0 h1:uQjD1NNqX1+DfcAoWParPt1egNg9vC9gH4xarJ9Khxo= go.opentelemetry.io/contrib/propagators/ot v1.42.0/go.mod h1:yw/c2TCmQLIv109HBOCn6NlJ8Dp7MNfjMcqQZRnAMmg= go.opentelemetry.io/otel v1.42.0 h1:lSQGzTgVR3+sgJDAU/7/ZMjN9Z+vUip7leaqBKy4sho= go.opentelemetry.io/otel v1.42.0/go.mod h1:lJNsdRMxCUIWuMlVJWzecSMuNjE7dOYyWlqOXWkdqCc= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.18.0 h1:deI9UQMoGFgrg5iLPgzueqFPHevDl+28YKfSpPTI6rY= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.18.0/go.mod h1:PFx9NgpNUKXdf7J4Q3agRxMs3Y07QhTCVipKmLsMKnU= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.18.0 h1:icqq3Z34UrEFk2u+HMhTtRsvo7Ues+eiJVjaJt62njs= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.18.0/go.mod h1:W2m8P+d5Wn5kipj4/xmbt9uMqezEKfBjzVJadfABSBE= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.42.0 h1:MdKucPl/HbzckWWEisiNqMPhRrAOQX8r4jTuGr636gk= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.42.0/go.mod h1:RolT8tWtfHcjajEH5wFIZ4Dgh5jpPdFXYV9pTAk/qjc= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.42.0 h1:H7O6RlGOMTizyl3R08Kn5pdM06bnH8oscSj7o11tmLA= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.42.0/go.mod h1:mBFWu/WOVDkWWsR7Tx7h6EpQB8wsv7P0Yrh0Pb7othc= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.42.0 h1:THuZiwpQZuHPul65w4WcwEnkX2QIuMT+UFoOrygtoJw= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.42.0/go.mod h1:J2pvYM5NGHofZ2/Ru6zw/TNWnEQp5crgyDeSrYpXkAw= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0 h1:zWWrB1U6nqhS/k6zYB74CjRpuiitRtLLi68VcgmOEto= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0/go.mod h1:2qXPNBX1OVRC0IwOnfo1ljoid+RD0QK3443EaqVlsOU= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.42.0 h1:uLXP+3mghfMf7XmV4PkGfFhFKuNWoCvvx5wP/wOXo0o= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.42.0/go.mod h1:v0Tj04armyT59mnURNUJf7RCKcKzq+lgJs6QSjHjaTc= go.opentelemetry.io/otel/exporters/prometheus v0.64.0 h1:g0LRDXMX/G1SEZtK8zl8Chm4K6GBwRkjPKE36LxiTYs= go.opentelemetry.io/otel/exporters/prometheus v0.64.0/go.mod h1:UrgcjnarfdlBDP3GjDIJWe6HTprwSazNjwsI+Ru6hro= go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.18.0 h1:KJVjPD3rcPb98rIs3HznyJlrfx9ge5oJvxxlGR+P/7s= go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.18.0/go.mod h1:K3kRa2ckmHWQaTWQdPRHc7qGXASuVuoEQXzrvlA98Ws= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.42.0 h1:lSZHgNHfbmQTPfuTmWVkEu8J8qXaQwuV30pjCcAUvP8= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.42.0/go.mod h1:so9ounLcuoRDu033MW/E0AD4hhUjVqswrMF5FoZlBcw= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.42.0 h1:s/1iRkCKDfhlh1JF26knRneorus8aOwVIDhvYx9WoDw= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.42.0/go.mod h1:UI3wi0FXg1Pofb8ZBiBLhtMzgoTm1TYkMvn71fAqDzs= go.opentelemetry.io/otel/log v0.18.0 h1:XgeQIIBjZZrliksMEbcwMZefoOSMI1hdjiLEiiB0bAg= go.opentelemetry.io/otel/log v0.18.0/go.mod h1:KEV1kad0NofR3ycsiDH4Yjcoj0+8206I6Ox2QYFSNgI= go.opentelemetry.io/otel/metric v1.42.0 h1:2jXG+3oZLNXEPfNmnpxKDeZsFI5o4J+nz6xUlaFdF/4= go.opentelemetry.io/otel/metric v1.42.0/go.mod h1:RlUN/7vTU7Ao/diDkEpQpnz3/92J9ko05BIwxYa2SSI= go.opentelemetry.io/otel/sdk v1.42.0 h1:LyC8+jqk6UJwdrI/8VydAq/hvkFKNHZVIWuslJXYsDo= go.opentelemetry.io/otel/sdk v1.42.0/go.mod h1:rGHCAxd9DAph0joO4W6OPwxjNTYWghRWmkHuGbayMts= go.opentelemetry.io/otel/sdk/log v0.18.0 h1:n8OyZr7t7otkeTnPTbDNom6rW16TBYGtvyy2Gk6buQw= go.opentelemetry.io/otel/sdk/log v0.18.0/go.mod h1:C0+wxkTwKpOCZLrlJ3pewPiiQwpzycPI/u6W0Z9fuYk= go.opentelemetry.io/otel/sdk/log/logtest v0.18.0 h1:l3mYuPsuBx6UKE47BVcPrZoZ0q/KER57vbj2qkgDLXA= go.opentelemetry.io/otel/sdk/log/logtest v0.18.0/go.mod h1:7cHtiVJpZebB3wybTa4NG+FUo5NPe3PROz1FqB0+qdw= go.opentelemetry.io/otel/sdk/metric v1.42.0 h1:D/1QR46Clz6ajyZ3G8SgNlTJKBdGp84q9RKCAZ3YGuA= go.opentelemetry.io/otel/sdk/metric v1.42.0/go.mod h1:Ua6AAlDKdZ7tdvaQKfSmnFTdHx37+J4ba8MwVCYM5hc= go.opentelemetry.io/otel/trace v1.42.0 h1:OUCgIPt+mzOnaUTpOQcBiM/PLQ/Op7oq6g4LenLmOYY= go.opentelemetry.io/otel/trace v1.42.0/go.mod h1:f3K9S+IFqnumBkKhRJMeaZeNk9epyhnCmQh/EysQCdc= go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g= go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= google.golang.org/api v0.272.0 h1:eLUQZGnAS3OHn31URRf9sAmRk3w2JjMx37d2k8AjJmA= google.golang.org/api v0.272.0/go.mod h1:wKjowi5LNJc5qarNvDCvNQBn3rVK8nSy6jg2SwRwzIA= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20260316180232-0b37fe3546d5 h1:JNfk58HZ8lfmXbYK2vx/UvsqIL59TzByCxPIX4TDmsE= google.golang.org/genproto v0.0.0-20260316180232-0b37fe3546d5/go.mod h1:x5julN69+ED4PcFk/XWayw35O0lf/nGa4aNgODCmNmw= google.golang.org/genproto/googleapis/api v0.0.0-20260316180232-0b37fe3546d5 h1:CogIeEXn4qWYzzQU0QqvYBM8yDF9cFYzDq9ojSpv0Js= google.golang.org/genproto/googleapis/api v0.0.0-20260316180232-0b37fe3546d5/go.mod h1:EIQZ5bFCfRQDV4MhRle7+OgjNtZ6P1PiZBgAKuxXu/Y= google.golang.org/genproto/googleapis/rpc v0.0.0-20260316180232-0b37fe3546d5 h1:aJmi6DVGGIStN9Mobk/tZOOQUBbj0BPjZjjnOdoZKts= google.golang.org/genproto/googleapis/rpc v0.0.0-20260316180232-0b37fe3546d5/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/pipe.v2 v2.0.0-20140414041502-3c2ca4d52544 h1:WJH1qsOB4/zb/li+zLMn0vaAUJ5FqPv6HYLI3aQVg1k= gopkg.in/pipe.v2 v2.0.0-20140414041502-3c2ca4d52544/go.mod h1:UhTeH/yXCK/KY7TX24mqPkaQ7gZeqmWd/8SSS8B3aHw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= ================================================ FILE: samples/gocdk-blob/blob.ct ================================================ # Copyright 2019 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Tests of the gocdk-blob program. # ROOTDIR_URL is a platform-specific environment variable set # in main_test.go. # Create a subdirectory so we can use fileblob. $ mkdir bucket # List an empty bucket: valid, but no output. $ gocdk-blob ls ${ROOTDIR_URL}/bucket $ fecho hello.txt hello world $ gocdk-blob upload ${ROOTDIR_URL}/bucket hw < hello.txt $ gocdk-blob ls ${ROOTDIR_URL}/bucket hw $ gocdk-blob download ${ROOTDIR_URL}/bucket hw hello world # Error downloading a bucket that doesn't exist. # For now we can't use this test case, because the output won't be the same across operating systems. #$ gocdk-blob download ${ROOTDIR_URL}/bucket noexist --> FAIL #gocdk-blob: Failed to read "noexist": blob (code=NotFound): stat ${SLASHDIR}/bucket/noexist: no such file or directory ================================================ FILE: samples/gocdk-blob/main.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // gocdk-blob demonstrates the use of the Go CDK blob package in a // simple command-line application. package main import ( "context" "flag" "fmt" "io" "log" "os" "github.com/google/subcommands" "gocloud.dev/blob" // Import the blob driver packages we want to be able to open. _ "gocloud.dev/blob/azureblob" _ "gocloud.dev/blob/fileblob" _ "gocloud.dev/blob/gcsblob" _ "gocloud.dev/blob/s3blob" ) const helpSuffix = ` See https://gocloud.dev/concepts/urls/ for more background on Go CDK URLs, and sub-packages under gocloud.dev/blob (https://godoc.org/gocloud.dev/blob#pkg-subdirectories) for details on the blob.Bucket URL format. ` func main() { os.Exit(run()) } func run() int { subcommands.Register(subcommands.HelpCommand(), "") subcommands.Register(&downloadCmd{}, "") subcommands.Register(&listCmd{}, "") subcommands.Register(&uploadCmd{}, "") log.SetFlags(0) log.SetPrefix("gocdk-blob: ") flag.Parse() return int(subcommands.Execute(context.Background())) } type downloadCmd struct{} func (*downloadCmd) Name() string { return "download" } func (*downloadCmd) Synopsis() string { return "Output a blob to stdout" } func (*downloadCmd) Usage() string { return `download Read the blob from and write it to stdout. Example: gocdk-blob download gs://mybucket my/gcs/file > foo.txt` + helpSuffix } func (*downloadCmd) SetFlags(_ *flag.FlagSet) {} func (*downloadCmd) Execute(ctx context.Context, f *flag.FlagSet, _ ...any) subcommands.ExitStatus { if f.NArg() != 2 { f.Usage() return subcommands.ExitUsageError } bucketURL := f.Arg(0) blobKey := f.Arg(1) // Open a *blob.Bucket using the bucketURL. bucket, err := blob.OpenBucket(ctx, bucketURL) if err != nil { log.Printf("Failed to open bucket: %v\n", err) return subcommands.ExitFailure } defer bucket.Close() // Open a *blob.Reader for the blob at blobKey. reader, err := bucket.NewReader(ctx, blobKey, nil) if err != nil { log.Printf("Failed to read %q: %v\n", blobKey, err) return subcommands.ExitFailure } defer reader.Close() // Copy the data. _, err = io.Copy(os.Stdout, reader) if err != nil { log.Printf("Failed to copy data: %v\n", err) return subcommands.ExitFailure } return subcommands.ExitSuccess } type listCmd struct { prefix string delimiter string } func (*listCmd) Name() string { return "ls" } func (*listCmd) Synopsis() string { return "List blobs in a bucket" } func (*listCmd) Usage() string { return `ls [-p ] [d ] List the blobs in . Example: gocdk-blob ls -p "subdir/" gs://mybucket` + helpSuffix } func (cmd *listCmd) SetFlags(f *flag.FlagSet) { f.StringVar(&cmd.prefix, "p", "", "prefix to match") f.StringVar(&cmd.delimiter, "d", "/", "directory delimiter; empty string returns flattened listing") } func (cmd *listCmd) Execute(ctx context.Context, f *flag.FlagSet, _ ...any) subcommands.ExitStatus { if f.NArg() != 1 { f.Usage() return subcommands.ExitUsageError } bucketURL := f.Arg(0) // Open a *blob.Bucket using the bucketURL. bucket, err := blob.OpenBucket(ctx, bucketURL) if err != nil { log.Printf("Failed to open bucket: %v\n", err) return subcommands.ExitFailure } defer bucket.Close() opts := blob.ListOptions{ Prefix: cmd.prefix, Delimiter: cmd.delimiter, } iter := bucket.List(&opts) for { obj, err := iter.Next(ctx) if err == io.EOF { break } if err != nil { log.Printf("Failed to list: %v", err) return subcommands.ExitFailure } fmt.Println(obj.Key) } return subcommands.ExitSuccess } type uploadCmd struct{} func (*uploadCmd) Name() string { return "upload" } func (*uploadCmd) Synopsis() string { return "Upload a blob from stdin" } func (*uploadCmd) Usage() string { return `upload Read from stdin and write to the blob in . Example: cat foo.txt | gocdk-blob upload gs://mybucket my/gcs/file` + helpSuffix } func (*uploadCmd) SetFlags(_ *flag.FlagSet) {} func (*uploadCmd) Execute(ctx context.Context, f *flag.FlagSet, _ ...any) (status subcommands.ExitStatus) { if f.NArg() != 2 { f.Usage() return subcommands.ExitUsageError } bucketURL := f.Arg(0) blobKey := f.Arg(1) // Open a *blob.Bucket using the bucketURL. bucket, err := blob.OpenBucket(ctx, bucketURL) if err != nil { log.Printf("Failed to open bucket: %v\n", err) return subcommands.ExitFailure } defer bucket.Close() // Open a *blob.Writer for the blob at blobKey. writer, err := bucket.NewWriter(ctx, blobKey, nil) if err != nil { log.Printf("Failed to write %q: %v\n", blobKey, err) return subcommands.ExitFailure } defer func() { if err := writer.Close(); err != nil && status == subcommands.ExitSuccess { log.Printf("closing the writer: %v", err) status = subcommands.ExitFailure } }() // Copy the data. _, err = io.Copy(writer, os.Stdin) if err != nil { log.Printf("Failed to copy data: %v\n", err) return subcommands.ExitFailure } return subcommands.ExitSuccess } ================================================ FILE: samples/gocdk-blob/main_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package main import ( "flag" "os" "path/filepath" "strings" "testing" "github.com/google/go-cmdtest" ) var update = flag.Bool("update", false, "replace test file contents with output") func Test(t *testing.T) { ts, err := cmdtest.Read(".") if err != nil { t.Fatal(err) } ts.Commands["gocdk-blob"] = cmdtest.InProcessProgram("gocdk-blob", run) ts.Setup = func(rootdir string) error { // On Windows, convert "\" to "/" and add a leading "/": slashdir := filepath.ToSlash(rootdir) if os.PathSeparator != '/' && !strings.HasPrefix(slashdir, "/") { slashdir = "/" + slashdir } return os.Setenv("ROOTDIR_URL", "file://"+slashdir) } ts.Run(t, *update) } ================================================ FILE: samples/gocdk-docstore/docstore.ct ================================================ # Copyright 2019 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Tests of the gocdk-doctore program. $ setenv url mem://sample-coll/ID?filename=save # Collection is initially empty. $ gocdk-docstore ls ${url} $ gocdk-docstore put -d 2019-05-01 -id first ${url} message1 Put message: first 2019-05-01: message1 $ gocdk-docstore ls -d 2019-05-01 ${url} first 2019-05-01: message1 $ gocdk-docstore put -d 2019-05-02 -id second ${url} message2 $ gocdk-docstore ls -d 2019-05-02 ${url} Put message: second 2019-05-02: message2 second 2019-05-02: message2 $ gocdk-docstore update first ${url} new-message updated: first 2019-05-01: new-message # Delete everything. $ gocdk-docstore delete ${url} # Collection is empty again. $ gocdk-docstore ls ${url} ================================================ FILE: samples/gocdk-docstore/main.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // gocdk-docstore demonstrates the use of the Go CDK docstore package in a // simple command-line application. package main import ( "context" "flag" "fmt" "io" "os" "time" "github.com/google/subcommands" "github.com/google/uuid" "gocloud.dev/docstore" // Import the docstore driver packages we want to be able to open. _ "gocloud.dev/docstore/awsdynamodb/v2" _ "gocloud.dev/docstore/gcpfirestore" _ "gocloud.dev/docstore/memdocstore" _ "gocloud.dev/docstore/mongodocstore" ) const helpSuffix = ` See https://gocloud.dev/concepts/urls/ for more background on Go CDK URLs, and sub-packages under gocloud.dev/docstore (https://godoc.org/gocloud.dev/docstore#pkg-subdirectories) for details on the docstore.Collection URL format. ` func main() { os.Exit(run()) } func run() int { subcommands.Register(subcommands.HelpCommand(), "") subcommands.Register(&listCmd{}, "") subcommands.Register(&putCmd{}, "") subcommands.Register(&updateCmd{}, "") subcommands.Register(&deleteCmd{}, "") flag.Parse() return int(subcommands.Execute(context.Background())) } // A Message is a document entry stored in a collection. type Message struct { ID string // unique ID of each document Date string Content string DocstoreRevision any } func (m Message) String() string { return fmt.Sprintf("%s %s: %s", m.ID, m.Date, m.Content) } type listCmd struct { date string } func (*listCmd) Name() string { return "ls" } func (*listCmd) Synopsis() string { return "List items in a collection" } func (*listCmd) Usage() string { return `ls [-d ] List the documents in . Example: gocdk-docstore ls -d "2006-01-02" "mongo://myDB/myCollection?id_field=ID"` + helpSuffix } func (cmd *listCmd) SetFlags(f *flag.FlagSet) { f.StringVar(&cmd.date, "d", "", "get the messages from this date, in the format YYYY-MM-DD") } func (cmd *listCmd) Execute(ctx context.Context, f *flag.FlagSet, _ ...any) subcommands.ExitStatus { if f.NArg() != 1 { f.Usage() return subcommands.ExitUsageError } collectionURL := f.Arg(0) // Open a *docstore.Collection using the collectionURL. collection, err := docstore.OpenCollection(ctx, collectionURL) if err != nil { fmt.Fprintf(os.Stderr, "Failed to open collection: %v\n", err) return subcommands.ExitFailure } defer collection.Close() q := collection.Query() if cmd.date != "" { q = q.Where("Date", "=", cmd.date) } iter := q.Get(ctx) defer iter.Stop() for { var msg Message err := iter.Next(ctx, &msg) if err == io.EOF { break } if err != nil { fmt.Fprintf(os.Stderr, "Failed to list: %v\n", err) return subcommands.ExitFailure } fmt.Println(msg) } return subcommands.ExitSuccess } type putCmd struct { id string // user-chosen ID date string // user-chosen date } func (*putCmd) Name() string { return "put" } func (*putCmd) Synopsis() string { return "Put an item from stdin" } func (*putCmd) Usage() string { return `put [-id ] [-d ] Read from stdin and put an message with the current timestamp in . Example: gocdk-docstore put "mongo://myDB/myCollection?id_field=ID" "hello docstore"` + helpSuffix } func (p *putCmd) SetFlags(f *flag.FlagSet) { f.StringVar(&p.id, "id", "", "ID of document") f.StringVar(&p.date, "d", "", "date of document") } func (p *putCmd) Execute(ctx context.Context, f *flag.FlagSet, _ ...any) subcommands.ExitStatus { if f.NArg() != 2 { f.Usage() return subcommands.ExitUsageError } collectionURL := f.Arg(0) content := f.Arg(1) // Open a *docstore.Collection using the collectionURL. collection, err := docstore.OpenCollection(ctx, collectionURL) if err != nil { fmt.Fprintf(os.Stderr, "Failed to open collection: %v\n", err) return subcommands.ExitFailure } defer collection.Close() if p.id == "" { p.id = uuid.New().String() } if p.date == "" { p.date = time.Now().Format("2006-01-02") } msg := &Message{ ID: p.id, Date: p.date, Content: content, } if err := collection.Put(ctx, msg); err != nil { fmt.Fprintf(os.Stderr, "Failed to put message: %v\n", err) return subcommands.ExitFailure } fmt.Printf("Put message: %s\n", msg) return subcommands.ExitSuccess } type updateCmd struct{} func (*updateCmd) Name() string { return "update" } func (*updateCmd) Synopsis() string { return "Update an item in a collection" } func (*updateCmd) Usage() string { return `update Update the document with ID in . Example: gocdk-docstore update "mongo://myDB/myCollection?id_field=ID" "hello again"` + helpSuffix } func (*updateCmd) SetFlags(_ *flag.FlagSet) {} func (cmd *updateCmd) Execute(ctx context.Context, f *flag.FlagSet, _ ...any) subcommands.ExitStatus { if f.NArg() != 3 { f.Usage() return subcommands.ExitUsageError } id := f.Arg(0) collectionURL := f.Arg(1) updated := f.Arg(2) // Open a *docstore.Collection using the collectionURL. collection, err := docstore.OpenCollection(ctx, collectionURL) if err != nil { fmt.Fprintf(os.Stderr, "Failed to open collection: %v\n", err) return subcommands.ExitFailure } defer collection.Close() msg := &Message{ID: id} mods := docstore.Mods{"Content": updated} if errs := collection.Actions().Update(msg, mods).Get(msg).Do(ctx); errs != nil { fmt.Fprintf(os.Stderr, "Failed to update message: %v\n", errs) return subcommands.ExitFailure } fmt.Printf("updated: %s\n", msg) return subcommands.ExitSuccess } type deleteCmd struct { date string } func (*deleteCmd) Name() string { return "delete" } func (*deleteCmd) Synopsis() string { return "Delete items in a collection" } func (*deleteCmd) Usage() string { return `delete [-d ] Delete the documents in . Example: gocdk-docstore delete -d 2006-01-02 mongo://myDB/myCollection?id_field=ID` + helpSuffix } func (cmd *deleteCmd) SetFlags(f *flag.FlagSet) { f.StringVar(&cmd.date, "d", "", "delete the messages from this date, in the format YYYY-MM-DD") } func (cmd *deleteCmd) Execute(ctx context.Context, f *flag.FlagSet, _ ...any) subcommands.ExitStatus { if f.NArg() != 1 { f.Usage() return subcommands.ExitUsageError } collectionURL := f.Arg(0) // Open a *docstore.Collection using the collectionURL. collection, err := docstore.OpenCollection(ctx, collectionURL) if err != nil { fmt.Fprintf(os.Stderr, "Failed to open collection: %v\n", err) return subcommands.ExitFailure } defer collection.Close() q := collection.Query() if cmd.date != "" { q = q.Where("Date", "=", cmd.date) } iter := q.Get(ctx, "ID") dels := collection.Actions() for { var msg Message err := iter.Next(ctx, &msg) if err == io.EOF { break } if err != nil { return subcommands.ExitFailure } dels.Delete(&msg) } if err := dels.Do(ctx); err != nil { fmt.Fprintf(os.Stderr, "Failed to delete: %v\n", err) return subcommands.ExitFailure } return subcommands.ExitSuccess } ================================================ FILE: samples/gocdk-docstore/main_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package main import ( "flag" "testing" "github.com/google/go-cmdtest" ) var update = flag.Bool("update", false, "replace test file contents with output") func Test(t *testing.T) { ts, err := cmdtest.Read(".") if err != nil { t.Fatal(err) } ts.Commands["gocdk-docstore"] = cmdtest.InProcessProgram("gocdk-docstore", run) ts.Run(t, *update) } ================================================ FILE: samples/gocdk-pubsub/main.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // gocdk-pubsub demonstrates the use of the Go CDK pubsub package in a // simple command-line application. package main import ( "bufio" "context" "flag" "fmt" "log" "os" "github.com/google/subcommands" "gocloud.dev/pubsub" // Import the pubsub driver packages we want to be able to open. _ "gocloud.dev/pubsub/awssnssqs" _ "gocloud.dev/pubsub/azuresb" _ "gocloud.dev/pubsub/gcppubsub" _ "gocloud.dev/pubsub/kafkapubsub" _ "gocloud.dev/pubsub/natspubsub" _ "gocloud.dev/pubsub/rabbitpubsub" ) const helpSuffix = ` See https://gocloud.dev/concepts/urls/ for more background on Go CDK URLs, and sub-packages under gocloud.dev/pubsub (https://godoc.org/gocloud.dev/pubsub#pkg-subdirectories) for details on the topic/subscription URL format. ` func main() { os.Exit(run()) } func run() int { subcommands.Register(subcommands.HelpCommand(), "") subcommands.Register(&pubCmd{}, "") subcommands.Register(&subCmd{}, "") log.SetFlags(0) log.SetPrefix("gocdk-pubsub: ") flag.Parse() return int(subcommands.Execute(context.Background())) } type pubCmd struct{} func (*pubCmd) Name() string { return "pub" } func (*pubCmd) Synopsis() string { return "Publish a message to a topic" } func (*pubCmd) Usage() string { return `pub Read messages from stdin, one per line and send them to . Example: gocdk-pubsub pub gcppubsub://myproject/mytopic` + helpSuffix } func (*pubCmd) SetFlags(_ *flag.FlagSet) {} func (*pubCmd) Execute(ctx context.Context, f *flag.FlagSet, _ ...any) subcommands.ExitStatus { if f.NArg() != 1 { f.Usage() return subcommands.ExitUsageError } topicURL := f.Arg(0) // Open a *pubsub.Topic using the URL. topic, err := pubsub.OpenTopic(ctx, topicURL) if err != nil { log.Print(err) return subcommands.ExitFailure } defer topic.Shutdown(ctx) // Read lines from stdin and send them as messages to the topic. fmt.Fprintf(os.Stderr, "Enter messages, one per line, to be published to %q.\n", topicURL) scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { line := scanner.Text() if line == "" { log.Print("Skipping empty message.") continue } m := &pubsub.Message{Body: []byte(line)} if err := topic.Send(ctx, m); err != nil { log.Print(err) return subcommands.ExitFailure } } if err := scanner.Err(); err != nil { log.Print(err) return subcommands.ExitFailure } return subcommands.ExitSuccess } type subCmd struct { n int // number of messages to receive, or 0 for infinite } func (*subCmd) Name() string { return "sub" } func (*subCmd) Synopsis() string { return "Receive messages from a subscription" } func (*subCmd) Usage() string { return `sub [-n N] Receive messages from and send them to stdout, one per line. Example: gocdk-pubsub sub gcppubsub://myproject/mytopic` + helpSuffix } func (cmd *subCmd) SetFlags(f *flag.FlagSet) { f.IntVar(&cmd.n, "n", 0, "number of messages to receive, or 0 for unlimited") } func (cmd *subCmd) Execute(ctx context.Context, f *flag.FlagSet, _ ...any) subcommands.ExitStatus { if f.NArg() != 1 { f.Usage() return subcommands.ExitUsageError } subURL := f.Arg(0) // Open a *pubsub.Subscription using the URL. sub, err := pubsub.OpenSubscription(ctx, subURL) if err != nil { log.Print(err) return subcommands.ExitFailure } defer sub.Shutdown(ctx) // Receive messages from the subscription and print them to stdout. fmt.Printf("Receiving messages from %q...\n", subURL) for i := 0; cmd.n == 0 || i < cmd.n; i++ { m, err := sub.Receive(ctx) if err != nil { log.Print(err) return subcommands.ExitFailure } fmt.Printf("%s\n", m.Body) m.Ack() } return subcommands.ExitSuccess } ================================================ FILE: samples/gocdk-pubsub/main_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package main import ( "flag" "os" "testing" "github.com/google/go-cmdtest" "github.com/streadway/amqp" "gocloud.dev/internal/testing/setup" ) // Requires rabbit to be running. Run pubsub/rabbitpubsub/localrabbit.sh. var update = flag.Bool("update", false, "replace test file contents with output") func Test(t *testing.T) { if !setup.HasDockerTestEnvironment() { t.Skip("do not have docker test environment") } ts, err := cmdtest.Read(".") if err != nil { t.Fatal(err) } os.Setenv("RABBIT_SERVER_URL", rabbitURL) if err := initRabbit(); err != nil { t.Fatal(err) } ts.Commands["gocdk-pubsub"] = cmdtest.InProcessProgram("gocdk-pubsub", run) ts.Run(t, *update) } const ( rabbitURL = "amqp://guest:guest@localhost:5672/" // These names must match the URLs in the pubsub.ct file. topicName = "sample-topic" subscriptionName = "sample-subscription" ) // Set up a topic and subscription. func initRabbit() error { conn, err := amqp.Dial(rabbitURL) if err != nil { return err } defer conn.Close() ch, err := conn.Channel() if err != nil { return err } defer ch.Close() if err := ch.Confirm(false); err != nil { return err } err = ch.ExchangeDeclare(topicName, "fanout", // kind false, // durable false, // delete when unused false, // internal false, // wait for server response nil) // args if err != nil { return err } q, err := ch.QueueDeclare(subscriptionName, false, // durable false, // delete when unused false, // exclusive false, // wait for server response nil) // args if err != nil { return err } return ch.QueueBind(q.Name, q.Name, topicName, false, nil) } ================================================ FILE: samples/gocdk-pubsub/pubsub.ct ================================================ # Copyright 2019 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Tests of the gocdk-pubsub program. $ fecho msg this is the message $ gocdk-pubsub pub rabbit://sample-topic < msg Enter messages, one per line, to be published to "rabbit://sample-topic". $ gocdk-pubsub sub -n 1 rabbit://sample-subscription Receiving messages from "rabbit://sample-subscription"... this is the message ================================================ FILE: samples/gocdk-runtimevar/main.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // gocdk-runtimevar demonstrates the use of the Go CDK runtimevar package in a // simple command-line application. package main import ( "context" "flag" "fmt" "log" "os" "time" "github.com/google/subcommands" "gocloud.dev/runtimevar" // Import the runtimevar driver packages we want to be able to open. _ "gocloud.dev/runtimevar/awsparamstore" _ "gocloud.dev/runtimevar/blobvar" _ "gocloud.dev/runtimevar/constantvar" _ "gocloud.dev/runtimevar/filevar" _ "gocloud.dev/runtimevar/gcpruntimeconfig" _ "gocloud.dev/runtimevar/hashivault" _ "gocloud.dev/runtimevar/httpvar" ) const helpSuffix = ` See https://gocloud.dev/concepts/urls/ for more background on Go CDK URLs, and sub-packages under gocloud.dev/runtimevar (https://godoc.org/gocloud.dev/runtimevar#pkg-subdirectories) for details on the runtimevar.Variable URL format. ` func main() { os.Exit(run(context.Background())) } func run(ctx context.Context) int { subcommands.Register(subcommands.HelpCommand(), "") subcommands.Register(&catCmd{}, "") subcommands.Register(&watchCmd{}, "") log.SetFlags(0) log.SetPrefix("gocdk-runtimevar: ") flag.Parse() return int(subcommands.Execute(ctx)) } type catCmd struct{} func (*catCmd) Name() string { return "cat" } func (*catCmd) Synopsis() string { return "Print a variable's value to stdout" } func (*catCmd) Usage() string { return `cat Read the current value of the variable from and print it to stdout. Example: gocdk-runtimevar cat "constant://?val=foo&decoder=string"` + helpSuffix } func (*catCmd) SetFlags(_ *flag.FlagSet) {} func (*catCmd) Execute(ctx context.Context, f *flag.FlagSet, _ ...any) subcommands.ExitStatus { if f.NArg() != 1 { f.Usage() return subcommands.ExitUsageError } variableURL := f.Arg(0) // Open a *runtimevar.Variable using the variableURL. variable, err := runtimevar.OpenVariable(ctx, variableURL) if err != nil { log.Printf("Failed to open variable: %v\n", err) return subcommands.ExitFailure } defer variable.Close() snapshot, err := variable.Latest(ctx) if err != nil { log.Printf("Failed to read variable value: %v\n", err) return subcommands.ExitFailure } fmt.Printf("(%T) %v\n", snapshot.Value, snapshot.Value) return subcommands.ExitSuccess } type watchCmd struct{} func (*watchCmd) Name() string { return "watch" } func (*watchCmd) Synopsis() string { return "Watch a variable's value and print changes to stdout" } func (*watchCmd) Usage() string { return `watch Read the value of the variable from and print changes to stdout. Example: gocdk-runtimevar watch "constant://?val=foo&decoder=string"` + helpSuffix } func (*watchCmd) SetFlags(_ *flag.FlagSet) {} func (*watchCmd) Execute(ctx context.Context, f *flag.FlagSet, _ ...any) subcommands.ExitStatus { if f.NArg() != 1 { f.Usage() return subcommands.ExitUsageError } variableURL := f.Arg(0) // Open a *runtimevar.Variable using the variableURL. variable, err := runtimevar.OpenVariable(ctx, variableURL) if err != nil { log.Printf("Failed to open variable: %v\n", err) return subcommands.ExitFailure } defer variable.Close() fmt.Fprintf(os.Stderr, "Watching %s for changes...\n\n", variableURL) time.Sleep(250 * time.Millisecond) // to ensure deterministic combined output for test for { snapshot, err := variable.Watch(ctx) if err != nil { if err == context.Canceled { return subcommands.ExitSuccess } fmt.Printf("(error) %v\n", err) continue } fmt.Printf("(%T) %[1]v\n", snapshot.Value) } return subcommands.ExitSuccess } ================================================ FILE: samples/gocdk-runtimevar/main_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package main import ( "context" "flag" "testing" "github.com/google/go-cmdtest" ) var update = flag.Bool("update", false, "replace test file contents with output") func Test(t *testing.T) { ts, err := cmdtest.Read(".") if err != nil { t.Fatal(err) } type result struct { out []byte err error } ctx := context.Background() runtimevar := cmdtest.InProcessProgram("gocdk-runtimevar", func() int { return run(ctx) }) ts.Commands["gocdk-runtimevar"] = runtimevar ts.Run(t, *update) } ================================================ FILE: samples/gocdk-runtimevar/runtimevar.ct ================================================ # Copyright 2019 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Tests of the gocdk-runtimevar program. $ gocdk-runtimevar cat constant://?val=foo&decoder=string (string) foo $ fecho fvar contents $ gocdk-runtimevar cat file:///${ROOTDIR}/fvar?decoder=string (string) contents ================================================ FILE: samples/gocdk-secrets/main.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // gocdk-secrets demonstrates the use of the Go CDK secrets package in a // simple command-line application. package main import ( "context" "encoding/base64" "flag" "fmt" "log" "os" "github.com/google/subcommands" "gocloud.dev/secrets" // Import the secrets driver packages we want to be able to open. _ "gocloud.dev/secrets/awskms" _ "gocloud.dev/secrets/azurekeyvault" _ "gocloud.dev/secrets/gcpkms" _ "gocloud.dev/secrets/hashivault" _ "gocloud.dev/secrets/localsecrets" ) const helpSuffix = ` See https://gocloud.dev/concepts/urls/ for more background on Go CDK URLs, and sub-packages under gocloud.dev/secrets (https://godoc.org/gocloud.dev/secrets#pkg-subdirectories) for details on the secrets.Keeper URL format. ` func main() { os.Exit(run()) } func run() int { subcommands.Register(subcommands.HelpCommand(), "") subcommands.Register(&decryptCmd{}, "") subcommands.Register(&encryptCmd{}, "") log.SetFlags(0) log.SetPrefix("gocdk-secrets: ") flag.Parse() return int(subcommands.Execute(context.Background())) } type decryptCmd struct { base64in bool base64out bool } func (*decryptCmd) Name() string { return "decrypt" } func (*decryptCmd) Synopsis() string { return "Decrypt data" } func (*decryptCmd) Usage() string { return `decrypt [-base64in] [-base64out] Decrypt the ciphertext using and print the result to stdout. Example: gocdk-secrets decrypt stringkey://mykey nzam9AJHqH1sqeEr1ZLMbWOf4pp5NRHKYBx/h8loARL83+CBc0WPh8dYzHfccQYFUQ==` + helpSuffix } func (cmd *decryptCmd) SetFlags(f *flag.FlagSet) { f.BoolVar(&cmd.base64in, "base64in", true, "the ciphertext is base64 encoded") f.BoolVar(&cmd.base64out, "base64out", false, "the resulting plaintext should be base64 encoded before printing it out") } func (cmd *decryptCmd) Execute(ctx context.Context, f *flag.FlagSet, _ ...any) subcommands.ExitStatus { if f.NArg() != 2 { f.Usage() return subcommands.ExitUsageError } keeperURL := f.Arg(0) ciphertext := f.Arg(1) cipher := []byte(ciphertext) if cmd.base64in { var err error cipher, err = base64.StdEncoding.DecodeString(ciphertext) if err != nil { log.Printf("Failed to base64 decode ciphertext: %v\n", err) return subcommands.ExitFailure } } // Open a *secrets.Keeper using the keeperURL. keeper, err := secrets.OpenKeeper(ctx, keeperURL) if err != nil { log.Printf("Failed to open keeper: %v\n", err) return subcommands.ExitFailure } defer keeper.Close() plain, err := keeper.Decrypt(ctx, cipher) if err != nil { log.Printf("Failed to decrypt: %v\n", err) return subcommands.ExitFailure } plaintext := string(plain) if cmd.base64out { plaintext = base64.StdEncoding.EncodeToString(plain) } fmt.Println(plaintext) return subcommands.ExitSuccess } type encryptCmd struct { base64in bool base64out bool } func (*encryptCmd) Name() string { return "encrypt" } func (*encryptCmd) Synopsis() string { return "Encrypt data" } func (*encryptCmd) Usage() string { return `encrypt [-base64in] [-base64out] Encrypt the plaintext using <keeper URL> and print the result to stdout. Example: gocdk-secrets encrypt --base64out stringkey://mykey my-plaintext` + helpSuffix } func (cmd *encryptCmd) SetFlags(f *flag.FlagSet) { f.BoolVar(&cmd.base64in, "base64in", false, "the plaintext is base64-encoded") f.BoolVar(&cmd.base64out, "base64out", true, "the resulting ciphertext should be base64-encoded before printing it out") } func (cmd *encryptCmd) Execute(ctx context.Context, f *flag.FlagSet, _ ...any) subcommands.ExitStatus { if f.NArg() != 2 { f.Usage() return subcommands.ExitUsageError } keeperURL := f.Arg(0) plaintext := f.Arg(1) plain := []byte(plaintext) if cmd.base64in { var err error plain, err = base64.StdEncoding.DecodeString(plaintext) if err != nil { log.Printf("Failed to base64 decode plaintext: %v\n", err) return subcommands.ExitFailure } } // Open a *secrets.Keeper using the keeperURL. keeper, err := secrets.OpenKeeper(ctx, keeperURL) if err != nil { log.Printf("Failed to open keeper: %v\n", err) return subcommands.ExitFailure } defer keeper.Close() cipher, err := keeper.Encrypt(ctx, plain) if err != nil { log.Printf("Failed to encrypt: %v\n", err) return subcommands.ExitFailure } ciphertext := string(cipher) if cmd.base64out { ciphertext = base64.StdEncoding.EncodeToString(cipher) } fmt.Println(ciphertext) return subcommands.ExitSuccess } ================================================ FILE: samples/gocdk-secrets/main_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package main import ( "flag" "testing" "github.com/google/go-cmdtest" ) var update = flag.Bool("update", false, "replace test file contents with output") func Test(t *testing.T) { ts, err := cmdtest.Read(".") if err != nil { t.Fatal(err) } ts.Commands["gocdk-secrets"] = cmdtest.InProcessProgram("gocdk-secrets", run) ts.Run(t, *update) } ================================================ FILE: samples/gocdk-secrets/secrets.ct ================================================ # Copyright 2019 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Tests of the gocdk-secrets program. # We can't test encrypt because its output is nondeterministic. $ gocdk-secrets decrypt -base64in base64key://smGbjm71Nxd1Ig5FS0wj9SlbzAIrnolCz9bQQ6uAhl4= vnO4Lab8WxdGAklhKUAm+OkmM4mD4aRe9+Uo3iU/sBKMsf2txirq3Gg/MIYaOCRQLw== my-secret ================================================ FILE: samples/guestbook/README.md ================================================ # Guestbook Sample Guestbook is a sample application that records visitors' messages, displays a cloud banner, and an administrative message. The main business logic is written in a cloud-agnostic manner using MySQL, the generic blob API, and the generic runtimevar API. All platform-specific code is set up by [Wire](https://github.com/google/wire). The [online tutorial](https://gocloud.dev/tutorials/guestbook) will walk you through how to build, run, and deploy this sample locally, on Google Cloud Platform (GCP), on Amazon Web Servicess (AWS), or on Microsoft Azure. ## Gophers The Go gopher was designed by Renee French and used under the [Creative Commons 3.0 Attributions](https://creativecommons.org/licenses/by/3.0/) license. ================================================ FILE: samples/guestbook/aws/main.tf ================================================ # Copyright 2018 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. terraform { required_version = "~>0.12" } provider "aws" { version = "~> 2.7" region = var.region } provider "random" { version = "~> 2.1" } # Firewalls resource "aws_security_group" "guestbook" { name_prefix = "guestbook" description = "Sandbox for the Guestbook Go CDK sample app." ingress { from_port = 22 to_port = 22 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] description = "Public SSH access" } ingress { from_port = 8080 to_port = 8080 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] description = "Public HTTP access" } ingress { from_port = 3306 to_port = 3306 protocol = "tcp" self = true description = "MySQL within group" } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] description = "All outgoing traffic allowed" } } # SQL Database (RDS) resource "random_string" "db_password" { special = false length = 20 } resource "aws_db_instance" "guestbook" { identifier_prefix = "guestbook" engine = "mysql" engine_version = "5.6.39" instance_class = "db.t2.micro" allocated_storage = 20 username = "root" password = random_string.db_password.result name = "guestbook" publicly_accessible = true vpc_security_group_ids = [aws_security_group.guestbook.id] skip_final_snapshot = true provisioner "local-exec" { # TODO(light): Reuse credentials from Terraform. command = "go run '${path.module}'/provision_db/main.go -host='${aws_db_instance.guestbook.address}' -region='${var.region}' -security_group='${aws_security_group.guestbook.id}' -database=guestbook -password='${random_string.db_password.result}' -schema='${path.module}'/../schema.sql" } } # Blob Storage (S3) resource "aws_s3_bucket" "guestbook" { bucket_prefix = "guestbook" } resource "aws_s3_bucket_object" "aws" { bucket = aws_s3_bucket.guestbook.bucket key = "aws.png" content_type = "image/png" source = "${path.module}/../blobs/aws.png" } resource "aws_s3_bucket_object" "gcp" { bucket = aws_s3_bucket.guestbook.bucket key = "gcp.png" content_type = "image/png" source = "${path.module}/../blobs/gcp.png" } resource "aws_s3_bucket_object" "gophers" { bucket = aws_s3_bucket.guestbook.bucket key = "gophers.jpg" content_type = "image/jpeg" source = "${path.module}/../blobs/gophers.jpg" } # Paramstore (SSM) resource "aws_ssm_parameter" "motd" { name = var.paramstore_var type = "String" value = "ohai from AWS" overwrite = "true" } # Compute (EC2) resource "aws_iam_role" "guestbook" { name_prefix = "guestbook" assume_role_policy = <<EOF { "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": {"Service": "ec2.amazonaws.com"}, "Action": "sts:AssumeRole" } } EOF } resource "aws_iam_role_policy" "guestbook" { name_prefix = "Guestbook-Policy" role = aws_iam_role.guestbook.id policy = <<EOF { "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": [ "s3:GetObject", "ssm:DescribeParameters", "ssm:GetParameter", "ssm:GetParameters", "xray:PutTraceSegments", "xray:PutTelemetryRecords" ], "Resource": "*" } } EOF } resource "aws_iam_instance_profile" "guestbook" { name_prefix = "guestbook" role = aws_iam_role.guestbook.name } data "aws_ami" "debian" { most_recent = true filter { name = "product-code" values = ["55q52qvgjfpdj2fpfy9mb1lo4"] } filter { name = "product-code.type" values = ["marketplace"] } filter { name = "architecture" values = ["x86_64"] } owners = ["679593333241"] } resource "aws_key_pair" "guestbook" { key_name_prefix = "guestbook" public_key = var.ssh_public_key } resource "aws_instance" "guestbook" { ami = data.aws_ami.debian.id instance_type = "t2.micro" vpc_security_group_ids = [aws_security_group.guestbook.id] iam_instance_profile = aws_iam_instance_profile.guestbook.id key_name = aws_key_pair.guestbook.key_name connection { host = coalesce(self.public_ip, self.private_ip) type = "ssh" user = "admin" } provisioner "file" { source = "${path.module}/../guestbook" destination = "/home/admin/guestbook" } provisioner "remote-exec" { inline = ["chmod +x /home/admin/guestbook"] } } ================================================ FILE: samples/guestbook/aws/outputs.tf ================================================ # Copyright 2018 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. output "region" { value = var.region description = "Region the resources were created in." } output "bucket" { value = aws_s3_bucket.guestbook.id description = "Name of the S3 bucket created to store images." } output "database_host" { value = aws_db_instance.guestbook.address description = "Host name of the RDS MySQL database." } output "database_root_password" { value = random_string.db_password.result sensitive = true description = "Password for the root user of the RDS MySQL databse." } output "paramstore_var" { value = var.paramstore_var description = "Location of the SSM Parameter Store Message of the Day variable." } output "instance_host" { value = aws_instance.guestbook.public_ip description = "Address of the EC2 instance." } ================================================ FILE: samples/guestbook/aws/provision_db/main.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // The provision_db program connects to an RDS database and initializes it with // SQL from stdin. It is intended to be invoked from Terraform. package main import ( "flag" "fmt" "io" "log" "net/http" "os" "os/exec" "path/filepath" "strings" ) func main() { log.SetFlags(0) log.SetPrefix("aws/provision_db: ") host := flag.String("host", "", "hostname of database") region := flag.String("region", "", "AWS region") securityGroup := flag.String("security_group", "", "database security group") database := flag.String("database", "", "name of database to provision") password := flag.String("password", "", "root password on database") schema := flag.String("schema", "", "path to .sql file defining the database schema") flag.Parse() missing := false flag.VisitAll(func(f *flag.Flag) { if f.Value.String() == "" { log.Printf("Required flag -%s not set.", f.Name) missing = true } }) if missing { os.Exit(64) } if err := provisionDb(*host, *region, *securityGroup, *database, *password, *schema); err != nil { log.Fatal(err) } } func provisionDb(dbHost, region, securityGroupID, dbName, dbPassword, schemaPath string) error { const mySQLImage = "mysql:5.6" // Pull the necessary Docker images. log.Print("Downloading Docker images...") if _, err := run("docker", "pull", mySQLImage); err != nil { return err } // Create a temporary directory to hold the certificates. // We resolve all symlinks to avoid Docker on Mac issues, see // https://github.com/google/go-cloud/issues/110. tempdir, err := os.MkdirTemp("", "guestbook-ca") if err != nil { return fmt.Errorf("creating temp dir for certs: %v", err) } defer os.RemoveAll(tempdir) tempdir, err = filepath.EvalSymlinks(tempdir) if err != nil { return fmt.Errorf("evaluating any symlinks: %v", err) } resp, err := http.Get("https://s3.amazonaws.com/rds-downloads/rds-ca-2015-root.pem") if err != nil { return fmt.Errorf("fetching pem file: %v", err) } if resp.StatusCode != 200 { return fmt.Errorf("response status code is %d, want 200", resp.StatusCode) } defer resp.Body.Close() caPath := filepath.Join(tempdir, "rds-ca.pem") caFile, err := os.Create(caPath) if err != nil { return err } if _, err := io.Copy(caFile, resp.Body); err != nil { return fmt.Errorf("copying response to file: %v", err) } log.Print("Adding a temporary ingress rule") if _, err := run("aws", "ec2", "authorize-security-group-ingress", "--region", region, "--group-id", securityGroupID, "--protocol=tcp", "--port=3306", "--cidr=0.0.0.0/0"); err != nil { return err } defer func() { log.Print("Removing ingress rule...") if _, err := run("aws", "ec2", "revoke-security-group-ingress", "--region", region, "--group-id", securityGroupID, "--protocol=tcp", "--port=3306", "--cidr=0.0.0.0/0"); err != nil { log.Print(err) } }() log.Printf("Added ingress rule to %s for port 3306", securityGroupID) // Send schema. log.Print("Sending schema to database...") schema, err := os.Open(schemaPath) if err != nil { return err } defer schema.Close() mySQLCmd := fmt.Sprintf(`mysql -h'%s' -uroot -p'%s' --ssl-ca=/ca/rds-ca.pem '%s'`, dbHost, dbPassword, dbName) connect := exec.Command("docker", "run", "--rm", "--interactive", "--volume", tempdir+":/ca", mySQLImage, "sh", "-c", mySQLCmd) connect.Stdin = schema connect.Stderr = os.Stderr if err := connect.Run(); err != nil { return fmt.Errorf("running %v: %v", connect.Args, err) } return nil } func run(args ...string) (stdout string, err error) { cmd := exec.Command(args[0], args[1:]...) cmd.Stderr = os.Stderr cmd.Env = append(cmd.Env, os.Environ()...) stdoutb, err := cmd.Output() if err != nil { return "", fmt.Errorf("running %v: %v", cmd.Args, err) } return strings.TrimSpace(string(stdoutb)), nil } ================================================ FILE: samples/guestbook/aws/variables.tf ================================================ # Copyright 2018 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. variable "region" { type = string description = "Region to create resources in. See https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.RegionsAndAvailabilityZones.html for valid values." } variable "ssh_public_key" { type = string description = "A public key line in .ssh/authorized_keys format to use to authenticate to your instance. This must be added to your SSH agent for provisioning to succeed." } variable "paramstore_var" { default = "/guestbook/motd" description = "The location in SSM Parameter Store of the Message of the Day variable." } ================================================ FILE: samples/guestbook/azure/main.tf ================================================ # Copyright 2019 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. terraform { required_version = "~>0.12" } provider "azurerm" { version = "~> 1.27.0" } provider "random" { version = "~> 2.1" } resource "random_string" "suffix" { special = false upper = false length = 7 } # Create a resource group resource "azurerm_resource_group" "guestbook" { name = "guestbook${random_string.suffix.result}" location = var.location } # Create a Storage Account, container, and two blobs. resource "azurerm_storage_account" "guestbook" { name = "guestbook${random_string.suffix.result}" resource_group_name = azurerm_resource_group.guestbook.name location = var.location account_tier = "Standard" account_replication_type = "GRS" } resource "azurerm_storage_container" "guestbook" { name = "guestbook${random_string.suffix.result}" resource_group_name = azurerm_resource_group.guestbook.name storage_account_name = azurerm_storage_account.guestbook.name container_access_type = "private" } resource "azurerm_storage_blob" "gopher" { name = "azure.png" resource_group_name = azurerm_resource_group.guestbook.name storage_account_name = azurerm_storage_account.guestbook.name storage_container_name = azurerm_storage_container.guestbook.name type = "block" content_type = "image/png" source = "${path.module}/../blobs/azure.png" } resource "azurerm_storage_blob" "motd" { name = "motd" resource_group_name = azurerm_resource_group.guestbook.name storage_account_name = azurerm_storage_account.guestbook.name storage_container_name = azurerm_storage_container.guestbook.name type = "block" content_type = "text/plain" source = "${path.module}/../blobs/motd.txt" } ================================================ FILE: samples/guestbook/azure/outputs.tf ================================================ # Copyright 2019 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. output "storage_account" { value = azurerm_storage_account.guestbook.name description = "Name of the Storage Account created to store images." } output "storage_container" { value = azurerm_storage_container.guestbook.name description = "Name of the storage container created to store images." } output "access_key" { value = azurerm_storage_account.guestbook.primary_access_key description = "The primary access key for the Storage Account." } ================================================ FILE: samples/guestbook/azure/variables.tf ================================================ # Copyright 2019 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. variable "location" { type = string description = "Location to create resources in. See https://azure.microsoft.com/en-us/global-infrastructure/locations/ for valid values." } ================================================ FILE: samples/guestbook/blobs/motd.txt ================================================ Message of the Day Is: Hello World! ================================================ FILE: samples/guestbook/gcp/.gcloudignore ================================================ *.tf *.tfstate *.tfstate.backup .terraform/ terraform.tfvars *.pem *.json ================================================ FILE: samples/guestbook/gcp/Dockerfile ================================================ FROM gcr.io/distroless/base COPY guestbook / ENTRYPOINT ["/guestbook"] ================================================ FILE: samples/guestbook/gcp/deploy/main.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // The deploy program builds the Guestbook server locally and deploys it to // GKE. package main import ( "encoding/json" "flag" "fmt" "log" "os" "os/exec" "path/filepath" "strings" "time" ) func main() { log.SetFlags(0) log.SetPrefix("gcp/deploy: ") guestbookDir := flag.String("guestbook_dir", "..", "directory containing the guestbook example") tfStatePath := flag.String("tfstate", "terraform.tfstate", "path to terraform state file") flag.Parse() if err := deploy(*guestbookDir, *tfStatePath); err != nil { log.Fatal(err) } } func deploy(guestbookDir, tfStatePath string) error { type tfItem struct { Sensitive bool Type string Value string } type state struct { Project tfItem ClusterName tfItem `json:"cluster_name"` ClusterZone tfItem `json:"cluster_zone"` Bucket tfItem DatabaseInstance tfItem `json:"database_instance"` DatabaseRegion tfItem `json:"database_region"` MotdVarConfig tfItem `json:"motd_var_config"` MotdVarName tfItem `json:"motd_var_name"` } tfStateb, err := runb("terraform", "output", "-state", tfStatePath, "-json") if err != nil { return err } var tfState state if err := json.Unmarshal(tfStateb, &tfState); err != nil { return fmt.Errorf("parsing terraform state JSON: %v", err) } zone := tfState.ClusterZone.Value if zone == "" { return fmt.Errorf("empty or missing cluster_zone in %s", tfStatePath) } tempDir, err := os.MkdirTemp("", "guestbook-k8s-") if err != nil { return fmt.Errorf("making temp dir: %v", err) } defer os.RemoveAll(tempDir) // Fill in Kubernetes template parameters. proj := strings.Replace(tfState.Project.Value, ":", "/", -1) imageName := fmt.Sprintf("gcr.io/%s/guestbook", proj) gbyin, err := os.ReadFile(filepath.Join(guestbookDir, "gcp", "guestbook.yaml.in")) if err != nil { return fmt.Errorf("reading guestbook.yaml.in: %v", err) } gby := string(gbyin) replacements := map[string]string{ "{{IMAGE}}": imageName, "{{bucket}}": tfState.Bucket.Value, "{{database_instance}}": tfState.DatabaseInstance.Value, "{{database_region}}": tfState.DatabaseRegion.Value, "{{motd_var_config}}": tfState.MotdVarConfig.Value, "{{motd_var_name}}": tfState.MotdVarName.Value, } for old, new := range replacements { gby = strings.Replace(gby, old, new, -1) } if err := os.WriteFile(filepath.Join(tempDir, "guestbook.yaml"), []byte(gby), 0o666); err != nil { return fmt.Errorf("writing guestbook.yaml: %v", err) } // Build Guestbook Docker image. log.Printf("Building %s...", imageName) build := exec.Command("go", "build", "-o", "gcp/guestbook") env := append(build.Env, "GOOS=linux", "GOARCH=amd64") env = append(env, os.Environ()...) build.Env = env absDir, err := filepath.Abs(guestbookDir) if err != nil { return fmt.Errorf("getting abs path to guestbook dir (%s): %v", guestbookDir, err) } build.Dir = absDir build.Stderr = os.Stderr if err := build.Run(); err != nil { return fmt.Errorf("building guestbook app by running %v: %v", build.Args, err) } gcp := gcloud{projectID: tfState.Project.Value} cbs := gcp.cmd("builds", "submit", "-t", imageName, filepath.Join(guestbookDir, "gcp")) if err := cbs.Run(); err != nil { return fmt.Errorf("building container image with %v: %v", cbs.Args, err) } // Run on Kubernetes. log.Printf("Deploying to %s...", tfState.ClusterName.Value) getCreds := gcp.cmd("container", "clusters", "get-credentials", "--zone", zone, tfState.ClusterName.Value) getCreds.Stderr = os.Stderr if err := getCreds.Run(); err != nil { return fmt.Errorf("getting credentials with %v: %v", getCreds.Args, err) } kubeCmds := [][]string{ {"kubectl", "apply", "-f", filepath.Join(tempDir, "guestbook.yaml")}, // Force pull the latest image. {"kubectl", "scale", "--replicas", "0", "deployment/guestbook"}, {"kubectl", "scale", "--replicas", "1", "deployment/guestbook"}, } for _, kcmd := range kubeCmds { cmd := exec.Command(kcmd[0], kcmd[1:]...) if err := cmd.Run(); err != nil { return fmt.Errorf("running %v: %v", cmd.Args, err) } } // Wait for endpoint then print it. log.Printf("Waiting for load balancer...") for { outb, err := runb("kubectl", "get", "service", "guestbook", "-o", "json") if err != nil { return err } var s service if err := json.Unmarshal(outb, &s); err != nil { return fmt.Errorf("parsing JSON output: %v", err) } i := s.Status.LoadBalancer.Ingress if len(i) == 0 || i[0].IP == "" { dt := time.Second log.Printf("No ingress returned in %s. Trying again in %v", outb, dt) time.Sleep(dt) continue } endpoint := i[0].IP log.Printf("Deployed at http://%s:8080", endpoint) break } return nil } type ( service struct{ Status *status } status struct{ LoadBalancer loadBalancer } loadBalancer struct{ Ingress []ingress } ingress struct{ IP string } ) type gcloud struct { projectID string } func (gcp *gcloud) cmd(args ...string) *exec.Cmd { args = append([]string{"--quiet", "--project", gcp.projectID}, args...) cmd := exec.Command("gcloud", args...) cmd.Env = append(cmd.Env, os.Environ()...) cmd.Stderr = os.Stderr return cmd } func run(args ...string) (stdout string, err error) { stdoutb, err := runb(args...) return strings.TrimSpace(string(stdoutb)), err } func runb(args ...string) (stdout []byte, err error) { cmd := exec.Command(args[0], args[1:]...) cmd.Stderr = os.Stderr cmd.Env = append(cmd.Env, os.Environ()...) stdoutb, err := cmd.Output() if err != nil { return nil, fmt.Errorf("running %v: %v", cmd.Args, err) } return stdoutb, nil } ================================================ FILE: samples/guestbook/gcp/guestbook.yaml.in ================================================ apiVersion: extensions/v1beta1 kind: Deployment metadata: name: guestbook labels: app: guestbook spec: replicas: 1 selector: matchLabels: app: guestbook strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 1 template: metadata: labels: app: guestbook spec: volumes: - name: google-cloud-key secret: secretName: guestbook-key containers: - name: guestbook image: {{IMAGE}} args: - "-env=gcp" - "-bucket={{bucket}}" - "-db_host={{database_instance}}" - "-cloud_sql_region={{database_region}}" - "-runtime_config={{motd_var_config}}" - "-motd_var={{motd_var_name}}" imagePullPolicy: Always ports: - containerPort: 8080 protocol: TCP volumeMounts: - name: google-cloud-key mountPath: /var/secrets/google env: - name: GOOGLE_APPLICATION_CREDENTIALS value: /var/secrets/google/key.json livenessProbe: httpGet: path: /healthz/liveness port: 8080 readinessProbe: httpGet: path: /healthz/readiness port: 8080 --- apiVersion: v1 kind: Service metadata: name: guestbook labels: app: guestbook spec: type: LoadBalancer selector: app: guestbook ports: - port: 8080 protocol: TCP targetPort: 8080 ================================================ FILE: samples/guestbook/gcp/main.tf ================================================ # Copyright 2018 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. terraform { required_version = "~>0.12" } provider "google" { version = "~> 2.5" project = var.project } provider "random" { version = "~> 2.1" } resource "google_project_service" "cloudbuild" { service = "cloudbuild.googleapis.com" disable_on_destroy = false } # Service account for the running server resource "google_service_account" "server" { account_id = var.server_service_account_name project = var.project display_name = "Guestbook Server" } resource "google_service_account_key" "server" { service_account_id = google_service_account.server.name } # Stackdriver Tracing resource "google_project_service" "trace" { service = "cloudtrace.googleapis.com" disable_on_destroy = false } resource "google_project_iam_member" "server_trace" { role = "roles/cloudtrace.agent" member = "serviceAccount:${google_service_account.server.email}" } locals { sql_instance = "go-guestbook-${random_id.sql_instance.hex}" bucket_name = "go-guestbook-${random_id.bucket_name.hex}" } # Cloud SQL resource "google_project_service" "sql" { service = "sql-component.googleapis.com" disable_on_destroy = false } resource "google_project_service" "sqladmin" { service = "sqladmin.googleapis.com" disable_on_destroy = false } resource "random_id" "sql_instance" { keepers = { project = var.project region = var.region } byte_length = 16 } resource "google_sql_database_instance" "guestbook" { name = local.sql_instance database_version = "MYSQL_5_6" region = var.region project = var.project settings { tier = "db-f1-micro" disk_size = 10 # GiB } depends_on = [ google_project_service.sql, google_project_service.sqladmin, ] } resource "google_sql_database" "guestbook" { name = "guestbook" instance = google_sql_database_instance.guestbook.name provisioner "local-exec" { # TODO(light): Reuse credentials from Terraform. command = "go run '${path.module}'/provision_db/main.go -project='${google_sql_database_instance.guestbook.project}' -service_account='${google_service_account.db_access.email}' -instance='${local.sql_instance}' -database=guestbook -password='${google_sql_user.root.password}' -schema='${path.module}'/../schema.sql" } } resource "random_string" "db_password" { keepers = { project = var.project db_name = local.sql_instance region = var.region } special = false length = 20 } resource "google_sql_user" "root" { name = "root" instance = google_sql_database_instance.guestbook.name password = random_string.db_password.result } resource "google_sql_user" "guestbook" { name = "guestbook" instance = google_sql_database_instance.guestbook.name host = "cloudsqlproxy~%" } resource "google_service_account" "db_access" { account_id = var.db_access_service_account_name project = var.project display_name = "Guestbook Database Access" } resource "google_project_iam_member" "server_cloudsql" { role = "roles/cloudsql.client" member = "serviceAccount:${google_service_account.server.email}" } resource "google_project_iam_member" "db_access_cloudsql" { role = "roles/cloudsql.client" member = "serviceAccount:${google_service_account.db_access.email}" } # Runtime Configurator resource "google_project_service" "runtimeconfig" { service = "runtimeconfig.googleapis.com" disable_on_destroy = false } resource "google_runtimeconfig_config" "guestbook" { name = "guestbook" project = var.project depends_on = [google_project_service.runtimeconfig] } resource "google_runtimeconfig_variable" "motd" { name = "motd" parent = google_runtimeconfig_config.guestbook.name project = var.project text = "ohai from GCP runtime configuration" } resource "google_project_iam_member" "server_runtimeconfig" { role = "roles/runtimeconfig.admin" member = "serviceAccount:${google_service_account.server.email}" } # Google Cloud Storage resource "google_project_service" "storage" { service = "storage-component.googleapis.com" disable_on_destroy = false } resource "google_project_service" "storage_api" { service = "storage-api.googleapis.com" disable_on_destroy = false } resource "random_id" "bucket_name" { keepers = { project = var.project region = var.region } byte_length = 16 } resource "google_storage_bucket" "guestbook" { name = local.bucket_name storage_class = "REGIONAL" location = var.region # Set to avoid calling Compute API. # See https://github.com/hashicorp/terraform/issues/13109 project = var.project depends_on = [ google_project_service.storage, google_project_service.storage_api, ] } resource "google_storage_bucket_iam_member" "guestbook_server_view" { bucket = google_storage_bucket.guestbook.name role = "roles/storage.objectViewer" member = "serviceAccount:${google_service_account.server.email}" } resource "google_storage_bucket_object" "aws" { bucket = google_storage_bucket.guestbook.name name = "aws.png" content_type = "image/png" source = "${path.module}/../blobs/aws.png" depends_on = [google_storage_bucket_iam_member.guestbook_server_view] } resource "google_storage_bucket_object" "gcp" { bucket = google_storage_bucket.guestbook.name name = "gcp.png" content_type = "image/png" source = "${path.module}/../blobs/gcp.png" depends_on = [google_storage_bucket_iam_member.guestbook_server_view] } resource "google_storage_bucket_object" "gophers" { bucket = google_storage_bucket.guestbook.name name = "gophers.jpg" content_type = "image/jpeg" source = "${path.module}/../blobs/gophers.jpg" depends_on = [google_storage_bucket_iam_member.guestbook_server_view] } # Kubernetes Engine resource "google_project_service" "container" { service = "container.googleapis.com" disable_on_destroy = false } resource "google_container_cluster" "guestbook" { name = var.cluster_name zone = var.zone initial_node_count = 3 node_config { machine_type = "n1-standard-1" disk_size_gb = 50 oauth_scopes = [ "https://www.googleapis.com/auth/compute", "https://www.googleapis.com/auth/devstorage.read_only", "https://www.googleapis.com/auth/logging.write", "https://www.googleapis.com/auth/monitoring", ] } # Needed for Kubernetes provider below. enable_legacy_abac = true depends_on = [google_project_service.container] } provider "kubernetes" { version = "~> 1.1" host = "https://${google_container_cluster.guestbook.endpoint}" client_certificate = base64decode( google_container_cluster.guestbook.master_auth[0].client_certificate, ) client_key = base64decode(google_container_cluster.guestbook.master_auth[0].client_key) cluster_ca_certificate = base64decode( google_container_cluster.guestbook.master_auth[0].cluster_ca_certificate, ) } resource "kubernetes_secret" "guestbook_creds" { metadata { name = "guestbook-key" } data = { "key.json" = base64decode(google_service_account_key.server.private_key) } } ================================================ FILE: samples/guestbook/gcp/outputs.tf ================================================ # Copyright 2018 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. output "project" { value = var.project description = "The GCP project ID." } output "server_service_account" { value = google_service_account.server.email description = "The service account email that will be used for the server running inside the GKE cluster." } output "db_access_service_account" { value = google_service_account.db_access.email description = "The service account email that was used for provisioning the database." } output "cluster_name" { value = var.cluster_name description = "GKE cluster name." } output "cluster_zone" { value = google_container_cluster.guestbook.zone description = "GCP zone that the GKE cluster is in." } output "bucket" { value = local.bucket_name description = "Name of the GCS bucket created to store images." } output "database_instance" { value = google_sql_database_instance.guestbook.name description = "Cloud SQL instance name." } output "database_root_password" { value = random_string.db_password.result sensitive = true description = "The Cloud SQL instance password for root." } output "database_region" { value = var.region description = "The Cloud SQL instance region." } output "motd_var_config" { value = google_runtimeconfig_config.guestbook.name description = "The name of the Runtime Configurator config resource that contains the Message of the Day variable." } output "motd_var_name" { value = google_runtimeconfig_variable.motd.name description = "The name of the Runtime Configurator variable inside the config resource that contains the Message of the Day." } ================================================ FILE: samples/guestbook/gcp/provision_db/main.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // The provision_db program connects to a Cloud SQL database and initializes it // with SQL from a file. It's intended to be invoked from Terraform. package main import ( "encoding/json" "flag" "fmt" "log" "os" "os/exec" "path/filepath" "strings" ) func main() { log.SetFlags(0) log.SetPrefix("gcp/provision_db: ") project := flag.String("project", "", "GCP project ID") serviceAccount := flag.String("service_account", "", "name of service account in GCP project") instance := flag.String("instance", "", "database instance name") database := flag.String("database", "", "name of database to initialize") password := flag.String("password", "", "root password for the database") schema := flag.String("schema", "", "path to .sql file defining the database schema") flag.Parse() missing := false flag.VisitAll(func(f *flag.Flag) { if f.Value.String() == "" { log.Printf("Required flag -%s is not set.", f.Name) missing = true } }) if missing { os.Exit(64) } if err := provisionDB(*project, *serviceAccount, *instance, *database, *password, *schema); err != nil { log.Fatal(err) } } type key struct { PrivateKeyID string `json:"private_key_id"` } func provisionDB(projectID, serviceAccount, dbInstance, dbName, dbPassword, schemaPath string) error { log.Printf("Downloading Docker images...") const mySQLImage = "mysql:5.6" cloudSQLProxyImage := "gcr.io/cloudsql-docker/gce-proxy:1.11" images := []string{mySQLImage, cloudSQLProxyImage} for _, img := range images { if _, err := run("docker", "pull", img); err != nil { return err } } log.Printf("Getting connection string from database metadata...") gcp := &gcloud{projectID} dbConnStr, err := run(gcp.cmd("sql", "instances", "describe", "--format", "value(connectionName)", dbInstance)...) if err != nil { return fmt.Errorf("getting connection string: %v", err) } // Create a temporary directory to hold the service account key. // We resolve all symlinks to avoid Docker on Mac issues, see // https://github.com/google/go-cloud/issues/110. serviceAccountVolDir, err := os.MkdirTemp("", "guestbook-service-acct") if err != nil { return fmt.Errorf("creating temp dir to hold service account key: %v", err) } serviceAccountVolDir, err = filepath.EvalSymlinks(serviceAccountVolDir) if err != nil { return fmt.Errorf("evaluating any symlinks: %v", err) } defer os.RemoveAll(serviceAccountVolDir) log.Printf("Created %v", serviceAccountVolDir) // Furnish a new service account key. if _, err := run(gcp.cmd("iam", "service-accounts", "keys", "create", "--iam-account="+serviceAccount, serviceAccountVolDir+"/key.json")...); err != nil { return fmt.Errorf("creating new service account key: %v", err) } keyJSONb, err := os.ReadFile(filepath.Join(serviceAccountVolDir, "key.json")) if err != nil { return fmt.Errorf("reading key.json file: %v", err) } var k key if err := json.Unmarshal(keyJSONb, &k); err != nil { return fmt.Errorf("parsing key.json: %v", err) } serviceAccountKeyID := k.PrivateKeyID defer func() { if _, err := run(gcp.cmd("iam", "service-accounts", "keys", "delete", "--iam-account", serviceAccount, serviceAccountKeyID)...); err != nil { log.Printf("deleting service account key: %v", err) } }() log.Printf("Created service account key %s", serviceAccountKeyID) log.Printf("Starting Cloud SQL proxy...") proxyContainerID, err := run("docker", "run", "--detach", "--rm", "--volume", serviceAccountVolDir+":/creds", "--publish", "3306", cloudSQLProxyImage, "/cloud_sql_proxy", "-instances", dbConnStr+"=tcp:0.0.0.0:3306", "-credential_file=/creds/key.json") if err != nil { return err } defer func() { if _, err := run("docker", "kill", proxyContainerID); err != nil { log.Printf("failed to kill docker container for proxy: %v", err) } }() log.Print("Sending schema to database...") mySQLCmd := fmt.Sprintf(`mysql --wait -h"$PROXY_PORT_3306_TCP_ADDR" -P"$PROXY_PORT_3306_TCP_PORT" -uroot -p'%s' '%s'`, dbPassword, dbName) connect := exec.Command("docker", "run", "--rm", "--interactive", "--link", proxyContainerID+":proxy", mySQLImage, "sh", "-c", mySQLCmd) schema, err := os.Open(schemaPath) if err != nil { return err } defer schema.Close() connect.Stdin = schema connect.Stderr = os.Stderr if err := connect.Run(); err != nil { return fmt.Errorf("running %v: %v", connect.Args, err) } return nil } func run(args ...string) (stdout string, err error) { cmd := exec.Command(args[0], args[1:]...) cmd.Stderr = os.Stderr cmd.Env = append(cmd.Env, os.Environ()...) stdoutb, err := cmd.Output() if err != nil { return "", fmt.Errorf("running %v: %v", cmd.Args, err) } return strings.TrimSpace(string(stdoutb)), nil } type gcloud struct { // project ID project string } func (gcp *gcloud) cmd(args ...string) []string { return append([]string{"gcloud", "--quiet", "--project", gcp.project}, args...) } ================================================ FILE: samples/guestbook/gcp/variables.tf ================================================ # Copyright 2018 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. variable "project" { type = string description = "Project to set up." } variable "region" { type = string description = "GCP region to create database and storage in, for example 'us-central1'. See https://cloud.google.com/compute/docs/regions-zones/ for valid values." } variable "zone" { type = string description = "GCP zone to create the GKE cluster in, for example 'us-central1-a'. See https://cloud.google.com/compute/docs/regions-zones/ for valid values." } variable "server_service_account_name" { default = "guestbook" description = "The username part of the service account email that will be used for the server running inside the GKE cluster." } variable "db_access_service_account_name" { default = "guestbook-db" description = "The username part of the service account email that will be used for provisioning the database." } variable "cluster_name" { default = "guestbook-cluster" description = "The GKE cluster name." } ================================================ FILE: samples/guestbook/inject_aws.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build wireinject // +build wireinject package main import ( "context" "database/sql" "net/url" "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/aws/aws-sdk-go-v2/service/ssm" "github.com/google/wire" "gocloud.dev/aws/awscloud" "gocloud.dev/blob" "gocloud.dev/blob/s3blob" "gocloud.dev/mysql/awsmysql" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/awsparamstore" "gocloud.dev/server" ) // This file wires the generic interfaces up to Amazon Web Services (AWS). It // won't be directly included in the final binary, since it includes a Wire // injector template function (setupAWS), but the declarations will be copied // into wire_gen.go when Wire is run. // setupAWS is a Wire injector function that sets up the application using AWS. func setupAWS(ctx context.Context, flags *cliFlags) (*server.Server, func(), error) { // This will be filled in by Wire with providers from the provider sets in // wire.Build. wire.Build( awscloud.AWS, wire.Struct(new(awsmysql.URLOpener), "CertSource"), applicationSet, awsBucket, awsMOTDVar, openAWSDatabase, ) return nil, nil, nil } // awsBucket is a Wire provider function that returns the S3 bucket based on the // command-line flags. func awsBucket(ctx context.Context, client *s3.Client, flags *cliFlags) (*blob.Bucket, func(), error) { b, err := s3blob.OpenBucketV2(ctx, client, flags.bucket, nil) if err != nil { return nil, nil, err } return b, func() { b.Close() }, nil } // openAWSDatabase is a Wire provider function that connects to an AWS RDS // MySQL database based on the command-line flags. func openAWSDatabase(ctx context.Context, opener *awsmysql.URLOpener, flags *cliFlags) (*sql.DB, func(), error) { db, err := opener.OpenMySQLURL(ctx, &url.URL{ Scheme: "awsmysql", User: url.UserPassword(flags.dbUser, flags.dbPassword), Host: flags.dbHost, Path: "/" + flags.dbName, }) if err != nil { return nil, nil, err } return db, func() { db.Close() }, nil } // awsMOTDVar is a Wire provider function that returns the Message of the Day // variable from SSM Parameter Store. func awsMOTDVar(ctx context.Context, client *ssm.Client, flags *cliFlags) (*runtimevar.Variable, error) { return awsparamstore.OpenVariableV2(client, flags.motdVar, runtimevar.StringDecoder, &awsparamstore.Options{ WaitDuration: flags.motdVarWaitTime, }) } ================================================ FILE: samples/guestbook/inject_azure.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build wireinject // +build wireinject package main import ( "context" "go.opentelemetry.io/otel/metric" "go.opentelemetry.io/otel/propagation" "go.opentelemetry.io/otel/trace" azcontainer "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/container" "github.com/google/wire" "gocloud.dev/blob" "gocloud.dev/blob/azureblob" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/blobvar" "gocloud.dev/server" "gocloud.dev/server/requestlog" ) // This file wires the generic interfaces up to Microsoft Azure. It // won't be directly included in the final binary, since it includes a Wire // injector template function (setupAzure), but the declarations will be copied // into wire_gen.go when Wire is run. // setupAzure is a Wire injector function that sets up the application using // Azure. func setupAzure(ctx context.Context, flags *cliFlags) (*server.Server, func(), error) { // This will be filled in by Wire with providers from the provider sets in // wire.Build. wire.Build( wire.InterfaceValue(new(requestlog.Logger), requestlog.Logger(nil)), azureblob.NewDefaultServiceURLOptions, azureblob.NewDefaultClient, azureblob.NewServiceURL, applicationSet, bucketName, azureBucket, azureMOTDVar, server.Set, wire.InterfaceValue(new(propagation.TextMapPropagator), propagation.TextMapPropagator(nil)), wire.InterfaceValue(new(trace.TracerProvider), trace.TracerProvider(nil)), wire.InterfaceValue(new(metric.MeterProvider), metric.MeterProvider(nil)), dialLocalSQL, ) return nil, nil, nil } func bucketName(flags *cliFlags) azureblob.ContainerName { return azureblob.ContainerName(flags.bucket) } // azureBucket is a Wire provider function that returns the Azure bucket based // on the command-line flags. func azureBucket(ctx context.Context, client *azcontainer.Client, flags *cliFlags) (*blob.Bucket, func(), error) { b, err := azureblob.OpenBucket(ctx, client, nil) if err != nil { return nil, nil, err } return b, func() { b.Close() }, nil } // azureMOTDVar is a Wire provider function that returns the Message of the Day // variable read from a blob stored in Azure. func azureMOTDVar(ctx context.Context, b *blob.Bucket, flags *cliFlags) (*runtimevar.Variable, error) { return blobvar.OpenVariable(b, flags.motdVar, runtimevar.StringDecoder, &blobvar.Options{ WaitDuration: flags.motdVarWaitTime, }) } ================================================ FILE: samples/guestbook/inject_gcp.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build wireinject // +build wireinject package main import ( "context" "database/sql" "fmt" "net/url" "github.com/google/wire" "gocloud.dev/blob" "gocloud.dev/blob/gcsblob" "gocloud.dev/gcp" "gocloud.dev/gcp/gcpcloud" "gocloud.dev/mysql/gcpmysql" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/gcpruntimeconfig" "gocloud.dev/server" pb "google.golang.org/genproto/googleapis/cloud/runtimeconfig/v1beta1" ) // This file wires the generic interfaces up to Google Cloud Platform (GCP). It // won't be directly included in the final binary, since it includes a Wire // injector template function (setupGCP), but the declarations will be copied // into wire_gen.go when Wire is run. // setupGCP is a Wire injector function that sets up the application using GCP. func setupGCP(ctx context.Context, flags *cliFlags) (*server.Server, func(), error) { // This will be filled in by Wire with providers from the provider sets in // wire.Build. wire.Build( gcpcloud.GCP, wire.Struct(new(gcpmysql.URLOpener), "CertSource"), applicationSet, gcpBucket, gcpMOTDVar, openGCPDatabase, ) return nil, nil, nil } // gcpBucket is a Wire provider function that returns the GCS bucket based on // the command-line flags. func gcpBucket(ctx context.Context, flags *cliFlags, client *gcp.HTTPClient) (*blob.Bucket, func(), error) { b, err := gcsblob.OpenBucket(ctx, client, flags.bucket, nil) if err != nil { return nil, nil, err } return b, func() { b.Close() }, nil } // openGCPDatabase is a Wire provider function that connects to a GCP Cloud SQL // MySQL database based on the command-line flags. func openGCPDatabase(ctx context.Context, opener *gcpmysql.URLOpener, id gcp.ProjectID, flags *cliFlags) (*sql.DB, func(), error) { db, err := opener.OpenMySQLURL(ctx, &url.URL{ Scheme: "gcpmysql", User: url.UserPassword(flags.dbUser, flags.dbPassword), Host: string(id), Path: fmt.Sprintf("/%s/%s/%s", flags.cloudSQLRegion, flags.dbHost, flags.dbName), }) if err != nil { return nil, nil, err } return db, func() { db.Close() }, nil } // gcpMOTDVar is a Wire provider function that returns the Message of the Day // variable from Runtime Configurator. func gcpMOTDVar(ctx context.Context, client pb.RuntimeConfigManagerClient, project gcp.ProjectID, flags *cliFlags) (*runtimevar.Variable, func(), error) { variableKey := gcpruntimeconfig.VariableKey(project, flags.runtimeConfigName, flags.motdVar) v, err := gcpruntimeconfig.OpenVariable(client, variableKey, runtimevar.StringDecoder, &gcpruntimeconfig.Options{ WaitDuration: flags.motdVarWaitTime, }) if err != nil { return nil, nil, err } return v, func() { v.Close() }, nil } ================================================ FILE: samples/guestbook/inject_local.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build wireinject // +build wireinject package main import ( "context" "database/sql" "github.com/go-sql-driver/mysql" "github.com/google/wire" "gocloud.dev/blob" "gocloud.dev/blob/fileblob" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/filevar" "gocloud.dev/server" "gocloud.dev/server/requestlog" ) // This file wires the generic interfaces up to local implementations. It won't // be directly included in the final binary, since it includes a Wire injector // template function (setupLocal), but the declarations will be copied into // wire_gen.go when Wire is run. // setupLocal is a Wire injector function that sets up the application using // local implementations. func setupLocal(ctx context.Context, flags *cliFlags) (*server.Server, func(), error) { // This will be filled in by Wire with providers from the provider sets in // wire.Build. wire.Build( wire.InterfaceValue(new(requestlog.Logger), requestlog.Logger(nil)), server.Set, newPropagationTextMap, newTraceSampler, newTraceExporter, otelTracesProviderSet, otelMetricsProviderSet, newMetricsReader, applicationSet, dialLocalSQL, localBucket, localRuntimeVar, ) return nil, nil, nil } // localBucket is a Wire provider function that returns a directory-based bucket // based on the command-line flags. func localBucket(flags *cliFlags) (*blob.Bucket, error) { return fileblob.OpenBucket(flags.bucket, nil) } // dialLocalSQL is a Wire provider function that connects to a MySQL database // (usually on localhost). func dialLocalSQL(flags *cliFlags) (*sql.DB, error) { cfg := &mysql.Config{ Net: "tcp", Addr: flags.dbHost, DBName: flags.dbName, User: flags.dbUser, Passwd: flags.dbPassword, AllowNativePasswords: true, } return sql.Open("mysql", cfg.FormatDSN()) } // localRuntimeVar is a Wire provider function that returns the Message of the // Day variable based on a local file. func localRuntimeVar(flags *cliFlags) (*runtimevar.Variable, func(), error) { v, err := filevar.OpenVariable(flags.motdVar, runtimevar.StringDecoder, &filevar.Options{ WaitDuration: flags.motdVarWaitTime, }) if err != nil { return nil, nil, err } return v, func() { v.Close() }, nil } ================================================ FILE: samples/guestbook/localdb/main.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package main import ( "context" "errors" "flag" "fmt" "log" "os" "os/exec" "os/signal" "path/filepath" "strings" "time" pipe "gopkg.in/pipe.v2" ) func main() { guestbookDir := flag.String("guestbook_dir", ".", "directory containing guestbook sample source code") flag.Parse() if flag.NArg() > 1 { fmt.Fprintf(os.Stderr, "usage: localdb [flags] container_name\n") os.Exit(1) } log.SetPrefix("localdb: ") log.SetFlags(0) if err := runLocalDB(flag.Arg(0), *guestbookDir); err != nil { log.Fatal(err) } } func runLocalDB(containerName, guestbookDir string) error { image := "mysql:5.6" log.Printf("Starting container running MySQL") dockerArgs := []string{"run", "--rm"} if containerName != "" { dockerArgs = append(dockerArgs, "--name", containerName) } dockerArgs = append(dockerArgs, "--platform", "linux/amd64", "--env", "MYSQL_DATABASE=guestbook", "--env", "MYSQL_ROOT_PASSWORD=password", "--detach", "--publish", "3306:3306", image) cmd := exec.Command("docker", dockerArgs...) cmd.Stderr = os.Stderr out, err := cmd.Output() if err != nil { return fmt.Errorf("running %v: %v: %s", cmd.Args, err, out) } containerID := strings.TrimSpace(string(out)) defer func() { log.Printf("killing %s", containerID) stop := exec.Command("docker", "kill", containerID) stop.Stderr = os.Stderr if err := stop.Run(); err != nil { log.Printf("failed to kill db container: %v", err) } }() // Stop the container on Ctrl-C. ctx, cancel := context.WithCancel(context.Background()) go func() { c := make(chan os.Signal, 1) // TODO(ijt): Handle SIGTERM. signal.Notify(c, os.Interrupt) <-c cancel() }() nap := 10 * time.Second log.Printf("Waiting %v for database to come up", nap) select { case <-time.After(nap): // ok case <-ctx.Done(): return errors.New("interrupted while napping") } log.Printf("Initializing database schema and users") schema, err := os.ReadFile(filepath.Join(guestbookDir, "schema.sql")) if err != nil { return fmt.Errorf("reading schema: %v", err) } roles, err := os.ReadFile(filepath.Join(guestbookDir, "roles.sql")) if err != nil { return fmt.Errorf("reading roles: %v", err) } tooMany := 10 var i int for i = 0; i < tooMany; i++ { mySQL := `mysql -h"${MYSQL_PORT_3306_TCP_ADDR?}" -P"${MYSQL_PORT_3306_TCP_PORT?}" -uroot -ppassword guestbook` p := pipe.Line( pipe.Read(strings.NewReader(string(schema)+string(roles))), pipe.Exec("docker", "run", "--rm", "--interactive", "--link", containerID+":mysql", image, "sh", "-c", mySQL), ) if _, stderr, err := pipe.DividedOutput(p); err != nil { log.Printf("Failed to seed database: %q; retrying", stderr) select { case <-time.After(time.Second): continue case <-ctx.Done(): return errors.New("interrupted while napping in between database seeding attempts") } } break } if i == tooMany { return fmt.Errorf("gave up after %d tries to seed database", i) } log.Printf("Database running at localhost:3306") attach := exec.CommandContext(ctx, "docker", "attach", containerID) attach.Stdout = os.Stdout attach.Stderr = os.Stderr if err := attach.Run(); err != nil { return fmt.Errorf("running %v: %q", attach.Args, err) } return nil } ================================================ FILE: samples/guestbook/main.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // guestbook is a sample application that records visitors' messages, displays a // cloud banner, and an administrative message. package main import ( "bytes" "context" "database/sql" "flag" "html/template" "io" "log" "net/http" "strconv" "time" "github.com/google/wire" "github.com/gorilla/mux" "gocloud.dev/blob" "gocloud.dev/gcerrors" "gocloud.dev/runtimevar" "gocloud.dev/server" "gocloud.dev/server/health" "gocloud.dev/server/health/sqlhealth" ) type cliFlags struct { bucket string dbHost string dbName string dbUser string dbPassword string motdVar string motdVarWaitTime time.Duration // GCP only. cloudSQLRegion string runtimeConfigName string } var envFlag string func main() { // Determine environment to set up based on flag. cf := new(cliFlags) flag.StringVar(&envFlag, "env", "local", "environment to run under (gcp, aws, azure, or local)") addr := flag.String("listen", ":8080", "port to listen for HTTP on") flag.StringVar(&cf.bucket, "bucket", "", "bucket name") flag.StringVar(&cf.dbHost, "db_host", "", "database host or Cloud SQL instance name") flag.StringVar(&cf.dbName, "db_name", "guestbook", "database name") flag.StringVar(&cf.dbUser, "db_user", "guestbook", "database user") flag.StringVar(&cf.dbPassword, "db_password", "", "database user password") flag.StringVar(&cf.motdVar, "motd_var", "", "message of the day variable location") flag.DurationVar(&cf.motdVarWaitTime, "motd_var_wait_time", 5*time.Second, "polling frequency of message of the day") flag.StringVar(&cf.cloudSQLRegion, "cloud_sql_region", "", "region of the Cloud SQL instance (GCP only)") flag.StringVar(&cf.runtimeConfigName, "runtime_config", "", "Runtime Configurator config resource (GCP only)") flag.Parse() ctx := context.Background() var srv *server.Server var cleanup func() var err error switch envFlag { case "gcp": srv, cleanup, err = setupGCP(ctx, cf) case "aws": srv, cleanup, err = setupAWS(ctx, cf) case "azure": if cf.dbHost == "" { cf.dbHost = "localhost" } if cf.dbPassword == "" { cf.dbPassword = "xyzzy" } srv, cleanup, err = setupAzure(ctx, cf) case "local": // The default MySQL instance is running on localhost // with this root password. if cf.dbHost == "" { cf.dbHost = "localhost" } if cf.dbPassword == "" { cf.dbPassword = "xyzzy" } srv, cleanup, err = setupLocal(ctx, cf) default: log.Fatalf("unknown -env=%s", envFlag) } if err != nil { log.Fatal(err) } defer cleanup() // Listen and serve HTTP. log.Printf("Running, connected to %q cloud", envFlag) log.Fatal(srv.ListenAndServe(*addr)) } // applicationSet is the Wire provider set for the Guestbook application that // does not depend on the underlying platform. var applicationSet = wire.NewSet( newApplication, appHealthChecks, newRouter, wire.Bind(new(http.Handler), new(*mux.Router)), ) func newRouter(app *application) *mux.Router { r := mux.NewRouter() r.HandleFunc("/", app.index) r.HandleFunc("/sign", app.sign) r.HandleFunc("/blob/{key:.+}", app.serveBlob) return r } // application is the main server struct for Guestbook. It contains the state of // the most recently read message of the day. type application struct { db *sql.DB bucket *blob.Bucket motdVar *runtimevar.Variable } // newApplication creates a new application struct based on the backends and the message // of the day variable. func newApplication(db *sql.DB, bucket *blob.Bucket, motdVar *runtimevar.Variable) *application { return &application{ db: db, bucket: bucket, motdVar: motdVar, } } // index serves the server's landing page. It lists the 100 most recent // greetings, shows a cloud environment banner, and displays the message of the // day. func (app *application) index(w http.ResponseWriter, r *http.Request) { var data struct { MOTD string Env string BannerSrc string Greetings []greeting } snap, err := app.motdVar.Latest(r.Context()) if err != nil { log.Println("index page error:", err) http.Error(w, "could not load motd", http.StatusInternalServerError) return } data.MOTD = snap.Value.(string) switch envFlag { case "gcp": data.Env = "GCP" data.BannerSrc = "/blob/gcp.png" case "aws": data.Env = "AWS" data.BannerSrc = "/blob/aws.png" case "azure": data.Env = "Azure" data.BannerSrc = "/blob/azure.png" case "local": data.Env = "Local" data.BannerSrc = "/blob/gophers.jpg" } const query = "SELECT content FROM (SELECT content, post_date FROM greetings ORDER BY post_date DESC LIMIT 100) AS recent_greetings ORDER BY post_date ASC;" q, err := app.db.QueryContext(r.Context(), query) if err != nil { log.Println("main page SQL error:", err) http.Error(w, "could not load greetings", http.StatusInternalServerError) return } defer q.Close() for q.Next() { var g greeting if err := q.Scan(&g.Content); err != nil { log.Println("main page SQL error:", err) http.Error(w, "could not load greetings", http.StatusInternalServerError) return } data.Greetings = append(data.Greetings, g) } if err := q.Err(); err != nil { log.Println("main page SQL error:", err) http.Error(w, "could not load greetings", http.StatusInternalServerError) return } buf := new(bytes.Buffer) if err := tmpl.Execute(buf, data); err != nil { log.Println("template error:", err) http.Error(w, "could not render page", http.StatusInternalServerError) return } w.Header().Set("Content-Type", "text/html; charset=utf-8") w.Header().Set("Content-Length", strconv.Itoa(buf.Len())) if _, err := w.Write(buf.Bytes()); err != nil { log.Println("writing response:", err) } } type greeting struct { Content string } var tmpl = template.Must(template.New("index.html").Parse(`<!DOCTYPE html> <title>Guestbook - {{.Env}}</title> <style type="text/css"> html, body { font-family: Helvetica, sans-serif; } blockquote { font-family: cursive, Helvetica, sans-serif; } .banner { height: 125px; width: 250px; } .greeting { font-size: 85%; } .motd { font-weight: bold; } </style> <h1>Guestbook</h1> <div><img class="banner" src="{{.BannerSrc}}"></div> {{with .MOTD}}<p class="motd">Admin says: {{.}}</p>{{end}} {{range .Greetings}} <div class="greeting"> Someone wrote: <blockquote>{{.Content}}</blockquote> </div> {{end}} <form action="/sign" method="POST"> <div><textarea name="content" rows="3"></textarea></div> <div><input type="submit" value="Sign"></div> </form> `)) // sign is a form action handler for adding a greeting. func (app *application) sign(w http.ResponseWriter, r *http.Request) { if r.Method != "POST" { w.Header().Set("Allow", "POST") http.Error(w, "Only POST allowed", http.StatusMethodNotAllowed) return } content := r.FormValue("content") if content == "" { http.Error(w, "content must not be empty", http.StatusBadRequest) return } const sqlStmt = "INSERT INTO greetings (content) VALUES (?);" _, err := app.db.ExecContext(r.Context(), sqlStmt, content) if err != nil { log.Println("sign SQL error:", err) http.Error(w, "database error", http.StatusInternalServerError) return } http.Redirect(w, r, "/", http.StatusSeeOther) } // serveBlob handles a request for a static asset by retrieving it from a bucket. func (app *application) serveBlob(w http.ResponseWriter, r *http.Request) { key := mux.Vars(r)["key"] blobReader, err := app.bucket.NewReader(r.Context(), key, nil) if err != nil { log.Println("serve blob:", err) if gcerrors.Code(err) == gcerrors.NotFound { http.Error(w, "blob not found", http.StatusNotFound) } else { http.Error(w, "blob read error", http.StatusInternalServerError) } return } defer blobReader.Close() w.Header().Set("Content-Type", blobReader.ContentType()) w.Header().Set("Content-Length", strconv.FormatInt(blobReader.Size(), 10)) if _, err = io.Copy(w, blobReader); err != nil { log.Println("Copying blob:", err) } } // appHealthChecks returns a health check for the database. This will signal // to Kubernetes or other orchestrators that the server should not receive // traffic until the server is able to connect to its database. func appHealthChecks(db *sql.DB) ([]health.Checker, func()) { dbCheck := sqlhealth.New(db) list := []health.Checker{dbCheck} return list, func() { dbCheck.Stop() } } ================================================ FILE: samples/guestbook/roles.sql ================================================ -- Copyright 2018 The Go Cloud Development Kit Authors -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- -- https://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, -- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- See the License for the specific language governing permissions and -- limitations under the License. CREATE USER 'guestbook'@'%' IDENTIFIED BY 'xyzzy'; GRANT SELECT,INSERT,UPDATE,DELETE ON guestbook.* TO 'guestbook'@'%'; ================================================ FILE: samples/guestbook/schema.sql ================================================ -- Copyright 2018 The Go Cloud Development Kit Authors -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- -- https://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, -- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- See the License for the specific language governing permissions and -- limitations under the License. CREATE TABLE greetings ( content VARCHAR(255) CHARACTER SET utf8 NOT NULL CHECK (content <> ''), post_date DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ); ================================================ FILE: samples/guestbook/telemetry.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package main import ( "context" "github.com/google/wire" "go.opentelemetry.io/contrib/exporters/autoexport" "go.opentelemetry.io/contrib/propagators/autoprop" "go.opentelemetry.io/otel/log" "go.opentelemetry.io/otel/metric" "go.opentelemetry.io/otel/propagation" sdklog "go.opentelemetry.io/otel/sdk/log" sdkmetric "go.opentelemetry.io/otel/sdk/metric" "go.opentelemetry.io/otel/sdk/resource" sdktrace "go.opentelemetry.io/otel/sdk/trace" "go.opentelemetry.io/otel/trace" ) // otelTracesProviderSet is a Wire provider set that provides the open telemetry trace provider var otelTracesProviderSet = wire.NewSet( NewTraceProvider, wire.Bind(new(trace.TracerProvider), new(*sdktrace.TracerProvider)), ) // otelMetricsProviderSet is a Wire provider set that provides the open telemetry metrics provider var otelMetricsProviderSet = wire.NewSet( NewMeterProvider, wire.Bind(new(metric.MeterProvider), new(*sdkmetric.MeterProvider)), ) // OtelLogsSet is a Wire provider set that provides the open telemetry logs provider given the exporter var OtelLogsSet = wire.NewSet( NewLogsExporter, NewLoggerProvider, wire.Bind(new(log.LoggerProvider), new(*sdklog.LoggerProvider)), ) func newResource() *resource.Resource { return resource.Default() } func newPropagationTextMap() propagation.TextMapPropagator { return autoprop.NewTextMapPropagator() } // newTraceExporter returns a new OpenTelemetry gcp trace exporter. func newTraceExporter(ctx context.Context) (sdktrace.SpanExporter, error) { traceExporter, err := autoexport.NewSpanExporter(ctx) if err != nil { return nil, err } return traceExporter, nil } // newTraceSampler returns a new OpenTelemetry trace sampler. func newTraceSampler(ctx context.Context) sdktrace.Sampler { return sdktrace.AlwaysSample() } // NewTraceProvider returns a new trace provider for our service to utilise. // // The second return value is a Wire cleanup function that calls Close on the provider, func NewTraceProvider(ctx context.Context, exporter sdktrace.SpanExporter, sampler sdktrace.Sampler) (*sdktrace.TracerProvider, func()) { res := newResource() tp := sdktrace.NewTracerProvider( sdktrace.WithBatcher(exporter), sdktrace.WithSampler(sampler), sdktrace.WithResource(res), ) return tp, func() { _ = tp.Shutdown(ctx) } } // newMetricsReader returns a new OpenTelemetry gcp metrics exporter. func newMetricsReader(ctx context.Context) (sdkmetric.Reader, error) { // Create and start new OTLP metric exporter metricReader, err := autoexport.NewMetricReader(ctx) if err != nil { return nil, err } return metricReader, nil } // NewMeterProvider returns a new metric provider for our service to utilise. // // The second return value is a Wire cleanup function that calls Close on the provider, func NewMeterProvider(ctx context.Context, reader sdkmetric.Reader) (*sdkmetric.MeterProvider, func()) { res := newResource() meterProvider := sdkmetric.NewMeterProvider( sdkmetric.WithResource(res), sdkmetric.WithReader(reader), ) return meterProvider, func() { _ = meterProvider.Shutdown(ctx) } } // NewLogsExporter returns a new OpenTelemetry gcp metrics exporter. func NewLogsExporter(ctx context.Context) (sdklog.Exporter, error) { // Create and start new OTLP metric exporter logsExporter, err := autoexport.NewLogExporter(ctx) if err != nil { return nil, err } return logsExporter, nil } // NewLoggerProvider returns a new logger provider for our service to utilise. // // The second return value is a Wire cleanup function that calls Close on the provider, func NewLoggerProvider(ctx context.Context, res *resource.Resource, exporter sdklog.Exporter) (*sdklog.LoggerProvider, func(), error) { var err error if exporter == nil { exporter, err = autoexport.NewLogExporter(ctx) if err != nil { return nil, nil, err } } processor := sdklog.NewBatchProcessor(exporter) logProvider := sdklog.NewLoggerProvider( sdklog.WithResource(res), sdklog.WithProcessor(processor), ) return logProvider, func() { _ = logProvider.Shutdown(context.TODO()) }, nil } ================================================ FILE: samples/guestbook/wire_gen.go ================================================ // Code generated by Wire. DO NOT EDIT. //go:generate go run -mod=mod github.com/google/wire/cmd/wire //go:build !wireinject // +build !wireinject package main import ( "context" "database/sql" "fmt" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/container" "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/aws/aws-sdk-go-v2/service/ssm" "github.com/go-sql-driver/mysql" "go.opentelemetry.io/otel/metric" "go.opentelemetry.io/otel/propagation" "go.opentelemetry.io/otel/trace" "gocloud.dev/aws" "gocloud.dev/aws/rds" "gocloud.dev/blob" "gocloud.dev/blob/azureblob" "gocloud.dev/blob/fileblob" "gocloud.dev/blob/gcsblob" "gocloud.dev/blob/s3blob" "gocloud.dev/gcp" "gocloud.dev/gcp/cloudsql" "gocloud.dev/mysql/awsmysql" "gocloud.dev/mysql/gcpmysql" "gocloud.dev/runtimevar" "gocloud.dev/runtimevar/awsparamstore" "gocloud.dev/runtimevar/blobvar" "gocloud.dev/runtimevar/filevar" "gocloud.dev/runtimevar/gcpruntimeconfig" "gocloud.dev/server" "gocloud.dev/server/requestlog" "gocloud.dev/server/sdserver" "gocloud.dev/server/xrayserver" "google.golang.org/genproto/googleapis/cloud/runtimeconfig/v1beta1" "net/http" "net/url" ) // Injectors from inject_aws.go: // setupAWS is a Wire injector function that sets up the application using AWS. func setupAWS(ctx context.Context, flags *cliFlags) (*server.Server, func(), error) { client := _wireClientValue certFetcher := &rds.CertFetcher{ Client: client, } urlOpener := &awsmysql.URLOpener{ CertSource: certFetcher, } db, cleanup, err := openAWSDatabase(ctx, urlOpener, flags) if err != nil { return nil, nil, err } config, err := aws.NewDefaultV2Config(ctx) if err != nil { cleanup() return nil, nil, err } s3Client := s3blob.Dial(config) bucket, cleanup2, err := awsBucket(ctx, s3Client, flags) if err != nil { cleanup() return nil, nil, err } ssmClient := awsparamstore.Dial(config) variable, err := awsMOTDVar(ctx, ssmClient, flags) if err != nil { cleanup2() cleanup() return nil, nil, err } mainApplication := newApplication(db, bucket, variable) router := newRouter(mainApplication) ncsaLogger := xrayserver.NewRequestLogger() v, cleanup3 := appHealthChecks(db) propagator := xrayserver.NewTextMapPropagator() spanExporter, err := xrayserver.NewTraceExporter(ctx) if err != nil { cleanup3() cleanup2() cleanup() return nil, nil, err } sampler := xrayserver.NewTraceSampler() tracerProvider, cleanup4, err := xrayserver.NewTraceProvider(ctx, spanExporter, sampler) if err != nil { cleanup3() cleanup2() cleanup() return nil, nil, err } reader, err := xrayserver.NewMetricsReader(ctx) if err != nil { cleanup4() cleanup3() cleanup2() cleanup() return nil, nil, err } meterProvider, cleanup5, err := xrayserver.NewMeterProvider(ctx, reader) if err != nil { cleanup4() cleanup3() cleanup2() cleanup() return nil, nil, err } defaultDriver := _wireDefaultDriverValue options := &server.Options{ RequestLogger: ncsaLogger, HealthChecks: v, TraceTextMapPropagator: propagator, TraceProvider: tracerProvider, MetricsProvider: meterProvider, Driver: defaultDriver, } serverServer := server.New(router, options) return serverServer, func() { cleanup5() cleanup4() cleanup3() cleanup2() cleanup() }, nil } var ( _wireClientValue = http.DefaultClient _wireDefaultDriverValue = &server.DefaultDriver{} ) // Injectors from inject_azure.go: // setupAzure is a Wire injector function that sets up the application using // Azure. func setupAzure(ctx context.Context, flags *cliFlags) (*server.Server, func(), error) { db, err := dialLocalSQL(flags) if err != nil { return nil, nil, err } serviceURLOptions := azureblob.NewDefaultServiceURLOptions() serviceURL, err := azureblob.NewServiceURL(serviceURLOptions) if err != nil { return nil, nil, err } containerName := bucketName(flags) client, err := azureblob.NewDefaultClient(serviceURL, containerName) if err != nil { return nil, nil, err } bucket, cleanup, err := azureBucket(ctx, client, flags) if err != nil { return nil, nil, err } variable, err := azureMOTDVar(ctx, bucket, flags) if err != nil { cleanup() return nil, nil, err } mainApplication := newApplication(db, bucket, variable) router := newRouter(mainApplication) logger := _wireLoggerValue v, cleanup2 := appHealthChecks(db) textMapPropagator := _wireTextMapPropagatorValue tracerProvider := _wireTracerProviderValue meterProvider := _wireMeterProviderValue defaultDriver := _wireDefaultDriverValue options := &server.Options{ RequestLogger: logger, HealthChecks: v, TraceTextMapPropagator: textMapPropagator, TraceProvider: tracerProvider, MetricsProvider: meterProvider, Driver: defaultDriver, } serverServer := server.New(router, options) return serverServer, func() { cleanup2() cleanup() }, nil } var ( _wireLoggerValue = requestlog.Logger(nil) _wireTextMapPropagatorValue = propagation.TextMapPropagator(nil) _wireTracerProviderValue = trace.TracerProvider(nil) _wireMeterProviderValue = metric.MeterProvider(nil) ) // Injectors from inject_gcp.go: // setupGCP is a Wire injector function that sets up the application using GCP. func setupGCP(ctx context.Context, flags *cliFlags) (*server.Server, func(), error) { roundTripper := gcp.DefaultTransport() credentials, err := gcp.DefaultCredentials(ctx) if err != nil { return nil, nil, err } tokenSource := gcp.CredentialsTokenSource(credentials) httpClient, err := gcp.NewHTTPClient(roundTripper, tokenSource) if err != nil { return nil, nil, err } remoteCertSource := cloudsql.NewCertSource(httpClient) urlOpener := &gcpmysql.URLOpener{ CertSource: remoteCertSource, } projectID, err := gcp.DefaultProjectID(credentials) if err != nil { return nil, nil, err } db, cleanup, err := openGCPDatabase(ctx, urlOpener, projectID, flags) if err != nil { return nil, nil, err } bucket, cleanup2, err := gcpBucket(ctx, flags, httpClient) if err != nil { cleanup() return nil, nil, err } runtimeConfigManagerClient, cleanup3, err := gcpruntimeconfig.Dial(ctx, tokenSource) if err != nil { cleanup2() cleanup() return nil, nil, err } variable, cleanup4, err := gcpMOTDVar(ctx, runtimeConfigManagerClient, projectID, flags) if err != nil { cleanup3() cleanup2() cleanup() return nil, nil, err } mainApplication := newApplication(db, bucket, variable) router := newRouter(mainApplication) stackdriverLogger := sdserver.NewRequestLogger() v, cleanup5 := appHealthChecks(db) textMapPropagator := sdserver.NewTextMapPropagator() spanExporter, err := sdserver.NewTraceExporter(projectID) if err != nil { cleanup5() cleanup4() cleanup3() cleanup2() cleanup() return nil, nil, err } sampler := sdserver.NewTraceSampler(ctx) tracerProvider, cleanup6, err := sdserver.NewTraceProvider(ctx, spanExporter, sampler) if err != nil { cleanup5() cleanup4() cleanup3() cleanup2() cleanup() return nil, nil, err } reader, err := sdserver.NewMetricsReader(projectID) if err != nil { cleanup6() cleanup5() cleanup4() cleanup3() cleanup2() cleanup() return nil, nil, err } meterProvider, cleanup7, err := sdserver.NewMeterProvider(ctx, reader) if err != nil { cleanup6() cleanup5() cleanup4() cleanup3() cleanup2() cleanup() return nil, nil, err } defaultDriver := _wireDefaultDriverValue options := &server.Options{ RequestLogger: stackdriverLogger, HealthChecks: v, TraceTextMapPropagator: textMapPropagator, TraceProvider: tracerProvider, MetricsProvider: meterProvider, Driver: defaultDriver, } serverServer := server.New(router, options) return serverServer, func() { cleanup7() cleanup6() cleanup5() cleanup4() cleanup3() cleanup2() cleanup() }, nil } // Injectors from inject_local.go: // setupLocal is a Wire injector function that sets up the application using // local implementations. func setupLocal(ctx context.Context, flags *cliFlags) (*server.Server, func(), error) { db, err := dialLocalSQL(flags) if err != nil { return nil, nil, err } bucket, err := localBucket(flags) if err != nil { return nil, nil, err } variable, cleanup, err := localRuntimeVar(flags) if err != nil { return nil, nil, err } mainApplication := newApplication(db, bucket, variable) router := newRouter(mainApplication) logger := _wireRequestlogLoggerValue v, cleanup2 := appHealthChecks(db) textMapPropagator := newPropagationTextMap() spanExporter, err := newTraceExporter(ctx) if err != nil { cleanup2() cleanup() return nil, nil, err } sampler := newTraceSampler(ctx) tracerProvider, cleanup3 := NewTraceProvider(ctx, spanExporter, sampler) reader, err := newMetricsReader(ctx) if err != nil { cleanup3() cleanup2() cleanup() return nil, nil, err } meterProvider, cleanup4 := NewMeterProvider(ctx, reader) defaultDriver := _wireDefaultDriverValue options := &server.Options{ RequestLogger: logger, HealthChecks: v, TraceTextMapPropagator: textMapPropagator, TraceProvider: tracerProvider, MetricsProvider: meterProvider, Driver: defaultDriver, } serverServer := server.New(router, options) return serverServer, func() { cleanup4() cleanup3() cleanup2() cleanup() }, nil } var ( _wireRequestlogLoggerValue = requestlog.Logger(nil) ) // inject_aws.go: // awsBucket is a Wire provider function that returns the S3 bucket based on the // command-line flags. func awsBucket(ctx context.Context, client *s3.Client, flags *cliFlags) (*blob.Bucket, func(), error) { b, err := s3blob.OpenBucketV2(ctx, client, flags.bucket, nil) if err != nil { return nil, nil, err } return b, func() { b.Close() }, nil } // openAWSDatabase is a Wire provider function that connects to an AWS RDS // MySQL database based on the command-line flags. func openAWSDatabase(ctx context.Context, opener *awsmysql.URLOpener, flags *cliFlags) (*sql.DB, func(), error) { db, err := opener.OpenMySQLURL(ctx, &url.URL{ Scheme: "awsmysql", User: url.UserPassword(flags.dbUser, flags.dbPassword), Host: flags.dbHost, Path: "/" + flags.dbName, }) if err != nil { return nil, nil, err } return db, func() { db.Close() }, nil } // awsMOTDVar is a Wire provider function that returns the Message of the Day // variable from SSM Parameter Store. func awsMOTDVar(ctx context.Context, client *ssm.Client, flags *cliFlags) (*runtimevar.Variable, error) { return awsparamstore.OpenVariableV2(client, flags.motdVar, runtimevar.StringDecoder, &awsparamstore.Options{ WaitDuration: flags.motdVarWaitTime, }) } // inject_azure.go: func bucketName(flags *cliFlags) azureblob.ContainerName { return azureblob.ContainerName(flags.bucket) } // azureBucket is a Wire provider function that returns the Azure bucket based // on the command-line flags. func azureBucket(ctx context.Context, client *container.Client, flags *cliFlags) (*blob.Bucket, func(), error) { b, err := azureblob.OpenBucket(ctx, client, nil) if err != nil { return nil, nil, err } return b, func() { b.Close() }, nil } // azureMOTDVar is a Wire provider function that returns the Message of the Day // variable read from a blob stored in Azure. func azureMOTDVar(ctx context.Context, b *blob.Bucket, flags *cliFlags) (*runtimevar.Variable, error) { return blobvar.OpenVariable(b, flags.motdVar, runtimevar.StringDecoder, &blobvar.Options{ WaitDuration: flags.motdVarWaitTime, }) } // inject_gcp.go: // gcpBucket is a Wire provider function that returns the GCS bucket based on // the command-line flags. func gcpBucket(ctx context.Context, flags *cliFlags, client *gcp.HTTPClient) (*blob.Bucket, func(), error) { b, err := gcsblob.OpenBucket(ctx, client, flags.bucket, nil) if err != nil { return nil, nil, err } return b, func() { b.Close() }, nil } // openGCPDatabase is a Wire provider function that connects to a GCP Cloud SQL // MySQL database based on the command-line flags. func openGCPDatabase(ctx context.Context, opener *gcpmysql.URLOpener, id gcp.ProjectID, flags *cliFlags) (*sql.DB, func(), error) { db, err := opener.OpenMySQLURL(ctx, &url.URL{ Scheme: "gcpmysql", User: url.UserPassword(flags.dbUser, flags.dbPassword), Host: string(id), Path: fmt.Sprintf("/%s/%s/%s", flags.cloudSQLRegion, flags.dbHost, flags.dbName), }) if err != nil { return nil, nil, err } return db, func() { db.Close() }, nil } // gcpMOTDVar is a Wire provider function that returns the Message of the Day // variable from Runtime Configurator. func gcpMOTDVar(ctx context.Context, client runtimeconfig.RuntimeConfigManagerClient, project gcp.ProjectID, flags *cliFlags) (*runtimevar.Variable, func(), error) { variableKey := gcpruntimeconfig.VariableKey(project, flags.runtimeConfigName, flags.motdVar) v, err := gcpruntimeconfig.OpenVariable(client, variableKey, runtimevar.StringDecoder, &gcpruntimeconfig.Options{ WaitDuration: flags.motdVarWaitTime, }) if err != nil { return nil, nil, err } return v, func() { v.Close() }, nil } // inject_local.go: // localBucket is a Wire provider function that returns a directory-based bucket // based on the command-line flags. func localBucket(flags *cliFlags) (*blob.Bucket, error) { return fileblob.OpenBucket(flags.bucket, nil) } // dialLocalSQL is a Wire provider function that connects to a MySQL database // (usually on localhost). func dialLocalSQL(flags *cliFlags) (*sql.DB, error) { cfg := &mysql.Config{ Net: "tcp", Addr: flags.dbHost, DBName: flags.dbName, User: flags.dbUser, Passwd: flags.dbPassword, AllowNativePasswords: true, } return sql.Open("mysql", cfg.FormatDSN()) } // localRuntimeVar is a Wire provider function that returns the Message of the // Day variable based on a local file. func localRuntimeVar(flags *cliFlags) (*runtimevar.Variable, func(), error) { v, err := filevar.OpenVariable(flags.motdVar, runtimevar.StringDecoder, &filevar.Options{ WaitDuration: flags.motdVarWaitTime, }) if err != nil { return nil, nil, err } return v, func() { v.Close() }, nil } ================================================ FILE: samples/order/common.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package main import ( "time" ) // Order represents an order for a single image operation. type Order struct { ID string // unique ID, randomly generated Email string // email address of customer InImage string // name of input image OutImage string // name of output image; empty if there was an error CreateTime time.Time // time the order was created FinishTime time.Time // time the order was finished Note string // note to the customer from the processor, describing success or error DocstoreRevision any } // OrderRequest is a request for an order. It is the contents of the messages // sent to the requests topic. type OrderRequest struct { ID string Email string InImage string CreateTime time.Time } ================================================ FILE: samples/order/frontend.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package main import ( "bytes" "context" "encoding/json" "fmt" "html/template" "io" "log" "net/http" "os" "path/filepath" "strings" "time" "gocloud.dev/blob" _ "gocloud.dev/blob/fileblob" "gocloud.dev/docstore" _ "gocloud.dev/docstore/memdocstore" "gocloud.dev/pubsub" _ "gocloud.dev/pubsub/mempubsub" "gocloud.dev/server" "gocloud.dev/server/requestlog" ) // A frontend is a web server that takes image-processing orders. type frontend struct { requestTopic *pubsub.Topic bucket *blob.Bucket coll *docstore.Collection } var ( listTemplate *template.Template orderFormTemplate *template.Template ) func init() { // Work around a bug in go test where -coverpkg=./... uses the wrong // working directory (golang.org/issue/33016). dir, err := os.Getwd() if err != nil { log.Fatal(err) } if filepath.Base(dir) != "order" { // The bug puts us in a sibling directory. log.Printf("working around #33016, which put us in %s", dir) dir = filepath.Join(filepath.Dir(dir), "order") } listTemplate = template.Must(template.ParseFiles(filepath.Join(dir, "list.htmlt"))) orderFormTemplate = template.Must(template.ParseFiles(filepath.Join(dir, "order-form.htmlt"))) } // run starts the server on port and runs it indefinitely. func (f *frontend) run(ctx context.Context, port int) error { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "index.html") }) http.HandleFunc("/style.css", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "style.css") }) http.HandleFunc("/orders/", wrapHTTPError(f.listOrders)) http.HandleFunc("/orders/new", wrapHTTPError(f.orderForm)) http.HandleFunc("/createOrder", wrapHTTPError(f.createOrder)) http.HandleFunc("/show/", wrapHTTPError(f.showImage)) rl := requestlog.NewNCSALogger(os.Stdout, func(err error) { fmt.Fprintf(os.Stderr, "%v\n", err) }) s := server.New(nil, &server.Options{ RequestLogger: rl, }) return s.ListenAndServe(fmt.Sprintf(":%d", port)) } // wrapHTTPError turns handlers that return error into ordinary http.Handlers, // by calling http.Error on non-nil errors. func wrapHTTPError(f func(http.ResponseWriter, *http.Request) error) func(http.ResponseWriter, *http.Request) { return func(w http.ResponseWriter, r *http.Request) { if err := f(w, r); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } } } // orderForm serves a page that lets the user input a new order. func (*frontend) orderForm(w http.ResponseWriter, r *http.Request) error { if r.Method != "GET" { http.Error(w, "bad method for orderForm: want GET", http.StatusBadRequest) return nil } return executeTemplate(orderFormTemplate, nil, w) } // createOrder handles a submitted order form. func (f *frontend) createOrder(w http.ResponseWriter, r *http.Request) error { if r.Method != "POST" { http.Error(w, "bad method for createOrder: want POST", http.StatusBadRequest) return nil } email := r.FormValue("email") if email == "" { http.Error(w, "email missing", http.StatusBadRequest) return nil } file, _, err := r.FormFile("file") if err != nil { return err } defer file.Close() if _, err := f.doCreateOrder(r.Context(), email, file, time.Now()); err != nil { return err } fmt.Fprintln(w, "Order received. Thank you.") return nil } // doCreateOrder creates a new order. // It is passed the customer's email address, an io.Reader for reading the input // image, and the current time. // It creates an Order in the database and sends an OrderRequest over the pub/sub topic. // It returns the order ID it generates, for testing. func (f *frontend) doCreateOrder(ctx context.Context, email string, file io.Reader, now time.Time) (id string, err error) { // Assign an ID for the order here, rather than in the processor. // That allows the processor to detect duplicate pub/sub messages. id = f.newID() req := &OrderRequest{ ID: id, InImage: id + "-in", Email: email, CreateTime: now, } // Copy the uploaded input file to the bucket. w, err := f.bucket.NewWriter(ctx, req.InImage, nil) if err != nil { return "", err } _, err = io.Copy(w, file) if err != nil { _ = w.Close() // ignore error return "", err } if err := w.Close(); err != nil { return "", err } defer func() { // if we can't send the request, the image will never be processed. // Try to delete it. if err != nil { if err := f.bucket.Delete(ctx, req.InImage); err != nil { log.Printf("deleting orphan image %q: %v", req.InImage, err) } } }() // Publish the new order. bytes, err := json.Marshal(req) if err != nil { return "", err } if err := f.requestTopic.Send(ctx, &pubsub.Message{Body: bytes}); err != nil { return "", err } return id, nil } // listOrders lists all the orders in the database. func (f *frontend) listOrders(w http.ResponseWriter, r *http.Request) error { if r.Method != "GET" { http.Error(w, "bad method for listOrders: want GET", http.StatusBadRequest) return nil } ctx := r.Context() iter := f.coll.Query().Get(ctx) var orders []*Order for { var ord Order err := iter.Next(ctx, &ord) if err == io.EOF { break } if err != nil { return err } orders = append(orders, &ord) } return executeTemplate(listTemplate, orders, w) } func (f *frontend) showImage(w http.ResponseWriter, r *http.Request) error { objKey := strings.TrimPrefix(r.URL.Path, "/show/") reader, err := f.bucket.NewReader(r.Context(), objKey, nil) if err != nil { http.Error(w, fmt.Sprintf("file %q not found", objKey), http.StatusNotFound) return nil } defer reader.Close() if _, err := io.Copy(w, reader); err != nil { log.Printf("copy from %q failed: %v", objKey, err) } return nil } // newID creates a new unique ID for an incoming order. It uses the current // second, formatted in a readable way. The resulting IDs sort nicely and are // easy to read, but of course are not suitable for production because there // could be more than one request in a second and because the clock can be // reset to the past, resulting in duplicates. func (f *frontend) newID() string { return time.Now().Format("060102-150405") } // executeTemplate executes t into a buffer using data, and if that succeeds it // writes the bytes to w. func executeTemplate(t *template.Template, data any, w http.ResponseWriter) error { var buf bytes.Buffer if err := t.Execute(&buf, data); err != nil { return err } if _, err := buf.WriteTo(w); err != nil { log.Printf("write failed: %v", err) } return nil } ================================================ FILE: samples/order/frontend_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package main import ( "context" "fmt" "io" "net/http/httptest" "os" "strings" "testing" "time" "gocloud.dev/docstore" ) func TestOrderForm(t *testing.T) { f, _, cleanup, err := setup(testConfig("OrderForm")) if err != nil { t.Fatal(err) } defer cleanup() w := httptest.NewRecorder() r := httptest.NewRequest("GET", "/orders/new", nil) if err := f.orderForm(w, r); err != nil { t.Fatal(err) } res := w.Result() if res.StatusCode != 200 { t.Fatalf("got %d, want 200", res.StatusCode) } wantb, err := os.ReadFile("order-form.htmlt") if err != nil { t.Fatal(err) } gotb, err := io.ReadAll(res.Body) if err != nil { t.Fatal(err) } res.Body.Close() got := string(gotb) want := string(wantb) if got != want { t.Errorf("got %q, want %q", got, want) } } func TestCreateOrder(t *testing.T) { f, _, cleanup, err := setup(testConfig("CreateOrder")) if err != nil { t.Fatal(err) } defer cleanup() ctx := context.Background() file := strings.NewReader("an image") tm := time.Date(2019, 7, 1, 0, 0, 0, 0, time.Local) id, err := f.doCreateOrder(ctx, "pat@example.com", file, tm) if err != nil { t.Fatal(err) } r, err := f.bucket.NewReader(ctx, id+"-in", nil) if err != nil { t.Fatal(err) } defer r.Close() gotb, err := io.ReadAll(r) if err != nil { t.Fatal(err) } gots := string(gotb) wants := "an image" if gots != wants { t.Errorf("got %q, want %q", gots, wants) } } func TestListOrders(t *testing.T) { f, _, cleanup, err := setup(testConfig("ListOrders")) if err != nil { t.Fatal(err) } defer cleanup() ctx := context.Background() // Clear the collection. if err := clearCollection(ctx, f.coll); err != nil { t.Fatal(err) } orders := []*Order{ { ID: "a", Email: "pat@example.com", InImage: "a-in", OutImage: "a-out", CreateTime: time.Now().Add(-18 * time.Second), FinishTime: time.Now(), }, {ID: "b", Email: "mel@example.com", InImage: "b-in", CreateTime: time.Now()}, } actions := f.coll.Actions() for _, ord := range orders { actions.Put(ord) } if err := actions.Do(ctx); err != nil { t.Fatal(err) } w := httptest.NewRecorder() r := httptest.NewRequest("GET", "/orders", nil) if err := f.listOrders(w, r); err != nil { t.Fatal(err) } res := w.Result() if res.StatusCode != 200 { t.Fatalf("got %d, want 200", res.StatusCode) } gotb, err := io.ReadAll(res.Body) if err != nil { t.Fatal(err) } res.Body.Close() got := string(gotb) for _, ord := range orders { if !strings.Contains(got, ord.ID) { t.Errorf("got %q, should contain %q", got, ord.ID) } if !strings.Contains(got, ord.Email) { t.Errorf("got %q, should contain %q", got, ord.Email) } } url := `<a href="/show/a-out">a-out</a>` if !strings.Contains(got, url) { t.Errorf("got %q, should contain %q", got, url) } } func testConfig(name string) config { reqURL := "mem://requests-" + name return config{ requestTopicURL: reqURL, requestSubURL: reqURL, bucketURL: "", // setup will use fileblob with a temporary dir collectionURL: fmt.Sprintf("mem://orders-%s/ID", name), } } func clearCollection(ctx context.Context, coll *docstore.Collection) error { iter := coll.Query().Get(ctx, "ID") dels := coll.Actions() for { var order Order err := iter.Next(ctx, &order) if err == io.EOF { break } if err != nil { return err } dels.Delete(&order) } return dels.Do(ctx) } ================================================ FILE: samples/order/index.html ================================================ <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>Go CDK Image Conversion Sample</title> <link href="https://fonts.googleapis.com/css?family=Roboto:400,400i,700&display=swap" rel="stylesheet"> <link rel="stylesheet" type="text/css" href="/style.css"> </head> <body> <header id="PageHeader"> <a href="/" class="PageTitle-link"><h1 id="PageTitle">Go CDK Image Conversion Sample</h1></a> </header> <main id="PageContent"> <div class="FrontPageActions"> <button class="FrontPageActions-button" data-href="/orders/new">Convert an Image</button> <button class="FrontPageActions-button" data-href="/orders">List Conversions</button> </div> </main> <script type="text/javascript"> // If an element with the attribute "data-href" is clicked, then redirect // the browser to the value of the attribute instead of performing the // default behavior. document.addEventListener('click', function(e) { if (e.target.dataset.href) { window.location.href = e.target.dataset.href; return false; } }); </script> </body> </html> ================================================ FILE: samples/order/list.htmlt ================================================ <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>Orders - Go CDK Image Conversion Sample</title> <link href="https://fonts.googleapis.com/css?family=Roboto:400,400i,700&display=swap" rel="stylesheet"> <link rel="stylesheet" type="text/css" href="/style.css"> </head> <body> <header id="PageHeader"> <a href="/" class="PageTitle-link"><h1 id="PageTitle">Go CDK Image Conversion Sample</h1></a> </header> <main id="PageContent"> <h1>Orders</h1> {{if .}} <table id="OrderList"> <thead> <tr> <th scope="col" class="OrderList-heading">ID</th> <th scope="col" class="OrderList-heading">Email</th> <th scope="col" class="OrderList-heading">In</th> <th scope="col" class="OrderList-heading">Out</th> <th scope="col" class="OrderList-heading">Created</th> <th scope="col" class="OrderList-heading">Finished</th> <th scope="col" class="OrderList-heading">Note</th> </tr> </thead> <tbody> {{- range .}} <tr> <td class="OrderList-cell">{{.ID}}</td> <td class="OrderList-cell">{{.Email}}</td> <td class="OrderList-cell">{{.InImage}}</td> <td class="OrderList-cell">{{with .OutImage}}<a href="/show/{{.}}">{{.}}</a>{{end}}</td> <td class="OrderList-cell">{{with .CreateTime}}{{.Format "2006-01-02 03:04 AM"}}{{end}}</td> <td class="OrderList-cell">{{with .FinishTime}}{{.Format "2006-01-02 03:04 AM"}}{{end}}</td> <td class="OrderList-cell">{{.Note}}</td> </tr> {{- end}} </tbody> </table> {{else}} <p>No orders.</p> {{end}} </main> </body> </html> ================================================ FILE: samples/order/order-form.htmlt ================================================ <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>Create Order - Go CDK Image Conversion Sample</title> <link href="https://fonts.googleapis.com/css?family=Roboto:400,400i,700&display=swap" rel="stylesheet"> <link rel="stylesheet" type="text/css" href="/style.css"> </head> <body> <header id="PageHeader"> <a href="/" class="PageTitle-link"><h1 id="PageTitle">Go CDK Image Conversion Sample</h1></a> </header> <main id="PageContent"> <h1>Submit an Image</h1> <form id="OrderForm" action="/createOrder" method="post" enctype="multipart/form-data"> <label class="OrderForm-label" for="OrderForm-email"> Email: </label> <div class="OrderForm-widget"> <input type="email" name="email" id="OrderForm-email" class="OrderForm-input"> </div> <label class="OrderForm-label" for="OrderForm-file"> File: </label> <div class="OrderForm-widget"> <input type="file" name="file" id="OrderForm-file" class="OrderForm-input"> </div> <div class="OrderForm-actions"> <input type="submit" value="Submit" class="OrderForm-button"> </div> </form> </main> </body> </html> ================================================ FILE: samples/order/order.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // This application processes orders for converting images to PNG format. It // consists of two components: a frontend, which serves web pages that people // can use to place and view orders; and a processor, which performs the // conversions. This binary can run both together in one process (the default), // or it can run either on its own. Either way, the two components: // - communicate over a topic using the gocloud.dev/pubsub API; // - write orders to a database using the gocloud.dev/docstore API; // - and save image files to cloud storage using the gocloud.dev/blob API. // // This application assumes at-least-once processing. Make sure the pubsub // implementation you provide to it has that behavior. package main import ( "context" "flag" "log" "os" "path/filepath" "gocloud.dev/blob" "gocloud.dev/docstore" "gocloud.dev/pubsub" ) var ( requestTopicURL = flag.String("request-topic", "mem://requests", "gocloud.dev/pubsub URL for request topic") requestSubURL = flag.String("request-sub", "mem://requests", "gocloud.dev/pubsub URL for request subscription") bucketURL = flag.String("bucket", "", "gocloud.dev/blob URL for image bucket") collectionURL = flag.String("collection", "mem://orders/ID", "gocloud.dev/docstore URL for order collection") port = flag.Int("port", 10538, "HTTP port for frontend") runFrontend = flag.Bool("frontend", true, "run the frontend") runProcessor = flag.Bool("processor", true, "run the image processor") ) func main() { flag.Parse() conf := config{ requestTopicURL: *requestTopicURL, requestSubURL: *requestSubURL, bucketURL: *bucketURL, collectionURL: *collectionURL, } frontend, processor, cleanup, err := setup(conf) if err != nil { log.Fatal(err) } defer cleanup() // Run the frontend, or the processor, or both. // When we want to run both, one of them has to run in a goroutine. // So it's simpler to run both in goroutines, even if we only need // to run one. errc := make(chan error, 2) if *runFrontend { go func() { errc <- frontend.run(context.Background(), *port) }() log.Printf("listening on port %d", *port) } else { errc <- nil } if *runProcessor { go func() { errc <- processor.run(context.Background()) }() log.Println("processing") } else { errc <- nil } // Each of the goroutines will send once to errc, so receive two values. for i := 0; i < 2; i++ { if err := <-errc; err != nil { log.Fatal(err) } } } // config describes the URLs for the resources used by the order application. type config struct { requestTopicURL string requestSubURL string bucketURL string collectionURL string } // setup opens all the necessary resources for the application. func setup(conf config) (_ *frontend, _ *processor, cleanup func(), err error) { addCleanup := func(f func()) { old := cleanup cleanup = func() { old(); f() } } defer func() { if err != nil { cleanup() cleanup = nil } }() ctx := context.Background() cleanup = func() {} reqTopic, err := pubsub.OpenTopic(ctx, conf.requestTopicURL) if err != nil { return nil, nil, cleanup, err } addCleanup(func() { reqTopic.Shutdown(ctx) }) reqSub, err := pubsub.OpenSubscription(ctx, conf.requestSubURL) if err != nil { return nil, nil, cleanup, err } addCleanup(func() { reqSub.Shutdown(ctx) }) burl := conf.bucketURL if burl == "" { dir, err := os.MkdirTemp("", "gocdk-order") if err != nil { return nil, nil, cleanup, err } if os.PathSeparator == '\\' { burl = "file:///" + filepath.ToSlash(dir) } else { burl = "file://" + dir } addCleanup(func() { os.Remove(dir) }) } bucket, err := blob.OpenBucket(ctx, burl) if err != nil { return nil, nil, cleanup, err } addCleanup(func() { bucket.Close() }) coll, err := docstore.OpenCollection(ctx, conf.collectionURL) if err != nil { return nil, nil, cleanup, err } addCleanup(func() { coll.Close() }) f := &frontend{ requestTopic: reqTopic, bucket: bucket, coll: coll, } p := &processor{ requestSub: reqSub, bucket: bucket, coll: coll, } return f, p, cleanup, nil } ================================================ FILE: samples/order/processor.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // A processor processes images in orders. It receives requests by // subscribing to the requests topic, and writes responses to the response // topic. // // At present, it just encodes input images into PNG format. package main import ( "context" "encoding/json" "fmt" "image" _ "image/jpeg" "image/png" "log" "math/rand" "strings" "time" "gocloud.dev/blob" _ "gocloud.dev/blob/fileblob" "gocloud.dev/docstore" _ "gocloud.dev/docstore/memdocstore" "gocloud.dev/gcerrors" "gocloud.dev/pubsub" _ "gocloud.dev/pubsub/mempubsub" ) // A processor holds the state for processing images. type processor struct { requestSub *pubsub.Subscription bucket *blob.Bucket coll *docstore.Collection } // run handles requests until the context is done or there is a fatal error. func (p *processor) run(ctx context.Context) error { for { if err := p.handleRequest(ctx); err != nil { return err } } } // handleRequest handles one image-processing request. // A non-nil error from handleRequest will end request processing. func (p *processor) handleRequest(ctx context.Context) error { msg, err := p.requestSub.Receive(ctx) if err != nil { // If we can't receive messages, we should stop processing. return err } var req OrderRequest if err := json.Unmarshal(msg.Body, &req); err != nil { // We can't unmarshal the message body. That could be due to a bug or // change in the frontend, or maybe some other program is sending // malformed messages. // Ack the message, because if we can't unmarshal it then no one else can either. msg.Ack() // Don't terminate processing; maybe this is just one bad message. log.Printf("unmarshaling request: %v", err) return nil } log.Printf("received %+v", req) order, err := createOrFindOrder(ctx, p.coll, &req) if err != nil { // There was a problem with the database, perhaps due to the network. // Nack the message; perhaps another processor can succeed. if msg.Nackable() { msg.Nack() } // Assume the database error is permanent: terminate processing. return err } if order == nil { log.Printf("duplicate finished order %v", req.ID) // We've already processed this order, so ack the message. msg.Ack() return nil } // At this point, order is an unfinished order in the database. // Process it. err = p.processOrder(ctx, order) // Any processing errors are saved as notes in the order. if err != nil { order.Note = fmt.Sprintf("processing failed: %v", err) order.OutImage = "" } // Save the finished order to the database. err = p.coll.Update(ctx, order, docstore.Mods{ "OutImage": order.OutImage, "Note": order.Note, "FinishTime": time.Now(), }) if err != nil { // We couldn't save the order to the database. // Nack the message; perhaps another processor can succeed. if msg.Nackable() { msg.Nack() } // Assume the database error is permanent: terminate processing. return err } // We've successfully processed the image. msg.Ack() return nil } // createOrFindOrder either creates a new order from req (the usual case), or returns an // existing unfinished order. It returns a nil *Order if the order exists and is // finished, that is, this request message is a duplicate. // createOrFindOrder returns a non-nil error only for database problems. func createOrFindOrder(ctx context.Context, coll *docstore.Collection, req *OrderRequest) (*Order, error) { // See if there is already a document for this order. order := &Order{ID: req.ID} err := coll.Get(ctx, order) if err != nil { if gcerrors.Code(err) != gcerrors.NotFound { return nil, err } // Normal case: the order wasn't found, because it hasn't been created // yet. Create it. order = &Order{ ID: req.ID, Email: req.Email, InImage: req.InImage, CreateTime: req.CreateTime, } if err := coll.Create(ctx, order); err != nil { return nil, err } return order, nil } if order.FinishTime.IsZero() { // The order exists, but was not finished. Either it was abandoned by the processor that // was working on it (probably because the processor died), or it is in progress. Assume // that it was abandoned, and process it. return order, nil } // The order exists and was finished. This is most likely the result of a pubsub redelivery. // We simply ignore it. return nil, nil } // processOrder processes the order request. func (p *processor) processOrder(ctx context.Context, order *Order) error { // Read the input image from the bucket. r, err := p.bucket.NewReader(ctx, order.InImage, nil) if err != nil { return err } defer r.Close() img, format, err := image.Decode(r) if err != nil { return err } // Process and write the output image. order.OutImage = fmt.Sprintf("%s-out.png", strings.TrimSuffix(order.InImage, "-in")) w, err := p.bucket.NewWriter(ctx, order.OutImage, nil) if err != nil { return err } if err := png.Encode(w, img); err != nil { w.Close() return err } if err := w.Close(); err != nil { return err } // Pretend that the conversion takes some time. time.Sleep(time.Duration(rand.Intn(5)+2) * time.Second) order.Note = fmt.Sprintf("converted from %s to png", format) return nil } ================================================ FILE: samples/order/processor_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package main import ( "context" "encoding/json" "io" "os" "path/filepath" "testing" "github.com/google/go-cmp/cmp" "gocloud.dev/blob" "gocloud.dev/pubsub" _ "gocloud.dev/pubsub/mempubsub" ) func TestHandleRequest(t *testing.T) { f, p, cleanup, err := setup(testConfig("ProcessorRun")) if err != nil { t.Fatal(err) } defer cleanup() ctx := context.Background() req := &OrderRequest{ID: "x"} bytes, err := json.Marshal(req) if err != nil { t.Fatal(err) } if err := f.requestTopic.Send(ctx, &pubsub.Message{Body: bytes}); err != nil { t.Fatal(err) } if err := p.handleRequest(ctx); err != nil { t.Fatal(err) } // Just verify that there is an order "x" in the collection. order := &Order{ID: "x"} if err := p.coll.Get(ctx, order); err != nil { t.Fatal(err) } } func TestProcessOrder(t *testing.T) { _, p, cleanup, err := setup(testConfig("ProcessOrder")) if err != nil { t.Fatal(err) } defer cleanup() ctx := context.Background() for _, test := range []struct { filename string want *Order wantErr bool }{ { "cat1", &Order{ ID: "cat1", Email: "joe@example.com", InImage: "cat1", OutImage: "cat1-out.png", Note: "converted from jpeg to png", }, false, }, { "bad-image", nil, true, }, } { if err := copyFileToBucket("testdata/"+test.filename, p.bucket); err != nil { t.Fatal(err) } got := &Order{ ID: test.filename, Email: "joe@example.com", InImage: test.filename, } err := p.processOrder(ctx, got) if err == nil && test.wantErr { t.Errorf("%s: got nil, want error", test.filename) } else if err != nil && !test.wantErr { t.Errorf("%s: got error %v, want nil", test.filename, err) } else if err == nil && !cmp.Equal(got, test.want) { t.Errorf("%s:\ngot %+v\nwant %+v", test.filename, got, test.want) } } } func copyFileToBucket(filename string, bucket *blob.Bucket) (err error) { f, err := os.Open(filename) if err != nil { return err } defer f.Close() w, err := bucket.NewWriter(context.Background(), filepath.Base(filename), nil) if err != nil { return err } defer func() { err2 := w.Close() if err == nil { err = err2 } }() _, err = io.Copy(w, f) return err } ================================================ FILE: samples/order/style.css ================================================ /* Copyright 2019 The Go Cloud Development Kit Authors Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ html { font: 20px/1.2 'Roboto', sans-serif; margin: 0; padding: 0; } body { background: #555759; color: #000; margin: 0; padding: 0; } #PageHeader { background: #00add8; margin: 0; padding: 0; } @media (max-width: 1024px) { /* Don't use a backdrop effect on smaller screen. */ body { background: white; } } #PageHeader { padding: 1rem; } #PageTitle { color: white; font-size: 2.5rem; margin: 0 2rem; padding: 0; } .PageTitle-link { text-decoration: none; } #PageContent { background: white; border-radius: 3px; box-sizing: border-box; margin: 1rem auto; min-height: 10rem; max-width: 50rem; padding: 0.5rem 2rem 1rem; } @media (max-width: 1024px) { /* Don't use a backdrop effect on smaller screen. */ #PageContent { background: none; border-radius: 0; margin: 0 auto 1rem; } } .FrontPageActions { margin-top: 2rem; text-align: center; vertical-align: middle; } .FrontPageActions-button { font: 1.5rem 'Roboto', sans-serif; padding: 0.3rem; width: 15rem; } input { font: 20px/1.2 'Roboto', sans-serif; } #OrderForm { width: 50%; } .OrderForm-label { display: block; font-weight: bold; margin: 0 0 0.2rem; } .OrderForm-widget { margin: 0 0 0.5rem; width: 100%; } .OrderForm-input { margin: 0; width: 100%; } .OrderForm-actions { margin: 1rem 0; text-align: right; } .OrderForm-button { padding: 0.25rem 1rem; } #OrderList { border-collapse: collapse; } .OrderList-heading { padding: 0.25rem 0.5rem; } .OrderList-cell { border-bottom: 1px solid black; border-top: 1px solid black; padding: 0.25rem 0.5rem; } ================================================ FILE: samples/order/testdata/bad-image ================================================ This is not an image. ================================================ FILE: samples/server/main.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Command server runs a simple HTTP server with integrated Cloud Trace (OpenTelemetry) // and health checks. package main import ( "context" "errors" "flag" "fmt" "go.opentelemetry.io/otel" "log" "net/http" "sync" "time" "gocloud.dev/gcp" "gocloud.dev/server" "gocloud.dev/server/health" "gocloud.dev/server/sdserver" ) // GlobalMonitoredResource implements monitoredresource.Interface to provide a // basic global resource based on the project ID. If you're running this sample // on GCE or EC2, you may prefer to use monitoredresource.Autodetect() instead. type GlobalMonitoredResource struct { projectID string } // MonitoredResource returned the monitored resource. func (g GlobalMonitoredResource) MonitoredResource() (string, map[string]string) { return "global", map[string]string{"project_id": g.projectID} } func helloHandler(w http.ResponseWriter, req *http.Request) { fmt.Fprintf(w, "Hello\n") } func mainHandler(w http.ResponseWriter, req *http.Request) { fmt.Fprintf(w, "Welcome to the home page!\n") } // customHealthCheck is an example health check. It implements the // health.Checker interface and reports the server is healthy when the healthy // field is set to true. type customHealthCheck struct { mu sync.RWMutex healthy bool } func (h *customHealthCheck) CheckHealth() error { h.mu.RLock() defer h.mu.RUnlock() if !h.healthy { return errors.New("not ready yet") } return nil } func main() { addr := flag.String("listen", ":8080", "HTTP port to listen on") doTrace := flag.Bool("trace", true, "Export traces to Stackdriver") flag.Parse() ctx := context.Background() credentials, err := gcp.DefaultCredentials(ctx) if err != nil { log.Fatal(err) } projectID, err := gcp.DefaultProjectID(credentials) if err != nil { log.Fatal(err) } if *doTrace { fmt.Println("Exporting traces to Stackdriver") traceSampler := sdserver.NewTraceSampler(ctx) spanExporter, err0 := sdserver.NewTraceExporter(projectID) if err0 != nil { log.Fatal(err0) } tp, cleanup, err0 := sdserver.NewTraceProvider(ctx, spanExporter, traceSampler) if err0 != nil { log.Fatal(err0) } defer cleanup() otel.SetTracerProvider(tp) metricsReader, err0 := sdserver.NewMetricsReader(projectID) if err0 != nil { log.Fatal(err0) } mp, cleanup2, err0 := sdserver.NewMeterProvider(ctx, metricsReader) if err0 != nil { log.Fatal(err0) } defer cleanup2() otel.SetMeterProvider(mp) } mux := http.NewServeMux() mux.HandleFunc("/hello", helloHandler) mux.HandleFunc("/", mainHandler) // healthCheck will report the server is unhealthy for 10 seconds after // startup, and as healthy henceforth. Check the /healthz/readiness // HTTP path to see readiness. healthCheck := new(customHealthCheck) time.AfterFunc(10*time.Second, func() { healthCheck.mu.Lock() defer healthCheck.mu.Unlock() healthCheck.healthy = true }) options := &server.Options{ RequestLogger: sdserver.NewRequestLogger(), HealthChecks: []health.Checker{healthCheck}, Driver: &server.DefaultDriver{}, } s := server.New(mux, options) fmt.Printf("Listening on %s\n", *addr) err = s.ListenAndServe(*addr) if err != nil { log.Fatal(err) } } ================================================ FILE: samples/tutorial/README.md ================================================ # Getting Started With The Go Cloud Development Kit This is the source directory for the [command-line uploader tutorial][]. [command-line uploader tutorial]: https://gocloud.dev/tutorials/cli-uploader/ ================================================ FILE: samples/tutorial/main.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Command upload saves files to blob storage on GCP, AWS, and Azure. package main import ( "context" "log" "os" "gocloud.dev/blob" // Import the blob packages we want to be able to open. _ "gocloud.dev/blob/azureblob" _ "gocloud.dev/blob/gcsblob" _ "gocloud.dev/blob/s3blob" ) func main() { // Define our input. if len(os.Args) != 3 { log.Fatal("usage: upload BUCKET_URL FILE") } bucketURL := os.Args[1] file := os.Args[2] ctx := context.Background() // Open a connection to the bucket. b, err := blob.OpenBucket(ctx, bucketURL) if err != nil { log.Fatalf("Failed to setup bucket: %s", err) } defer b.Close() // Prepare the file for upload. data, err := os.ReadFile(file) if err != nil { log.Fatalf("Failed to read file: %s", err) } w, err := b.NewWriter(ctx, file, nil) if err != nil { log.Fatalf("Failed to obtain writer: %s", err) } _, err = w.Write(data) if err != nil { log.Fatalf("Failed to write to bucket: %s", err) } if err = w.Close(); err != nil { log.Fatalf("Failed to close: %s", err) } } ================================================ FILE: samples/wire/README.md ================================================ # Wire Tutorial has moved The Wire Tutorial has moved to [the Wire repository](https://github.com/google/wire/tree/master/_tutorial). ================================================ FILE: secrets/awskms/example_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package awskms_test import ( "context" "log" "github.com/aws/aws-sdk-go-v2/config" "gocloud.dev/secrets" "gocloud.dev/secrets/awskms" ) func ExampleOpenKeeper() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // Establish a AWS V2 Config. // See https://aws.github.io/aws-sdk-go-v2/docs/configuring-sdk/ for more info. ctx := context.Background() cfg, err := config.LoadDefaultConfig(ctx) if err != nil { log.Fatal(err) } // Get a client to use with the KMS API. client, err := awskms.Dial(cfg) if err != nil { log.Fatal(err) } // Construct a *secrets.Keeper. keeper := awskms.OpenKeeper(client, "alias/test-secrets", nil) defer keeper.Close() } func Example_openFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/secrets/awskms" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // Use one of the following: // 1. By ID. keeperByID, err := secrets.OpenKeeper(ctx, "awskms://1234abcd-12ab-34cd-56ef-1234567890ab?region=us-east-1") if err != nil { log.Fatal(err) } defer keeperByID.Close() // 2. By alias. keeperByAlias, err := secrets.OpenKeeper(ctx, "awskms://alias/ExampleAlias?region=us-east-1") if err != nil { log.Fatal(err) } defer keeperByAlias.Close() // 3. By ARN. Note that ARN may contain ":" characters, which cannot be escaped // in the Host part of a URL, so the "awskms:///<ARN>" form should be used. const arn = "arn:aws:kms:us-east-1:111122223333:key/" + "1234abcd-12ab-34bc-56ef-1234567890ab" keeperByARN, err := secrets.OpenKeeper(ctx, "awskms:///"+arn+"?region=us-east-1") if err != nil { log.Fatal(err) } defer keeperByARN.Close() } ================================================ FILE: secrets/awskms/kms.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package awskms provides a secrets implementation backed by AWS KMS. // Use OpenKeeper to construct a *secrets.Keeper. // // # URLs // // For secrets.OpenKeeper, awskms registers for the scheme "awskms". // The default URL opener will use an AWS session with the default credentials // and configuration. // // To customize the URL opener, or for more details on the URL format, // see URLOpener. // See https://gocloud.dev/concepts/urls/ for background information. // // # As // // awskms exposes the following type for As: // - Error: any error type returned by the service, notably smithy.APIError package awskms // import "gocloud.dev/secrets/awskms" import ( "context" "errors" "fmt" "net/url" "path" "strings" "sync" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/kms" "github.com/aws/aws-sdk-go-v2/service/kms/types" "github.com/aws/smithy-go" "github.com/google/wire" gcaws "gocloud.dev/aws" "gocloud.dev/gcerrors" "gocloud.dev/internal/gcerr" "gocloud.dev/secrets" ) func init() { secrets.DefaultURLMux().RegisterKeeper(Scheme, new(lazySessionOpener)) } // Set holds Wire providers for this package. var Set = wire.NewSet( Dial, ) // Dial gets an AWS KMS service client using the AWS SDK V2. func Dial(cfg aws.Config) (*kms.Client, error) { return kms.NewFromConfig(cfg), nil } var DialV2 = Dial // lazySessionOpener obtains the AWS session from the environment on the first // call to OpenKeeperURL. type lazySessionOpener struct { init sync.Once opener *URLOpener err error } func (o *lazySessionOpener) OpenKeeperURL(ctx context.Context, u *url.URL) (*secrets.Keeper, error) { opener := &URLOpener{} return opener.OpenKeeperURL(ctx, u) } // Scheme is the URL scheme awskms registers its URLOpener under on secrets.DefaultMux. const Scheme = "awskms" // URLOpener opens AWS KMS URLs like "awskms://keyID" or "awskms:///keyID". // // The URL Host + Path are used as the key ID, which can be in the form of an // Amazon Resource Name (ARN), alias name, or alias ARN. See // https://docs.aws.amazon.com/kms/latest/developerguide/viewing-keys.html#find-cmk-id-arn // for more details. Note that ARNs may contain ":" characters, which cannot be // escaped in the Host part of a URL, so the "awskms:///<ARN>" form should be used. // // See https://pkg.go.dev/gocloud.dev/aws#V2ConfigFromURLParams. // // EncryptionContext key/value pairs can be provided by providing URL parameters prefixed // with "context_"; e.g., "...&context_abc=foo&context_def=bar" would result in // an EncryptionContext of {abc=foo, def=bar}. // See https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context. type URLOpener struct { // Options specifies the options to pass to OpenKeeper. // EncryptionContext parameters from the URL are merged in. Options KeeperOptions } // addEncryptionContextFromURLParams merges any EncryptionContext URL parameters from // u into opts.EncryptionParameters. // It removes the processed URL parameters from u. func addEncryptionContextFromURLParams(opts *KeeperOptions, u url.Values) error { for k, vs := range u { if strings.HasPrefix(k, "context_") { if len(vs) != 1 { return fmt.Errorf("open keeper: EncryptionContext URL parameters %q must have exactly 1 value", k) } u.Del(k) if opts.EncryptionContext == nil { opts.EncryptionContext = map[string]string{} } opts.EncryptionContext[k[8:]] = vs[0] } } return nil } // OpenKeeperURL opens an AWS KMS Keeper based on u. func (o *URLOpener) OpenKeeperURL(ctx context.Context, u *url.URL) (*secrets.Keeper, error) { // A leading "/" means the Host was empty; trim the slash. // This is so that awskms:///foo:bar results in "foo:bar" instead of // "/foo:bar". keyID := strings.TrimPrefix(path.Join(u.Host, u.Path), "/") queryParams := u.Query() opts := o.Options if err := addEncryptionContextFromURLParams(&opts, queryParams); err != nil { return nil, err } cfg, err := gcaws.V2ConfigFromURLParams(ctx, queryParams) if err != nil { return nil, fmt.Errorf("open keeper %v: %v", u, err) } client, err := Dial(cfg) if err != nil { return nil, err } return OpenKeeper(client, keyID, &opts), nil } // OpenKeeper returns a *secrets.Keeper that uses AWS KMS, using SDK v2. // The key ID can be in the form of an Amazon Resource Name (ARN), alias // name, or alias ARN. See // https://docs.aws.amazon.com/kms/latest/developerguide/viewing-keys.html#find-cmk-id-arn // for more details. // See the package documentation for an example. func OpenKeeper(client *kms.Client, keyID string, opts *KeeperOptions) *secrets.Keeper { if opts == nil { opts = &KeeperOptions{} } return secrets.NewKeeper(&keeper{ keyID: keyID, client: client, opts: *opts, }) } var OpenKeeperV2 = OpenKeeper type keeper struct { keyID string opts KeeperOptions client *kms.Client } // Decrypt decrypts the ciphertext into a plaintext. func (k *keeper) Decrypt(ctx context.Context, ciphertext []byte) ([]byte, error) { result, err := k.client.Decrypt(ctx, &kms.DecryptInput{ CiphertextBlob: ciphertext, EncryptionContext: k.opts.EncryptionContext, }) if err != nil { return nil, err } return result.Plaintext, nil } // Encrypt encrypts the plaintext into a ciphertext. func (k *keeper) Encrypt(ctx context.Context, plaintext []byte) ([]byte, error) { result, err := k.client.Encrypt(ctx, &kms.EncryptInput{ KeyId: aws.String(k.keyID), Plaintext: plaintext, EncryptionContext: k.opts.EncryptionContext, }) if err != nil { return nil, err } return result.CiphertextBlob, nil } // Close implements driver.Keeper.Close. func (k *keeper) Close() error { return nil } // ErrorAs implements driver.Keeper.ErrorAs. func (k *keeper) ErrorAs(err error, i any) bool { return errors.As(err, i) } // ErrorCode implements driver.ErrorCode. func (k *keeper) ErrorCode(err error) gcerrors.ErrorCode { var ae smithy.APIError if !errors.As(err, &ae) { return gcerr.Unknown } code := ae.ErrorCode() ec, ok := errorCodeMap[code] if !ok { return gcerr.Unknown } return ec } var errorCodeMap = map[string]gcerrors.ErrorCode{ (&types.NotFoundException{}).ErrorCode(): gcerrors.NotFound, (&types.InvalidCiphertextException{}).ErrorCode(): gcerrors.InvalidArgument, (&types.InvalidKeyUsageException{}).ErrorCode(): gcerrors.InvalidArgument, (&types.KMSInternalException{}).ErrorCode(): gcerrors.Internal, (&types.KMSInvalidStateException{}).ErrorCode(): gcerrors.FailedPrecondition, (&types.DisabledException{}).ErrorCode(): gcerrors.PermissionDenied, (&types.InvalidGrantTokenException{}).ErrorCode(): gcerrors.PermissionDenied, (&types.KeyUnavailableException{}).ErrorCode(): gcerrors.ResourceExhausted, (&types.DependencyTimeoutException{}).ErrorCode(): gcerrors.DeadlineExceeded, } // KeeperOptions controls Keeper behaviors. // It is provided for future extensibility. type KeeperOptions struct { // EncryptionContext parameters. // See https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context. EncryptionContext map[string]string } ================================================ FILE: secrets/awskms/kms_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package awskms import ( "context" "errors" "fmt" "net/url" "testing" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/kms" "github.com/aws/aws-sdk-go-v2/service/kms/types" "github.com/aws/smithy-go" "github.com/google/go-cmp/cmp" "gocloud.dev/internal/testing/setup" "gocloud.dev/secrets" "gocloud.dev/secrets/driver" "gocloud.dev/secrets/drivertest" ) const ( keyID1 = "alias/test-secrets" keyID2 = "alias/test-secrets2" region = "us-east-2" ) type harness struct { client *kms.Client close func() } func (h *harness) MakeDriver(ctx context.Context) (driver.Keeper, driver.Keeper, error) { return &keeper{keyID: keyID1, client: h.client}, &keeper{keyID: keyID2, client: h.client}, nil } func (h *harness) Close() { h.close() } // Lists all existing aliases in the account, to see if we need to create one. func listExistingAliases(ctx context.Context, client *kms.Client) (map[string]bool, error) { existing := map[string]bool{} var nextMarker *string for { resp, err := client.ListAliases(ctx, &kms.ListAliasesInput{Marker: nextMarker}) if err != nil { return nil, fmt.Errorf("failed to list aliases: %w", err) } for _, alias := range resp.Aliases { existing[*alias.AliasName] = true } if !resp.Truncated { break } nextMarker = resp.NextMarker } return existing, nil } func createKey(ctx context.Context, client *kms.Client, keyID string) error { createKeyResult, err := client.CreateKey(ctx, &kms.CreateKeyInput{}) if err != nil { return fmt.Errorf("failed to create key %q: %w", keyID, err) } if _, err := client.CreateAlias(ctx, &kms.CreateAliasInput{ AliasName: aws.String(keyID), TargetKeyId: createKeyResult.KeyMetadata.KeyId, }); err != nil { return fmt.Errorf("failed to create alias for key %q: %w", keyID, err) } return nil } func newHarness(ctx context.Context, t *testing.T) (drivertest.Harness, error) { t.Helper() cfg, _, done, _ := setup.NewAWSv2Config(ctx, t, region, false) client := kms.NewFromConfig(cfg) // Create the keys we need if they don't exist. existing, err := listExistingAliases(ctx, client) if err != nil { return nil, err } if !existing[keyID1] { if err := createKey(ctx, client, keyID1); err != nil { return nil, err } } if !existing[keyID2] { if err := createKey(ctx, client, keyID2); err != nil { return nil, err } } return &harness{ client: client, close: done, }, nil } func TestConformance(t *testing.T) { drivertest.RunConformanceTests(t, newHarness, []drivertest.AsTest{verifyAs{}}) } type verifyAs struct { } func (v verifyAs) Name() string { return "verify As function" } func (v verifyAs) ErrorCheck(k *secrets.Keeper, err error) error { var e smithy.APIError if !k.ErrorAs(err, &e) { return errors.New("Keeper.ErrorAs failed") } code := e.ErrorCode() want := (&types.InvalidCiphertextException{}).ErrorCode() if code != want { return fmt.Errorf("got %q, want %q", code, want) } return nil } // KMS-specific tests. func TestEncryptionContext(t *testing.T) { tests := []struct { Existing map[string]string URL string WantErr bool Want map[string]string }{ // None before or after. {nil, "http://foo", false, nil}, // New parameter. {nil, "http://foo?context_foo=bar", false, map[string]string{"foo": "bar"}}, // 2 new parameters. {nil, "http://foo?context_foo=bar&context_abc=baz", false, map[string]string{"foo": "bar", "abc": "baz"}}, // Multiple values. {nil, "http://foo?context_foo=bar&context_foo=baz", true, nil}, // Existing, no new. {map[string]string{"foo": "bar"}, "http://foo", false, map[string]string{"foo": "bar"}}, // No-conflict merge. {map[string]string{"foo": "bar"}, "http://foo?context_abc=baz", false, map[string]string{"foo": "bar", "abc": "baz"}}, // Overwrite merge. {map[string]string{"foo": "bar"}, "http://foo?context_foo=baz", false, map[string]string{"foo": "baz"}}, } for _, test := range tests { t.Run(fmt.Sprintf("existing %v URL %v", test.Existing, test.URL), func(t *testing.T) { opts := KeeperOptions{ EncryptionContext: test.Existing, } u, err := url.Parse(test.URL) if err != nil { t.Fatal(err) } err = addEncryptionContextFromURLParams(&opts, u.Query()) if (err != nil) != test.WantErr { t.Fatalf("got err %v, want error? %v", err, test.WantErr) } if diff := cmp.Diff(opts.EncryptionContext, test.Want); diff != "" { t.Errorf("diff %v", diff) } }) } } func TestOpenKeeper(t *testing.T) { tests := []struct { URL string WantErr bool }{ // OK, by alias. {"awskms://alias/my-key", false}, // OK, by ARN with empty Host. {"awskms:///arn:aws:kms:us-east-1:932528106278:alias/gocloud-test", false}, // OK, by ARN with empty Host. {"awskms:///arn:aws:kms:us-east-1:932528106278:key/8be0dcc5-da0a-4164-a99f-649015e344b5", false}, // OK, overriding region. {"awskms://alias/my-key?region=us-west1", false}, // OK, adding EncryptionContext. {"awskms://alias/my-key?context_abc=foo&context_def=bar", false}, // Multiple values for an EncryptionContext. {"awskms://alias/my-key?context_abc=foo&context_abc=bar", true}, // Unknown parameter. {"awskms://alias/my-key?param=value", true}, } ctx := context.Background() for _, test := range tests { keeper, err := secrets.OpenKeeper(ctx, test.URL) if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } if err == nil { if err = keeper.Close(); err != nil { t.Errorf("%s: got error during close: %v", test.URL, err) } } } } ================================================ FILE: secrets/awskms/testdata/TestConformance/TestAs/verify_As_function.replay ================================================ { "Initial": "AQAAAA7hTg3CEUql4AAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "09787f3b438ecca3", "Request": { "Method": "POST", "URL": "https://kms.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "2" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "TrentService.ListAliases" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "e30=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, must-revalidate, private" ], "Content-Length": [ "2035" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:14 GMT" ], "Expires": [ "0" ], "Pragma": [ "no-cache" ], "X-Amzn-Requestid": [ "e9a2bbb2-c971-4caa-bdd5-b9316350c573" ] }, "Body": "eyJBbGlhc0NvdW50IjoxNSwiQWxpYXNlcyI6W3siQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9keW5hbW9kYiIsIkFsaWFzTmFtZSI6ImFsaWFzL2F3cy9keW5hbW9kYiJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9lYnMiLCJBbGlhc05hbWUiOiJhbGlhcy9hd3MvZWJzIiwiQ3JlYXRpb25EYXRlIjoxLjU5MjQxMjAxODUyMUU5LCJMYXN0VXBkYXRlZERhdGUiOjEuNTkyNDEyMDE4NTIxRTksIlRhcmdldEtleUlkIjoiZmI0NTdlOGUtNTQ2ZS00MDMzLWE1YWEtZThhZWRkYzlkODUxIn0seyJBbGlhc0FybiI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6YWxpYXMvYXdzL2VsYXN0aWNmaWxlc3lzdGVtIiwiQWxpYXNOYW1lIjoiYWxpYXMvYXdzL2VsYXN0aWNmaWxlc3lzdGVtIn0seyJBbGlhc0FybiI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6YWxpYXMvYXdzL2VzIiwiQWxpYXNOYW1lIjoiYWxpYXMvYXdzL2VzIn0seyJBbGlhc0FybiI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6YWxpYXMvYXdzL2dsdWUiLCJBbGlhc05hbWUiOiJhbGlhcy9hd3MvZ2x1ZSJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9raW5lc2lzdmlkZW8iLCJBbGlhc05hbWUiOiJhbGlhcy9hd3Mva2luZXNpc3ZpZGVvIn0seyJBbGlhc0FybiI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6YWxpYXMvYXdzL3JkcyIsIkFsaWFzTmFtZSI6ImFsaWFzL2F3cy9yZHMifSx7IkFsaWFzQXJuIjoiYXJuOmF3czprbXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjphbGlhcy9hd3MvcmVkc2hpZnQiLCJBbGlhc05hbWUiOiJhbGlhcy9hd3MvcmVkc2hpZnQifSx7IkFsaWFzQXJuIjoiYXJuOmF3czprbXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjphbGlhcy9hd3MvcmVkc2hpZnR0ZXN0IiwiQWxpYXNOYW1lIjoiYWxpYXMvYXdzL3JlZHNoaWZ0dGVzdCJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9zMyIsIkFsaWFzTmFtZSI6ImFsaWFzL2F3cy9zMyJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9zZWNyZXRzbWFuYWdlciIsIkFsaWFzTmFtZSI6ImFsaWFzL2F3cy9zZWNyZXRzbWFuYWdlciIsIkNyZWF0aW9uRGF0ZSI6MS43NDM0NTM4NDE2NjhFOSwiTGFzdFVwZGF0ZWREYXRlIjoxLjc0MzQ1Mzg0MTY2OEU5LCJUYXJnZXRLZXlJZCI6ImY1NDQwMjcyLWEyYzktNGU3Ny05N2Y4LTdjYjE4NzA2NmViZCJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9zc20iLCJBbGlhc05hbWUiOiJhbGlhcy9hd3Mvc3NtIn0seyJBbGlhc0FybiI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6YWxpYXMvYXdzL3hyYXkiLCJBbGlhc05hbWUiOiJhbGlhcy9hd3MveHJheSJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL3Rlc3Qtc2VjcmV0cyIsIkFsaWFzTmFtZSI6ImFsaWFzL3Rlc3Qtc2VjcmV0cyIsIkNyZWF0aW9uRGF0ZSI6MS43NTI4NzgxMjgwMzZFOSwiTGFzdFVwZGF0ZWREYXRlIjoxLjc1Mjg3ODEyODAzNkU5LCJUYXJnZXRLZXlJZCI6IjgxOThmNTM2LTI2YjEtNDU3MS1hNDE1LTAxYzA0NTBlNmMxNCJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL3Rlc3Qtc2VjcmV0czIiLCJBbGlhc05hbWUiOiJhbGlhcy90ZXN0LXNlY3JldHMyIiwiQ3JlYXRpb25EYXRlIjoxLjc1Mjg3OTE3Nzc0NkU5LCJMYXN0VXBkYXRlZERhdGUiOjEuNzUyODc5MTc3NzQ2RTksIlRhcmdldEtleUlkIjoiN2VkM2VkOTgtMDM2MS00ZWQyLWExN2EtOTE1YjBlZjJlOWJmIn1dLCJUcnVuY2F0ZWQiOmZhbHNlfQ==" } }, { "ID": "2178d2eeff7ae3f2", "Request": { "Method": "POST", "URL": "https://kms.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "TrentService.Decrypt" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDaXBoZXJ0ZXh0QmxvYiI6ImJXRnNabTl5YldWa0lHTnBjR2hsY2lCdFpYTnpZV2RsIn0=" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, must-revalidate, private" ], "Content-Length": [ "39" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:14 GMT" ], "Expires": [ "0" ], "Pragma": [ "no-cache" ], "X-Amzn-Requestid": [ "118fa7c1-ac93-410f-8b8c-3b63af6ef80a" ] }, "Body": "eyJfX3R5cGUiOiJJbnZhbGlkQ2lwaGVydGV4dEV4Y2VwdGlvbiJ9" } } ] } ================================================ FILE: secrets/awskms/testdata/TestConformance/TestAs/verify_As_returns_false_when_passed_nil.replay ================================================ { "Initial": "AQAAAA7hTg3CIgeupQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "23360283b1e010aa", "Request": { "Method": "POST", "URL": "https://kms.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "2" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "TrentService.ListAliases" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "e30=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, must-revalidate, private" ], "Content-Length": [ "2035" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:14 GMT" ], "Expires": [ "0" ], "Pragma": [ "no-cache" ], "X-Amzn-Requestid": [ "f2d29d09-2c10-4b93-b733-bf5e6fb81bba" ] }, "Body": "eyJBbGlhc0NvdW50IjoxNSwiQWxpYXNlcyI6W3siQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9keW5hbW9kYiIsIkFsaWFzTmFtZSI6ImFsaWFzL2F3cy9keW5hbW9kYiJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9lYnMiLCJBbGlhc05hbWUiOiJhbGlhcy9hd3MvZWJzIiwiQ3JlYXRpb25EYXRlIjoxLjU5MjQxMjAxODUyMUU5LCJMYXN0VXBkYXRlZERhdGUiOjEuNTkyNDEyMDE4NTIxRTksIlRhcmdldEtleUlkIjoiZmI0NTdlOGUtNTQ2ZS00MDMzLWE1YWEtZThhZWRkYzlkODUxIn0seyJBbGlhc0FybiI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6YWxpYXMvYXdzL2VsYXN0aWNmaWxlc3lzdGVtIiwiQWxpYXNOYW1lIjoiYWxpYXMvYXdzL2VsYXN0aWNmaWxlc3lzdGVtIn0seyJBbGlhc0FybiI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6YWxpYXMvYXdzL2VzIiwiQWxpYXNOYW1lIjoiYWxpYXMvYXdzL2VzIn0seyJBbGlhc0FybiI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6YWxpYXMvYXdzL2dsdWUiLCJBbGlhc05hbWUiOiJhbGlhcy9hd3MvZ2x1ZSJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9raW5lc2lzdmlkZW8iLCJBbGlhc05hbWUiOiJhbGlhcy9hd3Mva2luZXNpc3ZpZGVvIn0seyJBbGlhc0FybiI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6YWxpYXMvYXdzL3JkcyIsIkFsaWFzTmFtZSI6ImFsaWFzL2F3cy9yZHMifSx7IkFsaWFzQXJuIjoiYXJuOmF3czprbXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjphbGlhcy9hd3MvcmVkc2hpZnQiLCJBbGlhc05hbWUiOiJhbGlhcy9hd3MvcmVkc2hpZnQifSx7IkFsaWFzQXJuIjoiYXJuOmF3czprbXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjphbGlhcy9hd3MvcmVkc2hpZnR0ZXN0IiwiQWxpYXNOYW1lIjoiYWxpYXMvYXdzL3JlZHNoaWZ0dGVzdCJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9zMyIsIkFsaWFzTmFtZSI6ImFsaWFzL2F3cy9zMyJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9zZWNyZXRzbWFuYWdlciIsIkFsaWFzTmFtZSI6ImFsaWFzL2F3cy9zZWNyZXRzbWFuYWdlciIsIkNyZWF0aW9uRGF0ZSI6MS43NDM0NTM4NDE2NjhFOSwiTGFzdFVwZGF0ZWREYXRlIjoxLjc0MzQ1Mzg0MTY2OEU5LCJUYXJnZXRLZXlJZCI6ImY1NDQwMjcyLWEyYzktNGU3Ny05N2Y4LTdjYjE4NzA2NmViZCJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9zc20iLCJBbGlhc05hbWUiOiJhbGlhcy9hd3Mvc3NtIn0seyJBbGlhc0FybiI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6YWxpYXMvYXdzL3hyYXkiLCJBbGlhc05hbWUiOiJhbGlhcy9hd3MveHJheSJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL3Rlc3Qtc2VjcmV0cyIsIkFsaWFzTmFtZSI6ImFsaWFzL3Rlc3Qtc2VjcmV0cyIsIkNyZWF0aW9uRGF0ZSI6MS43NTI4NzgxMjgwMzZFOSwiTGFzdFVwZGF0ZWREYXRlIjoxLjc1Mjg3ODEyODAzNkU5LCJUYXJnZXRLZXlJZCI6IjgxOThmNTM2LTI2YjEtNDU3MS1hNDE1LTAxYzA0NTBlNmMxNCJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL3Rlc3Qtc2VjcmV0czIiLCJBbGlhc05hbWUiOiJhbGlhcy90ZXN0LXNlY3JldHMyIiwiQ3JlYXRpb25EYXRlIjoxLjc1Mjg3OTE3Nzc0NkU5LCJMYXN0VXBkYXRlZERhdGUiOjEuNzUyODc5MTc3NzQ2RTksIlRhcmdldEtleUlkIjoiN2VkM2VkOTgtMDM2MS00ZWQyLWExN2EtOTE1YjBlZjJlOWJmIn1dLCJUcnVuY2F0ZWQiOmZhbHNlfQ==" } }, { "ID": "191e92ad204b3f98", "Request": { "Method": "POST", "URL": "https://kms.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "53" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "TrentService.Decrypt" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDaXBoZXJ0ZXh0QmxvYiI6ImJXRnNabTl5YldWa0lHTnBjR2hsY2lCdFpYTnpZV2RsIn0=" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, must-revalidate, private" ], "Content-Length": [ "39" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:14 GMT" ], "Expires": [ "0" ], "Pragma": [ "no-cache" ], "X-Amzn-Requestid": [ "f30e0822-cf4d-40ec-bf82-40cb15fff485" ] }, "Body": "eyJfX3R5cGUiOiJJbnZhbGlkQ2lwaGVydGV4dEV4Y2VwdGlvbiJ9" } } ] } ================================================ FILE: secrets/awskms/testdata/TestConformance/TestDecryptMalformedError.replay ================================================ { "Initial": "AQAAAA7hTg3BL+EUjwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "c6f06e4bfdbff488", "Request": { "Method": "POST", "URL": "https://kms.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "2" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "TrentService.ListAliases" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "e30=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, must-revalidate, private" ], "Content-Length": [ "2035" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:13 GMT" ], "Expires": [ "0" ], "Pragma": [ "no-cache" ], "X-Amzn-Requestid": [ "a747c9b0-ccff-48bc-8da1-ab72a206c8b3" ] }, "Body": "eyJBbGlhc0NvdW50IjoxNSwiQWxpYXNlcyI6W3siQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9keW5hbW9kYiIsIkFsaWFzTmFtZSI6ImFsaWFzL2F3cy9keW5hbW9kYiJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9lYnMiLCJBbGlhc05hbWUiOiJhbGlhcy9hd3MvZWJzIiwiQ3JlYXRpb25EYXRlIjoxLjU5MjQxMjAxODUyMUU5LCJMYXN0VXBkYXRlZERhdGUiOjEuNTkyNDEyMDE4NTIxRTksIlRhcmdldEtleUlkIjoiZmI0NTdlOGUtNTQ2ZS00MDMzLWE1YWEtZThhZWRkYzlkODUxIn0seyJBbGlhc0FybiI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6YWxpYXMvYXdzL2VsYXN0aWNmaWxlc3lzdGVtIiwiQWxpYXNOYW1lIjoiYWxpYXMvYXdzL2VsYXN0aWNmaWxlc3lzdGVtIn0seyJBbGlhc0FybiI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6YWxpYXMvYXdzL2VzIiwiQWxpYXNOYW1lIjoiYWxpYXMvYXdzL2VzIn0seyJBbGlhc0FybiI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6YWxpYXMvYXdzL2dsdWUiLCJBbGlhc05hbWUiOiJhbGlhcy9hd3MvZ2x1ZSJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9raW5lc2lzdmlkZW8iLCJBbGlhc05hbWUiOiJhbGlhcy9hd3Mva2luZXNpc3ZpZGVvIn0seyJBbGlhc0FybiI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6YWxpYXMvYXdzL3JkcyIsIkFsaWFzTmFtZSI6ImFsaWFzL2F3cy9yZHMifSx7IkFsaWFzQXJuIjoiYXJuOmF3czprbXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjphbGlhcy9hd3MvcmVkc2hpZnQiLCJBbGlhc05hbWUiOiJhbGlhcy9hd3MvcmVkc2hpZnQifSx7IkFsaWFzQXJuIjoiYXJuOmF3czprbXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjphbGlhcy9hd3MvcmVkc2hpZnR0ZXN0IiwiQWxpYXNOYW1lIjoiYWxpYXMvYXdzL3JlZHNoaWZ0dGVzdCJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9zMyIsIkFsaWFzTmFtZSI6ImFsaWFzL2F3cy9zMyJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9zZWNyZXRzbWFuYWdlciIsIkFsaWFzTmFtZSI6ImFsaWFzL2F3cy9zZWNyZXRzbWFuYWdlciIsIkNyZWF0aW9uRGF0ZSI6MS43NDM0NTM4NDE2NjhFOSwiTGFzdFVwZGF0ZWREYXRlIjoxLjc0MzQ1Mzg0MTY2OEU5LCJUYXJnZXRLZXlJZCI6ImY1NDQwMjcyLWEyYzktNGU3Ny05N2Y4LTdjYjE4NzA2NmViZCJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9zc20iLCJBbGlhc05hbWUiOiJhbGlhcy9hd3Mvc3NtIn0seyJBbGlhc0FybiI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6YWxpYXMvYXdzL3hyYXkiLCJBbGlhc05hbWUiOiJhbGlhcy9hd3MveHJheSJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL3Rlc3Qtc2VjcmV0cyIsIkFsaWFzTmFtZSI6ImFsaWFzL3Rlc3Qtc2VjcmV0cyIsIkNyZWF0aW9uRGF0ZSI6MS43NTI4NzgxMjgwMzZFOSwiTGFzdFVwZGF0ZWREYXRlIjoxLjc1Mjg3ODEyODAzNkU5LCJUYXJnZXRLZXlJZCI6IjgxOThmNTM2LTI2YjEtNDU3MS1hNDE1LTAxYzA0NTBlNmMxNCJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL3Rlc3Qtc2VjcmV0czIiLCJBbGlhc05hbWUiOiJhbGlhcy90ZXN0LXNlY3JldHMyIiwiQ3JlYXRpb25EYXRlIjoxLjc1Mjg3OTE3Nzc0NkU5LCJMYXN0VXBkYXRlZERhdGUiOjEuNzUyODc5MTc3NzQ2RTksIlRhcmdldEtleUlkIjoiN2VkM2VkOTgtMDM2MS00ZWQyLWExN2EtOTE1YjBlZjJlOWJmIn1dLCJUcnVuY2F0ZWQiOmZhbHNlfQ==" } }, { "ID": "960d5d6c40706862", "Request": { "Method": "POST", "URL": "https://kms.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "73" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "TrentService.Encrypt" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJLZXlJZCI6ImFsaWFzL3Rlc3Qtc2VjcmV0cyIsIlBsYWludGV4dCI6IlNTZHRJR0VnYzJWamNtVjBJRzFsYzNOaFoyVWgifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, must-revalidate, private" ], "Content-Length": [ "381" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:14 GMT" ], "Expires": [ "0" ], "Pragma": [ "no-cache" ], "X-Amzn-Requestid": [ "3512451e-42de-4704-a781-2281ac899bf6" ] }, "Body": "eyJDaXBoZXJ0ZXh0QmxvYiI6IkFRSUNBSGlSUHF2ZmE0SEVUOTUzbld2b21mcnN2YTJWUmxiTnl4bFNvSzVmRG84ZW5BR2VmME50VHhsdG81eFNWS1pZcFNCUUFBQUFjekJ4QmdrcWhraUc5dzBCQndhZ1pEQmlBZ0VBTUYwR0NTcUdTSWIzRFFFSEFUQWVCZ2xnaGtnQlpRTUVBUzR3RVFRTThDeHZDQWF3YWlyZ2U4UWxBZ0VRZ0RBanRMd1R4cHJzTXM1Z3dKWWpHeVAzemhQMERBSjc0Yy80REk3QWo2SU1nYkE4U0ppM1VNd2RMVkFKZS95UGNEcz0iLCJFbmNyeXB0aW9uQWxnb3JpdGhtIjoiU1lNTUVUUklDX0RFRkFVTFQiLCJLZXlJZCI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6a2V5LzgxOThmNTM2LTI2YjEtNDU3MS1hNDE1LTAxYzA0NTBlNmMxNCJ9" } }, { "ID": "edeabc33f769fc47", "Request": { "Method": "POST", "URL": "https://kms.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "253" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "TrentService.Decrypt" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDaXBoZXJ0ZXh0QmxvYiI6IkFnSUNBSGlSUHF2ZmE0SEVUOTUzbld2b21mcnN2YTJWUmxiTnl4bFNvSzVmRG84ZW5BR2VmME50VHhsdG81eFNWS1pZcFNCUUFBQUFjekJ4QmdrcWhraUc5dzBCQndhZ1pEQmlBZ0VBTUYwR0NTcUdTSWIzRFFFSEFUQWVCZ2xnaGtnQlpRTUVBUzR3RVFRTThDeHZDQWF3YWlyZ2U4UWxBZ0VRZ0RBanRMd1R4cHJzTXM1Z3dKWWpHeVAzemhQMERBSjc0Yy80REk3QWo2SU1nYkE4U0ppM1VNd2RMVkFKZS95UGNEcz0ifQ==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, must-revalidate, private" ], "Content-Length": [ "39" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:14 GMT" ], "Expires": [ "0" ], "Pragma": [ "no-cache" ], "X-Amzn-Requestid": [ "b2bf1f07-3767-4ad2-8c8a-4ffdaf38c10e" ] }, "Body": "eyJfX3R5cGUiOiJJbnZhbGlkQ2lwaGVydGV4dEV4Y2VwdGlvbiJ9" } }, { "ID": "d89de312c8c2d7c8", "Request": { "Method": "POST", "URL": "https://kms.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "253" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "TrentService.Decrypt" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDaXBoZXJ0ZXh0QmxvYiI6IkFRSUFlSkUrcTk5cmdjUlAzbmVkYStpWit1eTlyWlZHVnMzTEdWS2dybDhPang2Y0FaNS9RMjFQR1cyam5GSlVwbGlsSUZBQUFBQnpNSEVHQ1NxR1NJYjNEUUVIQnFCa01HSUNBUUF3WFFZSktvWklodmNOQVFjQk1CNEdDV0NHU0FGbEF3UUJMakFSQkF6d0xHOElCckJxS3VCN3hDVUNBUkNBTUNPMHZCUEdtdXd5em1EQWxpTWJJL2ZPRS9RTUFudmh6L2dNanNDUG9neUJzRHhJbUxkUXpCMHRVQWw3L0k5d093PT0ifQ==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, must-revalidate, private" ], "Content-Length": [ "39" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:14 GMT" ], "Expires": [ "0" ], "Pragma": [ "no-cache" ], "X-Amzn-Requestid": [ "4cbc22da-e6c5-453b-994c-5cb7c7f534b9" ] }, "Body": "eyJfX3R5cGUiOiJJbnZhbGlkQ2lwaGVydGV4dEV4Y2VwdGlvbiJ9" } }, { "ID": "cd593c76a4249ec9", "Request": { "Method": "POST", "URL": "https://kms.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "253" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "TrentService.Decrypt" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDaXBoZXJ0ZXh0QmxvYiI6IkFRSUNBSGlSUHF2ZmE0SEVUOTUzbld2b21mcnN2YTJWUmxiTnl4bFNvSzVmRG84ZW5BR2VmME50VHhsdG81eFNWS1pZcFNCUUFBQUFjekJ4QmdrcWhraUc5dzBCQndhZ1pEQmlBZ0VBTUYwR0NTcUdTSWIzRFFFSEFUQWVCZ2xnaGtnQlpRTUVBUzR3RVFRTThDeHZDQWF3YWlyZ2U4UWxBZ0VRZ0RBanRMd1R4cHJzTXM1Z3dKWWpHeVAzemhQMERBSjc0Yy80REk3QWo2SU1nYkE4U0ppM1VNd2RMVkFKZS95UE9nPT0ifQ==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, must-revalidate, private" ], "Content-Length": [ "39" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:14 GMT" ], "Expires": [ "0" ], "Pragma": [ "no-cache" ], "X-Amzn-Requestid": [ "98a107de-ffe1-4279-817b-d70b90316aeb" ] }, "Body": "eyJfX3R5cGUiOiJJbnZhbGlkQ2lwaGVydGV4dEV4Y2VwdGlvbiJ9" } } ] } ================================================ FILE: secrets/awskms/testdata/TestConformance/TestEncryptDecrypt.replay ================================================ { "Initial": "AQAAAA7hTg3AFDuouwAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "fb33cd82343f72ab", "Request": { "Method": "POST", "URL": "https://kms.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "2" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "TrentService.ListAliases" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "e30=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, must-revalidate, private" ], "Content-Length": [ "2035" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:12 GMT" ], "Expires": [ "0" ], "Pragma": [ "no-cache" ], "X-Amzn-Requestid": [ "9e1973ab-6ebb-4657-afe7-f60cdf997918" ] }, "Body": "eyJBbGlhc0NvdW50IjoxNSwiQWxpYXNlcyI6W3siQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9keW5hbW9kYiIsIkFsaWFzTmFtZSI6ImFsaWFzL2F3cy9keW5hbW9kYiJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9lYnMiLCJBbGlhc05hbWUiOiJhbGlhcy9hd3MvZWJzIiwiQ3JlYXRpb25EYXRlIjoxLjU5MjQxMjAxODUyMUU5LCJMYXN0VXBkYXRlZERhdGUiOjEuNTkyNDEyMDE4NTIxRTksIlRhcmdldEtleUlkIjoiZmI0NTdlOGUtNTQ2ZS00MDMzLWE1YWEtZThhZWRkYzlkODUxIn0seyJBbGlhc0FybiI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6YWxpYXMvYXdzL2VsYXN0aWNmaWxlc3lzdGVtIiwiQWxpYXNOYW1lIjoiYWxpYXMvYXdzL2VsYXN0aWNmaWxlc3lzdGVtIn0seyJBbGlhc0FybiI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6YWxpYXMvYXdzL2VzIiwiQWxpYXNOYW1lIjoiYWxpYXMvYXdzL2VzIn0seyJBbGlhc0FybiI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6YWxpYXMvYXdzL2dsdWUiLCJBbGlhc05hbWUiOiJhbGlhcy9hd3MvZ2x1ZSJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9raW5lc2lzdmlkZW8iLCJBbGlhc05hbWUiOiJhbGlhcy9hd3Mva2luZXNpc3ZpZGVvIn0seyJBbGlhc0FybiI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6YWxpYXMvYXdzL3JkcyIsIkFsaWFzTmFtZSI6ImFsaWFzL2F3cy9yZHMifSx7IkFsaWFzQXJuIjoiYXJuOmF3czprbXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjphbGlhcy9hd3MvcmVkc2hpZnQiLCJBbGlhc05hbWUiOiJhbGlhcy9hd3MvcmVkc2hpZnQifSx7IkFsaWFzQXJuIjoiYXJuOmF3czprbXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjphbGlhcy9hd3MvcmVkc2hpZnR0ZXN0IiwiQWxpYXNOYW1lIjoiYWxpYXMvYXdzL3JlZHNoaWZ0dGVzdCJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9zMyIsIkFsaWFzTmFtZSI6ImFsaWFzL2F3cy9zMyJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9zZWNyZXRzbWFuYWdlciIsIkFsaWFzTmFtZSI6ImFsaWFzL2F3cy9zZWNyZXRzbWFuYWdlciIsIkNyZWF0aW9uRGF0ZSI6MS43NDM0NTM4NDE2NjhFOSwiTGFzdFVwZGF0ZWREYXRlIjoxLjc0MzQ1Mzg0MTY2OEU5LCJUYXJnZXRLZXlJZCI6ImY1NDQwMjcyLWEyYzktNGU3Ny05N2Y4LTdjYjE4NzA2NmViZCJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9zc20iLCJBbGlhc05hbWUiOiJhbGlhcy9hd3Mvc3NtIn0seyJBbGlhc0FybiI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6YWxpYXMvYXdzL3hyYXkiLCJBbGlhc05hbWUiOiJhbGlhcy9hd3MveHJheSJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL3Rlc3Qtc2VjcmV0cyIsIkFsaWFzTmFtZSI6ImFsaWFzL3Rlc3Qtc2VjcmV0cyIsIkNyZWF0aW9uRGF0ZSI6MS43NTI4NzgxMjgwMzZFOSwiTGFzdFVwZGF0ZWREYXRlIjoxLjc1Mjg3ODEyODAzNkU5LCJUYXJnZXRLZXlJZCI6IjgxOThmNTM2LTI2YjEtNDU3MS1hNDE1LTAxYzA0NTBlNmMxNCJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL3Rlc3Qtc2VjcmV0czIiLCJBbGlhc05hbWUiOiJhbGlhcy90ZXN0LXNlY3JldHMyIiwiQ3JlYXRpb25EYXRlIjoxLjc1Mjg3OTE3Nzc0NkU5LCJMYXN0VXBkYXRlZERhdGUiOjEuNzUyODc5MTc3NzQ2RTksIlRhcmdldEtleUlkIjoiN2VkM2VkOTgtMDM2MS00ZWQyLWExN2EtOTE1YjBlZjJlOWJmIn1dLCJUcnVuY2F0ZWQiOmZhbHNlfQ==" } }, { "ID": "9058d69d3a8a6b8e", "Request": { "Method": "POST", "URL": "https://kms.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "73" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "TrentService.Encrypt" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJLZXlJZCI6ImFsaWFzL3Rlc3Qtc2VjcmV0cyIsIlBsYWludGV4dCI6IlNTZHRJR0VnYzJWamNtVjBJRzFsYzNOaFoyVWgifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, must-revalidate, private" ], "Content-Length": [ "381" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:12 GMT" ], "Expires": [ "0" ], "Pragma": [ "no-cache" ], "X-Amzn-Requestid": [ "2f23a3e2-6ffc-49eb-a5ee-d62e3a4cb197" ] }, "Body": "eyJDaXBoZXJ0ZXh0QmxvYiI6IkFRSUNBSGlSUHF2ZmE0SEVUOTUzbld2b21mcnN2YTJWUmxiTnl4bFNvSzVmRG84ZW5BSG9CbnZFU0pZaWFjODJvR0RGUDQ0Q0FBQUFjekJ4QmdrcWhraUc5dzBCQndhZ1pEQmlBZ0VBTUYwR0NTcUdTSWIzRFFFSEFUQWVCZ2xnaGtnQlpRTUVBUzR3RVFRTVZ3TFcrRlVxL1FOd3ZQOWpBZ0VRZ0RCcFR3eTJUTTBrK21LZG5sOGNpaGNaNXJxcmtPdDlBa216UlZyNXhHZ2NBd1U2U1JBRlAzMGt6ck9qMzZiUWpJQT0iLCJFbmNyeXB0aW9uQWxnb3JpdGhtIjoiU1lNTUVUUklDX0RFRkFVTFQiLCJLZXlJZCI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6a2V5LzgxOThmNTM2LTI2YjEtNDU3MS1hNDE1LTAxYzA0NTBlNmMxNCJ9" } }, { "ID": "f9dd81d26890e873", "Request": { "Method": "POST", "URL": "https://kms.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "253" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "TrentService.Decrypt" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDaXBoZXJ0ZXh0QmxvYiI6IkFRSUNBSGlSUHF2ZmE0SEVUOTUzbld2b21mcnN2YTJWUmxiTnl4bFNvSzVmRG84ZW5BSG9CbnZFU0pZaWFjODJvR0RGUDQ0Q0FBQUFjekJ4QmdrcWhraUc5dzBCQndhZ1pEQmlBZ0VBTUYwR0NTcUdTSWIzRFFFSEFUQWVCZ2xnaGtnQlpRTUVBUzR3RVFRTVZ3TFcrRlVxL1FOd3ZQOWpBZ0VRZ0RCcFR3eTJUTTBrK21LZG5sOGNpaGNaNXJxcmtPdDlBa216UlZyNXhHZ2NBd1U2U1JBRlAzMGt6ck9qMzZiUWpJQT0ifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, must-revalidate, private" ], "Content-Length": [ "277" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:12 GMT" ], "Expires": [ "0" ], "Pragma": [ "no-cache" ], "X-Amzn-Requestid": [ "08fdfbae-f2cc-4cc8-9501-b1cf63f14a09" ] }, "Body": "eyJFbmNyeXB0aW9uQWxnb3JpdGhtIjoiU1lNTUVUUklDX0RFRkFVTFQiLCJLZXlJZCI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6a2V5LzgxOThmNTM2LTI2YjEtNDU3MS1hNDE1LTAxYzA0NTBlNmMxNCIsIktleU1hdGVyaWFsSWQiOiI5MTNlYWJkZjZiODFjNDRmZGU3NzlkNmJlODk5ZmFlY2JkYWQ5NTQ2NTZjZGNiMTk1MmEwYWU1ZjBlOGYxZTljIiwiS2V5T3JpZ2luIjoiQVdTX0tNUyIsIlBsYWludGV4dCI6IlNTZHRJR0VnYzJWamNtVjBJRzFsYzNOaFoyVWgifQ==" } } ] } ================================================ FILE: secrets/awskms/testdata/TestConformance/TestMultipleEncryptionsNotEqual.replay ================================================ { "Initial": "AQAAAA7hTg3AMJG/gQAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "0c6815c963d6c88a", "Request": { "Method": "POST", "URL": "https://kms.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "2" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "TrentService.ListAliases" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "e30=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, must-revalidate, private" ], "Content-Length": [ "2035" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:13 GMT" ], "Expires": [ "0" ], "Pragma": [ "no-cache" ], "X-Amzn-Requestid": [ "1ded5300-b21b-49ab-9d60-be6b4f78867e" ] }, "Body": "eyJBbGlhc0NvdW50IjoxNSwiQWxpYXNlcyI6W3siQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9keW5hbW9kYiIsIkFsaWFzTmFtZSI6ImFsaWFzL2F3cy9keW5hbW9kYiJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9lYnMiLCJBbGlhc05hbWUiOiJhbGlhcy9hd3MvZWJzIiwiQ3JlYXRpb25EYXRlIjoxLjU5MjQxMjAxODUyMUU5LCJMYXN0VXBkYXRlZERhdGUiOjEuNTkyNDEyMDE4NTIxRTksIlRhcmdldEtleUlkIjoiZmI0NTdlOGUtNTQ2ZS00MDMzLWE1YWEtZThhZWRkYzlkODUxIn0seyJBbGlhc0FybiI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6YWxpYXMvYXdzL2VsYXN0aWNmaWxlc3lzdGVtIiwiQWxpYXNOYW1lIjoiYWxpYXMvYXdzL2VsYXN0aWNmaWxlc3lzdGVtIn0seyJBbGlhc0FybiI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6YWxpYXMvYXdzL2VzIiwiQWxpYXNOYW1lIjoiYWxpYXMvYXdzL2VzIn0seyJBbGlhc0FybiI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6YWxpYXMvYXdzL2dsdWUiLCJBbGlhc05hbWUiOiJhbGlhcy9hd3MvZ2x1ZSJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9raW5lc2lzdmlkZW8iLCJBbGlhc05hbWUiOiJhbGlhcy9hd3Mva2luZXNpc3ZpZGVvIn0seyJBbGlhc0FybiI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6YWxpYXMvYXdzL3JkcyIsIkFsaWFzTmFtZSI6ImFsaWFzL2F3cy9yZHMifSx7IkFsaWFzQXJuIjoiYXJuOmF3czprbXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjphbGlhcy9hd3MvcmVkc2hpZnQiLCJBbGlhc05hbWUiOiJhbGlhcy9hd3MvcmVkc2hpZnQifSx7IkFsaWFzQXJuIjoiYXJuOmF3czprbXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjphbGlhcy9hd3MvcmVkc2hpZnR0ZXN0IiwiQWxpYXNOYW1lIjoiYWxpYXMvYXdzL3JlZHNoaWZ0dGVzdCJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9zMyIsIkFsaWFzTmFtZSI6ImFsaWFzL2F3cy9zMyJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9zZWNyZXRzbWFuYWdlciIsIkFsaWFzTmFtZSI6ImFsaWFzL2F3cy9zZWNyZXRzbWFuYWdlciIsIkNyZWF0aW9uRGF0ZSI6MS43NDM0NTM4NDE2NjhFOSwiTGFzdFVwZGF0ZWREYXRlIjoxLjc0MzQ1Mzg0MTY2OEU5LCJUYXJnZXRLZXlJZCI6ImY1NDQwMjcyLWEyYzktNGU3Ny05N2Y4LTdjYjE4NzA2NmViZCJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9zc20iLCJBbGlhc05hbWUiOiJhbGlhcy9hd3Mvc3NtIn0seyJBbGlhc0FybiI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6YWxpYXMvYXdzL3hyYXkiLCJBbGlhc05hbWUiOiJhbGlhcy9hd3MveHJheSJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL3Rlc3Qtc2VjcmV0cyIsIkFsaWFzTmFtZSI6ImFsaWFzL3Rlc3Qtc2VjcmV0cyIsIkNyZWF0aW9uRGF0ZSI6MS43NTI4NzgxMjgwMzZFOSwiTGFzdFVwZGF0ZWREYXRlIjoxLjc1Mjg3ODEyODAzNkU5LCJUYXJnZXRLZXlJZCI6IjgxOThmNTM2LTI2YjEtNDU3MS1hNDE1LTAxYzA0NTBlNmMxNCJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL3Rlc3Qtc2VjcmV0czIiLCJBbGlhc05hbWUiOiJhbGlhcy90ZXN0LXNlY3JldHMyIiwiQ3JlYXRpb25EYXRlIjoxLjc1Mjg3OTE3Nzc0NkU5LCJMYXN0VXBkYXRlZERhdGUiOjEuNzUyODc5MTc3NzQ2RTksIlRhcmdldEtleUlkIjoiN2VkM2VkOTgtMDM2MS00ZWQyLWExN2EtOTE1YjBlZjJlOWJmIn1dLCJUcnVuY2F0ZWQiOmZhbHNlfQ==" } }, { "ID": "25a50916bc27bda2", "Request": { "Method": "POST", "URL": "https://kms.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "73" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "TrentService.Encrypt" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJLZXlJZCI6ImFsaWFzL3Rlc3Qtc2VjcmV0cyIsIlBsYWludGV4dCI6IlNTZHRJR0VnYzJWamNtVjBJRzFsYzNOaFoyVWgifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, must-revalidate, private" ], "Content-Length": [ "381" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:13 GMT" ], "Expires": [ "0" ], "Pragma": [ "no-cache" ], "X-Amzn-Requestid": [ "35cd6029-3df2-4c12-8d6c-5b5ddcce47bc" ] }, "Body": "eyJDaXBoZXJ0ZXh0QmxvYiI6IkFRSUNBSGlSUHF2ZmE0SEVUOTUzbld2b21mcnN2YTJWUmxiTnl4bFNvSzVmRG84ZW5BRVExa2thWm4zdWlrR09QbC8za2kwTUFBQUFjekJ4QmdrcWhraUc5dzBCQndhZ1pEQmlBZ0VBTUYwR0NTcUdTSWIzRFFFSEFUQWVCZ2xnaGtnQlpRTUVBUzR3RVFRTVVMaG9OWG5UU3RLZ3Y0V2pBZ0VRZ0RCenVFOFBqakJwM3dXd3U0anBDQUY3ZXVnNVdyb1VxZlNCVlBOY1JLeEt0bFJ0a0I5WWtBZHFEWEwxa0YxdG1YZz0iLCJFbmNyeXB0aW9uQWxnb3JpdGhtIjoiU1lNTUVUUklDX0RFRkFVTFQiLCJLZXlJZCI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6a2V5LzgxOThmNTM2LTI2YjEtNDU3MS1hNDE1LTAxYzA0NTBlNmMxNCJ9" } }, { "ID": "4e5a2e5084f5a253", "Request": { "Method": "POST", "URL": "https://kms.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "73" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "TrentService.Encrypt" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJLZXlJZCI6ImFsaWFzL3Rlc3Qtc2VjcmV0cyIsIlBsYWludGV4dCI6IlNTZHRJR0VnYzJWamNtVjBJRzFsYzNOaFoyVWgifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, must-revalidate, private" ], "Content-Length": [ "381" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:13 GMT" ], "Expires": [ "0" ], "Pragma": [ "no-cache" ], "X-Amzn-Requestid": [ "77807f3a-f4f4-4969-8fb4-84fc810b792f" ] }, "Body": "eyJDaXBoZXJ0ZXh0QmxvYiI6IkFRSUNBSGlSUHF2ZmE0SEVUOTUzbld2b21mcnN2YTJWUmxiTnl4bFNvSzVmRG84ZW5BSDRyeWl5REptTFZFWWVVdFlKNU5JR0FBQUFjekJ4QmdrcWhraUc5dzBCQndhZ1pEQmlBZ0VBTUYwR0NTcUdTSWIzRFFFSEFUQWVCZ2xnaGtnQlpRTUVBUzR3RVFRTVBRTHVneFd5cWFKNDhOcVlBZ0VRZ0RCZzB0Vzc1dVU2aCsvWXhWcWNoelVTZUVlOEtLYjV1M2tGNVRCQStyWWNzVHV2NjQyd0p2NmJabTBlbHlRTHdVOD0iLCJFbmNyeXB0aW9uQWxnb3JpdGhtIjoiU1lNTUVUUklDX0RFRkFVTFQiLCJLZXlJZCI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6a2V5LzgxOThmNTM2LTI2YjEtNDU3MS1hNDE1LTAxYzA0NTBlNmMxNCJ9" } }, { "ID": "00998ecfc23b7cd9", "Request": { "Method": "POST", "URL": "https://kms.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "253" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "TrentService.Decrypt" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDaXBoZXJ0ZXh0QmxvYiI6IkFRSUNBSGlSUHF2ZmE0SEVUOTUzbld2b21mcnN2YTJWUmxiTnl4bFNvSzVmRG84ZW5BRVExa2thWm4zdWlrR09QbC8za2kwTUFBQUFjekJ4QmdrcWhraUc5dzBCQndhZ1pEQmlBZ0VBTUYwR0NTcUdTSWIzRFFFSEFUQWVCZ2xnaGtnQlpRTUVBUzR3RVFRTVVMaG9OWG5UU3RLZ3Y0V2pBZ0VRZ0RCenVFOFBqakJwM3dXd3U0anBDQUY3ZXVnNVdyb1VxZlNCVlBOY1JLeEt0bFJ0a0I5WWtBZHFEWEwxa0YxdG1YZz0ifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, must-revalidate, private" ], "Content-Length": [ "277" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:13 GMT" ], "Expires": [ "0" ], "Pragma": [ "no-cache" ], "X-Amzn-Requestid": [ "9eab563f-fae8-4ead-b5c2-3eb69a03dba2" ] }, "Body": "eyJFbmNyeXB0aW9uQWxnb3JpdGhtIjoiU1lNTUVUUklDX0RFRkFVTFQiLCJLZXlJZCI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6a2V5LzgxOThmNTM2LTI2YjEtNDU3MS1hNDE1LTAxYzA0NTBlNmMxNCIsIktleU1hdGVyaWFsSWQiOiI5MTNlYWJkZjZiODFjNDRmZGU3NzlkNmJlODk5ZmFlY2JkYWQ5NTQ2NTZjZGNiMTk1MmEwYWU1ZjBlOGYxZTljIiwiS2V5T3JpZ2luIjoiQVdTX0tNUyIsIlBsYWludGV4dCI6IlNTZHRJR0VnYzJWamNtVjBJRzFsYzNOaFoyVWgifQ==" } }, { "ID": "d7d987f42b9d80a6", "Request": { "Method": "POST", "URL": "https://kms.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "253" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "TrentService.Decrypt" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDaXBoZXJ0ZXh0QmxvYiI6IkFRSUNBSGlSUHF2ZmE0SEVUOTUzbld2b21mcnN2YTJWUmxiTnl4bFNvSzVmRG84ZW5BSDRyeWl5REptTFZFWWVVdFlKNU5JR0FBQUFjekJ4QmdrcWhraUc5dzBCQndhZ1pEQmlBZ0VBTUYwR0NTcUdTSWIzRFFFSEFUQWVCZ2xnaGtnQlpRTUVBUzR3RVFRTVBRTHVneFd5cWFKNDhOcVlBZ0VRZ0RCZzB0Vzc1dVU2aCsvWXhWcWNoelVTZUVlOEtLYjV1M2tGNVRCQStyWWNzVHV2NjQyd0p2NmJabTBlbHlRTHdVOD0ifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, must-revalidate, private" ], "Content-Length": [ "277" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:13 GMT" ], "Expires": [ "0" ], "Pragma": [ "no-cache" ], "X-Amzn-Requestid": [ "f3b85122-07b6-44f9-a9ae-9a7af9828abe" ] }, "Body": "eyJFbmNyeXB0aW9uQWxnb3JpdGhtIjoiU1lNTUVUUklDX0RFRkFVTFQiLCJLZXlJZCI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6a2V5LzgxOThmNTM2LTI2YjEtNDU3MS1hNDE1LTAxYzA0NTBlNmMxNCIsIktleU1hdGVyaWFsSWQiOiI5MTNlYWJkZjZiODFjNDRmZGU3NzlkNmJlODk5ZmFlY2JkYWQ5NTQ2NTZjZGNiMTk1MmEwYWU1ZjBlOGYxZTljIiwiS2V5T3JpZ2luIjoiQVdTX0tNUyIsIlBsYWludGV4dCI6IlNTZHRJR0VnYzJWamNtVjBJRzFsYzNOaFoyVWgifQ==" } } ] } ================================================ FILE: secrets/awskms/testdata/TestConformance/TestMultipleKeys.replay ================================================ { "Initial": "AQAAAA7hTg3BEk0fQAAA", "Version": "0.2", "Converter": { "ScrubBody": [ "MessageAttributes.*" ], "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^Amz-Sdk-Invocation-Id$", "^X-Amz-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$", "^Authorization$", "^Duration$", "^X-Amz-Security-Token$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": [ "^X-Amz-Date$" ], "RemoveParams": [ "^X-Amz-Credential$", "^X-Amz-Signature$", "^X-Amz-Security-Token$" ] }, "Entries": [ { "ID": "6286df3ce203ee8c", "Request": { "Method": "POST", "URL": "https://kms.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "2" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "TrentService.ListAliases" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "e30=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, must-revalidate, private" ], "Content-Length": [ "2035" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:13 GMT" ], "Expires": [ "0" ], "Pragma": [ "no-cache" ], "X-Amzn-Requestid": [ "2bd2a7d5-55c9-4f15-ab88-b173e4b9f175" ] }, "Body": "eyJBbGlhc0NvdW50IjoxNSwiQWxpYXNlcyI6W3siQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9keW5hbW9kYiIsIkFsaWFzTmFtZSI6ImFsaWFzL2F3cy9keW5hbW9kYiJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9lYnMiLCJBbGlhc05hbWUiOiJhbGlhcy9hd3MvZWJzIiwiQ3JlYXRpb25EYXRlIjoxLjU5MjQxMjAxODUyMUU5LCJMYXN0VXBkYXRlZERhdGUiOjEuNTkyNDEyMDE4NTIxRTksIlRhcmdldEtleUlkIjoiZmI0NTdlOGUtNTQ2ZS00MDMzLWE1YWEtZThhZWRkYzlkODUxIn0seyJBbGlhc0FybiI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6YWxpYXMvYXdzL2VsYXN0aWNmaWxlc3lzdGVtIiwiQWxpYXNOYW1lIjoiYWxpYXMvYXdzL2VsYXN0aWNmaWxlc3lzdGVtIn0seyJBbGlhc0FybiI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6YWxpYXMvYXdzL2VzIiwiQWxpYXNOYW1lIjoiYWxpYXMvYXdzL2VzIn0seyJBbGlhc0FybiI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6YWxpYXMvYXdzL2dsdWUiLCJBbGlhc05hbWUiOiJhbGlhcy9hd3MvZ2x1ZSJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9raW5lc2lzdmlkZW8iLCJBbGlhc05hbWUiOiJhbGlhcy9hd3Mva2luZXNpc3ZpZGVvIn0seyJBbGlhc0FybiI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6YWxpYXMvYXdzL3JkcyIsIkFsaWFzTmFtZSI6ImFsaWFzL2F3cy9yZHMifSx7IkFsaWFzQXJuIjoiYXJuOmF3czprbXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjphbGlhcy9hd3MvcmVkc2hpZnQiLCJBbGlhc05hbWUiOiJhbGlhcy9hd3MvcmVkc2hpZnQifSx7IkFsaWFzQXJuIjoiYXJuOmF3czprbXM6dXMtZWFzdC0yOjQ1Njc1MjY2NTU3NjphbGlhcy9hd3MvcmVkc2hpZnR0ZXN0IiwiQWxpYXNOYW1lIjoiYWxpYXMvYXdzL3JlZHNoaWZ0dGVzdCJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9zMyIsIkFsaWFzTmFtZSI6ImFsaWFzL2F3cy9zMyJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9zZWNyZXRzbWFuYWdlciIsIkFsaWFzTmFtZSI6ImFsaWFzL2F3cy9zZWNyZXRzbWFuYWdlciIsIkNyZWF0aW9uRGF0ZSI6MS43NDM0NTM4NDE2NjhFOSwiTGFzdFVwZGF0ZWREYXRlIjoxLjc0MzQ1Mzg0MTY2OEU5LCJUYXJnZXRLZXlJZCI6ImY1NDQwMjcyLWEyYzktNGU3Ny05N2Y4LTdjYjE4NzA2NmViZCJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL2F3cy9zc20iLCJBbGlhc05hbWUiOiJhbGlhcy9hd3Mvc3NtIn0seyJBbGlhc0FybiI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6YWxpYXMvYXdzL3hyYXkiLCJBbGlhc05hbWUiOiJhbGlhcy9hd3MveHJheSJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL3Rlc3Qtc2VjcmV0cyIsIkFsaWFzTmFtZSI6ImFsaWFzL3Rlc3Qtc2VjcmV0cyIsIkNyZWF0aW9uRGF0ZSI6MS43NTI4NzgxMjgwMzZFOSwiTGFzdFVwZGF0ZWREYXRlIjoxLjc1Mjg3ODEyODAzNkU5LCJUYXJnZXRLZXlJZCI6IjgxOThmNTM2LTI2YjEtNDU3MS1hNDE1LTAxYzA0NTBlNmMxNCJ9LHsiQWxpYXNBcm4iOiJhcm46YXdzOmttczp1cy1lYXN0LTI6NDU2NzUyNjY1NTc2OmFsaWFzL3Rlc3Qtc2VjcmV0czIiLCJBbGlhc05hbWUiOiJhbGlhcy90ZXN0LXNlY3JldHMyIiwiQ3JlYXRpb25EYXRlIjoxLjc1Mjg3OTE3Nzc0NkU5LCJMYXN0VXBkYXRlZERhdGUiOjEuNzUyODc5MTc3NzQ2RTksIlRhcmdldEtleUlkIjoiN2VkM2VkOTgtMDM2MS00ZWQyLWExN2EtOTE1YjBlZjJlOWJmIn1dLCJUcnVuY2F0ZWQiOmZhbHNlfQ==" } }, { "ID": "af91b52a7f98ce1b", "Request": { "Method": "POST", "URL": "https://kms.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "73" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "TrentService.Encrypt" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJLZXlJZCI6ImFsaWFzL3Rlc3Qtc2VjcmV0cyIsIlBsYWludGV4dCI6IlNTZHRJR0VnYzJWamNtVjBJRzFsYzNOaFoyVWgifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, must-revalidate, private" ], "Content-Length": [ "381" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:13 GMT" ], "Expires": [ "0" ], "Pragma": [ "no-cache" ], "X-Amzn-Requestid": [ "85d71702-c8bb-414e-b91e-d8205a1d2ce5" ] }, "Body": "eyJDaXBoZXJ0ZXh0QmxvYiI6IkFRSUNBSGlSUHF2ZmE0SEVUOTUzbld2b21mcnN2YTJWUmxiTnl4bFNvSzVmRG84ZW5BRjZDNS92ZW5aSU4rNVFNNTBTQzFMWEFBQUFjekJ4QmdrcWhraUc5dzBCQndhZ1pEQmlBZ0VBTUYwR0NTcUdTSWIzRFFFSEFUQWVCZ2xnaGtnQlpRTUVBUzR3RVFRTXo2WDFnUkJCUHVtZlVEZFNBZ0VRZ0RBK2hHYWhzcXNsY1ZCZ2lzdThrMFM3d3R6dWczSk5VcG5PY0FmYnIzVE4ycnRwWWc5SXU5SXA1TDcxMzM2V0F5ND0iLCJFbmNyeXB0aW9uQWxnb3JpdGhtIjoiU1lNTUVUUklDX0RFRkFVTFQiLCJLZXlJZCI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6a2V5LzgxOThmNTM2LTI2YjEtNDU3MS1hNDE1LTAxYzA0NTBlNmMxNCJ9" } }, { "ID": "7420a3589e3b7c92", "Request": { "Method": "POST", "URL": "https://kms.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "74" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "TrentService.Encrypt" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJLZXlJZCI6ImFsaWFzL3Rlc3Qtc2VjcmV0czIiLCJQbGFpbnRleHQiOiJTU2R0SUdFZ2MyVmpjbVYwSUcxbGMzTmhaMlVoIn0=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, must-revalidate, private" ], "Content-Length": [ "381" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:13 GMT" ], "Expires": [ "0" ], "Pragma": [ "no-cache" ], "X-Amzn-Requestid": [ "a3ee27d9-1795-496d-b911-b603b16c52eb" ] }, "Body": "eyJDaXBoZXJ0ZXh0QmxvYiI6IkFRSUNBSGcvbmJCVWlrTjYyREZrMzlDcDUxVW1jaVhXbXJVNlB5d3JQck5lU2k4b0xBRXYyNEhkZFdlNEFYdWFvMHpqbEVwTkFBQUFjekJ4QmdrcWhraUc5dzBCQndhZ1pEQmlBZ0VBTUYwR0NTcUdTSWIzRFFFSEFUQWVCZ2xnaGtnQlpRTUVBUzR3RVFRTUMvZFV6cFFrUS9qY2hiZVVBZ0VRZ0RDTkxkOCszMlF4VGsvSFRNTEE0ZEdYYThYbGtHaFhoVVEwYVFRZDJtdDRDYTdldldWUGVmSWV3cnlrNFBHVEFjST0iLCJFbmNyeXB0aW9uQWxnb3JpdGhtIjoiU1lNTUVUUklDX0RFRkFVTFQiLCJLZXlJZCI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6a2V5LzdlZDNlZDk4LTAzNjEtNGVkMi1hMTdhLTkxNWIwZWYyZTliZiJ9" } }, { "ID": "7483652a76b5cf5d", "Request": { "Method": "POST", "URL": "https://kms.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "253" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "TrentService.Decrypt" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDaXBoZXJ0ZXh0QmxvYiI6IkFRSUNBSGlSUHF2ZmE0SEVUOTUzbld2b21mcnN2YTJWUmxiTnl4bFNvSzVmRG84ZW5BRjZDNS92ZW5aSU4rNVFNNTBTQzFMWEFBQUFjekJ4QmdrcWhraUc5dzBCQndhZ1pEQmlBZ0VBTUYwR0NTcUdTSWIzRFFFSEFUQWVCZ2xnaGtnQlpRTUVBUzR3RVFRTXo2WDFnUkJCUHVtZlVEZFNBZ0VRZ0RBK2hHYWhzcXNsY1ZCZ2lzdThrMFM3d3R6dWczSk5VcG5PY0FmYnIzVE4ycnRwWWc5SXU5SXA1TDcxMzM2V0F5ND0ifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, must-revalidate, private" ], "Content-Length": [ "277" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:13 GMT" ], "Expires": [ "0" ], "Pragma": [ "no-cache" ], "X-Amzn-Requestid": [ "2432f920-dcce-4983-9bb2-73829fb6c6ac" ] }, "Body": "eyJFbmNyeXB0aW9uQWxnb3JpdGhtIjoiU1lNTUVUUklDX0RFRkFVTFQiLCJLZXlJZCI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6a2V5LzgxOThmNTM2LTI2YjEtNDU3MS1hNDE1LTAxYzA0NTBlNmMxNCIsIktleU1hdGVyaWFsSWQiOiI5MTNlYWJkZjZiODFjNDRmZGU3NzlkNmJlODk5ZmFlY2JkYWQ5NTQ2NTZjZGNiMTk1MmEwYWU1ZjBlOGYxZTljIiwiS2V5T3JpZ2luIjoiQVdTX0tNUyIsIlBsYWludGV4dCI6IlNTZHRJR0VnYzJWamNtVjBJRzFsYzNOaFoyVWgifQ==" } }, { "ID": "d9db04ea3df3311f", "Request": { "Method": "POST", "URL": "https://kms.us-east-2.amazonaws.com/", "Header": { "Accept-Encoding": [ "gzip" ], "Amz-Sdk-Invocation-Id": [ "CLEARED" ], "Amz-Sdk-Request": [ "attempt=1; max=1" ], "Content-Length": [ "253" ], "User-Agent": [ "CLEARED" ], "X-Amz-Date": [ "CLEARED" ], "X-Amz-Target": [ "TrentService.Decrypt" ] }, "MediaType": "application/x-amz-json-1.1", "BodyParts": [ "eyJDaXBoZXJ0ZXh0QmxvYiI6IkFRSUNBSGcvbmJCVWlrTjYyREZrMzlDcDUxVW1jaVhXbXJVNlB5d3JQck5lU2k4b0xBRXYyNEhkZFdlNEFYdWFvMHpqbEVwTkFBQUFjekJ4QmdrcWhraUc5dzBCQndhZ1pEQmlBZ0VBTUYwR0NTcUdTSWIzRFFFSEFUQWVCZ2xnaGtnQlpRTUVBUzR3RVFRTUMvZFV6cFFrUS9qY2hiZVVBZ0VRZ0RDTkxkOCszMlF4VGsvSFRNTEE0ZEdYYThYbGtHaFhoVVEwYVFRZDJtdDRDYTdldldWUGVmSWV3cnlrNFBHVEFjST0ifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache, no-store, must-revalidate, private" ], "Content-Length": [ "277" ], "Content-Type": [ "application/x-amz-json-1.1" ], "Date": [ "Thu, 19 Mar 2026 15:31:13 GMT" ], "Expires": [ "0" ], "Pragma": [ "no-cache" ], "X-Amzn-Requestid": [ "c7fe0796-d824-488e-994f-98de2cf4bac2" ] }, "Body": "eyJFbmNyeXB0aW9uQWxnb3JpdGhtIjoiU1lNTUVUUklDX0RFRkFVTFQiLCJLZXlJZCI6ImFybjphd3M6a21zOnVzLWVhc3QtMjo0NTY3NTI2NjU1NzY6a2V5LzdlZDNlZDk4LTAzNjEtNGVkMi1hMTdhLTkxNWIwZWYyZTliZiIsIktleU1hdGVyaWFsSWQiOiIzZjlkYjA1NDhhNDM3YWQ4MzE2NGRmZDBhOWU3NTUyNjcyMjVkNjlhYjUzYTNmMmMyYjNlYjM1ZTRhMmYyODJjIiwiS2V5T3JpZ2luIjoiQVdTX0tNUyIsIlBsYWludGV4dCI6IlNTZHRJR0VnYzJWamNtVjBJRzFsYzNOaFoyVWgifQ==" } } ] } ================================================ FILE: secrets/azurekeyvault/akv.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package azurekeyvault provides a secrets implementation backed by Azure KeyVault. // See https://docs.microsoft.com/en-us/azure/key-vault/key-vault-whatis for more information. // Use OpenKeeper to construct a *secrets.Keeper. // // # URLs // // For secrets.OpenKeeper, azurekeyvault registers for the scheme "azurekeyvault". // The default URL opener will use azidentity.DefaultAzureCredential to get credentials. // // To customize the URL opener, or for more details on the URL format, // see URLOpener. // See https://gocloud.dev/concepts/urls/ for background information. // // # As // // azurekeyvault exposes the following type for As: // - Error: *azcore.ResponseError. package azurekeyvault import ( "context" "errors" "fmt" "net/url" "path" "regexp" "strings" "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azidentity" "github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys" "github.com/google/wire" "gocloud.dev/gcerrors" "gocloud.dev/internal/gcerr" "gocloud.dev/internal/useragent" "gocloud.dev/secrets" ) // Map of HTTP Status Code to go-cloud ErrorCode var errorCodeMap = map[int]gcerrors.ErrorCode{ 200: gcerrors.OK, 400: gcerrors.InvalidArgument, 401: gcerrors.PermissionDenied, 403: gcerrors.PermissionDenied, 404: gcerrors.NotFound, 408: gcerrors.DeadlineExceeded, 429: gcerrors.ResourceExhausted, 500: gcerrors.Internal, 501: gcerrors.Unimplemented, } func init() { secrets.DefaultURLMux().RegisterKeeper(Scheme, new(defaultDialer)) } // Set holds Wire providers for this package. var Set = wire.NewSet( DefaultClientMaker, wire.Struct(new(URLOpener), "Client"), ) // ClientMakerT is the type of a function used to generate a Client. type ClientMakerT func(keyVaultURI string) (*azkeys.Client, error) // defaultDialer dials Azure KeyVault using DefaultClientMaker. type defaultDialer struct{} func (o *defaultDialer) OpenKeeperURL(ctx context.Context, u *url.URL) (*secrets.Keeper, error) { opener := &URLOpener{ClientMaker: DefaultClientMaker} return opener.OpenKeeperURL(ctx, u) } // Scheme is the URL scheme azurekeyvault registers its URLOpener under on secrets.DefaultMux. const Scheme = "azurekeyvault" // URLOpener opens Azure KeyVault URLs like // "azurekeyvault://{keyvault-name}.vault.azure.net/keys/{key-name}/{key-version}?algorithm=RSA-OAEP-256". // // The "azurekeyvault" URL scheme is replaced with "https" to construct an Azure // Key Vault keyID, as described in https://docs.microsoft.com/en-us/azure/key-vault/about-keys-secrets-and-certificates. // The "/{key-version}"" suffix is optional; it defaults to the latest version. // // The "algorithm" query parameter sets the algorithm to use; see // https://docs.microsoft.com/en-us/rest/api/keyvault/encrypt/encrypt#jsonwebkeyencryptionalgorithm // for supported algorithms. It defaults to "RSA-OAEP-256". // // No other query parameters are supported. type URLOpener struct { // ClientMaker defaults to DefaultClientMaker. ClientMaker ClientMakerT // Options specifies the options to pass to OpenKeeper. Options KeeperOptions } // OpenKeeperURL opens an Azure KeyVault Keeper based on u. func (o *URLOpener) OpenKeeperURL(ctx context.Context, u *url.URL) (*secrets.Keeper, error) { q := u.Query() algorithm := q.Get("algorithm") if algorithm != "" { o.Options.Algorithm = azkeys.JSONWebKeyEncryptionAlgorithm(algorithm) q.Del("algorithm") } for param := range q { return nil, fmt.Errorf("open keeper %v: invalid query parameter %q", u, param) } keyID := "https://" + path.Join(u.Host, u.Path) return OpenKeeper(o.ClientMaker, keyID, &o.Options) } type keeper struct { client *azkeys.Client keyVaultURI string // unused, but for validation in tests keyName string keyVersion string options *KeeperOptions } // KeeperOptions provides configuration options for encryption/decryption operations. type KeeperOptions struct { // Algorithm sets the encryption algorithm used. // Defaults to "RSA-OAEP-256". // See https://docs.microsoft.com/en-us/rest/api/keyvault/encrypt/encrypt#jsonwebkeyencryptionalgorithm // for more details. Algorithm azkeys.JSONWebKeyEncryptionAlgorithm // EncryptOptions are passed through to Encrypt. EncryptOptions *azkeys.EncryptOptions // DecryptOptions are passed through to Decrypt. DecryptOptions *azkeys.DecryptOptions } // DefaultClientMaker returns a function that constructs a KeyVault Client. // By default it uses credentials from the environment; // See https://docs.microsoft.com/en-us/go/azure/azure-sdk-go-authorization#use-environment-based-authentication. // If the environment variable AZURE_KEYVAULT_AUTH_VIA_CLI is set to a truthy value, it // uses credentials from the Azure CLI instead. func DefaultClientMaker(keyVaultURI string) (*azkeys.Client, error) { creds, err := azidentity.NewDefaultAzureCredential(nil) if err != nil { return nil, err } return azkeys.NewClient(keyVaultURI, creds, &azkeys.ClientOptions{ ClientOptions: policy.ClientOptions{ Telemetry: policy.TelemetryOptions{ ApplicationID: useragent.AzureUserAgentPrefix("secrets"), }, }, }) } // Note that the last binding may be just a key, or key/version. var keyIDRE = regexp.MustCompile(`^(https://.+\.vault\.(?:[a-z\d-.]+)/)keys/(.+)$`) // OpenKeeper returns a *secrets.Keeper that uses Azure keyVault. // // clientMaker is used to construct an azkeys.Client. // // keyID is a Azure Key Vault key identifier like "https://{keyvault-name}.vault.azure.net/keys/{key-name}/{key-version}". // The "/{key-version}" suffix is optional; it defaults to the latest version. // See https://docs.microsoft.com/en-us/azure/key-vault/about-keys-secrets-and-certificates // for more details. func OpenKeeper(clientMaker ClientMakerT, keyID string, opts *KeeperOptions) (*secrets.Keeper, error) { drv, err := openKeeper(clientMaker, keyID, opts) if err != nil { return nil, err } return secrets.NewKeeper(drv), nil } func openKeeper(clientMaker ClientMakerT, keyID string, opts *KeeperOptions) (*keeper, error) { if opts == nil { opts = &KeeperOptions{} } if opts.Algorithm == "" { opts.Algorithm = azkeys.JSONWebKeyEncryptionAlgorithmRSAOAEP256 } matches := keyIDRE.FindStringSubmatch(keyID) if len(matches) != 3 { return nil, fmt.Errorf("invalid keyID %q; must match %v %v", keyID, keyIDRE, matches) } // matches[0] is the whole keyID, [1] is the keyVaultURI, and [2] is the key or the key/version. keyVaultURI := matches[1] parts := strings.SplitN(matches[2], "/", 2) keyName := parts[0] var keyVersion string if len(parts) > 1 { keyVersion = parts[1] } client, err := clientMaker(keyVaultURI) if err != nil { return nil, err } return &keeper{ client: client, keyVaultURI: keyVaultURI, keyName: keyName, keyVersion: keyVersion, options: opts, }, nil } // Encrypt encrypts the plaintext into a ciphertext. func (k *keeper) Encrypt(ctx context.Context, plaintext []byte) ([]byte, error) { keyOpsResult, err := k.client.Encrypt(ctx, k.keyName, k.keyVersion, azkeys.KeyOperationsParameters{ Algorithm: &k.options.Algorithm, Value: plaintext, }, k.options.EncryptOptions) if err != nil { return nil, err } return keyOpsResult.Result, nil } // Decrypt decrypts the ciphertext into a plaintext. func (k *keeper) Decrypt(ctx context.Context, ciphertext []byte) ([]byte, error) { keyOpsResult, err := k.client.Decrypt(ctx, k.keyName, k.keyVersion, azkeys.KeyOperationsParameters{ Algorithm: &k.options.Algorithm, Value: ciphertext, }, k.options.DecryptOptions) if err != nil { return nil, err } return keyOpsResult.Result, nil } // Close implements driver.Keeper.Close. func (k *keeper) Close() error { return nil } // ErrorAs implements driver.Keeper.ErrorAs. func (k *keeper) ErrorAs(err error, i any) bool { return errors.As(err, i) } // ErrorCode implements driver.ErrorCode. func (k *keeper) ErrorCode(err error) gcerrors.ErrorCode { re, ok := err.(*azcore.ResponseError) if !ok { return gcerr.Unknown } ec, ok := errorCodeMap[re.StatusCode] if !ok { return gcerr.Unknown } return ec } ================================================ FILE: secrets/azurekeyvault/akv_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package azurekeyvault import ( "context" "errors" "log" "os" "testing" "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azidentity" "github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys" "gocloud.dev/internal/testing/setup" "gocloud.dev/internal/useragent" "gocloud.dev/secrets" "gocloud.dev/secrets/driver" "gocloud.dev/secrets/drivertest" ) // Prerequisites for --record mode // // 1. Sign-in to your Azure Subscription at http://portal.azure.com. // // 2. Create a KeyVault, see // https://docs.microsoft.com/en-us/azure/key-vault/quick-create-portal. // // 3. Choose an authentication model. This test uses Service Principal, see // https://docs.microsoft.com/en-us/rest/api/azure/index#register-your-client-application-with-azure-ad. // For documentation on acceptable auth models, see // https://docs.microsoft.com/en-us/azure/key-vault/key-vault-whatis. // // 4. Set your environment variables depending on the auth model selection. // Modify helper initEnv() as needed. // For Service Principal, please set the following, see // https://docs.microsoft.com/en-us/go/azure/azure-sdk-go-authorization. // // - AZURE_TENANT_ID: Go to "Azure Active Directory", then "Properties". The // "Directory ID" property is your AZURE_TENANT_ID. // - AZURE_CLIENT_ID: Go to "Azure Active Directory", then "App Registrations", // then "View all applications". The "Application ID" column shows your // AZURE_CLIENT_ID. // - AZURE_CLIENT_SECRET: Click on the application from the previous step, // then "Settings" and then "Keys". Create a key and use it as your // AZURE_CLIENT_SECRET. Make sure to save the value as it's hidden after // the initial creation. // - AZURE_ENVIRONMENT: (optional). // - AZURE_AD_RESOURCE: (optional). // // 5. Create/Import a Key. This can be done in the Azure Portal under "Key vaults". // // 6. Update constants below to match your Azure KeyVault settings. const ( keyID1 = "https://go-cdk.vault.azure.net/keys/test1" keyID2 = "https://go-cdk.vault.azure.net/keys/test2" ) type harness struct { clientMaker ClientMakerT close func() } func (h *harness) MakeDriver(ctx context.Context) (driver.Keeper, driver.Keeper, error) { keeper1, err := openKeeper(h.clientMaker, keyID1, nil) if err != nil { return nil, nil, err } keeper2, err := openKeeper(h.clientMaker, keyID2, nil) if err != nil { return nil, nil, err } return keeper1, keeper2, nil } func (h *harness) Close() { h.close() } type dummyToken struct{} func (*dummyToken) GetToken(ctx context.Context, opts policy.TokenRequestOptions) (azcore.AccessToken, error) { return azcore.AccessToken{}, nil } func newHarness(ctx context.Context, t *testing.T) (drivertest.Harness, error) { t.Helper() httpClient, done := setup.NewAzureKeyVaultTestClient(ctx, t) clientMaker := func(keyVaultURI string) (*azkeys.Client, error) { var creds azcore.TokenCredential var err error if *setup.Record { initEnv() creds, err = azidentity.NewEnvironmentCredential(nil) } else { creds = &dummyToken{} } if err != nil { return nil, err } return azkeys.NewClient(keyVaultURI, creds, &azkeys.ClientOptions{ ClientOptions: policy.ClientOptions{ Transport: httpClient, Telemetry: policy.TelemetryOptions{ ApplicationID: useragent.AzureUserAgentPrefix("secrets"), }, }, }) } return &harness{ clientMaker: clientMaker, close: done, }, nil } func initEnv() { // For Client Credentials authorization, set AZURE_TENANT_ID, AZURE_CLIENT_ID, AZURE_CLIENT_SECRET // For Client Certificate and Azure Managed Service Identity, see doc below for help // https://github.com/Azure/azure-sdk-for-go if os.Getenv("AZURE_TENANT_ID") == "" || os.Getenv("AZURE_CLIENT_ID") == "" || os.Getenv("AZURE_CLIENT_SECRET") == "" { log.Fatal("Missing environment for recording tests, set AZURE_TENANT_ID, AZURE_CLIENT_ID and AZURE_CLIENT_SECRET") } os.Setenv("AZURE_ENVIRONMENT", "AzurePublicCloud") os.Setenv("AZURE_AD_RESOURCE", "https://vault.azure.net") } func TestConformance(t *testing.T) { drivertest.RunConformanceTests(t, newHarness, []drivertest.AsTest{verifyAs{}}) } type verifyAs struct{} func (v verifyAs) Name() string { return "verify As function" } func (v verifyAs) ErrorCheck(k *secrets.Keeper, err error) error { var e *azcore.ResponseError if !k.ErrorAs(err, &e) { return errors.New("Keeper.ErrorAs failed") } return nil } // Key Vault-specific tests. func dummyClientMaker(s string) (*azkeys.Client, error) { return &azkeys.Client{}, nil } func TestOpenKeeper(t *testing.T) { tests := []struct { URL string WantErr bool }{ // OK. {"azurekeyvaultdummy://mykeyvault.vault.azure.net/keys/mykey/myversion", false}, // No version -> OK. {"azurekeyvaultdummy://mykeyvault.vault.azure.net/keys/mykey", false}, // Setting algorithm query param -> OK. {"azurekeyvaultdummy://mykeyvault.vault.azure.net/keys/mykey/myversion?algorithm=RSA-OAEP", false}, // Invalid query parameter. {"azurekeyvaultdummy://mykeyvault.vault.azure.net/keys/mykey/myversion?param=value", true}, // Missing key vault name. {"azurekeyvaultdummy:///vault.azure.net/keys/mykey/myversion", true}, // Missing "keys". {"azurekeyvaultdummy://mykeyvault.vault.azure.net/mykey/myversion", true}, } secrets.DefaultURLMux().RegisterKeeper(Scheme+"dummy", &URLOpener{ClientMaker: dummyClientMaker}) ctx := context.Background() for _, test := range tests { keeper, err := secrets.OpenKeeper(ctx, test.URL) if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } if err == nil { if err = keeper.Close(); err != nil { t.Errorf("%s: got error during close: %v", test.URL, err) } } } } func TestKeyIDRE(t *testing.T) { testCases := []struct { // input keyID string // output keyVaultURI string keyName string keyVersion string }{ { keyID: keyID1, keyVaultURI: "https://go-cdk.vault.azure.net/", keyName: "test1", }, { keyID: keyID2, keyVaultURI: "https://go-cdk.vault.azure.net/", keyName: "test2", }, { keyID: "https://mykeyvault.vault.azure.net/keys/mykey/myversion", keyVaultURI: "https://mykeyvault.vault.azure.net/", keyName: "mykey", keyVersion: "myversion", }, { keyID: "https://mykeyvault.vault.usgovcloudapi.net/keys/mykey/myversion", keyVaultURI: "https://mykeyvault.vault.usgovcloudapi.net/", keyName: "mykey", keyVersion: "myversion", }, { keyID: "https://mykeyvault.vault.region01.external.com/keys/mykey/myversion", keyVaultURI: "https://mykeyvault.vault.region01.external.com/", keyName: "mykey", keyVersion: "myversion", }, } for _, testCase := range testCases { t.Run(testCase.keyID, func(t *testing.T) { k, err := openKeeper(dummyClientMaker, testCase.keyID, nil) if err != nil { t.Fatal(err) } defer k.Close() if k.keyVaultURI != testCase.keyVaultURI { t.Errorf("got key vault URI %s, want key vault URI %s", k.keyVaultURI, testCase.keyVaultURI) } if k.keyName != testCase.keyName { t.Errorf("got key name %s, want key name %s", k.keyName, testCase.keyName) } if k.keyVersion != testCase.keyVersion { t.Errorf("got key version %s, want key version %s", k.keyVersion, testCase.keyVersion) } }) } } ================================================ FILE: secrets/azurekeyvault/example_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package azurekeyvault_test import ( "context" "log" "gocloud.dev/secrets" "gocloud.dev/secrets/azurekeyvault" ) func ExampleOpenKeeper() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // Makes a client to use with the Azure KeyVault API, using default // authorization from the environment. clientMaker := azurekeyvault.DefaultClientMaker // Construct a *secrets.Keeper. keeper, err := azurekeyvault.OpenKeeper(clientMaker, "https://mykeyvaultname.vault.azure.net/keys/mykeyname", nil) if err != nil { log.Fatal(err) } defer keeper.Close() } func Example_openFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/secrets/azurekeyvault" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // The "azurekeyvault" URL scheme is replaced with "https" to construct an Azure // Key Vault keyID, as described in https://docs.microsoft.com/en-us/azure/key-vault/about-keys-secrets-and-certificates. // You can add an optional "/{key-version}" to the path to use a specific // version of the key; it defaults to the latest version. keeper, err := secrets.OpenKeeper(ctx, "azurekeyvault://mykeyvaultname.vault.azure.net/keys/mykeyname") if err != nil { log.Fatal(err) } defer keeper.Close() } ================================================ FILE: secrets/azurekeyvault/testdata/TestConformance/TestAs/verify_As_function.replay ================================================ { "Initial": "AQAAAA7dVMEbCwTv+wAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": null, "RemoveParams": [ "^se$", "^sig$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "58fd13a457084159", "Request": { "Method": "POST", "URL": "https://go-cdk.vault.azure.net/keys/test1/decrypt?api-version=7.4", "Header": { "Accept": [ "application/json" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 401, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache" ], "Content-Length": [ "97" ], "Content-Type": [ "application/json; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:08:59 GMT" ], "Expires": [ "-1" ], "Pragma": [ "no-cache" ], "Strict-Transport-Security": [ "max-age=31536000;includeSubDomains" ], "Www-Authenticate": [ "Bearer authorization=\"https://login.microsoftonline.com/db44ed8f-85f7-4f22-b378-3bb9fa3d62ff\", resource=\"https://vault.azure.net\"" ], "X-Content-Type-Options": [ "nosniff" ], "X-Ms-Keyvault-Network-Info": [ "conn_type=Ipv4;addr=34.125.120.109;act_addr_fam=InterNetwork;" ], "X-Ms-Keyvault-Region": [ "centralus" ], "X-Ms-Keyvault-Service-Version": [ "1.9.1222.3" ], "X-Ms-Request-Id": [ "9199ed18-249b-4b1d-9bf4-bf5325597cc5" ] }, "Body": "eyJlcnJvciI6eyJjb2RlIjoiVW5hdXRob3JpemVkIiwibWVzc2FnZSI6IkFLVjEwMDAwOiBSZXF1ZXN0IGlzIG1pc3NpbmcgYSBCZWFyZXIgb3IgUG9QIHRva2VuLiJ9fQ==" } }, { "ID": "daaa1dffe23cbf74", "Request": { "Method": "POST", "URL": "https://go-cdk.vault.azure.net/keys/test1/decrypt?api-version=7.4", "Header": { "Accept": [ "application/json" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "65" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJ2YWx1ZSI6ImJXRnNabTl5YldWa0lHTnBjR2hsY2lCdFpYTnpZV2RsIn0=" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache" ], "Content-Length": [ "77" ], "Content-Type": [ "application/json; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:08:59 GMT" ], "Expires": [ "-1" ], "Pragma": [ "no-cache" ], "Strict-Transport-Security": [ "max-age=31536000;includeSubDomains" ], "X-Content-Type-Options": [ "nosniff" ], "X-Ms-Keyvault-Network-Info": [ "conn_type=Ipv4;addr=34.125.120.109;act_addr_fam=InterNetwork;" ], "X-Ms-Keyvault-Region": [ "centralus" ], "X-Ms-Keyvault-Service-Version": [ "1.9.1222.3" ], "X-Ms-Request-Id": [ "17e84fbb-bf5d-4938-b791-7b6db9f054ce" ] }, "Body": "eyJlcnJvciI6eyJjb2RlIjoiQmFkUGFyYW1ldGVyIiwibWVzc2FnZSI6IlRoZSBwYXJhbWV0ZXIgaXMgaW5jb3JyZWN0LlxyXG4ifX0=" } } ] } ================================================ FILE: secrets/azurekeyvault/testdata/TestConformance/TestAs/verify_As_returns_false_when_passed_nil.replay ================================================ { "Initial": "AQAAAA7dVMEbM63tVgAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": null, "RemoveParams": [ "^se$", "^sig$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "4058cc12804ced9d", "Request": { "Method": "POST", "URL": "https://go-cdk.vault.azure.net/keys/test1/decrypt?api-version=7.4", "Header": { "Accept": [ "application/json" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 401, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache" ], "Content-Length": [ "97" ], "Content-Type": [ "application/json; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:08:59 GMT" ], "Expires": [ "-1" ], "Pragma": [ "no-cache" ], "Strict-Transport-Security": [ "max-age=31536000;includeSubDomains" ], "Www-Authenticate": [ "Bearer authorization=\"https://login.microsoftonline.com/db44ed8f-85f7-4f22-b378-3bb9fa3d62ff\", resource=\"https://vault.azure.net\"" ], "X-Content-Type-Options": [ "nosniff" ], "X-Ms-Keyvault-Network-Info": [ "conn_type=Ipv4;addr=34.125.120.109;act_addr_fam=InterNetwork;" ], "X-Ms-Keyvault-Region": [ "centralus" ], "X-Ms-Keyvault-Service-Version": [ "1.9.1222.3" ], "X-Ms-Request-Id": [ "dcc99886-c4e7-4b3f-aa9c-d4b9a697ca73" ] }, "Body": "eyJlcnJvciI6eyJjb2RlIjoiVW5hdXRob3JpemVkIiwibWVzc2FnZSI6IkFLVjEwMDAwOiBSZXF1ZXN0IGlzIG1pc3NpbmcgYSBCZWFyZXIgb3IgUG9QIHRva2VuLiJ9fQ==" } }, { "ID": "245836b218a7f2f0", "Request": { "Method": "POST", "URL": "https://go-cdk.vault.azure.net/keys/test1/decrypt?api-version=7.4", "Header": { "Accept": [ "application/json" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "65" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJ2YWx1ZSI6ImJXRnNabTl5YldWa0lHTnBjR2hsY2lCdFpYTnpZV2RsIn0=" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache" ], "Content-Length": [ "77" ], "Content-Type": [ "application/json; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:09:00 GMT" ], "Expires": [ "-1" ], "Pragma": [ "no-cache" ], "Strict-Transport-Security": [ "max-age=31536000;includeSubDomains" ], "X-Content-Type-Options": [ "nosniff" ], "X-Ms-Keyvault-Network-Info": [ "conn_type=Ipv4;addr=34.125.120.109;act_addr_fam=InterNetwork;" ], "X-Ms-Keyvault-Region": [ "centralus" ], "X-Ms-Keyvault-Service-Version": [ "1.9.1222.3" ], "X-Ms-Request-Id": [ "f60eed33-6ebd-4096-8693-52221073c614" ] }, "Body": "eyJlcnJvciI6eyJjb2RlIjoiQmFkUGFyYW1ldGVyIiwibWVzc2FnZSI6IlRoZSBwYXJhbWV0ZXIgaXMgaW5jb3JyZWN0LlxyXG4ifX0=" } } ] } ================================================ FILE: secrets/azurekeyvault/testdata/TestConformance/TestDecryptMalformedError.replay ================================================ { "Initial": "AQAAAA7dVMEaFcsrgQAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": null, "RemoveParams": [ "^se$", "^sig$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "d7ee2ce4ed097975", "Request": { "Method": "POST", "URL": "https://go-cdk.vault.azure.net/keys/test1/encrypt?api-version=7.4", "Header": { "Accept": [ "application/json" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 401, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache" ], "Content-Length": [ "97" ], "Content-Type": [ "application/json; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:08:57 GMT" ], "Expires": [ "-1" ], "Pragma": [ "no-cache" ], "Strict-Transport-Security": [ "max-age=31536000;includeSubDomains" ], "Www-Authenticate": [ "Bearer authorization=\"https://login.microsoftonline.com/db44ed8f-85f7-4f22-b378-3bb9fa3d62ff\", resource=\"https://vault.azure.net\"" ], "X-Content-Type-Options": [ "nosniff" ], "X-Ms-Keyvault-Network-Info": [ "conn_type=Ipv4;addr=34.125.120.109;act_addr_fam=InterNetwork;" ], "X-Ms-Keyvault-Region": [ "centralus" ], "X-Ms-Keyvault-Service-Version": [ "1.9.1222.3" ], "X-Ms-Request-Id": [ "80fd7f85-dbd3-4324-b2a7-9f18da51ca71" ] }, "Body": "eyJlcnJvciI6eyJjb2RlIjoiVW5hdXRob3JpemVkIiwibWVzc2FnZSI6IkFLVjEwMDAwOiBSZXF1ZXN0IGlzIG1pc3NpbmcgYSBCZWFyZXIgb3IgUG9QIHRva2VuLiJ9fQ==" } }, { "ID": "929b5a4aac22a498", "Request": { "Method": "POST", "URL": "https://go-cdk.vault.azure.net/keys/test1/encrypt?api-version=7.4", "Header": { "Accept": [ "application/json" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "61" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJ2YWx1ZSI6IlNTZHRJR0VnYzJWamNtVjBJRzFsYzNOaFoyVWgifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache" ], "Content-Length": [ "437" ], "Content-Type": [ "application/json; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:08:58 GMT" ], "Expires": [ "-1" ], "Pragma": [ "no-cache" ], "Strict-Transport-Security": [ "max-age=31536000;includeSubDomains" ], "X-Content-Type-Options": [ "nosniff" ], "X-Ms-Keyvault-Network-Info": [ "conn_type=Ipv4;addr=34.125.120.109;act_addr_fam=InterNetwork;" ], "X-Ms-Keyvault-Region": [ "centralus" ], "X-Ms-Keyvault-Service-Version": [ "1.9.1222.3" ], "X-Ms-Request-Id": [ "1da28445-d926-47ed-9b22-f5c6e223408c" ] }, "Body": "eyJraWQiOiJodHRwczovL2dvLWNkay52YXVsdC5henVyZS5uZXQva2V5cy90ZXN0MS9iM2IzMWYyOTIyNjI0ZTFkYTdhNDJlNGQwNGQ0NDExMCIsInZhbHVlIjoiUlNOSjdlMGpvVjNiMkQwSXBUdVEzTERZUnYxQW5tVFFHa2E3NXR0emp4QXVqLURXSlFkSVNnVnhiMTZtYzYxZ1RwYVdLaFlfZWxGaGdJNkRjR0pzVXpCN20wYmpHR1pzbG5veG1oci0wV1Qtc1RZN3JCY1JNRGNwc3gybFdfZVpmZVh1YkNGbkN0Ym16TUlCNzczZlRMekJxT1JQbHRVX3IzVmEtM2liWW1Xdl9QNjNmdUpXUl9kMzQ0MGtjTmN6ZDFobk1YYkZjMks0MjdZU1Z3Sm52aXh0a1cwVnF3WnJZLXJLdkgwc2cyQ2xPWVlSOGlLTXlLb3JvSk9OUENnWXlMRVhiMzR4ZjJxNVBVNWlYQ2F4MUVIei1uQlhBQkFGb3p1R1JGVWl2TnlzU3RxOTk3R1pjWXphbUJjam1CeER6Q0w0OUNieFdfQUZqR2FHd2R3Y213In0=" } }, { "ID": "e27b45f1d82345a0", "Request": { "Method": "POST", "URL": "https://go-cdk.vault.azure.net/keys/test1/decrypt?api-version=7.4", "Header": { "Accept": [ "application/json" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "375" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJ2YWx1ZSI6IlJpTko3ZTBqb1YzYjJEMElwVHVRM0xEWVJ2MUFubVRRR2thNzV0dHpqeEF1ai1EV0pRZElTZ1Z4YjE2bWM2MWdUcGFXS2hZX2VsRmhnSTZEY0dKc1V6QjdtMGJqR0dac2xub3htaHItMFdULXNUWTdyQmNSTURjcHN4MmxXX2VaZmVYdWJDRm5DdGJtek1JQjc3M2ZUTHpCcU9SUGx0VV9yM1ZhLTNpYlltV3ZfUDYzZnVKV1JfZDM0NDBrY05jemQxaG5NWGJGYzJLNDI3WVNWd0pudml4dGtXMFZxd1pyWS1yS3ZIMHNnMkNsT1lZUjhpS015S29yb0pPTlBDZ1l5TEVYYjM0eGYycTVQVTVpWENheDFFSHotbkJYQUJBRm96dUdSRlVpdk55c1N0cTk5N0daY1l6YW1CY2ptQnhEekNMNDlDYnhXX0FGakdhR3dkd2NtdyJ9" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache" ], "Content-Length": [ "77" ], "Content-Type": [ "application/json; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:08:58 GMT" ], "Expires": [ "-1" ], "Pragma": [ "no-cache" ], "Strict-Transport-Security": [ "max-age=31536000;includeSubDomains" ], "X-Content-Type-Options": [ "nosniff" ], "X-Ms-Keyvault-Network-Info": [ "conn_type=Ipv4;addr=34.125.120.109;act_addr_fam=InterNetwork;" ], "X-Ms-Keyvault-Region": [ "centralus" ], "X-Ms-Keyvault-Service-Version": [ "1.9.1222.3" ], "X-Ms-Request-Id": [ "d1dc95e0-b0ba-445d-b206-51b66a946688" ] }, "Body": "eyJlcnJvciI6eyJjb2RlIjoiQmFkUGFyYW1ldGVyIiwibWVzc2FnZSI6IlRoZSBwYXJhbWV0ZXIgaXMgaW5jb3JyZWN0LlxyXG4ifX0=" } }, { "ID": "eaca3d529096aec8", "Request": { "Method": "POST", "URL": "https://go-cdk.vault.azure.net/keys/test1/decrypt?api-version=7.4", "Header": { "Accept": [ "application/json" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "373" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJ2YWx1ZSI6IlJVbnQ3U09oWGR2WVBRaWxPNURjc05oR19VQ2VaTkFhUnJ2bTIzT1BFQzZQNE5ZbEIwaEtCWEZ2WHFaenJXQk9scFlxRmo5NlVXR0Fqb053WW14VE1IdWJSdU1ZWm15V2VqR2FHdjdSWlA2eE5qdXNGeEV3TnltekhhVmI5NWw5NWU1c0lXY0sxdWJNd2dIdnZkOU12TUdvNUUtVzFULXZkVnI3ZUp0aVphXzhfcmQtNGxaSDkzZmpqU1J3MXpOM1dHY3hkc1Z6WXJqYnRoSlhBbWUtTEcyUmJSV3JCbXRqNnNxOGZTeURZS1U1aGhIeUlveklxaXVnazQwOEtCaklzUmR2ZmpGX2FyazlUbUpjSnJIVVFmUDZjRmNBRUFXak80WkVWU0s4M0t4SzJyMzNzWmx4ak5xWUZ5T1lIRVBNSXZqMEp2RmI4QVdNWm9iQjNCeWIifQ==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache" ], "Content-Length": [ "77" ], "Content-Type": [ "application/json; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:08:58 GMT" ], "Expires": [ "-1" ], "Pragma": [ "no-cache" ], "Strict-Transport-Security": [ "max-age=31536000;includeSubDomains" ], "X-Content-Type-Options": [ "nosniff" ], "X-Ms-Keyvault-Network-Info": [ "conn_type=Ipv4;addr=34.125.120.109;act_addr_fam=InterNetwork;" ], "X-Ms-Keyvault-Region": [ "centralus" ], "X-Ms-Keyvault-Service-Version": [ "1.9.1222.3" ], "X-Ms-Request-Id": [ "07916469-dbeb-4cfb-829b-4f7a8c14b74d" ] }, "Body": "eyJlcnJvciI6eyJjb2RlIjoiQmFkUGFyYW1ldGVyIiwibWVzc2FnZSI6IlRoZSBwYXJhbWV0ZXIgaXMgaW5jb3JyZWN0LlxyXG4ifX0=" } }, { "ID": "b4a4e6b6b5166004", "Request": { "Method": "POST", "URL": "https://go-cdk.vault.azure.net/keys/test1/decrypt?api-version=7.4", "Header": { "Accept": [ "application/json" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "373" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJ2YWx1ZSI6IlJTTko3ZTBqb1YzYjJEMElwVHVRM0xEWVJ2MUFubVRRR2thNzV0dHpqeEF1ai1EV0pRZElTZ1Z4YjE2bWM2MWdUcGFXS2hZX2VsRmhnSTZEY0dKc1V6QjdtMGJqR0dac2xub3htaHItMFdULXNUWTdyQmNSTURjcHN4MmxXX2VaZmVYdWJDRm5DdGJtek1JQjc3M2ZUTHpCcU9SUGx0VV9yM1ZhLTNpYlltV3ZfUDYzZnVKV1JfZDM0NDBrY05jemQxaG5NWGJGYzJLNDI3WVNWd0pudml4dGtXMFZxd1pyWS1yS3ZIMHNnMkNsT1lZUjhpS015S29yb0pPTlBDZ1l5TEVYYjM0eGYycTVQVTVpWENheDFFSHotbkJYQUJBRm96dUdSRlVpdk55c1N0cTk5N0daY1l6YW1CY2ptQnhEekNMNDlDYnhXX0FGakdhR3dkeWEifQ==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache" ], "Content-Length": [ "77" ], "Content-Type": [ "application/json; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:08:58 GMT" ], "Expires": [ "-1" ], "Pragma": [ "no-cache" ], "Strict-Transport-Security": [ "max-age=31536000;includeSubDomains" ], "X-Content-Type-Options": [ "nosniff" ], "X-Ms-Keyvault-Network-Info": [ "conn_type=Ipv4;addr=34.125.120.109;act_addr_fam=InterNetwork;" ], "X-Ms-Keyvault-Region": [ "centralus" ], "X-Ms-Keyvault-Service-Version": [ "1.9.1222.3" ], "X-Ms-Request-Id": [ "cbaae157-d70e-456e-a0ff-e28ef920417d" ] }, "Body": "eyJlcnJvciI6eyJjb2RlIjoiQmFkUGFyYW1ldGVyIiwibWVzc2FnZSI6IlRoZSBwYXJhbWV0ZXIgaXMgaW5jb3JyZWN0LlxyXG4ifX0=" } } ] } ================================================ FILE: secrets/azurekeyvault/testdata/TestConformance/TestEncryptDecrypt.replay ================================================ { "Initial": "AQAAAA7dVMEWMy+KVQAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": null, "RemoveParams": [ "^se$", "^sig$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "4a0fc5db318bcea5", "Request": { "Method": "POST", "URL": "https://go-cdk.vault.azure.net/keys/test1/encrypt?api-version=7.4", "Header": { "Accept": [ "application/json" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 401, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache" ], "Content-Length": [ "97" ], "Content-Type": [ "application/json; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:08:55 GMT" ], "Expires": [ "-1" ], "Pragma": [ "no-cache" ], "Strict-Transport-Security": [ "max-age=31536000;includeSubDomains" ], "Www-Authenticate": [ "Bearer authorization=\"https://login.microsoftonline.com/db44ed8f-85f7-4f22-b378-3bb9fa3d62ff\", resource=\"https://vault.azure.net\"" ], "X-Content-Type-Options": [ "nosniff" ], "X-Ms-Keyvault-Network-Info": [ "conn_type=Ipv4;addr=34.125.120.109;act_addr_fam=InterNetwork;" ], "X-Ms-Keyvault-Region": [ "centralus" ], "X-Ms-Keyvault-Service-Version": [ "1.9.1222.3" ], "X-Ms-Request-Id": [ "e00ef750-5277-4136-b0d8-c1056ada6a49" ] }, "Body": "eyJlcnJvciI6eyJjb2RlIjoiVW5hdXRob3JpemVkIiwibWVzc2FnZSI6IkFLVjEwMDAwOiBSZXF1ZXN0IGlzIG1pc3NpbmcgYSBCZWFyZXIgb3IgUG9QIHRva2VuLiJ9fQ==" } }, { "ID": "7b07511562d59aa4", "Request": { "Method": "POST", "URL": "https://go-cdk.vault.azure.net/keys/test1/encrypt?api-version=7.4", "Header": { "Accept": [ "application/json" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "61" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJ2YWx1ZSI6IlNTZHRJR0VnYzJWamNtVjBJRzFsYzNOaFoyVWgifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache" ], "Content-Length": [ "437" ], "Content-Type": [ "application/json; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:08:55 GMT" ], "Expires": [ "-1" ], "Pragma": [ "no-cache" ], "Strict-Transport-Security": [ "max-age=31536000;includeSubDomains" ], "X-Content-Type-Options": [ "nosniff" ], "X-Ms-Keyvault-Network-Info": [ "conn_type=Ipv4;addr=34.125.120.109;act_addr_fam=InterNetwork;" ], "X-Ms-Keyvault-Region": [ "centralus" ], "X-Ms-Keyvault-Service-Version": [ "1.9.1222.3" ], "X-Ms-Request-Id": [ "30d1805f-2f50-4365-b90f-917a30072462" ] }, "Body": "eyJraWQiOiJodHRwczovL2dvLWNkay52YXVsdC5henVyZS5uZXQva2V5cy90ZXN0MS9iM2IzMWYyOTIyNjI0ZTFkYTdhNDJlNGQwNGQ0NDExMCIsInZhbHVlIjoiTG41dVZ5VHY1dHhmdF9wWE80cFJKbklBQXJ5eVZYazF2N21jUzdoSkpvTW0wTGg0NEg2UnREczVXcDZvazQzTXpRdW1DbEhDZnJQSGhqQ0xIZEIyWVl5X2tPWFhNRUdMTDVGdEJCOWJEeThZN0RZVkZsUzhTUnJKTVZ0YjJYTm5TMjZyZEF6d1dWVU1rQ2V0VDIzamNxZ1NhRHUxSHZwV1BYZUhRLUZMWW5ubHlpd0lheldoQkU5b2FoNjVLRUROaDFFclBZQXpETzA1bWtucVJsUVRJaE5faFVKRFRyMFZ1Ukl2cWJVeWp1Z3dwNi1tSjdNd0R4dDBjVDExcHk2WkJwdk1BMTZxV09PTV8yZWFjTi1pM3E1NlRsdElQQ2FMVFZvUTUxcXdTSTd4TzZWTnAxTTl4d1hRN282M0tsQzIyZWpUNl9XTTdEQ1ZlR09rbFVGalN3In0=" } }, { "ID": "0e4fac0d75eabb41", "Request": { "Method": "POST", "URL": "https://go-cdk.vault.azure.net/keys/test1/decrypt?api-version=7.4", "Header": { "Accept": [ "application/json" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "375" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJ2YWx1ZSI6IkxuNXVWeVR2NXR4ZnRfcFhPNHBSSm5JQUFyeXlWWGsxdjdtY1M3aEpKb01tMExoNDRINlJ0RHM1V3A2b2s0M016UXVtQ2xIQ2ZyUEhoakNMSGRCMllZeV9rT1hYTUVHTEw1RnRCQjliRHk4WTdEWVZGbFM4U1JySk1WdGIyWE5uUzI2cmRBendXVlVNa0NldFQyM2pjcWdTYUR1MUh2cFdQWGVIUS1GTFlubmx5aXdJYXpXaEJFOW9haDY1S0VETmgxRXJQWUF6RE8wNW1rbnFSbFFUSWhOX2hVSkRUcjBWdVJJdnFiVXlqdWd3cDYtbUo3TXdEeHQwY1QxMXB5NlpCcHZNQTE2cVdPT01fMmVhY04taTNxNTZUbHRJUENhTFRWb1E1MXF3U0k3eE82Vk5wMU05eHdYUTdvNjNLbEMyMmVqVDZfV003RENWZUdPa2xVRmpTdyJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache" ], "Content-Length": [ "123" ], "Content-Type": [ "application/json; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:08:55 GMT" ], "Expires": [ "-1" ], "Pragma": [ "no-cache" ], "Strict-Transport-Security": [ "max-age=31536000;includeSubDomains" ], "X-Content-Type-Options": [ "nosniff" ], "X-Ms-Keyvault-Network-Info": [ "conn_type=Ipv4;addr=34.125.120.109;act_addr_fam=InterNetwork;" ], "X-Ms-Keyvault-Region": [ "centralus" ], "X-Ms-Keyvault-Service-Version": [ "1.9.1222.3" ], "X-Ms-Request-Id": [ "c9a6d604-8e08-4626-a5fb-81fa1e501ae0" ] }, "Body": "eyJraWQiOiJodHRwczovL2dvLWNkay52YXVsdC5henVyZS5uZXQva2V5cy90ZXN0MS9iM2IzMWYyOTIyNjI0ZTFkYTdhNDJlNGQwNGQ0NDExMCIsInZhbHVlIjoiU1NkdElHRWdjMlZqY21WMElHMWxjM05oWjJVaCJ9" } } ] } ================================================ FILE: secrets/azurekeyvault/testdata/TestConformance/TestMultipleEncryptionsNotEqual.replay ================================================ { "Initial": "AQAAAA7dVMEYB0xRvAAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": null, "RemoveParams": [ "^se$", "^sig$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "87cfa126e83fba4c", "Request": { "Method": "POST", "URL": "https://go-cdk.vault.azure.net/keys/test1/encrypt?api-version=7.4", "Header": { "Accept": [ "application/json" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 401, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache" ], "Content-Length": [ "97" ], "Content-Type": [ "application/json; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:08:55 GMT" ], "Expires": [ "-1" ], "Pragma": [ "no-cache" ], "Strict-Transport-Security": [ "max-age=31536000;includeSubDomains" ], "Www-Authenticate": [ "Bearer authorization=\"https://login.microsoftonline.com/db44ed8f-85f7-4f22-b378-3bb9fa3d62ff\", resource=\"https://vault.azure.net\"" ], "X-Content-Type-Options": [ "nosniff" ], "X-Ms-Keyvault-Network-Info": [ "conn_type=Ipv4;addr=34.125.120.109;act_addr_fam=InterNetwork;" ], "X-Ms-Keyvault-Region": [ "centralus" ], "X-Ms-Keyvault-Service-Version": [ "1.9.1222.3" ], "X-Ms-Request-Id": [ "5c7b2556-617c-467c-bfd1-ec29f132c664" ] }, "Body": "eyJlcnJvciI6eyJjb2RlIjoiVW5hdXRob3JpemVkIiwibWVzc2FnZSI6IkFLVjEwMDAwOiBSZXF1ZXN0IGlzIG1pc3NpbmcgYSBCZWFyZXIgb3IgUG9QIHRva2VuLiJ9fQ==" } }, { "ID": "595c75ecf07ca8fe", "Request": { "Method": "POST", "URL": "https://go-cdk.vault.azure.net/keys/test1/encrypt?api-version=7.4", "Header": { "Accept": [ "application/json" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "61" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJ2YWx1ZSI6IlNTZHRJR0VnYzJWamNtVjBJRzFsYzNOaFoyVWgifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache" ], "Content-Length": [ "437" ], "Content-Type": [ "application/json; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:08:56 GMT" ], "Expires": [ "-1" ], "Pragma": [ "no-cache" ], "Strict-Transport-Security": [ "max-age=31536000;includeSubDomains" ], "X-Content-Type-Options": [ "nosniff" ], "X-Ms-Keyvault-Network-Info": [ "conn_type=Ipv4;addr=34.125.120.109;act_addr_fam=InterNetwork;" ], "X-Ms-Keyvault-Region": [ "centralus" ], "X-Ms-Keyvault-Service-Version": [ "1.9.1222.3" ], "X-Ms-Request-Id": [ "7cdc50ec-abcb-4714-86e1-f7e4f7cb6f81" ] }, "Body": "eyJraWQiOiJodHRwczovL2dvLWNkay52YXVsdC5henVyZS5uZXQva2V5cy90ZXN0MS9iM2IzMWYyOTIyNjI0ZTFkYTdhNDJlNGQwNGQ0NDExMCIsInZhbHVlIjoiSkNlZEhqVGtQNXl3aUgzTk1tNGZ6M1ljX25sdEtyTzlTOFI3eEl2OUU1blJvOWg0a21vR09QQ3FoMEVlT1ZhMGNVa1VfOTZtVVg0U3hjQnR5OWQ1SHBCNUJydHo3cnNpaTVMVEpfanhkMEdIWVhZbXotVnVvcDRzdUZ3eTI2NjF4N0xfX1E1eURVTWpQUGtna1dkRGFzZUJCLWxjRHcyN0poY1pCUFRicHhtRUVaS21kbzdkcDVRVVkzeV9LVEJkR3hycEJyRDBMaE1xNWU0ZEVYZWhDVzRoa21kSTdrZktQTTRzLTA3RThPRXNPbUwwUlZNZTFCNFRqOW5Nemp1NVNKMzVIWl9hUXAxWlBGOWlGMzFNM2dUbFZFOUtINmF5U3B2QTZhWHZTZ0JtQWhFeXZKbklVbGU2Y1d4VXUyVzVnZDVvSW5tT0VUVFVQbXA2NzlHOGVBIn0=" } }, { "ID": "ff577dc86a621d92", "Request": { "Method": "POST", "URL": "https://go-cdk.vault.azure.net/keys/test1/encrypt?api-version=7.4", "Header": { "Accept": [ "application/json" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "61" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJ2YWx1ZSI6IlNTZHRJR0VnYzJWamNtVjBJRzFsYzNOaFoyVWgifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache" ], "Content-Length": [ "437" ], "Content-Type": [ "application/json; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:08:56 GMT" ], "Expires": [ "-1" ], "Pragma": [ "no-cache" ], "Strict-Transport-Security": [ "max-age=31536000;includeSubDomains" ], "X-Content-Type-Options": [ "nosniff" ], "X-Ms-Keyvault-Network-Info": [ "conn_type=Ipv4;addr=34.125.120.109;act_addr_fam=InterNetwork;" ], "X-Ms-Keyvault-Region": [ "centralus" ], "X-Ms-Keyvault-Service-Version": [ "1.9.1222.3" ], "X-Ms-Request-Id": [ "e9384d4a-16b6-4ba9-b135-9ccb9af324c3" ] }, "Body": "eyJraWQiOiJodHRwczovL2dvLWNkay52YXVsdC5henVyZS5uZXQva2V5cy90ZXN0MS9iM2IzMWYyOTIyNjI0ZTFkYTdhNDJlNGQwNGQ0NDExMCIsInZhbHVlIjoiVXBVTmZFbV83VVNEdGNWMW96ZDNkemhfT2hwQ0VuRXpsZ3p6SVo0Z0dIVHd5MWNkWEt1MHRLc2cxYncySDFfSDIyR3llLTd6dW9aTWlRbEZyRnFBUFpBZ3BIUlFZMzFzRENqU01uN1NKdXRVczFqcjc3WERtdWZoS3IzY2tzMUd0UjRfbjhvbF94OGpxZnAwc3ZkczFuMzBDWVduSVV0YlFXY1AzVWRXZmhRMzBZNTJ3WU1kN3NHdmxucU0wNUo1b0M1cUNtX1h1dklCQ09pVTNkYUV0R1VfbzNaT1pHbnZjREdfOW9HaC1sOHBoUWpMRUkydjc1bGtscDg2ajJsMjZ3MnNZLXc2M3p6UGR0MFBvS2lmdGVJRGU5Y1BlYXdLV2gxTkhjb2lWQXhGWFUxUkpKbUplNjlZLTdXNklJTGg1SjFfMzVTR2h5emVHVThiNVl5QnlRIn0=" } }, { "ID": "f888049dd84a6e09", "Request": { "Method": "POST", "URL": "https://go-cdk.vault.azure.net/keys/test1/decrypt?api-version=7.4", "Header": { "Accept": [ "application/json" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "375" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJ2YWx1ZSI6IkpDZWRIalRrUDV5d2lIM05NbTRmejNZY19ubHRLck85UzhSN3hJdjlFNW5SbzloNGttb0dPUENxaDBFZU9WYTBjVWtVXzk2bVVYNFN4Y0J0eTlkNUhwQjVCcnR6N3JzaWk1TFRKX2p4ZDBHSFlYWW16LVZ1b3A0c3VGd3kyNjYxeDdMX19RNXlEVU1qUFBrZ2tXZERhc2VCQi1sY0R3MjdKaGNaQlBUYnB4bUVFWkttZG83ZHA1UVVZM3lfS1RCZEd4cnBCckQwTGhNcTVlNGRFWGVoQ1c0aGttZEk3a2ZLUE00cy0wN0U4T0VzT21MMFJWTWUxQjRUajluTXpqdTVTSjM1SFpfYVFwMVpQRjlpRjMxTTNnVGxWRTlLSDZheVNwdkE2YVh2U2dCbUFoRXl2Sm5JVWxlNmNXeFV1Mlc1Z2Q1b0lubU9FVFRVUG1wNjc5RzhlQSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache" ], "Content-Length": [ "123" ], "Content-Type": [ "application/json; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:08:56 GMT" ], "Expires": [ "-1" ], "Pragma": [ "no-cache" ], "Strict-Transport-Security": [ "max-age=31536000;includeSubDomains" ], "X-Content-Type-Options": [ "nosniff" ], "X-Ms-Keyvault-Network-Info": [ "conn_type=Ipv4;addr=34.125.120.109;act_addr_fam=InterNetwork;" ], "X-Ms-Keyvault-Region": [ "centralus" ], "X-Ms-Keyvault-Service-Version": [ "1.9.1222.3" ], "X-Ms-Request-Id": [ "0c05d67a-d0ad-4f77-bcc8-dfacdb1fd02c" ] }, "Body": "eyJraWQiOiJodHRwczovL2dvLWNkay52YXVsdC5henVyZS5uZXQva2V5cy90ZXN0MS9iM2IzMWYyOTIyNjI0ZTFkYTdhNDJlNGQwNGQ0NDExMCIsInZhbHVlIjoiU1NkdElHRWdjMlZqY21WMElHMWxjM05oWjJVaCJ9" } }, { "ID": "172910236683587b", "Request": { "Method": "POST", "URL": "https://go-cdk.vault.azure.net/keys/test1/decrypt?api-version=7.4", "Header": { "Accept": [ "application/json" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "375" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJ2YWx1ZSI6IlVwVU5mRW1fN1VTRHRjVjFvemQzZHpoX09ocENFbkV6bGd6eklaNGdHSFR3eTFjZFhLdTB0S3NnMWJ3MkgxX0gyMkd5ZS03enVvWk1pUWxGckZxQVBaQWdwSFJRWTMxc0RDalNNbjdTSnV0VXMxanI3N1hEbXVmaEtyM2NrczFHdFI0X244b2xfeDhqcWZwMHN2ZHMxbjMwQ1lXbklVdGJRV2NQM1VkV2ZoUTMwWTUyd1lNZDdzR3ZsbnFNMDVKNW9DNXFDbV9YdXZJQkNPaVUzZGFFdEdVX28zWk9aR252Y0RHXzlvR2gtbDhwaFFqTEVJMnY3NWxrbHA4NmoybDI2dzJzWS13NjN6elBkdDBQb0tpZnRlSURlOWNQZWF3S1doMU5IY29pVkF4RlhVMVJKSm1KZTY5WS03VzZJSUxoNUoxXzM1U0doeXplR1U4YjVZeUJ5USJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache" ], "Content-Length": [ "123" ], "Content-Type": [ "application/json; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:08:56 GMT" ], "Expires": [ "-1" ], "Pragma": [ "no-cache" ], "Strict-Transport-Security": [ "max-age=31536000;includeSubDomains" ], "X-Content-Type-Options": [ "nosniff" ], "X-Ms-Keyvault-Network-Info": [ "conn_type=Ipv4;addr=34.125.120.109;act_addr_fam=InterNetwork;" ], "X-Ms-Keyvault-Region": [ "centralus" ], "X-Ms-Keyvault-Service-Version": [ "1.9.1222.3" ], "X-Ms-Request-Id": [ "3134cd8b-3b02-44c9-a9d0-848d32fbe3ba" ] }, "Body": "eyJraWQiOiJodHRwczovL2dvLWNkay52YXVsdC5henVyZS5uZXQva2V5cy90ZXN0MS9iM2IzMWYyOTIyNjI0ZTFkYTdhNDJlNGQwNGQ0NDExMCIsInZhbHVlIjoiU1NkdElHRWdjMlZqY21WMElHMWxjM05oWjJVaCJ9" } } ] } ================================================ FILE: secrets/azurekeyvault/testdata/TestConformance/TestMultipleKeys.replay ================================================ { "Initial": "AQAAAA7dVMEZA4bkdQAA", "Version": "0.2", "Converter": { "ScrubBody": null, "ClearHeaders": [ "^X-Goog-.*Encryption-Key$", "^X-Ms-Date$", "^User-Agent$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": null, "RemoveParams": [ "^se$", "^sig$", "^X-Ms-Date$" ] }, "Entries": [ { "ID": "2a2bedfe2e265a6c", "Request": { "Method": "POST", "URL": "https://go-cdk.vault.azure.net/keys/test1/encrypt?api-version=7.4", "Header": { "Accept": [ "application/json" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 401, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache" ], "Content-Length": [ "97" ], "Content-Type": [ "application/json; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:08:56 GMT" ], "Expires": [ "-1" ], "Pragma": [ "no-cache" ], "Strict-Transport-Security": [ "max-age=31536000;includeSubDomains" ], "Www-Authenticate": [ "Bearer authorization=\"https://login.microsoftonline.com/db44ed8f-85f7-4f22-b378-3bb9fa3d62ff\", resource=\"https://vault.azure.net\"" ], "X-Content-Type-Options": [ "nosniff" ], "X-Ms-Keyvault-Network-Info": [ "conn_type=Ipv4;addr=34.125.120.109;act_addr_fam=InterNetwork;" ], "X-Ms-Keyvault-Region": [ "centralus" ], "X-Ms-Keyvault-Service-Version": [ "1.9.1222.3" ], "X-Ms-Request-Id": [ "ac6b5a19-0c4f-4571-b782-8cfe5771dcc1" ] }, "Body": "eyJlcnJvciI6eyJjb2RlIjoiVW5hdXRob3JpemVkIiwibWVzc2FnZSI6IkFLVjEwMDAwOiBSZXF1ZXN0IGlzIG1pc3NpbmcgYSBCZWFyZXIgb3IgUG9QIHRva2VuLiJ9fQ==" } }, { "ID": "80675cb8a4aabf46", "Request": { "Method": "POST", "URL": "https://go-cdk.vault.azure.net/keys/test1/encrypt?api-version=7.4", "Header": { "Accept": [ "application/json" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "61" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJ2YWx1ZSI6IlNTZHRJR0VnYzJWamNtVjBJRzFsYzNOaFoyVWgifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache" ], "Content-Length": [ "437" ], "Content-Type": [ "application/json; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:08:56 GMT" ], "Expires": [ "-1" ], "Pragma": [ "no-cache" ], "Strict-Transport-Security": [ "max-age=31536000;includeSubDomains" ], "X-Content-Type-Options": [ "nosniff" ], "X-Ms-Keyvault-Network-Info": [ "conn_type=Ipv4;addr=34.125.120.109;act_addr_fam=InterNetwork;" ], "X-Ms-Keyvault-Region": [ "centralus" ], "X-Ms-Keyvault-Service-Version": [ "1.9.1222.3" ], "X-Ms-Request-Id": [ "7fed2c8f-2c9b-4449-b157-578c1fd73408" ] }, "Body": "eyJraWQiOiJodHRwczovL2dvLWNkay52YXVsdC5henVyZS5uZXQva2V5cy90ZXN0MS9iM2IzMWYyOTIyNjI0ZTFkYTdhNDJlNGQwNGQ0NDExMCIsInZhbHVlIjoiRWZWeFBXU1VFMGZuWTg1aXBsak5NT3I0eHJDLXUtbDFtUzFpMk9zNVU4eHdHTDBLOVNjakM5YUs0T0JXdXFiVVJnOVZwNnZpTXVUcWM2cUlGTFZILXFiUkQ4SE80d3F6eXBfNjlacW1aSWdKREF2NGd3a290b2phWWJCT3RTdnF1S1Bma1NRN05pR2UycXlxRjRYVkR5SWl2ODlxY2dlTmtPcnhMam9yVlN4ZU5ZZnBpNXlvdFRiRFh2Sk1IMGpUMXljaWlSZ1pEUDdqMXI1MHhmODIxdUc4aUlxcmtYRzJPTUxDNE04Sy1wUW9tSTVxa24xVF8wRjc2ckdXTzBuR3lFdXZhcE1qZEkwNEw0d29OS0VENDdzRVBiVUxQQUNmY0g2bVFwWno1YmlvUFNGMXpFN0FZc194blFJNmRmSlJMNmZ4bTQ4LU53VlJ5QlRqajZiUmt3In0=" } }, { "ID": "bb023a17c51d046d", "Request": { "Method": "POST", "URL": "https://go-cdk.vault.azure.net/keys/test2/encrypt?api-version=7.4", "Header": { "Accept": [ "application/json" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 401, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache" ], "Content-Length": [ "97" ], "Content-Type": [ "application/json; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:08:56 GMT" ], "Expires": [ "-1" ], "Pragma": [ "no-cache" ], "Strict-Transport-Security": [ "max-age=31536000;includeSubDomains" ], "Www-Authenticate": [ "Bearer authorization=\"https://login.microsoftonline.com/db44ed8f-85f7-4f22-b378-3bb9fa3d62ff\", resource=\"https://vault.azure.net\"" ], "X-Content-Type-Options": [ "nosniff" ], "X-Ms-Keyvault-Network-Info": [ "conn_type=Ipv4;addr=34.125.120.109;act_addr_fam=InterNetwork;" ], "X-Ms-Keyvault-Region": [ "centralus" ], "X-Ms-Keyvault-Service-Version": [ "1.9.1222.3" ], "X-Ms-Request-Id": [ "9988f05d-9995-4eaf-ae5f-bb97a28ba9d9" ] }, "Body": "eyJlcnJvciI6eyJjb2RlIjoiVW5hdXRob3JpemVkIiwibWVzc2FnZSI6IkFLVjEwMDAwOiBSZXF1ZXN0IGlzIG1pc3NpbmcgYSBCZWFyZXIgb3IgUG9QIHRva2VuLiJ9fQ==" } }, { "ID": "e98f74283d9dac54", "Request": { "Method": "POST", "URL": "https://go-cdk.vault.azure.net/keys/test2/encrypt?api-version=7.4", "Header": { "Accept": [ "application/json" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "61" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJ2YWx1ZSI6IlNTZHRJR0VnYzJWamNtVjBJRzFsYzNOaFoyVWgifQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache" ], "Content-Length": [ "437" ], "Content-Type": [ "application/json; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:08:57 GMT" ], "Expires": [ "-1" ], "Pragma": [ "no-cache" ], "Strict-Transport-Security": [ "max-age=31536000;includeSubDomains" ], "X-Content-Type-Options": [ "nosniff" ], "X-Ms-Keyvault-Network-Info": [ "conn_type=Ipv4;addr=34.125.120.109;act_addr_fam=InterNetwork;" ], "X-Ms-Keyvault-Region": [ "centralus" ], "X-Ms-Keyvault-Service-Version": [ "1.9.1222.3" ], "X-Ms-Request-Id": [ "3ea39fde-30c8-4d06-b48c-f891b372e9d7" ] }, "Body": "eyJraWQiOiJodHRwczovL2dvLWNkay52YXVsdC5henVyZS5uZXQva2V5cy90ZXN0Mi9mNDFiOWI4ZDU4NmU0MGI5YjFhNDVjZTZiN2VjN2Q2YyIsInZhbHVlIjoiRURpYmJzQ2pVOUtTYXpYU2M3RTlRa0F6RUtmajdkQ0Y4R0JWRjg4R01LMDRZRmJwVW5ObzdtSU9YaU5zYy1lbTZIYWh4ZDJMcDJaMlVKTWszcVVqSmREZDlYZFk0TUNpdFNyX3NPSjFncHVCNjNSM0ZhM3N2WEpnaFltdFp4UFU4U2c1RFRuV2hlMWRXSkVtRExqMDBqTDZCZURjY2dZNkFJNlFwS2d4Y01VbFVxQTlPQ2dsamh2Q1dEaW5QVVB6R2pXYkFleE5CZFgyZkhuRzBwYm8zWFA4RVYzcUI3N05QUnVSZjdjMmJ1cFZ4aUI5OGtHY1ZCSjljRWNBQ1VrYm9Jc3hONm96SlRFYkxHSWxfU2ZBN0Flb3k1b0RQM2NiN21GZHRvZXhLVi0zSDJ5emFRd0JHTWJkSWtzVlctTHNVQm1jclpydTVGMlZNMUhLSEFDRHFBIn0=" } }, { "ID": "81c335517a88fdea", "Request": { "Method": "POST", "URL": "https://go-cdk.vault.azure.net/keys/test1/decrypt?api-version=7.4", "Header": { "Accept": [ "application/json" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "375" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJ2YWx1ZSI6IkVmVnhQV1NVRTBmblk4NWlwbGpOTU9yNHhyQy11LWwxbVMxaTJPczVVOHh3R0wwSzlTY2pDOWFLNE9CV3VxYlVSZzlWcDZ2aU11VHFjNnFJRkxWSC1xYlJEOEhPNHdxenlwXzY5WnFtWklnSkRBdjRnd2tvdG9qYVliQk90U3ZxdUtQZmtTUTdOaUdlMnF5cUY0WFZEeUlpdjg5cWNnZU5rT3J4TGpvclZTeGVOWWZwaTV5b3RUYkRYdkpNSDBqVDF5Y2lpUmdaRFA3ajFyNTB4ZjgyMXVHOGlJcXJrWEcyT01MQzRNOEstcFFvbUk1cWtuMVRfMEY3NnJHV08wbkd5RXV2YXBNamRJMDRMNHdvTktFRDQ3c0VQYlVMUEFDZmNINm1RcFp6NWJpb1BTRjF6RTdBWXNfeG5RSTZkZkpSTDZmeG00OC1Od1ZSeUJUamo2YlJrdyJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache" ], "Content-Length": [ "123" ], "Content-Type": [ "application/json; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:08:57 GMT" ], "Expires": [ "-1" ], "Pragma": [ "no-cache" ], "Strict-Transport-Security": [ "max-age=31536000;includeSubDomains" ], "X-Content-Type-Options": [ "nosniff" ], "X-Ms-Keyvault-Network-Info": [ "conn_type=Ipv4;addr=34.125.120.109;act_addr_fam=InterNetwork;" ], "X-Ms-Keyvault-Region": [ "centralus" ], "X-Ms-Keyvault-Service-Version": [ "1.9.1222.3" ], "X-Ms-Request-Id": [ "3798e708-9f81-484a-a71f-ed5ee78358ad" ] }, "Body": "eyJraWQiOiJodHRwczovL2dvLWNkay52YXVsdC5henVyZS5uZXQva2V5cy90ZXN0MS9iM2IzMWYyOTIyNjI0ZTFkYTdhNDJlNGQwNGQ0NDExMCIsInZhbHVlIjoiU1NkdElHRWdjMlZqY21WMElHMWxjM05oWjJVaCJ9" } }, { "ID": "914b2c2d27098f6e", "Request": { "Method": "POST", "URL": "https://go-cdk.vault.azure.net/keys/test2/decrypt?api-version=7.4", "Header": { "Accept": [ "application/json" ], "Accept-Encoding": [ "gzip" ], "Content-Length": [ "375" ], "User-Agent": [ "CLEARED" ] }, "MediaType": "application/json", "BodyParts": [ "eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJ2YWx1ZSI6IkVEaWJic0NqVTlLU2F6WFNjN0U5UWtBekVLZmo3ZENGOEdCVkY4OEdNSzA0WUZicFVuTm83bUlPWGlOc2MtZW02SGFoeGQyTHAyWjJVSk1rM3FVakpkRGQ5WGRZNE1DaXRTcl9zT0oxZ3B1QjYzUjNGYTNzdlhKZ2hZbXRaeFBVOFNnNURUbldoZTFkV0pFbURMajAwakw2QmVEY2NnWTZBSTZRcEtneGNNVWxVcUE5T0NnbGpodkNXRGluUFVQekdqV2JBZXhOQmRYMmZIbkcwcGJvM1hQOEVWM3FCNzdOUFJ1UmY3YzJidXBWeGlCOThrR2NWQko5Y0VjQUNVa2JvSXN4TjZvekpURWJMR0lsX1NmQTdBZW95NW9EUDNjYjdtRmR0b2V4S1YtM0gyeXphUXdCR01iZElrc1ZXLUxzVUJtY3JacnU1RjJWTTFIS0hBQ0RxQSJ9" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Cache-Control": [ "no-cache" ], "Content-Length": [ "123" ], "Content-Type": [ "application/json; charset=utf-8" ], "Date": [ "Wed, 07 Feb 2024 00:08:57 GMT" ], "Expires": [ "-1" ], "Pragma": [ "no-cache" ], "Strict-Transport-Security": [ "max-age=31536000;includeSubDomains" ], "X-Content-Type-Options": [ "nosniff" ], "X-Ms-Keyvault-Network-Info": [ "conn_type=Ipv4;addr=34.125.120.109;act_addr_fam=InterNetwork;" ], "X-Ms-Keyvault-Region": [ "centralus" ], "X-Ms-Keyvault-Service-Version": [ "1.9.1222.3" ], "X-Ms-Request-Id": [ "e11f07cc-0e34-4353-8f22-89c168368eb5" ] }, "Body": "eyJraWQiOiJodHRwczovL2dvLWNkay52YXVsdC5henVyZS5uZXQva2V5cy90ZXN0Mi9mNDFiOWI4ZDU4NmU0MGI5YjFhNDVjZTZiN2VjN2Q2YyIsInZhbHVlIjoiU1NkdElHRWdjMlZqY21WMElHMWxjM05oWjJVaCJ9" } } ] } ================================================ FILE: secrets/driver/driver.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package driver defines interfaces to be implemented by secrets drivers, which // will be used by the secrets package to interact with the underlying services. // Application code should use package secrets. package driver // import "gocloud.dev/secrets/driver" import ( "context" "gocloud.dev/gcerrors" ) // Keeper holds the key information to encrypt a plain text message into a // cipher message, as well as decrypt a cipher message into a plain text // message. type Keeper interface { // Decrypt decrypts the ciphertext and returns the plaintext or an error. // Decrypt *may* decrypt ciphertexts that were encrypted using a different // key than the one provided to Keeper; some drivers encode the key used // in the ciphertext. Decrypt(ctx context.Context, ciphertext []byte) ([]byte, error) // Encrypt encrypts the plaintext using the key, and returns the ciphertext. Encrypt(ctx context.Context, plaintext []byte) ([]byte, error) // Close releases any resources used for the Keeper. Close() error // ErrorAs allows drivers to expose driver-specific types for returned // errors. // // See https://gocloud.dev/concepts/as/ for background information. ErrorAs(err error, i any) bool // ErrorCode should return a code that describes the error, which was returned // by one of the other methods in this interface. ErrorCode(error) gcerrors.ErrorCode } ================================================ FILE: secrets/drivertest/drivertest.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package drivertest provides a conformance test for implementations of // the secrets driver. package drivertest // import "gocloud.dev/secrets/drivertest" import ( "bytes" "context" "errors" "testing" "github.com/google/go-cmp/cmp" "gocloud.dev/secrets" "gocloud.dev/secrets/driver" ) // Harness descibes the functionality test harnesses must provide to run // conformance tests. type Harness interface { // MakeDriver returns a pair of driver.Keeper, each backed by a different key. MakeDriver(ctx context.Context) (driver.Keeper, driver.Keeper, error) // Close is called when the test is complete. Close() } // HarnessMaker describes functions that construct a harness for running tests. // It is called exactly once per test. type HarnessMaker func(ctx context.Context, t *testing.T) (Harness, error) // AsTest represents a test of As functionality. // The conformance test: // 1. Tries to decrypt malformed message, and calls ErrorCheck with the error. type AsTest interface { // Name returns a descriptive name for the test. Name() string // ErrorCheck is called to allow verification of Keeper.ErrorAs. ErrorCheck(k *secrets.Keeper, err error) error } type verifyAsFailsOnNil struct{} func (v verifyAsFailsOnNil) Name() string { return "verify As returns false when passed nil" } func (v verifyAsFailsOnNil) ErrorCheck(k *secrets.Keeper, err error) (ret error) { defer func() { if recover() == nil { ret = errors.New("want ErrorAs to panic when passed nil") } }() k.ErrorAs(err, nil) return nil } // RunConformanceTests runs conformance tests for driver implementations of secret management. func RunConformanceTests(t *testing.T, newHarness HarnessMaker, asTests []AsTest) { t.Helper() t.Run("TestEncryptDecrypt", func(t *testing.T) { testEncryptDecrypt(t, newHarness) }) t.Run("TestMultipleEncryptionsNotEqual", func(t *testing.T) { testMultipleEncryptionsNotEqual(t, newHarness) }) t.Run("TestMultipleKeys", func(t *testing.T) { testMultipleKeys(t, newHarness) }) t.Run("TestDecryptMalformedError", func(t *testing.T) { testDecryptMalformedError(t, newHarness) }) asTests = append(asTests, verifyAsFailsOnNil{}) t.Run("TestAs", func(t *testing.T) { for _, tc := range asTests { if tc.Name() == "" { t.Fatal("AsTest.Name is required") } t.Run(tc.Name(), func(t *testing.T) { testAs(t, newHarness, tc) }) } }) } // testEncryptDecrypt tests the functionality of encryption and decryption func testEncryptDecrypt(t *testing.T, newHarness HarnessMaker) { t.Helper() ctx := context.Background() harness, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer harness.Close() drv, _, err := harness.MakeDriver(ctx) if err != nil { t.Fatal(err) } keeper := secrets.NewKeeper(drv) defer keeper.Close() msg := []byte("I'm a secret message!") encryptedMsg, err := keeper.Encrypt(ctx, msg) if err != nil { t.Fatal(err) } if cmp.Equal(msg, encryptedMsg) { t.Errorf("Got encrypted message %v, want it to differ from original message %v", string(msg), string(encryptedMsg)) } decryptedMsg, err := keeper.Decrypt(ctx, encryptedMsg) if err != nil { t.Fatal(err) } if !cmp.Equal(msg, decryptedMsg) { t.Errorf("Got decrypted message %v, want it to match original message %v", string(msg), string(decryptedMsg)) } } // testMultipleEncryptionsNotEqual tests that encrypting a plaintext multiple // times with the same key works, and that the encrypted bytes are different. func testMultipleEncryptionsNotEqual(t *testing.T, newHarness HarnessMaker) { t.Helper() ctx := context.Background() harness, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer harness.Close() drv, _, err := harness.MakeDriver(ctx) if err != nil { t.Fatal(err) } keeper := secrets.NewKeeper(drv) defer keeper.Close() msg := []byte("I'm a secret message!") encryptedMsg1, err := keeper.Encrypt(ctx, msg) if err != nil { t.Fatal(err) } encryptedMsg2, err := keeper.Encrypt(ctx, msg) if err != nil { t.Fatal(err) } if cmp.Equal(encryptedMsg1, encryptedMsg2) { t.Errorf("Got same encrypted messages from multiple encryptions %v, want them to be different", string(encryptedMsg1)) } decryptedMsg, err := keeper.Decrypt(ctx, encryptedMsg1) if err != nil { t.Fatal(err) } if !bytes.Equal(decryptedMsg, msg) { t.Errorf("got decrypted %q want %q", string(decryptedMsg), string(msg)) } decryptedMsg, err = keeper.Decrypt(ctx, encryptedMsg2) if err != nil { t.Fatal(err) } if !bytes.Equal(decryptedMsg, msg) { t.Errorf("got decrypted %q want %q", string(decryptedMsg), string(msg)) } } // testMultipleKeys tests that encrypting the same text with different // keys works, and that the encrypted bytes are different. func testMultipleKeys(t *testing.T, newHarness HarnessMaker) { t.Helper() ctx := context.Background() harness, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer harness.Close() drv1, drv2, err := harness.MakeDriver(ctx) if err != nil { t.Fatal(err) } keeper1 := secrets.NewKeeper(drv1) defer keeper1.Close() keeper2 := secrets.NewKeeper(drv2) defer keeper2.Close() msg := []byte("I'm a secret message!") encryptedMsg1, err := keeper1.Encrypt(ctx, msg) if err != nil { t.Fatal(err) } encryptedMsg2, err := keeper2.Encrypt(ctx, msg) if err != nil { t.Fatal(err) } if cmp.Equal(encryptedMsg1, encryptedMsg2) { t.Errorf("Got same encrypted messages from multiple encryptions %v, want them to be different", string(encryptedMsg1)) } // We cannot assert that decrypting encryptedMsg1 with keeper2 fails, // or that decrypting encryptedMsg2 with keeper1 fails, as Decrypt is allowed // to decrypt using a different key than the one given to Keeper. decryptedMsg, err := keeper1.Decrypt(ctx, encryptedMsg1) if err != nil { t.Fatal(err) } if !bytes.Equal(decryptedMsg, msg) { t.Errorf("got decrypted %q want %q", string(decryptedMsg), string(msg)) } decryptedMsg, err = keeper2.Decrypt(ctx, encryptedMsg2) if err != nil { t.Fatal(err) } if !bytes.Equal(decryptedMsg, msg) { t.Errorf("got decrypted %q want %q", string(decryptedMsg), string(msg)) } } // testDecryptMalformedError tests decryption returns an error when the // ciphertext is malformed. func testDecryptMalformedError(t *testing.T, newHarness HarnessMaker) { t.Helper() ctx := context.Background() harness, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer harness.Close() drv, _, err := harness.MakeDriver(ctx) if err != nil { t.Fatal(err) } keeper := secrets.NewKeeper(drv) defer keeper.Close() msg := []byte("I'm a secret message!") encryptedMsg, err := keeper.Encrypt(ctx, msg) if err != nil { t.Fatal(err) } copyEncryptedMsg := func() []byte { return append([]byte{}, encryptedMsg...) } l := len(encryptedMsg) for _, tc := range []struct { name string malformed []byte }{ { name: "wrong first byte", malformed: append([]byte{encryptedMsg[0] + 1}, encryptedMsg[1:]...), }, { name: "missing second byte", malformed: append(copyEncryptedMsg()[:1], encryptedMsg[2:]...), }, { name: "wrong last byte", malformed: append(copyEncryptedMsg()[:l-2], encryptedMsg[l-1]-1), }, } { t.Run(tc.name, func(t *testing.T) { if _, err := keeper.Decrypt(ctx, []byte(tc.malformed)); err == nil { t.Error("Got nil, want decrypt error") } }) } } func testAs(t *testing.T, newHarness HarnessMaker, tc AsTest) { t.Helper() ctx := context.Background() harness, err := newHarness(ctx, t) if err != nil { t.Fatal(err) } defer harness.Close() drv, _, err := harness.MakeDriver(ctx) if err != nil { t.Fatal(err) } keeper := secrets.NewKeeper(drv) defer keeper.Close() _, gotErr := keeper.Decrypt(ctx, []byte("malformed cipher message")) if gotErr == nil { t.Error("Got nil, want decrypt error") } if err := tc.ErrorCheck(keeper, gotErr); err != nil { t.Error(err) } } ================================================ FILE: secrets/example_openkeeper_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package secrets_test import ( "context" "fmt" "log" "gocloud.dev/secrets" _ "gocloud.dev/secrets/localsecrets" ) func Example_openFromURL() { ctx := context.Background() // Create a Keeper using a URL. // This example uses "localsecrets", the in-memory implementation. // We need to add a blank import line to register the localsecrets driver's // URLOpener, which implements secrets.KeeperURLOpener: // import _ "gocloud.dev/secrets/localsecrets" // localsecrets registers for the "base64key" scheme. // All secrets.OpenKeeper URLs also work with "secrets+" or "secrets+keeper+" prefixes, // e.g., "secrets+base64key://..." or "secrets+variable+base64key://...". // All secrets URLs also work with the "secrets+" prefix, e.g., "secrets+base64key://". k, err := secrets.OpenKeeper(ctx, "base64key://smGbjm71Nxd1Ig5FS0wj9SlbzAIrnolCz9bQQ6uAhl4=") if err != nil { log.Fatal(err) } defer k.Close() // Now we can use k to encrypt/decrypt. plaintext := []byte("Go CDK Secrets") ciphertext, err := k.Encrypt(ctx, plaintext) if err != nil { log.Fatal(err) } decrypted, err := k.Decrypt(ctx, ciphertext) if err != nil { log.Fatal(err) } fmt.Println(string(decrypted)) // Output: // Go CDK Secrets } ================================================ FILE: secrets/example_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package secrets_test import ( "context" "fmt" "log" "gocloud.dev/secrets" _ "gocloud.dev/secrets/gcpkms" "gocloud.dev/secrets/localsecrets" "google.golang.org/grpc/status" ) func Example() { ctx := context.Background() // Construct a *secrets.Keeper from one of the secrets subpackages. // This example uses localsecrets. sk, err := localsecrets.NewRandomKey() if err != nil { log.Fatal(err) } keeper := localsecrets.NewKeeper(sk) defer keeper.Close() // Now we can use keeper to Encrypt. plaintext := []byte("Go CDK Secrets") ciphertext, err := keeper.Encrypt(ctx, plaintext) if err != nil { log.Fatal(err) } // And/or Decrypt. decrypted, err := keeper.Decrypt(ctx, ciphertext) if err != nil { log.Fatal(err) } fmt.Println(string(decrypted)) // Output: // Go CDK Secrets } func Example_errorAs() { // This example is specific to the gcpkms implementation; it // demonstrates access to the underlying google.golang.org/grpc/status.Status // type. // The types exposed for As by gcpkms are documented in // https://godoc.org/gocloud.dev/secrets/gcpkms#hdr-As ctx := context.Background() const url = "gcpkms://projects/proj/locations/global/keyRings/test/ring/wrongkey" keeper, err := secrets.OpenKeeper(ctx, url) if err != nil { log.Fatal(err) } defer keeper.Close() plaintext := []byte("Go CDK secrets") _, err = keeper.Encrypt(ctx, plaintext) if err != nil { var s *status.Status if keeper.ErrorAs(err, &s) { fmt.Println(s.Code()) } } } func ExampleKeeper_Encrypt() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() var keeper *secrets.Keeper plainText := []byte("Secrets secrets...") cipherText, err := keeper.Encrypt(ctx, plainText) if err != nil { log.Fatal(err) } // PRAGMA: On gocloud.dev, hide the rest of the function. _ = cipherText } func ExampleKeeper_Decrypt() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() var keeper *secrets.Keeper var cipherText []byte // obtained from elsewhere and random-looking plainText, err := keeper.Decrypt(ctx, cipherText) if err != nil { log.Fatal(err) } // PRAGMA: On gocloud.dev, hide the rest of the function. _ = plainText } ================================================ FILE: secrets/gcpkms/example_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcpkms_test import ( "context" "log" "gocloud.dev/secrets" "gocloud.dev/secrets/gcpkms" ) func ExampleOpenKeeper() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // Get a client to use with the KMS API. client, done, err := gcpkms.Dial(ctx, nil) if err != nil { log.Fatal(err) } // Close the connection when done. defer done() // You can also use gcpkms.KeyResourceID to construct this string. const keyID = "projects/MYPROJECT/" + "locations/MYLOCATION/" + "keyRings/MYKEYRING/" + "cryptoKeys/MYKEY" // Construct a *secrets.Keeper. keeper := gcpkms.OpenKeeper(client, keyID, nil) defer keeper.Close() } func Example_openFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/secrets/gcpkms" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() keeper, err := secrets.OpenKeeper(ctx, "gcpkms://projects/MYPROJECT/"+ "locations/MYLOCATION/"+ "keyRings/MYKEYRING/"+ "cryptoKeys/MYKEY") if err != nil { log.Fatal(err) } defer keeper.Close() } ================================================ FILE: secrets/gcpkms/kms.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package gcpkms provides a secrets implementation backed by Google Cloud KMS. // Use OpenKeeper to construct a *secrets.Keeper. // // # URLs // // For secrets.OpenKeeper, gcpkms registers for the scheme "gcpkms". // The default URL opener will create a connection using use default // credentials from the environment, as described in // https://cloud.google.com/docs/authentication/production. // To customize the URL opener, or for more details on the URL format, // see URLOpener. // See https://gocloud.dev/concepts/urls/ for background information. // // # As // // gcpkms exposes the following type for As: // - Error: *google.golang.org/grpc/status.Status package gcpkms // import "gocloud.dev/secrets/gcpkms" import ( "context" "encoding/base64" "fmt" "net/url" "path" "sync" cloudkms "cloud.google.com/go/kms/apiv1" "cloud.google.com/go/kms/apiv1/kmspb" "github.com/google/wire" "gocloud.dev/gcerrors" "gocloud.dev/gcp" "gocloud.dev/internal/gcerr" "gocloud.dev/internal/useragent" "gocloud.dev/secrets" "google.golang.org/api/option" "google.golang.org/grpc/status" ) // endPoint is the address to access Google Cloud KMS API. const endPoint = "cloudkms.googleapis.com:443" // Dial returns a client to use with Cloud KMS and a clean-up function to close // the client after used. func Dial(ctx context.Context, ts gcp.TokenSource) (*cloudkms.KeyManagementClient, func(), error) { c, err := cloudkms.NewKeyManagementClient(ctx, option.WithTokenSource(ts), useragent.ClientOption("secrets")) return c, func() { c.Close() }, err } func init() { secrets.DefaultURLMux().RegisterKeeper(Scheme, new(lazyCredsOpener)) } // Set holds Wire providers for this package. var Set = wire.NewSet( Dial, wire.Struct(new(URLOpener), "Client"), ) // lazyCredsOpener obtains Application Default Credentials on the first call // lazyCredsOpener obtains Application Default Credentials on the first call // to OpenKeeperURL. type lazyCredsOpener struct { init sync.Once opener *URLOpener err error } func (o *lazyCredsOpener) OpenKeeperURL(ctx context.Context, u *url.URL) (*secrets.Keeper, error) { o.init.Do(func() { creds, err := gcp.DefaultCredentials(ctx) if err != nil { o.err = err return } client, _, err := Dial(ctx, creds.TokenSource) if err != nil { o.err = err return } o.opener = &URLOpener{Client: client} }) if o.err != nil { return nil, fmt.Errorf("open keeper %v: %v", u, o.err) } return o.opener.OpenKeeperURL(ctx, u) } // Scheme is the URL scheme gcpkms registers its URLOpener under on secrets.DefaultMux. const Scheme = "gcpkms" // URLOpener opens GCP KMS URLs like // "gcpkms://projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEY_RING]/cryptoKeys/[KEY]". // // The URL host+path are used as the key resource ID; see // https://cloud.google.com/kms/docs/object-hierarchy#key for more details. // // The following query parameters are supported: // // - additional_authenticated_data: a base64 URL encoded string of AAD provided to encrypt and // decrypt calls. type URLOpener struct { // Client must be non-nil and be authenticated with "cloudkms" scope or equivalent. Client *cloudkms.KeyManagementClient // Options specifies the default options to pass to OpenKeeper. Options KeeperOptions } // OpenKeeperURL opens GCP KMS URLs. func (o *URLOpener) OpenKeeperURL(ctx context.Context, u *url.URL) (*secrets.Keeper, error) { q := u.Query() for param := range q { if param != "additional_authenticated_data" { return nil, fmt.Errorf("open keeper %v: invalid query parameter %q", u, param) } } opts := o.Options if aad := q.Get("additional_authenticated_data"); aad != "" { dec, err := base64.URLEncoding.DecodeString(aad) if err != nil { return nil, fmt.Errorf("failed to base64-decode \"additional_authenticated_data\": %w", err) } opts.AdditionalAuthenticatedData = dec } return OpenKeeper(o.Client, path.Join(u.Host, u.Path), &opts), nil } // OpenKeeper returns a *secrets.Keeper that uses Google Cloud KMS. // You can use KeyResourceID to construct keyResourceID from its parts, // or provide the whole string if you have it (e.g., from the GCP console). // See https://cloud.google.com/kms/docs/object-hierarchy#key for more details. // See the package documentation for an example. func OpenKeeper(client *cloudkms.KeyManagementClient, keyResourceID string, opts *KeeperOptions) *secrets.Keeper { if opts == nil { opts = &KeeperOptions{} } return secrets.NewKeeper(&keeper{ keyResourceID: keyResourceID, client: client, opts: *opts, }) } // KeyResourceID constructs a key resourceID for GCP KMS. // See https://cloud.google.com/kms/docs/object-hierarchy#key for more details. func KeyResourceID(projectID, location, keyRing, key string) string { return fmt.Sprintf("projects/%s/locations/%s/keyRings/%s/cryptoKeys/%s", projectID, location, keyRing, key) } // keeper implements driver.Keeper. type keeper struct { keyResourceID string client *cloudkms.KeyManagementClient opts KeeperOptions } // Decrypt decrypts the ciphertext using the key constructed from ki. func (k *keeper) Decrypt(ctx context.Context, ciphertext []byte) ([]byte, error) { req := &kmspb.DecryptRequest{ Name: k.keyResourceID, Ciphertext: ciphertext, AdditionalAuthenticatedData: k.opts.AdditionalAuthenticatedData, } resp, err := k.client.Decrypt(ctx, req) if err != nil { return nil, err } return resp.GetPlaintext(), nil } // Encrypt encrypts the plaintext into a ciphertext. func (k *keeper) Encrypt(ctx context.Context, plaintext []byte) ([]byte, error) { req := &kmspb.EncryptRequest{ Name: k.keyResourceID, Plaintext: plaintext, AdditionalAuthenticatedData: k.opts.AdditionalAuthenticatedData, } resp, err := k.client.Encrypt(ctx, req) if err != nil { return nil, err } return resp.GetCiphertext(), nil } // Close implements driver.Keeper.Close. func (k *keeper) Close() error { return nil } // ErrorAs implements driver.Keeper.ErrorAs. func (k *keeper) ErrorAs(err error, i any) bool { s, ok := status.FromError(err) if !ok { return false } p, ok := i.(**status.Status) if !ok { return false } *p = s return true } // ErrorCode implements driver.ErrorCode. func (k *keeper) ErrorCode(err error) gcerrors.ErrorCode { return gcerr.GRPCCode(err) } // KeeperOptions controls Keeper behaviors. type KeeperOptions struct { // AdditionalAuthenticatedData is non-secret data used as an optional integrity check which must // match between encrypt and decrypt operations. This prevents confused deputy attacks by // binding context to encrypted data without being stored in the ciphertext. // See here for more info: https://docs.cloud.google.com/kms/docs/additional-authenticated-data. AdditionalAuthenticatedData []byte } ================================================ FILE: secrets/gcpkms/kms_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcpkms import ( "context" "errors" "testing" cloudkms "cloud.google.com/go/kms/apiv1" "gocloud.dev/internal/testing/setup" "gocloud.dev/secrets" "gocloud.dev/secrets/driver" "gocloud.dev/secrets/drivertest" "golang.org/x/oauth2" "google.golang.org/api/option" "google.golang.org/grpc/status" ) // These constants capture values that were used during the last --record. // If you want to use --record mode, // 1. Update projectID to your GCP project name (not number!) // 2. Enable the Cloud KMS API. // 3. Create a key ring and a key, change their name below accordingly. const ( project = "go-cloud-test-216917" location = "global" keyRing = "test" keyID1 = "password" keyID2 = "password2" ) type harness struct { client *cloudkms.KeyManagementClient close func() } func (h *harness) MakeDriver(ctx context.Context) (driver.Keeper, driver.Keeper, error) { return &keeper{KeyResourceID(project, location, keyRing, keyID1), h.client, KeeperOptions{}}, &keeper{KeyResourceID(project, location, keyRing, keyID2), h.client, KeeperOptions{}}, nil } func (h *harness) Close() { h.close() } func newHarness(ctx context.Context, t *testing.T) (drivertest.Harness, error) { t.Helper() conn, done := setup.NewGCPgRPCConn(ctx, t, endPoint, "secrets") client, err := cloudkms.NewKeyManagementClient(ctx, option.WithGRPCConn(conn)) if err != nil { return nil, err } return &harness{ client: client, close: func() { client.Close() done() }, }, nil } func TestConformance(t *testing.T) { drivertest.RunConformanceTests(t, newHarness, []drivertest.AsTest{verifyAs{}}) } type verifyAs struct{} func (v verifyAs) Name() string { return "verify As function" } func (v verifyAs) ErrorCheck(k *secrets.Keeper, err error) error { var s *status.Status if !k.ErrorAs(err, &s) { return errors.New("Keeper.ErrorAs failed") } return nil } // KMS-specific tests. func TestNoConnectionError(t *testing.T) { ctx := context.Background() client, done, err := Dial(ctx, oauth2.StaticTokenSource(&oauth2.Token{ AccessToken: "fake", })) if err != nil { t.Fatal(err) } defer done() keeper := OpenKeeper(client, "", nil) defer keeper.Close() if _, err := keeper.Encrypt(ctx, []byte("test")); err == nil { t.Error("got nil, want rpc error") } } func TestAdditionalAuthenticatedData(t *testing.T) { ctx := context.Background() conn, done := setup.NewGCPgRPCConn(ctx, t, endPoint, "secrets") defer done() client, err := cloudkms.NewKeyManagementClient(ctx, option.WithGRPCConn(conn)) if err != nil { t.Fatalf("failed to connect: %v", err) } opts := KeeperOptions{ AdditionalAuthenticatedData: []byte("sample AAD"), } k1a := OpenKeeper(client, KeyResourceID(project, location, keyRing, keyID1), &opts) defer k1a.Close() k1b := OpenKeeper(client, KeyResourceID(project, location, keyRing, keyID1), &opts) defer k1b.Close() opts.AdditionalAuthenticatedData = []byte("different AAD") k2 := OpenKeeper(client, KeyResourceID(project, location, keyRing, keyID1), &opts) defer k2.Close() // Encrypt/Decrypt with an AAD should work. secret := []byte("a secret") encryptedSecret, err := k1a.Encrypt(ctx, secret) if err != nil { t.Fatalf("failed to encrypt: %v", err) } if got, err := k1b.Decrypt(ctx, encryptedSecret); err != nil { t.Fatalf("failed to decrypt: %v", err) } else if string(got) != string(secret) { t.Errorf("unexpected decrypt result: %v", string(got)) } // Decrypting with a different AAD should fail. if _, err := k2.Decrypt(ctx, encryptedSecret); err == nil { t.Errorf("expected Decrypt with a different AAD to fail, but it did not") } } func TestOpenKeeper(t *testing.T) { cleanup := setup.FakeGCPDefaultCredentials(t) defer cleanup() tests := []struct { URL string WantErr bool }{ // OK. {"gcpkms://projects/MYPROJECT/locations/MYLOCATION/keyRings/MYKEYRING/cryptoKeys/MYKEY", false}, // Invalid additional_authenticated_data. {"gcpkms://projects/MYPROJECT/locations/MYLOCATION/keyRings/MYKEYRING/cryptoKeys/MYKEY?additional_authenticated_data=22", true}, // OK, with valid additional_authenticated_data. {"gcpkms://projects/MYPROJECT/locations/MYLOCATION/keyRings/MYKEYRING/cryptoKeys/MYKEY?additional_authenticated_data=SGVsbG8sIOS4lueVjA==", false}, // Invalid query parameter. {"gcpkms://projects/MYPROJECT/locations/MYLOCATION/keyRings/MYKEYRING/cryptoKeys/MYKEY?param=val", true}, } ctx := context.Background() for _, test := range tests { keeper, err := secrets.OpenKeeper(ctx, test.URL) if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } if err == nil { if err = keeper.Close(); err != nil { t.Errorf("%s: got error during close: %v", test.URL, err) } } } } ================================================ FILE: secrets/hashivault/example_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package hashivault_test import ( "context" "log" "github.com/hashicorp/vault/api" "gocloud.dev/secrets" "gocloud.dev/secrets/hashivault" ) func ExampleOpenKeeper() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // Get a client to use with the Vault API. client, err := hashivault.Dial(ctx, &hashivault.Config{ Token: "CLIENT_TOKEN", APIConfig: api.Config{ Address: "http://127.0.0.1:8200", }, }) if err != nil { log.Fatal(err) } // Construct a *secrets.Keeper. keeper := hashivault.OpenKeeper(client, "my-key", nil) defer keeper.Close() } func Example_openFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/secrets/hashivault" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() keeper, err := secrets.OpenKeeper(ctx, "hashivault://mykey") if err != nil { log.Fatal(err) } defer keeper.Close() } ================================================ FILE: secrets/hashivault/go.mod ================================================ // Copyright 2018-2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. module gocloud.dev/secrets/hashivault go 1.25.0 require ( github.com/hashicorp/vault/api v1.22.0 gocloud.dev v0.45.0 ) require ( cloud.google.com/go/auth v0.18.2 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect github.com/aws/aws-sdk-go-v2 v1.41.4 // indirect github.com/aws/aws-sdk-go-v2/config v1.32.12 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.19.12 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 // indirect github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 // indirect github.com/aws/smithy-go v1.24.2 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/go-jose/go-jose/v4 v4.1.3 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/go-cmp v0.7.0 // indirect github.com/google/go-replayers/grpcreplay v1.3.0 // indirect github.com/google/go-replayers/httpreplay v1.2.0 // indirect github.com/google/martian/v3 v3.3.3 // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/google/uuid v1.6.0 // indirect github.com/google/wire v0.7.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.14 // indirect github.com/googleapis/gax-go/v2 v2.19.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-retryablehttp v0.7.8 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect github.com/hashicorp/go-secure-stdlib/parseutil v0.2.0 // indirect github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 // indirect github.com/hashicorp/go-sockaddr v1.0.7 // indirect github.com/hashicorp/hcl v1.0.1-vault-7 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/ryanuber/go-glob v1.0.0 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 // indirect go.opentelemetry.io/otel v1.42.0 // indirect go.opentelemetry.io/otel/metric v1.42.0 // indirect go.opentelemetry.io/otel/sdk v1.42.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.42.0 // indirect go.opentelemetry.io/otel/trace v1.42.0 // indirect golang.org/x/crypto v0.49.0 // indirect golang.org/x/net v0.52.0 // indirect golang.org/x/oauth2 v0.36.0 // indirect golang.org/x/sys v0.42.0 // indirect golang.org/x/text v0.35.0 // indirect golang.org/x/time v0.15.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect google.golang.org/api v0.272.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260316180232-0b37fe3546d5 // indirect google.golang.org/grpc v1.79.3 // indirect google.golang.org/protobuf v1.36.11 // indirect ) replace gocloud.dev => ../../ ================================================ FILE: secrets/hashivault/go.sum ================================================ cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= cloud.google.com/go/auth v0.18.2 h1:+Nbt5Ev0xEqxlNjd6c+yYUeosQ5TtEUaNcN/3FozlaM= cloud.google.com/go/auth v0.18.2/go.mod h1:xD+oY7gcahcu7G2SG2DsBerfFxgPAJz17zz2joOFF3M= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= cloud.google.com/go/kms v1.26.0 h1:cK9mN2cf+9V63D3H1f6koxTatWy39aTI/hCjz1I+adU= cloud.google.com/go/kms v1.26.0/go.mod h1:pHKOdFJm63hxBsiPkYtowZPltu9dW0MWvBa6IA4HM58= cloud.google.com/go/longrunning v0.8.0 h1:LiKK77J3bx5gDLi4SMViHixjD2ohlkwBi+mKA7EhfW8= cloud.google.com/go/longrunning v0.8.0/go.mod h1:UmErU2Onzi+fKDg2gR7dusz11Pe26aknR4kHmJJqIfk= cloud.google.com/go/monitoring v1.24.3 h1:dde+gMNc0UhPZD1Azu6at2e79bfdztVDS5lvhOdsgaE= cloud.google.com/go/monitoring v1.24.3/go.mod h1:nYP6W0tm3N9H/bOw8am7t62YTzZY+zUeQ+Bi6+2eonI= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.61.3 h1:VS//ZfBuPGDvakfD9xyPW1RGF1Vy3BWUoVZXgW1KMOg= cloud.google.com/go/storage v1.61.3/go.mod h1:JtqK8BBB7TWv0HVGHubtUdzYYrakOQIsMLffZ2Z/HWk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0 h1:DHa2U07rk8syqvCge0QIGMCE1WxGj9njT44GH7zNJLQ= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 h1:UnDZ/zFfG1JhH/DqxIZYU/1CUAlTUScoXD/LcM2Ykk8= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0/go.mod h1:IA1C1U7jO/ENqm/vhi7V9YYpBsp+IMyqNrEN94N7tVc= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 h1:0s6TxfCu2KHkkZPnBfsQ2y5qia0jl3MMrmBhu3nCOYk= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0/go.mod h1:Mf6O40IAyB9zR/1J8nGDDPirZQQPbYJni8Yisy7NTMc= github.com/aws/aws-sdk-go-v2 v1.41.4 h1:10f50G7WyU02T56ox1wWXq+zTX9I1zxG46HYuG1hH/k= github.com/aws/aws-sdk-go-v2 v1.41.4/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o= github.com/aws/aws-sdk-go-v2/config v1.32.12 h1:O3csC7HUGn2895eNrLytOJQdoL2xyJy0iYXhoZ1OmP0= github.com/aws/aws-sdk-go-v2/config v1.32.12/go.mod h1:96zTvoOFR4FURjI+/5wY1vc1ABceROO4lWgWJuxgy0g= github.com/aws/aws-sdk-go-v2/credentials v1.19.12 h1:oqtA6v+y5fZg//tcTWahyN9PEn5eDU/Wpvc2+kJ4aY8= github.com/aws/aws-sdk-go-v2/credentials v1.19.12/go.mod h1:U3R1RtSHx6NB0DvEQFGyf/0sbrpJrluENHdPy1j/3TE= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 h1:zOgq3uezl5nznfoK3ODuqbhVg1JzAGDUhXOsU0IDCAo= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20/go.mod h1:z/MVwUARehy6GAg/yQ1GO2IMl0k++cu1ohP9zo887wE= github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 h1:CNXO7mvgThFGqOFgbNAP2nol2qAWBOGfqR/7tQlvLmc= github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20/go.mod h1:oydPDJKcfMhgfcgBUZaG+toBbwy8yPWubJXBVERtI4o= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 h1:tN6W/hg+pkM+tf9XDkWUbDEjGLb+raoBMFsTodcoYKw= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20/go.mod h1:YJ898MhD067hSHA6xYCx5ts/jEd8BSOLtQDL3iZsvbc= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 h1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 h1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 h1:2HvVAIq+YqgGotK6EkMf+KIEqTISmTYh5zLpYyeTo1Y= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20/go.mod h1:V4X406Y666khGa8ghKmphma/7C0DAtEQYhkq9z4vpbk= github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 h1:0GFOLzEbOyZABS3PhYfBIx2rNBACYcKty+XGkTgw1ow= github.com/aws/aws-sdk-go-v2/service/signin v1.0.8/go.mod h1:LXypKvk85AROkKhOG6/YEcHFPoX+prKTowKnVdcaIxE= github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 h1:kiIDLZ005EcKomYYITtfsjn7dtOwHDOFy7IbPXKek2o= github.com/aws/aws-sdk-go-v2/service/sso v1.30.13/go.mod h1:2h/xGEowcW/g38g06g3KpRWDlT+OTfxxI0o1KqayAB8= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 h1:jzKAXIlhZhJbnYwHbvUQZEB8KfgAEuG0dc08Bkda7NU= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17/go.mod h1:Al9fFsXjv4KfbzQHGe6V4NZSZQXecFcvaIF4e70FoRA= github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 h1:Cng+OOwCHmFljXIxpEVXAGMnBia8MSU6Ch5i9PgBkcU= github.com/aws/aws-sdk-go-v2/service/sts v1.41.9/go.mod h1:LrlIndBDdjA/EeXeyNBle+gyCwTlizzW5ycgWnvIxkk= github.com/aws/smithy-go v1.24.2 h1:FzA3bu/nt/vDvmnkg+R8Xl46gmzEDam6mZ1hzmwXFng= github.com/aws/smithy-go v1.24.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os8IaYg++6uMOdKK83QtkkvJik= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= github.com/envoyproxy/go-control-plane/envoy v1.37.0 h1:u3riX6BoYRfF4Dr7dwSOroNfdSbEPe9Yyl09/B6wBrQ= github.com/envoyproxy/go-control-plane/envoy v1.37.0/go.mod h1:DReE9MMrmecPy+YvQOAOHNYMALuowAnbjjEMkkWOi6A= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds= github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/go-replayers/grpcreplay v1.3.0 h1:1Keyy0m1sIpqstQmgz307zhiJ1pV4uIlFds5weTmxbo= github.com/google/go-replayers/grpcreplay v1.3.0/go.mod h1:v6NgKtkijC0d3e3RW8il6Sy5sqRVUwoQa4mHOGEy8DI= github.com/google/go-replayers/httpreplay v1.2.0 h1:VM1wEyyjaoU53BwrOnaf9VhAyQQEEioJvFYxYcLRKzk= github.com/google/go-replayers/httpreplay v1.2.0/go.mod h1:WahEFFZZ7a1P4VM1qEeHy+tME4bwyqPcwWbNlUI1Mcg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/wire v0.7.0 h1:JxUKI6+CVBgCO2WToKy/nQk0sS+amI9z9EjVmdaocj4= github.com/google/wire v0.7.0/go.mod h1:n6YbUQD9cPKTnHXEBN2DXlOp/mVADhVErcMFb0v3J18= github.com/googleapis/enterprise-certificate-proxy v0.3.14 h1:yh8ncqsbUY4shRD5dA6RlzjJaT4hi3kII+zYw8wmLb8= github.com/googleapis/enterprise-certificate-proxy v0.3.14/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.19.0 h1:fYQaUOiGwll0cGj7jmHT/0nPlcrZDFPrZRhTsoCr8hE= github.com/googleapis/gax-go/v2 v2.19.0/go.mod h1:w2ROXVdfGEVFXzmlciUU4EdjHgWvB5h2n6x/8XSTTJA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-retryablehttp v0.7.8 h1:ylXZWnqa7Lhqpk0L1P1LzDtGcCR0rPVUrx/c8Unxc48= github.com/hashicorp/go-retryablehttp v0.7.8/go.mod h1:rjiScheydd+CxvumBsIrFKlx3iS0jrZ7LvzFGFmuKbw= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-secure-stdlib/parseutil v0.2.0 h1:U+kC2dOhMFQctRfhK0gRctKAPTloZdMU5ZJxaesJ/VM= github.com/hashicorp/go-secure-stdlib/parseutil v0.2.0/go.mod h1:Ll013mhdmsVDuoIXVfBtvgGJsXDYkTw1kooNcoCXuE0= github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 h1:kes8mmyCpxJsI7FTwtzRqEy9CdjCtrXrXGuOpxEA7Ts= github.com/hashicorp/go-secure-stdlib/strutil v0.1.2/go.mod h1:Gou2R9+il93BqX25LAKCLuM+y9U2T4hlwvT1yprcna4= github.com/hashicorp/go-sockaddr v1.0.7 h1:G+pTkSO01HpR5qCxg7lxfsFEZaG+C0VssTy/9dbT+Fw= github.com/hashicorp/go-sockaddr v1.0.7/go.mod h1:FZQbEYa1pxkQ7WLpyXJ6cbjpT8q0YgQaK/JakXqGyWw= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.1-vault-7 h1:ag5OxFVy3QYTFTJODRzTKVZ6xvdfLLCA1cy/Y6xGI0I= github.com/hashicorp/hcl v1.0.1-vault-7/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM= github.com/hashicorp/vault/api v1.22.0 h1:+HYFquE35/B74fHoIeXlZIP2YADVboaPjaSicHEZiH0= github.com/hashicorp/vault/api v1.22.0/go.mod h1:IUZA2cDvr4Ok3+NtK2Oq/r+lJeXkeCrHRmqdyWfpmGM= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/detectors/gcp v1.42.0 h1:kpt2PEJuOuqYkPcktfJqWWDjTEd/FNgrxcniL7kQrXQ= go.opentelemetry.io/contrib/detectors/gcp v1.42.0/go.mod h1:W9zQ439utxymRrXsUOzZbFX4JhLxXU4+ZnCt8GG7yA8= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0 h1:yI1/OhfEPy7J9eoa6Sj051C7n5dvpj0QX8g4sRchg04= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0/go.mod h1:NoUCKYWK+3ecatC4HjkRktREheMeEtrXoQxrqYFeHSc= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 h1:OyrsyzuttWTSur2qN/Lm0m2a8yqyIjUVBZcxFPuXq2o= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0/go.mod h1:C2NGBr+kAB4bk3xtMXfZ94gqFDtg/GkI7e9zqGh5Beg= go.opentelemetry.io/otel v1.42.0 h1:lSQGzTgVR3+sgJDAU/7/ZMjN9Z+vUip7leaqBKy4sho= go.opentelemetry.io/otel v1.42.0/go.mod h1:lJNsdRMxCUIWuMlVJWzecSMuNjE7dOYyWlqOXWkdqCc= go.opentelemetry.io/otel/metric v1.42.0 h1:2jXG+3oZLNXEPfNmnpxKDeZsFI5o4J+nz6xUlaFdF/4= go.opentelemetry.io/otel/metric v1.42.0/go.mod h1:RlUN/7vTU7Ao/diDkEpQpnz3/92J9ko05BIwxYa2SSI= go.opentelemetry.io/otel/sdk v1.42.0 h1:LyC8+jqk6UJwdrI/8VydAq/hvkFKNHZVIWuslJXYsDo= go.opentelemetry.io/otel/sdk v1.42.0/go.mod h1:rGHCAxd9DAph0joO4W6OPwxjNTYWghRWmkHuGbayMts= go.opentelemetry.io/otel/sdk/metric v1.42.0 h1:D/1QR46Clz6ajyZ3G8SgNlTJKBdGp84q9RKCAZ3YGuA= go.opentelemetry.io/otel/sdk/metric v1.42.0/go.mod h1:Ua6AAlDKdZ7tdvaQKfSmnFTdHx37+J4ba8MwVCYM5hc= go.opentelemetry.io/otel/trace v1.42.0 h1:OUCgIPt+mzOnaUTpOQcBiM/PLQ/Op7oq6g4LenLmOYY= go.opentelemetry.io/otel/trace v1.42.0/go.mod h1:f3K9S+IFqnumBkKhRJMeaZeNk9epyhnCmQh/EysQCdc= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= google.golang.org/api v0.272.0 h1:eLUQZGnAS3OHn31URRf9sAmRk3w2JjMx37d2k8AjJmA= google.golang.org/api v0.272.0/go.mod h1:wKjowi5LNJc5qarNvDCvNQBn3rVK8nSy6jg2SwRwzIA= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20260316180232-0b37fe3546d5 h1:JNfk58HZ8lfmXbYK2vx/UvsqIL59TzByCxPIX4TDmsE= google.golang.org/genproto v0.0.0-20260316180232-0b37fe3546d5/go.mod h1:x5julN69+ED4PcFk/XWayw35O0lf/nGa4aNgODCmNmw= google.golang.org/genproto/googleapis/api v0.0.0-20260316180232-0b37fe3546d5 h1:CogIeEXn4qWYzzQU0QqvYBM8yDF9cFYzDq9ojSpv0Js= google.golang.org/genproto/googleapis/api v0.0.0-20260316180232-0b37fe3546d5/go.mod h1:EIQZ5bFCfRQDV4MhRle7+OgjNtZ6P1PiZBgAKuxXu/Y= google.golang.org/genproto/googleapis/rpc v0.0.0-20260316180232-0b37fe3546d5 h1:aJmi6DVGGIStN9Mobk/tZOOQUBbj0BPjZjjnOdoZKts= google.golang.org/genproto/googleapis/rpc v0.0.0-20260316180232-0b37fe3546d5/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= ================================================ FILE: secrets/hashivault/localvault.sh ================================================ #!/usr/bin/env bash # Copyright 2019 The Go Cloud Development Kit Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Starts a local Vault instance via Docker. # https://coderwall.com/p/fkfaqq/safer-bash-scripts-with-set-euxo-pipefail set -euo pipefail echo "Starting Vault Server..." docker rm -f dev-vault &> /dev/null || : docker run --cap-add=IPC_LOCK -d --name=dev-vault -e 'VAULT_DEV_ROOT_TOKEN_ID=faketoken' -p 8200:8200 vault:1.6.0 &> /dev/null echo "...done. Run \"docker rm -f dev-vault\" to clean up the container." echo ================================================ FILE: secrets/hashivault/vault.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limtations under the License. // Package hashivault provides a secrets implementation using the Transit // Secrets Engine of Vault by Hashicorp. // Use OpenKeeper to construct a *secrets.Keeper. // // # URLs // // For secrets.OpenKeeper, hashivault registers for the scheme "hashivault". // The default URL opener will dial a Vault server using the environment variables // "VAULT_SERVER_URL" (or "VAULT_ADDR") and "VAULT_SERVER_TOKEN" (or "VAULT_TOKEN"). // To customize the URL opener, or for more details on the URL format, // see URLOpener. // See https://gocloud.dev/concepts/urls/ for background information. // // # As // // hashivault does not support any types for As. package hashivault import ( "context" "encoding/base64" "errors" "fmt" "net/url" "os" "path" "sync" "github.com/hashicorp/vault/api" "gocloud.dev/gcerrors" "gocloud.dev/secrets" ) // Config is the authentication configurations of the Vault server. type Config struct { // Token is the access token the Vault client uses to talk to the server. // See https://www.vaultproject.io/docs/concepts/tokens.html for more // information. Token string // APIConfig is used to configure the creation of the client. APIConfig api.Config } // Dial gets a Vault client. func Dial(ctx context.Context, cfg *Config) (*api.Client, error) { if cfg == nil { return nil, errors.New("no auth Config provided") } c, err := api.NewClient(&cfg.APIConfig) if err != nil { return nil, err } if cfg.Token != "" { c.SetToken(cfg.Token) } return c, nil } func init() { secrets.DefaultURLMux().RegisterKeeper(Scheme, new(defaultDialer)) } // getVaultURL ensures that we check both VAULT_SERVER_URL and VAULT_ADDR environment // variables for the API address for vault. VAULT_SERVER_URL takes precedence over VAULT_ADDR. func getVaultURL() (string, error) { serverURL := os.Getenv("VAULT_SERVER_URL") if serverURL != "" { return serverURL, nil } vaultAddr := os.Getenv("VAULT_ADDR") if vaultAddr != "" { return vaultAddr, nil } return "", errors.New("neither VAULT_SERVER_URL nor VAULT_ADDR environment variables are set") } // getVaultToken ensures that we check both VAULT_SERVER_TOKEN and VAULT_TOKEN environment // variables for the API token for vault. VAULT_SERVER_TOKEN takes precedence over VAULT_TOKEN. // If neither environment variables are found, then we return an empty string as token is not required. func getVaultToken() string { serverToken := os.Getenv("VAULT_SERVER_TOKEN") if serverToken != "" { return serverToken } vaultToken := os.Getenv("VAULT_TOKEN") if vaultToken != "" { return vaultToken } return "" } // defaultDialer dials a default Vault server based on the environment variables // VAULT_SERVER_URL / VAULT_ADDR and VAULT_SERVER_TOKEN / VAULT_TOKEN type defaultDialer struct { init sync.Once opener *URLOpener err error } func (o *defaultDialer) OpenKeeperURL(ctx context.Context, u *url.URL) (*secrets.Keeper, error) { o.init.Do(func() { serverURL, err := getVaultURL() if err != nil { o.err = err return } token := getVaultToken() cfg := Config{Token: token, APIConfig: api.Config{Address: serverURL}} client, err := Dial(ctx, &cfg) if err != nil { o.err = fmt.Errorf("failed to Dial default Vault server at %q: %v", serverURL, err) return } o.opener = &URLOpener{Client: client} }) if o.err != nil { return nil, fmt.Errorf("open keeper %v: %v", u, o.err) } return o.opener.OpenKeeperURL(ctx, u) } // Scheme is the URL scheme hashivault registers its URLOpener under on secrets.DefaultMux. const Scheme = "hashivault" // URLOpener opens Vault URLs like "hashivault://mykey". // // The URL Host + Path are used as the keyID. // // The following query parameters are supported: // - engine: The secrets engine to use; defaults to "transit". type URLOpener struct { // Client must be non-nil. Client *api.Client // Options specifies the options to pass to OpenKeeper. Options KeeperOptions } // OpenKeeperURL opens the Keeper URL. func (o *URLOpener) OpenKeeperURL(ctx context.Context, u *url.URL) (*secrets.Keeper, error) { for param, vals := range u.Query() { switch param { case "engine": o.Options.Engine = vals[0] default: return nil, fmt.Errorf("open keeper %v: invalid query parameter %q", u, param) } } return OpenKeeper(o.Client, path.Join(u.Host, u.Path), &o.Options), nil } func newKeeper(client *api.Client, keyID string, opts *KeeperOptions) *keeper { if opts == nil { opts = &KeeperOptions{} } if opts.Engine == "" { opts.Engine = "transit" } return &keeper{ keyID: keyID, client: client, opts: *opts, } } // OpenKeeper returns a *secrets.Keeper that uses the Transit Secrets Engine of // Vault by Hashicorp. // See the package documentation for an example. func OpenKeeper(client *api.Client, keyID string, opts *KeeperOptions) *secrets.Keeper { return secrets.NewKeeper(newKeeper(client, keyID, opts)) } type keeper struct { // keyID is an encryption key ring name used by the Vault's transit API. keyID string client *api.Client opts KeeperOptions } // Decrypt decrypts the ciphertext into a plaintext. func (k *keeper) Decrypt(ctx context.Context, ciphertext []byte) ([]byte, error) { out, err := k.client.Logical().Write( path.Join(k.opts.Engine+"/decrypt", k.keyID), map[string]any{ "ciphertext": string(ciphertext), }, ) if err != nil { return nil, err } return base64.StdEncoding.DecodeString(out.Data["plaintext"].(string)) } // Encrypt encrypts a plaintext into a ciphertext. func (k *keeper) Encrypt(ctx context.Context, plaintext []byte) ([]byte, error) { secret, err := k.client.Logical().Write( path.Join(k.opts.Engine+"/encrypt", k.keyID), map[string]any{ "plaintext": plaintext, }, ) if err != nil { return nil, err } return []byte(secret.Data["ciphertext"].(string)), nil } // Close implements driver.Keeper.Close. func (k *keeper) Close() error { return nil } // ErrorAs implements driver.Keeper.ErrorAs. func (k *keeper) ErrorAs(err error, i any) bool { return false } // ErrorCode implements driver.ErrorCode. func (k *keeper) ErrorCode(error) gcerrors.ErrorCode { // TODO(shantuo): try to classify vault error codes return gcerrors.Unknown } // KeeperOptions controls Keeper behaviors. // It is provided for future extensibility. type KeeperOptions struct { // Engine is the name of the secrets engine to use. // It defaults to "transit". Engine string } ================================================ FILE: secrets/hashivault/vault_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limtations under the License. package hashivault import ( "context" "errors" "os" "sync" "testing" "time" "github.com/hashicorp/vault/api" "gocloud.dev/internal/testing/setup" "gocloud.dev/secrets" "gocloud.dev/secrets/driver" "gocloud.dev/secrets/drivertest" ) // To run these tests against a real Vault server, first run ./localvault.sh. // Then wait a few seconds for the server to be ready. const ( keyID1 = "test-secrets" keyID2 = "test-secrets2" apiAddress = "http://127.0.0.1:8200" testToken = "faketoken" ) // enableTransit checks and makes sure the Transit API is enabled only once. var enableTransit sync.Once type harness struct { client *api.Client close func() } func (h *harness) MakeDriver(ctx context.Context) (driver.Keeper, driver.Keeper, error) { return newKeeper(h.client, keyID1, nil), newKeeper(h.client, keyID2, nil), nil } func (h *harness) Close() {} func newHarness(ctx context.Context, t *testing.T) (drivertest.Harness, error) { if !setup.HasDockerTestEnvironment() { t.Skip("Skipping Vault tests since the Vault server is not available") } c, err := Dial(ctx, &Config{ Token: testToken, APIConfig: api.Config{ Address: apiAddress, }, }) if err != nil { return nil, err } c.SetClientTimeout(3 * time.Second) // Enable the Transit Secrets Engine to use Vault as an Encryption as a Service. enableTransit.Do(func() { s, err := c.Logical().Read("sys/mounts") if err != nil { t.Fatal(err, "; run secrets/hashivault/localvault.sh to start a dev vault container") } if _, ok := s.Data["transit/"]; !ok { if _, err := c.Logical().Write("sys/mounts/transit", map[string]any{"type": "transit"}); err != nil { t.Fatal(err, "; run secrets/hashivault/localvault.sh to start a dev vault container") } } }) return &harness{ client: c, }, nil } func TestConformance(t *testing.T) { drivertest.RunConformanceTests(t, newHarness, []drivertest.AsTest{verifyAs{}}) } type verifyAs struct{} func (v verifyAs) Name() string { return "verify As function" } func (v verifyAs) ErrorCheck(k *secrets.Keeper, err error) error { var s string if k.ErrorAs(err, &s) { return errors.New("Keeper.ErrorAs expected to fail") } return nil } // Vault-specific tests. func TestNoSessionProvidedError(t *testing.T) { if _, err := Dial(context.Background(), nil); err == nil { t.Error("got nil, want no auth Config provided") } } func TestNoConnectionError(t *testing.T) { ctx := context.Background() // Dial calls vault's NewClient method, which doesn't make the connection. Try // doing encryption which should fail by no connection. client, err := Dial(ctx, &Config{ Token: "<Client (Root) Token>", APIConfig: api.Config{ Address: apiAddress, }, }) if err != nil { t.Fatal(err) } keeper := OpenKeeper(client, "my-key", nil) defer keeper.Close() if _, err := keeper.Encrypt(ctx, []byte("test")); err == nil { t.Error("got nil, want connection refused") } } func fakeConnectionStringInEnv() func() { oldURLVal := os.Getenv("VAULT_SERVER_URL") oldTokenVal := os.Getenv("VAULT_SERVER_TOKEN") os.Setenv("VAULT_SERVER_URL", "http://myvaultserver") os.Setenv("VAULT_SERVER_TOKEN", "faketoken") return func() { os.Setenv("VAULT_SERVER_URL", oldURLVal) os.Setenv("VAULT_SERVER_TOKEN", oldTokenVal) } } func alternativeConnectionStringEnvVars() func() { oldURLVal := os.Getenv("VAULT_ADDR") oldTokenVal := os.Getenv("VAULT_TOKEN") os.Setenv("VAULT_ADDR", "http://myalternativevaultserver") os.Setenv("VAULT_TOKEN", "faketoken2") return func() { os.Setenv("VAULT_ADDR", oldURLVal) os.Setenv("VAULT_TOKEN", oldTokenVal) } } func unsetConnectionStringEnvVars() func() { oldURLVal := os.Getenv("VAULT_ADDR") oldTokenVal := os.Getenv("VAULT_TOKEN") oldServerURLVal := os.Getenv("VAULT_SERVER_URL") oldServerTokenVal := os.Getenv("VAULT_SERVER_TOKEN") os.Unsetenv("VAULT_ADDR") os.Unsetenv("VAULT_TOKEN") os.Unsetenv("VAULT_SERVER_URL") os.Unsetenv("VAULT_SERVER_TOKEN") return func() { os.Setenv("VAULT_ADDR", oldURLVal) os.Setenv("VAULT_SERVER_URL", oldServerURLVal) os.Setenv("VAULT_TOKEN", oldTokenVal) os.Setenv("VAULT_SERVER_TOKEN", oldServerTokenVal) } } func TestOpenKeeper(t *testing.T) { cleanup := fakeConnectionStringInEnv() defer cleanup() tests := []struct { URL string WantErr bool }{ // OK. {"hashivault://mykey", false}, // OK, setting engine. {"hashivault://mykey?engine=foo", false}, // Invalid parameter. {"hashivault://mykey?param=value", true}, } ctx := context.Background() for _, test := range tests { keeper, err := secrets.OpenKeeper(ctx, test.URL) if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } if err == nil { if err = keeper.Close(); err != nil { t.Errorf("%s: got error during close: %v", test.URL, err) } } } } func TestGetVaultConnectionDetails(t *testing.T) { t.Run("Test Current Env Vars", func(t *testing.T) { cleanup := fakeConnectionStringInEnv() defer cleanup() serverUrl, err := getVaultURL() if err != nil { t.Errorf("got unexpected error: %v", err) } if serverUrl != "http://myvaultserver" { t.Errorf("expected 'http://myvaultserver': got %q", serverUrl) } vaultToken := getVaultToken() if vaultToken != "faketoken" { t.Errorf("export 'faketoken': got %q", vaultToken) } }) t.Run("Test Alternative Env Vars", func(t *testing.T) { cleanup := alternativeConnectionStringEnvVars() defer cleanup() serverUrl, err := getVaultURL() if err != nil { t.Errorf("got unexpected error: %v", err) } if serverUrl != "http://myalternativevaultserver" { t.Errorf("export '': got %q", serverUrl) } vaultToken := getVaultToken() if vaultToken != "faketoken2" { t.Errorf("export 'faketoken2': got %q", vaultToken) } }) t.Run("Test Unset Env Vars Throws Error", func(t *testing.T) { cleanup := unsetConnectionStringEnvVars() defer cleanup() serverUrl, err := getVaultURL() if err == nil { t.Errorf("expected error but got a url: %s", serverUrl) } vaultToken := getVaultToken() if vaultToken != "" { t.Errorf("export '': got %q", vaultToken) } }) } ================================================ FILE: secrets/localsecrets/example_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package localsecrets_test import ( "context" "log" "gocloud.dev/secrets" "gocloud.dev/secrets/localsecrets" ) func ExampleNewKeeper() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. secretKey, err := localsecrets.NewRandomKey() if err != nil { log.Fatal(err) } keeper := localsecrets.NewKeeper(secretKey) defer keeper.Close() } func Example_openFromURL() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/secrets/localsecrets" // PRAGMA: On gocloud.dev, hide lines until the next blank line. ctx := context.Background() // Using "base64key://", a new random key will be generated. randomKeyKeeper, err := secrets.OpenKeeper(ctx, "base64key://") if err != nil { log.Fatal(err) } defer randomKeyKeeper.Close() // Otherwise, the URL hostname must be a base64-encoded key, of length 32 bytes when decoded. // Note that base64.URLEncode should be used, to avoid URL-unsafe characters. savedKeyKeeper, err := secrets.OpenKeeper(ctx, "base64key://smGbjm71Nxd1Ig5FS0wj9SlbzAIrnolCz9bQQ6uAhl4=") if err != nil { log.Fatal(err) } defer savedKeyKeeper.Close() } ================================================ FILE: secrets/localsecrets/localsecrets.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package localsecrets provides a secrets implementation using a locally // provided symmetric key. // Use NewKeeper to construct a *secrets.Keeper. // // # URLs // // For secrets.OpenKeeper, localsecrets registers for the scheme "base64key". // To customize the URL opener, or for more details on the URL format, // see URLOpener. // See https://gocloud.dev/concepts/urls/ for background information. // // # As // // localsecrets does not support any types for As. package localsecrets // import "gocloud.dev/secrets/localsecrets" import ( "context" "crypto/rand" "encoding/base64" "errors" "fmt" "io" "net/url" "gocloud.dev/gcerrors" "gocloud.dev/secrets" "golang.org/x/crypto/nacl/secretbox" ) func init() { secrets.DefaultURLMux().RegisterKeeper(Scheme, &URLOpener{}) } // Scheme is the URL scheme localsecrets registers its URLOpener under on // secrets.DefaultMux. // See the package documentation and/or URLOpener for details. const ( Scheme = "base64key" ) // URLOpener opens localsecrets URLs like "base64key://smGbjm71Nxd1Ig5FS0wj9SlbzAIrnolCz9bQQ6uAhl4=". // // The URL host must be base64 encoded, and must decode to exactly 32 bytes. // Note that base64.URLEncoding should be used to avoid URL-unsafe character in the hostname. // If the URL host is empty (e.g., "base64key://"), a new random key is generated. // // No query parameters are supported. type URLOpener struct{} // OpenKeeperURL opens Keeper URLs. func (o *URLOpener) OpenKeeperURL(ctx context.Context, u *url.URL) (*secrets.Keeper, error) { for param := range u.Query() { return nil, fmt.Errorf("open keeper %v: invalid query parameter %q", u, param) } var sk [32]byte var err error if u.Host == "" { sk, err = NewRandomKey() } else { sk, err = Base64Key(u.Host) } if err != nil { return nil, fmt.Errorf("open keeper %v: failed to get key: %v", u, err) } return NewKeeper(sk), nil } // keeper holds a secret for use in symmetric encryption, // and implements driver.Keeper. type keeper struct { secretKey [32]byte // secretbox key size } // NewKeeper returns a *secrets.Keeper that uses the given symmetric // key. See the package documentation for an example. func NewKeeper(sk [32]byte) *secrets.Keeper { return secrets.NewKeeper( &keeper{secretKey: sk}, ) } // Base64KeyStd takes a secret key as a base64 string and converts it // to a [32]byte, erroring if the decoded data is not 32 bytes. // It uses base64.StdEncoding. func Base64KeyStd(base64str string) ([32]byte, error) { return base64Key(base64str, base64.StdEncoding) } // Base64Key takes a secret key as a base64 string and converts it // to a [32]byte, erroring if the decoded data is not 32 bytes. // It uses base64.URLEncoding. func Base64Key(base64str string) ([32]byte, error) { return base64Key(base64str, base64.URLEncoding) } func base64Key(base64str string, encoding *base64.Encoding) ([32]byte, error) { var sk32 [32]byte key, err := encoding.DecodeString(base64str) if err != nil { return sk32, err } keySize := len([]byte(key)) if keySize != 32 { return sk32, fmt.Errorf("Base64Key: secret key material is %v bytes, want 32 bytes", keySize) } copy(sk32[:], key) return sk32, nil } // NewRandomKey will generate random secret key material suitable to be // used as the secret key argument to NewKeeper. func NewRandomKey() ([32]byte, error) { var sk32 [32]byte // Read random numbers into the passed slice until it's full. _, err := rand.Read(sk32[:]) if err != nil { return sk32, err } return sk32, nil } const nonceSize = 24 // Encrypt encrypts a message using a per-message generated nonce and // the secret held in the Keeper. func (k *keeper) Encrypt(ctx context.Context, message []byte) ([]byte, error) { var nonce [nonceSize]byte if _, err := io.ReadFull(rand.Reader, nonce[:]); err != nil { return nil, err } // secretbox.Seal appends the encrypted message to its first argument and returns // the result; using a slice on top of the nonce array for this "out" arg allows reading // the nonce out of the first nonceSize bytes when the message is decrypted. return secretbox.Seal(nonce[:], message, &nonce, &k.secretKey), nil } // Decrypt decrypts a message using a nonce that is read out of the first nonceSize bytes // of the message and a secret held in the Keeper. func (k *keeper) Decrypt(ctx context.Context, message []byte) ([]byte, error) { if len(message) < nonceSize { return nil, fmt.Errorf("localsecrets: invalid message length (%d, expected at least %d)", len(message), nonceSize) } var decryptNonce [nonceSize]byte copy(decryptNonce[:], message[:nonceSize]) decrypted, ok := secretbox.Open(nil, message[nonceSize:], &decryptNonce, &k.secretKey) if !ok { return nil, errors.New("localsecrets: Decrypt failed") } return decrypted, nil } // Close implements driver.Keeper.Close. func (k *keeper) Close() error { return nil } // ErrorAs implements driver.Keeper.ErrorAs. func (k *keeper) ErrorAs(err error, i any) bool { return false } // ErrorCode implements driver.ErrorCode. func (k *keeper) ErrorCode(error) gcerrors.ErrorCode { return gcerrors.Unknown } ================================================ FILE: secrets/localsecrets/localsecrets_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package localsecrets import ( "context" "errors" "log" "strings" "testing" "gocloud.dev/secrets" "gocloud.dev/secrets/driver" "gocloud.dev/secrets/drivertest" ) type harness struct{} func (h *harness) MakeDriver(ctx context.Context) (driver.Keeper, driver.Keeper, error) { secret1, err := NewRandomKey() if err != nil { log.Fatal(err) } secret2, err := NewRandomKey() if err != nil { log.Fatal(err) } return &keeper{secretKey: secret1}, &keeper{secretKey: secret2}, nil } func (h *harness) Close() {} func newHarness(ctx context.Context, t *testing.T) (drivertest.Harness, error) { t.Helper() return &harness{}, nil } func TestConformance(t *testing.T) { drivertest.RunConformanceTests(t, newHarness, []drivertest.AsTest{verifyAs{}}) } type verifyAs struct{} func (v verifyAs) Name() string { return "verify As function" } func (v verifyAs) ErrorCheck(k *secrets.Keeper, err error) error { var s string if k.ErrorAs(err, &s) { return errors.New("Keeper.ErrorAs expected to fail") } return nil } func TestSmallData(t *testing.T) { key, err := NewRandomKey() if err != nil { t.Fatal(err) } keeper := NewKeeper(key) defer keeper.Close() ctx := context.Background() const plaintext = "hello world" ciphertext, err := keeper.Encrypt(ctx, []byte(plaintext)) if err != nil { t.Fatal(err) } tests := []struct { Ciphertext []byte Want string WantErr bool WantInvalidLengthErr bool // true if we want the error to be that the ciphertext length is invalid }{ {nil, "", true, true}, {[]byte{}, "", true, true}, {[]byte{0}, "", true, true}, {ciphertext[:1], "", true, true}, {ciphertext[:nonceSize-1], "", true, true}, {ciphertext[:nonceSize], "", true, false}, // not invalid, but Decrypt will fail {ciphertext, plaintext, false, false}, // works } for _, test := range tests { got, err := keeper.Decrypt(ctx, test.Ciphertext) if (err != nil) != test.WantErr { t.Errorf("got err %v from Decrypt, want error? %v", err, test.WantErr) } if err == nil { if gotStr := string(got); gotStr != test.Want { t.Errorf("got %s want %s", gotStr, test.Want) } } else { if gotInvalid := strings.Contains(err.Error(), "invalid message length"); gotInvalid != test.WantInvalidLengthErr { t.Errorf("got invalid message length error? %v want %v", gotInvalid, test.WantInvalidLengthErr) } } // Encrypt should always work. if _, err := keeper.Encrypt(ctx, test.Ciphertext); err != nil { t.Errorf("got error %v from Encrypt, want nil", err) } } } func TestOpenKeeper(t *testing.T) { tests := []struct { URL string WantErr bool }{ // OK. {"base64key://", false}, // OK. {"base64key://smGbjm71Nxd1Ig5FS0wj9SlbzAIrnolCz9bQQ6uAhl4=", false}, // Valid base64, but < 32 bytes. {"base64key://c2VjcmV0", true}, // Valid base64, but > 32 bytes. {"base64key://c2VjcmV0c2VjcmV0c2VjcmV0c2VjcmV0c2VjcmV0c3NlY3JldHNlY3JldHNlY3JldHNlY3JldHNlY3JldHM=", true}, // Invalid base64 key. {"base64key://not-valid-base64", true}, // Valid base64 key (but invalid if using Std encoding instead of URL encoding). {"base64Key://UKcmEoZW7nKl0uPHr8yV__KJm0ANhiFz8PzDN-gYWq8=", false}, // Invalid parameter. {"base64key://?param=value", true}, } ctx := context.Background() for _, test := range tests { keeper, err := secrets.OpenKeeper(ctx, test.URL) if (err != nil) != test.WantErr { t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) } if err == nil { if err = keeper.Close(); err != nil { t.Errorf("%s: got error during close: %v", test.URL, err) } } } } ================================================ FILE: secrets/secrets.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package secrets provides an easy and portable way to encrypt and decrypt // messages. Subpackages contain driver implementations of // secrets for supported services. // // See https://gocloud.dev/howto/secrets/ for a detailed how-to guide. // // # OpenTelemetry Integration // // OpenTelemetry supports tracing and metric collection for multiple languages and // backend providers. See https://opentelemetry.io. // // This API collects OpenTelemetry traces and metrics for the following methods: // - Encrypt // - Decrypt // // All trace and metric names begin with the package import path. // The traces add the method name. // For example, "gocloud.dev/secrets/Encrypt". // The metrics are "completed_calls", a count of completed method calls by driver, // method and status (error code); and "latency", a distribution of method latency // by driver and method. // For example, "gocloud.dev/secrets/latency". // // To enable trace collection in your application, see the OpenTelemetry documentation at // https://opentelemetry.io/docs/instrumentation/go/getting-started/. package secrets // import "gocloud.dev/secrets" import ( "context" "net/url" "sync" "gocloud.dev/internal/gcerr" "gocloud.dev/internal/openurl" gcdkotel "gocloud.dev/internal/otel" "gocloud.dev/secrets/driver" ) // Keeper does encryption and decryption. To create a Keeper, use constructors // found in driver subpackages. type Keeper struct { k driver.Keeper tracer *gcdkotel.Tracer // mu protects the closed variable. // Read locks are kept to allow holding a read lock for long-running calls, // and thereby prevent closing until a call finishes. mu sync.RWMutex closed bool } // NewKeeper is intended for use by drivers only. Do not use in application code. var NewKeeper = newKeeper // newKeeper creates a Keeper. func newKeeper(k driver.Keeper) *Keeper { return &Keeper{ k: k, tracer: gcdkotel.NewTracer(pkgName, gcdkotel.ProviderName(k)), } } const pkgName = "gocloud.dev/secrets" var ( // OpenTelemetryViews are predefined views for OpenTelemetry metrics. // The views include counts and latency distributions for API method calls. // See the explanations at https://opentelemetry.io/docs/specs/otel/metrics/data-model/ for usage. OpenTelemetryViews = gcdkotel.Views(pkgName) ) // Encrypt encrypts the plaintext and returns the cipher message. func (k *Keeper) Encrypt(ctx context.Context, plaintext []byte) (ciphertext []byte, err error) { ctx, span := k.tracer.Start(ctx, "Encrypt") defer func() { k.tracer.End(ctx, span, err) }() k.mu.RLock() defer k.mu.RUnlock() if k.closed { return nil, errClosed } b, err := k.k.Encrypt(ctx, plaintext) if err != nil { return nil, wrapError(k, err) } return b, nil } // Decrypt decrypts the ciphertext and returns the plaintext. func (k *Keeper) Decrypt(ctx context.Context, ciphertext []byte) (plaintext []byte, err error) { ctx, span := k.tracer.Start(ctx, "Decrypt") defer func() { k.tracer.End(ctx, span, err) }() k.mu.RLock() defer k.mu.RUnlock() if k.closed { return nil, errClosed } b, err := k.k.Decrypt(ctx, ciphertext) if err != nil { return nil, wrapError(k, err) } return b, nil } var errClosed = gcerr.Newf(gcerr.FailedPrecondition, nil, "secrets: Keeper has been closed") // Close releases any resources used for the Keeper. func (k *Keeper) Close() error { k.mu.Lock() prev := k.closed k.closed = true k.mu.Unlock() if prev { return errClosed } return wrapError(k, k.k.Close()) } // ErrorAs converts i to driver-specific types. See // https://gocloud.dev/concepts/as/ for background information and the // driver package documentation for the specific types supported for // that driver. // // ErrorAs panics if i is nil or not a pointer. // ErrorAs returns false if err == nil. func (k *Keeper) ErrorAs(err error, i any) bool { return gcerr.ErrorAs(err, i, k.k.ErrorAs) } func wrapError(k *Keeper, err error) error { if err == nil { return nil } if gcerr.DoNotWrap(err) { return err } return gcerr.New(k.k.ErrorCode(err), err, 2, "secrets") } // KeeperURLOpener represents types that can open Keepers based on a URL. // The opener must not modify the URL argument. OpenKeeperURL must be safe to // call from multiple goroutines. // // This interface is generally implemented by types in driver packages. type KeeperURLOpener interface { OpenKeeperURL(ctx context.Context, u *url.URL) (*Keeper, error) } // URLMux is a URL opener multiplexer. It matches the scheme of the URLs // against a set of registered schemes and calls the opener that matches the // URL's scheme. // See https://gocloud.dev/concepts/urls/ for more information. // // The zero value is a multiplexer with no registered schemes. type URLMux struct { schemes openurl.SchemeMap } // KeeperSchemes returns a sorted slice of the registered Keeper schemes. func (mux *URLMux) KeeperSchemes() []string { return mux.schemes.Schemes() } // ValidKeeperScheme returns true iff scheme has been registered for Keepers. func (mux *URLMux) ValidKeeperScheme(scheme string) bool { return mux.schemes.ValidScheme(scheme) } // RegisterKeeper registers the opener with the given scheme. If an opener // already exists for the scheme, RegisterKeeper panics. func (mux *URLMux) RegisterKeeper(scheme string, opener KeeperURLOpener) { mux.schemes.Register("secrets", "Keeper", scheme, opener) } // OpenKeeper calls OpenKeeperURL with the URL parsed from urlstr. // OpenKeeper is safe to call from multiple goroutines. func (mux *URLMux) OpenKeeper(ctx context.Context, urlstr string) (*Keeper, error) { opener, u, err := mux.schemes.FromString("Keeper", urlstr) if err != nil { return nil, err } return opener.(KeeperURLOpener).OpenKeeperURL(ctx, u) } // OpenKeeperURL dispatches the URL to the opener that is registered with the // URL's scheme. OpenKeeperURL is safe to call from multiple goroutines. func (mux *URLMux) OpenKeeperURL(ctx context.Context, u *url.URL) (*Keeper, error) { opener, err := mux.schemes.FromURL("Keeper", u) if err != nil { return nil, err } return opener.(KeeperURLOpener).OpenKeeperURL(ctx, u) } var defaultURLMux = new(URLMux) // DefaultURLMux returns the URLMux used by OpenKeeper. // // Driver packages can use this to register their KeeperURLOpener on the mux. func DefaultURLMux() *URLMux { return defaultURLMux } // OpenKeeper opens the Keeper identified by the URL given. // See the URLOpener documentation in driver subpackages for // details on supported URL formats, and https://gocloud.dev/concepts/urls // for more information. func OpenKeeper(ctx context.Context, urlstr string) (*Keeper, error) { return defaultURLMux.OpenKeeper(ctx, urlstr) } ================================================ FILE: secrets/secrets_test.go ================================================ // Copyright 2019-2025 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package secrets import ( "context" "errors" "net/url" "strings" "testing" "github.com/google/go-cmp/cmp" "gocloud.dev/gcerrors" "gocloud.dev/internal/gcerr" "gocloud.dev/internal/testing/oteltest" "gocloud.dev/secrets/driver" ) var errFake = errors.New("fake") type erroringKeeper struct { driver.Keeper } func (k *erroringKeeper) Decrypt(ctx context.Context, b []byte) ([]byte, error) { return nil, errFake } func (k *erroringKeeper) Encrypt(ctx context.Context, b []byte) ([]byte, error) { return nil, errFake } func (k *erroringKeeper) Close() error { return errFake } func (k *erroringKeeper) ErrorCode(error) gcerrors.ErrorCode { return gcerrors.Internal } func TestErrorsAreWrapped(t *testing.T) { ctx := context.Background() k := NewKeeper(&erroringKeeper{}) // verifyWrap ensures that err is wrapped exactly once. verifyWrap := func(description string, err error) { if err == nil { t.Errorf("%s: got nil error, wanted non-nil", description) } else if unwrapped, ok := err.(*gcerr.Error); !ok { t.Errorf("%s: not wrapped: %v", description, err) } else if du, ok := unwrapped.Unwrap().(*gcerr.Error); ok { t.Errorf("%s: double wrapped: %v", description, du) } if s := err.Error(); !strings.HasPrefix(s, "secrets ") { t.Errorf("%s: Error() for wrapped error doesn't start with secrets: prefix: %s", description, s) } } _, err := k.Decrypt(ctx, nil) verifyWrap("Decrypt", err) _, err = k.Encrypt(ctx, nil) verifyWrap("Encrypt", err) err = k.Close() verifyWrap("Close", err) } // TestKeeperIsClosed tests that Keeper functions return an error when the // Keeper is closed. func TestKeeperIsClosed(t *testing.T) { ctx := context.Background() k := NewKeeper(&erroringKeeper{}) k.Close() if _, err := k.Decrypt(ctx, nil); err != errClosed { t.Error(err) } if _, err := k.Encrypt(ctx, nil); err != errClosed { t.Error(err) } if err := k.Close(); err != errClosed { t.Error(err) } } func TestOpenTelemetry(t *testing.T) { ctx := context.Background() te := oteltest.NewTestExporter(t, OpenTelemetryViews) k := NewKeeper(&erroringKeeper{}) defer k.Close() _, _ = k.Encrypt(ctx, nil) _, _ = k.Decrypt(ctx, nil) _, _ = k.Decrypt(ctx, nil) // Check collected spans. spanStubs := te.GetSpans() metrics := te.GetMetrics(ctx) diff := oteltest.Diff(spanStubs.Snapshots(), metrics, pkgName, "gocloud.dev/secrets", []oteltest.Call{ {Method: "Encrypt", Code: gcerrors.Internal}, {Method: "Decrypt", Code: gcerrors.Internal}, {Method: "Decrypt", Code: gcerrors.Internal}, }) if diff != "" { t.Error(diff) } if err := te.Shutdown(ctx); err != nil { // Just log and continue - not failing the test on shutdown errors. t.Logf("OpenTelemetry shutdown error (non-fatal): %v", err) } } func TestURLMux(t *testing.T) { ctx := context.Background() mux := new(URLMux) fake := &fakeOpener{} mux.RegisterKeeper("foo", fake) mux.RegisterKeeper("err", fake) if diff := cmp.Diff(mux.KeeperSchemes(), []string{"err", "foo"}); diff != "" { t.Errorf("Schemes: %s", diff) } if !mux.ValidKeeperScheme("foo") || !mux.ValidKeeperScheme("err") { t.Errorf("ValidKeeperScheme didn't return true for valid scheme") } if mux.ValidKeeperScheme("foo2") || mux.ValidKeeperScheme("http") { t.Errorf("ValidKeeperScheme didn't return false for invalid scheme") } for _, tc := range []struct { name string url string wantErr bool }{ { name: "empty URL", wantErr: true, }, { name: "invalid URL", url: ":foo", wantErr: true, }, { name: "invalid URL no scheme", url: "foo", wantErr: true, }, { name: "unregistered scheme", url: "bar://mykeeper", wantErr: true, }, { name: "func returns error", url: "err://mykeeper", wantErr: true, }, { name: "no query options", url: "foo://mykeeper", }, { name: "empty query options", url: "foo://mykeeper?", }, { name: "query options", url: "foo://mykeeper?aAa=bBb&cCc=dDd", }, { name: "multiple query options", url: "foo://mykeeper?x=a&x=b&x=c", }, { name: "fancy keeper name", url: "foo:///foo/bar/baz", }, { name: "using api scheme prefix", url: "secrets+foo://mykeeper", }, { name: "using api+type scheme prefix", url: "secrets+keeper+foo://mykeeper", }, } { t.Run(tc.name, func(t *testing.T) { keeper, gotErr := mux.OpenKeeper(ctx, tc.url) if (gotErr != nil) != tc.wantErr { t.Fatalf("got err %v, want error %v", gotErr, tc.wantErr) } if gotErr != nil { return } defer keeper.Close() if got := fake.u.String(); got != tc.url { t.Errorf("got %q want %q", got, tc.url) } // Repeat with OpenKeeperURL. parsed, err := url.Parse(tc.url) if err != nil { t.Fatal(err) } keeper, gotErr = mux.OpenKeeperURL(ctx, parsed) if gotErr != nil { t.Fatalf("got err %v, want nil", gotErr) } defer keeper.Close() if got := fake.u.String(); got != tc.url { t.Errorf("got %q want %q", got, tc.url) } }) } } type fakeOpener struct { u *url.URL // last url passed to OpenKeeperURL. } func (o *fakeOpener) OpenKeeperURL(ctx context.Context, u *url.URL) (*Keeper, error) { if u.Scheme == "err" { return nil, errors.New("fail") } o.u = u return NewKeeper(&erroringKeeper{}), nil } ================================================ FILE: server/driver/driver.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package driver defines an interface for custom HTTP listeners. // Application code should use package server. package driver // import "gocloud.dev/server/driver" import ( "context" "net/http" ) // Server dispatches requests to an http.Handler. type Server interface { // ListenAndServe listens on the TCP network address addr and then // calls Serve with handler to handle requests on incoming connections. // The addr argument will be a non-empty string specifying "host:port". // The http.Handler will always be non-nil. // Drivers must block until serving is done (or // return an error if serving can't occur for some reason), serve // requests to the given http.Handler, and be interruptable by Shutdown. // Drivers should use the given address if they serve using TCP directly. ListenAndServe(addr string, h http.Handler) error // Shutdown gracefully shuts down the server without interrupting // any active connections. If the provided context expires before // the shutdown is complete, Shutdown returns the context's error, // otherwise it returns any error returned from closing the Server's // underlying Listener(s). Shutdown(ctx context.Context) error } // TLSServer is an optional interface for Server drivers, that adds support // for serving TLS. type TLSServer interface { // ListenAndServeTLS is similar to Server.ListenAndServe, but should // serve using TLS. // See http://go/godoc/net/http/#Server.ListenAndServeTLS. ListenAndServeTLS(addr, certFile, keyFile string, h http.Handler) error } ================================================ FILE: server/example_test.go ================================================ // Copyright 2019 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package server_test import ( "context" "errors" "fmt" "log" "net/http" "os" "os/signal" "sync" "time" "gocloud.dev/server" "gocloud.dev/server/health" "gocloud.dev/server/requestlog" ) func ExampleServer() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // Use the constructor function to create the server. srv := server.New(http.DefaultServeMux, nil) // Register a route. http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello, World!") }) // Start the server. If ListenAndServe returns an error, print it and exit. if err := srv.ListenAndServe(":8080"); err != nil { log.Fatalf("%v", err) } } func ExampleServer_withRequestLogger() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // Create a logger, and assign it to the RequestLogger field of a // server.Options struct. srvOptions := &server.Options{ RequestLogger: requestlog.NewNCSALogger(os.Stdout, func(error) {}), } // Pass the options to the Server constructor. srv := server.New(http.DefaultServeMux, srvOptions) // Register a route. http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello, World!") }) // Start the server. You will see requests logged to STDOUT. if err := srv.ListenAndServe(":8080"); err != nil { log.Fatalf("%v", err) } } // customHealthCheck is an example health check. It implements the // health.Checker interface and reports the server is healthy when the healthy // field is set to true. type customHealthCheck struct { mu sync.RWMutex healthy bool } // customHealthCheck implements the health.Checker interface because it has a // CheckHealth method. Because each application may have a different definition // of what it means to be "healthy", you will need to define a CheckHealth method // specific to your application. func (h *customHealthCheck) CheckHealth() error { h.mu.RLock() defer h.mu.RUnlock() if !h.healthy { return errors.New("not ready yet!") } return nil } func ExampleServer_withHealthChecks() { // PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored. // Create a health.Checker from the type we defined for our application. // In this example, healthCheck will report the server is unhealthy for 10 seconds // after startup, and as healthy henceforth. Check the /healthz/readiness // HTTP path to see readiness. healthCheck := new(customHealthCheck) time.AfterFunc(10*time.Second, func() { healthCheck.mu.Lock() defer healthCheck.mu.Unlock() healthCheck.healthy = true }) // The server.Options struct takes a slice of health checks, because you // may need to check several things. srvOptions := &server.Options{ HealthChecks: []health.Checker{healthCheck}, } // Pass the options to the Server constructor. srv := server.New(http.DefaultServeMux, srvOptions) // Register a route. http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello, World!") }) // Start the server. You will see requests logged to STDOUT. if err := srv.ListenAndServe(":8080"); err != nil { log.Fatalf("%v", err) } } func ExampleServer_Shutdown() { // OPTIONAL: Specify a driver in the options for the constructor. // NewDefaultDriver will be used by default if it is not explicitly set, and // uses http.Server with read, write, and idle timeouts set. When Shutdown // is called on the server, it is called on the driver. srvOptions := &server.Options{ Driver: server.NewDefaultDriver(), } // Pass the options to the Server constructor. srv := server.New(http.DefaultServeMux, srvOptions) // If your application will be behind a load balancer that handles graceful // shutdown of requests, you may not need to call Shutdown on the server // directly. If you need to ensure graceful shutdown directly, it is important // to have a separate goroutine, because ListenAndServe blocks indefinitely. go func() { interrupt := make(chan os.Signal, 1) signal.Notify(interrupt, os.Interrupt) // Receive off the chanel in a loop, because the interrupt could be sent // before ListenAndServe starts. for { <-interrupt srv.Shutdown(context.Background()) } }() // Register a route. http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello, World!") }) // Start the server. You will see requests logged to STDOUT. // In the absence of an error, ListenAndServe blocks forever. if err := srv.ListenAndServe(":8080"); err != nil { log.Fatalf("%v", err) } } ================================================ FILE: server/health/health.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package health provides health check handlers. package health // import "gocloud.dev/server/health" import ( "io" "net/http" ) // Handler is an HTTP handler that reports on the success of an // aggregate of Checkers. The zero value is always healthy. type Handler struct { checkers []Checker } // Add adds a new check to the handler. func (h *Handler) Add(c Checker) { h.checkers = append(h.checkers, c) } // ServeHTTP returns 200 if it is healthy, 500 otherwise. func (h *Handler) ServeHTTP(w http.ResponseWriter, _ *http.Request) { for _, c := range h.checkers { if err := c.CheckHealth(); err != nil { writeUnhealthy(w) return } } writeHealthy(w) } func writeHeaders(statusLen string, w http.ResponseWriter) { w.Header().Set("Content-Length", statusLen) w.Header().Set("Content-Type", "text/plain; charset=utf-8") w.Header().Set("X-Content-Type-Options", "nosniff") } func writeUnhealthy(w http.ResponseWriter) { const ( status = "unhealthy" statusLen = "9" ) writeHeaders(statusLen, w) w.WriteHeader(http.StatusInternalServerError) io.WriteString(w, status) } // HandleLive is an http.HandlerFunc that handles liveness checks by // immediately responding with an HTTP 200 status. func HandleLive(w http.ResponseWriter, _ *http.Request) { writeHealthy(w) } func writeHealthy(w http.ResponseWriter) { const ( status = "ok" statusLen = "2" ) writeHeaders(statusLen, w) w.WriteHeader(http.StatusOK) io.WriteString(w, status) } // Checker wraps the CheckHealth method. // // CheckHealth returns nil if the resource is healthy, or a non-nil // error if the resource is not healthy. CheckHealth must be safe to // call from multiple goroutines. type Checker interface { CheckHealth() error } // CheckerFunc is an adapter type to allow the use of ordinary functions as // health checks. If f is a function with the appropriate signature, // CheckerFunc(f) is a Checker that calls f. type CheckerFunc func() error // CheckHealth calls f(). func (f CheckerFunc) CheckHealth() error { return f() } ================================================ FILE: server/health/health_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package health import ( "errors" "net/http" "net/http/httptest" "sync" "testing" ) func TestNewHandler(t *testing.T) { s := httptest.NewServer(new(Handler)) defer s.Close() code, err := check(s) if err != nil { t.Fatalf("GET %s: %v", s.URL, err) } if code != http.StatusOK { t.Errorf("got HTTP status %d; want %d", code, http.StatusOK) } } func TestChecker(t *testing.T) { c1 := &checker{err: errors.New("checker 1 down")} c2 := &checker{err: errors.New("checker 2 down")} h := new(Handler) h.Add(c1) h.Add(c2) s := httptest.NewServer(h) defer s.Close() t.Run("AllUnhealthy", func(t *testing.T) { code, err := check(s) if err != nil { t.Fatalf("GET %s: %v", s.URL, err) } if code != http.StatusInternalServerError { t.Errorf("got HTTP status %d; want %d", code, http.StatusInternalServerError) } }) c1.set(nil) t.Run("PartialHealthy", func(t *testing.T) { code, err := check(s) if err != nil { t.Fatalf("GET %s: %v", s.URL, err) } if code != http.StatusInternalServerError { t.Errorf("got HTTP status %d; want %d", code, http.StatusInternalServerError) } }) c2.set(nil) t.Run("AllHealthy", func(t *testing.T) { code, err := check(s) if err != nil { t.Fatalf("GET %s: %v", s.URL, err) } if code != http.StatusOK { t.Errorf("got HTTP status %d; want %d", code, http.StatusOK) } }) } func check(s *httptest.Server) (code int, err error) { resp, err := http.Get(s.URL) if err != nil { return 0, err } resp.Body.Close() return resp.StatusCode, nil } type checker struct { mu sync.Mutex err error } func (c *checker) CheckHealth() error { defer c.mu.Unlock() c.mu.Lock() return c.err } func (c *checker) set(e error) { defer c.mu.Unlock() c.mu.Lock() c.err = e } ================================================ FILE: server/health/sqlhealth/sqlhealth.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package sqlhealth provides a health check for a SQL database connection. package sqlhealth // import "gocloud.dev/server/health/sqlhealth" import ( "context" "database/sql" "errors" "time" ) // Checker checks the health of a SQL database. type Checker struct { cancel context.CancelFunc stopped <-chan struct{} healthy bool } // New starts a new asynchronous ping of the SQL database. Pings will be sent // until one succeeds or Stop is called, whichever comes first. func New(db *sql.DB) *Checker { // We create a context here because we are detaching. ctx, cancel := context.WithCancel(context.Background()) stopped := make(chan struct{}) c := &Checker{ cancel: cancel, stopped: stopped, } go func() { var timer *time.Timer defer func() { if timer != nil { timer.Stop() } close(stopped) }() wait := 250 * time.Millisecond const maxWait = 30 * time.Second for { if err := db.PingContext(ctx); err == nil { c.healthy = true return } if timer == nil { timer = time.NewTimer(wait) } else { // Timer already fired, so resetting does not race. timer.Reset(wait) } select { case <-timer.C: if wait < maxWait { // Back off next ping. wait *= 2 if wait > maxWait { wait = maxWait } } case <-ctx.Done(): return } } }() return c } // CheckHealth returns nil iff the ping started by New has returned // success. func (c *Checker) CheckHealth() error { select { case <-c.stopped: if !c.healthy { return errors.New("ping stopped before becoming healthy") } return nil default: return errors.New("still pinging database") } } // Stop stops any ongoing ping of the database. func (c *Checker) Stop() { c.cancel() <-c.stopped } ================================================ FILE: server/health/sqlhealth/sqlhealth_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package sqlhealth import ( "context" "database/sql" "database/sql/driver" "errors" "sync" "testing" "gocloud.dev/server/health" ) var _ = health.Checker((*Checker)(nil)) func TestCheck(t *testing.T) { connector := new(stubConnector) db := sql.OpenDB(connector) defer db.Close() check := New(db) defer check.Stop() if err := check.CheckHealth(); err == nil { t.Error("checker starts healthy") } connector.setHealthy(true) // Should eventually become healthy. Otherwise, stopped by test timeout. for { if err := check.CheckHealth(); err == nil { break } } } type stubConnector struct { mu sync.RWMutex healthy bool } func (c *stubConnector) setHealthy(h bool) { c.mu.Lock() c.healthy = h c.mu.Unlock() } func (c *stubConnector) Connect(ctx context.Context) (driver.Conn, error) { return &stubConn{c}, nil } func (c *stubConnector) Driver() driver.Driver { return nil } type stubConn struct { c *stubConnector } func (conn *stubConn) Prepare(query string) (driver.Stmt, error) { panic("not implemented") } func (conn *stubConn) Close() error { return nil } func (conn *stubConn) Begin() (driver.Tx, error) { panic("not implemented") } func (conn *stubConn) Ping(ctx context.Context) error { conn.c.mu.RLock() healthy := conn.c.healthy conn.c.mu.RUnlock() if !healthy { return errors.New("unhealthy") } return nil } ================================================ FILE: server/requestlog/ncsa.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package requestlog import ( "io" "strconv" "sync" ) // An NCSALogger writes log entries to an io.Writer in the // Combined Log Format. // // Details at http://httpd.apache.org/docs/current/logs.html#combined type NCSALogger struct { onErr func(error) mu sync.Mutex w io.Writer buf []byte } // NewNCSALogger returns a new logger that writes to w. // A nil onErr is treated the same as func(error) {}. func NewNCSALogger(w io.Writer, onErr func(error)) *NCSALogger { return &NCSALogger{ w: w, onErr: onErr, } } // Log writes an entry line to its writer. Multiple concurrent calls // will produce sequential writes to its writer. func (l *NCSALogger) Log(ent *Entry) { if err := l.log(ent); err != nil && l.onErr != nil { l.onErr(err) } } func (l *NCSALogger) log(ent *Entry) error { defer l.mu.Unlock() l.mu.Lock() l.buf = formatEntry(l.buf[:0], ent) _, err := l.w.Write(l.buf) return err } func formatEntry(b []byte, ent *Entry) []byte { const ncsaTime = "02/Jan/2006:15:04:05 -0700" if ent.RemoteIP == "" { b = append(b, '-') } else { b = append(b, ent.RemoteIP...) } b = append(b, " - - ["...) b = ent.ReceivedTime.AppendFormat(b, ncsaTime) b = append(b, "] \""...) b = append(b, ent.RequestMethod...) b = append(b, ' ') b = append(b, ent.RequestURL...) b = append(b, ' ') b = append(b, ent.Proto...) b = append(b, "\" "...) b = strconv.AppendInt(b, int64(ent.Status), 10) b = append(b, ' ') b = strconv.AppendInt(b, int64(ent.ResponseBodySize), 10) b = append(b, ' ') b = strconv.AppendQuote(b, ent.Referer) b = append(b, ' ') b = strconv.AppendQuote(b, ent.UserAgent) b = append(b, '\n') return b } ================================================ FILE: server/requestlog/ncsa_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package requestlog import ( "bytes" "testing" "time" ) var _ Logger = (*NCSALogger)(nil) func TestNCSALog(t *testing.T) { const ( startTime = 1507914000 startTimeNanos = 512 latencySec = 5 latencyNanos = 123456789 endTime = startTime + latencySec endTimeNanos = startTimeNanos + latencyNanos ) tests := []struct { name string ent Entry want string }{ { name: "AllFields", ent: Entry{ ReceivedTime: time.Unix(startTime, startTimeNanos).UTC(), RequestMethod: "POST", RequestURL: "/foo/bar", RequestHeaderSize: 456, RequestBodySize: 123000, UserAgent: "Chrome proxied through Firefox and Edge", Referer: "http://www.example.com/", Proto: "HTTP/1.1", RemoteIP: "12.34.56.78", ServerIP: "127.0.0.1", Status: 404, ResponseHeaderSize: 555, ResponseBodySize: 789000, Latency: latencySec*time.Second + latencyNanos*time.Nanosecond, }, want: `12.34.56.78 - - [13/Oct/2017:17:00:00 +0000] "POST /foo/bar HTTP/1.1" 404 789000 "http://www.example.com/" "Chrome proxied through Firefox and Edge"` + "\n", }, { name: "OnlyRequiredFields", ent: Entry{ ReceivedTime: time.Unix(startTime, startTimeNanos).UTC(), RequestMethod: "POST", RequestURL: "/foo/bar", Proto: "HTTP/1.1", Status: 404, }, want: `- - - [13/Oct/2017:17:00:00 +0000] "POST /foo/bar HTTP/1.1" 404 0 "" ""` + "\n", }, { name: "OnlyRequiredFieldsAndUserAgent", ent: Entry{ ReceivedTime: time.Unix(startTime, startTimeNanos).UTC(), RequestMethod: "POST", RequestURL: "/foo/bar", Proto: "HTTP/1.1", Status: 404, UserAgent: "Chrome proxied through Firefox and Edge", }, want: `- - - [13/Oct/2017:17:00:00 +0000] "POST /foo/bar HTTP/1.1" 404 0 "" "Chrome proxied through Firefox and Edge"` + "\n", }, { name: "DoubleQuotesInUserAgent", ent: Entry{ ReceivedTime: time.Unix(startTime, startTimeNanos).UTC(), RequestMethod: "POST", RequestURL: "/foo/bar", Proto: "HTTP/1.1", Status: 404, UserAgent: "Chrome \"proxied\" through Firefox and Edge", }, want: `- - - [13/Oct/2017:17:00:00 +0000] "POST /foo/bar HTTP/1.1" 404 0 "" "Chrome \"proxied\" through Firefox and Edge"` + "\n", }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { buf := new(bytes.Buffer) var logErr error l := NewNCSALogger(buf, func(e error) { logErr = e }) l.Log(&test.ent) if logErr != nil { t.Error("Logger called error callback:", logErr) } got := buf.String() if got != test.want { t.Errorf("Log(...) wrote %q; want %q", got, test.want) } }) } } ================================================ FILE: server/requestlog/requestlog.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package requestlog provides an http.Handler that logs information // about requests. package requestlog // import "gocloud.dev/server/requestlog" import ( "bufio" "errors" "io" "net" "net/http" "strconv" "time" "go.opentelemetry.io/otel/trace" ) // Logger wraps the Log method. Log must be safe to call from multiple // goroutines. Log must not hold onto an Entry after it returns. type Logger interface { Log(*Entry) } // A Handler emits request information to a Logger. type Handler struct { log Logger h http.Handler } // NewHandler returns a handler that emits information to log and calls // h.ServeHTTP. func NewHandler(log Logger, h http.Handler) *Handler { return &Handler{ log: log, h: h, } } // ServeHTTP calls its underlying handler's ServeHTTP method, then calls // Log after the handler returns. func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { start := time.Now() span := trace.SpanFromContext(r.Context()) sc := span.SpanContext() ent := &Entry{ Request: cloneRequestWithoutBody(r), ReceivedTime: start, RequestMethod: r.Method, RequestURL: r.URL.String(), RequestHeaderSize: headerSize(r.Header), UserAgent: r.UserAgent(), Referer: r.Referer(), Proto: r.Proto, RemoteIP: ipFromHostPort(r.RemoteAddr), TraceID: sc.TraceID(), SpanID: sc.SpanID(), } if addr, ok := r.Context().Value(http.LocalAddrContextKey).(net.Addr); ok { ent.ServerIP = ipFromHostPort(addr.String()) } r2 := new(http.Request) *r2 = *r rcc := &readCounterCloser{r: r.Body} r2.Body = rcc w2 := &responseStats{w: w} h.h.ServeHTTP(w2, r2) ent.Latency = time.Since(start) // The handler may or may not have read the entire body. If the request // includes a Content-Length header, use that for a more accurate // RequestBodySize. ent.RequestBodySize = rcc.n if contentLengthStr := r.Header.Get("Content-Length"); contentLengthStr != "" { ent.RequestBodySize, _ = strconv.ParseInt(contentLengthStr, 10, 64) } ent.Status = w2.code if ent.Status == 0 { ent.Status = http.StatusOK } ent.ResponseHeaderSize, ent.ResponseBodySize = w2.size() h.log.Log(ent) } func cloneRequestWithoutBody(r *http.Request) *http.Request { r = r.Clone(r.Context()) r.Body = nil return r } // Entry records information about a completed HTTP request. type Entry struct { // Request is the http request that has been completed. // // This request's Body is always nil, regardless of the actual request body. Request *http.Request ReceivedTime time.Time RequestBodySize int64 Status int ResponseHeaderSize int64 ResponseBodySize int64 Latency time.Duration TraceID trace.TraceID SpanID trace.SpanID // Deprecated. This value is available by evaluating Request.Referer(). Referer string // Deprecated. This value is available directing in Request.Proto. Proto string // Deprecated. This value is available directly in Request.Method. RequestMethod string // Deprecated. This value is available directly in Request.URL. RequestURL string // Deprecated. This value is available by evaluating Request.Header. RequestHeaderSize int64 // Deprecated. This value is available by evaluating Request.Header. UserAgent string // Deprecated. This value is available by evaluating Request.RemoteAddr.. RemoteIP string // Deprecated. This value is available by evaluating reading the // http.LocalAddrContextKey value from the context returned by Request.Context(). ServerIP string } func ipFromHostPort(hp string) string { h, _, err := net.SplitHostPort(hp) if err != nil { return "" } if len(h) > 0 && h[0] == '[' { return h[1 : len(h)-1] } return h } type readCounterCloser struct { r io.ReadCloser n int64 err error } func (rcc *readCounterCloser) Read(p []byte) (n int, err error) { if rcc.err != nil { return 0, rcc.err } n, rcc.err = rcc.r.Read(p) rcc.n += int64(n) return n, rcc.err } func (rcc *readCounterCloser) Close() error { rcc.err = errors.New("read from closed reader") return rcc.r.Close() } type writeCounter int64 func (wc *writeCounter) Write(p []byte) (n int, err error) { *wc += writeCounter(len(p)) return len(p), nil } func headerSize(h http.Header) int64 { var wc writeCounter _ = h.Write(&wc) return int64(wc) + 2 // for CRLF } type responseStats struct { w http.ResponseWriter hsize int64 wc writeCounter code int hijacked bool } func (r *responseStats) Header() http.Header { return r.w.Header() } func (r *responseStats) WriteHeader(statusCode int) { if r.code != 0 { return } r.hsize = headerSize(r.w.Header()) r.w.WriteHeader(statusCode) r.code = statusCode } func (r *responseStats) Write(p []byte) (n int, err error) { if r.code == 0 { r.WriteHeader(http.StatusOK) } n, err = r.w.Write(p) _, _ = r.wc.Write(p[:n]) return } func (r *responseStats) size() (hdr, body int64) { if r.code == 0 { return headerSize(r.w.Header()), 0 } // Use the header size from the time WriteHeader was called. // The Header map can be mutated after the call to add HTTP Trailers, // which we don't want to count. return r.hsize, int64(r.wc) } func (r *responseStats) Hijack() (_ net.Conn, _ *bufio.ReadWriter, err error) { defer func() { if err == nil { r.hijacked = true } }() if hj, ok := r.w.(http.Hijacker); ok { return hj.Hijack() } return nil, nil, errors.New("underlying ResponseWriter does not support hijacking") } func (r *responseStats) Flush() { if fl, ok := r.w.(http.Flusher); ok { fl.Flush() } } ================================================ FILE: server/requestlog/requestlog_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package requestlog import ( "context" "fmt" "go.opentelemetry.io/otel" "io" "net" "net/http" "net/http/httptest" "strings" "testing" "go.opentelemetry.io/otel/trace" ) func TestHandler(t *testing.T) { const requestMsg = "Hello, World!" const responseMsg = "I see you." const userAgent = "Request Log Test UA" const referer = "http://www.example.com/" r, err := http.NewRequest("POST", "http://localhost/foo", strings.NewReader(requestMsg)) if err != nil { t.Fatal("NewRequest:", err) } r.Header.Set("User-Agent", userAgent) r.Header.Set("Referer", referer) requestHdrSize := len(fmt.Sprintf("User-Agent: %s\r\nReferer: %s\r\nContent-Length: %v\r\n", userAgent, referer, len(requestMsg))) responseHdrSize := len(fmt.Sprintf("Content-Length: %v\r\n", len(responseMsg))) ent, spanCtx, err := roundTrip(r, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Length", fmt.Sprint(len(responseMsg))) w.WriteHeader(http.StatusOK) _, _ = io.WriteString(w, responseMsg) })) if err != nil { t.Fatal("Could not get entry:", err) } if want := "test-baggage"; ent.Request.Context().Value(testContextKey) != want { t.Errorf("Request Context Value = %s; want %s", ent.Request.Context().Value(testContextKey), want) } if want := "/foo"; ent.Request.URL.Path != want { t.Errorf("Request Context Value = %s; want %s", ent.Request.Context().Value(testContextKey), want) } if want := "POST"; ent.RequestMethod != want { t.Errorf("RequestMethod = %q; want %q", ent.RequestMethod, want) } if want := "/foo"; ent.RequestURL != want { t.Errorf("RequestURL = %q; want %q", ent.RequestURL, want) } if ent.RequestHeaderSize < int64(requestHdrSize) { t.Errorf("RequestHeaderSize = %d; want >=%d", ent.RequestHeaderSize, requestHdrSize) } if ent.RequestBodySize != int64(len(requestMsg)) { t.Errorf("RequestBodySize = %d; want %d", ent.RequestBodySize, len(requestMsg)) } if ent.UserAgent != userAgent { t.Errorf("UserAgent = %q; want %q", ent.UserAgent, userAgent) } if ent.Referer != referer { t.Errorf("Referer = %q; want %q", ent.Referer, referer) } if want := "HTTP/1.1"; ent.Proto != want { t.Errorf("Proto = %q; want %q", ent.Proto, want) } if ent.Status != http.StatusOK { t.Errorf("Status = %d; want %d", ent.Status, http.StatusOK) } if ent.ResponseHeaderSize < int64(responseHdrSize) { t.Errorf("ResponseHeaderSize = %d; want >=%d", ent.ResponseHeaderSize, responseHdrSize) } if ent.ResponseBodySize != int64(len(responseMsg)) { t.Errorf("ResponseBodySize = %d; want %d", ent.ResponseBodySize, len(responseMsg)) } if ent.TraceID != spanCtx.TraceID() { t.Errorf("TraceID = %v; want %v", ent.TraceID, spanCtx.TraceID()) } if ent.SpanID != spanCtx.SpanID() { t.Errorf("SpanID = %v; want %v", ent.SpanID, spanCtx.SpanID()) } } type testSpanHandler struct { h http.Handler spanCtx *trace.SpanContext } func (sh *testSpanHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { tracer := otel.Tracer("test") ctx, span := tracer.Start(r.Context(), "test") defer span.End() sc := trace.SpanContextFromContext(ctx) sh.spanCtx = &sc r = r.WithContext(ctx) sh.h.ServeHTTP(w, r) } type contextKey string const testContextKey = contextKey("baggage") func roundTrip(r *http.Request, h http.Handler) (*Entry, *trace.SpanContext, error) { capture := new(captureLogger) hh := NewHandler(capture, h) handler := &testSpanHandler{h: hh} s := httptest.NewUnstartedServer(handler) s.Config.ConnContext = func(ctx context.Context, c net.Conn) context.Context { ctx = context.WithValue(ctx, testContextKey, "test-baggage") return ctx } s.Start() defer s.Close() r.URL.Host = s.URL[len("http://"):] resp, err := http.DefaultClient.Do(r) if err != nil { return nil, nil, err } resp.Body.Close() return &capture.ent, handler.spanCtx, nil } type captureLogger struct { ent Entry } func (cl *captureLogger) Log(ent *Entry) { cl.ent = *ent } ================================================ FILE: server/requestlog/stackdriver.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package requestlog import ( "bytes" "encoding/json" "io" "strconv" "sync" "time" ) // A StackdriverLogger writes log entries in the Stackdriver forward JSON // format. The record's fields are suitable for consumption by // Stackdriver Logging. type StackdriverLogger struct { onErr func(error) mu sync.Mutex w io.Writer buf bytes.Buffer enc *json.Encoder } // NewStackdriverLogger returns a new logger that writes to w. // A nil onErr is treated the same as func(error) {}. func NewStackdriverLogger(w io.Writer, onErr func(error)) *StackdriverLogger { l := &StackdriverLogger{ w: w, onErr: onErr, } l.enc = json.NewEncoder(&l.buf) return l } // Log writes a record to its writer. Multiple concurrent calls will // produce sequential writes to its writer. func (l *StackdriverLogger) Log(ent *Entry) { if err := l.log(ent); err != nil && l.onErr != nil { l.onErr(err) } } func (l *StackdriverLogger) log(ent *Entry) error { defer l.mu.Unlock() l.mu.Lock() l.buf.Reset() // r represents the fluent-plugin-google-cloud format // See https://github.com/GoogleCloudPlatform/fluent-plugin-google-cloud/blob/f93046d92f7722db2794a042c3f2dde5df91a90b/lib/fluent/plugin/out_google_cloud.rb#L145 // to check json tags var r struct { HTTPRequest struct { RequestMethod string `json:"requestMethod"` RequestURL string `json:"requestUrl"` RequestSize int64 `json:"requestSize,string"` Status int `json:"status"` ResponseSize int64 `json:"responseSize,string"` UserAgent string `json:"userAgent"` RemoteIP string `json:"remoteIp"` Referer string `json:"referer"` Latency string `json:"latency"` } `json:"httpRequest"` Timestamp struct { Seconds int64 `json:"seconds"` Nanos int `json:"nanos"` } `json:"timestamp"` TraceID string `json:"logging.googleapis.com/trace"` SpanID string `json:"logging.googleapis.com/spanId"` } r.HTTPRequest.RequestMethod = ent.RequestMethod r.HTTPRequest.RequestURL = ent.RequestURL // TODO(light): determine whether this is the formula LogEntry expects. r.HTTPRequest.RequestSize = ent.RequestHeaderSize + ent.RequestBodySize r.HTTPRequest.Status = ent.Status // TODO(light): determine whether this is the formula LogEntry expects. r.HTTPRequest.ResponseSize = ent.ResponseHeaderSize + ent.ResponseBodySize r.HTTPRequest.UserAgent = ent.UserAgent r.HTTPRequest.RemoteIP = ent.RemoteIP r.HTTPRequest.Referer = ent.Referer r.HTTPRequest.Latency = string(appendLatency(nil, ent.Latency)) t := ent.ReceivedTime.Add(ent.Latency) r.Timestamp.Seconds = t.Unix() r.Timestamp.Nanos = t.Nanosecond() r.TraceID = ent.TraceID.String() r.SpanID = ent.SpanID.String() if err := l.enc.Encode(r); err != nil { return err } _, err := l.w.Write(l.buf.Bytes()) return err } func appendLatency(b []byte, d time.Duration) []byte { // Parses format understood by google-fluentd (which is looser than the documented LogEntry format). // See the comment at https://github.com/GoogleCloudPlatform/fluent-plugin-google-cloud/blob/e2f60cdd1d97e79ffe4e91bdbf6bd84837f27fa5/lib/fluent/plugin/out_google_cloud.rb#L1539 b = strconv.AppendFloat(b, d.Seconds(), 'f', 9, 64) b = append(b, 's') return b } ================================================ FILE: server/requestlog/stackdriver_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package requestlog import ( "bytes" "context" "encoding/json" "fmt" "io" "net/http" "net/http/httptest" "strings" "testing" "time" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/trace" ) func TestStackdriverLog(t *testing.T) { const ( startTime = 1507914000 startTimeNanos = 512 latencySec = 5 latencyNanos = 123456789 endTime = startTime + latencySec endTimeNanos = startTimeNanos + latencyNanos ) tracer := otel.Tracer("test") ctx, span := tracer.Start(context.Background(), "test") defer span.End() sc := trace.SpanContextFromContext(ctx) buf := new(bytes.Buffer) var logErr error l := NewStackdriverLogger(buf, func(e error) { logErr = e }) want := &Entry{ ReceivedTime: time.Unix(startTime, startTimeNanos), RequestMethod: "POST", RequestURL: "/foo/bar", RequestHeaderSize: 456, RequestBodySize: 123000, UserAgent: "Chrome proxied through Firefox and Edge", Referer: "http://www.example.com/", Proto: "HTTP/1.1", RemoteIP: "12.34.56.78", ServerIP: "127.0.0.1", Status: 404, ResponseHeaderSize: 555, ResponseBodySize: 789000, Latency: latencySec*time.Second + latencyNanos*time.Nanosecond, TraceID: sc.TraceID(), SpanID: sc.SpanID(), } ent := *want // copy in case Log accidentally mutates l.Log(&ent) if logErr != nil { t.Error("Logger called error callback:", logErr) } var got json.RawMessage if err := json.Unmarshal(buf.Bytes(), &got); err != nil { t.Fatal("Unmarshal:", err) } var r map[string]any if err := json.Unmarshal(got, &r); err != nil { t.Error("Unmarshal record:", err) } else { rr, _ := r["httpRequest"].(map[string]any) if rr == nil { t.Error("httpRequest does not exist in record or is not a JSON object") } if got, want := jsonString(rr, "requestMethod"), ent.RequestMethod; got != want { t.Errorf("httpRequest.requestMethod = %q; want %q", got, want) } if got, want := jsonString(rr, "requestUrl"), ent.RequestURL; got != want { t.Errorf("httpRequest.requestUrl = %q; want %q", got, want) } if got, want := jsonString(rr, "requestSize"), "123456"; got != want { t.Errorf("httpRequest.requestSize = %q; want %q", got, want) } if got, want := jsonNumber(rr, "status"), float64(ent.Status); got != want { t.Errorf("httpRequest.status = %d; want %d", int64(got), int64(want)) } if got, want := jsonString(rr, "responseSize"), "789555"; got != want { t.Errorf("httpRequest.responseSize = %q; want %q", got, want) } if got, want := jsonString(rr, "userAgent"), ent.UserAgent; got != want { t.Errorf("httpRequest.userAgent = %q; want %q", got, want) } if got, want := jsonString(rr, "remoteIp"), ent.RemoteIP; got != want { t.Errorf("httpRequest.remoteIp = %q; want %q", got, want) } if got, want := jsonString(rr, "referer"), ent.Referer; got != want { t.Errorf("httpRequest.referer = %q; want %q", got, want) } if got, want := jsonString(rr, "latency"), "5.123456789"; parseLatency(got) != want { t.Errorf("httpRequest.latency = %q; want %q", got, want+"s") } ts, _ := r["timestamp"].(map[string]any) if ts == nil { t.Error("timestamp does not exist in record or is not a JSON object") } if got, want := jsonNumber(ts, "seconds"), float64(endTime); got != want { t.Errorf("timestamp.seconds = %g; want %g", got, want) } if got, want := jsonNumber(ts, "nanos"), float64(endTimeNanos); got != want { t.Errorf("timestamp.nanos = %g; want %g", got, want) } if got, want := jsonString(r, "logging.googleapis.com/trace"), ent.TraceID.String(); got != want { t.Errorf("traceID = %q; want %q", got, want) } if got, want := jsonString(r, "logging.googleapis.com/spanId"), ent.SpanID.String(); got != want { t.Errorf("spanID = %q; want %q", got, want) } } } func parseLatency(s string) string { s = strings.TrimSpace(s) if !strings.HasSuffix(s, "s") { return "" } s = strings.TrimSpace(s[:len(s)-1]) for _, c := range s { if !(c >= '0' && c <= '9') && c != '.' { return "" } } return s } func jsonString(obj map[string]any, k string) string { v, _ := obj[k].(string) return v } func jsonNumber(obj map[string]any, k string) float64 { v, _ := obj[k].(float64) return v } func BenchmarkStackdriverLog(b *testing.B) { ent := &Entry{ ReceivedTime: time.Date(2017, time.October, 13, 17, 0, 0, 512, time.UTC), RequestMethod: "POST", RequestURL: "/foo/bar", RequestHeaderSize: 456, RequestBodySize: 123000, UserAgent: "Chrome proxied through Firefox and Edge", Referer: "http://www.example.com/", Proto: "HTTP/1.1", RemoteIP: "12.34.56.78", ServerIP: "127.0.0.1", Status: 404, ResponseHeaderSize: 555, ResponseBodySize: 789000, Latency: 5 * time.Second, } var buf bytes.Buffer l := NewStackdriverLogger(&buf, func(error) {}) l.Log(ent) b.ReportAllocs() b.SetBytes(int64(buf.Len())) buf.Reset() b.ResetTimer() l = NewStackdriverLogger(io.Discard, func(error) {}) for i := 0; i < b.N; i++ { l.Log(ent) } } func BenchmarkE2E(b *testing.B) { run := func(b *testing.B, handler http.Handler) { b.Helper() s := httptest.NewServer(handler) defer s.Close() b.ReportAllocs() for i := 0; i < b.N; i++ { resp, err := http.Get(s.URL) if err != nil { b.Fatal(err) } _, _ = io.Copy(io.Discard, resp.Body) _ = resp.Body.Close() } } b.Run("Baseline", func(b *testing.B) { run(b, http.HandlerFunc(benchHandler)) }) b.Run("WithLog", func(b *testing.B) { l := NewStackdriverLogger(io.Discard, func(error) {}) run(b, NewHandler(l, http.HandlerFunc(benchHandler))) }) } func benchHandler(w http.ResponseWriter, r *http.Request) { const msg = "Hello, World!" w.Header().Set("Content-Length", fmt.Sprint(len(msg))) _, _ = io.WriteString(w, msg) } ================================================ FILE: server/sdserver/server.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package sdserver provides the diagnostic hooks for a server using // Stackdriver. package sdserver // import "gocloud.dev/server/sdserver" import ( "context" "fmt" "go.opentelemetry.io/otel/metric" "go.opentelemetry.io/otel/propagation" "go.opentelemetry.io/otel/sdk/resource" "go.opentelemetry.io/otel/trace" "gocloud.dev/server" "os" gcpmex "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric" gcptex "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace" gcppropagator "github.com/GoogleCloudPlatform/opentelemetry-operations-go/propagator" "github.com/google/wire" gcpres "go.opentelemetry.io/contrib/detectors/gcp" sdkmetric "go.opentelemetry.io/otel/sdk/metric" sdktrace "go.opentelemetry.io/otel/sdk/trace" "gocloud.dev/gcp" "gocloud.dev/server/requestlog" ) // Set is a Wire provider set that provides the diagnostic hooks for // *server.Server given a GCP token source and a GCP project ID. var Set = wire.NewSet( server.Set, NewTextMapPropagator, NewTraceSampler, NewTraceExporter, NewTraceProvider, wire.Bind(new(trace.TracerProvider), new(*sdktrace.TracerProvider)), NewMetricsReader, NewMeterProvider, wire.Bind(new(metric.MeterProvider), new(*sdkmetric.MeterProvider)), NewRequestLogger, wire.Bind(new(requestlog.Logger), new(*requestlog.StackdriverLogger)), ) func NewResource(ctx context.Context) (*resource.Resource, error) { res, err := resource.New(ctx, resource.WithDetectors(gcpres.NewDetector()), resource.WithTelemetrySDK(), resource.WithProcess(), resource.WithOS(), resource.WithContainer(), resource.WithHost(), ) if err != nil { return nil, err } return resource.Merge(resource.Default(), res) } func NewTextMapPropagator() propagation.TextMapPropagator { return propagation.NewCompositeTextMapPropagator( gcppropagator.CloudTraceOneWayPropagator{}, propagation.TraceContext{}, propagation.Baggage{}, ) } // NewTraceSampler returns a new OpenTelemetry trace sampler. func NewTraceSampler(ctx context.Context) sdktrace.Sampler { return sdktrace.AlwaysSample() } // NewTraceExporter returns a new OpenTelemetry gcp trace exporter. func NewTraceExporter(projectID gcp.ProjectID) (sdktrace.SpanExporter, error) { exporter, err := gcptex.New(gcptex.WithProjectID(string(projectID))) if err != nil { return nil, err } return exporter, nil } // NewTraceProvider returns a new trace provider for our service to utilise. // // The second return value is a Wire cleanup function that calls Close on the provider, func NewTraceProvider(ctx context.Context, exporter sdktrace.SpanExporter, sampler sdktrace.Sampler) (*sdktrace.TracerProvider, func(), error) { res, err := NewResource(ctx) if err != nil { return nil, nil, err } tp := sdktrace.NewTracerProvider( sdktrace.WithBatcher(exporter), sdktrace.WithSampler(sampler), sdktrace.WithResource(res), ) return tp, func() { _ = tp.Shutdown(ctx) }, nil } // NewMetricsReader returns a new OpenTelemetry gcp metrics reader and exporter. func NewMetricsReader(projectID gcp.ProjectID) (sdkmetric.Reader, error) { metricExporter, err := gcpmex.New(gcpmex.WithProjectID(string(projectID))) if err != nil { return nil, err } return sdkmetric.NewPeriodicReader(metricExporter), nil } // NewMeterProvider returns a new metric provider for our service to utilise. // // The second return value is a Wire cleanup function that calls Close on the provider. func NewMeterProvider(ctx context.Context, reader sdkmetric.Reader) (*sdkmetric.MeterProvider, func(), error) { res, err := NewResource(ctx) if err != nil { return nil, nil, err } meterProvider := sdkmetric.NewMeterProvider( sdkmetric.WithResource(res), sdkmetric.WithReader(reader), ) return meterProvider, func() { _ = meterProvider.Shutdown(ctx) }, nil } // NewRequestLogger returns a request logger that sends entries to stdout. func NewRequestLogger() *requestlog.StackdriverLogger { // For now, request logs are written to stdout and get picked up by fluentd. // This also works when running locally. return requestlog.NewStackdriverLogger(os.Stdout, func(e error) { fmt.Println(e) }) } ================================================ FILE: server/server.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package server provides a preconfigured HTTP server with diagnostic hooks. package server // import "gocloud.dev/server" import ( "context" "fmt" "net/http" "sync" "time" "github.com/google/wire" "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/metric" "go.opentelemetry.io/otel/propagation" "go.opentelemetry.io/otel/trace" "gocloud.dev/server/driver" "gocloud.dev/server/health" "gocloud.dev/server/requestlog" ) // Set is a Wire provider set that produces a *Server given the fields of // Options. var Set = wire.NewSet( New, wire.Struct(new(Options), "RequestLogger", "HealthChecks", "TraceTextMapPropagator", "TraceProvider", "MetricsProvider", "Driver"), wire.Value(&DefaultDriver{}), wire.Bind(new(driver.Server), new(*DefaultDriver)), ) // Server is a preconfigured HTTP server with diagnostic hooks. // The zero value is a server with the default options. type Server struct { reqlog requestlog.Logger handler http.Handler wrappedHandler http.Handler healthHandler health.Handler textMapPropagator propagation.TextMapPropagator traceProvider trace.TracerProvider meterProvider metric.MeterProvider once sync.Once driver driver.Server } // Options is the set of optional parameters. type Options struct { // RequestLogger specifies the logger that will be used to log requests. RequestLogger requestlog.Logger // HealthChecks specifies the health checks to be run when the // /healthz/readiness endpoint is requested. HealthChecks []health.Checker // TraceTextMapPropagator decides the format of trace text propagated. TraceTextMapPropagator propagation.TextMapPropagator // TraceProvider handles sampled trace spans. TraceProvider trace.TracerProvider // MetricsProvider handles application metrics. MetricsProvider metric.MeterProvider // Driver serves HTTP requests. Driver driver.Server } // New creates a new server. New(nil, nil) is the same as new(Server). func New(h http.Handler, opts *Options) *Server { srv := &Server{handler: h} if opts != nil { srv.reqlog = opts.RequestLogger srv.textMapPropagator = opts.TraceTextMapPropagator srv.traceProvider = opts.TraceProvider srv.meterProvider = opts.MetricsProvider for _, c := range opts.HealthChecks { srv.healthHandler.Add(c) } srv.driver = opts.Driver } return srv } func (srv *Server) init() { srv.once.Do(func() { if srv.textMapPropagator != nil { otel.SetTextMapPropagator(srv.textMapPropagator) } if srv.traceProvider != nil { otel.SetTracerProvider(srv.traceProvider) } if srv.meterProvider != nil { otel.SetMeterProvider(srv.meterProvider) } if srv.driver == nil { srv.driver = NewDefaultDriver() } if srv.handler == nil { srv.handler = http.DefaultServeMux } // Setup health checks, /healthz route is taken by health checks by default. // Note: App Engine Flex uses /_ah/health by default, which can be changed // in app.yaml. We may want to do an auto-detection for flex in future. const healthPrefix = "/healthz/" mux := http.NewServeMux() mux.HandleFunc(healthPrefix+"liveness", health.HandleLive) mux.Handle(healthPrefix+"readiness", &srv.healthHandler) h := srv.handler if srv.reqlog != nil { h = requestlog.NewHandler(srv.reqlog, h) } // Wrap with OpenTelemetry HTTP handler. h = otelhttp.NewHandler(h, "", otelhttp.WithPublicEndpointFn(func(*http.Request) bool { return true })) mux.Handle("/", h) srv.wrappedHandler = mux }) } // ListenAndServe is a wrapper to use wherever http.ListenAndServe is used. // It wraps the http.Handler provided to New with a handler that handles tracing and // request logging. If the handler is nil, then http.DefaultServeMux will be used. // A configured Requestlogger will log all requests except HealthChecks. func (srv *Server) ListenAndServe(addr string) error { srv.init() return srv.driver.ListenAndServe(addr, srv.wrappedHandler) } // ListenAndServeTLS is a wrapper to use wherever http.ListenAndServeTLS is used. // It wraps the http.Handler provided to New with a handler that handles tracing and // request logging. If the handler is nil, then http.DefaultServeMux will be used. // A configured Requestlogger will log all requests except HealthChecks. func (srv *Server) ListenAndServeTLS(addr, certFile, keyFile string) error { // Check if the driver implements the optional interface. tlsDriver, ok := srv.driver.(driver.TLSServer) if !ok { return fmt.Errorf("driver %T does not support ListenAndServeTLS", srv.driver) } srv.init() return tlsDriver.ListenAndServeTLS(addr, certFile, keyFile, srv.wrappedHandler) } // Shutdown gracefully shuts down the server without interrupting any active connections. func (srv *Server) Shutdown(ctx context.Context) error { if srv.driver == nil { return nil } return srv.driver.Shutdown(ctx) } // DefaultDriver implements the driver.Server interface. The zero value is a valid http.Server. type DefaultDriver struct { Server http.Server } // NewDefaultDriver creates a driver with an http.Server with default timeouts. func NewDefaultDriver() *DefaultDriver { return &DefaultDriver{ Server: http.Server{ ReadTimeout: 30 * time.Second, WriteTimeout: 30 * time.Second, IdleTimeout: 120 * time.Second, }, } } // ListenAndServe sets the address and handler on DefaultDriver's http.Server, // then calls ListenAndServe on it. func (dd *DefaultDriver) ListenAndServe(addr string, h http.Handler) error { dd.Server.Addr = addr dd.Server.Handler = h return dd.Server.ListenAndServe() } // ListenAndServeTLS sets the address and handler on DefaultDriver's http.Server, // then calls ListenAndServeTLS on it. // // DefaultDriver.Server.TLSConfig may be set to configure additional TLS settings. func (dd *DefaultDriver) ListenAndServeTLS(addr, certFile, keyFile string, h http.Handler) error { dd.Server.Addr = addr dd.Server.Handler = h return dd.Server.ListenAndServeTLS(certFile, keyFile) } // Shutdown gracefully shuts down the server without interrupting any active connections, // by calling Shutdown on DefaultDriver's http.Server func (dd *DefaultDriver) Shutdown(ctx context.Context) error { return dd.Server.Shutdown(ctx) } ================================================ FILE: server/server_test.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package server import ( "context" "errors" "net/http" "net/http/httptest" "testing" "gocloud.dev/server/requestlog" ) const ( certFile = "my-cert" keyFile = "my-key" ) func TestListenAndServe(t *testing.T) { td := new(testDriver) s := New(http.NotFoundHandler(), &Options{Driver: td}) err := s.ListenAndServe(":8080") if err != nil { t.Fatal(err) } if !td.listenAndServeCalled { t.Error("ListenAndServe was not called from the supplied driver") } if td.certFile != "" || td.keyFile != "" { t.Errorf("ListenAndServe got non-empty certFile or keyFile (%q, %q), wanted empty", td.certFile, td.keyFile) } if td.handler == nil { t.Error("testDriver must set handler, got nil") } } func TestListenAndServeTLSNoSupported(t *testing.T) { td := new(testDriverNoTLS) s := New(http.NotFoundHandler(), &Options{Driver: td}) err := s.ListenAndServeTLS(":8080", certFile, keyFile) if err == nil { t.Fatal("expected TLS not supported error") } } func TestListenAndServeTLS(t *testing.T) { td := new(testDriver) s := New(http.NotFoundHandler(), &Options{Driver: td}) err := s.ListenAndServeTLS(":8080", certFile, keyFile) if err != nil { t.Fatal(err) } if !td.listenAndServeCalled { t.Error("ListenAndServe was not called from the supplied driver") } if td.certFile != certFile { t.Errorf("ListenAndServe got certFile %q, want %q", td.certFile, certFile) } if td.keyFile != keyFile { t.Errorf("ListenAndServe got keyFile %q, want %q", td.keyFile, keyFile) } if td.handler == nil { t.Error("testDriver must set handler, got nil") } } func TestMiddleware(t *testing.T) { onLogCalled := 0 tl := &testLogger{ onLog: func(ent *requestlog.Entry) { onLogCalled++ if ent.TraceID.String() == "" { t.Error("TraceID is empty") } if ent.SpanID.String() == "" { t.Error("SpanID is empty") } }, } td := new(testDriver) s := New(http.NotFoundHandler(), &Options{Driver: td, RequestLogger: tl}) err := s.ListenAndServe(":8080") if err != nil { t.Fatal(err) } req, err := http.NewRequest("GET", "/", nil) if err != nil { t.Fatal(err) } rr := httptest.NewRecorder() td.handler.ServeHTTP(rr, req) if onLogCalled != 1 { t.Fatal("logging middleware was not called") } // Repeat with TLS. err = s.ListenAndServeTLS(":8081", certFile, keyFile) if err != nil { t.Fatal(err) } req, err = http.NewRequest("GET", "/", nil) if err != nil { t.Fatal(err) } td.handler.ServeHTTP(rr, req) if onLogCalled != 2 { t.Fatal("logging middleware was not called for TLS") } } type testDriverNoTLS string func (td *testDriverNoTLS) ListenAndServe(addr string, h http.Handler) error { return errors.New("this is a method for satisfying the interface") } func (td *testDriverNoTLS) Shutdown(ctx context.Context) error { return errors.New("this is a method for satisfying the interface") } type testDriver struct { listenAndServeCalled bool certFile, keyFile string handler http.Handler } func (td *testDriver) ListenAndServe(addr string, h http.Handler) error { td.listenAndServeCalled = true td.handler = h return nil } func (td *testDriver) ListenAndServeTLS(addr, certFile, keyFile string, h http.Handler) error { td.listenAndServeCalled = true td.certFile = certFile td.keyFile = keyFile td.handler = h return nil } func (td *testDriver) Shutdown(ctx context.Context) error { return errors.New("this is a method for satisfying the interface") } type testLogger struct { onLog func(ent *requestlog.Entry) } func (tl *testLogger) Log(ent *requestlog.Entry) { tl.onLog(ent) } ================================================ FILE: server/xrayserver/server.go ================================================ // Copyright 2018 The Go Cloud Development Kit Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package xrayserver provides the diagnostic hooks for a server using // ADOT collector. package xrayserver // import "gocloud.dev/server/xrayserver" import ( "context" "fmt" ec2res "go.opentelemetry.io/contrib/detectors/aws/ec2" "go.opentelemetry.io/contrib/propagators/aws/xray" "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc" "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" "go.opentelemetry.io/otel/propagation" "go.opentelemetry.io/otel/sdk/resource" "gocloud.dev/server" "gocloud.dev/server/requestlog" "google.golang.org/grpc" "os" "github.com/google/wire" "go.opentelemetry.io/otel/metric" sdkmetric "go.opentelemetry.io/otel/sdk/metric" sdktrace "go.opentelemetry.io/otel/sdk/trace" "go.opentelemetry.io/otel/trace" ) // Set is a Wire provider set that provides the diagnostic hooks for // *server.Server using aws specific formats outlined here // https://aws-otel.github.io/docs/getting-started/go-sdk/manual-instr. var Set = wire.NewSet( server.Set, TracesSet, MetricsSet, NewRequestLogger, wire.Bind(new(requestlog.Logger), new(*requestlog.NCSALogger)), ) // TracesSet is a Wire provider set that provides the open telemetry trace provider given the exporter. var TracesSet = wire.NewSet( NewTextMapPropagator, wire.Bind(new(propagation.TextMapPropagator), new(*xray.Propagator)), NewTraceSampler, NewTraceExporter, NewTraceProvider, wire.Bind(new(trace.TracerProvider), new(*sdktrace.TracerProvider)), ) // MetricsSet is a Wire provider set that provides the open telemetry metrics provider given the exporter. var MetricsSet = wire.NewSet( NewMetricsReader, NewMeterProvider, wire.Bind(new(metric.MeterProvider), new(*sdkmetric.MeterProvider)), ) func NewResource(ctx context.Context) (*resource.Resource, error) { res, err := resource.New(ctx, resource.WithDetectors(ec2res.NewResourceDetector()), resource.WithTelemetrySDK(), resource.WithProcess(), resource.WithOS(), resource.WithContainer(), resource.WithHost(), ) if err != nil { return nil, err } return resource.Merge(resource.Default(), res) } func NewTextMapPropagator() *xray.Propagator { return &xray.Propagator{} } // NewTraceSampler returns a new OpenTelemetry trace sampler. func NewTraceSampler() sdktrace.Sampler { return sdktrace.AlwaysSample() } func NewTraceExporter(ctx context.Context) (sdktrace.SpanExporter, error) { traceExporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithInsecure(), otlptracegrpc.WithEndpoint("0.0.0.0:4317"), otlptracegrpc.WithDialOption(grpc.WithBlock())) if err != nil { return nil, err } return traceExporter, nil } // NewTraceProvider returns a new trace provider for our service to utilise. // // The second return value is a Wire cleanup function that calls Close on the provider. func NewTraceProvider(ctx context.Context, exp sdktrace.SpanExporter, sampler sdktrace.Sampler) (*sdktrace.TracerProvider, func(), error) { res, err := NewResource(ctx) if err != nil { return nil, nil, err } idg := xray.NewIDGenerator() tp := sdktrace.NewTracerProvider( sdktrace.WithBatcher(exp), sdktrace.WithResource(res), sdktrace.WithSampler(sampler), sdktrace.WithIDGenerator(idg), ) return tp, func() { _ = tp.Shutdown(ctx) }, nil } func NewMetricsReader(ctx context.Context) (sdkmetric.Reader, error) { // Create and start new OTLP metric exporter metricExporter, err := otlpmetricgrpc.New(ctx, otlpmetricgrpc.WithInsecure(), otlpmetricgrpc.WithEndpoint("0.0.0.0:4317"), otlpmetricgrpc.WithDialOption(grpc.WithBlock())) if err != nil { return nil, err } return sdkmetric.NewPeriodicReader(metricExporter), nil } // NewMeterProvider returns a new metric provider for our service to utilise. // // The second return value is a Wire cleanup function that calls Close on the provider. func NewMeterProvider(ctx context.Context, reader sdkmetric.Reader) (*sdkmetric.MeterProvider, func(), error) { res, err := NewResource(ctx) if err != nil { return nil, nil, err } meterProvider := sdkmetric.NewMeterProvider( sdkmetric.WithResource(res), sdkmetric.WithReader(reader), ) return meterProvider, func() { _ = meterProvider.Shutdown(ctx) }, nil } // NewRequestLogger returns a request logger that sends entries to stdout. func NewRequestLogger() *requestlog.NCSALogger { return requestlog.NewNCSALogger(os.Stdout, func(e error) { _, _ = fmt.Fprintln(os.Stderr, e) }) } ================================================ FILE: wire/README.md ================================================ # Wire has moved! Wire has moved to its own repository: [github.com/google/wire](https://github.com/google/wire) Read the [announcement][] for more details. [announcement]: https://groups.google.com/d/msg/go-cloud/4HuWfjDAkOY/Y2tUQdB_BQAJ